Merge branch 'integration_2024_w47' into 'develop'
Integration: `2024.w47` See merge request oai/openairinterface5g!3120 * !2972 Parallelize PUSCH channel estimation * !3105 Fix a small bug with total_res in gNB PUSCH symbol processing * !2996 Ue monitoring stats * !3122 Avoid assert on non-implemented SM write callback * !3110 Fronthaul 7.2 improvements (1. step towards M-plane integration) * !2966 Refactor of includes in gNB/UE for improved header management * !3123 Reduce double-usage of CI XML files * !3029 NR UE RRC reconfiguration improvements * !2670 chore(ci): adding Flexric-RAN integration test * !3124 CI: use OC CN in aerial pipeline
This commit is contained in:
@@ -285,6 +285,29 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("OAI-FLEXRIC-RAN-Integration-Test") {
|
||||
when { expression {do5Gtest} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('OAI-FLEXRIC-RAN-Integration-Test', 'OAI-FLEXRIC-RAN-Integration-Test')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
flexricRAN5GStatus = finalizeSlaveJob('OAI-FLEXRIC-RAN-Integration-Test')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += flexricRAN5GStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("L2-Sim-Test-4G") {
|
||||
when { expression {do4Gtest} }
|
||||
steps {
|
||||
|
||||
@@ -58,6 +58,8 @@ def eNB_CommitID
|
||||
def eNB_AllowMergeRequestProcess = false
|
||||
def eNB_TargetBranch
|
||||
|
||||
def flexricOption = ""
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
label pythonExecutor
|
||||
@@ -148,18 +150,24 @@ pipeline {
|
||||
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}"
|
||||
}
|
||||
|
||||
if (allParametersPresent) {
|
||||
echo "All parameters are present"
|
||||
if (eNB_AllowMergeRequestProcess) {
|
||||
sh "git fetch"
|
||||
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||
} else {
|
||||
} else if (eNB_CommitID != 'develop') {
|
||||
sh "git fetch"
|
||||
sh "git checkout -f ${eNB_CommitID}"
|
||||
}
|
||||
} else {
|
||||
echo "Some parameters are missing"
|
||||
sh "./ci-scripts/fail.sh"
|
||||
error "Some parameters are missing"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -190,13 +198,13 @@ pipeline {
|
||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
|
||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
|
||||
]) {
|
||||
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${mainPythonAllXmlFiles}"
|
||||
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${flexricOption} ${mainPythonAllXmlFiles}"
|
||||
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||
for (xmlFile in myXmlTestSuite) {
|
||||
if (fileExists(xmlFile)) {
|
||||
try {
|
||||
timeout (time: 60, unit: 'MINUTES') {
|
||||
sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --XMLTestFile=${xmlFile}"
|
||||
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${flexricOption} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --XMLTestFile=${xmlFile}"
|
||||
}
|
||||
} catch (Exception e) {
|
||||
currentBuild.result = 'FAILURE'
|
||||
|
||||
@@ -264,6 +264,9 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,CONTAINERS,HELP,SCA,PHYSIM,CLUSTER):
|
||||
elif re.match('^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE):
|
||||
matchReg = re.match('^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE)
|
||||
RAN.BuildId = matchReg.group(1)
|
||||
elif re.match('^\-\-FlexRicTag=(.+)$', myArgv, re.IGNORECASE):
|
||||
matchReg = re.match('^\-\-FlexRicTag=(.+)$', myArgv, re.IGNORECASE)
|
||||
CONTAINERS.flexricTag = matchReg.group(1)
|
||||
else:
|
||||
HELP.GenericHelp(CONST.Version)
|
||||
sys.exit('Invalid Parameter: ' + myArgv)
|
||||
|
||||
@@ -28,8 +28,8 @@ up2-fhi72:
|
||||
|
||||
up2-aerial:
|
||||
Host: up2
|
||||
AttachScript: sudo /opt/mbim-aerial/start_quectel_mbim.sh
|
||||
DetachScript: sudo /opt/mbim-aerial/stop_quectel_mbim.sh
|
||||
AttachScript: sudo /opt/mbim-fhi72/start_quectel_mbim.sh
|
||||
DetachScript: sudo /opt/mbim-fhi72/stop_quectel_mbim.sh
|
||||
NetworkScript: ip a show dev wwan0
|
||||
IF: wwan0
|
||||
MTU: 1500
|
||||
@@ -75,6 +75,13 @@ oc-cn5g-20897:
|
||||
NetworkScript: echo "inet 172.21.6.105"
|
||||
RunIperf3Server: False
|
||||
|
||||
oc-cn5g-20897-aerial2:
|
||||
Host: aerial2
|
||||
Namespace: "oaicicd-core-for-fhi72"
|
||||
CNPath: "/opt/oai-cn5g-fed-develop-2024-april-20897"
|
||||
NetworkScript: echo "inet 172.21.6.105"
|
||||
RunIperf3Server: False
|
||||
|
||||
matix-cn5g:
|
||||
Host: matix
|
||||
NetworkScript: docker exec prod-trf-gen ip a show dev eth0
|
||||
|
||||
+23
-39
@@ -73,7 +73,7 @@ def OC_deploy_CN(cmd, ocUserName, ocPassword, ocNamespace, path):
|
||||
if not succeeded:
|
||||
return False, CONST.OC_LOGIN_FAIL
|
||||
cmd.run('helm uninstall oai5gcn --wait --timeout 60s')
|
||||
ret = cmd.run(f'helm install --wait --timeout 60s oai5gcn {path}/ci-scripts/charts/oai-5g-basic/.')
|
||||
ret = cmd.run(f'helm install --wait --timeout 120s oai5gcn {path}/ci-scripts/charts/oai-5g-basic/.')
|
||||
if ret.returncode != 0:
|
||||
logging.error('OC OAI CN5G: Deployment failed')
|
||||
OC_logout(cmd)
|
||||
@@ -126,8 +126,6 @@ class Cluster:
|
||||
self.ranAllowMerge = False
|
||||
self.ranTargetBranch = ""
|
||||
self.cmd = None
|
||||
self.imageToPull = ''
|
||||
self.testSvrId = None
|
||||
|
||||
def _recreate_entitlements(self):
|
||||
# recreating entitlements, don't care if deletion fails
|
||||
@@ -240,44 +238,30 @@ class Cluster:
|
||||
def _undeploy_pod(self, filename):
|
||||
self.cmd.run(f'oc delete -f {filename}')
|
||||
|
||||
def PullClusterImage(self, HTML, RAN):
|
||||
if self.testSvrId == None: self.testSvrId = self.eNBIPAddress
|
||||
if self.imageToPull == '':
|
||||
HELP.GenericHelp(CONST.Version)
|
||||
raise ValueError('Insufficient Parameter')
|
||||
logging.debug(f'Pull OC image {self.imageToPull} to server {self.testSvrId}')
|
||||
def PullClusterImage(self, HTML, node, images):
|
||||
logging.debug(f'Pull OC image {images} to server {node}')
|
||||
self.testCase_id = HTML.testCase_id
|
||||
cmd = cls_cmd.getConnection(self.testSvrId)
|
||||
logging.info(cmd.run('docker --version'))
|
||||
succeeded = OC_login(cmd, self.OCUserName, self.OCPassword, CI_OC_RAN_NAMESPACE)
|
||||
if not succeeded:
|
||||
logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m')
|
||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||
return False
|
||||
ret = cmd.run(f'oc whoami -t | docker login -u oaicicd --password-stdin {self.OCRegistry}')
|
||||
if ret.returncode != 0:
|
||||
logging.error(f'\u001B[1m Unable to access OC project {CI_OC_RAN_NAMESPACE}\u001B[0m')
|
||||
OC_logout(cmd)
|
||||
cmd.close()
|
||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||
return False
|
||||
for image in self.imageToPull:
|
||||
imagePrefix = f'{self.OCRegistry}/{CI_OC_RAN_NAMESPACE}'
|
||||
tag = cls_containerize.CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
imageTag = f"{image}:{tag}"
|
||||
ret = cmd.run(f'docker pull {imagePrefix}/{imageTag}')
|
||||
if ret.returncode != 0:
|
||||
logging.error(f'Could not pull {image} from local registry : {self.OCRegistry}')
|
||||
OC_logout(cmd)
|
||||
cmd.close()
|
||||
HTML.CreateHtmlTestRow('msg', 'KO', CONST.ALL_PROCESSES_OK)
|
||||
with cls_cmd.getConnection(node) as cmd:
|
||||
succeeded = OC_login(cmd, self.OCUserName, self.OCPassword, CI_OC_RAN_NAMESPACE)
|
||||
if not succeeded:
|
||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||
return False
|
||||
cmd.run(f'docker tag {imagePrefix}/{imageTag} oai-ci/{imageTag}')
|
||||
cmd.run(f'docker rmi {imagePrefix}/{imageTag}')
|
||||
OC_logout(cmd)
|
||||
cmd.close()
|
||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
return True
|
||||
ret = cmd.run(f'oc whoami -t | docker login -u oaicicd --password-stdin {self.OCRegistry}')
|
||||
if ret.returncode != 0:
|
||||
logging.error(f'cannot authenticate at registry')
|
||||
OC_logout(cmd)
|
||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||
return False
|
||||
tag = cls_containerize.CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
registry = f'{self.OCRegistry}/{CI_OC_RAN_NAMESPACE}'
|
||||
success, msg = cls_containerize.Containerize.Pull_Image(cmd, images, tag, registry, None, None)
|
||||
OC_logout(cmd)
|
||||
param = f"on node {node}"
|
||||
if success:
|
||||
HTML.CreateHtmlTestRowQueue(param, 'OK', [msg])
|
||||
else:
|
||||
HTML.CreateHtmlTestRowQueue(param, 'KO', [msg])
|
||||
return success
|
||||
|
||||
def BuildClusterImage(self, HTML):
|
||||
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||
|
||||
@@ -70,6 +70,8 @@ def CreateWorkspace(host, sourcePath, ranRepository, ranCommitID, ranTargetBranc
|
||||
return ret.returncode == 0
|
||||
|
||||
def CreateTag(ranCommitID, ranBranch, ranAllowMerge):
|
||||
if ranCommitID == 'develop':
|
||||
return 'develop'
|
||||
shortCommit = ranCommitID[0:8]
|
||||
if ranAllowMerge:
|
||||
# Allowing contributor to have a name/branchName format
|
||||
@@ -159,26 +161,25 @@ def GetContainerHealth(ssh, containerName):
|
||||
return False
|
||||
if 'db_init' in containerName or 'db-init' in containerName: # exits with 0, there cannot be healthy
|
||||
return True
|
||||
time.sleep(5)
|
||||
for _ in range(3):
|
||||
for _ in range(8):
|
||||
result = ssh.run(f'docker inspect --format="{{{{.State.Health.Status}}}}" {containerName}', silent=True)
|
||||
if result.stdout == 'healthy':
|
||||
return True
|
||||
time.sleep(10)
|
||||
time.sleep(5)
|
||||
return False
|
||||
|
||||
def ExistEnvFilePrint(ssh, wd, prompt='env vars in existing'):
|
||||
ret = ssh.run(f'cat {wd}/.env', silent=True)
|
||||
ret = ssh.run(f'cat {wd}/.env', silent=True, reportNonZero=False)
|
||||
if ret.returncode != 0:
|
||||
return False
|
||||
env_vars = ret.stdout.strip().splitlines()
|
||||
logging.info(f'{prompt} {wd}/.env: {env_vars}')
|
||||
return True
|
||||
|
||||
def WriteEnvFile(ssh, services, wd, tag):
|
||||
ret = ssh.run(f'cat {wd}/.env', silent=True)
|
||||
def WriteEnvFile(ssh, services, wd, tag, flexric_tag):
|
||||
ret = ssh.run(f'cat {wd}/.env', silent=True, reportNonZero=False)
|
||||
registry = "oai-ci" # pull_images() gives us this registry path
|
||||
envs = {"REGISTRY":registry, "TAG": tag}
|
||||
envs = {"REGISTRY":registry, "TAG": tag, "FLEXRIC_TAG": flexric_tag}
|
||||
if ret.returncode == 0: # it exists, we have to update
|
||||
# transforms env file to dictionary
|
||||
old_envs = {}
|
||||
@@ -221,7 +222,6 @@ def CopyinContainerLog(ssh, lSourcePath, yaml, containerName, filename):
|
||||
remote_filename = f"{lSourcePath}/cmake_targets/log/{filename}"
|
||||
ssh.run(f'docker logs {containerName} &> {remote_filename}')
|
||||
local_dir = f"{os.getcwd()}/../cmake_targets/log/{yaml}"
|
||||
os.system(f'mkdir -p {local_dir}')
|
||||
local_filename = f"{local_dir}/{filename}"
|
||||
return ssh.copyin(remote_filename, local_filename)
|
||||
|
||||
@@ -334,12 +334,11 @@ class Containerize():
|
||||
self.cliOptions = ''
|
||||
|
||||
self.imageToCopy = ''
|
||||
self.registrySvrId = ''
|
||||
self.testSvrId = ''
|
||||
self.imageToPull = []
|
||||
#checkers from xml
|
||||
self.ran_checkers={}
|
||||
|
||||
self.flexricTag = ''
|
||||
|
||||
#-----------------------------------------------------------
|
||||
# Container management functions
|
||||
#-----------------------------------------------------------
|
||||
@@ -723,8 +722,8 @@ class Containerize():
|
||||
HTML.CreateHtmlTabFooter(False)
|
||||
return False
|
||||
|
||||
def Push_Image_to_Local_Registry(self, HTML):
|
||||
lIpAddr, lSourcePath = self.GetCredentials(self.registrySvrId)
|
||||
def Push_Image_to_Local_Registry(self, HTML, svr_id):
|
||||
lIpAddr, lSourcePath = self.GetCredentials(svr_id)
|
||||
logging.debug('Pushing images from server: ' + lIpAddr)
|
||||
ssh = cls_cmd.getConnection(lIpAddr)
|
||||
imagePrefix = 'porcepix.sboai.cs.eurecom.fr'
|
||||
@@ -771,64 +770,66 @@ class Containerize():
|
||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
return True
|
||||
|
||||
def Pull_Image_from_Local_Registry(self, HTML):
|
||||
lIpAddr, lSourcePath = self.GetCredentials(self.testSvrId)
|
||||
logging.debug('\u001B[1m Pulling image(s) on server: ' + lIpAddr + '\u001B[0m')
|
||||
myCmd = cls_cmd.getConnection(lIpAddr)
|
||||
imagePrefix = 'porcepix.sboai.cs.eurecom.fr'
|
||||
response = myCmd.run(f'docker login -u oaicicd -p oaicicd {imagePrefix}')
|
||||
if response.returncode != 0:
|
||||
msg = 'Could not log into local registry'
|
||||
logging.error(msg)
|
||||
myCmd.close()
|
||||
HTML.CreateHtmlTestRow(msg, 'KO', CONST.ALL_PROCESSES_OK)
|
||||
return False
|
||||
pulled_images = []
|
||||
for image in self.imageToPull:
|
||||
tagToUse = CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
imageTag = f"{image}:{tagToUse}"
|
||||
cmd = f'docker pull {imagePrefix}/{imageTag}'
|
||||
response = myCmd.run(cmd, timeout=120)
|
||||
def Pull_Image(cmd, images, tag, registry, username, password):
|
||||
if username is not None and password is not None:
|
||||
logging.info(f"logging into registry {username}@{registry}")
|
||||
response = cmd.run(f'docker login -u {username} -p {password} {registry}', silent=True, reportNonZero=False)
|
||||
if response.returncode != 0:
|
||||
logging.debug(response)
|
||||
msg = f'Could not pull {image} from local registry : {imageTag}'
|
||||
msg = f'Could not log into registry {username}@{registry}'
|
||||
logging.error(msg)
|
||||
myCmd.close()
|
||||
HTML.CreateHtmlTestRow('msg', 'KO', CONST.ALL_PROCESSES_OK)
|
||||
return False
|
||||
myCmd.run(f'docker tag {imagePrefix}/{imageTag} oai-ci/{imageTag}')
|
||||
myCmd.run(f'docker rmi {imagePrefix}/{imageTag}')
|
||||
pulled_images += [f"oai-ci/{imageTag}"]
|
||||
response = myCmd.run(f'docker logout {imagePrefix}')
|
||||
if response.returncode != 0:
|
||||
msg = 'Could not log off from local registry'
|
||||
logging.error(msg)
|
||||
myCmd.close()
|
||||
HTML.CreateHtmlTestRow(msg, 'KO', CONST.ALL_PROCESSES_OK)
|
||||
return False
|
||||
myCmd.close()
|
||||
msg = "Pulled Images:\n" + '\n'.join(pulled_images)
|
||||
HTML.CreateHtmlTestRowQueue('N/A', 'OK', [msg])
|
||||
return True
|
||||
|
||||
def Clean_Test_Server_Images(self, HTML):
|
||||
lIpAddr, lSourcePath = self.GetCredentials(self.testSvrId)
|
||||
if lIpAddr != 'none':
|
||||
logging.debug('Removing test images from server: ' + lIpAddr)
|
||||
myCmd = cls_cmd.RemoteCmd(lIpAddr)
|
||||
else:
|
||||
logging.debug('Removing test images locally')
|
||||
myCmd = cls_cmd.LocalCmd()
|
||||
|
||||
for image in IMAGES:
|
||||
tag = CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
return False, msg
|
||||
pulled_images = []
|
||||
for image in images:
|
||||
imageTag = f"{image}:{tag}"
|
||||
cmd = f'docker rmi oai-ci/{imageTag}'
|
||||
myCmd.run(cmd, reportNonZero=False)
|
||||
response = cmd.run(f'docker pull {registry}/{imageTag}')
|
||||
if response.returncode != 0:
|
||||
msg = f'Could not pull {image} from local registry: {imageTag}'
|
||||
logging.error(msg)
|
||||
return False, msg
|
||||
cmd.run(f'docker tag {registry}/{imageTag} oai-ci/{imageTag}')
|
||||
cmd.run(f'docker rmi {registry}/{imageTag}')
|
||||
pulled_images += [f"oai-ci/{imageTag}"]
|
||||
if username is not None and password is not None:
|
||||
response = cmd.run(f'docker logout {registry}')
|
||||
# we have the images, if logout fails it's no problem
|
||||
msg = "Pulled Images:\n" + '\n'.join(pulled_images)
|
||||
return True, msg
|
||||
|
||||
myCmd.close()
|
||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
return True
|
||||
def Pull_Image_from_Registry(self, HTML, svr_id, images, tag=None, registry="porcepix.sboai.cs.eurecom.fr", username="oaicicd", password="oaicicd"):
|
||||
lIpAddr, lSourcePath = self.GetCredentials(svr_id)
|
||||
logging.debug('\u001B[1m Pulling image(s) on server: ' + lIpAddr + '\u001B[0m')
|
||||
if not tag:
|
||||
tag = CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
with cls_cmd.getConnection(lIpAddr) as cmd:
|
||||
success, msg = Containerize.Pull_Image(cmd, images, tag, registry, username, password)
|
||||
param = f"on node {lIpAddr}"
|
||||
if success:
|
||||
HTML.CreateHtmlTestRowQueue(param, 'OK', [msg])
|
||||
else:
|
||||
HTML.CreateHtmlTestRowQueue(param, 'KO', [msg])
|
||||
return success
|
||||
|
||||
def Clean_Test_Server_Images(self, HTML, svr_id, images, tag=None):
|
||||
lIpAddr, lSourcePath = self.GetCredentials(svr_id)
|
||||
logging.debug(f'\u001B[1m Cleaning image(s) from server: {lIpAddr}\u001B[0m')
|
||||
if not tag:
|
||||
tag = CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
|
||||
status = True
|
||||
with cls_cmd.getConnection(lIpAddr) as myCmd:
|
||||
removed_images = []
|
||||
for image in images:
|
||||
fullImage = f"oai-ci/{image}:{tag}"
|
||||
cmd = f'docker rmi {fullImage}'
|
||||
if myCmd.run(cmd).returncode != 0:
|
||||
status = False
|
||||
removed_images += [fullImage]
|
||||
|
||||
msg = "Removed Images:\n" + '\n'.join(removed_images)
|
||||
s = 'OK' if status else 'KO'
|
||||
param = f"on node {lIpAddr}"
|
||||
HTML.CreateHtmlTestRowQueue(param, s, [msg])
|
||||
return status
|
||||
|
||||
def Create_Workspace(self,HTML):
|
||||
svr = self.eNB_serverId[self.eNB_instance]
|
||||
@@ -845,6 +846,9 @@ class Containerize():
|
||||
lIpAddr, lSourcePath = self.GetCredentials(svr)
|
||||
logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m')
|
||||
yaml = self.yamlPath[self.eNB_instance].strip('/')
|
||||
# creating the log folder by default
|
||||
local_dir = f"{os.getcwd()}/../cmake_targets/log/{yaml.split('/')[-1]}"
|
||||
os.system(f'mkdir -p {local_dir}')
|
||||
wd = f'{lSourcePath}/{yaml}'
|
||||
|
||||
with cls_cmd.getConnection(lIpAddr) as ssh:
|
||||
@@ -856,7 +860,7 @@ class Containerize():
|
||||
return False
|
||||
|
||||
ExistEnvFilePrint(ssh, wd)
|
||||
WriteEnvFile(ssh, services, wd, self.deploymentTag)
|
||||
WriteEnvFile(ssh, services, wd, self.deploymentTag, self.flexricTag)
|
||||
|
||||
logging.info(f"will start services {services}")
|
||||
status = ssh.run(f'docker compose -f {wd}/docker-compose.y*ml up -d -- {services}')
|
||||
|
||||
@@ -147,7 +147,7 @@ class HTMLManagement():
|
||||
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-tag"></span> Commit ID </td>\n')
|
||||
self.htmlFile.write(' <td>' + self.ranCommitID + '</td>\n')
|
||||
self.htmlFile.write(' </tr>\n')
|
||||
if self.ranAllowMerge != '':
|
||||
if self.ranAllowMerge != '' and self.ranCommitID != 'develop':
|
||||
commit_message = subprocess.check_output("git log -n1 --pretty=format:\"%s\" " + self.ranCommitID, shell=True, universal_newlines=True)
|
||||
commit_message = commit_message.strip()
|
||||
self.htmlFile.write(' <tr>\n')
|
||||
|
||||
@@ -188,7 +188,7 @@ gNBs =
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ({ ipv4 = "192.168.71.132"; });
|
||||
amf_ip_address = ({ ipv4 = "172.21.6.103"; });
|
||||
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
|
||||
@@ -13,7 +13,6 @@ gNBs =
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ( { sst = 1; }); });
|
||||
|
||||
//nr_cellid = 12345678L;
|
||||
nr_cellid = 1;
|
||||
|
||||
////////// Physical parameters:
|
||||
@@ -23,7 +22,7 @@ gNBs =
|
||||
maxMIMO_layers = 2;
|
||||
pusch_AntennaPorts = 4;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 0 ;
|
||||
do_SRS = 0;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
@@ -38,10 +37,11 @@ gNBs =
|
||||
physCellId = 0;
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3450.72 MHz (center frequency)
|
||||
# center frequency = 3999.36 MHz
|
||||
# selected SSB frequency = 3999.36 MHz
|
||||
absoluteFrequencySSB = 666624;
|
||||
dl_frequencyBand = 77;
|
||||
# this is 3401.58 MHz
|
||||
# frequency point A = 3950.22 MHz
|
||||
dl_absoluteFrequencyPointA = 663348;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
@@ -186,8 +186,8 @@ MACRLCs = (
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 180;
|
||||
pucch_TargetSNRx10 = 230;
|
||||
ul_bler_target_upper=.35;
|
||||
ul_bler_target_lower=.15;
|
||||
ul_bler_target_upper = .35;
|
||||
ul_bler_target_lower = .15;
|
||||
pusch_FailureThres = 100;
|
||||
}
|
||||
);
|
||||
@@ -211,7 +211,7 @@ RUs = (
|
||||
local_rf = "no";
|
||||
nb_tx = 4;
|
||||
nb_rx = 4;
|
||||
att_tx = 0
|
||||
att_tx = 0;
|
||||
att_rx = 0;
|
||||
bands = [77];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
@@ -220,21 +220,11 @@ RUs = (
|
||||
eNB_instances = [0];
|
||||
ru_thread_core = 5;
|
||||
sl_ahead = 5;
|
||||
clock_src = "internal";
|
||||
tr_preference = "raw_if4p5"; # important: activate FHI7.2
|
||||
do_precoding = 0; # needs to match O-RU configuration
|
||||
do_precoding = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
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
|
||||
@@ -252,7 +242,8 @@ security = {
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config : {
|
||||
log_config :
|
||||
{
|
||||
global_log_level = "info";
|
||||
hw_log_level = "info";
|
||||
phy_log_level = "info";
|
||||
@@ -269,25 +260,21 @@ fhi_72 = {
|
||||
system_core = 0;
|
||||
io_core = 1;
|
||||
worker_cores = (2);
|
||||
du_addr = ("76:76:64:6e:00:01", "76:76:64:6e:00:01");
|
||||
ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb");
|
||||
mtu = 9216; # check if xran uses this properly
|
||||
mtu = 9600;
|
||||
fh_config = ({
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (285, 429); # (min, max)
|
||||
T2a_cp_ul = (285, 429); # (min, max)
|
||||
T2a_up = (125, 428); # (min, max)
|
||||
Ta3 = (130, 170); # (min, max)
|
||||
T1a_cp_dl = (285, 470); # (min, max)
|
||||
T1a_cp_ul = (285, 429); # (min, max)
|
||||
T1a_up = (125, 350); # (min, max)
|
||||
Ta4 = (110, 180); # (min, max)
|
||||
T2a_cp_dl = (285, 429);
|
||||
T2a_cp_ul = (285, 429);
|
||||
T2a_up = (125, 428);
|
||||
Ta3 = (130, 170);
|
||||
T1a_cp_dl = (285, 470);
|
||||
T1a_cp_ul = (285, 429);
|
||||
T1a_up = (125, 350);
|
||||
Ta4 = (110, 180);
|
||||
ru_config = {
|
||||
iq_width = 9;
|
||||
iq_width_prach = 9;
|
||||
};
|
||||
prach_config = {
|
||||
eAxC_offset = 4;
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
@@ -0,0 +1,239 @@
|
||||
Active_gNBs = ( "gnb-rfsim");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe00;
|
||||
|
||||
gNB_name = "gnb-rfsim";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||
|
||||
nr_cellid = 12345678L
|
||||
|
||||
////////// 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;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
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=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
});
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ({ ipv4 = "192.168.70.132"; });
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.151";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.151";
|
||||
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;
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 200;
|
||||
# pucch0_dtx_threshold = 150;
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "yes";
|
||||
nb_tx = 1;
|
||||
nb_rx = 1;
|
||||
att_tx = 0;
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 75;
|
||||
eNB_instances = [0];
|
||||
sf_extension = 0;
|
||||
sdr_addrs = "serial=XXXXXXX";
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator: {
|
||||
serveraddr = "server";
|
||||
};
|
||||
|
||||
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 ="info";
|
||||
};
|
||||
|
||||
e2_agent = {
|
||||
near_ric_ip_addr = "192.168.70.150";
|
||||
#sm_dir = "/path/where/the/SMs/are/located/"
|
||||
sm_dir = "/usr/local/lib/flexric/"
|
||||
};
|
||||
@@ -22,9 +22,9 @@ gNBs =
|
||||
maxMIMO_layers = 2;
|
||||
pusch_AntennaPorts = 4;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 0 ;
|
||||
sib1_tda = 15;
|
||||
# force_UL256qam_off = 1;
|
||||
do_SRS = 0;
|
||||
sib1_tda = 15;
|
||||
# force_UL256qam_off = 1;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
@@ -41,10 +41,11 @@ gNBs =
|
||||
# n_TimingAdvanceOffset = 0;
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3450.72 MHz (center frequency)
|
||||
# center frequency = 3350.01 MHz
|
||||
# selected SSB frequency = 3349.92 MHz
|
||||
absoluteFrequencySSB = 623328;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3401.58 MHz
|
||||
# frequency point A = 3300.87 MHz
|
||||
dl_absoluteFrequencyPointA = 620052;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
@@ -189,10 +190,10 @@ MACRLCs = (
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 100;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
dl_bler_target_upper=.35;
|
||||
dl_bler_target_lower=.15;
|
||||
ul_bler_target_upper=.35;
|
||||
ul_bler_target_lower=.15;
|
||||
dl_bler_target_upper = .35;
|
||||
dl_bler_target_lower = .15;
|
||||
ul_bler_target_upper = .35;
|
||||
ul_bler_target_lower = .15;
|
||||
pusch_FailureThres = 1000;
|
||||
ul_max_mcs = 28;
|
||||
}
|
||||
@@ -218,7 +219,7 @@ RUs = (
|
||||
local_rf = "no";
|
||||
nb_tx = 4;
|
||||
nb_rx = 4;
|
||||
att_tx = 0
|
||||
att_tx = 0;
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
@@ -228,7 +229,7 @@ RUs = (
|
||||
ru_thread_core = 5;
|
||||
sl_ahead = 10;
|
||||
tr_preference = "raw_if4p5"; # important: activate FHI7.2
|
||||
do_precoding = 0; # needs to match O-RU configuration
|
||||
do_precoding = 0; # needs to match O-RU configuration
|
||||
}
|
||||
);
|
||||
|
||||
@@ -251,15 +252,15 @@ security = {
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="info";
|
||||
mac_log_level ="info";
|
||||
rlc_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
ngap_log_level ="info";
|
||||
f1ap_log_level ="info";
|
||||
global_log_level = "info";
|
||||
hw_log_level = "info";
|
||||
phy_log_level = "info";
|
||||
mac_log_level = "info";
|
||||
rlc_log_level = "info";
|
||||
pdcp_log_level = "info";
|
||||
rrc_log_level = "info";
|
||||
ngap_log_level = "info";
|
||||
f1ap_log_level = "info";
|
||||
};
|
||||
|
||||
fhi_72 = {
|
||||
@@ -267,10 +268,8 @@ fhi_72 = {
|
||||
system_core = 0;
|
||||
io_core = 1;
|
||||
worker_cores = (2);
|
||||
du_addr = ("00:11:22:33:44:66", "00:11:22:33:44:67");
|
||||
ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81");
|
||||
mtu = 9216;
|
||||
file_prefix = "fhi_72";
|
||||
mtu = 9600;
|
||||
fh_config = ({
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (259, 500);
|
||||
@@ -285,8 +284,5 @@ fhi_72 = {
|
||||
iq_width = 9;
|
||||
iq_width_prach = 9;
|
||||
};
|
||||
prach_config = {
|
||||
eAxC_offset = 4;
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
+18
-28
@@ -370,26 +370,20 @@ def ExecuteActionWithParam(action):
|
||||
success = SCA.CppCheckAnalysis(HTML)
|
||||
|
||||
elif action == 'Push_Local_Registry':
|
||||
string_field = test.findtext('registry_svr_id')
|
||||
if (string_field is not None):
|
||||
CONTAINERS.registrySvrId = string_field
|
||||
success = CONTAINERS.Push_Image_to_Local_Registry(HTML)
|
||||
svr_id = test.findtext('svr_id')
|
||||
success = CONTAINERS.Push_Image_to_Local_Registry(HTML, svr_id)
|
||||
|
||||
elif action == 'Pull_Local_Registry':
|
||||
string_field = test.findtext('test_svr_id')
|
||||
if (string_field is not None):
|
||||
CONTAINERS.testSvrId = string_field
|
||||
CONTAINERS.imageToPull.clear()
|
||||
string_field = test.findtext('images_to_pull')
|
||||
if (string_field is not None):
|
||||
CONTAINERS.imageToPull = string_field.split()
|
||||
success = CONTAINERS.Pull_Image_from_Local_Registry(HTML)
|
||||
|
||||
elif action == 'Clean_Test_Server_Images':
|
||||
string_field = test.findtext('test_svr_id')
|
||||
if (string_field is not None):
|
||||
CONTAINERS.testSvrId = string_field
|
||||
success = CONTAINERS.Clean_Test_Server_Images(HTML)
|
||||
elif action == 'Pull_Local_Registry' or action == 'Clean_Test_Server_Images':
|
||||
svr_id = test.findtext('svr_id')
|
||||
images = test.findtext('images').split()
|
||||
# hack: for FlexRIC, we need to overwrite the tag to use
|
||||
tag = None
|
||||
if len(images) == 1 and images[0] == "oai-flexric":
|
||||
tag = CONTAINERS.flexricTag
|
||||
if action == "Pull_Local_Registry":
|
||||
success = CONTAINERS.Pull_Image_from_Registry(HTML, svr_id, images, tag=tag)
|
||||
if action == "Clean_Test_Server_Images":
|
||||
success = CONTAINERS.Clean_Test_Server_Images(HTML, svr_id, images, tag=tag)
|
||||
|
||||
elif action == 'Custom_Command':
|
||||
node = test.findtext('node')
|
||||
@@ -404,13 +398,9 @@ def ExecuteActionWithParam(action):
|
||||
success = cls_oaicitest.Custom_Script(HTML, node, script, command_fail)
|
||||
|
||||
elif action == 'Pull_Cluster_Image':
|
||||
string_field = test.findtext('images_to_pull')
|
||||
if (string_field is not None):
|
||||
CLUSTER.imageToPull = string_field.split()
|
||||
string_field = test.findtext('test_svr_id')
|
||||
if (string_field is not None):
|
||||
CLUSTER.testSvrId = string_field
|
||||
success = CLUSTER.PullClusterImage(HTML, RAN)
|
||||
images = test.findtext('images').split()
|
||||
node = test.findtext('node')
|
||||
success = CLUSTER.PullClusterImage(HTML, node, images)
|
||||
|
||||
else:
|
||||
logging.warning(f"unknown action {action}, skip step")
|
||||
@@ -634,7 +624,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
||||
#(6 digits or less than 6 digits followed by +)
|
||||
for test in exclusion_tests:
|
||||
if (not re.match('^[0-9]{6}$', test) and
|
||||
not re.match('^[0-9]{1,5}\+$', test)):
|
||||
not re.match('^[0-9]{1,5}\\+$', test)):
|
||||
logging.error('exclusion test is invalidly formatted: ' + test)
|
||||
sys.exit(1)
|
||||
else:
|
||||
@@ -645,7 +635,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
||||
#be verbose
|
||||
for test in requested_tests:
|
||||
if (re.match('^[0-9]{6}$', test) or
|
||||
re.match('^[0-9]{1,5}\+$', test)):
|
||||
re.match('^[0-9]{1,5}\\+$', test)):
|
||||
logging.info('test group/case requested: ' + test)
|
||||
else:
|
||||
logging.error('requested test is invalidly formatted: ' + test)
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import sys
|
||||
import logging
|
||||
logging.basicConfig(
|
||||
level=logging.DEBUG,
|
||||
stream=sys.stdout,
|
||||
format="[%(asctime)s] %(levelname)8s: %(message)s"
|
||||
)
|
||||
import os
|
||||
os.system(f'rm -rf cmake_targets')
|
||||
os.system(f'mkdir -p cmake_targets/log')
|
||||
import unittest
|
||||
|
||||
sys.path.append('./') # to find OAI imports below
|
||||
import cls_oai_html
|
||||
import cls_cmd
|
||||
import cls_containerize
|
||||
|
||||
class TestDeploymentMethods(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.html = cls_oai_html.HTMLManagement()
|
||||
self.html.testCaseId = "000000"
|
||||
self.cont = cls_containerize.Containerize()
|
||||
self.cont.eNBIPAddress = 'localhost'
|
||||
self.cont.eNBSourceCodePath = os.getcwd()
|
||||
|
||||
def test_pull_clean_local_reg(self):
|
||||
# the pull function has the authentication at the internal cluster hardcoded
|
||||
# this is a refactoring opportunity: we should do it in a separate step
|
||||
# and allow to have pull work with any registry
|
||||
registry = "porcepix.sboai.cs.eurecom.fr"
|
||||
with cls_cmd.getConnection("localhost") as cmd:
|
||||
ret = cmd.run(f"ping -c1 -w1 {registry}")
|
||||
if ret.returncode != 0: # could not ping once -> skip test
|
||||
self.skipTest(f"test_pull_clean_local_reg: could not reach {registry} (run inside sboai)")
|
||||
svr_id = '0'
|
||||
images = ["oai-gnb"]
|
||||
tag = "develop"
|
||||
pull = self.cont.Pull_Image_from_Registry(self.html, svr_id, images, tag=tag)
|
||||
clean = self.cont.Clean_Test_Server_Images(self.html, svr_id, images, tag=tag)
|
||||
self.assertTrue(pull)
|
||||
self.assertTrue(clean)
|
||||
|
||||
def test_pull_clean_docker_hub(self):
|
||||
svr_id = '0'
|
||||
r = "docker.io"
|
||||
images = ["hello-world"]
|
||||
tag = "latest"
|
||||
pull = self.cont.Pull_Image_from_Registry(self.html, svr_id, images, tag=tag, registry=r, username=None, password=None)
|
||||
clean = self.cont.Clean_Test_Server_Images(self.html, svr_id, images, tag=tag)
|
||||
self.assertTrue(pull)
|
||||
self.assertTrue(clean)
|
||||
|
||||
if __name__ == '__main__':unittest.main()
|
||||
@@ -44,8 +44,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb oai-lte-ue</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb oai-lte-ue</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -149,7 +149,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb oai-lte-ue</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -52,8 +52,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000011">
|
||||
@@ -166,7 +166,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -137,7 +137,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -166,7 +166,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -166,7 +166,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -104,7 +104,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -104,7 +104,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb-asan oai-lte-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb oai-lte-ue</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb oai-lte-ue</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -159,7 +159,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb oai-lte-ue</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb oai-nr-cuup oai-nr-ue</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb oai-nr-cuup oai-nr-ue</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -107,7 +107,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb oai-nr-cuup oai-nr-ue</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-asan oai-nr-cuup-asan oai-nr-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-cuup-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -194,7 +194,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-cuup-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -133,7 +133,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -0,0 +1,213 @@
|
||||
<!--
|
||||
|
||||
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-flexric</htmlTabRef>
|
||||
<htmlTabName>Monolithic SA TDD gNB and FlexRic Integration</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<repeatCount>1</repeatCount>
|
||||
<TestCaseRequestedList>
|
||||
111110
|
||||
111111
|
||||
111112
|
||||
000001
|
||||
000002
|
||||
000003
|
||||
002001
|
||||
010000
|
||||
000004
|
||||
333333
|
||||
010001
|
||||
010002
|
||||
010003
|
||||
020005
|
||||
010013
|
||||
002006
|
||||
444444
|
||||
100002
|
||||
100001
|
||||
222221
|
||||
222222
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="002001">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb oai-nr-ue</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-flexric</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="222221">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb oai-nr-ue</images>
|
||||
<always_exec>true</always_exec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="222222">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-flexric</images>
|
||||
<always_exec>true</always_exec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="111112">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Updating CN5G images</desc>
|
||||
<node>localhost</node>
|
||||
<command>docker compose -f ../doc/tutorial_resources/oai-cn5g/docker-compose.yaml pull</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000001">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G CoreNetwork</desc>
|
||||
<yaml_path>doc/tutorial_resources/oai-cn5g</yaml_path>
|
||||
<services>mysql oai-nrf oai-udr oai-udm oai-ausf oai-amf oai-smf oai-upf oai-ext-dn</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000002">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI FlexRIC</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
|
||||
<services>oai-flexric</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000003">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G gNB in RF sim SA</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
|
||||
<services>oai-gnb</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000004">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy 2 OAI 5G NR-UEs in RF sim SA</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
|
||||
<services>oai-nr-ue oai-nr-ue2</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020005">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from both UEs</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2</id>
|
||||
<nodes>selfix selfix</nodes>
|
||||
<ping_args>-c 20 192.168.70.135</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="333333">
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE 1 and 2</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2</id>
|
||||
<nodes>selfix selfix</nodes>
|
||||
</testCase>
|
||||
|
||||
<testCase id="444444">
|
||||
<class>Detach_UE</class>
|
||||
<desc>Detach OAI UE 1 and 2</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2</id>
|
||||
<nodes>selfix selfix</nodes>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100001">
|
||||
<class>Undeploy_Object</class>
|
||||
<desc>Undeploy Core Network</desc>
|
||||
<yaml_path>doc/tutorial_resources/oai-cn5g</yaml_path>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
<always_exec>true</always_exec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100002">
|
||||
<class>Undeploy_Object</class>
|
||||
<desc>Undeploy RAN and Flexric</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
<always_exec>true</always_exec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010000">
|
||||
<class>Custom_Command</class>
|
||||
<desc>RC monitoring</desc>
|
||||
<node>localhost</node>
|
||||
<command_fail>yes</command_fail>
|
||||
<command>docker exec oai-flexric bash -c "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_rc_moni" > ../cmake_targets/log/5g_rfsimulator_flexric/rc-moni-010000.log</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010001">
|
||||
<class>Custom_Command</class>
|
||||
<desc>KPM monitoring</desc>
|
||||
<node>localhost</node>
|
||||
<command_fail>yes</command_fail>
|
||||
<command>docker exec oai-flexric bash -c "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_kpm_moni" > ../cmake_targets/log/5g_rfsimulator_flexric/kpm-moni-010001.log</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010002">
|
||||
<class>Custom_Command</class>
|
||||
<desc>KPM monitoring and RC control</desc>
|
||||
<node>localhost</node>
|
||||
<command_fail>yes</command_fail>
|
||||
<command>docker exec oai-flexric bash -c "stdbuf -o0 /usr/local/flexric/xApp/c/kpm_rc/xapp_kpm_rc" > ../cmake_targets/log/5g_rfsimulator_flexric/kpm_rc-010002.log</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010003">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Custom SMs monitoring</desc>
|
||||
<node>localhost</node>
|
||||
<command_fail>yes</command_fail>
|
||||
<command>docker exec oai-flexric bash -c "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni" > ../cmake_targets/log/5g_rfsimulator_flexric/sms-moni-010003.log</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010013">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Custom SMs monitoring</desc>
|
||||
<node>localhost</node>
|
||||
<command_fail>yes</command_fail>
|
||||
<command>docker exec oai-flexric bash -c "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni" > ../cmake_targets/log/5g_rfsimulator_flexric/sms-moni-010013.log</command>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -57,8 +57,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-asan oai-nr-ue</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -259,7 +259,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -133,7 +133,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -133,7 +133,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="004000">
|
||||
@@ -133,7 +133,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="800813">
|
||||
@@ -101,7 +101,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -41,8 +41,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="800813">
|
||||
@@ -107,7 +107,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-nr-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="800813">
|
||||
@@ -97,7 +97,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -41,8 +41,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="004000">
|
||||
@@ -116,7 +116,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -133,7 +133,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
<testCase id="000010">
|
||||
<class>Push_Local_Registry</class>
|
||||
<desc>Push Images to Local Registry</desc>
|
||||
<registry_svr_id>0</registry_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -43,8 +43,8 @@ Replaces xml_files/enb_usrp210_band7_test_05mhz_tm1.xml
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -211,7 +211,8 @@ Replaces xml_files/enb_usrp210_band7_test_05mhz_tm1.xml
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -194,7 +194,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -42,8 +42,8 @@ Replaces xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xm
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
<testCase id="100000">
|
||||
<class>Custom_Command</class>
|
||||
@@ -176,7 +176,8 @@ Replaces xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xm
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -44,8 +44,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
<testCase id="100000">
|
||||
<class>Custom_Command</class>
|
||||
@@ -206,7 +206,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -43,8 +43,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
<testCase id="100000">
|
||||
<class>Custom_Command</class>
|
||||
@@ -138,7 +138,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -49,14 +49,14 @@
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>1</test_svr_id>
|
||||
<images_to_pull>oai-lte-ue</images_to_pull>
|
||||
<svr_id>1</svr_id>
|
||||
<images>oai-lte-ue</images>
|
||||
</testCase>
|
||||
<testCase id="100000">
|
||||
<class>Custom_Command</class>
|
||||
@@ -190,14 +190,16 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on eNB Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="333333">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on LTE-UE Test Server</desc>
|
||||
<test_svr_id>1</test_svr_id>
|
||||
<svr_id>1</svr_id>
|
||||
<images>oai-lte-ue</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -43,8 +43,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
<testCase id="100000">
|
||||
<class>Custom_Command</class>
|
||||
@@ -206,7 +206,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -43,8 +43,8 @@ Replaces xml_files/enb_usrp210_band40_test_05mhz_tm1.xml
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -223,7 +223,8 @@ Replaces xml_files/enb_usrp210_band40_test_05mhz_tm1.xml
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -41,8 +41,8 @@
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -209,7 +209,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -41,8 +41,8 @@ Replaces xml_files/enb_usrp210_band40_test_05mhz_tm2.xml
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
<testCase id="100000">
|
||||
<class>Custom_Command</class>
|
||||
|
||||
@@ -42,8 +42,8 @@ Replaces xml_files/enb_usrp210_band40_test_10mhz_tm1.xml
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
<testCase id="100000">
|
||||
<class>Custom_Command</class>
|
||||
@@ -214,7 +214,8 @@ Replaces xml_files/enb_usrp210_band40_test_10mhz_tm1.xml
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -42,8 +42,8 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1.xml
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
<testCase id="100000">
|
||||
<class>Custom_Command</class>
|
||||
@@ -212,7 +212,8 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1.xml
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -42,8 +42,8 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -217,7 +217,8 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -48,8 +48,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -153,7 +153,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -48,8 +48,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -153,7 +153,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
|
||||
|
||||
@@ -57,15 +57,15 @@
|
||||
<testCase id="111110">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-enb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>1</test_svr_id>
|
||||
<images_to_pull>oai-gnb</images_to_pull>
|
||||
<svr_id>1</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id = "100000">
|
||||
@@ -252,14 +252,16 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-enb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="222221">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>1</test_svr_id>
|
||||
<svr_id>1</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
<htmlTabName>AERIAL 100 MHz TDD SA</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
555000
|
||||
111111
|
||||
000222
|
||||
800813
|
||||
@@ -37,14 +38,20 @@
|
||||
000222
|
||||
222222
|
||||
333333
|
||||
000555
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
<testCase id="555000">
|
||||
<class>Initialize_5GCN</class>
|
||||
<desc>Initialize 5G Core</desc>
|
||||
<cn_id>oc-cn5g-20897-aerial2</cn_id>
|
||||
</testCase>
|
||||
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb-aerial</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-aerial</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="800813">
|
||||
@@ -82,15 +89,15 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping: 100pings in 20sec</desc>
|
||||
<id>up2-aerial</id>
|
||||
<ping_args>-c 100 -i 0.2 %cn_ip%</ping_args>
|
||||
<ping_args>-c 100 -i 0.2 172.21.6.104</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000022">
|
||||
<class>Iperf</class>
|
||||
<desc>iperf (DL/UDP/700M)(30 sec)(single-ue profile)</desc>
|
||||
<desc>iperf (DL/UDP/600M)(30 sec)(single-ue profile)</desc>
|
||||
<iperf_args>-u -b 600M -t 30 -R</iperf_args>
|
||||
<svr_id>porcepix-cn5g</svr_id>
|
||||
<svr_id>oc-cn5g-20897-aerial2</svr_id>
|
||||
<id>up2-aerial</id>
|
||||
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
|
||||
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
|
||||
@@ -100,7 +107,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>iperf (UL/UDP/50M)(30 sec)(single-ue profile)</desc>
|
||||
<iperf_args>-u -b 50M -t 30</iperf_args>
|
||||
<svr_id>porcepix-cn5g</svr_id>
|
||||
<svr_id>oc-cn5g-20897-aerial2</svr_id>
|
||||
<id>up2-aerial</id>
|
||||
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
|
||||
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
|
||||
@@ -128,8 +135,15 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-aerial</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000555">
|
||||
<class>Terminate_5GCN</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Terminate 5G Core</desc>
|
||||
<cn_id>oc-cn5g-20897-aerial2</cn_id>
|
||||
</testCase>
|
||||
</testCaseList>
|
||||
|
||||
|
||||
@@ -65,7 +65,8 @@
|
||||
<class>Pull_Cluster_Image</class>
|
||||
<desc>Pull Images from Cluster</desc>
|
||||
<oc_project>oaicicd-ran</oc_project>
|
||||
<images_to_pull>oai-gnb-aw2s</images_to_pull>
|
||||
<images>oai-gnb-aw2s</images>
|
||||
<node>avra</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="101000">
|
||||
@@ -277,7 +278,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-aw2s</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -64,7 +64,8 @@
|
||||
<class>Pull_Cluster_Image</class>
|
||||
<desc>Pull Images from Cluster</desc>
|
||||
<oc_project>oaicicd-ran</oc_project>
|
||||
<images_to_pull>oai-gnb-aw2s</images_to_pull>
|
||||
<images>oai-gnb-aw2s</images>
|
||||
<node>avra</node>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -274,7 +275,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-aw2s</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -59,8 +59,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -220,7 +220,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -56,8 +56,8 @@
|
||||
<testCase id="333333">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb oai-nr-cuup</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb oai-nr-cuup</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="310000">
|
||||
@@ -218,7 +218,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb oai-nr-cuup</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -64,8 +64,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="110000">
|
||||
@@ -251,7 +251,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -56,7 +56,8 @@
|
||||
<class>Pull_Cluster_Image</class>
|
||||
<desc>Pull Images from Cluster</desc>
|
||||
<oc_project>oaicicd-ran</oc_project>
|
||||
<images_to_pull>oai-gnb-fhi72</images_to_pull>
|
||||
<images>oai-gnb-fhi72</images>
|
||||
<node>cacofonix</node>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -153,7 +154,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-fhi72</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="888888">
|
||||
|
||||
@@ -46,8 +46,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Cluster_Image</class>
|
||||
<desc>Pull Images from Cluster</desc>
|
||||
<images_to_pull>oai-gnb</images_to_pull>
|
||||
<test_svr_id>matix</test_svr_id>
|
||||
<images>oai-gnb</images>
|
||||
<node>matix</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -156,7 +156,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -46,8 +46,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Cluster_Image</class>
|
||||
<desc>Pull Images from Cluster</desc>
|
||||
<images_to_pull>oai-gnb</images_to_pull>
|
||||
<test_svr_id>matix</test_svr_id>
|
||||
<images>oai-gnb</images>
|
||||
<node>matix</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -156,7 +156,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -46,8 +46,8 @@
|
||||
<testCase id="111111">
|
||||
<class>Pull_Cluster_Image</class>
|
||||
<desc>Pull Images from Cluster</desc>
|
||||
<images_to_pull>oai-gnb</images_to_pull>
|
||||
<test_svr_id>matix</test_svr_id>
|
||||
<images>oai-gnb</images>
|
||||
<node>matix</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100000">
|
||||
@@ -156,7 +156,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -44,15 +44,15 @@
|
||||
<testCase id="010000">
|
||||
<class>Pull_Cluster_Image</class>
|
||||
<desc>Pull Images from Cluster</desc>
|
||||
<images_to_pull>oai-gnb</images_to_pull>
|
||||
<test_svr_id>avra</test_svr_id>
|
||||
<images>oai-gnb</images>
|
||||
<node>avra</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010001">
|
||||
<class>Pull_Cluster_Image</class>
|
||||
<desc>Pull Images from Cluster</desc>
|
||||
<images_to_pull>oai-nr-ue</images_to_pull>
|
||||
<test_svr_id>caracal</test_svr_id>
|
||||
<images>oai-nr-ue</images>
|
||||
<node>caracal</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id = "030000">
|
||||
@@ -163,14 +163,16 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="444444">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>1</test_svr_id>
|
||||
<svr_id>1</svr_id>
|
||||
<images>oai-nr-ue</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -53,8 +53,8 @@
|
||||
<testCase id="311111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb</images_to_pull>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="300000">
|
||||
@@ -214,7 +214,8 @@
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
<!--
|
||||
|
||||
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>epc-closure</htmlTabRef>
|
||||
<htmlTabName>EPC-Closure</htmlTabName>
|
||||
<htmlTabIcon>log-out</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
060000 060001 060002
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="060000">
|
||||
<class>Terminate_HSS</class>
|
||||
<desc>Terminate HSS</desc>
|
||||
</testCase>
|
||||
|
||||
<testCase id="060001">
|
||||
<class>Terminate_MME</class>
|
||||
<desc>Terminate MME</desc>
|
||||
</testCase>
|
||||
|
||||
<testCase id="060002">
|
||||
<class>Terminate_SPGW</class>
|
||||
<desc>Terminate SPGW</desc>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -0,0 +1,48 @@
|
||||
<!--
|
||||
|
||||
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>epc-start-tab</htmlTabRef>
|
||||
<htmlTabName>EPC-Start</htmlTabName>
|
||||
<htmlTabIcon>log-in</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
000100 000101 000102
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList>
|
||||
</TestCaseExclusionList>
|
||||
|
||||
<testCase id="000100">
|
||||
<class>Initialize_HSS</class>
|
||||
<desc>Initialize HSS</desc>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000101">
|
||||
<class>Initialize_MME</class>
|
||||
<desc>Initialize MME</desc>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000102">
|
||||
<class>Initialize_SPGW</class>
|
||||
<desc>Initialize SPGW</desc>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -0,0 +1,38 @@
|
||||
<!--
|
||||
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>cn5g-start-tab</htmlTabRef>
|
||||
<htmlTabName>CN5G-Start</htmlTabName>
|
||||
<htmlTabIcon>log-in</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
000100
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList>
|
||||
</TestCaseExclusionList>
|
||||
|
||||
<testCase id="000100">
|
||||
<class>Initialize_5GCN</class>
|
||||
<desc>Initialize 5G Core</desc>
|
||||
<cn_id>oc-cn5g</cn_id>
|
||||
</testCase>
|
||||
</testCaseList>
|
||||
@@ -0,0 +1,38 @@
|
||||
<!--
|
||||
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>cn5g-closure</htmlTabRef>
|
||||
<htmlTabName>CN5G-Closure</htmlTabName>
|
||||
<htmlTabIcon>log-out</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
060000
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="060000">
|
||||
<class>Terminate_5GCN</class>
|
||||
<desc>Terminate 5G Core</desc>
|
||||
<cn_id>oc-cn5g</cn_id>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -0,0 +1,5 @@
|
||||
[NEAR-RIC]
|
||||
NEAR_RIC_IP = 192.168.70.150
|
||||
[XAPP]
|
||||
DB_PATH = /flexric/db/
|
||||
DB_NAME = xapp_rnis_db
|
||||
@@ -0,0 +1,81 @@
|
||||
services:
|
||||
oai-flexric:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/oai-flexric:${FLEXRIC_TAG:-develop}
|
||||
container_name: oai-flexric
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.150
|
||||
volumes:
|
||||
- ./conf/flexric.conf:/usr/local/etc/flexric/flexric.conf
|
||||
- sharedXappLibs:/usr/local/lib/flexric/
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nearRT-RIC"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
|
||||
oai-gnb:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-gnb
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: -E --rfsim --log_config.global_log_options level,nocolor,time
|
||||
ASAN_OPTIONS: detect_leaks=0
|
||||
depends_on:
|
||||
- oai-flexric
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.151
|
||||
volumes:
|
||||
- ../../conf_files/gnb.sa.band78.106prb.rfsim.flexric.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- sharedXappLibs:/usr/local/lib/flexric/
|
||||
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}
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: -E --rfsim -r 106 --numerology 1 -C 3619200000 --uicc0.imsi 001010000000003 --rfsimulator.serveraddr 192.168.70.151 --log_config.global_log_options level,nocolor,time
|
||||
depends_on:
|
||||
- oai-gnb
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.152
|
||||
volumes:
|
||||
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-uesoftmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-nr-ue2:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-nr-ue2
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: -E --rfsim -r 106 --numerology 1 -C 3619200000 --uicc0.imsi 001010000000004 --rfsimulator.serveraddr 192.168.70.151 --log_config.global_log_options level,nocolor,time
|
||||
depends_on:
|
||||
- oai-gnb
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.153
|
||||
volumes:
|
||||
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-uesoftmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
sharedXappLibs:
|
||||
|
||||
networks:
|
||||
public_net:
|
||||
name: oai-cn5g-public-net
|
||||
external: true
|
||||
@@ -193,6 +193,20 @@ typedef struct nsa_msg_t {
|
||||
uint8_t msg_buffer[MAX_MESSAGE_SIZE];
|
||||
} nsa_msg_t;
|
||||
|
||||
typedef struct transport_layer_addr_s {
|
||||
/**
|
||||
* Transport Layer Address as a bitstring:
|
||||
* - 32 bits for IPv4 (RFC 791),
|
||||
* - 128 bits for IPv6 (RFC 2460),
|
||||
* - 160 bits for both IPv4 and IPv6, with IPv4 in the first 32 bits.
|
||||
* The S1AP/NGAP layer forwards this address (bitstring<1..160>)
|
||||
* to S1-U/NG-U without interpreting it.
|
||||
*/
|
||||
uint8_t length;
|
||||
/// Buffer: address in network byte order
|
||||
uint8_t buffer[20];
|
||||
} transport_layer_addr_t;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// GTPV1U TYPES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#define MAX_BWP_SIZE 275
|
||||
#define NR_MAX_NUM_BWP 4
|
||||
#define NR_MAX_HARQ_PROCESSES 32
|
||||
#define NR_MAX_HARQ_ROUNDS_FOR_STATS 16
|
||||
#define NR_NB_REG_PER_CCE 6
|
||||
#define NR_NB_SC_PER_RB 12
|
||||
#define NR_MAX_NUM_LCID 32
|
||||
|
||||
+229
-119
@@ -42,7 +42,10 @@ NICs we have tested so far:
|
||||
|E810-C |4.20 0x8001784e 22.0.9 |
|
||||
|Intel XXV710 |6.02 0x80003888 |
|
||||
|
||||
**Note**: With AMD servers/desktop machines with PCIe 5.0 we have only used E810 cards.
|
||||
**Note**:
|
||||
|
||||
- With AMD servers/desktop machines with PCIe 5.0 we have only used E810 cards.
|
||||
- If you are using Mellanox NIC, please be aware that DPDK can't bind the NIC as vfio-pci. Instead it must be bind with mlx driver.
|
||||
|
||||
PTP enabled switches and grandmaster clock we have in are lab:
|
||||
|
||||
@@ -481,12 +484,15 @@ Contact the RU vendor and get the configuration manual to understand the below c
|
||||
|
||||
### Benetel 650
|
||||
|
||||
- **Valid only for version RAN650-1v1.0.4-dda1bf5**
|
||||
- TDD pattern `DDDDDDDSUU`, 5ms
|
||||
**Valid only for version RAN650-1v1.0.4-dda1bf5**
|
||||
|
||||
The OAI configuration file [`gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf) corresponds to:
|
||||
- TDD pattern `DDDSU`, 2.5ms
|
||||
- Bandwidth 100MHz
|
||||
- MTU 9216 (this is the maximum we can configure on our switch)
|
||||
- MTU 9600
|
||||
- 4TX4R
|
||||
- The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf) corresponds to below RU configuration.
|
||||
|
||||
#### RU configuration
|
||||
|
||||
After switching on the radio or rebooting, wait for the radio bring up to complete, which you can follow using `tail -f /tmp/logs/radio_status`. Once you will see `[INFO] Radio bringup complete`, you can configure the RU via editing `/etc/ru_config.cfg`
|
||||
|
||||
@@ -506,12 +512,15 @@ dl_ul_tuning_special_slot=0xfd00000
|
||||
|
||||
### Benetel 550
|
||||
|
||||
**Valid only for version RAN550-1v1.0.4-605a25a**
|
||||
|
||||
- **Valid only for version RAN550-1v1.0.4-605a25a**
|
||||
The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf) corresponds to:
|
||||
- TDD pattern `DDDDDDDSUU`, 5ms
|
||||
- Bandwidth 100MHz
|
||||
- MTU 9600
|
||||
- 4TX4R
|
||||
- The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf) corresponds to below RU configuration.
|
||||
|
||||
#### RU configuration
|
||||
|
||||
After switching on the radio or rebooting, wait for the radio bring up to complete, which you can follow using `tail -f /tmp/logs/radio_status`. Once you will see `[INFO] Radio bringup complete`, you can configure the RU via editing `/etc/ru_config.cfg`
|
||||
|
||||
@@ -529,48 +538,56 @@ flexran_prach_workaround=disabled
|
||||
dl_tuning_special_slot=0x13b6
|
||||
```
|
||||
|
||||
### LiteON
|
||||
### LITEON
|
||||
|
||||
**Verson 01.00.08**
|
||||
The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-liteon.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf) corresponds to:
|
||||
- TDD pattern `DDDSU`, 2.5ms
|
||||
- Bandwidth 100MHz
|
||||
- Default MTU is 1500
|
||||
- MTU 1500 (the above mentioned LITEON version doesn't support jumbo frames)
|
||||
|
||||
#### RU configuration
|
||||
|
||||
SSH to the unit as user `user`. Write `enable` in the terminal to enter the configuration console; the password should be in the user guide. Use the command `show oru-status` to check the RU status. The output should be similar to:
|
||||
|
||||
```bash
|
||||
# show oru-status
|
||||
Sync State : SYNCHRONIZED
|
||||
RF State : Ready
|
||||
DPD : Ready
|
||||
DuConnected : notReady
|
||||
```
|
||||
|
||||
Once the RU is PTP synced, and RF state and DPD are `Ready`, write `configure` in the terminal to set:
|
||||
Also, you can use `show running-config` to display the current RU configuration.
|
||||
|
||||
Once the RU is PTP synced, and RF state and DPD are `Ready`, write `configure terminal` to set:
|
||||
- Center frequency
|
||||
- Bandwidth
|
||||
- Compression Bitwidth
|
||||
- TX/RX attenuation
|
||||
|
||||
To configure 4TX and 4RX antennas, you have to repeat the below steps after every reboot, so don't restart the RU after entering below commands:
|
||||
|
||||
After each reboot, the PRACH has to be manually configured.
|
||||
To do so, please login to RU as user `root` and run below commands:
|
||||
```bash
|
||||
devmem 0x80001014 32 0x00050004
|
||||
devmem 0x80001018 32 0x00070006
|
||||
devmem 0x8000201C 32 0x00000001
|
||||
```
|
||||
|
||||
If you want to set MTU size to 9000 then use the below command:
|
||||
|
||||
If you have RU version that supports jumbo frames, please enable it as:
|
||||
```bash
|
||||
devmem 0x8000200C 32 0x00000001
|
||||
```
|
||||
|
||||
### VVDN LPRU
|
||||
|
||||
**Version 3.x**
|
||||
|
||||
The OAI configuration file [`gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf) corresponds to:
|
||||
- TDD pattern `DDDSU`, 2.5ms
|
||||
- Bandwidth 100MHz
|
||||
- MTU 9216 (this is the maximum we can configure on our switch)
|
||||
- The OAI configuration file [`gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf) corresponds to below RU configuration.
|
||||
- MTU 9600
|
||||
|
||||
#### RU configuration
|
||||
|
||||
Check in the RU user manual how to configure the center frequency. There are multiple ways to do it. We set the center frequency by editing `sysrepocfg` database. You can use `sysrepocfg --edit=vi -d running` to do the same. You can edit the `startup` database to make the center frequency change persistent.
|
||||
|
||||
@@ -604,76 +621,140 @@ Execute the below commands on every restart
|
||||
```bash
|
||||
xml_parser 4x4-config.xml
|
||||
## To enable prach compression
|
||||
mw.l a0010024 1919
|
||||
mw.l a0010024 1919 # format `<PRACH-comp-method><PRACH-compr-value><PUSCH-comp-method><PUSCH-compr-value>
|
||||
## This will show the current configuration
|
||||
/etc/scripts/lpru_configuration.sh
|
||||
## Edit the sysrepo to ACTIVATE the carrier when you want to use the RU
|
||||
## option 1 - activation by writing directly in register
|
||||
mw.l a0050010 <YOUR-RU-VLAN>3 # e.g. VLAN = 4 => `mw.l a0050010 43`
|
||||
## option 2 - activation via sysrepocfg command
|
||||
sysrepocfg --edit=vi -d running
|
||||
```
|
||||
|
||||
### Metanoia RU
|
||||
|
||||
**Version 2.0.6**
|
||||
|
||||
The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf) corresponds to:
|
||||
- TDD pattern `DDDSU`, 2.5ms (`DDDDDDDSUU`, 5ms, also supported)
|
||||
- Bandwidth 100MHz
|
||||
- 4TX4R
|
||||
|
||||
The RU configuration is stored in `/etc/rumanager.conf`. The required modifications:
|
||||
1. `processing_element/vlan_id`
|
||||
2. `processing_element/du_mac_address`
|
||||
3. `low_level_tx_endpoint/compression_type` -> `STATIC`
|
||||
4. `low_level_rx_endpoint/compression_type` -> `STATIC`
|
||||
5. `low_level_rx_endpoint/compression/fs-offset` -> `8`
|
||||
6. `center-of-channel-bandwidth` -> `3750000000`
|
||||
7. `tx_gain_correction` -> tested with `6020` (please be careful to not fry the RU)
|
||||
8. `rx_gain_correction` -> tested with `-903` (please be careful to not fry the RU)
|
||||
|
||||
At this stage, RU must be rebooted so the changes apply.
|
||||
|
||||
## Configure Network Interfaces and DPDK VFs
|
||||
|
||||
The 7.2 fronthaul uses the xran library, which requires DPDK. In this step, we
|
||||
need to configure network interfaces to send data to the RU, and configure DPDK
|
||||
to bind to the corresponding PCI interfaces. More specifically, in the
|
||||
following we use [SR-IOV](https://en.wikipedia.org/wiki/Single-root_input/output_virtualization)
|
||||
to create multiple virtual functions (VFs) through which Control plane (C
|
||||
to create one or multiple virtual functions (VFs) through which Control plane (C
|
||||
plane) and User plane (U plane) traffic will flow. The following commands are
|
||||
not persistant, and have to be repeated after reboot.
|
||||
|
||||
In the following, we will use these short hands:
|
||||
|
||||
- `physical-interface`: Physical network interface through which you can access the RU
|
||||
- `vlan`: VLAN tags as defined in the RU configuration
|
||||
- `mtu`: the MTU as specified by the RU vendor, and supported by the NIC
|
||||
- `du-c-plane-mac-addr`: DU C plane MAC address
|
||||
- `pci-address-c-plane-vf`: PCI bus address of the VF for C plane
|
||||
- `du-u-plane-mac-addr`: DU U plane MAC address
|
||||
- `pci-address-u-plane-vf`: PCI bus address of the VF for U plane
|
||||
- `IF_NAME`: Physical network interface through which you can access the RU
|
||||
- `VLAN`: the VLAN tag as recommended by the RU vendor
|
||||
- `MTU`: the MTU as specified by the RU vendor, and supported by the NIC
|
||||
- `DU_U_PLANE_MAC_ADD`: DU U plane MAC address
|
||||
- `U_PLANE_PCI_BUS_ADD`: PCI bus address of the VF for U plane
|
||||
- `DU_C_PLANE_MAC_ADD`: DU C plane MAC address
|
||||
- `C_PLANE_PCI_BUS_ADD`: PCI bus address of the VF for C plane
|
||||
|
||||
In the configuration file, in option `fhi_72.dpdk_devices`, the first PCI address is for U-plane and the second for C-plane.
|
||||
|
||||
For both the MAC addresses, you might use the MAC addresses which are
|
||||
pre-configured in the RUs (typically `00:11:22:33:44:66`, but that is not
|
||||
always the case). Note that if your system has Intel E-810 NIC cards/ICE
|
||||
driver, you have to choose different MAC addresses (valid for above-mentioned
|
||||
kernels). If the RU vendor requires untagged traffic, remove the VLAN tagging
|
||||
RU might support either one DU MAC address for both CU planes or two different.
|
||||
i.e. VVDN Gen3, Metanoia support only one, Benetel550 supports both cases
|
||||
|
||||
|
||||
**Note**
|
||||
|
||||
- X710 NIC supports the same DU MAC address for multiple VFs
|
||||
- E-810 NIC requires different DU MAC addresses for multiple VFs
|
||||
|
||||
If the RU vendor requires untagged traffic, remove the VLAN tagging
|
||||
in the below command and configure VLAN on the switch as "access VLAN". In case
|
||||
the MTU is different than 1500, you have to update the MTU on the switch
|
||||
interface as well.
|
||||
|
||||
First, set maximum ring buffers:
|
||||
### Set maximum ring buffers:
|
||||
|
||||
As a first step, please set up the maximum allowed buffer size to your desired interface. To check the maximum value, please execute the following command:
|
||||
```bash
|
||||
sudo ethtool -g <physical-interface>
|
||||
sudo ethtool -G <physical-interface> rx 4096 # assumes 4096 is max
|
||||
sudo ethtool -G <physical-interface> tx 4096 # assumes 4096 is max
|
||||
sudo ethtool -g $IF_NAME
|
||||
```
|
||||
|
||||
Set the maximum MTU in the physical interface:
|
||||
```bash
|
||||
sudo ifconfig <physical-interface> mtu <mtu>
|
||||
set -x
|
||||
IF_NAME=<YOUR_PHYSICAL_INTERFACE_NAME>
|
||||
MAX_RING_BUFFER_SIZE=<YOUR_PHYSICAL_INTERFACE_MAX_BUFFER_SIZE>
|
||||
|
||||
sudo ethtool -G $IF_NAME rx $MAX_RING_BUFFER_SIZE tx $MAX_RING_BUFFER_SIZE
|
||||
```
|
||||
|
||||
(Re-)create two VFs, load the Linux "Base Driver for Intel Ethernet Adaptive
|
||||
Virtual Function" (in case you use Intel ethernet card), and set up the VFs.
|
||||
### Set the maximum MTU in the physical interface:
|
||||
```bash
|
||||
set -x
|
||||
IF_NAME=<YOUR_PHYSICAL_INTERFACE_NAME>
|
||||
MTU=<RU_MTU>
|
||||
|
||||
sudo ip link set $IF_NAME mtu $MTU
|
||||
```
|
||||
|
||||
### (Re-)create VF(s)
|
||||
|
||||
#### one VF
|
||||
|
||||
```bash
|
||||
set -x
|
||||
IF_NAME=<YOUR_PHYSICAL_INTERFACE_NAME>
|
||||
DU_CU_PLANE_MAC_ADD=<YOUR_DU_CU_PLANE_MAC_ADDRESS>
|
||||
VLAN=<RU_VLAN>
|
||||
MTU=<RU_MTU>
|
||||
|
||||
sudo modprobe iavf
|
||||
sudo sh -c echo "0" > /sys/class/net/<physical-interface>/device/sriov_numvfs
|
||||
sudo sh -c echo "2" > /sys/class/net/<physical-interface>/device/sriov_numvfs
|
||||
sudo ip link set <physical-interface> vf 0 mac <du-c-plane-mac-addr> vlan <vlan> mtu <mtu> spoofchk off
|
||||
sudo ip link set <physical-interface> vf 1 mac <du-u-plane-mac-addr> vlan <vlan> mtu <mtu> spoofchk off
|
||||
sudo sh -c 'echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
|
||||
sudo sh -c 'echo 1 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
|
||||
sudo ip link set $IF_NAME vf 0 mac $DU_CU_PLANE_MAC_ADD vlan $VLAN mtu $MTU spoofchk off # set CU planes PCI address
|
||||
```
|
||||
|
||||
After running the above commands, the kernel created virtual functions that
|
||||
#### two VFs
|
||||
|
||||
```bash
|
||||
set -x
|
||||
IF_NAME=<YOUR_PHYSICAL_INTERFACE_NAME>
|
||||
DU_U_PLANE_MAC_ADD=<YOUR_DU_U_PLANE_MAC_ADDRESS>
|
||||
DU_C_PLANE_MAC_ADD=<YOUR_DU_C_PLANE_MAC_ADDRESS> # can be same as for U plane -> depends if the NIC supports the same MAC address
|
||||
VLAN=<RU_VLAN>
|
||||
MTU=<RU_MTU>
|
||||
|
||||
sudo modprobe iavf
|
||||
sudo sh -c 'echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
|
||||
sudo sh -c 'echo 2 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
|
||||
sudo ip link set $IF_NAME vf 0 mac $DU_U_PLANE_MAC_ADD vlan $VLAN mtu $MTU spoofchk off # set U plane PCI address
|
||||
sudo ip link set $IF_NAME vf 1 mac $DU_C_PLANE_MAC_ADD vlan $VLAN mtu $MTU spoofchk off # set C plane PCI address
|
||||
```
|
||||
|
||||
After running the above commands, the kernel created VF(s) that
|
||||
have been assigned a PCI address under the same device and vendor ID. For
|
||||
instance, use `sudo lshw -c network -businfo` to get a list of PCI addresses
|
||||
and interface names, locate the PCI address of `<physical-interface>`, then use
|
||||
and interface names, locate the PCI address of `$IF_NAME`, then use
|
||||
`lspci | grep Virtual` to get all virtual interfaces and use the ones with the
|
||||
same Device/Vendor ID parts (first two numbers).
|
||||
|
||||
<details>
|
||||
<summary>Example</summary>
|
||||
<summary>Example with two VFs</summary>
|
||||
|
||||
The machine in this example has an Intel X710 card. The interface
|
||||
<physical-interface> in question is `eno12409`. Running `lshw` gives:
|
||||
@@ -706,41 +787,68 @@ The hardware card `31:00.1` has two associated virtual functions `31:06.0` and
|
||||
`31:06.1`.
|
||||
</details>
|
||||
|
||||
### Bind VF(s)
|
||||
|
||||
Now, unbind any pre-existing DPDK devices, load the "Virtual Function I/O"
|
||||
driver `vfio_pci`, and bind DPDK to these devices:
|
||||
driver `vfio_pci` or `mlx5_core`, and bind DPDK to these devices.
|
||||
|
||||
```
|
||||
sudo /usr/local/bin/dpdk-devbind.py --unbind <pci-address-c-plane-vf>
|
||||
sudo /usr/local/bin/dpdk-devbind.py --unbind <pci-address-u-plane-vf>
|
||||
sudo modprobe vfio_pci
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci <pci-address-c-plane-vf>
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci <pci-address-u-plane-vf>
|
||||
#### Bind one VF
|
||||
|
||||
```bash
|
||||
set -x
|
||||
CU_PLANE_PCI_BUS_ADD=<YOUR_CU_PLANE_PCI_BUS_ADDRESS>
|
||||
DRIVER=<YOUR_DRIVER> # set to `vfio_pci` or `mlx5_core`, depending on your NIC
|
||||
|
||||
sudo /usr/local/bin/dpdk-devbind.py --unbind $CU_PLANE_PCI_BUS_ADD
|
||||
sudo modprobe $DRIVER
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind $DRIVER $CU_PLANE_PCI_BUS_ADD
|
||||
```
|
||||
|
||||
We recommand to put the above commands into a script file to quickly repeat them.
|
||||
#### Bind two VFs
|
||||
|
||||
```bash
|
||||
set -x
|
||||
U_PLANE_PCI_BUS_ADD=<YOUR_U_PLANE_PCI_BUS_ADDRESS>
|
||||
C_PLANE_PCI_BUS_ADD=<YOUR_C_PLANE_PCI_BUS_ADDRESS>
|
||||
DRIVER=<YOUR_DRIVER> # set to `vfio_pci` or `mlx5_core`, depending on your NIC
|
||||
|
||||
sudo /usr/local/bin/dpdk-devbind.py --unbind $U_PLANE_PCI_BUS_ADD
|
||||
sudo /usr/local/bin/dpdk-devbind.py --unbind $C_PLANE_PCI_BUS_ADD
|
||||
sudo modprobe $DRIVER
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind $DRIVER $U_PLANE_PCI_BUS_ADD
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind $DRIVER $C_PLANE_PCI_BUS_ADD
|
||||
```
|
||||
|
||||
We recommand to put the above four steps into one script file to quickly repeat them.
|
||||
|
||||
<details>
|
||||
<summary>Example script for Benetel 550-A/650 with Intel X710 on host</summary>
|
||||
<summary>Example script for Benetel 550-A/650 with Intel X710 on host with two VFs</summary>
|
||||
|
||||
```console
|
||||
```bash
|
||||
set -x
|
||||
IF_NAME=eno12409
|
||||
MAX_RING_BUFFER_SIZE=4096
|
||||
MTU=9600
|
||||
DU_U_PLANE_MAC_ADD=00:11:22:33:44:66
|
||||
DU_C_PLANE_MAC_ADD=00:11:22:33:44:67
|
||||
VLAN=3
|
||||
U_PLANE_PCI_BUS_ADD=31:06.0
|
||||
C_PLANE_PCI_BUS_ADD=31:06.1
|
||||
DRIVER=vfio_pci
|
||||
|
||||
sudo ethtool -G eno12409 rx 4096
|
||||
sudo ethtool -G eno12409 tx 4096
|
||||
sudo ifconfig eno12409 mtu 9216
|
||||
|
||||
sudo modprobe -r iavf
|
||||
sudo ethtool -G $IF_NAME rx $MAX_RING_BUFFER_SIZE tx $MAX_RING_BUFFER_SIZE
|
||||
sudo ip link set $IF_NAME mtu $MTU
|
||||
sudo modprobe iavf
|
||||
sudo sh -c 'echo 0 > /sys/class/net/eno12409/device/sriov_numvfs'
|
||||
sudo sh -c 'echo 2 > /sys/class/net/eno12409/device/sriov_numvfs'
|
||||
sudo ip link set eno12409 vf 0 mac 00:11:22:33:44:66 vlan 3 qos 0 spoofchk off mtu 9216
|
||||
sudo ip link set eno12409 vf 1 mac 00:11:22:33:44:67 vlan 3 qos 0 spoofchk off mtu 9216
|
||||
|
||||
sudo /usr/local/bin/dpdk-devbind.py --unbind 31:06.0
|
||||
sudo /usr/local/bin/dpdk-devbind.py --unbind 31:06.1
|
||||
sudo modprobe vfio-pci
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci 31:06.0
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci 31:06.1
|
||||
sudo sh -c 'echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
|
||||
sudo sh -c 'echo 2 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
|
||||
sudo ip link set $IF_NAME vf 0 mac $DU_U_PLANE_MAC_ADD vlan $VLAN mtu $MTU spoofchk off # set U plane PCI address
|
||||
sudo ip link set $IF_NAME vf 1 mac $DU_C_PLANE_MAC_ADD vlan $VLAN mtu $MTU spoofchk off # set C plane PCI address
|
||||
sleep 1
|
||||
sudo /usr/local/bin/dpdk-devbind.py --unbind $U_PLANE_PCI_BUS_ADD
|
||||
sudo /usr/local/bin/dpdk-devbind.py --unbind $C_PLANE_PCI_BUS_ADD
|
||||
sudo modprobe $DRIVER
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind $DRIVER $U_PLANE_PCI_BUS_ADD
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind $DRIVER $C_PLANE_PCI_BUS_ADD
|
||||
```
|
||||
</details>
|
||||
|
||||
@@ -751,9 +859,19 @@ sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci 31:06.1
|
||||
**Beware in the following section to let in the range of isolated cores the parameters that should be (i.e. `L1s.L1_rx_thread_core`, `L1s.L1_tx_thread_core`, `RUs.ru_thread_core`, `fhi_72.io_core` and `fhi_72.worker_cores`)**
|
||||
|
||||
Sample configuration files for OAI gNB, specific to the manufacturer of the radio unit, are available at:
|
||||
1. LITE-ON RU: [`gnb.sa.band78.273prb.fhi72.4x4-liteon.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf) (band n78, 273 PRBs, 3.5GHz center freq, 4x4 antenna configuration with 9 bit I/Q samples (compressed) for PUSCH/PDSCH/PRACH, 2-layer DL MIMO, UL SISO)
|
||||
2. Benetel 650 RU: [`gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel650.conf) (band n78, 273 PRBs, 3.5GHz center freq, 4x2 antenna configuration with 9 bit I/Q samples (compressed) for PUSCH/PDSCH/PRACH, 2-layer DL MIMO, UL SISO)
|
||||
3. VVDN RU: [`gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf) (band n77, 273 PRBs, 4.0GHz center freq, 4x4 antenna configuration with 9 bit I/Q samples (compressed) for PUSCH/PDSCH/PRACH, 2-layer DL MIMO, UL SISO)
|
||||
1. LITEON RU:
|
||||
[`gnb.sa.band78.273prb.fhi72.4x4-liteon.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf)
|
||||
2. VVDN RU:
|
||||
[`gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf)
|
||||
[`gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf)
|
||||
[`gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf)
|
||||
3. Benetel 650 RU:
|
||||
[`gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf)
|
||||
4. Benetel 550 RU:
|
||||
[`gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf)
|
||||
[`gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf)
|
||||
5. Metanoia RU:
|
||||
[`gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf)
|
||||
|
||||
Edit the sample OAI gNB configuration file and check following parameters:
|
||||
|
||||
@@ -778,16 +896,15 @@ Edit the sample OAI gNB configuration file and check following parameters:
|
||||
* `fhi_72` (FrontHaul Interface) section: this config follows the structure
|
||||
that is employed by the xRAN library (`xran_fh_init` and `xran_fh_config`
|
||||
structs in the code):
|
||||
* `dpdk_devices`: PCI addresses of NIC VFs binded to the DPDK (not the physical NIC but the VFs, use `lspci | grep Virtual`)
|
||||
* `dpdk_devices`: PCI addresses of NIC VFs binded to the DPDK (not the physical NIC but the VFs, use `lspci | grep Virtual`) in the format `{VF-U-plane, VF-C-plane}`;
|
||||
if one VF used per RU, U and C planes will share the same VF => depends on the RU capabilities
|
||||
* `system_core`: absolute CPU core ID for DPDK control threads, it should be an isolated core, in our environment we are using CPU 0
|
||||
(`rte_mp_handle`, `eal-intr-thread`, `iavf-event-thread`)
|
||||
* `io_core`: absolute CPU core ID for XRAN library, it should be an isolated core, in our environment we are using CPU 4
|
||||
* `worker_cores`: array of absolute CPU core IDs for XRAN library, they should be isolated cores, in our environment we are using CPU 2
|
||||
* `du_addr`: DU C- and U-plane MAC-addresses (format `UU:VV:WW:XX:YY:ZZ`,
|
||||
hexadecimal numbers)
|
||||
* `ru_addr`: RU C- and U-plane MAC-addresses (format `UU:VV:WW:XX:YY:ZZ`,
|
||||
hexadecimal numbers)
|
||||
* `mtu`: Maximum Transmission Unit for the RU, specified by RU vendor
|
||||
* `ru_addr`: RU U- and C-plane MAC-addresses (format `UU:VV:WW:XX:YY:ZZ`, hexadecimal numbers)
|
||||
* `mtu`: Maximum Transmission Unit for the RU, specified by RU vendor; either 1500 or 9600 B (Jumbo Frames); if not set, 1500 is used
|
||||
* `file_prefix` : used to specify a unique prefix for shared memory and files created by multiple DPDK processes; if not set, default value of `wls_0` is used
|
||||
* `dpdk_mem_size`: the huge page size that should be pre-allocated by DPDK
|
||||
_for NUMA node 0_; by default, this is 8192 MiB (corresponding to 8 huge
|
||||
pages à 1024 MiB each, see above). In the current implementation, you
|
||||
@@ -804,17 +921,19 @@ Edit the sample OAI gNB configuration file and check following parameters:
|
||||
* `iq_width_prach`: Width of PRACH IQ samples: if 16, no compression, if <16, applies
|
||||
compression
|
||||
* `prach_config`: PRACH-specific configuration
|
||||
* `eAxC_offset`: PRACH antenna offset
|
||||
* `eAxC_offset`: PRACH antenna offset; if not set, default value of `N = max(Nrx,Ntx)` is used
|
||||
* `kbar`: the PRACH guard interval, provided in RU
|
||||
|
||||
Layer mapping (eAxC offsets) happens as follows:
|
||||
- For PUSCH/PDSCH, the layers are mapped to `[0,1,...,N-1]` where `N` is the
|
||||
- For PUSCH/PDSCH, the layers are mapped to `[0,1,...,Nrx-1]/[0,1,...,Ntx-1]` where `Nrx/Ntx` is the
|
||||
respective RX/TX number of antennas.
|
||||
- For PRACH, the layers are mapped to `[No,No+1,...No+N-1]` where No is the
|
||||
`fhi_72.fh_config.[0].prach_config.eAxC_offset` and `N` the number of receive
|
||||
antennas.
|
||||
- For PRACH, the layers are mapped to `[No,No+1,...No+Nrx-1]` where `No` is the
|
||||
`fhi_72.fh_config.[0].prach_config.eAxC_offset`. Please be aware that the following equation must be fullfilled: `No >= max(Nrx,Ntx)`.
|
||||
|
||||
xRAN SRS reception is not supported.
|
||||
**Note**
|
||||
|
||||
- At the moment, OAI is compatible with CAT A O-RU only. Therefore, SRS is not supported.
|
||||
- XRAN retreives DU MAC address with `rte_eth_macaddr_get()` function. Hence, `fhi_72.du_addr` parameter is not taken into account.
|
||||
|
||||
# Start and Operation of OAI gNB
|
||||
|
||||
@@ -920,7 +1039,7 @@ Some caveats:
|
||||
|
||||
For two RUs each using a 4x4 configuration, make sure to configure the 8x8
|
||||
configuration, i.e., set `nb_tx` and `nb_rx` under `RUs` to 8 each (NOT two
|
||||
RUs!). Also, set the antenna port information as listed above, i.e.,
|
||||
`RUs`!). Also, set the antenna port information as listed above, i.e.,
|
||||
|
||||
```
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
@@ -934,11 +1053,10 @@ Next, configure the `fhi_72` section as indicated below:
|
||||
|
||||
```
|
||||
fhi_72 = {
|
||||
dpdk_devices = ("ru1_up_vf_pci", "ru1_cp_vf_pci", "ru2_up_vf_pci", "ru2_cp_vf_pci");
|
||||
dpdk_devices = ("ru1_up_vf_pci", "ru1_cp_vf_pci", "ru2_up_vf_pci", "ru2_cp_vf_pci"); # two VFs can be used as well
|
||||
// core config as always
|
||||
du_addr = ("du_ru1_up_mac_addr", "du_ru1_cp_mac_addr", "du_ru2_up_mac_addr", "du_ru2_cp_mac_addr");
|
||||
ru_addr = ("ru1_up_mac_addr", "ru1_cp_mac_addr", "ru2_up_mac_addr", "ru2_cp_mac_addr");
|
||||
// mtu, file_prefix ...
|
||||
ru_addr = ("ru1_up_mac_addr", "ru1_cp_mac_addr", "ru2_up_mac_addr", "ru2_cp_mac_addr"); # if two VFs, set two RU MAC addresses (one per RU)
|
||||
// mtu
|
||||
fh_config = (
|
||||
{
|
||||
// timing, ru_config, prach_config of RU1
|
||||
@@ -950,12 +1068,12 @@ fhi_72 = {
|
||||
};
|
||||
```
|
||||
|
||||
i.e., for `dpdk_devices`, `du_addr`, and `ru_addr` is configured for
|
||||
i.e., for `dpdk_devices`, and `ru_addr` is configured for
|
||||
both RUs in a (flat) array, and the individual radio configuration is given for
|
||||
each RU individually inside the `fh_config`.
|
||||
|
||||
<details>
|
||||
<summary>Sample FHI 7.2 configuration for two RUs (Benetel 550 and 650)</summary>
|
||||
<summary>Sample FHI 7.2 configuration for two RUs (2 x Benetel 650)</summary>
|
||||
|
||||
```
|
||||
fhi_72 = {
|
||||
@@ -963,12 +1081,10 @@ fhi_72 = {
|
||||
system_core = 0;
|
||||
io_core = 1;
|
||||
worker_cores = (2);
|
||||
du_addr = ("00:11:22:33:44:66","00:11:22:33:44:67","00:11:22:33:44:66","00:11:22:33:44:67");
|
||||
ru_addr = ("70:b3:d5:e1:5b:ff","70:b3:d5:e1:5b:ff","70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81");
|
||||
mtu = 9216;
|
||||
file_prefix = "fhi_72";
|
||||
ru_addr = ("8c:1f:64:d1:10:46","8c:1f:64:d1:10:46","8c:1f:64:d1:10:43","8c:1f:64:d1:10:43")
|
||||
mtu = 9600;
|
||||
fh_config = (
|
||||
# RAN650
|
||||
# RAN650 #1
|
||||
{
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (259, 500);
|
||||
@@ -983,11 +1099,8 @@ fhi_72 = {
|
||||
iq_width = 9;
|
||||
iq_width_prach = 9;
|
||||
};
|
||||
prach_config = {
|
||||
eAxC_offset = 4;
|
||||
};
|
||||
},
|
||||
# RAN550
|
||||
# RAN650 #2
|
||||
{
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (259, 500);
|
||||
@@ -1002,38 +1115,35 @@ fhi_72 = {
|
||||
iq_width = 9;
|
||||
iq_width_prach = 9;
|
||||
};
|
||||
prach_config = {
|
||||
eAxC_offset = 4;
|
||||
};
|
||||
});
|
||||
```
|
||||
</details>
|
||||
|
||||
Compare also with the example (DU) configuration in
|
||||
[`gnb-du.sa.band78.106prb.fhi72.8x8-benetel-650-550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band78.106prb.fhi72.8x8-benetel-650-550.conf).
|
||||
[`gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf).
|
||||
|
||||
Afterwards, start the gNB with the modified configuration file. If everything
|
||||
went well, you should see the RU counters for both RUs go up:
|
||||
|
||||
```
|
||||
[NR_PHY] [o-du 0][rx 614400 pps 61440 kbps 844953][tx 1275076 pps 127488 kbps 1998585][Total Msgs_Rcvd 614400]
|
||||
[NR_PHY] [o_du0][pusch0 107520 prach0 46080]
|
||||
[NR_PHY] [o_du0][pusch1 107520 prach1 46080]
|
||||
[NR_PHY] [o_du0][pusch2 107520 prach2 46080]
|
||||
[NR_PHY] [o_du0][pusch3 107520 prach3 46080]
|
||||
[NR_PHY] [o-du 1][rx 614400 pps 61440 kbps 844953][tx 1275076 pps 127488 kbps 1998585][Total Msgs_Rcvd 614400]
|
||||
[NR_PHY] [o_du1][pusch0 107520 prach0 46080]
|
||||
[NR_PHY] [o_du1][pusch1 107520 prach1 46080]
|
||||
[NR_PHY] [o_du1][pusch2 107520 prach2 46080]
|
||||
[NR_PHY] [o_du1][pusch3 107520 prach3 46080]
|
||||
[NR_PHY] [o-du 0][rx 63488 pps 63264 kbps 2759808][tx 127684 pps 127116 kbps 4717971][Total Msgs_Rcvd 63488]
|
||||
[NR_PHY] [o_du0][pusch0 14336 prach0 1536]
|
||||
[NR_PHY] [o_du0][pusch1 14336 prach1 1536]
|
||||
[NR_PHY] [o_du0][pusch2 14336 prach2 1536]
|
||||
[NR_PHY] [o_du0][pusch3 14336 prach3 1536]
|
||||
[NR_PHY] [o-du 1][rx 63544 pps 63320 kbps 2763240][tx 127684 pps 127116 kbps 4717971][Total Msgs_Rcvd 63544]
|
||||
[NR_PHY] [o_du1][pusch0 14350 prach0 1536]
|
||||
[NR_PHY] [o_du1][pusch1 14350 prach1 1536]
|
||||
[NR_PHY] [o_du1][pusch2 14350 prach2 1536]
|
||||
[NR_PHY] [o_du1][pusch3 14350 prach3 1536]
|
||||
```
|
||||
|
||||
You can also verify that there is signal on all RX antennas like so:
|
||||
```bash
|
||||
$ cat nrL1_stats.log
|
||||
[...]
|
||||
max_IO = 66 (81), min_I0 = 0 (53), avg_I0 = 51 dB(46.48.45.46.51.56.55.45.)
|
||||
PRACH I0 = 38.0 dB
|
||||
max_IO = 55 (85), min_I0 = 0 (136), avg_I0 = 44 dB(43.44.43.45.44.43.43.45.)
|
||||
PRACH I0 = 30.6 dB
|
||||
```
|
||||
|
||||
Note the eight entries after `avg_IO`.
|
||||
@@ -1049,7 +1159,7 @@ Your email should contain below information:
|
||||
- A clear subject in your email.
|
||||
- For all the queries there should be [Query\] in the subject of the email and for problems there should be [Problem\].
|
||||
- In case of a problem, add a small description.
|
||||
- Do not share any photos unless you want to share a diagram.
|
||||
- Do not share any screenshots/photos unless you want to share a diagram.
|
||||
- OAI gNB/DU/CU/CU-CP/CU-UP configuration file in `.conf` format only.
|
||||
- Logs of OAI gNB/DU/CU/CU-CP/CU-UP in `.log` or `.txt` format only.
|
||||
- RU Vendor and Version.
|
||||
|
||||
@@ -128,6 +128,9 @@ information on how the images are built.
|
||||
- [OAI-CN5G-COTS-UE-Test](https://jenkins-oai.eurecom.fr/job/OAI-CN5G-COTS-UE-Test/)
|
||||
~5G-NR
|
||||
- using 5GC bench (resources `CI-Cetautomatix-OC-oaicicd-session`, `CI-Dogmatix-CN5G-gNB`): Attach/Detach of UE with multiple PDU sessions
|
||||
- [OAI-FLEXRIC-RAN-Integration-Test](https://jenkins-oai.eurecom.fr/job/OAI-FLEXRIC-RAN-Integration-Test/) ~5G-NR
|
||||
- selfix (gNB, nrUE, OAI 5GC, FlexRIC)
|
||||
- uses RFsimulator, tests FlexRIC/E2 interface and xApps
|
||||
- [RAN-gNB-N300-Timing-Phytest-LDPC](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-gNB-N300-Timing-Phytest-LDPC/)
|
||||
~5G-NR
|
||||
- caracal + N310
|
||||
|
||||
+52
-54
@@ -21,66 +21,13 @@
|
||||
|
||||
|
||||
#define _GNU_SOURCE /* See feature_test_macros(7) */
|
||||
#include <sched.h>
|
||||
|
||||
|
||||
#include "T.h"
|
||||
|
||||
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||
#include <common/utils/assertions.h>
|
||||
#include "common/oai_version.h"
|
||||
|
||||
#include "PHY/types.h"
|
||||
#include "common/ran_context.h"
|
||||
|
||||
#include "PHY/defs_gNB.h"
|
||||
#include "PHY/defs_common.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "common/utils/load_module_shlib.h"
|
||||
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||
|
||||
#include "radio/COMMON/common_lib.h"
|
||||
#include "radio/ETHERNET/if_defs.h"
|
||||
|
||||
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||
|
||||
#include "PHY/phy_vars.h"
|
||||
#include "RRC/LTE/rrc_vars.h"
|
||||
#include "PHY_INTERFACE/phy_interface_vars.h"
|
||||
#include "gnb_config.h"
|
||||
#include "SIMULATION/TOOLS/sim.h"
|
||||
|
||||
#ifdef SMBV
|
||||
#include "PHY/TOOLS/smbv.h"
|
||||
unsigned short config_frames[4] = {2,9,11,13};
|
||||
#endif
|
||||
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
#include "LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
|
||||
|
||||
#include "intertask_interface.h"
|
||||
|
||||
#include "PHY/INIT/nr_phy_init.h"
|
||||
|
||||
#include "system.h"
|
||||
#include <openair2/GNB_APP/gnb_app.h>
|
||||
#include "PHY/TOOLS/phy_scope_interface.h"
|
||||
#include "PHY/TOOLS/nr_phy_scope.h"
|
||||
#include "nr-softmodem.h"
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "executables/thread-common.h"
|
||||
#include "NB_IoT_interface.h"
|
||||
#include "x2ap_eNB.h"
|
||||
#include "ngap_gNB.h"
|
||||
#include "gnb_paramdef.h"
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
#include "nfapi/oai_integration/vendor_ext.h"
|
||||
#include "gnb_config.h"
|
||||
#include "openair2/E1AP/e1ap_common.h"
|
||||
#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||
#ifdef ENABLE_AERIAL
|
||||
#include "nfapi/oai_integration/aerial/fapi_nvIPC.h"
|
||||
#endif
|
||||
@@ -88,6 +35,58 @@ unsigned short config_frames[4] = {2,9,11,13};
|
||||
#include "openair2/E2AP/flexric/src/agent/e2_agent_api.h"
|
||||
#include "openair2/E2AP/RAN_FUNCTION/init_ran_func.h"
|
||||
#endif
|
||||
#include "nr-softmodem.h"
|
||||
#include <common/utils/assertions.h>
|
||||
#include <openair2/GNB_APP/gnb_app.h>
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
#include <pthread.h>
|
||||
#include <sched.h>
|
||||
#include <simple_executable.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
|
||||
#include "NR_MAC_COMMON/nr_mac_extern.h"
|
||||
#include "NR_PHY_INTERFACE/NR_IF_Module.h"
|
||||
#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||
#include "PHY/INIT/nr_phy_init.h"
|
||||
#include "PHY/TOOLS/phy_scope_interface.h"
|
||||
#include "PHY/defs_common.h"
|
||||
#include "PHY/defs_gNB.h"
|
||||
#include "PHY/defs_nr_common.h"
|
||||
#include "PHY/phy_vars.h"
|
||||
#include "RRC/NR/nr_rrc_defs.h"
|
||||
#include "RRC/NR/nr_rrc_proto.h"
|
||||
#include "RRC_nr_paramsvalues.h"
|
||||
#include "SIMULATION/TOOLS/sim.h"
|
||||
#include "T.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "common/ngran_types.h"
|
||||
#include "common/oai_version.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "e1ap_messages_types.h"
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "gnb_config.h"
|
||||
#include "gnb_paramdef.h"
|
||||
#include "intertask_interface.h"
|
||||
#include "nfapi/oai_integration/vendor_ext.h"
|
||||
#include "nfapi_interface.h"
|
||||
#include "nfapi_nr_interface_scf.h"
|
||||
#include "ngap_gNB.h"
|
||||
#include "nr-softmodem-common.h"
|
||||
#include "openair2/E1AP/e1ap_common.h"
|
||||
#include "pdcp.h"
|
||||
#include "radio/COMMON/common_lib.h"
|
||||
#include "s1ap_eNB.h"
|
||||
#include "sctp_eNB_task.h"
|
||||
#include "softmodem-bits.h"
|
||||
#include "system.h"
|
||||
#include "time_meas.h"
|
||||
#include "utils.h"
|
||||
#include "x2ap_eNB.h"
|
||||
|
||||
pthread_cond_t nfapi_sync_cond;
|
||||
pthread_mutex_t nfapi_sync_mutex;
|
||||
@@ -424,7 +423,6 @@ void init_pdcp(void) {
|
||||
}
|
||||
|
||||
#ifdef E2_AGENT
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h" // need to get info from MAC
|
||||
static void initialize_agent(ngran_node_t node_type, e2_agent_args_t oai_args)
|
||||
{
|
||||
AssertFatal(oai_args.sm_dir != NULL , "Please, specify the directory where the SMs are located in the config file, i.e., add in config file the next line: e2_agent = {near_ric_ip_addr = \"127.0.0.1\"; sm_dir = \"/usr/local/lib/flexric/\");} ");
|
||||
|
||||
+17
-3
@@ -594,7 +594,11 @@ void processSlotTX(void *arg)
|
||||
RU_write(rxtxD, sl_tx_action);
|
||||
}
|
||||
|
||||
static int UE_dl_preprocessing(PHY_VARS_NR_UE *UE, const UE_nr_rxtx_proc_t *proc, int *tx_wait_for_dlsch, nr_phy_data_t *phy_data)
|
||||
static int UE_dl_preprocessing(PHY_VARS_NR_UE *UE,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
int *tx_wait_for_dlsch,
|
||||
nr_phy_data_t *phy_data,
|
||||
bool *stats_printed)
|
||||
{
|
||||
int sampleShift = INT_MAX;
|
||||
NR_DL_FRAME_PARMS *fp = &UE->frame_parms;
|
||||
@@ -602,7 +606,6 @@ static int UE_dl_preprocessing(PHY_VARS_NR_UE *UE, const UE_nr_rxtx_proc_t *proc
|
||||
fp = &UE->SL_UE_PHY_PARAMS.sl_frame_params;
|
||||
|
||||
if (IS_SOFTMODEM_NOS1 || IS_SA_MODE(get_softmodem_params())) {
|
||||
|
||||
// Start synchronization with a target gNB
|
||||
if (UE->synch_request.received_synch_request == 1) {
|
||||
fapi_nr_synch_request_t *synch_req = &UE->synch_request.synch_req;
|
||||
@@ -655,6 +658,16 @@ static int UE_dl_preprocessing(PHY_VARS_NR_UE *UE, const UE_nr_rxtx_proc_t *proc
|
||||
const int ack_nack_slot = (proc->nr_slot_rx + phy_data->dlsch[0].dlsch_config.k1_feedback) % UE->frame_parms.slots_per_frame;
|
||||
tx_wait_for_dlsch[ack_nack_slot]++;
|
||||
}
|
||||
} else {
|
||||
// good time to print statistics, we don't have to spend time to decode DCI
|
||||
if (proc->frame_rx % 128 == 0) {
|
||||
if (*stats_printed == false) {
|
||||
print_ue_mac_stats(UE->Mod_id, proc->frame_rx, proc->nr_slot_rx);
|
||||
*stats_printed = true;
|
||||
}
|
||||
} else {
|
||||
*stats_printed = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (UE->sl_mode == 2) {
|
||||
@@ -833,6 +846,7 @@ void *UE_thread(void *arg)
|
||||
int shiftForNextFrame = 0;
|
||||
int intialSyncOffset = 0;
|
||||
openair0_timestamp sync_timestamp;
|
||||
bool stats_printed = false;
|
||||
|
||||
if (get_softmodem_params()->sync_ref && UE->sl_mode == 2) {
|
||||
UE->is_synchronized = 1;
|
||||
@@ -1029,7 +1043,7 @@ void *UE_thread(void *arg)
|
||||
notifiedFIFO_elt_t *newRx = newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), curMsg.proc.nr_slot_rx, NULL, UE_dl_processing);
|
||||
nr_rxtx_thread_data_t *curMsgRx = (nr_rxtx_thread_data_t *)NotifiedFifoData(newRx);
|
||||
*curMsgRx = (nr_rxtx_thread_data_t){.proc = curMsg.proc, .UE = UE};
|
||||
int ret = UE_dl_preprocessing(UE, &curMsgRx->proc, tx_wait_for_dlsch, &curMsgRx->phy_data);
|
||||
int ret = UE_dl_preprocessing(UE, &curMsgRx->proc, tx_wait_for_dlsch, &curMsgRx->phy_data, &stats_printed);
|
||||
if (ret != INT_MAX)
|
||||
shiftForNextFrame = ret;
|
||||
pushTpool(&(get_nrUE_params()->Tpool), newRx);
|
||||
|
||||
@@ -87,6 +87,7 @@ unsigned short config_frames[4] = {2,9,11,13};
|
||||
#include "nr_nas_msg.h"
|
||||
#include <openair1/PHY/MODULATION/nr_modulation.h>
|
||||
#include "openair2/GNB_APP/gnb_paramdef.h"
|
||||
#include "pdcp.h"
|
||||
|
||||
extern const char *duplex_mode[];
|
||||
THREAD_STRUCT thread_struct;
|
||||
|
||||
@@ -467,10 +467,10 @@ void nr_init_ul_harq_processes(NR_UL_UE_HARQ_t harq_list[NR_MAX_ULSCH_HARQ_PROCE
|
||||
void init_nr_ue_transport(PHY_VARS_NR_UE *ue) {
|
||||
|
||||
nr_init_dl_harq_processes(ue->dl_harq_processes, NR_MAX_DLSCH_HARQ_PROCESSES, ue->frame_parms.N_RB_DL);
|
||||
nr_init_ul_harq_processes(ue->ul_harq_processes, NR_MAX_ULSCH_HARQ_PROCESSES, ue->frame_parms.N_RB_UL, ue->frame_parms.nb_antennas_tx);
|
||||
|
||||
for(int i=0; i<5; i++)
|
||||
ue->dl_stats[i] = 0;
|
||||
nr_init_ul_harq_processes(ue->ul_harq_processes,
|
||||
NR_MAX_ULSCH_HARQ_PROCESSES,
|
||||
ue->frame_parms.N_RB_UL,
|
||||
ue->frame_parms.nb_antennas_tx);
|
||||
}
|
||||
|
||||
void clean_UE_harq(PHY_VARS_NR_UE *UE)
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "nr_ul_estimation.h"
|
||||
@@ -35,13 +34,12 @@
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "nr_phy_common.h"
|
||||
|
||||
|
||||
//#define DEBUG_CH
|
||||
//#define DEBUG_PUSCH
|
||||
//#define SRS_DEBUG
|
||||
|
||||
#define NO_INTERP 1
|
||||
#define dBc(x,y) (dB_fixed(((int32_t)(x))*(x) + ((int32_t)(y))*(y)))
|
||||
#define dBc(x, y) (dB_fixed(((int32_t)(x)) * (x) + ((int32_t)(y)) * (y)))
|
||||
|
||||
__attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *in1,
|
||||
int *offset1,
|
||||
@@ -50,130 +48,81 @@ __attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *
|
||||
int *offset2,
|
||||
const int step2,
|
||||
const int modulo2,
|
||||
const int N) {
|
||||
|
||||
int localOffset1=*offset1;
|
||||
int localOffset2=*offset2;
|
||||
c32_t cumul={0};
|
||||
for (int i=0; i<N; i++) {
|
||||
cumul=c32x16maddShift(in1[localOffset1], in2[localOffset2], cumul, 15);
|
||||
localOffset1+=step1;
|
||||
localOffset2= (localOffset2 + step2) % modulo2;
|
||||
const int N)
|
||||
{
|
||||
int localOffset1 = *offset1;
|
||||
int localOffset2 = *offset2;
|
||||
c32_t cumul = {0};
|
||||
for (int i = 0; i < N; i++) {
|
||||
cumul = c32x16maddShift(in1[localOffset1], in2[localOffset2], cumul, 15);
|
||||
localOffset1 += step1;
|
||||
localOffset2 = (localOffset2 + step2) % modulo2;
|
||||
}
|
||||
*offset1=localOffset1;
|
||||
*offset2=localOffset2;
|
||||
*offset1 = localOffset1;
|
||||
*offset2 = localOffset2;
|
||||
return c16x32div(cumul, N);
|
||||
}
|
||||
|
||||
int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
unsigned char Ns,
|
||||
int nl,
|
||||
unsigned short p,
|
||||
unsigned char symbol,
|
||||
int ul_id,
|
||||
int beam_nb,
|
||||
unsigned short bwp_start_subcarrier,
|
||||
nfapi_nr_pusch_pdu_t *pusch_pdu,
|
||||
int *max_ch,
|
||||
uint32_t *nvar)
|
||||
static void nr_pusch_antenna_processing(void *arg)
|
||||
{
|
||||
c16_t pilot[3280] __attribute__((aligned(32)));
|
||||
const int chest_freq = gNB->chest_freq;
|
||||
puschAntennaProc_t *rdata = (puschAntennaProc_t *)arg;
|
||||
unsigned char Ns = rdata->Ns;
|
||||
int nl = rdata->nl;
|
||||
unsigned short p = rdata->p;
|
||||
unsigned char symbol = rdata->symbol;
|
||||
int aarx = rdata->aarx;
|
||||
int numAntennas = rdata->numAntennas;
|
||||
unsigned short bwp_start_subcarrier = rdata->bwp_start_subcarrier;
|
||||
nfapi_nr_pusch_pdu_t *pusch_pdu = rdata->pusch_pdu;
|
||||
int *max_ch = rdata->max_ch;
|
||||
c16_t *pilot = rdata->pilot;
|
||||
uint64_t noise_amp2 = *(rdata->noise_amp2);
|
||||
int nest_count = *(rdata->nest_count);
|
||||
delay_t *delay = rdata->delay;
|
||||
|
||||
#ifdef DEBUG_CH
|
||||
FILE *debug_ch_est;
|
||||
debug_ch_est = fopen("debug_ch_est.txt","w");
|
||||
#endif
|
||||
NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ul_id];
|
||||
const int chest_freq = rdata->chest_freq;
|
||||
NR_gNB_PUSCH *pusch_vars = rdata->pusch_vars;
|
||||
c16_t **ul_ch_estimates = (c16_t **)pusch_vars->ul_ch_estimates;
|
||||
const int symbolSize = gNB->frame_parms.ofdm_symbol_size;
|
||||
const int slot_offset = (Ns & 3) * gNB->frame_parms.symbols_per_slot * symbolSize;
|
||||
NR_DL_FRAME_PARMS *frame_parms = rdata->frame_parms;
|
||||
const int symbolSize = frame_parms->ofdm_symbol_size;
|
||||
const int slot_offset = (Ns & 3) * frame_parms->symbols_per_slot * symbolSize;
|
||||
const int delta = get_delta(p, pusch_pdu->dmrs_config_type);
|
||||
const int symbol_offset = symbolSize * symbol;
|
||||
const int k0 = bwp_start_subcarrier;
|
||||
const int nb_rb_pusch = pusch_pdu->rb_size;
|
||||
|
||||
LOG_D(PHY, "symbol_offset %d, slot_offset %d, OFDM size %d, Ns = %d, k0 = %d, symbol %d\n",
|
||||
symbol_offset,
|
||||
slot_offset,
|
||||
symbolSize,
|
||||
Ns,
|
||||
k0,
|
||||
symbol);
|
||||
|
||||
//------------------generate DMRS------------------//
|
||||
|
||||
if (pusch_pdu->transform_precoding == transformPrecoder_disabled) {
|
||||
// Note: pilot returned by the following function is already the complex conjugate of the transmitted DMRS
|
||||
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||
const uint32_t *gold = nr_gold_pusch(fp->N_RB_UL,
|
||||
fp->symbols_per_slot,
|
||||
gNB->gNB_config.cell_config.phy_cell_id.value,
|
||||
pusch_pdu->scid,
|
||||
Ns,
|
||||
symbol);
|
||||
nr_pusch_dmrs_rx(gNB,
|
||||
Ns,
|
||||
gold,
|
||||
pilot,
|
||||
(1000 + p),
|
||||
0,
|
||||
nb_rb_pusch,
|
||||
(pusch_pdu->bwp_start + pusch_pdu->rb_start) * NR_NB_SC_PER_RB,
|
||||
pusch_pdu->dmrs_config_type);
|
||||
} else { // if transform precoding or SC-FDMA is enabled in Uplink
|
||||
// NR_SC_FDMA supports type1 DMRS so only 6 DMRS REs per RB possible
|
||||
const int index = get_index_for_dmrs_lowpapr_seq(nb_rb_pusch * (NR_NB_SC_PER_RB / 2));
|
||||
const uint8_t u = pusch_pdu->dfts_ofdm.low_papr_group_number;
|
||||
const uint8_t v = pusch_pdu->dfts_ofdm.low_papr_sequence_number;
|
||||
c16_t *dmrs_seq = gNB_dmrs_lowpaprtype1_sequence[u][v][index];
|
||||
LOG_D(PHY,"Transform Precoding params. u: %d, v: %d, index for dmrsseq: %d\n", u, v, index);
|
||||
AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n");
|
||||
AssertFatal(dmrs_seq != NULL, "DMRS low PAPR seq not found, check if DMRS sequences are generated");
|
||||
nr_pusch_lowpaprtype1_dmrs_rx(gNB, Ns, dmrs_seq, pilot, 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type);
|
||||
#ifdef DEBUG_PUSCH
|
||||
printf ("NR_UL_CHANNEL_EST: index %d, u %d,v %d\n", index, u, v);
|
||||
LOG_M("gNb_DMRS_SEQ.m","gNb_DMRS_SEQ", dmrs_seq,6*nb_rb_pusch,1,1);
|
||||
#endif
|
||||
}
|
||||
//------------------------------------------------//
|
||||
|
||||
#ifdef DEBUG_PUSCH
|
||||
|
||||
for (int i = 0; i < (6 * nb_rb_pusch); i++) {
|
||||
LOG_I(PHY, "In %s: %d + j*(%d)\n", __FUNCTION__, pilot[i].r,pilot[i].i);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int nest_count = 0;
|
||||
uint64_t noise_amp2 = 0;
|
||||
c16_t ul_ls_est[symbolSize] __attribute__((aligned(32)));
|
||||
memset(ul_ls_est, 0, sizeof(c16_t) * symbolSize);
|
||||
delay_t *delay = &gNB->ulsch[ul_id].delay;
|
||||
memset(delay, 0, sizeof(*delay));
|
||||
|
||||
for (int aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) {
|
||||
c16_t *rxdataF = (c16_t *)&gNB->common_vars.rxdataF[beam_nb][aarx][symbol_offset + slot_offset];
|
||||
c16_t *ul_ch = &ul_ch_estimates[nl * gNB->frame_parms.nb_antennas_rx + aarx][symbol_offset];
|
||||
|
||||
const int beam_nb = rdata->beam_nb;
|
||||
for (int antenna = aarx; antenna < aarx + numAntennas; antenna++) {
|
||||
c16_t ul_ls_est[symbolSize] __attribute__((aligned(32)));
|
||||
memset(ul_ls_est, 0, sizeof(c16_t) * symbolSize);
|
||||
c16_t *rxdataF = (c16_t *)&rdata->rxdataF[beam_nb][antenna][symbol_offset + slot_offset];
|
||||
c16_t *ul_ch = &ul_ch_estimates[nl * frame_parms->nb_antennas_rx + antenna][symbol_offset];
|
||||
memset(ul_ch, 0, sizeof(*ul_ch) * symbolSize);
|
||||
|
||||
LOG_D(PHY,
|
||||
"symbol_offset %d, slot_offset %d, OFDM size %d, Ns = %d, k0 = %d, symbol %d\n",
|
||||
symbol_offset,
|
||||
slot_offset,
|
||||
symbolSize,
|
||||
Ns,
|
||||
k0,
|
||||
symbol);
|
||||
|
||||
#ifdef DEBUG_PUSCH
|
||||
LOG_I(PHY, "symbol_offset %d, delta %d\n", symbol_offset, delta);
|
||||
LOG_I(PHY, "ch est pilot, N_RB_UL %d\n", gNB->frame_parms.N_RB_UL);
|
||||
LOG_I(PHY, "ch est pilot, N_RB_UL %d\n", frame_parms->N_RB_UL);
|
||||
LOG_I(PHY,
|
||||
"bwp_start_subcarrier %d, k0 %d, first_carrier %d, nb_rb_pusch %d\n",
|
||||
bwp_start_subcarrier,
|
||||
k0,
|
||||
gNB->frame_parms.first_carrier_offset,
|
||||
frame_parms->first_carrier_offset,
|
||||
nb_rb_pusch);
|
||||
LOG_I(PHY, "ul_ch addr %p \n", ul_ch);
|
||||
#endif
|
||||
|
||||
if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && chest_freq == 0) {
|
||||
c16_t *pil = pilot;
|
||||
c16_t *pil = pilot;
|
||||
int re_offset = k0;
|
||||
LOG_D(PHY,"PUSCH estimation DMRS type 1, Freq-domain interpolation");
|
||||
LOG_D(PHY, "PUSCH estimation DMRS type 1, Freq-domain interpolation");
|
||||
int pilot_cnt = 0;
|
||||
|
||||
for (int n = 0; n < 3 * nb_rb_pusch; n++) {
|
||||
@@ -187,27 +136,25 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
}
|
||||
|
||||
c16_t ch16 = {.r = (int16_t)ch.r, .i = (int16_t)ch.i};
|
||||
*max_ch = max(*max_ch, max(abs(ch.r), abs(ch.i)));
|
||||
*max_ch = max(abs(ch.r), abs(ch.i));
|
||||
for (int k = pilot_cnt << 1; k < (pilot_cnt << 1) + 4; k++) {
|
||||
ul_ls_est[k] = ch16;
|
||||
}
|
||||
pilot_cnt += 2;
|
||||
}
|
||||
|
||||
nr_est_delay(gNB->frame_parms.ofdm_symbol_size, ul_ls_est, (c16_t *)pusch_vars->ul_ch_estimates_time[aarx], delay);
|
||||
nr_est_delay(frame_parms->ofdm_symbol_size, ul_ls_est, (c16_t *)pusch_vars->ul_ch_estimates_time[antenna], delay);
|
||||
int delay_idx = get_delay_idx(delay->est_delay, MAX_DELAY_COMP);
|
||||
c16_t *ul_delay_table = gNB->frame_parms.delay_table[delay_idx];
|
||||
c16_t *ul_delay_table = frame_parms->delay_table[delay_idx];
|
||||
|
||||
#ifdef DEBUG_PUSCH
|
||||
printf("Estimated delay = %i\n", delay->est_delay >> 1);
|
||||
#endif
|
||||
|
||||
pilot_cnt = 0;
|
||||
for (int n = 0; n < 3*nb_rb_pusch; n++) {
|
||||
|
||||
for (int n = 0; n < 3 * nb_rb_pusch; n++) {
|
||||
// Channel interpolation
|
||||
for (int k_line = 0; k_line <= 1; k_line++) {
|
||||
|
||||
// Apply delay
|
||||
int k = pilot_cnt << 1;
|
||||
c16_t ch16 = c16mulShift(ul_ls_est[k], ul_delay_table[k], 8);
|
||||
@@ -216,7 +163,13 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
re_offset = (k0 + (n << 2) + (k_line << 1)) % symbolSize;
|
||||
c16_t *rxF = &rxdataF[re_offset];
|
||||
printf("pilot %4d: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d)\n",
|
||||
pilot_cnt, pil->r, pil->i, rxF->r, rxF->i, ch16.r, ch16.i);
|
||||
pilot_cnt,
|
||||
pil->r,
|
||||
pil->i,
|
||||
rxF->r,
|
||||
rxF->i,
|
||||
ch.r,
|
||||
ch.i);
|
||||
#endif
|
||||
|
||||
if (pilot_cnt == 0) {
|
||||
@@ -238,9 +191,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
|
||||
// Revert delay
|
||||
pilot_cnt = 0;
|
||||
ul_ch = &ul_ch_estimates[nl * gNB->frame_parms.nb_antennas_rx + aarx][symbol_offset];
|
||||
ul_ch = &ul_ch_estimates[nl * frame_parms->nb_antennas_rx + antenna][symbol_offset];
|
||||
int inv_delay_idx = get_delay_idx(-delay->est_delay, MAX_DELAY_COMP);
|
||||
c16_t *ul_inv_delay_table = gNB->frame_parms.delay_table[inv_delay_idx];
|
||||
c16_t *ul_inv_delay_table = frame_parms->delay_table[inv_delay_idx];
|
||||
for (int n = 0; n < 3 * nb_rb_pusch; n++) {
|
||||
for (int k_line = 0; k_line <= 1; k_line++) {
|
||||
int k = pilot_cnt << 1;
|
||||
@@ -258,7 +211,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
}
|
||||
}
|
||||
|
||||
} else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && chest_freq == 0) { // pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
|
||||
} else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2
|
||||
&& chest_freq == 0) { // pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
|
||||
LOG_D(PHY, "PUSCH estimation DMRS type 2, Freq-domain interpolation\n");
|
||||
c16_t *pil = pilot;
|
||||
c16_t *rx = &rxdataF[delta];
|
||||
@@ -268,26 +222,27 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
c16_t ch1 = c16mulShift(*pil, rx[(k0 + n + 1) % symbolSize], 15);
|
||||
pil++;
|
||||
c16_t ch = c16addShift(ch0, ch1, 1);
|
||||
*max_ch = max(*max_ch, max(abs(ch.r), abs(ch.i)));
|
||||
*max_ch = max(abs(ch.r), abs(ch.i));
|
||||
multadd_real_four_symbols_vector_complex_scalar(filt8_rep4, &ch, &ul_ls_est[n]);
|
||||
ul_ls_est[n + 4] = ch;
|
||||
ul_ls_est[n + 5] = ch;
|
||||
noise_amp2 += c16amp2(c16sub(ch0, ch));
|
||||
nest_count++;
|
||||
nest_count += 1;
|
||||
}
|
||||
|
||||
// Delay compensation
|
||||
nr_est_delay(gNB->frame_parms.ofdm_symbol_size, ul_ls_est, (c16_t *)pusch_vars->ul_ch_estimates_time[aarx], delay);
|
||||
nr_est_delay(frame_parms->ofdm_symbol_size, ul_ls_est, (c16_t *)pusch_vars->ul_ch_estimates_time[antenna], delay);
|
||||
int delay_idx = get_delay_idx(-delay->est_delay, MAX_DELAY_COMP);
|
||||
c16_t *ul_delay_table = gNB->frame_parms.delay_table[delay_idx];
|
||||
c16_t *ul_delay_table = frame_parms->delay_table[delay_idx];
|
||||
for (int n = 0; n < nb_rb_pusch * NR_NB_SC_PER_RB; n++) {
|
||||
ul_ch[n] = c16mulShift(ul_ls_est[n], ul_delay_table[n % 6], 8);
|
||||
}
|
||||
|
||||
}
|
||||
// this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a common value for the whole PRB
|
||||
// this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a
|
||||
// common value for the whole PRB
|
||||
else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1) {
|
||||
LOG_D(PHY,"PUSCH estimation DMRS type 1, no Freq-domain interpolation\n");
|
||||
LOG_D(PHY, "PUSCH estimation DMRS type 1, no Freq-domain interpolation\n");
|
||||
c16_t *rxF = &rxdataF[delta];
|
||||
int pil_offset = 0;
|
||||
int re_offset = k0;
|
||||
@@ -297,8 +252,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
ch = c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6);
|
||||
|
||||
#if NO_INTERP
|
||||
for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
|
||||
*ul_ch=ch;
|
||||
for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
|
||||
*ul_ch = ch;
|
||||
#else
|
||||
c16multaddVectRealComplex(filt8_avlip0, &ch, ul_ch, 8);
|
||||
ul_ch += 8;
|
||||
@@ -308,16 +263,16 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
ul_ch -= 12;
|
||||
#endif
|
||||
|
||||
for (int pilot_cnt=6; pilot_cnt<6*(nb_rb_pusch-1); pilot_cnt += 6) {
|
||||
for (int pilot_cnt = 6; pilot_cnt < 6 * (nb_rb_pusch - 1); pilot_cnt += 6) {
|
||||
ch = c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6);
|
||||
*max_ch = max(*max_ch, max(abs(ch.r), abs(ch.i)));
|
||||
*max_ch = max(abs(ch.r), abs(ch.i));
|
||||
|
||||
#if NO_INTERP
|
||||
for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
|
||||
*ul_ch=ch;
|
||||
for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
|
||||
*ul_ch = ch;
|
||||
#else
|
||||
ul_ch[3].r += (ch.r * 1365)>>15; // 1/12*16384
|
||||
ul_ch[3].i += (ch.i * 1365)>>15; // 1/12*16384
|
||||
ul_ch[3].r += (ch.r * 1365) >> 15; // 1/12*16384
|
||||
ul_ch[3].i += (ch.i * 1365) >> 15; // 1/12*16384
|
||||
|
||||
ul_ch += 4;
|
||||
c16multaddVectRealComplex(filt8_avlip3, &ch, ul_ch, 8);
|
||||
@@ -329,26 +284,27 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
#endif
|
||||
}
|
||||
// Last PRB
|
||||
ch=c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6);
|
||||
ch = c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6);
|
||||
|
||||
#if NO_INTERP
|
||||
for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
|
||||
*ul_ch=ch;
|
||||
for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
|
||||
*ul_ch = ch;
|
||||
#else
|
||||
ul_ch[3].r += (ch.r * 1365)>>15; // 1/12*16384
|
||||
ul_ch[3].i += (ch.i * 1365)>>15; // 1/12*16384
|
||||
ul_ch[3].r += (ch.r * 1365) >> 15; // 1/12*16384
|
||||
ul_ch[3].i += (ch.i * 1365) >> 15; // 1/12*16384
|
||||
|
||||
ul_ch += 4;
|
||||
c16multaddVectRealComplex(filt8_avlip3, &ch, ul_ch, 8);
|
||||
ul_ch += 8;
|
||||
c16multaddVectRealComplex(filt8_avlip6, &ch, ul_ch, 8);
|
||||
#endif
|
||||
} else { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB
|
||||
LOG_D(PHY,"PUSCH estimation DMRS type 2, no Freq-domain interpolation");
|
||||
} else { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs
|
||||
// and use a common value for the whole PRB
|
||||
LOG_D(PHY, "PUSCH estimation DMRS type 2, no Freq-domain interpolation");
|
||||
c16_t *pil = pilot;
|
||||
int re_offset = (k0 + delta) % symbolSize;
|
||||
c32_t ch0 = {0};
|
||||
//First PRB
|
||||
// First PRB
|
||||
ch0 = c32x16mulShift(*pil, rxdataF[re_offset], 15);
|
||||
pil++;
|
||||
re_offset = (re_offset + 1) % symbolSize;
|
||||
@@ -361,10 +317,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
pil++;
|
||||
re_offset = (re_offset + 5) % symbolSize;
|
||||
|
||||
c16_t ch=c16x32div(ch0, 4);
|
||||
c16_t ch = c16x32div(ch0, 4);
|
||||
#if NO_INTERP
|
||||
for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
|
||||
*ul_ch=ch;
|
||||
for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
|
||||
*ul_ch = ch;
|
||||
#else
|
||||
c16multaddVectRealComplex(filt8_avlip0, &ch, ul_ch, 8);
|
||||
ul_ch += 8;
|
||||
@@ -374,7 +330,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
ul_ch -= 12;
|
||||
#endif
|
||||
|
||||
for (int pilot_cnt=4; pilot_cnt<4*(nb_rb_pusch-1); pilot_cnt += 4) {
|
||||
for (int pilot_cnt = 4; pilot_cnt < 4 * (nb_rb_pusch - 1); pilot_cnt += 4) {
|
||||
c32_t ch0;
|
||||
ch0 = c32x16mulShift(*pil, rxdataF[re_offset], 15);
|
||||
pil++;
|
||||
@@ -390,14 +346,14 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
|
||||
ch0 = c32x16maddShift(*pil, rxdataF[re_offset], ch0, 15);
|
||||
pil++;
|
||||
re_offset = (re_offset+5) % symbolSize;
|
||||
re_offset = (re_offset + 5) % symbolSize;
|
||||
|
||||
ch=c16x32div(ch0, 4);
|
||||
*max_ch = max(*max_ch, max(abs(ch.r), abs(ch.i)));
|
||||
ch = c16x32div(ch0, 4);
|
||||
*max_ch = max(abs(ch.r), abs(ch.i));
|
||||
|
||||
#if NO_INTERP
|
||||
for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
|
||||
*ul_ch=ch;
|
||||
for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
|
||||
*ul_ch = ch;
|
||||
#else
|
||||
ul_ch[3] = c16maddShift(ch, (c16_t){1365, 1365}, (c16_t){0, 0}, 15); // 1365 = 1/12*16384 (full range is +/- 32768)
|
||||
ul_ch += 4;
|
||||
@@ -427,10 +383,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
pil++;
|
||||
re_offset = (re_offset + 5) % symbolSize;
|
||||
|
||||
ch=c16x32div(ch0, 4);
|
||||
ch = c16x32div(ch0, 4);
|
||||
#if NO_INTERP
|
||||
for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
|
||||
*ul_ch=ch;
|
||||
for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
|
||||
*ul_ch = ch;
|
||||
#else
|
||||
ul_ch[3] = c16maddShift(ch, (c16_t){1365, 1365}, (c16_t){0, 0}, 15); // 1365 = 1/12*16384 (full range is +/- 32768)
|
||||
ul_ch += 4;
|
||||
@@ -444,12 +400,162 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
ul_ch = &ul_ch_estimates[nl * gNB->frame_parms.nb_antennas_rx + aarx][symbol_offset];
|
||||
for (int idxP = 0; idxP < ceil((float)nb_rb_pusch * 12 / 8); idxP++) {
|
||||
for (int idxI = 0; idxI < 8; idxI++) {
|
||||
printf("%d\t%d\t", ul_ch[idxP * 8 + idxI].r, ul_ch[idxP * 8 + idxI].i);
|
||||
printf("%d\t%d\t", ul_ch[idxP * 8 + idxI].r, ul_ch[idxP * 8 + idxI].i);
|
||||
}
|
||||
printf("%d\n", idxP);
|
||||
}
|
||||
#endif
|
||||
// update the values inside the arrays
|
||||
*(rdata->noise_amp2) = noise_amp2;
|
||||
*(rdata->nest_count) = nest_count;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
unsigned char Ns,
|
||||
int nl,
|
||||
unsigned short p,
|
||||
unsigned char symbol,
|
||||
int ul_id,
|
||||
int beam_nb,
|
||||
unsigned short bwp_start_subcarrier,
|
||||
nfapi_nr_pusch_pdu_t *pusch_pdu,
|
||||
int *max_ch,
|
||||
uint32_t *nvar)
|
||||
{
|
||||
c16_t pilot[3280] __attribute__((aligned(32)));
|
||||
|
||||
#ifdef DEBUG_CH
|
||||
FILE *debug_ch_est;
|
||||
debug_ch_est = fopen("debug_ch_est.txt", "w");
|
||||
#endif
|
||||
|
||||
const int nb_rb_pusch = pusch_pdu->rb_size;
|
||||
|
||||
//------------------generate DMRS------------------//
|
||||
|
||||
if (pusch_pdu->transform_precoding == transformPrecoder_disabled) {
|
||||
// Note: pilot returned by the following function is already the complex conjugate of the transmitted DMRS
|
||||
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||
const uint32_t *gold = nr_gold_pusch(fp->N_RB_UL,
|
||||
fp->symbols_per_slot,
|
||||
gNB->gNB_config.cell_config.phy_cell_id.value,
|
||||
pusch_pdu->scid,
|
||||
Ns,
|
||||
symbol);
|
||||
nr_pusch_dmrs_rx(gNB,
|
||||
Ns,
|
||||
gold,
|
||||
pilot,
|
||||
(1000 + p),
|
||||
0,
|
||||
nb_rb_pusch,
|
||||
(pusch_pdu->bwp_start + pusch_pdu->rb_start) * NR_NB_SC_PER_RB,
|
||||
pusch_pdu->dmrs_config_type);
|
||||
} else { // if transform precoding or SC-FDMA is enabled in Uplink
|
||||
// NR_SC_FDMA supports type1 DMRS so only 6 DMRS REs per RB possible
|
||||
const int index = get_index_for_dmrs_lowpapr_seq(nb_rb_pusch * (NR_NB_SC_PER_RB / 2));
|
||||
const uint8_t u = pusch_pdu->dfts_ofdm.low_papr_group_number;
|
||||
const uint8_t v = pusch_pdu->dfts_ofdm.low_papr_sequence_number;
|
||||
c16_t *dmrs_seq = gNB_dmrs_lowpaprtype1_sequence[u][v][index];
|
||||
LOG_D(PHY, "Transform Precoding params. u: %d, v: %d, index for dmrsseq: %d\n", u, v, index);
|
||||
AssertFatal(index >= 0,
|
||||
"Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs "
|
||||
"cannot be multiple of any other primenumber other than 2,3,5\n");
|
||||
AssertFatal(dmrs_seq != NULL, "DMRS low PAPR seq not found, check if DMRS sequences are generated");
|
||||
nr_pusch_lowpaprtype1_dmrs_rx(gNB, Ns, dmrs_seq, pilot, 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type);
|
||||
#ifdef DEBUG_PUSCH
|
||||
printf("NR_UL_CHANNEL_EST: index %d, u %d,v %d\n", index, u, v);
|
||||
LOG_M("gNb_DMRS_SEQ.m", "gNb_DMRS_SEQ", dmrs_seq, 6 * nb_rb_pusch, 1, 1);
|
||||
#endif
|
||||
}
|
||||
//------------------------------------------------//
|
||||
|
||||
#ifdef DEBUG_PUSCH
|
||||
|
||||
for (int i = 0; i < (6 * nb_rb_pusch); i++) {
|
||||
LOG_I(PHY, "In %s: %d + j*(%d)\n", __FUNCTION__, pilot[i].r, pilot[i].i);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int nbAarx = 0;
|
||||
int nest_count = 0;
|
||||
uint64_t noise_amp2 = 0;
|
||||
delay_t *delay = &gNB->ulsch[ul_id].delay;
|
||||
memset(delay, 0, sizeof(*delay));
|
||||
|
||||
int nb_antennas_rx = gNB->frame_parms.nb_antennas_rx;
|
||||
delay_t delay_arr[nb_antennas_rx];
|
||||
uint64_t noise_amp2_arr[nb_antennas_rx];
|
||||
int max_ch_arr[nb_antennas_rx];
|
||||
int nest_count_arr[nb_antennas_rx];
|
||||
|
||||
for (int i = 0; i < nb_antennas_rx; ++i) {
|
||||
max_ch_arr[i] = *max_ch;
|
||||
nest_count_arr[i] = nest_count;
|
||||
noise_amp2_arr[i] = noise_amp2;
|
||||
delay_arr[i] = *delay;
|
||||
}
|
||||
|
||||
notifiedFIFO_t respPuschAarx;
|
||||
initNotifiedFIFO(&respPuschAarx);
|
||||
start_meas(&gNB->pusch_channel_estimation_antenna_processing_stats);
|
||||
int numAntennas = gNB->dmrs_num_antennas_per_thread;
|
||||
for (int aarx = 0; aarx < gNB->frame_parms.nb_antennas_rx; aarx += numAntennas) {
|
||||
union puschAntennaReqUnion id = {.s = {ul_id, 0}};
|
||||
id.p = 1 + aarx;
|
||||
notifiedFIFO_elt_t *req = newNotifiedFIFO_elt(sizeof(puschAntennaProc_t),
|
||||
id.p,
|
||||
&respPuschAarx,
|
||||
&nr_pusch_antenna_processing); // create a job for Tpool
|
||||
puschAntennaProc_t *rdata = (puschAntennaProc_t *)NotifiedFifoData(req); // data for the job
|
||||
|
||||
// Local init in the current loop
|
||||
rdata->Ns = Ns;
|
||||
rdata->nl = nl;
|
||||
rdata->p = p;
|
||||
rdata->symbol = symbol;
|
||||
rdata->aarx = aarx;
|
||||
rdata->numAntennas = numAntennas;
|
||||
rdata->bwp_start_subcarrier = bwp_start_subcarrier;
|
||||
rdata->pusch_pdu = pusch_pdu;
|
||||
rdata->max_ch = &max_ch_arr[rdata->aarx];
|
||||
rdata->pilot = pilot;
|
||||
rdata->nest_count = &nest_count_arr[rdata->aarx];
|
||||
rdata->noise_amp2 = &noise_amp2_arr[rdata->aarx];
|
||||
rdata->delay = &delay_arr[rdata->aarx];
|
||||
rdata->beam_nb = beam_nb;
|
||||
rdata->frame_parms = &gNB->frame_parms;
|
||||
rdata->pusch_vars = &gNB->pusch_vars[ul_id];
|
||||
rdata->chest_freq = gNB->chest_freq;
|
||||
rdata->rxdataF = gNB->common_vars.rxdataF;
|
||||
// Call the nr_pusch_antenna_processing function
|
||||
pushTpool(&gNB->threadPool, req);
|
||||
nbAarx++;
|
||||
|
||||
LOG_D(PHY, "Added Antenna (count %d) to process, in pipe\n", nbAarx);
|
||||
} // Antenna Loop
|
||||
|
||||
while (nbAarx > 0) {
|
||||
notifiedFIFO_elt_t *req = pullTpool(&respPuschAarx, &gNB->threadPool);
|
||||
nbAarx--;
|
||||
delNotifiedFIFO_elt(req);
|
||||
}
|
||||
|
||||
stop_meas(&gNB->pusch_channel_estimation_antenna_processing_stats);
|
||||
for (int aarx = 0; aarx < gNB->frame_parms.nb_antennas_rx; aarx++) {
|
||||
*max_ch = max(*max_ch, max_ch_arr[aarx]);
|
||||
noise_amp2 += noise_amp2_arr[aarx];
|
||||
nest_count += nest_count_arr[aarx];
|
||||
}
|
||||
// get the maximum delay
|
||||
*delay = delay_arr[0];
|
||||
for (int aarx = 1; aarx < gNB->frame_parms.nb_antennas_rx; aarx++) {
|
||||
if (delay_arr[aarx].est_delay >= delay->est_delay) {
|
||||
*delay = delay_arr[aarx];
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG_CH
|
||||
@@ -463,7 +569,6 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
*
|
||||
* NAME : nr_pusch_ptrs_processing
|
||||
@@ -495,51 +600,46 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
||||
uint32_t nb_re_pusch)
|
||||
{
|
||||
NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ulsch_id];
|
||||
int32_t *ptrs_re_symbol = NULL;
|
||||
int8_t ret = 0;
|
||||
uint8_t symbInSlot = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols;
|
||||
uint8_t *startSymbIndex = &rel15_ul->start_symbol_index;
|
||||
uint8_t *nbSymb = &rel15_ul->nr_of_symbols;
|
||||
uint8_t *L_ptrs = &rel15_ul->pusch_ptrs.ptrs_time_density;
|
||||
uint8_t *K_ptrs = &rel15_ul->pusch_ptrs.ptrs_freq_density;
|
||||
uint16_t *dmrsSymbPos = &rel15_ul->ul_dmrs_symb_pos;
|
||||
int32_t *ptrs_re_symbol = NULL;
|
||||
int8_t ret = 0;
|
||||
uint8_t symbInSlot = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols;
|
||||
uint8_t *startSymbIndex = &rel15_ul->start_symbol_index;
|
||||
uint8_t *nbSymb = &rel15_ul->nr_of_symbols;
|
||||
uint8_t *L_ptrs = &rel15_ul->pusch_ptrs.ptrs_time_density;
|
||||
uint8_t *K_ptrs = &rel15_ul->pusch_ptrs.ptrs_freq_density;
|
||||
uint16_t *dmrsSymbPos = &rel15_ul->ul_dmrs_symb_pos;
|
||||
uint16_t *ptrsSymbPos = &pusch_vars->ptrs_symbols;
|
||||
uint8_t *ptrsSymbIdx = &pusch_vars->ptrs_symbol_index;
|
||||
uint16_t *nb_rb = &rel15_ul->rb_size;
|
||||
uint8_t *ptrsReOffset = &rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset;
|
||||
uint16_t *nb_rb = &rel15_ul->rb_size;
|
||||
uint8_t *ptrsReOffset = &rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset;
|
||||
|
||||
/* loop over antennas */
|
||||
for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||
c16_t *phase_per_symbol = (c16_t *)pusch_vars->ptrs_phase_per_slot[aarx];
|
||||
ptrs_re_symbol = &pusch_vars->ptrs_re_per_slot;
|
||||
*ptrs_re_symbol = 0;
|
||||
phase_per_symbol[symbol].i = 0;
|
||||
phase_per_symbol[symbol].i = 0;
|
||||
/* set DMRS estimates to 0 angle with magnitude 1 */
|
||||
if(is_dmrs_symbol(symbol,*dmrsSymbPos)) {
|
||||
if (is_dmrs_symbol(symbol, *dmrsSymbPos)) {
|
||||
/* set DMRS real estimation to 32767 */
|
||||
phase_per_symbol[symbol].r=INT16_MAX; // 32767
|
||||
phase_per_symbol[symbol].r = INT16_MAX; // 32767
|
||||
#ifdef DEBUG_UL_PTRS
|
||||
printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[symbol].r,phase_per_symbol[symbol].i);
|
||||
printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[symbol].r, phase_per_symbol[symbol].i);
|
||||
#endif
|
||||
}
|
||||
else {// real ptrs value is set to 0
|
||||
phase_per_symbol[symbol].r = 0;
|
||||
} else { // real ptrs value is set to 0
|
||||
phase_per_symbol[symbol].r = 0;
|
||||
}
|
||||
|
||||
if(symbol == *startSymbIndex) {
|
||||
if (symbol == *startSymbIndex) {
|
||||
*ptrsSymbPos = 0;
|
||||
set_ptrs_symb_idx(ptrsSymbPos,
|
||||
*nbSymb,
|
||||
*startSymbIndex,
|
||||
1<< *L_ptrs,
|
||||
*dmrsSymbPos);
|
||||
set_ptrs_symb_idx(ptrsSymbPos, *nbSymb, *startSymbIndex, 1 << *L_ptrs, *dmrsSymbPos);
|
||||
}
|
||||
|
||||
/* if not PTRS symbol set current ptrs symbol index to zero*/
|
||||
*ptrsSymbIdx = 0;
|
||||
|
||||
/* Check if current symbol contains PTRS */
|
||||
if(is_ptrs_symbol(symbol, *ptrsSymbPos)) {
|
||||
if (is_ptrs_symbol(symbol, *ptrsSymbPos)) {
|
||||
*ptrsSymbIdx = symbol;
|
||||
/*------------------------------------------------------------------------------------------------------- */
|
||||
/* 1) Estimate common phase error per PTRS symbol */
|
||||
@@ -564,27 +664,27 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
||||
}
|
||||
|
||||
/* For last OFDM symbol at each antenna perform interpolation and compensation for the slot*/
|
||||
if(symbol == (symbInSlot -1)) {
|
||||
if (symbol == (symbInSlot - 1)) {
|
||||
/*------------------------------------------------------------------------------------------------------- */
|
||||
/* 2) Interpolate PTRS estimated value in TD */
|
||||
/*------------------------------------------------------------------------------------------------------- */
|
||||
/* If L-PTRS is > 0 then we need interpolation */
|
||||
if(*L_ptrs > 0) {
|
||||
ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, (int16_t*)phase_per_symbol, *startSymbIndex, *nbSymb);
|
||||
if(ret != 0) {
|
||||
LOG_W(PHY,"[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n");
|
||||
if (*L_ptrs > 0) {
|
||||
ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, (int16_t *)phase_per_symbol, *startSymbIndex, *nbSymb);
|
||||
if (ret != 0) {
|
||||
LOG_W(PHY, "[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------- */
|
||||
/* 3) Compensated DMRS based estimated signal with PTRS estimation */
|
||||
/*--------------------------------------------------------------------------------------------------------*/
|
||||
for(uint8_t i = *startSymbIndex; i < symbInSlot; i++) {
|
||||
for (uint8_t i = *startSymbIndex; i < symbInSlot; i++) {
|
||||
/* DMRS Symbol has 0 phase so no need to rotate the respective symbol */
|
||||
/* Skip rotation if the slot processing is wrong */
|
||||
if((!is_dmrs_symbol(i,*dmrsSymbPos)) && (ret == 0)) {
|
||||
if ((!is_dmrs_symbol(i, *dmrsSymbPos)) && (ret == 0)) {
|
||||
#ifdef DEBUG_UL_PTRS
|
||||
printf("[PHY][UL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i);
|
||||
printf("[PHY][UL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r, phase_per_symbol[i].i);
|
||||
#endif
|
||||
rotate_cpx_vector((c16_t *)&pusch_vars->rxdataF_comp[aarx][i * nb_re_pusch],
|
||||
&phase_per_symbol[i],
|
||||
@@ -613,22 +713,22 @@ int nr_srs_channel_estimation(
|
||||
int8_t *snr)
|
||||
{
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_PHY,"Calling %s function\n", __FUNCTION__);
|
||||
LOG_I(NR_PHY, "Calling %s function\n", __FUNCTION__);
|
||||
#endif
|
||||
|
||||
const NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||
const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*NR_NB_SC_PER_RB;
|
||||
const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start * NR_NB_SC_PER_RB;
|
||||
|
||||
const uint8_t N_ap = 1<<srs_pdu->num_ant_ports;
|
||||
const uint8_t K_TC = 2<<srs_pdu->comb_size;
|
||||
const uint8_t N_ap = 1 << srs_pdu->num_ant_ports;
|
||||
const uint8_t K_TC = 2 << srs_pdu->comb_size;
|
||||
const uint16_t m_SRS_b = get_m_srs(srs_pdu->config_index, srs_pdu->bandwidth_index);
|
||||
const uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB/K_TC;
|
||||
const uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB / K_TC;
|
||||
uint8_t fd_cdm = N_ap;
|
||||
if (N_ap == 4 && ((K_TC == 2 && srs_pdu->cyclic_shift >= 4) || (K_TC == 4 && srs_pdu->cyclic_shift >= 6))) {
|
||||
fd_cdm = 2;
|
||||
}
|
||||
|
||||
c16_t srs_ls_estimated_channel[frame_parms->ofdm_symbol_size*(1<<srs_pdu->num_symbols)];
|
||||
c16_t srs_ls_estimated_channel[frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols)];
|
||||
uint32_t noise_power_per_rb[srs_pdu->bwp_size];
|
||||
|
||||
const uint32_t arr_len = frame_parms->nb_antennas_rx * N_ap * M_sc_b_SRS;
|
||||
@@ -639,7 +739,8 @@ int nr_srs_channel_estimation(
|
||||
c16_t noise[arr_len];
|
||||
memset(noise, 0, arr_len * sizeof(c16_t));
|
||||
|
||||
uint8_t mem_offset = ((16 - ((long)&srs_estimated_channel_freq[0][0][subcarrier_offset + nr_srs_info->k_0_p[0][0]])) & 0xF) >> 2; // >> 2 <=> /sizeof(int32_t)
|
||||
uint8_t mem_offset = ((16 - ((long)&srs_estimated_channel_freq[0][0][subcarrier_offset + nr_srs_info->k_0_p[0][0]])) & 0xF)
|
||||
>> 2; // >> 2 <=> /sizeof(int32_t)
|
||||
|
||||
// filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}
|
||||
// The End of OFDM symbol corresponds to the position of last 16384 in the filter
|
||||
@@ -649,26 +750,23 @@ int nr_srs_channel_estimation(
|
||||
c16_t ls_estimated = {0};
|
||||
|
||||
for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
|
||||
|
||||
for (int p_index = 0; p_index < N_ap; p_index++) {
|
||||
|
||||
memset(srs_ls_estimated_channel, 0, frame_parms->ofdm_symbol_size*(1<<srs_pdu->num_symbols)*sizeof(c16_t));
|
||||
memset(srs_est, 0, (frame_parms->ofdm_symbol_size*(1<<srs_pdu->num_symbols) + mem_offset)*sizeof(int32_t));
|
||||
memset(srs_ls_estimated_channel, 0, frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols) * sizeof(c16_t));
|
||||
memset(srs_est, 0, (frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols) + mem_offset) * sizeof(int32_t));
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_PHY,"====================== UE port %d --> gNB Rx antenna %i ======================\n", p_index, ant);
|
||||
LOG_I(NR_PHY, "====================== UE port %d --> gNB Rx antenna %i ======================\n", p_index, ant);
|
||||
#endif
|
||||
|
||||
uint16_t subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0];
|
||||
if (subcarrier>frame_parms->ofdm_symbol_size) {
|
||||
if (subcarrier > frame_parms->ofdm_symbol_size) {
|
||||
subcarrier -= frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
|
||||
c16_t *srs_estimated_channel16 = (c16_t *)&srs_est[subcarrier + mem_offset];
|
||||
|
||||
for (int k = 0; k < M_sc_b_SRS; k++) {
|
||||
|
||||
if (k%fd_cdm==0) {
|
||||
if (k % fd_cdm == 0) {
|
||||
ls_estimated = (c16_t){0, 0};
|
||||
uint16_t subcarrier_cdm = subcarrier;
|
||||
|
||||
@@ -676,18 +774,21 @@ int nr_srs_channel_estimation(
|
||||
int16_t generated_real = srs_generated_signal[p_index][subcarrier_cdm].r;
|
||||
int16_t generated_imag = srs_generated_signal[p_index][subcarrier_cdm].i;
|
||||
|
||||
int16_t received_real = ((c16_t*)srs_received_signal[ant])[subcarrier_cdm].r;
|
||||
int16_t received_imag = ((c16_t*)srs_received_signal[ant])[subcarrier_cdm].i;
|
||||
int16_t received_real = ((c16_t *)srs_received_signal[ant])[subcarrier_cdm].r;
|
||||
int16_t received_imag = ((c16_t *)srs_received_signal[ant])[subcarrier_cdm].i;
|
||||
|
||||
// We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag.
|
||||
// So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits.
|
||||
ls_estimated.r += (int16_t)(((int32_t)generated_real*received_real + (int32_t)generated_imag*received_imag)>>nr_srs_info->srs_generated_signal_bits);
|
||||
ls_estimated.i += (int16_t)(((int32_t)generated_real*received_imag - (int32_t)generated_imag*received_real)>>nr_srs_info->srs_generated_signal_bits);
|
||||
// We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and
|
||||
// generated_imag. So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16
|
||||
// bits.
|
||||
ls_estimated.r += (int16_t)(((int32_t)generated_real * received_real + (int32_t)generated_imag * received_imag)
|
||||
>> nr_srs_info->srs_generated_signal_bits);
|
||||
ls_estimated.i += (int16_t)(((int32_t)generated_real * received_imag - (int32_t)generated_imag * received_real)
|
||||
>> nr_srs_info->srs_generated_signal_bits);
|
||||
|
||||
// Subcarrier increment
|
||||
subcarrier_cdm += K_TC;
|
||||
if (subcarrier_cdm >= frame_parms->ofdm_symbol_size) {
|
||||
subcarrier_cdm=subcarrier_cdm-frame_parms->ofdm_symbol_size;
|
||||
subcarrier_cdm = subcarrier_cdm - frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -695,19 +796,23 @@ int nr_srs_channel_estimation(
|
||||
srs_ls_estimated_channel[subcarrier] = ls_estimated;
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
int subcarrier_log = subcarrier-subcarrier_offset;
|
||||
if(subcarrier_log < 0) {
|
||||
int subcarrier_log = subcarrier - subcarrier_offset;
|
||||
if (subcarrier_log < 0) {
|
||||
subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
if(subcarrier_log%12 == 0) {
|
||||
LOG_I(NR_PHY,"------------------------------------ %d ------------------------------------\n", subcarrier_log/12);
|
||||
LOG_I(NR_PHY,"\t __genRe________genIm__|____rxRe_________rxIm__|____lsRe________lsIm_\n");
|
||||
if (subcarrier_log % 12 == 0) {
|
||||
LOG_I(NR_PHY, "------------------------------------ %d ------------------------------------\n", subcarrier_log / 12);
|
||||
LOG_I(NR_PHY, "\t __genRe________genIm__|____rxRe_________rxIm__|____lsRe________lsIm_\n");
|
||||
}
|
||||
LOG_I(NR_PHY,"(%4i) %6i\t%6i | %6i\t%6i | %6i\t%6i\n",
|
||||
LOG_I(NR_PHY,
|
||||
"(%4i) %6i\t%6i | %6i\t%6i | %6i\t%6i\n",
|
||||
subcarrier_log,
|
||||
((c16_t*)srs_generated_signal[p_index])[subcarrier].r, ((c16_t*)srs_generated_signal[p_index])[subcarrier].i,
|
||||
((c16_t*)srs_received_signal[ant])[subcarrier].r, ((c16_t*)srs_received_signal[ant])[subcarrier].i,
|
||||
ls_estimated.r, ls_estimated.i);
|
||||
((c16_t *)srs_generated_signal[p_index])[subcarrier].r,
|
||||
((c16_t *)srs_generated_signal[p_index])[subcarrier].i,
|
||||
((c16_t *)srs_received_signal[ant])[subcarrier].r,
|
||||
((c16_t *)srs_received_signal[ant])[subcarrier].i,
|
||||
ls_estimated.r,
|
||||
ls_estimated.i);
|
||||
#endif
|
||||
|
||||
const uint16_t sc_offset = subcarrier + mem_offset;
|
||||
@@ -722,7 +827,8 @@ int nr_srs_channel_estimation(
|
||||
srs_estimated_channel16 = (c16_t *)&srs_est[subcarrier];
|
||||
const short *filter = mem_offset == 0 ? filt8_start : filt8_start_shift2;
|
||||
c16multaddVectRealComplex(filter, &ls_estimated, srs_estimated_channel16, 8);
|
||||
} else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS - 1)) { // End of OFDM symbol or last subcarrier cases
|
||||
} else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size
|
||||
|| k == (M_sc_b_SRS - 1)) { // End of OFDM symbol or last subcarrier cases
|
||||
// filt8_end is {4096,8192,12288,16384,0,0,0,0}
|
||||
const short *filter = mem_offset == 0 || k == (M_sc_b_SRS - 1) ? filt8_end : filt8_end_shift2;
|
||||
c16multaddVectRealComplex(filter, &ls_estimated, srs_estimated_channel16, 8);
|
||||
@@ -742,7 +848,8 @@ int nr_srs_channel_estimation(
|
||||
srs_estimated_channel16 = (c16_t *)&srs_est[sc_offset];
|
||||
// filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0}
|
||||
c16multaddVectRealComplex(filt16_start, &ls_estimated, srs_estimated_channel16, 16);
|
||||
} else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS - 1)) { // End of OFDM symbol or last subcarrier cases
|
||||
} else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size
|
||||
|| k == (M_sc_b_SRS - 1)) { // End of OFDM symbol or last subcarrier cases
|
||||
// filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}
|
||||
c16multaddVectRealComplex(filt16_end, &ls_estimated, srs_estimated_channel16, 16);
|
||||
} else { // Middle case
|
||||
@@ -755,18 +862,18 @@ int nr_srs_channel_estimation(
|
||||
// Subcarrier increment
|
||||
subcarrier += K_TC;
|
||||
if (subcarrier >= frame_parms->ofdm_symbol_size) {
|
||||
subcarrier=subcarrier-frame_parms->ofdm_symbol_size;
|
||||
subcarrier = subcarrier - frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
|
||||
} // for (int k = 0; k < M_sc_b_SRS; k++)
|
||||
|
||||
memcpy(&srs_estimated_channel_freq[ant][p_index][0],
|
||||
&srs_est[mem_offset],
|
||||
(frame_parms->ofdm_symbol_size*(1<<srs_pdu->num_symbols))*sizeof(int32_t));
|
||||
(frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols)) * sizeof(int32_t));
|
||||
|
||||
// Compute noise
|
||||
subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0];
|
||||
if (subcarrier>frame_parms->ofdm_symbol_size) {
|
||||
if (subcarrier > frame_parms->ofdm_symbol_size) {
|
||||
subcarrier -= frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
uint16_t base_idx = ant * N_ap * M_sc_b_SRS + p_index * M_sc_b_SRS;
|
||||
@@ -782,23 +889,23 @@ int nr_srs_channel_estimation(
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0];
|
||||
if (subcarrier>frame_parms->ofdm_symbol_size) {
|
||||
if (subcarrier > frame_parms->ofdm_symbol_size) {
|
||||
subcarrier -= frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
|
||||
for (int k = 0; k < K_TC*M_sc_b_SRS; k++) {
|
||||
|
||||
int subcarrier_log = subcarrier-subcarrier_offset;
|
||||
if(subcarrier_log < 0) {
|
||||
for (int k = 0; k < K_TC * M_sc_b_SRS; k++) {
|
||||
int subcarrier_log = subcarrier - subcarrier_offset;
|
||||
if (subcarrier_log < 0) {
|
||||
subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
|
||||
if(subcarrier_log%12 == 0) {
|
||||
LOG_I(NR_PHY,"------------------------------------- %d -------------------------------------\n", subcarrier_log/12);
|
||||
LOG_I(NR_PHY,"\t __lsRe__________lsIm__|____intRe_______intIm__|____noiRe_______noiIm__\n");
|
||||
if (subcarrier_log % 12 == 0) {
|
||||
LOG_I(NR_PHY, "------------------------------------- %d -------------------------------------\n", subcarrier_log / 12);
|
||||
LOG_I(NR_PHY, "\t __lsRe__________lsIm__|____intRe_______intIm__|____noiRe_______noiIm__\n");
|
||||
}
|
||||
|
||||
LOG_I(NR_PHY,"(%4i) %6i\t%6i | %6i\t%6i | %6i\t%6i\n",
|
||||
LOG_I(NR_PHY,
|
||||
"(%4i) %6i\t%6i | %6i\t%6i | %6i\t%6i\n",
|
||||
subcarrier_log,
|
||||
srs_ls_estimated_channel[subcarrier].r,
|
||||
srs_ls_estimated_channel[subcarrier].i,
|
||||
@@ -810,23 +917,23 @@ int nr_srs_channel_estimation(
|
||||
// Subcarrier increment
|
||||
subcarrier++;
|
||||
if (subcarrier >= frame_parms->ofdm_symbol_size) {
|
||||
subcarrier=subcarrier-frame_parms->ofdm_symbol_size;
|
||||
subcarrier = subcarrier - frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Convert to time domain
|
||||
freq2time(gNB->frame_parms.ofdm_symbol_size,
|
||||
(int16_t*) srs_estimated_channel_freq[ant][p_index],
|
||||
(int16_t*) srs_estimated_channel_time[ant][p_index]);
|
||||
(int16_t *)srs_estimated_channel_freq[ant][p_index],
|
||||
(int16_t *)srs_estimated_channel_time[ant][p_index]);
|
||||
|
||||
memcpy(&srs_estimated_channel_time_shifted[ant][p_index][0],
|
||||
&srs_estimated_channel_time[ant][p_index][gNB->frame_parms.ofdm_symbol_size>>1],
|
||||
(gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t));
|
||||
&srs_estimated_channel_time[ant][p_index][gNB->frame_parms.ofdm_symbol_size >> 1],
|
||||
(gNB->frame_parms.ofdm_symbol_size >> 1) * sizeof(int32_t));
|
||||
|
||||
memcpy(&srs_estimated_channel_time_shifted[ant][p_index][gNB->frame_parms.ofdm_symbol_size>>1],
|
||||
memcpy(&srs_estimated_channel_time_shifted[ant][p_index][gNB->frame_parms.ofdm_symbol_size >> 1],
|
||||
&srs_estimated_channel_time[ant][p_index][0],
|
||||
(gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t));
|
||||
(gNB->frame_parms.ofdm_symbol_size >> 1) * sizeof(int32_t));
|
||||
|
||||
} // for (int p_index = 0; p_index < N_ap; p_index++)
|
||||
} // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++)
|
||||
@@ -835,7 +942,7 @@ int nr_srs_channel_estimation(
|
||||
uint32_t signal_power = max(signal_energy_nodc(ch, arr_len), 1);
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_PHY,"signal_power = %u\n", signal_power);
|
||||
LOG_I(NR_PHY, "signal_power = %u\n", signal_power);
|
||||
#endif
|
||||
|
||||
if (signal_power == 0) {
|
||||
@@ -845,14 +952,13 @@ int nr_srs_channel_estimation(
|
||||
|
||||
// Compute noise power
|
||||
const uint8_t srs_symbols_per_rb = srs_pdu->comb_size == 0 ? 6 : 3;
|
||||
const uint8_t n_noise_est = frame_parms->nb_antennas_rx*N_ap*srs_symbols_per_rb;
|
||||
const uint8_t n_noise_est = frame_parms->nb_antennas_rx * N_ap * srs_symbols_per_rb;
|
||||
uint64_t sum_re = 0;
|
||||
uint64_t sum_re2 = 0;
|
||||
uint64_t sum_im = 0;
|
||||
uint64_t sum_im2 = 0;
|
||||
|
||||
for (int rb = 0; rb < m_SRS_b; rb++) {
|
||||
|
||||
sum_re = 0;
|
||||
sum_re2 = 0;
|
||||
sum_im = 0;
|
||||
@@ -870,12 +976,13 @@ int nr_srs_channel_estimation(
|
||||
} // for (int p_index = 0; p_index < N_ap; p_index++)
|
||||
} // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++)
|
||||
|
||||
noise_power_per_rb[rb] = max(sum_re2 / n_noise_est - (sum_re / n_noise_est) * (sum_re / n_noise_est) +
|
||||
sum_im2 / n_noise_est - (sum_im / n_noise_est) * (sum_im / n_noise_est), 1);
|
||||
noise_power_per_rb[rb] = max(sum_re2 / n_noise_est - (sum_re / n_noise_est) * (sum_re / n_noise_est) + sum_im2 / n_noise_est
|
||||
- (sum_im / n_noise_est) * (sum_im / n_noise_est),
|
||||
1);
|
||||
snr_per_rb[rb] = dB_fixed(signal_power) - dB_fixed(noise_power_per_rb[rb]);
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_PHY,"noise_power_per_rb[%i] = %i, snr_per_rb[%i] = %i dB\n", rb, noise_power_per_rb[rb], rb, snr_per_rb[rb]);
|
||||
LOG_I(NR_PHY, "noise_power_per_rb[%i] = %i, snr_per_rb[%i] = %i dB\n", rb, noise_power_per_rb[rb], rb, snr_per_rb[rb]);
|
||||
#endif
|
||||
|
||||
} // for (int rb = 0; rb < m_SRS_b; rb++)
|
||||
@@ -885,7 +992,7 @@ int nr_srs_channel_estimation(
|
||||
*snr = dB_fixed(signal_power) - dB_fixed(noise_power);
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_PHY,"noise_power = %u, SNR = %i dB\n", noise_power, *snr);
|
||||
LOG_I(NR_PHY, "noise_power = %u, SNR = %i dB\n", noise_power, *snr);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1486,14 +1486,16 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
|
||||
int total_res = 0;
|
||||
for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < end_symbol; symbol += numSymbols) {
|
||||
int res_per_task = 0;
|
||||
for (int s = 0; s < numSymbols; s++) {
|
||||
pusch_vars->ul_valid_re_per_slot[symbol+s] = get_nb_re_pusch(frame_parms,rel15_ul,symbol+s);
|
||||
pusch_vars->llr_offset[symbol+s] = ((symbol+s) == rel15_ul->start_symbol_index) ?
|
||||
0 :
|
||||
pusch_vars->llr_offset[symbol+s-1] + pusch_vars->ul_valid_re_per_slot[symbol+s-1] * rel15_ul->qam_mod_order;
|
||||
total_res+=pusch_vars->ul_valid_re_per_slot[symbol+s];
|
||||
res_per_task += pusch_vars->ul_valid_re_per_slot[symbol + s];
|
||||
}
|
||||
if (total_res > 0) {
|
||||
total_res += res_per_task;
|
||||
if (res_per_task > 0) {
|
||||
union puschSymbolReqUnion id = {.s={ulsch_id,frame,slot,0}};
|
||||
id.p=1+symbol;
|
||||
notifiedFIFO_elt_t *req = newNotifiedFIFO_elt(sizeof(puschSymbolProc_t), id.p, &gNB->respPuschSymb, &nr_pusch_symbol_processing); // create a job for Tpool
|
||||
|
||||
@@ -285,7 +285,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
// HARQ stats
|
||||
phy_vars_ue->dl_stats[harq_process->DLround]++;
|
||||
LOG_D(PHY, "Round %d RV idx %d\n", harq_process->DLround, dlsch->dlsch_config.rv);
|
||||
uint16_t nb_rb;// = 30;
|
||||
uint8_t dmrs_Type = dlsch->dlsch_config.dmrsConfigType;
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#include "common/platform_constants.h"
|
||||
#include "nr_phy_common.h"
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
#include "PHY/phy_extern.h"
|
||||
|
||||
@@ -200,13 +200,6 @@ int nr_rx_pbch(PHY_VARS_NR_UE *ue,
|
||||
#define modOrder(I_MCS,I_TBS) ((I_MCS-I_TBS)*2+2) // Find modulation order from I_TBS and I_MCS
|
||||
#endif
|
||||
|
||||
int dump_ue_stats(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
char *buffer,
|
||||
int length,
|
||||
runmode_t mode,
|
||||
int input_level_dBm);
|
||||
|
||||
/*!
|
||||
\brief This function performs the initial cell search procedure - PSS detection, SSS detection and PBCH detection. At the
|
||||
end, the basic frame parameters are known (Frame configuration - TDD/FDD and cyclic prefix length,
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#ifndef __PHY_DEFS_GNB__H__
|
||||
#define __PHY_DEFS_GNB__H__
|
||||
|
||||
#include "common/platform_constants.h"
|
||||
#include "defs_nr_common.h"
|
||||
#include "CODING/nrPolar_tools/nr_polar_pbch_defs.h"
|
||||
#include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h"
|
||||
@@ -543,6 +544,7 @@ typedef struct PHY_VARS_gNB_s {
|
||||
time_stats_t ulsch_decoding_stats;
|
||||
time_stats_t ulsch_deinterleaving_stats;
|
||||
time_stats_t ulsch_channel_estimation_stats;
|
||||
time_stats_t pusch_channel_estimation_antenna_processing_stats;
|
||||
time_stats_t ulsch_llr_stats;
|
||||
time_stats_t rx_srs_stats;
|
||||
time_stats_t generate_srs_stats;
|
||||
@@ -562,7 +564,10 @@ typedef struct PHY_VARS_gNB_s {
|
||||
notifiedFIFO_t L1_rx_out;
|
||||
notifiedFIFO_t resp_RU_tx;
|
||||
tpool_t threadPool;
|
||||
int nbSymb;
|
||||
int nbAarx;
|
||||
int num_pusch_symbols_per_thread;
|
||||
int dmrs_num_antennas_per_thread;
|
||||
pthread_t L1_rx_thread;
|
||||
int L1_rx_thread_core;
|
||||
pthread_t L1_tx_thread;
|
||||
@@ -585,6 +590,37 @@ union puschSymbolReqUnion {
|
||||
uint64_t p;
|
||||
};
|
||||
|
||||
typedef struct puschAntennaProc_s {
|
||||
unsigned char Ns;
|
||||
int nl;
|
||||
unsigned short p;
|
||||
unsigned char symbol;
|
||||
unsigned short bwp_start_subcarrier;
|
||||
int aarx;
|
||||
int beam_nb;
|
||||
int numAntennas;
|
||||
nfapi_nr_pusch_pdu_t *pusch_pdu;
|
||||
int *max_ch;
|
||||
c16_t *pilot;
|
||||
int *nest_count;
|
||||
uint64_t *noise_amp2;
|
||||
delay_t *delay;
|
||||
int chest_freq;
|
||||
NR_gNB_PUSCH *pusch_vars;
|
||||
NR_DL_FRAME_PARMS *frame_parms;
|
||||
c16_t ***rxdataF;
|
||||
} puschAntennaProc_t;
|
||||
|
||||
struct puschAntennaReqId {
|
||||
uint16_t ul_id;
|
||||
uint16_t spare;
|
||||
} __attribute__((packed));
|
||||
|
||||
union puschAntennaReqUnion {
|
||||
struct puschAntennaReqId s;
|
||||
uint64_t p;
|
||||
};
|
||||
|
||||
typedef struct LDPCDecode_s {
|
||||
PHY_VARS_gNB *gNB;
|
||||
NR_UL_gNB_HARQ_t *ulsch_harq;
|
||||
|
||||
@@ -520,8 +520,6 @@ typedef struct PHY_VARS_NR_UE_s {
|
||||
SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
|
||||
SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
|
||||
#endif
|
||||
int dl_errors;
|
||||
_Atomic(int) dl_stats[16];
|
||||
void* scopeData;
|
||||
// Pointers to hold PDSCH data only for phy simulators
|
||||
void *phy_sim_rxdataF;
|
||||
|
||||
@@ -1010,22 +1010,6 @@ int pbch_pdcch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_
|
||||
} // for rsc_id
|
||||
} // for gNB_id
|
||||
|
||||
if ((frame_rx%64 == 0) && (nr_slot_rx==0)) {
|
||||
LOG_I(NR_PHY,"============================================\n");
|
||||
// fixed text + 8 HARQs rounds à 10 ("999999999/") + NULL
|
||||
// if we use 999999999 HARQs, that should be sufficient for at least 138 hours
|
||||
const size_t harq_output_len = 31 + 10 * 8 + 1;
|
||||
char output[harq_output_len];
|
||||
char *p = output;
|
||||
const char *end = output + harq_output_len;
|
||||
p += snprintf(p, end - p, "[UE %d] Harq round stats for Downlink: %d", ue->Mod_id, ue->dl_stats[0]);
|
||||
for (int round = 1; round < 16 && (round < 3 || ue->dl_stats[round] != 0); ++round)
|
||||
p += snprintf(p, end - p,"/%d", ue->dl_stats[round]);
|
||||
LOG_I(NR_PHY,"%s\n", output);
|
||||
|
||||
LOG_I(NR_PHY,"============================================\n");
|
||||
}
|
||||
|
||||
LOG_D(PHY," ------ --> PDCCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH, VCD_FUNCTION_IN);
|
||||
|
||||
|
||||
@@ -19,59 +19,81 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#include "common/ran_context.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "common/utils/assertions.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "common/utils/var_array.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||
#include "executables/nr-uesoftmodem.h"
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "LAYER2/NR_MAC_UE/mac_defs.h"
|
||||
#include "LAYER2/NR_MAC_UE/mac_extern.h"
|
||||
#include "PHY/defs_gNB.h"
|
||||
#include "PHY/defs_nr_common.h"
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
#include "PHY/phy_vars_nr_ue.h"
|
||||
#include "PHY/types.h"
|
||||
#include "LAYER2/NR_MAC_UE/mac_proto.h"
|
||||
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
|
||||
#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||
#include "NR_BCCH-BCH-Message.h"
|
||||
#include "NR_BWP-Downlink.h"
|
||||
#include "NR_CellGroupConfig.h"
|
||||
#include "NR_MAC_COMMON/nr_mac.h"
|
||||
#include "NR_MAC_COMMON/nr_mac_common.h"
|
||||
#include "NR_PHY_INTERFACE/NR_IF_Module.h"
|
||||
#include "NR_ReconfigurationWithSync.h"
|
||||
#include "NR_ServingCellConfig.h"
|
||||
#include "NR_SetupRelease.h"
|
||||
#include "NR_UE_PHY_INTERFACE/NR_IF_Module.h"
|
||||
#include "PHY/CODING/nrLDPC_extern.h"
|
||||
#include "PHY/INIT/nr_phy_init.h"
|
||||
#include "PHY/MODULATION/modulation_eNB.h"
|
||||
#include "PHY/MODULATION/nr_modulation.h"
|
||||
#include "PHY/MODULATION/modulation_UE.h"
|
||||
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
||||
#include "PHY/MODULATION/modulation_common.h"
|
||||
#include "PHY/NR_REFSIG/ptrs_nr.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
|
||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
|
||||
#include "PHY/TOOLS/tools_defs.h"
|
||||
#include "PHY/defs_RU.h"
|
||||
#include "PHY/defs_common.h"
|
||||
#include "PHY/defs_gNB.h"
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
#include "PHY/defs_nr_common.h"
|
||||
#include "PHY/impl_defs_nr.h"
|
||||
#include "PHY/phy_vars_nr_ue.h"
|
||||
#include "RRC/NR/nr_rrc_config.h"
|
||||
#include "RRC/NR/nr_rrc_proto.h"
|
||||
#include "SCHED_NR/fapi_nr_l1.h"
|
||||
#include "SCHED_NR/sched_nr.h"
|
||||
#include "SCHED_NR_UE/defs.h"
|
||||
#include "SCHED_NR_UE/fapi_nr_ue_l1.h"
|
||||
#include "NR_PHY_INTERFACE/NR_IF_Module.h"
|
||||
#include "NR_UE_PHY_INTERFACE/NR_IF_Module.h"
|
||||
|
||||
#include "LAYER2/NR_MAC_UE/mac_proto.h"
|
||||
#include "LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
|
||||
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "NR_asn_constant.h"
|
||||
#include "RRC/NR/nr_rrc_config.h"
|
||||
#include "openair1/SIMULATION/RF/rf.h"
|
||||
#include "openair1/SIMULATION/TOOLS/sim.h"
|
||||
#include "T.h"
|
||||
#include "asn_internal.h"
|
||||
#include "assertions.h"
|
||||
#include "common/config/config_load_configmodule.h"
|
||||
#include "common/ngran_types.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "common/utils/T/T.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "common/utils/var_array.h"
|
||||
#include "common_lib.h"
|
||||
#include "e1ap_messages_types.h"
|
||||
#include "fapi_nr_ue_interface.h"
|
||||
#include "nfapi_interface.h"
|
||||
#include "nfapi_nr_interface.h"
|
||||
#include "nfapi_nr_interface_scf.h"
|
||||
#include "nr_ue_phy_meas.h"
|
||||
#include "oai_asn1.h"
|
||||
#include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
|
||||
#include "PHY/NR_REFSIG/ptrs_nr.h"
|
||||
#include "NR_RRCReconfiguration.h"
|
||||
#include "openair1/SIMULATION/TOOLS/sim.h"
|
||||
#include "openair2/RRC/LTE/rrc_vars.h"
|
||||
#include "softmodem-bits.h"
|
||||
#include "thread-pool.h"
|
||||
#include "time_meas.h"
|
||||
#include "utils.h"
|
||||
#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
|
||||
#include "SIMULATION/LTE_PHY/common_sim.h"
|
||||
#include "PHY/NR_REFSIG/dmrs_nr.h"
|
||||
|
||||
#include <openair2/RRC/LTE/rrc_vars.h>
|
||||
|
||||
#include <executables/softmodem-common.h>
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
#include <executables/nr-uesoftmodem.h>
|
||||
|
||||
const char *__asan_default_options()
|
||||
{
|
||||
|
||||
@@ -19,40 +19,54 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "common/utils/assertions.h"
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "common/platform_types.h"
|
||||
#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h"
|
||||
#include "NR_PHY_INTERFACE/NR_IF_Module.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "common/utils/load_module_shlib.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common/ran_context.h"
|
||||
|
||||
#include "SIMULATION/TOOLS/sim.h"
|
||||
#include "SIMULATION/RF/rf.h"
|
||||
#include "PHY/types.h"
|
||||
#include "PHY/defs_gNB.h"
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
#include "SCHED_NR/sched_nr.h"
|
||||
#include "SCHED_NR_UE/phy_frame_config_nr.h"
|
||||
#include "PHY/phy_vars_nr_ue.h"
|
||||
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
||||
#include "PHY/MODULATION/nr_modulation.h"
|
||||
#include "PHY/MODULATION/modulation_eNB.h"
|
||||
#include "PHY/MODULATION/modulation_UE.h"
|
||||
#include "PHY/INIT/nr_phy_init.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||
#include "PHY/MODULATION/nr_modulation.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
||||
#include "nr_unitary_defs.h"
|
||||
#include <openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h>
|
||||
#include <openair2/RRC/LTE/rrc_vars.h>
|
||||
#include <executables/softmodem-common.h>
|
||||
#include <openair2/RRC/NR_UE/rrc_defs.h>
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
#include "openair2/RRC/LTE/rrc_vars.h"
|
||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
|
||||
#include "PHY/TOOLS/tools_defs.h"
|
||||
#include "PHY/defs_RU.h"
|
||||
#include "PHY/defs_common.h"
|
||||
#include "PHY/defs_gNB.h"
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
#include "PHY/defs_nr_common.h"
|
||||
#include "PHY/impl_defs_nr.h"
|
||||
#include "PHY/phy_vars_nr_ue.h"
|
||||
#include "SCHED_NR/phy_frame_config_nr.h"
|
||||
#include "SCHED_NR/sched_nr.h"
|
||||
#include "SIMULATION/TOOLS/sim.h"
|
||||
#include "T.h"
|
||||
#include "assertions.h"
|
||||
#include "common/config/config_load_configmodule.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common/utils/T/T.h"
|
||||
#include "common/utils/load_module_shlib.h"
|
||||
#include "common_lib.h"
|
||||
#include "defs.h"
|
||||
#include "executables/nr-uesoftmodem.h"
|
||||
#include "fapi_nr_ue_interface.h"
|
||||
#include "nfapi/oai_integration/vendor_ext.h"
|
||||
#include "nfapi_interface.h"
|
||||
#include "nfapi_nr_interface_scf.h"
|
||||
#include "nr_common.h"
|
||||
#include "time_meas.h"
|
||||
|
||||
#define NR_PRACH_DEBUG 1
|
||||
#define PRACH_WRITE_OUTPUT_DEBUG 1
|
||||
|
||||
@@ -19,54 +19,80 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
#include "common/ran_context.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <bits/getopt_core.h>
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "common/utils/var_array.h"
|
||||
#include "PHY/defs_gNB.h"
|
||||
#include "PHY/defs_nr_common.h"
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
#include "PHY/phy_vars_nr_ue.h"
|
||||
#include "PHY/types.h"
|
||||
#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
|
||||
#include "SIMULATION/LTE_PHY/common_sim.h"
|
||||
#include "openair2/RRC/LTE/rrc_vars.h"
|
||||
#include "common/utils/assertions.h"
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "NR_BCCH-BCH-Message.h"
|
||||
#include "NR_IF_Module.h"
|
||||
#include "NR_MAC_COMMON/nr_mac.h"
|
||||
#include "NR_MAC_COMMON/nr_mac_common.h"
|
||||
#include "NR_MAC_UE/mac_defs.h"
|
||||
#include "NR_MAC_gNB/nr_mac_gNB.h"
|
||||
#include "NR_PHY_INTERFACE/NR_IF_Module.h"
|
||||
#include "NR_ReconfigurationWithSync.h"
|
||||
#include "NR_ServingCellConfig.h"
|
||||
#include "NR_UE-NR-Capability.h"
|
||||
#include "PHY/CODING/nrLDPC_extern.h"
|
||||
#include "PHY/INIT/nr_phy_init.h"
|
||||
#include "PHY/MODULATION/modulation_UE.h"
|
||||
#include "PHY/MODULATION/nr_modulation.h"
|
||||
#include "PHY/NR_REFSIG/dmrs_nr.h"
|
||||
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||
#include "PHY/NR_REFSIG/ptrs_nr.h"
|
||||
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
|
||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
|
||||
#include "PHY/TOOLS/tools_defs.h"
|
||||
#include "PHY/defs_RU.h"
|
||||
#include "PHY/defs_common.h"
|
||||
#include "PHY/defs_gNB.h"
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
#include "PHY/defs_nr_common.h"
|
||||
#include "PHY/impl_defs_nr.h"
|
||||
#include "PHY/phy_vars_nr_ue.h"
|
||||
#include "SCHED_NR/fapi_nr_l1.h"
|
||||
#include "SCHED_NR/sched_nr.h"
|
||||
#include "SCHED_NR_UE/defs.h"
|
||||
#include "SCHED_NR_UE/fapi_nr_ue_l1.h"
|
||||
#include "openair1/SIMULATION/TOOLS/sim.h"
|
||||
#include "openair1/SIMULATION/RF/rf.h"
|
||||
#include "asn_internal.h"
|
||||
#include "assertions.h"
|
||||
#include "common/config/config_load_configmodule.h"
|
||||
#include "common/ngran_types.h"
|
||||
#include "common/openairinterface5g_limits.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common/utils/T/T.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "common/utils/threadPool/thread-pool.h"
|
||||
#include "common/utils/var_array.h"
|
||||
#include "common_lib.h"
|
||||
#include "e1ap_messages_types.h"
|
||||
#include "executables/nr-uesoftmodem.h"
|
||||
#include "fapi_nr_ue_constants.h"
|
||||
#include "fapi_nr_ue_interface.h"
|
||||
#include "nfapi_interface.h"
|
||||
#include "nfapi_nr_interface_scf.h"
|
||||
#include "nr_ue_phy_meas.h"
|
||||
#include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
|
||||
#include "openair2/RRC/NR/nr_rrc_config.h"
|
||||
#include "openair1/SIMULATION/TOOLS/sim.h"
|
||||
#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "common/utils/threadPool/thread-pool.h"
|
||||
#include "PHY/NR_REFSIG/ptrs_nr.h"
|
||||
#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
|
||||
#include "SIMULATION/LTE_PHY/common_sim.h"
|
||||
#include "openair2/RRC/NR/nr_rrc_config.h"
|
||||
#include "time_meas.h"
|
||||
#include "utils.h"
|
||||
|
||||
#include <openair2/RRC/LTE/rrc_vars.h>
|
||||
|
||||
#include <executables/softmodem-common.h>
|
||||
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
#include "executables/nr-uesoftmodem.h"
|
||||
//#define DEBUG_ULSIM
|
||||
|
||||
const char *__asan_default_options()
|
||||
@@ -213,6 +239,7 @@ int main(int argc, char *argv[])
|
||||
int params_from_file = 0;
|
||||
int threadCnt=0;
|
||||
int max_ldpc_iterations = 5;
|
||||
int num_antennas_per_thread = 1;
|
||||
if ((uniqCfg = load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY)) == 0) {
|
||||
exit_fun("[NR_ULSIM] Error, configuration module init failed\n");
|
||||
}
|
||||
@@ -224,7 +251,7 @@ int main(int argc, char *argv[])
|
||||
InitSinLUT();
|
||||
|
||||
int c;
|
||||
while ((c = getopt(argc, argv, "--:O:a:b:c:d:ef:g:h:i:k:m:n:op:q:r:s:t:u:v:w:y:z:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:E:X:")) != -1) {
|
||||
while ((c = getopt(argc, argv, "--:O:a:b:c:d:ef:g:h:i:k:m:n:op:q:r:s:t:u:v:w:y:z:A:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:E:X:")) != -1) {
|
||||
|
||||
/* ignore long options starting with '--', option '-O' and their arguments that are handled by configmodule */
|
||||
/* with this opstring getopt returns 1 for non-option arguments, refer to 'man 3 getopt' */
|
||||
@@ -395,6 +422,10 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
break;
|
||||
|
||||
case 'A':
|
||||
num_antennas_per_thread = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
input_fd = fopen(optarg, "r");
|
||||
if (input_fd == NULL) {
|
||||
@@ -512,6 +543,7 @@ int main(int argc, char *argv[])
|
||||
printf("-w Start PRB for PUSCH\n");
|
||||
printf("-y Number of TX antennas used at UE\n");
|
||||
printf("-z Number of RX antennas used at gNB\n");
|
||||
printf("-A Number of antennas per thread for PUSCH channel estimation\n");
|
||||
printf("-C Specify the number of threads for the simulation\n");
|
||||
printf("-E {SRS: [0] Disabled, [1] Enabled} e.g. -E 1\n");
|
||||
printf("-F Input filename (.txt format) for RX conformance testing\n");
|
||||
@@ -559,6 +591,7 @@ int main(int argc, char *argv[])
|
||||
gNB = RC.gNB[0];
|
||||
gNB->ofdm_offset_divisor = UINT_MAX;
|
||||
gNB->num_pusch_symbols_per_thread = 1;
|
||||
gNB->dmrs_num_antennas_per_thread = num_antennas_per_thread;
|
||||
gNB->RU_list[0] = calloc(1, sizeof(**gNB->RU_list));
|
||||
gNB->RU_list[0]->rfdevice.openair0_cfg = openair0_cfg;
|
||||
|
||||
@@ -952,6 +985,7 @@ int main(int argc, char *argv[])
|
||||
reset_meas(&gNB->rx_pusch_symbol_processing_stats);
|
||||
reset_meas(&gNB->ulsch_decoding_stats);
|
||||
reset_meas(&gNB->ulsch_channel_estimation_stats);
|
||||
reset_meas(&gNB->pusch_channel_estimation_antenna_processing_stats);
|
||||
reset_meas(&gNB->rx_srs_stats);
|
||||
reset_meas(&gNB->generate_srs_stats);
|
||||
reset_meas(&gNB->get_srs_signal_stats);
|
||||
@@ -1512,6 +1546,7 @@ int main(int argc, char *argv[])
|
||||
printDistribution(&gNB->phy_proc_rx,table_rx, "Total PHY proc rx");
|
||||
printStatIndent(&gNB->rx_pusch_stats, "RX PUSCH time");
|
||||
printStatIndent2(&gNB->ulsch_channel_estimation_stats, "ULSCH channel estimation time");
|
||||
printStatIndent3(&gNB->pusch_channel_estimation_antenna_processing_stats, "Antenna Processing time");
|
||||
printStatIndent2(&gNB->rx_pusch_init_stats, "RX PUSCH Initialization time");
|
||||
printStatIndent2(&gNB->rx_pusch_symbol_processing_stats, "RX PUSCH Symbol Processing time");
|
||||
printStatIndent(&gNB->ulsch_decoding_stats,"ULSCH total decoding time");
|
||||
|
||||
@@ -180,7 +180,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
|
||||
}
|
||||
|
||||
/* set a tx slot with no ack */
|
||||
NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
|
||||
|
||||
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
|
||||
|
||||
@@ -267,7 +267,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_
|
||||
common_pucch_configuration(ue, gNB_id, TST_PUCCH_COMMON_CONFIG_INDEX_OK);
|
||||
|
||||
/* set a tx slot with no ack */
|
||||
NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
|
||||
|
||||
harq_status->ack = DL_ACK;
|
||||
|
||||
@@ -557,7 +557,7 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
|
||||
int reset_harq = false;
|
||||
int dl_harq_pid[TST_NB_STEP_SINGLE_TRANSPORT_BLOCK] = {TST_DL_HARQ_PID_FIRST, TST_DL_HARQ_PID_SECOND, TST_DL_HARQ_PID_THIRD, TST_DL_HARQ_PID_FOURTH };
|
||||
int pucch_resource_indicator[TST_NB_STEP_SINGLE_TRANSPORT_BLOCK][2] = { { 0, 4 }, { 1, 0 } , { 1, 3 } , { 5, 7 } };
|
||||
NR_UE_HARQ_STATUS_t *harq_status;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status;
|
||||
|
||||
ue->PDSCH_Config.maxNrofCodeWordsScheduledByDCI = nb_code_n1;
|
||||
|
||||
@@ -584,7 +584,7 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
|
||||
/* set a tx slot with no ack */
|
||||
ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = dl_harq_pid[i];
|
||||
|
||||
NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
|
||||
|
||||
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
|
||||
harq_status->send_harq_status = 1;
|
||||
@@ -618,7 +618,7 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
|
||||
/* set a tx slot with no ack */
|
||||
ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = dl_harq_pid[i];
|
||||
|
||||
NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
|
||||
|
||||
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
|
||||
harq_status->send_harq_status = 1;
|
||||
@@ -662,7 +662,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
|
||||
int reset_harq = false;
|
||||
int dl_harq_pid[TST_NB_STEP_TWO_TRANSPORT_BLOCKS] = {TST_DL_HARQ_PID_FIRST, TST_DL_HARQ_PID_SECOND, TST_DL_HARQ_PID_THIRD, TST_DL_HARQ_PID_FOURTH };
|
||||
int pucch_resource_indicator[TST_NB_STEP_TWO_TRANSPORT_BLOCKS][2] = { { 0, 1 }, { 3, 7 } , { 2 , 4 } , { 4 , 6 } };
|
||||
NR_UE_HARQ_STATUS_t *harq_status;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status;
|
||||
int TB_identifier = 1;
|
||||
int thread_number = TST_THREAD_ID;
|
||||
|
||||
@@ -682,7 +682,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
|
||||
/* set a tx slot with no ack */
|
||||
ue->dlsch[proc->thread_id][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
|
||||
|
||||
NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
|
||||
|
||||
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
|
||||
harq_status->send_harq_status = 1;
|
||||
@@ -725,7 +725,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
|
||||
/* set a tx slot with no ack */
|
||||
ue->dlsch[proc->thread_id][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
|
||||
|
||||
NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
|
||||
|
||||
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
|
||||
harq_status->send_harq_status = 1;
|
||||
@@ -759,7 +759,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
|
||||
/* set a tx slot with no ack */
|
||||
ue->dlsch[proc->thread_id][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
|
||||
|
||||
NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
|
||||
|
||||
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
|
||||
harq_status->send_harq_status = 1;
|
||||
@@ -973,7 +973,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro
|
||||
|
||||
/* set a first harq ack context */
|
||||
|
||||
NR_UE_HARQ_STATUS_t *harq_status;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status;
|
||||
|
||||
ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
|
||||
|
||||
@@ -1085,7 +1085,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
|
||||
|
||||
/* set a first harq ack context */
|
||||
|
||||
NR_UE_HARQ_STATUS_t *harq_status;
|
||||
NR_UE_DL_HARQ_STATUS_t *harq_status;
|
||||
|
||||
ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include "LTE_asn_constant.h"
|
||||
#include "NR_asn_constant.h"
|
||||
#include "s1ap_messages_types.h"
|
||||
|
||||
#define GTPV1U_MAX_BEARERS_PER_UE max_val_LTE_DRB_Identity
|
||||
#define NR_GTPV1U_MAX_BEARERS_PER_UE max_val_NR_DRB_Identity
|
||||
@@ -170,13 +171,10 @@ typedef struct {
|
||||
typedef struct gtpv1u_gnb_create_tunnel_req_s {
|
||||
ue_id_t ue_id;
|
||||
int num_tunnels;
|
||||
//teid_t upf_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE]; ///< Tunnel Endpoint Identifier
|
||||
teid_t outgoing_teid[NR_GTPV1U_MAX_BEARERS_PER_UE];
|
||||
int outgoing_qfi[NR_GTPV1U_MAX_BEARERS_PER_UE];
|
||||
pdusessionid_t pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
|
||||
ebi_t incoming_rb_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
|
||||
//ebi_t outgoing_rb_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
|
||||
//transport_layer_addr_t upf_addr[NR_GTPV1U_MAX_BEARERS_PER_UE];
|
||||
transport_layer_addr_t dst_addr[NR_GTPV1U_MAX_BEARERS_PER_UE];
|
||||
} gtpv1u_gnb_create_tunnel_req_t;
|
||||
|
||||
|
||||
@@ -32,11 +32,9 @@
|
||||
#include "common/platform_constants.h"
|
||||
#include "common/platform_types.h"
|
||||
#include "common/5g_platform_types.h"
|
||||
#include "LTE_asn_constant.h"
|
||||
#include "s1ap_messages_types.h"
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
// Defines to access message fields.
|
||||
|
||||
// Defines to access message fields.
|
||||
#define NGAP_REGISTER_GNB_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_register_gnb_req
|
||||
|
||||
#define NGAP_REGISTER_GNB_CNF(mSGpTR) (mSGpTR)->ittiMsg.ngap_register_gnb_cnf
|
||||
@@ -72,10 +70,9 @@
|
||||
#define NGAP_PDUSESSION_RELEASE_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_release_resp
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
/* Maximum number of e-rabs to be setup/deleted in a single message.
|
||||
* Even if only one bearer will be modified by message.
|
||||
*/
|
||||
#define NGAP_MAX_PDUSESSION (LTE_maxDRB + 3)
|
||||
|
||||
// maxnoofPDUSessions in 3GPP TS 38.413
|
||||
#define NGAP_MAX_PDUSESSION 16 // 256 according to specs
|
||||
|
||||
/* Length of the transport layer address string
|
||||
* 160 bits / 8 bits by char.
|
||||
|
||||
@@ -224,16 +224,6 @@ typedef struct nas_pdu_s {
|
||||
uint32_t length;
|
||||
} nas_pdu_t, ue_radio_cap_t;
|
||||
|
||||
typedef struct transport_layer_addr_s {
|
||||
/* Length of the transport layer address buffer in bits. S1AP layer received a
|
||||
* bit string<1..160> containing one of the following addresses: ipv4,
|
||||
* ipv6, or ipv4 and ipv6. The layer doesn't interpret the buffer but
|
||||
* silently forward it to S1-U.
|
||||
*/
|
||||
uint8_t length;
|
||||
uint8_t buffer[20]; // in network byte order
|
||||
} transport_layer_addr_t;
|
||||
|
||||
#define TRANSPORT_LAYER_ADDR_COPY(dEST,sOURCE) \
|
||||
do { \
|
||||
AssertFatal(sOURCE.len <= 20); \
|
||||
|
||||
@@ -93,5 +93,7 @@ void read_gtp_setup_sm(void* data)
|
||||
sm_ag_if_ans_t write_ctrl_gtp_sm(void const* src)
|
||||
{
|
||||
assert(src != NULL);
|
||||
assert(0 !=0 && "Not supported");
|
||||
printf("write_ctrl callback for GTP SM: operation not supported\n");
|
||||
sm_ag_if_ans_t ans = {0};
|
||||
return ans;
|
||||
}
|
||||
|
||||
@@ -123,6 +123,8 @@ void read_mac_setup_sm(void* data)
|
||||
sm_ag_if_ans_t write_ctrl_mac_sm(void const* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(0 !=0 && "Not supported");
|
||||
printf("write_ctrl callback for MAC SM: operation not supported\n");
|
||||
sm_ag_if_ans_t ans = {0};
|
||||
return ans;
|
||||
}
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@ sm_ag_if_ans_t write_ctrl_pdcp_sm(void const* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
// assert(data->type == PDCP_CTRL_REQ_V0 );
|
||||
assert(0 !=0 && "Not supported");
|
||||
printf("write_ctrl callback for PDCP SM: operation not supported\n");
|
||||
sm_ag_if_ans_t ans = {0};
|
||||
return ans;
|
||||
}
|
||||
|
||||
@@ -174,6 +174,8 @@ void read_rlc_setup_sm(void* data)
|
||||
sm_ag_if_ans_t write_ctrl_rlc_sm(void const* data)
|
||||
{
|
||||
(void)data;
|
||||
assert(0!=0 && "Not supported");
|
||||
printf("write_ctrl callback for RLC SM: operation not supported\n");
|
||||
sm_ag_if_ans_t ans = {0};
|
||||
return ans;
|
||||
}
|
||||
|
||||
|
||||
@@ -537,7 +537,7 @@ void read_kpm_setup_sm(void* e2ap)
|
||||
|
||||
sm_ag_if_ans_t write_ctrl_kpm_sm(void const* src)
|
||||
{
|
||||
assert(0 !=0 && "Not supported");
|
||||
printf("write_ctrl callback for KPM SM: operation not supported\n");
|
||||
(void)src;
|
||||
sm_ag_if_ans_t ans = {0};
|
||||
return ans;
|
||||
|
||||
@@ -59,6 +59,8 @@
|
||||
#define HLP_L1TX_BO "Backoff from full-scale output at the L1 entity(frequency domain), ex. 12 would corresponding to 14-bit input level (6 dB/bit). Default 36 dBFS for OAI RU entity"
|
||||
#define CONFIG_STRING_L1_PHASE_COMP "phase_compensation"
|
||||
#define HLP_L1_PHASE_COMP "Apply NR symbolwise phase rotation"
|
||||
#define CONFIG_STRING_NUM_ANTENNAS_PER_THREAD "dmrs_num_antennas_per_thread"
|
||||
#define HLP_NUM_ARX "Number of antennas per thread for PUSCH channel estimation"
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* L1 configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
@@ -84,6 +86,7 @@
|
||||
{CONFIG_STRING_L1_TX_THREAD_CORE, NULL, 0, .uptr=NULL, .defintval=-1, TYPE_UINT, 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}, \
|
||||
}
|
||||
// clang-format on
|
||||
#define L1_CC_IDX 0
|
||||
@@ -105,6 +108,7 @@
|
||||
#define L1_TX_THREAD_CORE 16
|
||||
#define L1_TX_AMP_BACKOFF_dB 17
|
||||
#define L1_PHASE_COMP 18
|
||||
#define NUM_ANTENNAS_PER_THREAD 19
|
||||
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#endif
|
||||
|
||||
@@ -27,27 +27,64 @@
|
||||
EMAIL : Lionel.Gauthier@eurecom.fr, navid.nikaein@eurecom.fr, kroempa@gmail.com
|
||||
*/
|
||||
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "gnb_config.h"
|
||||
#include "enb_paramdef.h"
|
||||
#include "UTIL/OTG/otg.h"
|
||||
#include "sctp_default_values.h"
|
||||
#include "f1ap_common.h"
|
||||
#include "PHY/INIT/nr_phy_init.h"
|
||||
#include "radio/ETHERNET/ethernet_lib.h"
|
||||
#include "nfapi_vnf.h"
|
||||
#include "nfapi_pnf.h"
|
||||
#include "prs_nr_paramdef.h"
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
#include "BIT_STRING.h"
|
||||
#include "L1_nr_paramdef.h"
|
||||
#include "MACRLC_nr_paramdef.h"
|
||||
#include "gnb_paramdef.h"
|
||||
#include "NR_MAC_gNB/mac_proto.h"
|
||||
#include "PHY/INIT/nr_phy_init.h"
|
||||
#include "PHY/defs_common.h"
|
||||
#include "PHY/defs_gNB.h"
|
||||
#include "PHY/defs_nr_common.h"
|
||||
#include "RRC/NR/nr_rrc_config.h"
|
||||
#include "RRC/NR/nr_rrc_extern.h"
|
||||
#include "RRC_nr_paramsvalues.h"
|
||||
#include "T.h"
|
||||
#include "asn_SEQUENCE_OF.h"
|
||||
#include "asn_codecs.h"
|
||||
#include "asn_internal.h"
|
||||
#include "NR_MAC_gNB/nr_mac_gNB.h"
|
||||
#include "NR_MAC_gNB/mac_proto.h"
|
||||
#include "common/5g_platform_types.h"
|
||||
#include "common/config/config_paramdesc.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "common/openairinterface5g_limits.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "common/utils/T/T.h"
|
||||
#include "common_lib.h"
|
||||
#include "constr_TYPE.h"
|
||||
#include "enb_paramdef.h"
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "f1ap_common.h"
|
||||
#include "gnb_paramdef.h"
|
||||
#include "lib/f1ap_interface_management.h"
|
||||
#include "nfapi/oai_integration/vendor_ext.h"
|
||||
#include "nfapi_pnf.h"
|
||||
#include "nfapi_vnf.h"
|
||||
#include "ngap_gNB.h"
|
||||
#include "ngap_messages_types.h"
|
||||
#include "nr_common.h"
|
||||
#include "oai_asn1.h"
|
||||
#include "openair1/PHY/defs_common.h"
|
||||
#include "prs_nr_paramdef.h"
|
||||
#include "radio/ETHERNET/if_defs.h"
|
||||
#include "rrc_messages_types.h"
|
||||
#include "s1ap_messages_types.h"
|
||||
#include "sctp_default_values.h"
|
||||
#include "seq_arr.h"
|
||||
#include "uper_encoder.h"
|
||||
#include "utils.h"
|
||||
#include "x2ap_messages_types.h"
|
||||
#ifdef ENABLE_AERIAL
|
||||
#include "nfapi/oai_integration/aerial/fapi_vnf_p5.h"
|
||||
#endif
|
||||
#include "lib/f1ap_interface_management.h"
|
||||
|
||||
static int DEFBANDS[] = {7};
|
||||
static int DEFENBS[] = {0};
|
||||
@@ -914,6 +951,7 @@ void RCconfig_NR_L1(void)
|
||||
LOG_I(NR_PHY, "L1_RX_THREAD_CORE %d (%d)\n", *(L1_ParamList.paramarray[j][L1_RX_THREAD_CORE].iptr), L1_RX_THREAD_CORE);
|
||||
gNB->TX_AMP = (int16_t)(32767.0 / pow(10.0, .05 * (double)(*L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr)));
|
||||
gNB->phase_comp = *L1_ParamList.paramarray[j][L1_PHASE_COMP].uptr;
|
||||
gNB->dmrs_num_antennas_per_thread = *(L1_ParamList.paramarray[j][NUM_ANTENNAS_PER_THREAD].uptr);
|
||||
LOG_I(NR_PHY, "TX_AMP = %d (-%d dBFS)\n", gNB->TX_AMP, *L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr);
|
||||
AssertFatal(gNB->TX_AMP > 300, "TX_AMP is too small, must be larger than 300 (is %d)\n", gNB->TX_AMP);
|
||||
// Midhaul configuration
|
||||
|
||||
@@ -29,23 +29,13 @@
|
||||
|
||||
#ifndef GNB_CONFIG_H_
|
||||
#define GNB_CONFIG_H_
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <libconfig.h>
|
||||
|
||||
#include "commonDef.h"
|
||||
#include "common/platform_types.h"
|
||||
#include "common/platform_constants.h"
|
||||
#include "PHY/defs_eNB.h"
|
||||
#include "s1ap_messages_types.h"
|
||||
#include "ngap_messages_types.h"
|
||||
#include "f1ap_messages_types.h"
|
||||
#include "e1ap_messages_types.h"
|
||||
|
||||
#include "rrc_messages_types.h"
|
||||
#include "intertask_interface.h"
|
||||
#include <stdint.h>
|
||||
#include "RRC/NR/nr_rrc_defs.h"
|
||||
#include "assertions.h"
|
||||
#include "common/config/config_load_configmodule.h"
|
||||
#include "common/ngran_types.h"
|
||||
#include "f1ap_messages_types.h"
|
||||
#include "intertask_interface.h"
|
||||
|
||||
#define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\
|
||||
struct in_addr inp;\
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user