integration_2022_wk03_b
MR !1371: NR UE capabilities -Capabilities for OAI UE from xml file (for now copy-pasted from a COTS UE, to be modified in the framework of harmonization of RRC configuration at gNB). -For phy-test and do-ra mode, the gNB directly reads the xml file. MR !1397: fix issue created from fix int8 overflow (int8 overflox is small) -ptrs computation was making uint8 overflow, i fixed it, but then, as the overflow is negative, it became a very high positive number (uint8 0-1 is "only" 255) MR !1390: ci-improvements -store executables with which core dumps have been created for better analysis -do not capture GTP, bloating PCAPs -complete + order build_oai help -build all libraries in containers (e.g., nrscope, telnet, ...) -increase (containerized, 5G) RFsim throughput and tentatively analyze
This commit is contained in:
@@ -198,17 +198,37 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("RF Simulators") {
|
||||
stage ("4G RF Simulators") {
|
||||
when { expression {doMandatoryTests} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-RF-Sim-Test', 'Test-RF-Sim-Container')
|
||||
triggerSlaveJob ('RAN-RF-Sim-Test-4G', 'Test-RF-Sim-Container-4G')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-RF-Sim-Test')
|
||||
finalizeSlaveJob('RAN-RF-Sim-Test-4G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("5G RF Simulators") {
|
||||
when { expression {doMandatoryTests} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-RF-Sim-Test-5G', 'Test-RF-Sim-Container-4G')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-RF-Sim-Test-5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
|
||||
@@ -529,52 +529,6 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("Test MONOLITHIC - FDD - Band 13 - B210") {
|
||||
when {
|
||||
expression {doFullTestsuite}
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
sh "sleep 60"
|
||||
triggerSlaveJob ('eNB-CI-MONO-FDD-Band13-B210', 'Test-Mono-FDD-Band13-LTE-M')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('eNB-CI-MONO-FDD-Band13-B210')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("Test X2 Handover - FDD - Band 13 - B210") {
|
||||
when {
|
||||
expression {doFullTestsuite}
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
sh "sleep 60"
|
||||
triggerSlaveJob ('eNB-CI-MONO-FDD-Band13-X2HO-B210', 'Test-Mono-FDD-Band13-X2-HO')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('eNB-CI-MONO-FDD-Band13-X2HO-B210')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("Test IF4p5 - TDD - Band 38 - B210 - MultiRRU") {
|
||||
when {
|
||||
expression {doFullTestsuite}
|
||||
@@ -643,28 +597,6 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("Test OAI OCP-eNB - FDD - Band 7 - B210") {
|
||||
when {
|
||||
expression {doFullTestsuite}
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('OCPeNB-FDD-Band7-B210', 'Test-OCP-FDD-Band7')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('OCPeNB-FDD-Band7-B210')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
|
||||
@@ -221,7 +221,7 @@ class Containerize():
|
||||
if (self.ranAllowMerge):
|
||||
imageTag = 'ci-temp'
|
||||
if self.ranTargetBranch == 'develop':
|
||||
mySSH.command('git diff HEAD..origin/develop -- docker/Dockerfile.base' + self.dockerfileprefix + ' | grep --colour=never -i INDEX', '\$', 5)
|
||||
mySSH.command('git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base' + self.dockerfileprefix + ' | grep --colour=never -i INDEX', '\$', 5)
|
||||
result = re.search('index', mySSH.getBefore())
|
||||
if result is not None:
|
||||
forceBaseImageBuild = True
|
||||
@@ -341,7 +341,7 @@ class Containerize():
|
||||
# Remove all intermediate build images
|
||||
if self.ranAllowMerge and forceBaseImageBuild:
|
||||
mySSH.command(self.cli + ' image rm ' + baseImage + ':' + baseTag + ' || true', '\$', 30)
|
||||
mySSH.command(self.cli + ' image rm ran-build:' + imageTag + ' || true','\$', 5)
|
||||
mySSH.command(self.cli + ' image rm ran-build:' + imageTag + ' || true','\$', 30)
|
||||
# Cleaning any created tmp volume
|
||||
mySSH.command(self.cli + ' volume prune --force || true','\$', 15)
|
||||
mySSH.close()
|
||||
@@ -586,11 +586,20 @@ class Containerize():
|
||||
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
||||
# Currently support only one
|
||||
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5)
|
||||
containerName = ''
|
||||
containerToKill = False
|
||||
result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
|
||||
if self.eNB_logFile[self.eNB_instance] == '':
|
||||
self.eNB_logFile[self.eNB_instance] = 'enb_' + HTML.testCase_id + '.log'
|
||||
if result is not None:
|
||||
containerName = result.group('container_name')
|
||||
containerToKill = True
|
||||
if containerToKill:
|
||||
mySSH.command('docker inspect ' + containerName, '\$', 30)
|
||||
result = re.search('Error: No such object: ' + containerName, mySSH.getBefore())
|
||||
if result is not None:
|
||||
containerToKill = False
|
||||
if containerToKill:
|
||||
mySSH.command('docker kill --signal INT ' + containerName, '\$', 30)
|
||||
time.sleep(5)
|
||||
mySSH.command('docker logs ' + containerName + ' > ' + lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '\$', 30)
|
||||
@@ -603,20 +612,26 @@ class Containerize():
|
||||
mySSH.close()
|
||||
|
||||
# Analyzing log file!
|
||||
copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '.')
|
||||
if containerToKill:
|
||||
copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '.')
|
||||
else:
|
||||
copyin_res = 0
|
||||
nodeB_prefix = 'e'
|
||||
if (copyin_res == -1):
|
||||
HTML.htmleNBFailureMsg='Could not copy ' + nodeB_prefix + 'NB logfile to analyze it!'
|
||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
|
||||
else:
|
||||
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + self.eNB_logFile[self.eNB_instance])
|
||||
logStatus = RAN.AnalyzeLogFile_eNB(self.eNB_logFile[self.eNB_instance], HTML)
|
||||
if containerToKill:
|
||||
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + self.eNB_logFile[self.eNB_instance])
|
||||
logStatus = RAN.AnalyzeLogFile_eNB(self.eNB_logFile[self.eNB_instance], HTML)
|
||||
else:
|
||||
logStatus = 0
|
||||
if (logStatus < 0):
|
||||
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus)
|
||||
else:
|
||||
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||
# all the xNB run logs shall be on the server 0 for logCollecting
|
||||
if self.eNB_serverId[self.eNB_instance] != '0':
|
||||
if containerToKill and self.eNB_serverId[self.eNB_instance] != '0':
|
||||
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + self.eNB_logFile[self.eNB_instance], self.eNBSourceCodePath + '/cmake_targets/')
|
||||
logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m')
|
||||
|
||||
@@ -689,7 +704,7 @@ class Containerize():
|
||||
def CaptureOnDockerNetworks(self):
|
||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml config | grep com.docker.network.bridge.name | sed -e "s@^.*name: @@"'
|
||||
networkNames = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||
cmd = 'sudo nohup tshark -f "not tcp and not arp and not port 53 and not host archive.ubuntu.com and not host security.ubuntu.com"'
|
||||
cmd = 'sudo nohup tshark -f "not tcp and not arp and not port 53 and not host archive.ubuntu.com and not host security.ubuntu.com and not port 2152"'
|
||||
for name in networkNames.split('\n'):
|
||||
res = re.search('rfsim', name)
|
||||
if res is not None:
|
||||
@@ -700,7 +715,7 @@ class Containerize():
|
||||
logging.debug(cmd)
|
||||
networkNames = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||
|
||||
def UndeployGenObject(self, HTML):
|
||||
def UndeployGenObject(self, HTML, RAN):
|
||||
self.exitStatus = 0
|
||||
ymlPath = self.yamlPath[0].split('/')
|
||||
logPath = '../cmake_targets/log/' + ymlPath[1]
|
||||
@@ -730,8 +745,36 @@ class Containerize():
|
||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker logs ' + cName + ' > ' + cName + '.log 2>&1'
|
||||
logging.debug(cmd)
|
||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||
fullStatus = True
|
||||
if anyLogs:
|
||||
cmd = 'mkdir -p '+ logPath + ' && mv ' + self.yamlPath[0] + '/*.log ' + logPath
|
||||
cmd = 'mkdir -p '+ logPath + ' && cp ' + self.yamlPath[0] + '/*.log ' + logPath
|
||||
logging.debug(cmd)
|
||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||
|
||||
# Analyzing log file!
|
||||
listOfPossibleRanContainers = ['enb', 'gnb', 'cu', 'du']
|
||||
for container in listOfPossibleRanContainers:
|
||||
filename = self.yamlPath[0] + '/rfsim?g-oai-' + container + '.log'
|
||||
cmd = 'ls ' + filename
|
||||
containerStatus = True
|
||||
try:
|
||||
lsStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||
filename = str(lsStatus).strip()
|
||||
except:
|
||||
containerStatus = False
|
||||
if not containerStatus:
|
||||
continue
|
||||
|
||||
logging.debug('\u001B[1m Analyzing xNB logfile ' + filename + ' \u001B[0m')
|
||||
# For the moment just assume this exists
|
||||
logStatus = RAN.AnalyzeLogFile_eNB(filename, HTML)
|
||||
if (logStatus < 0):
|
||||
fullStatus = False
|
||||
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus)
|
||||
else:
|
||||
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||
|
||||
cmd = 'rm ' + self.yamlPath[0] + '/*.log'
|
||||
logging.debug(cmd)
|
||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||
if self.tsharkStarted:
|
||||
@@ -747,6 +790,7 @@ class Containerize():
|
||||
logging.debug(cmd)
|
||||
copyStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||
|
||||
logging.debug('\u001B[1m Undeploying \u001B[0m')
|
||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml down'
|
||||
logging.debug(cmd)
|
||||
try:
|
||||
@@ -763,8 +807,12 @@ class Containerize():
|
||||
logging.debug(cmd)
|
||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=100)
|
||||
|
||||
HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
logging.info('\u001B[1m Undeploying OAI Object(s) PASS\u001B[0m')
|
||||
if fullStatus:
|
||||
HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
logging.info('\u001B[1m Undeploying OAI Object(s) PASS\u001B[0m')
|
||||
else:
|
||||
HTML.CreateHtmlTestRow('n/a', 'KO', CONST.ALL_PROCESSES_OK)
|
||||
logging.info('\u001B[1m Undeploying OAI Object(s) FAIL\u001B[0m')
|
||||
|
||||
def PingFromContainer(self, HTML):
|
||||
self.exitStatus = 0
|
||||
|
||||
+5
-3
@@ -133,7 +133,7 @@ class EPCManagement():
|
||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||
logging.debug('Using the OAI EPC Release 14 MME in Docker')
|
||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup tshark -i eth0 -i lo:s10 -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup tshark -i eth0 -i lo:s10 -f "not port 2152" -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||
time.sleep(5)
|
||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup ./bin/oai_mme -c ./etc/' + self.mmeConfFile + ' > mme_check_run.log 2>&1"', '\$', 5)
|
||||
elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||
@@ -198,8 +198,8 @@ class EPCManagement():
|
||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||
logging.debug('Using the OAI EPC Release 14 SPGW-CUPS in Docker')
|
||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "nohup tshark -i eth0 -i lo:p5c -i lo:s5c -w /tmp/spgwc_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "nohup tshark -i eth0 -w /tmp/spgwu_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "nohup tshark -i eth0 -i lo:p5c -i lo:s5c -f "not port 2152" -w /tmp/spgwc_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "nohup tshark -i eth0 -f "not port 2152" -w /tmp/spgwu_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||
time.sleep(5)
|
||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "nohup ./bin/oai_spgwc -o -c ./etc/spgw_c.conf > spgwc_check_run.log 2>&1"', '\$', 5)
|
||||
time.sleep(5)
|
||||
@@ -532,6 +532,7 @@ class EPCManagement():
|
||||
logging.debug('Terminating OAI CN5G')
|
||||
mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5)
|
||||
mySSH.command('./core-network.sh stop nrf spgwu', '\$', 60)
|
||||
mySSH.command('docker volume prune --force || true', '\$', 60)
|
||||
time.sleep(2)
|
||||
mySSH.command('tshark -r /tmp/oai-cn5g.pcap | egrep --colour=never "Tracking area update" ','\$', 30)
|
||||
result = re.search('Tracking area update request', mySSH.getBefore())
|
||||
@@ -760,6 +761,7 @@ class EPCManagement():
|
||||
nbContainers += 1
|
||||
|
||||
mySSH.command('docker-compose down', '\$', 60)
|
||||
mySSH.command('docker volume prune --force || true', '\$', 60)
|
||||
mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' ' + listOfContainers, '\$', 10)
|
||||
noMoreContainerNb = mySSH.getBefore().count('No such object')
|
||||
mySSH.command('docker inspect --format=\'{{.Name}}\' prod-oai-public-net prod-oai-private-net', '\$', 10)
|
||||
|
||||
+1
-1
@@ -909,7 +909,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
||||
if CONTAINERS.exitStatus==1:
|
||||
RAN.prematureExit = True
|
||||
elif action == 'UndeployGenObject':
|
||||
CONTAINERS.UndeployGenObject(HTML)
|
||||
CONTAINERS.UndeployGenObject(HTML, RAN)
|
||||
if CONTAINERS.exitStatus==1:
|
||||
RAN.prematureExit = True
|
||||
elif action == 'PingFromContainer':
|
||||
|
||||
+18
-11
@@ -159,6 +159,7 @@ class RANManagement():
|
||||
# Raphael: here add a check if git clone or git fetch went smoothly
|
||||
mySSH.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
|
||||
mySSH.command('git config user.name "OAI Jenkins"', '\$', 5)
|
||||
mySSH.command('git advice.detachedHead false', '\$', 5)
|
||||
# Checking the BUILD INFO file
|
||||
if not self.backgroundBuild:
|
||||
mySSH.command('ls *.txt', '\$', 5)
|
||||
@@ -203,6 +204,7 @@ class RANManagement():
|
||||
else:
|
||||
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
|
||||
mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
|
||||
logging.debug(mySSH.getBefore()) # print what git said when merging/checking out
|
||||
mySSH.command('source oaienv', '\$', 5)
|
||||
mySSH.command('cd cmake_targets', '\$', 5)
|
||||
mySSH.command('mkdir -p log', '\$', 5)
|
||||
@@ -212,6 +214,7 @@ class RANManagement():
|
||||
mySSH.command('echo "./build_oai ' + self.Build_eNB_args + '" > ./my-lte-softmodem-build.sh', '\$', 5)
|
||||
mySSH.command('chmod 775 ./my-lte-softmodem-build.sh', '\$', 5)
|
||||
mySSH.command('echo ' + lPassWord + ' | sudo -S ls', '\$', 5)
|
||||
logging.debug(mySSH.getBefore()) # print current directory contents for verification
|
||||
mySSH.command('echo $USER; nohup sudo -E ./my-lte-softmodem-build.sh' + ' > ' + lSourcePath + '/cmake_targets/compile_oai_enb.log ' + ' 2>&1 &', lUserName, 5)
|
||||
mySSH.close()
|
||||
HTML.CreateHtmlTestRow(self.Build_eNB_args, 'OK', CONST.ALL_PROCESSES_OK)
|
||||
@@ -371,10 +374,11 @@ class RANManagement():
|
||||
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
||||
if result is not None:
|
||||
eth_interface = result.group('eth_interface')
|
||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
|
||||
fltr = 'port 38412 or port 36412 or port 36422' # NGAP, S1AP, X2AP
|
||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||
pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
|
||||
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
|
||||
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
|
||||
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
|
||||
mySSH.close()
|
||||
|
||||
|
||||
@@ -390,10 +394,11 @@ class RANManagement():
|
||||
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
||||
if result is not None:
|
||||
eth_interface = result.group('eth_interface')
|
||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
|
||||
fltr = 'port 38412 or port 36412 or port 36422' # NGAP, S1AP, X2AP
|
||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||
self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
|
||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
|
||||
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
|
||||
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
|
||||
mySSH.close()
|
||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
||||
@@ -738,7 +743,10 @@ class RANManagement():
|
||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*.pcap .','\$',20)
|
||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/gnb_*.pcap .','\$',20)
|
||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5)
|
||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log.png log/*/*.log log/*/*.pcap', '\$', 60)
|
||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log.png log/*/*.log log/*/*.pcap', '\$', 60)
|
||||
result = re.search('core.\d+', mySSH.getBefore())
|
||||
if result is not None:
|
||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip core* ran_build/build/{lte,nr}-softmodem', '\$', 60) # add core and executable to zip
|
||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log.png log/*/*.log log/*/*.pcap', '\$', 15)
|
||||
mySSH.close()
|
||||
|
||||
@@ -1016,12 +1024,9 @@ class RANManagement():
|
||||
datalog_rt_stats = yaml.load(f,Loader=yaml.FullLoader)
|
||||
rt_keys = datalog_rt_stats['Ref'] #we use the keys from the Ref field
|
||||
|
||||
if (os.path.isfile('./nrL1_stats.log')) and (os.path.isfile('./nrL1_stats.log')):
|
||||
stat_files_present=True
|
||||
else:
|
||||
stat_files_present=False
|
||||
logging.debug("NR Stats files for RT analysis not found")
|
||||
if stat_files_present:
|
||||
if os.path.isfile('./nrL1_stats.log') and os.path.isfile('./nrMAC_stats.log'):
|
||||
# don't use CI-nrL1_stats.log, as this will increase the processing time for
|
||||
# no reason, we just need the last occurence
|
||||
nrL1_stats = open('./nrL1_stats.log', 'r')
|
||||
nrMAC_stats = open('./nrMAC_stats.log', 'r')
|
||||
for line in nrL1_stats.readlines():
|
||||
@@ -1042,6 +1047,8 @@ class RANManagement():
|
||||
real_time_stats[k]=tmp.group(1)
|
||||
nrL1_stats.close()
|
||||
nrMAC_stats.close()
|
||||
else:
|
||||
logging.debug("NR Stats files for RT analysis not found")
|
||||
|
||||
#stdout log file and stat log files analysis completed
|
||||
logging.debug(' File analysis (stdout, stats) completed')
|
||||
|
||||
@@ -157,22 +157,24 @@ class SSHConnection():
|
||||
if not silent:
|
||||
logging.debug(commandline)
|
||||
self.cmd2Results = ''
|
||||
noHistoryCmd = 'unset HISTFILE; ' + commandline
|
||||
myHost = self.username + '@' + self.ipaddress
|
||||
# CAUTION: THIS METHOD IMPLIES THAT THERE ARE VALID SSH KEYS
|
||||
# BETWEEN THE PYTHON EXECUTOR NODE AND THE REMOTE HOST
|
||||
# OTHERWISE IT WON'T WORK
|
||||
lSsh = subprocess.Popen(["ssh", "%s" % myHost, commandline],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||
lSsh = subprocess.Popen(["ssh", "%s" % myHost, noHistoryCmd],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||
self.cmd2Results = str(lSsh.stdout.readlines())
|
||||
|
||||
def command3(self, commandline, timeout, silent=False):
|
||||
if not silent:
|
||||
logging.debug(commandline)
|
||||
self.cmd2Results = ''
|
||||
noHistoryCmd = 'unset HISTFILE; ' + commandline
|
||||
myHost = self.username + '@' + self.ipaddress
|
||||
# CAUTION: THIS METHOD IMPLIES THAT THERE ARE VALID SSH KEYS
|
||||
# BETWEEN THE PYTHON EXECUTOR NODE AND THE REMOTE HOST
|
||||
# OTHERWISE IT WON'T WORK
|
||||
lSsh = subprocess.Popen(["ssh", "%s" % myHost, commandline],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||
lSsh = subprocess.Popen(["ssh", "%s" % myHost, noHistoryCmd],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||
return lSsh.stdout.readlines()
|
||||
|
||||
|
||||
|
||||
@@ -61,9 +61,16 @@ class StatMonitor():
|
||||
|
||||
def collect(self,node_type):
|
||||
if node_type=='enb':
|
||||
cmd='cat L1_stats.log MAC_stats.log PDCP_stats.log RRC_stats.log'
|
||||
files = ["L1_stats.log", "MAC_stats.log", "PDCP_stats.log", "RRC_stats.log"]
|
||||
else: #'gnb'
|
||||
cmd='cat nrL1_stats.log nrMAC_stats.log nrPDCP_stats.log nrRRC_stats.log'
|
||||
files = ["nrL1_stats.log", "nrMAC_stats.log", "nrPDCP_stats.log", "nrRRC_stats.log"]
|
||||
# append each file's contents to another file (prepended with CI-) for
|
||||
# post-mortem/debugging analysis
|
||||
for f in files:
|
||||
cmd = rf'cat {f} >> CI-{f}'
|
||||
subprocess.Popen(shlex.split(cmd))
|
||||
# join the files for further processing
|
||||
cmd = rf'cat {shlex.join(files)}'
|
||||
process=subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
|
||||
output = process.stdout.readlines()
|
||||
if node_type=='enb':
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
import subprocess
|
||||
import time
|
||||
import shlex
|
||||
import re
|
||||
import sys
|
||||
import matplotlib.pyplot as plt
|
||||
import pickle
|
||||
import numpy as np
|
||||
import os
|
||||
|
||||
def collect(d, node_type):
|
||||
if node_type=='enb':
|
||||
cmd='cat L1_stats.log MAC_stats.log PDCP_stats.log RRC_stats.log'
|
||||
else: #'gnb'
|
||||
cmd='cat nrL1_stats.log nrMAC_stats.log nrPDCP_stats.log nrRRC_stats.log'
|
||||
process=subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
|
||||
output = process.stdout.readlines()
|
||||
for l in output:
|
||||
tmp=l.decode("utf-8")
|
||||
result=re.match(rf'^.*\bPHR\b ([0-9]+).+\bbler\b ([0-9]+\.[0-9]+).+\bmcsoff\b ([0-9]+).+\bmcs\b ([0-9]+)',tmp)
|
||||
if result is not None:
|
||||
d['PHR'].append(int(result.group(1)))
|
||||
d['bler'].append(float(result.group(2)))
|
||||
d['mcsoff'].append(int(result.group(3)))
|
||||
d['mcs'].append(int(result.group(4)))
|
||||
|
||||
|
||||
def graph(d, node_type):
|
||||
|
||||
|
||||
figure, axis = plt.subplots(4, 1,figsize=(10, 10))
|
||||
|
||||
major_ticks = np.arange(0, len(d['PHR'])+1, 1)
|
||||
axis[0].set_xticks(major_ticks)
|
||||
axis[0].set_xticklabels([])
|
||||
axis[0].plot(d['PHR'],marker='o')
|
||||
axis[0].set_xlabel('time')
|
||||
axis[0].set_ylabel('PHR')
|
||||
axis[0].set_title("PHR")
|
||||
|
||||
major_ticks = np.arange(0, len(d['bler'])+1, 1)
|
||||
axis[1].set_xticks(major_ticks)
|
||||
axis[1].set_xticklabels([])
|
||||
axis[1].plot(d['bler'],marker='o')
|
||||
axis[1].set_xlabel('time')
|
||||
axis[1].set_ylabel('bler')
|
||||
axis[1].set_title("bler")
|
||||
|
||||
major_ticks = np.arange(0, len(d['mcsoff'])+1, 1)
|
||||
axis[2].set_xticks(major_ticks)
|
||||
axis[2].set_xticklabels([])
|
||||
axis[2].plot(d['mcsoff'],marker='o')
|
||||
axis[2].set_xlabel('time')
|
||||
axis[2].set_ylabel('mcsoff')
|
||||
axis[2].set_title("mcsoff")
|
||||
|
||||
major_ticks = np.arange(0, len(d['mcs'])+1, 1)
|
||||
axis[3].set_xticks(major_ticks)
|
||||
axis[3].set_xticklabels([])
|
||||
axis[3].plot(d['mcs'],marker='o')
|
||||
axis[3].set_xlabel('time')
|
||||
axis[3].set_ylabel('mcs')
|
||||
axis[3].set_title("mcs")
|
||||
|
||||
plt.tight_layout()
|
||||
# Combine all the operations and display
|
||||
plt.savefig(node_type+'_stats_monitor.png')
|
||||
plt.show()
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
node_type = sys.argv[1]#enb or gnb
|
||||
|
||||
d={}
|
||||
d['PHR']=[]
|
||||
d['bler']=[]
|
||||
d['mcsoff']=[]
|
||||
d['mcs']=[]
|
||||
|
||||
|
||||
cmd='ps aux | grep modem | grep -v grep'
|
||||
process=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
||||
output = process.stdout.readlines()
|
||||
while len(output)!=0 :
|
||||
collect(d, node_type)
|
||||
process=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
||||
output = process.stdout.readlines()
|
||||
time.sleep(1)
|
||||
print('process stopped')
|
||||
with open(node_type+'_stats_monitor.pickle', 'wb') as handle:
|
||||
pickle.dump(d, handle, protocol=pickle.HIGHEST_PROTOCOL)
|
||||
graph(d, node_type)
|
||||
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
"""
|
||||
To create graphs and pickle from runtime statistics in L1,MAC,RRC,PDCP files
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import time
|
||||
import shlex
|
||||
import re
|
||||
import sys
|
||||
import pickle
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
import yaml
|
||||
|
||||
|
||||
class StatMonitor():
|
||||
def __init__(self,):
|
||||
with open('stats_monitor_conf.yaml','r') as file:
|
||||
self.d = yaml.load(file)
|
||||
for node in self.d:
|
||||
for metric in self.d[node]:
|
||||
self.d[node][metric]=[]
|
||||
|
||||
|
||||
def process_gnb (self,node_type,output):
|
||||
for line in output:
|
||||
tmp=line.decode("utf-8")
|
||||
result=re.match(r'^.*\bdlsch_rounds\b ([0-9]+)\/([0-9]+).*\bdlsch_errors\b ([0-9]+)',tmp)
|
||||
if result is not None:
|
||||
self.d[node_type]['dlsch_err'].append(int(result.group(3)))
|
||||
percentage=float(result.group(2))/float(result.group(1))
|
||||
self.d[node_type]['dlsch_err_perc_round_1'].append(percentage)
|
||||
result=re.match(r'^.*\bulsch_rounds\b ([0-9]+)\/([0-9]+).*\bulsch_errors\b ([0-9]+)',tmp)
|
||||
if result is not None:
|
||||
self.d[node_type]['ulsch_err'].append(int(result.group(3)))
|
||||
percentage=float(result.group(2))/float(result.group(1))
|
||||
self.d[node_type]['ulsch_err_perc_round_1'].append(percentage)
|
||||
|
||||
|
||||
def process_enb (self,node_type,output):
|
||||
for line in output:
|
||||
tmp=line.decode("utf-8")
|
||||
result=re.match(r'^.*\bPHR\b ([0-9]+).+\bbler\b ([0-9]+\.[0-9]+).+\bmcsoff\b ([0-9]+).+\bmcs\b ([0-9]+)',tmp)
|
||||
if result is not None:
|
||||
self.d[node_type]['PHR'].append(int(result.group(1)))
|
||||
self.d[node_type]['bler'].append(float(result.group(2)))
|
||||
self.d[node_type]['mcsoff'].append(int(result.group(3)))
|
||||
self.d[node_type]['mcs'].append(int(result.group(4)))
|
||||
|
||||
|
||||
def collect(self,node_type):
|
||||
if node_type=='enb':
|
||||
cmd='cat L1_stats.log MAC_stats.log PDCP_stats.log RRC_stats.log'
|
||||
else: #'gnb'
|
||||
cmd='cat nrL1_stats.log nrMAC_stats.log nrPDCP_stats.log nrRRC_stats.log'
|
||||
process=subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
|
||||
output = process.stdout.readlines()
|
||||
if node_type=='enb':
|
||||
self.process_enb(node_type,output)
|
||||
else: #'gnb'
|
||||
self.process_gnb(node_type,output)
|
||||
|
||||
|
||||
def graph(self,node_type):
|
||||
col = 1
|
||||
figure, axis = plt.subplots(len(self.d[node_type]), col ,figsize=(10, 10))
|
||||
i=0
|
||||
for metric in self.d[node_type]:
|
||||
major_ticks = np.arange(0, len(self.d[node_type][metric])+1, 1)
|
||||
axis[i].set_xticks(major_ticks)
|
||||
axis[i].set_xticklabels([])
|
||||
axis[i].plot(self.d[node_type][metric],marker='o')
|
||||
axis[i].set_xlabel('time')
|
||||
axis[i].set_ylabel(metric)
|
||||
axis[i].set_title(metric)
|
||||
i+=1
|
||||
|
||||
plt.tight_layout()
|
||||
# Combine all the operations and display
|
||||
plt.savefig(node_type+'_stats_monitor.png')
|
||||
plt.show()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
node = sys.argv[1]#enb or gnb
|
||||
mon=StatMonitor()
|
||||
|
||||
#collecting stats when modem process is stopped
|
||||
CMD='ps aux | grep mode | grep -v grep'
|
||||
process=subprocess.Popen(CMD, shell=True, stdout=subprocess.PIPE)
|
||||
output = process.stdout.readlines()
|
||||
while len(output)!=0 :
|
||||
mon.collect(node)
|
||||
process=subprocess.Popen(CMD, shell=True, stdout=subprocess.PIPE)
|
||||
output = process.stdout.readlines()
|
||||
time.sleep(1)
|
||||
print('Process stopped')
|
||||
with open(node+'_stats_monitor.pickle', 'wb') as handle:
|
||||
pickle.dump(mon.d, handle, protocol=pickle.HIGHEST_PROTOCOL)
|
||||
mon.graph(node)
|
||||
@@ -93,7 +93,7 @@
|
||||
<server_container_name>rfsim5g-oai-nr-ue</server_container_name>
|
||||
<client_container_name>rfsim5g-oai-ext-dn</client_container_name>
|
||||
<server_options>-B 12.1.1.2 -u -i 1 -s</server_options>
|
||||
<client_options>-c 12.1.1.2 -u -i 1 -t 30 -b 400K</client_options>
|
||||
<client_options>-c 12.1.1.2 -u -i 1 -t 30 -b 3M</client_options>
|
||||
</testCase>
|
||||
|
||||
<testCase id="030002">
|
||||
@@ -102,7 +102,7 @@
|
||||
<server_container_name>rfsim5g-oai-ext-dn</server_container_name>
|
||||
<client_container_name>rfsim5g-oai-nr-ue</client_container_name>
|
||||
<server_options>-u -i 1 -s</server_options>
|
||||
<client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 20K</client_options>
|
||||
<client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 1M</client_options>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100001">
|
||||
|
||||
@@ -26,19 +26,19 @@
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<repeatCount>1</repeatCount>
|
||||
<TestCaseRequestedList>
|
||||
040000
|
||||
041000
|
||||
000002
|
||||
010000
|
||||
011000
|
||||
000002
|
||||
050000
|
||||
050001
|
||||
051000
|
||||
051001
|
||||
000001
|
||||
010002
|
||||
080000
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="010000">
|
||||
<testCase id="011000">
|
||||
<class>Initialize_OAI_UE</class>
|
||||
<desc>Initialize OAI UE (X300)</desc>
|
||||
<air_interface>nr</air_interface>
|
||||
@@ -51,7 +51,7 @@
|
||||
</testCase>
|
||||
|
||||
|
||||
<testCase id="040000">
|
||||
<testCase id="041000">
|
||||
<class>Initialize_eNB</class>
|
||||
<desc>Initialize gNB</desc>
|
||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf --sa --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||
@@ -76,14 +76,14 @@
|
||||
</testCase>
|
||||
|
||||
|
||||
<testCase id="050000">
|
||||
<testCase id="051000">
|
||||
<class>Ping</class>
|
||||
<desc>Ping from CN to UE: 20pings in 20sec</desc>
|
||||
<ping_args>-c 20</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="050001">
|
||||
<testCase id="051001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping from CN to UE: 100pings in 20sec</desc>
|
||||
<ping_args>-c 100 -i 0.2</ping_args>
|
||||
|
||||
+17
-7
@@ -99,25 +99,23 @@ Options
|
||||
Makes the LTE softmodem
|
||||
--eNBocp
|
||||
Makes the OCP LTE softmodem
|
||||
-gNB
|
||||
--gNB
|
||||
Makes the NR softmodem
|
||||
--nrUE
|
||||
Makes the NR UE softmodem
|
||||
--RU
|
||||
Makes the OAI RRU
|
||||
--UE
|
||||
Makes the UE specific parts (ue_ip, usim, nvram) from the given configuration file
|
||||
--nrUE
|
||||
Makes the NR UE softmodem
|
||||
--UE-conf-nvram [configuration file]
|
||||
Specify conf_nvram_path (default \"$conf_nvram_path\")
|
||||
--UE-gen-nvram [output path]
|
||||
Specify gen_nvram_path (default \"$gen_nvram_path\")
|
||||
--HWLAT
|
||||
Makes test program for haw latency tests
|
||||
-a | --agent
|
||||
Enables agent for software-defined control of the eNB
|
||||
-w | --hardware
|
||||
EXMIMO, USRP, BLADERF, LMSSDR, IRIS, ADRV9371_ZC706, SIMU, AW2SORI, None (Default)
|
||||
Adds this RF board support (in external packages installation and in compilation)
|
||||
-t | --transport
|
||||
Selects the transport protocol type, options: None, Ethernet, benetel4g, benetel5g
|
||||
-P | --phy_simulators
|
||||
Makes the unitary tests Layer 1 simulators
|
||||
-S | --core_simulators
|
||||
@@ -128,6 +126,14 @@ Options
|
||||
runs only specified test cases specified here. This flag is only valid with -s
|
||||
-V | --vcd
|
||||
Adds a debgging facility to the binary files: GUI with major internal synchronization events
|
||||
-x | --xforms
|
||||
Will compile with software oscilloscope features
|
||||
--HWLAT
|
||||
Makes test program for haw latency tests
|
||||
--HWLAT_TEST
|
||||
Compiles a hw latency test program
|
||||
--verbose-ci
|
||||
Compile with verbose instructions in CI Docker env
|
||||
--verbose-compile
|
||||
Shows detailed compilation instructions in makefile
|
||||
--cflags_processor
|
||||
@@ -163,6 +169,10 @@ Options
|
||||
Build for I/Q record-playback modes
|
||||
-k | --skip-shared-libraries
|
||||
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
||||
--ninja
|
||||
Tell cmake to use the Ninja build system. Without, will generate make files
|
||||
--sanitize-address | -fsanitize=address
|
||||
Enable the address sanitizer on all targets
|
||||
--ittiSIM
|
||||
Makes the itti simulator
|
||||
-h | --help
|
||||
|
||||
@@ -756,6 +756,7 @@ check_install_oai_software() {
|
||||
libidn11-dev \
|
||||
libmysqlclient-dev \
|
||||
libpython2.7-dev \
|
||||
libreadline-dev \
|
||||
libsctp1 \
|
||||
libsctp-dev \
|
||||
libssl-dev \
|
||||
@@ -842,6 +843,7 @@ check_install_oai_software() {
|
||||
patch \
|
||||
psmisc \
|
||||
python \
|
||||
readline-devel \
|
||||
subversion \
|
||||
xmlstarlet \
|
||||
python-pip \
|
||||
|
||||
+10
-2
@@ -89,6 +89,8 @@ At the UE the --phy-test flag will
|
||||
|
||||
```bash sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test```
|
||||
|
||||
In phy-test mode it is possible to mimic the reception of UE Capabilities at gNB by passing through the command line parameter `--uecap_file` the location and file name of the input UE Capability file, e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap.xml`
|
||||
|
||||
### Launch UE in another window
|
||||
|
||||
```bash sudo ./nr-uesoftmodem --phy-test [--rrc_config_path ../../../ci-scripts/rrc-files]```
|
||||
@@ -122,6 +124,8 @@ gNB on machine 1:
|
||||
|
||||
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --do-ra`
|
||||
|
||||
In do-ra mode it is possible to mimic the reception of UE Capabilities at gNB by passing through the command line parameter `--uecap_file` the location and file name of the input UE Capability file, e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap.xml`
|
||||
|
||||
UE on machine 2:
|
||||
|
||||
`sudo ./nr-uesoftmodem --do-ra`
|
||||
@@ -161,13 +165,17 @@ gNB on machine 1:
|
||||
|
||||
UE on machine 2:
|
||||
|
||||
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --sa`
|
||||
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -s 516 --sa`
|
||||
|
||||
With the RF simulator (on the same machine):
|
||||
|
||||
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --rfsim --sa`
|
||||
|
||||
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa`
|
||||
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -s 516 --rfsim --sa`
|
||||
|
||||
where `-r` sets the transmission bandwidth configuration in terms of RBs, `-C` sets the downlink carrier frequency and `-s` sets the SSB start subcarrier.
|
||||
|
||||
Additionally, at UE side `--uecap_file` option can be used to pass the UE Capabilities input file (path location + filename), e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap.xml`
|
||||
|
||||
## IF setup with OAI
|
||||
|
||||
|
||||
@@ -35,4 +35,4 @@ COPY . .
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja -w USRP --verbose-ci
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci
|
||||
|
||||
@@ -35,4 +35,4 @@ COPY . .
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja -w USRP --verbose-ci
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci
|
||||
|
||||
@@ -69,6 +69,8 @@ COPY --from=enb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_enb.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=enb-base \
|
||||
|
||||
@@ -76,6 +76,8 @@ COPY --from=enb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_enb.so \
|
||||
/usr/local/lib/
|
||||
|
||||
# Now we are copying from builder-image the UHD files.
|
||||
|
||||
@@ -74,6 +74,7 @@ COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=gnb-base \
|
||||
|
||||
@@ -78,6 +78,7 @@ COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/usr/local/lib/
|
||||
|
||||
# Now we are copying from builder-image the UHD files.
|
||||
|
||||
@@ -73,6 +73,7 @@ COPY --from=lte-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libSIMU.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=lte-ue-base \
|
||||
|
||||
@@ -80,6 +80,7 @@ COPY --from=lte-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libSIMU.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/usr/local/lib/
|
||||
|
||||
# Now we are copying from builder-image the UHD files.
|
||||
|
||||
@@ -76,6 +76,8 @@ COPY --from=nr-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_5Gue.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=nr-ue-base \
|
||||
|
||||
@@ -81,6 +81,8 @@ COPY --from=nr-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_5Gue.so \
|
||||
/usr/local/lib/
|
||||
|
||||
# Now we are copying from builder-image the UHD files.
|
||||
|
||||
@@ -87,8 +87,9 @@
|
||||
#define CONFIG_HLP_NOTWAIT "don't wait for tracer, start immediately\n"
|
||||
#define CONFIG_HLP_TNOFORK "to ease debugging with gdb\n"
|
||||
#define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n"
|
||||
#define CONFIG_HLP_DISABLETIMECORR "disable UE timing correction\n"
|
||||
#define CONFIG_HLP_RRC_CFG_PATH "path for RRC configuration\n"
|
||||
#define CONFIG_HLP_DISABLETIMECORR "disable UE timing correction\n"
|
||||
#define CONFIG_HLP_RRC_CFG_PATH "path for RRC configuration\n"
|
||||
#define CONFIG_HLP_UECAP_FILE "path for UE Capabilities file\n"
|
||||
|
||||
#define CONFIG_HLP_NUMEROLOGY "adding numerology for 5G\n"
|
||||
#define CONFIG_HLP_EMULATE_RF "Emulated RF enabled(disable by defult)\n"
|
||||
|
||||
@@ -111,16 +111,11 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||
|
||||
//Temp fix for inexistent NR upper layer
|
||||
unsigned char NB_gNB_INST = 1;
|
||||
char *uecap_file;
|
||||
|
||||
|
||||
int UE_scan = 1;
|
||||
int UE_scan_carrier = 0;
|
||||
runmode_t mode = normal_txrx;
|
||||
static double snr_dB=20;
|
||||
|
||||
FILE *input_fd=NULL;
|
||||
|
||||
|
||||
#if MAX_NUM_CCs == 1
|
||||
rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain}};
|
||||
double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0}};
|
||||
@@ -193,8 +188,6 @@ openair0_config_t openair0_cfg[MAX_CARDS];
|
||||
|
||||
double cpuf;
|
||||
|
||||
extern char uecap_xer[1024];
|
||||
char uecap_xer_in=0;
|
||||
|
||||
/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
|
||||
* this is very hackish - find a proper solution
|
||||
@@ -710,6 +703,7 @@ int main( int argc, char **argv ) {
|
||||
// don't create if node doesn't connect to RRC/S1/GTP
|
||||
int ret=create_gNB_tasks(1);
|
||||
AssertFatal(ret==0,"cannot create ITTI tasks\n");
|
||||
|
||||
/* Start the agent. If it is turned off in the configuration, it won't start */
|
||||
/*
|
||||
RCconfig_nr_flexran();
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
{"D" , CONFIG_HLP_DLBM_PHYTEST,0, u64ptr:&dlsch_slot_bitmap, defintval:0, TYPE_UINT64, 0}, \
|
||||
{"U" , CONFIG_HLP_ULBM_PHYTEST,0, u64ptr:&ulsch_slot_bitmap, defintval:0, TYPE_UINT64, 0}, \
|
||||
{"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \
|
||||
{"uecap_file", CONFIG_HLP_UECAP_FILE, 0, strptr:(char **)&uecap_file, defstrval:"./uecap.xml", TYPE_STRING, 0}, \
|
||||
{"s" , CONFIG_HLP_SNR, 0, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0}, \
|
||||
}
|
||||
|
||||
@@ -41,6 +42,7 @@ extern uint32_t target_dl_bw;
|
||||
extern uint32_t target_ul_bw;
|
||||
extern uint64_t dlsch_slot_bitmap;
|
||||
extern uint64_t ulsch_slot_bitmap;
|
||||
extern char *uecap_file;
|
||||
|
||||
// In nr-gnb.c
|
||||
extern void init_gNB(int single_thread_flag,int wait_for_sync);
|
||||
|
||||
+4
-2
@@ -1140,13 +1140,15 @@ void *UE_thread(void *arg) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void init_NR_UE(int nb_inst, char* rrc_config_path) {
|
||||
void init_NR_UE(int nb_inst,
|
||||
char* uecap_file,
|
||||
char* rrc_config_path) {
|
||||
int inst;
|
||||
NR_UE_MAC_INST_t *mac_inst;
|
||||
NR_UE_RRC_INST_t* rrc_inst;
|
||||
|
||||
for (inst=0; inst < nb_inst; inst++) {
|
||||
AssertFatal((rrc_inst = nr_l3_init_ue(rrc_config_path)) != NULL, "can not initialize RRC module\n");
|
||||
AssertFatal((rrc_inst = nr_l3_init_ue(uecap_file,rrc_config_path)) != NULL, "can not initialize RRC module\n");
|
||||
AssertFatal((mac_inst = nr_l2_init_ue(rrc_inst)) != NULL, "can not initialize L2 module\n");
|
||||
AssertFatal((mac_inst->if_module = nr_ue_if_module_init(inst)) != NULL, "can not initialize IF module\n");
|
||||
}
|
||||
|
||||
@@ -118,6 +118,7 @@ int vcdflag = 0;
|
||||
double rx_gain_off = 0.0;
|
||||
char *usrp_args = NULL;
|
||||
char *rrc_config_path = NULL;
|
||||
char *uecap_file = NULL;
|
||||
int dumpframe = 0;
|
||||
|
||||
uint64_t downlink_frequency[MAX_NUM_CCs][4];
|
||||
@@ -150,8 +151,6 @@ int numerology = 0;
|
||||
int oaisim_flag = 0;
|
||||
int emulate_rf = 0;
|
||||
uint32_t N_RB_DL = 106;
|
||||
char uecap_xer_in = 0;
|
||||
char uecap_xer[1024];
|
||||
|
||||
/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
|
||||
* this is very hackish - find a proper solution
|
||||
@@ -264,14 +263,6 @@ static void get_options(void) {
|
||||
|
||||
if (vcdflag > 0)
|
||||
ouput_vcd = 1;
|
||||
|
||||
if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) && (!(CONFIG_ISFLAGSET(CONFIG_NOOOPT))) ) {
|
||||
// Here the configuration file is the XER encoded UE capabilities
|
||||
// Read it in and store in asn1c data structures
|
||||
sprintf(uecap_xer,"%stargets/PROJECTS/GENERIC-LTE-EPC/CONF/UE_config.xml",getenv("OPENAIR_HOME"));
|
||||
printf("%s\n",uecap_xer);
|
||||
uecap_xer_in=1;
|
||||
} /* UE with config file */
|
||||
}
|
||||
|
||||
// set PHY vars from command line
|
||||
@@ -454,7 +445,7 @@ int main( int argc, char **argv ) {
|
||||
#endif
|
||||
LOG_I(HW, "Version: %s\n", PACKAGE_VERSION);
|
||||
|
||||
init_NR_UE(1,rrc_config_path);
|
||||
init_NR_UE(1,uecap_file,rrc_config_path);
|
||||
|
||||
int mode_offset = get_softmodem_params()->nsa ? NUMBER_OF_UE_MAX : 1;
|
||||
uint16_t node_number = get_softmodem_params()->node_number;
|
||||
|
||||
@@ -33,8 +33,9 @@
|
||||
{"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, iptr:(int32_t *)&nrUE_params.nr_dlsch_parallel, defintval:0, TYPE_UINT8, 0}, \
|
||||
{"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:(uint32_t *)&nrUE_params.ofdm_offset_divisor, defuintval:UINT_MAX, TYPE_UINT32, 0}, \
|
||||
{"nr-dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&nr_dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \
|
||||
{"V" , CONFIG_HLP_VCD, PARAMFLAG_BOOL, iptr:&vcdflag, defintval:0, TYPE_INT, 0}, \
|
||||
{"rrc_config_path", CONFIG_HLP_RRC_CFG_PATH,0, strptr:(char **)&rrc_config_path, defstrval:"./", TYPE_STRING, 0}, \
|
||||
{"V" , CONFIG_HLP_VCD, PARAMFLAG_BOOL, iptr:&vcdflag, defintval:0, TYPE_INT, 0}, \
|
||||
{"uecap_file", CONFIG_HLP_UECAP_FILE, 0, strptr:(char **)&uecap_file, defstrval:"./uecap.xml", TYPE_STRING, 0}, \
|
||||
{"rrc_config_path", CONFIG_HLP_RRC_CFG_PATH,0, strptr:(char **)&rrc_config_path, defstrval:"./", TYPE_STRING, 0}, \
|
||||
{"ue-idx-standalone", NULL, 0, u16ptr:&ue_idx_standalone, defuintval:0xFFFF, TYPE_UINT16, 0} \
|
||||
}
|
||||
|
||||
@@ -85,7 +86,7 @@ extern nrUE_params_t *get_nrUE_params(void);
|
||||
// In nr-ue.c
|
||||
extern int setup_nr_ue_buffers(PHY_VARS_NR_UE **phy_vars_ue, openair0_config_t *openair0_cfg);
|
||||
extern void fill_ue_band_info(void);
|
||||
extern void init_NR_UE(int, char*);
|
||||
extern void init_NR_UE(int, char*, char*);
|
||||
extern void init_NR_UE_threads(int);
|
||||
extern void reset_opp_meas(void);
|
||||
extern void print_opp_meas(void);
|
||||
|
||||
@@ -105,10 +105,9 @@ void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
|
||||
uint8_t L_ptrs,
|
||||
uint16_t ul_dmrs_symb_pos) {
|
||||
|
||||
uint i = 0, last_symbol, l_ref;
|
||||
int l_counter;
|
||||
l_ref = start_symbol;
|
||||
last_symbol = start_symbol + duration_in_symbols - 1;
|
||||
int i = 0;
|
||||
int l_ref = start_symbol;
|
||||
const int last_symbol = start_symbol + duration_in_symbols - 1;
|
||||
if (L_ptrs==0) {
|
||||
LOG_E(PHY,"bug: impossible L_ptrs\n");
|
||||
*ptrs_symbols = 0;
|
||||
@@ -117,7 +116,7 @@ void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
|
||||
|
||||
while ( (l_ref + i*L_ptrs) <= last_symbol) {
|
||||
|
||||
int is_dmrs_symbol = 0;
|
||||
int is_dmrs_symbol = 0, l_counter;
|
||||
|
||||
for(l_counter = l_ref + i*L_ptrs; l_counter >= max(l_ref + (i-1)*L_ptrs + 1, l_ref); l_counter--) {
|
||||
|
||||
@@ -269,8 +268,8 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
||||
return;
|
||||
}
|
||||
uint16_t sc_per_symbol = (nb_rb + K_ptrs - 1)/K_ptrs;
|
||||
int16_t *ptrs_p = (int16_t *)malloc(sizeof(int32_t)*((1 + sc_per_symbol/4)*4));
|
||||
int16_t *dmrs_comp_p = (int16_t *)malloc(sizeof(int32_t)*((1 + sc_per_symbol/4)*4));
|
||||
struct complex16 ptrs_p[(1 + sc_per_symbol/4)*4];
|
||||
struct complex16 dmrs_comp_p[(1 + sc_per_symbol/4)*4];
|
||||
double abs = 0.0;
|
||||
double real = 0.0;
|
||||
double imag = 0.0;
|
||||
@@ -278,7 +277,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
||||
double alpha = 0;
|
||||
#endif
|
||||
/* generate PTRS RE for the symbol */
|
||||
nr_gen_ref_conj_symbols(gold_seq,sc_per_symbol*2,ptrs_p, NR_MOD_TABLE_QPSK_OFFSET,2);// 2 for QPSK
|
||||
nr_gen_ref_conj_symbols(gold_seq,sc_per_symbol*2,(int16_t*)ptrs_p, NR_MOD_TABLE_QPSK_OFFSET,2);// 2 for QPSK
|
||||
|
||||
/* loop over all sub carriers to get compensated RE on ptrs symbols*/
|
||||
for (int re = 0; re < nb_re_pdsch; re++) {
|
||||
@@ -292,8 +291,8 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
||||
0,// start_re is 0 here
|
||||
ofdm_symbol_size);
|
||||
if(is_ptrs_re) {
|
||||
dmrs_comp_p[re_cnt*2] = rxF_comp[re *2];
|
||||
dmrs_comp_p[(re_cnt*2)+1] = rxF_comp[(re *2)+1];
|
||||
dmrs_comp_p[re_cnt].r = rxF_comp[re *2];
|
||||
dmrs_comp_p[re_cnt].i = rxF_comp[(re *2)+1];
|
||||
re_cnt++;
|
||||
}
|
||||
else {
|
||||
@@ -307,7 +306,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
||||
*ptrs_sc = re_cnt;
|
||||
|
||||
/*Multiple compensated data with conj of PTRS */
|
||||
mult_cpx_vector(dmrs_comp_p, ptrs_p, ptrs_ch_p,(1 + sc_per_symbol/4)*4,15); // 2^15 shifted
|
||||
mult_cpx_vector((int16_t*)dmrs_comp_p, (int16_t*)ptrs_p, ptrs_ch_p,(1 + sc_per_symbol/4)*4,15); // 2^15 shifted
|
||||
|
||||
/* loop over all ptrs sub carriers in a symbol */
|
||||
/* sum the error vector */
|
||||
@@ -331,9 +330,6 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
||||
#ifdef DEBUG_PTRS
|
||||
printf("[PHY][PTRS]: Estimated Symbol %d -> %d + j* %d \n",symbol, error_est[0], error_est[1] );
|
||||
#endif
|
||||
/* free vectors */
|
||||
free(ptrs_p);
|
||||
free(dmrs_comp_p);
|
||||
}
|
||||
|
||||
|
||||
@@ -426,9 +422,10 @@ void get_slope_from_estimates(uint8_t start, uint8_t end, int16_t *est_p, double
|
||||
/* estimate from slope */
|
||||
void ptrs_estimate_from_slope(int16_t *error_est, double *slope_p, uint8_t start, uint8_t end)
|
||||
{
|
||||
struct complex16 *error=(struct complex16 *) error_est;
|
||||
for(uint8_t i = 1; i< (end -start);i++) {
|
||||
error_est[(start+i)*2] = (error_est[start*2] + (int16_t)(i * slope_p[0]));// real
|
||||
error_est[((start +i)*2)+1] = (error_est[(start*2)+1] + (int16_t)( i * slope_p[1])); //imag
|
||||
error[start+i].r = error[start].r + (int16_t)(i * slope_p[0]);// real
|
||||
error[start+i].i = error[start].i + (int16_t)(i * slope_p[1]); //imag
|
||||
#ifdef DEBUG_PTRS
|
||||
printf("[PHY][PTRS]: Estimated Symbol %2d -> %4d %4d from Slope (%4f %4f)\n", start+i,error_est[(start+i)*2],error_est[((start +i)*2)+1],
|
||||
slope_p[0],slope_p[1]);
|
||||
|
||||
@@ -82,6 +82,7 @@ RAN_CONTEXT_t RC;
|
||||
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||
|
||||
double cpuf;
|
||||
char *uecap_file;
|
||||
|
||||
uint16_t sf_ahead=4 ;
|
||||
uint16_t sl_ahead=0;
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
LCHAN_DESC DCCH_LCHAN_DESC,DTCH_DL_LCHAN_DESC,DTCH_UL_LCHAN_DESC;
|
||||
rlc_info_t Rlc_info_um,Rlc_info_am_config;
|
||||
|
||||
char *uecap_file;
|
||||
PHY_VARS_gNB *gNB;
|
||||
PHY_VARS_NR_UE *UE;
|
||||
RAN_CONTEXT_t RC;
|
||||
|
||||
@@ -74,6 +74,7 @@ rlc_info_t Rlc_info_um,Rlc_info_am_config;
|
||||
PHY_VARS_gNB *gNB;
|
||||
PHY_VARS_NR_UE *UE;
|
||||
RAN_CONTEXT_t RC;
|
||||
char *uecap_file;
|
||||
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||
|
||||
uint16_t sf_ahead=4 ;
|
||||
|
||||
@@ -1510,7 +1510,7 @@ void NRRCConfig(void) {
|
||||
config_get( GNBSParams,sizeof(GNBSParams)/sizeof(paramdef_t),NULL);
|
||||
RC.nb_nr_inst = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt;
|
||||
|
||||
// Get num MACRLC instances
|
||||
// Get num MACRLC instances
|
||||
config_getlist( &MACRLCParamList,NULL,0, NULL);
|
||||
RC.nb_nr_macrlc_inst = MACRLCParamList.numelt;
|
||||
// Get num L1 instances
|
||||
|
||||
@@ -522,6 +522,8 @@ typedef struct gNB_RRC_INST_s {
|
||||
int cell_info_configured;
|
||||
pthread_mutex_t cell_info_mutex;
|
||||
|
||||
char *uecap_file;
|
||||
|
||||
// security configuration (preferred algorithms)
|
||||
nr_security_configuration_t security;
|
||||
} gNB_RRC_INST;
|
||||
|
||||
@@ -202,56 +202,12 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
|
||||
pthread_mutex_unlock(&rrc->cell_info_mutex);
|
||||
|
||||
if (get_softmodem_params()->phy_test > 0 || get_softmodem_params()->do_ra > 0) {
|
||||
// This is for phytest only, emulate first X2 message if uecap.raw file is present
|
||||
FILE *fd;
|
||||
fd = fopen("uecap.raw","r");
|
||||
|
||||
if (fd != NULL) {
|
||||
char buffer[4096];
|
||||
int msg_len=fread(buffer,1,4096,fd);
|
||||
LOG_I(RRC,"Read in %d bytes for uecap\n",msg_len);
|
||||
LTE_UL_DCCH_Message_t *LTE_UL_DCCH_Message;
|
||||
asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
|
||||
&asn_DEF_LTE_UL_DCCH_Message,
|
||||
(void **)<E_UL_DCCH_Message,
|
||||
(uint8_t *)buffer,
|
||||
msg_len);
|
||||
|
||||
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
|
||||
AssertFatal(1==0,"NR_UL_DCCH_MESSAGE decode error\n");
|
||||
// free the memory
|
||||
SEQUENCE_free( &asn_DEF_LTE_UL_DCCH_Message, LTE_UL_DCCH_Message, 1 );
|
||||
return;
|
||||
}
|
||||
|
||||
fclose(fd);
|
||||
xer_fprint(stdout,&asn_DEF_LTE_UL_DCCH_Message, LTE_UL_DCCH_Message);
|
||||
// recreate enough of X2 EN-DC Container
|
||||
AssertFatal(LTE_UL_DCCH_Message->message.choice.c1.present == LTE_UL_DCCH_MessageType__c1_PR_ueCapabilityInformation,
|
||||
"ueCapabilityInformation not present\n");
|
||||
NR_CG_ConfigInfo_t *CG_ConfigInfo = calloc(1,sizeof(*CG_ConfigInfo));
|
||||
CG_ConfigInfo->criticalExtensions.present = NR_CG_ConfigInfo__criticalExtensions_PR_c1;
|
||||
CG_ConfigInfo->criticalExtensions.choice.c1 = calloc(1,sizeof(*CG_ConfigInfo->criticalExtensions.choice.c1));
|
||||
CG_ConfigInfo->criticalExtensions.choice.c1->present = NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo;
|
||||
CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo = calloc(1,sizeof(*CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo));
|
||||
NR_CG_ConfigInfo_IEs_t *cg_ConfigInfo = CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo;
|
||||
cg_ConfigInfo->ue_CapabilityInfo = calloc(1,sizeof(*cg_ConfigInfo->ue_CapabilityInfo));
|
||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_UE_CapabilityRAT_ContainerList,NULL,
|
||||
(void *)<E_UL_DCCH_Message->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList,buffer,4096);
|
||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
OCTET_STRING_fromBuf(cg_ConfigInfo->ue_CapabilityInfo,
|
||||
(const char *)buffer,
|
||||
(enc_rval.encoded+7)>>3);
|
||||
parse_CG_ConfigInfo(rrc,CG_ConfigInfo,NULL);
|
||||
} else {
|
||||
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(rrc);
|
||||
ue_context_p->ue_context.spCellConfig = calloc(1, sizeof(struct NR_SpCellConfig));
|
||||
ue_context_p->ue_context.spCellConfig->spCellConfigDedicated = configuration->scd;
|
||||
LOG_I(NR_RRC,"Adding new user (%p)\n",ue_context_p);
|
||||
if (!NODE_IS_CU(RC.nrrrc[0]->node_type)) {
|
||||
rrc_add_nsa_user(rrc,ue_context_p,NULL);
|
||||
}
|
||||
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(rrc);
|
||||
ue_context_p->ue_context.spCellConfig = calloc(1, sizeof(struct NR_SpCellConfig));
|
||||
ue_context_p->ue_context.spCellConfig->spCellConfigDedicated = configuration->scd;
|
||||
LOG_I(NR_RRC,"Adding new user (%p)\n",ue_context_p);
|
||||
if (!NODE_IS_CU(RC.nrrrc[0]->node_type)) {
|
||||
rrc_add_nsa_user(rrc,ue_context_p,NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "openair2/RRC/LTE/rrc_eNB_GTPV1U.h"
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "executables/nr-softmodem.h"
|
||||
#include <openair2/RRC/NR/rrc_gNB_UE_context.h>
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
#include "UTIL/OSA/osa_defs.h"
|
||||
@@ -143,6 +144,30 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
|
||||
unsigned char *kUPenc = NULL;
|
||||
unsigned char *kUPint = NULL;
|
||||
int i;
|
||||
|
||||
// In case of phy-test and do-ra mode, read UE capabilities directly from file
|
||||
if (get_softmodem_params()->phy_test == 1 || get_softmodem_params()->do_ra == 1) {
|
||||
NR_UE_NR_Capability_t* UE_Capability_nr = NULL;
|
||||
char UE_NR_Capability_xer[65536];
|
||||
FILE *f = NULL;
|
||||
if (uecap_file)
|
||||
f = fopen(uecap_file, "r");
|
||||
if(f){
|
||||
size_t size = fread(UE_NR_Capability_xer, 1, sizeof UE_NR_Capability_xer, f);
|
||||
if (size == 0 || size == sizeof UE_NR_Capability_xer)
|
||||
LOG_E(NR_RRC,"UE Capabilities XER file %s is too large (%ld)\n", uecap_file, size);
|
||||
else {
|
||||
UE_Capability_nr = CALLOC(1,sizeof(NR_UE_NR_Capability_t));
|
||||
asn_dec_rval_t dec_rval = xer_decode(0, &asn_DEF_NR_UE_NR_Capability, (void *)&UE_Capability_nr, UE_NR_Capability_xer, size);
|
||||
assert(dec_rval.code == RC_OK);
|
||||
xer_fprint(stdout,&asn_DEF_NR_UE_NR_Capability,(void *)UE_Capability_nr);
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG_E(NR_RRC,"Could not open UE Capabilities input file. Not handling OAI UE Capabilities.\n");
|
||||
ue_context_p->ue_context.UE_Capability_nr = UE_Capability_nr;
|
||||
}
|
||||
|
||||
// NR RRCReconfiguration
|
||||
AssertFatal(rrc->Nb_ue < MAX_NR_RRC_UE_CONTEXTS,"cannot add another UE\n");
|
||||
ue_context_p->ue_context.reconfig = calloc(1,sizeof(NR_RRCReconfiguration_t));
|
||||
|
||||
@@ -34,8 +34,8 @@
|
||||
#include "rrc_proto.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
|
||||
NR_UE_RRC_INST_t* nr_l3_init_ue(char* rrc_config_path){
|
||||
NR_UE_RRC_INST_t* nr_l3_init_ue(char* uecap, char* rrc_config_path){
|
||||
//LOG_I(RRC, "[MAIN] NR UE MAC initialization...\n");
|
||||
|
||||
return openair_rrc_top_init_ue_nr(rrc_config_path);
|
||||
return openair_rrc_top_init_ue_nr(uecap,rrc_config_path);
|
||||
}
|
||||
|
||||
+34
-13
@@ -422,7 +422,7 @@ void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type,
|
||||
|
||||
}
|
||||
|
||||
NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* rrc_config_path){
|
||||
NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* uecap_file, char* rrc_config_path){
|
||||
int nr_ue;
|
||||
if(NB_NR_UE_INST > 0){
|
||||
NR_UE_rrc_inst = (NR_UE_RRC_INST_t *)calloc(NB_NR_UE_INST , sizeof(NR_UE_RRC_INST_t));
|
||||
@@ -496,6 +496,8 @@ NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* rrc_config_path){
|
||||
RRC_LIST_INIT(NR_UE_rrc_inst[nr_ue].CSI_ReportConfig_list, NR_maxNrofCSI_ReportConfigurations);
|
||||
}
|
||||
|
||||
NR_UE_rrc_inst->uecap_file = uecap_file;
|
||||
|
||||
if (get_softmodem_params()->phy_test==1 || get_softmodem_params()->do_ra==1) {
|
||||
// read in files for RRCReconfiguration and RBconfig
|
||||
FILE *fd;
|
||||
@@ -505,7 +507,7 @@ NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* rrc_config_path){
|
||||
else
|
||||
sprintf(filename,"reconfig.raw");
|
||||
fd = fopen(filename,"r");
|
||||
char buffer[1024];
|
||||
char buffer[1024];
|
||||
AssertFatal(fd,
|
||||
"cannot read file %s: errno %d, %s\n",
|
||||
filename,
|
||||
@@ -2634,14 +2636,18 @@ nr_rrc_ue_process_ueCapabilityEnquiry(
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
asn_enc_rval_t enc_rval;
|
||||
asn_dec_rval_t dec_rval;
|
||||
NR_UL_DCCH_Message_t ul_dcch_msg;
|
||||
NR_UE_CapabilityRAT_Container_t ue_CapabilityRAT_Container;
|
||||
char UE_NR_Capability_xer[65536];
|
||||
size_t size;
|
||||
uint8_t buffer[200];
|
||||
int i;
|
||||
LOG_I(NR_RRC,"[UE %d] Frame %d: Receiving from SRB1 (DL-DCCH), Processing UECapabilityEnquiry (gNB %d)\n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->frame,
|
||||
gNB_index);
|
||||
|
||||
memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
|
||||
memset((void *)&ue_CapabilityRAT_Container,0,sizeof(NR_UE_CapabilityRAT_Container_t));
|
||||
ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
|
||||
@@ -2650,20 +2656,35 @@ nr_rrc_ue_process_ueCapabilityEnquiry(
|
||||
ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation = CALLOC(1, sizeof(struct NR_UECapabilityInformation));
|
||||
ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation->rrc_TransactionIdentifier = UECapabilityEnquiry->rrc_TransactionIdentifier;
|
||||
ue_CapabilityRAT_Container.rat_Type = NR_RAT_Type_nr;
|
||||
NR_UE_NR_Capability_t* UE_Capability_nr;
|
||||
UE_Capability_nr = CALLOC(1,sizeof(NR_UE_NR_Capability_t));
|
||||
NR_BandNR_t *nr_bandnr;
|
||||
nr_bandnr = CALLOC(1,sizeof(NR_BandNR_t));
|
||||
nr_bandnr->bandNR = 1;
|
||||
ASN_SEQUENCE_ADD(
|
||||
&UE_Capability_nr->rf_Parameters.supportedBandListNR.list,
|
||||
nr_bandnr);
|
||||
NR_UE_NR_Capability_t* UE_Capability_nr = NULL;
|
||||
|
||||
char *file_path = NR_UE_rrc_inst[ctxt_pP->module_id].uecap_file;
|
||||
|
||||
FILE *f = NULL;
|
||||
if (file_path)
|
||||
f = fopen(file_path, "r");
|
||||
if(f){
|
||||
size = fread(UE_NR_Capability_xer, 1, sizeof UE_NR_Capability_xer, f);
|
||||
if (size == 0 || size == sizeof UE_NR_Capability_xer) {
|
||||
LOG_E(NR_RRC,"UE Capabilities XER file %s is too large (%ld)\n", file_path,size);
|
||||
free(UE_Capability_nr);
|
||||
return;
|
||||
}
|
||||
dec_rval = xer_decode(0, &asn_DEF_NR_UE_NR_Capability, (void *)&UE_Capability_nr, UE_NR_Capability_xer, size);
|
||||
assert(dec_rval.code == RC_OK);
|
||||
}
|
||||
else {
|
||||
UE_Capability_nr = CALLOC(1,sizeof(NR_UE_NR_Capability_t));
|
||||
NR_BandNR_t *nr_bandnr;
|
||||
nr_bandnr = CALLOC(1,sizeof(NR_BandNR_t));
|
||||
nr_bandnr->bandNR = 1;
|
||||
ASN_SEQUENCE_ADD(&UE_Capability_nr->rf_Parameters.supportedBandListNR.list,
|
||||
nr_bandnr);
|
||||
}
|
||||
OAI_NR_UECapability_t *UECap;
|
||||
UECap = CALLOC(1,sizeof(OAI_NR_UECapability_t));
|
||||
UECap->UE_NR_Capability = UE_Capability_nr;
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout,&asn_DEF_NR_UE_NR_Capability,(void *)UE_Capability_nr);
|
||||
}
|
||||
xer_fprint(stdout,&asn_DEF_NR_UE_NR_Capability,(void *)UE_Capability_nr);
|
||||
|
||||
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UE_NR_Capability,
|
||||
NULL,
|
||||
|
||||
@@ -70,7 +70,7 @@ typedef enum {
|
||||
nr_RadioBearerConfigX_r15=1
|
||||
} nsa_message_t;
|
||||
|
||||
#define MAX_UE_NR_CAPABILITY_SIZE 255
|
||||
#define MAX_UE_NR_CAPABILITY_SIZE 2048
|
||||
typedef struct OAI_NR_UECapability_s {
|
||||
uint8_t sdu[MAX_UE_NR_CAPABILITY_SIZE];
|
||||
uint8_t sdu_size;
|
||||
@@ -120,13 +120,15 @@ typedef struct NR_UE_RRC_INST_s {
|
||||
NR_DRB_ToAddMod_t *DRB_config[NB_CNX_UE][8];
|
||||
rb_id_t *defaultDRB; // remember the ID of the default DRB
|
||||
|
||||
NR_SRB_INFO Srb0[NB_SIG_CNX_UE];
|
||||
char *uecap_file;
|
||||
|
||||
NR_SRB_INFO Srb0[NB_SIG_CNX_UE];
|
||||
NR_SRB_INFO_TABLE_ENTRY Srb1[NB_CNX_UE];
|
||||
NR_SRB_INFO_TABLE_ENTRY Srb2[NB_CNX_UE];
|
||||
|
||||
uint8_t MBMS_flag;
|
||||
OAI_NR_UECapability_t *UECap;
|
||||
uint8_t *UECapability;
|
||||
uint8_t *UECapability;
|
||||
uint8_t UECapability_size;
|
||||
|
||||
RA_trigger_t ra_trigger;
|
||||
|
||||
@@ -56,14 +56,14 @@ extern queue_t nr_wait_ul_tti_req_queue;
|
||||
// main_rrc.c
|
||||
//
|
||||
/**\brief Layer 3 initialization*/
|
||||
NR_UE_RRC_INST_t* nr_l3_init_ue(char*);
|
||||
NR_UE_RRC_INST_t* nr_l3_init_ue(char*,char*);
|
||||
|
||||
//
|
||||
// UE_rrc.c
|
||||
//
|
||||
|
||||
/**\brief Initial the top level RRC structure instance*/
|
||||
NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char*);
|
||||
NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char*,char*);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,862 @@
|
||||
<UE-NR-Capability>
|
||||
<accessStratumRelease><rel15/></accessStratumRelease>
|
||||
<pdcp-Parameters>
|
||||
<supportedROHC-Profiles>
|
||||
<profile0x0000><false/></profile0x0000>
|
||||
<profile0x0001><false/></profile0x0001>
|
||||
<profile0x0002><false/></profile0x0002>
|
||||
<profile0x0003><false/></profile0x0003>
|
||||
<profile0x0004><false/></profile0x0004>
|
||||
<profile0x0006><false/></profile0x0006>
|
||||
<profile0x0101><false/></profile0x0101>
|
||||
<profile0x0102><false/></profile0x0102>
|
||||
<profile0x0103><false/></profile0x0103>
|
||||
<profile0x0104><false/></profile0x0104>
|
||||
</supportedROHC-Profiles>
|
||||
<maxNumberROHC-ContextSessions><cs2/></maxNumberROHC-ContextSessions>
|
||||
<shortSN><supported/></shortSN>
|
||||
</pdcp-Parameters>
|
||||
<rlc-Parameters>
|
||||
<am-WithShortSN><supported/></am-WithShortSN>
|
||||
<um-WithShortSN><supported/></um-WithShortSN>
|
||||
<um-WithLongSN><supported/></um-WithLongSN>
|
||||
</rlc-Parameters>
|
||||
<mac-Parameters>
|
||||
<mac-ParametersXDD-Diff>
|
||||
<logicalChannelSR-DelayTimer><supported/></logicalChannelSR-DelayTimer>
|
||||
<longDRX-Cycle><supported/></longDRX-Cycle>
|
||||
<shortDRX-Cycle><supported/></shortDRX-Cycle>
|
||||
<multipleSR-Configurations><supported/></multipleSR-Configurations>
|
||||
</mac-ParametersXDD-Diff>
|
||||
</mac-Parameters>
|
||||
<phy-Parameters>
|
||||
<phy-ParametersCommon>
|
||||
<nzp-CSI-RS-IntefMgmt><supported/></nzp-CSI-RS-IntefMgmt>
|
||||
<dynamicHARQ-ACK-Codebook><supported/></dynamicHARQ-ACK-Codebook>
|
||||
<semiStaticHARQ-ACK-Codebook><supported/></semiStaticHARQ-ACK-Codebook>
|
||||
<pdsch-MappingTypeA><supported/></pdsch-MappingTypeA>
|
||||
<rateMatchingResrcSetSemi-Static><supported/></rateMatchingResrcSetSemi-Static>
|
||||
<ext2>
|
||||
<maxLayersMIMO-Indication><supported/></maxLayersMIMO-Indication>
|
||||
</ext2>
|
||||
</phy-ParametersCommon>
|
||||
<phy-ParametersFRX-Diff>
|
||||
<twoFL-DMRS>
|
||||
11
|
||||
</twoFL-DMRS>
|
||||
<supportedDMRS-TypeDL><type1/></supportedDMRS-TypeDL>
|
||||
<supportedDMRS-TypeUL><type1And2/></supportedDMRS-TypeUL>
|
||||
<onePortsPTRS>
|
||||
01
|
||||
</onePortsPTRS>
|
||||
<pucch-F2-WithFH><supported/></pucch-F2-WithFH>
|
||||
<pucch-F3-WithFH><supported/></pucch-F3-WithFH>
|
||||
<absoluteTPC-Command><supported/></absoluteTPC-Command>
|
||||
<pusch-HalfPi-BPSK><supported/></pusch-HalfPi-BPSK>
|
||||
<pucch-F3-4-HalfPi-BPSK><supported/></pucch-F3-4-HalfPi-BPSK>
|
||||
<ext1>
|
||||
<csi-RS-IM-ReceptionForFeedback>
|
||||
<maxConfigNumberNZP-CSI-RS-PerCC>8</maxConfigNumberNZP-CSI-RS-PerCC>
|
||||
<maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC>64</maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC>
|
||||
<maxConfigNumberCSI-IM-PerCC><n8/></maxConfigNumberCSI-IM-PerCC>
|
||||
<maxNumberSimultaneousNZP-CSI-RS-PerCC>4</maxNumberSimultaneousNZP-CSI-RS-PerCC>
|
||||
<totalNumberPortsSimultaneousNZP-CSI-RS-PerCC>32</totalNumberPortsSimultaneousNZP-CSI-RS-PerCC>
|
||||
</csi-RS-IM-ReceptionForFeedback>
|
||||
<csi-ReportFramework>
|
||||
<maxNumberPeriodicCSI-PerBWP-ForCSI-Report>2</maxNumberPeriodicCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberAperiodicCSI-PerBWP-ForCSI-Report>2</maxNumberAperiodicCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report>0</maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberPeriodicCSI-PerBWP-ForBeamReport>2</maxNumberPeriodicCSI-PerBWP-ForBeamReport>
|
||||
<maxNumberAperiodicCSI-PerBWP-ForBeamReport>2</maxNumberAperiodicCSI-PerBWP-ForBeamReport>
|
||||
<maxNumberAperiodicCSI-triggeringStatePerCC><n63/></maxNumberAperiodicCSI-triggeringStatePerCC>
|
||||
<maxNumberSemiPersistentCSI-PerBWP-ForBeamReport>0</maxNumberSemiPersistentCSI-PerBWP-ForBeamReport>
|
||||
<simultaneousCSI-ReportsPerCC>4</simultaneousCSI-ReportsPerCC>
|
||||
</csi-ReportFramework>
|
||||
<mux-SR-HARQ-ACK-CSI-PUCCH-OncePerSlot>
|
||||
<sameSymbol><supported/></sameSymbol>
|
||||
</mux-SR-HARQ-ACK-CSI-PUCCH-OncePerSlot>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-UL><supported/></oneFL-DMRS-TwoAdditionalDMRS-UL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-UL><supported/></twoFL-DMRS-TwoAdditionalDMRS-UL>
|
||||
</ext1>
|
||||
</phy-ParametersFRX-Diff>
|
||||
<phy-ParametersFR1>
|
||||
<pdsch-256QAM-FR1><supported/></pdsch-256QAM-FR1>
|
||||
<pdsch-RE-MappingFR1-PerSymbol><n10/></pdsch-RE-MappingFR1-PerSymbol>
|
||||
<ext1>
|
||||
<pdsch-RE-MappingFR1-PerSlot><n32/></pdsch-RE-MappingFR1-PerSlot>
|
||||
</ext1>
|
||||
</phy-ParametersFR1>
|
||||
</phy-Parameters>
|
||||
<rf-Parameters>
|
||||
<supportedBandListNR>
|
||||
<BandNR>
|
||||
<bandNR>78</bandNR>
|
||||
<mimo-ParametersPerBand>
|
||||
<tci-StatePDSCH>
|
||||
<maxNumberConfiguredTCIstatesPerCC><n16/></maxNumberConfiguredTCIstatesPerCC>
|
||||
<maxNumberActiveTCI-PerBWP><n1/></maxNumberActiveTCI-PerBWP>
|
||||
</tci-StatePDSCH>
|
||||
<pusch-TransCoherence><nonCoherent/></pusch-TransCoherence>
|
||||
<periodicBeamReport><supported/></periodicBeamReport>
|
||||
<aperiodicBeamReport><supported/></aperiodicBeamReport>
|
||||
<maxNumberNonGroupBeamReporting><n4/></maxNumberNonGroupBeamReporting>
|
||||
<maxNumberSSB-BFD>2</maxNumberSSB-BFD>
|
||||
<maxNumberCSI-RS-SSB-CBD>8</maxNumberCSI-RS-SSB-CBD>
|
||||
<beamReportTiming>
|
||||
<scs-15kHz><sym8/></scs-15kHz>
|
||||
<scs-30kHz><sym14/></scs-30kHz>
|
||||
</beamReportTiming>
|
||||
<ext1>
|
||||
<beamManagementSSB-CSI-RS>
|
||||
<maxNumberSSB-CSI-RS-ResourceOneTx><n8/></maxNumberSSB-CSI-RS-ResourceOneTx>
|
||||
<maxNumberCSI-RS-Resource><n32/></maxNumberCSI-RS-Resource>
|
||||
<maxNumberCSI-RS-ResourceTwoTx><n8/></maxNumberCSI-RS-ResourceTwoTx>
|
||||
<supportedCSI-RS-Density><oneAndThree/></supportedCSI-RS-Density>
|
||||
<maxNumberAperiodicCSI-RS-Resource><n32/></maxNumberAperiodicCSI-RS-Resource>
|
||||
</beamManagementSSB-CSI-RS>
|
||||
<codebookParameters>
|
||||
<type1>
|
||||
<singlePanel>
|
||||
<supportedCSI-RS-ResourceList>
|
||||
<SupportedCSI-RS-Resource>
|
||||
<maxNumberTxPortsPerResource><p8/></maxNumberTxPortsPerResource>
|
||||
<maxNumberResourcesPerBand>8</maxNumberResourcesPerBand>
|
||||
<totalNumberTxPortsPerBand>64</totalNumberTxPortsPerBand>
|
||||
</SupportedCSI-RS-Resource>
|
||||
<SupportedCSI-RS-Resource>
|
||||
<maxNumberTxPortsPerResource><p4/></maxNumberTxPortsPerResource>
|
||||
<maxNumberResourcesPerBand>8</maxNumberResourcesPerBand>
|
||||
<totalNumberTxPortsPerBand>32</totalNumberTxPortsPerBand>
|
||||
</SupportedCSI-RS-Resource>
|
||||
<SupportedCSI-RS-Resource>
|
||||
<maxNumberTxPortsPerResource><p16/></maxNumberTxPortsPerResource>
|
||||
<maxNumberResourcesPerBand>4</maxNumberResourcesPerBand>
|
||||
<totalNumberTxPortsPerBand>64</totalNumberTxPortsPerBand>
|
||||
</SupportedCSI-RS-Resource>
|
||||
<SupportedCSI-RS-Resource>
|
||||
<maxNumberTxPortsPerResource><p32/></maxNumberTxPortsPerResource>
|
||||
<maxNumberResourcesPerBand>2</maxNumberResourcesPerBand>
|
||||
<totalNumberTxPortsPerBand>64</totalNumberTxPortsPerBand>
|
||||
</SupportedCSI-RS-Resource>
|
||||
</supportedCSI-RS-ResourceList>
|
||||
<modes><mode1/></modes>
|
||||
<maxNumberCSI-RS-PerResourceSet>4</maxNumberCSI-RS-PerResourceSet>
|
||||
</singlePanel>
|
||||
</type1>
|
||||
</codebookParameters>
|
||||
<csi-RS-IM-ReceptionForFeedback>
|
||||
<maxConfigNumberNZP-CSI-RS-PerCC>8</maxConfigNumberNZP-CSI-RS-PerCC>
|
||||
<maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC>64</maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC>
|
||||
<maxConfigNumberCSI-IM-PerCC><n8/></maxConfigNumberCSI-IM-PerCC>
|
||||
<maxNumberSimultaneousNZP-CSI-RS-PerCC>4</maxNumberSimultaneousNZP-CSI-RS-PerCC>
|
||||
<totalNumberPortsSimultaneousNZP-CSI-RS-PerCC>32</totalNumberPortsSimultaneousNZP-CSI-RS-PerCC>
|
||||
</csi-RS-IM-ReceptionForFeedback>
|
||||
<csi-ReportFramework>
|
||||
<maxNumberPeriodicCSI-PerBWP-ForCSI-Report>2</maxNumberPeriodicCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberAperiodicCSI-PerBWP-ForCSI-Report>2</maxNumberAperiodicCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report>0</maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberPeriodicCSI-PerBWP-ForBeamReport>2</maxNumberPeriodicCSI-PerBWP-ForBeamReport>
|
||||
<maxNumberAperiodicCSI-PerBWP-ForBeamReport>2</maxNumberAperiodicCSI-PerBWP-ForBeamReport>
|
||||
<maxNumberAperiodicCSI-triggeringStatePerCC><n63/></maxNumberAperiodicCSI-triggeringStatePerCC>
|
||||
<maxNumberSemiPersistentCSI-PerBWP-ForBeamReport>0</maxNumberSemiPersistentCSI-PerBWP-ForBeamReport>
|
||||
<simultaneousCSI-ReportsPerCC>4</simultaneousCSI-ReportsPerCC>
|
||||
</csi-ReportFramework>
|
||||
<csi-RS-ForTracking>
|
||||
<maxBurstLength>2</maxBurstLength>
|
||||
<maxSimultaneousResourceSetsPerCC>1</maxSimultaneousResourceSetsPerCC>
|
||||
<maxConfiguredResourceSetsPerCC>8</maxConfiguredResourceSetsPerCC>
|
||||
<maxConfiguredResourceSetsAllCC>16</maxConfiguredResourceSetsAllCC>
|
||||
</csi-RS-ForTracking>
|
||||
</ext1>
|
||||
</mimo-ParametersPerBand>
|
||||
<multipleTCI><supported/></multipleTCI>
|
||||
<pusch-256QAM><supported/></pusch-256QAM>
|
||||
<ue-PowerClass><pc2/></ue-PowerClass>
|
||||
<channelBWs-DL>
|
||||
<fr1>
|
||||
<scs-15kHz>
|
||||
0000000000
|
||||
</scs-15kHz>
|
||||
<scs-30kHz>
|
||||
0001011111
|
||||
</scs-30kHz>
|
||||
<scs-60kHz>
|
||||
0000000000
|
||||
</scs-60kHz>
|
||||
</fr1>
|
||||
</channelBWs-DL>
|
||||
<channelBWs-UL>
|
||||
<fr1>
|
||||
<scs-15kHz>
|
||||
0000000000
|
||||
</scs-15kHz>
|
||||
<scs-30kHz>
|
||||
0001011111
|
||||
</scs-30kHz>
|
||||
<scs-60kHz>
|
||||
0000000000
|
||||
</scs-60kHz>
|
||||
</fr1>
|
||||
</channelBWs-UL>
|
||||
<ext1>
|
||||
<maxUplinkDutyCycle-PC2-FR1><n100/></maxUplinkDutyCycle-PC2-FR1>
|
||||
</ext1>
|
||||
<ext4>
|
||||
<channelBWs-DL-v1590>
|
||||
<fr1>
|
||||
<scs-30kHz>
|
||||
1000000000000000
|
||||
</scs-30kHz>
|
||||
</fr1>
|
||||
</channelBWs-DL-v1590>
|
||||
<channelBWs-UL-v1590>
|
||||
<fr1>
|
||||
<scs-30kHz>
|
||||
1000000000000000
|
||||
</scs-30kHz>
|
||||
</fr1>
|
||||
</channelBWs-UL-v1590>
|
||||
</ext4>
|
||||
</BandNR>
|
||||
</supportedBandListNR>
|
||||
<supportedBandCombinationList>
|
||||
<BandCombination>
|
||||
<bandList>
|
||||
<nr>
|
||||
<bandNR>78</bandNR>
|
||||
<ca-BandwidthClassDL-NR><a/></ca-BandwidthClassDL-NR>
|
||||
<ca-BandwidthClassUL-NR><a/></ca-BandwidthClassUL-NR>
|
||||
</nr>
|
||||
</bandList>
|
||||
<featureSetCombination>0</featureSetCombination>
|
||||
<powerClass-v1530><pc2/></powerClass-v1530>
|
||||
</BandCombination>
|
||||
</supportedBandCombinationList>
|
||||
<appliedFreqBandListFilter>
|
||||
<bandInformationNR>
|
||||
<bandNR>78</bandNR>
|
||||
</bandInformationNR>
|
||||
</appliedFreqBandListFilter>
|
||||
<ext1>
|
||||
<supportedBandCombinationList-v1540>
|
||||
<BandCombination-v1540>
|
||||
<bandList-v1540>
|
||||
<BandParameters-v1540>
|
||||
<srs-TxSwitch>
|
||||
<supportedSRS-TxPortSwitch><t2r4/></supportedSRS-TxPortSwitch>
|
||||
</srs-TxSwitch>
|
||||
</BandParameters-v1540>
|
||||
</bandList-v1540>
|
||||
<ca-ParametersNR-v1540>
|
||||
<csi-RS-IM-ReceptionForFeedbackPerBandComb>
|
||||
<maxNumberSimultaneousNZP-CSI-RS-ActBWP-AllCC>8</maxNumberSimultaneousNZP-CSI-RS-ActBWP-AllCC>
|
||||
<totalNumberPortsSimultaneousNZP-CSI-RS-ActBWP-AllCC>64</totalNumberPortsSimultaneousNZP-CSI-RS-ActBWP-AllCC>
|
||||
</csi-RS-IM-ReceptionForFeedbackPerBandComb>
|
||||
<simultaneousCSI-ReportsAllCC>8</simultaneousCSI-ReportsAllCC>
|
||||
</ca-ParametersNR-v1540>
|
||||
</BandCombination-v1540>
|
||||
</supportedBandCombinationList-v1540>
|
||||
</ext1>
|
||||
</rf-Parameters>
|
||||
<measAndMobParameters>
|
||||
<measAndMobParametersCommon>
|
||||
<ssb-RLM><supported/></ssb-RLM>
|
||||
<ext1>
|
||||
<eventB-MeasAndReport><supported/></eventB-MeasAndReport>
|
||||
<handoverFDD-TDD><supported/></handoverFDD-TDD>
|
||||
</ext1>
|
||||
<ext2>
|
||||
<periodicEUTRA-MeasAndReport><supported/></periodicEUTRA-MeasAndReport>
|
||||
</ext2>
|
||||
</measAndMobParametersCommon>
|
||||
<measAndMobParametersXDD-Diff>
|
||||
<intraAndInterF-MeasAndReport><supported/></intraAndInterF-MeasAndReport>
|
||||
<eventA-MeasAndReport><supported/></eventA-MeasAndReport>
|
||||
<ext1>
|
||||
<handoverInterF><supported/></handoverInterF>
|
||||
<handoverLTE-EPC><supported/></handoverLTE-EPC>
|
||||
</ext1>
|
||||
</measAndMobParametersXDD-Diff>
|
||||
<measAndMobParametersFRX-Diff>
|
||||
<ss-SINR-Meas><supported/></ss-SINR-Meas>
|
||||
<ext1>
|
||||
<handoverInterF><supported/></handoverInterF>
|
||||
<handoverLTE-EPC><supported/></handoverLTE-EPC>
|
||||
</ext1>
|
||||
<ext3>
|
||||
<simultaneousRxDataSSB-DiffNumerology><supported/></simultaneousRxDataSSB-DiffNumerology>
|
||||
</ext3>
|
||||
</measAndMobParametersFRX-Diff>
|
||||
</measAndMobParameters>
|
||||
<featureSets>
|
||||
<featureSetsDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>1</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>2</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>3</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>4</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>5</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>6</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>7</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>8</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>9</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>10</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>11</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>12</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
</featureSetsDownlink>
|
||||
<featureSetsDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<channelBW-90mhz><supported/></channelBW-90mhz>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz20/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><twoLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz40/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz40/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz80/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz20/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz30/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><twoLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz20/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz15/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><twoLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz30/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz60/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
</featureSetsDownlinkPerCC>
|
||||
<featureSetsUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>1</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n2/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>2</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n2/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>3</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>4</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>5</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>6</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>7</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>8</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>9</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>10</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>11</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>12</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>11</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n1/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
</featureSetsUplink>
|
||||
<featureSetsUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><twoLayers/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<channelBW-90mhz><supported/></channelBW-90mhz>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><twoLayers/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz15/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz20/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz15/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz40/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz40/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz80/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz20/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz15/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz30/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz15/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz15/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<channelBW-90mhz><supported/></channelBW-90mhz>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz60/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
</featureSetsUplinkPerCC>
|
||||
<ext1>
|
||||
<featureSetsDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
</featureSetsDownlink-v1540>
|
||||
</ext1>
|
||||
</featureSets>
|
||||
<featureSetCombinations>
|
||||
<FeatureSetCombination>
|
||||
<FeatureSetsPerBand>
|
||||
<nr>
|
||||
<downlinkSetNR>2</downlinkSetNR>
|
||||
<uplinkSetNR>2</uplinkSetNR>
|
||||
</nr>
|
||||
</FeatureSetsPerBand>
|
||||
</FeatureSetCombination>
|
||||
</featureSetCombinations>
|
||||
<nonCriticalExtension>
|
||||
<interRAT-Parameters>
|
||||
<eutra>
|
||||
<supportedBandListEUTRA>
|
||||
<FreqBandIndicatorEUTRA>7</FreqBandIndicatorEUTRA>
|
||||
<FreqBandIndicatorEUTRA>38</FreqBandIndicatorEUTRA>
|
||||
</supportedBandListEUTRA>
|
||||
<eutra-ParametersCommon>
|
||||
<mfbi-EUTRA><supported/></mfbi-EUTRA>
|
||||
</eutra-ParametersCommon>
|
||||
</eutra>
|
||||
</interRAT-Parameters>
|
||||
<inactiveState><supported/></inactiveState>
|
||||
</nonCriticalExtension>
|
||||
</UE-NR-Capability>
|
||||
Reference in New Issue
Block a user