UE_id overflow corrected + merge from develop
This commit is contained in:
@@ -27,6 +27,8 @@ def pythonExecutor = params.pythonExecutor
|
|||||||
|
|
||||||
// Location of the test XML file to be run
|
// Location of the test XML file to be run
|
||||||
def testXMLFile = params.pythonTestXmlFile
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
// Name of the test stage
|
// Name of the test stage
|
||||||
def testStageName = params.pipelineTestStageName
|
def testStageName = params.pipelineTestStageName
|
||||||
@@ -108,8 +110,14 @@ pipeline {
|
|||||||
if (params.pythonTestXmlFile == null) {
|
if (params.pythonTestXmlFile == null) {
|
||||||
// picking default
|
// picking default
|
||||||
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
} else {
|
} else {
|
||||||
echo "Test XML file : ${testXMLFile}"
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// If not present picking a default Stage Name
|
// If not present picking a default Stage Name
|
||||||
if (params.pipelineTestStageName == null) {
|
if (params.pipelineTestStageName == null) {
|
||||||
@@ -194,17 +202,23 @@ pipeline {
|
|||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
dir ('ci-scripts') {
|
dir ('ci-scripts') {
|
||||||
try {
|
|
||||||
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
||||||
]) {
|
]) {
|
||||||
sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNB_AllowMerge=${eNB_AllowMergeRequestProcess} --eNBTargetBranch=${eNB_TargetBranch} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${testXMLFile}"
|
sh "python3 main.py --mode=InitiateHtml --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNB_AllowMerge=${eNB_AllowMergeRequestProcess} --eNBTargetBranch=${eNB_TargetBranch} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} ${mainPythonAllXmlFiles}"
|
||||||
}
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
try {
|
||||||
|
sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNB_AllowMerge=${eNB_AllowMergeRequestProcess} --eNBTargetBranch=${eNB_TargetBranch} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${xmlFile}"
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
currentBuild.result = 'FAILURE'
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -336,7 +350,7 @@ pipeline {
|
|||||||
}
|
}
|
||||||
if(fileExists("ci-scripts/test_results.html")) {
|
if(fileExists("ci-scripts/test_results.html")) {
|
||||||
sh "mv ci-scripts/test_results.html test_results-${JOB_NAME}.html"
|
sh "mv ci-scripts/test_results.html test_results-${JOB_NAME}.html"
|
||||||
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' test_results-${JOB_NAME}.html"
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
archiveArtifacts "test_results-${JOB_NAME}.html"
|
archiveArtifacts "test_results-${JOB_NAME}.html"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1,21 @@
|
|||||||
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
/inet.*brd/{print "interfaceToUse="$NF"done"}
|
/inet.*brd/{print "interfaceToUse="$NF"done"}
|
||||||
|
|||||||
@@ -1,4 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
|
||||||
function usage {
|
function usage {
|
||||||
echo "OAI GitLab merge request applying script"
|
echo "OAI GitLab merge request applying script"
|
||||||
|
|||||||
+208
-108
@@ -91,7 +91,8 @@ class SSHConnection():
|
|||||||
self.ADBUserName = ''
|
self.ADBUserName = ''
|
||||||
self.ADBPassword = ''
|
self.ADBPassword = ''
|
||||||
self.testCase_id = ''
|
self.testCase_id = ''
|
||||||
self.testXMLfile = ''
|
self.testXMLfiles = []
|
||||||
|
self.nbTestXMLfiles = 0
|
||||||
self.desc = ''
|
self.desc = ''
|
||||||
self.Build_eNB_args = ''
|
self.Build_eNB_args = ''
|
||||||
self.Initialize_eNB_args = ''
|
self.Initialize_eNB_args = ''
|
||||||
@@ -109,9 +110,14 @@ class SSHConnection():
|
|||||||
self.htmlFile = ''
|
self.htmlFile = ''
|
||||||
self.htmlHeaderCreated = False
|
self.htmlHeaderCreated = False
|
||||||
self.htmlFooterCreated = False
|
self.htmlFooterCreated = False
|
||||||
self.htmlUEConnected = 0
|
self.htmlUEConnected = -1
|
||||||
self.htmleNBFailureMsg = ''
|
self.htmleNBFailureMsg = ''
|
||||||
self.picocom_closure = False
|
self.picocom_closure = False
|
||||||
|
self.idle_sleep_time = 0
|
||||||
|
self.htmlTabRefs = []
|
||||||
|
self.htmlTabNames = []
|
||||||
|
self.htmlTabIcons = []
|
||||||
|
self.finalStatus = False
|
||||||
|
|
||||||
def open(self, ipaddress, username, password):
|
def open(self, ipaddress, username, password):
|
||||||
count = 0
|
count = 0
|
||||||
@@ -282,9 +288,9 @@ class SSHConnection():
|
|||||||
self.command('chmod 777 log', '\$', 5)
|
self.command('chmod 777 log', '\$', 5)
|
||||||
# no need to remove in log (git clean did the trick)
|
# no need to remove in log (git clean did the trick)
|
||||||
self.command('stdbuf -o0 ./build_oai ' + self.Build_eNB_args + ' 2>&1 | stdbuf -o0 tee -a compile_oai_enb.log', 'Bypassing the Tests', 600)
|
self.command('stdbuf -o0 ./build_oai ' + self.Build_eNB_args + ' 2>&1 | stdbuf -o0 tee -a compile_oai_enb.log', 'Bypassing the Tests', 600)
|
||||||
self.command('mkdir -p build_log_' + SSH.testCase_id, '\$', 5)
|
self.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
|
||||||
self.command('mv log/* ' + 'build_log_' + SSH.testCase_id, '\$', 5)
|
self.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
|
||||||
self.command('mv compile_oai_enb.log ' + 'build_log_' + SSH.testCase_id, '\$', 5)
|
self.command('mv compile_oai_enb.log ' + 'build_log_' + self.testCase_id, '\$', 5)
|
||||||
# Workaround to run with develop-nr
|
# Workaround to run with develop-nr
|
||||||
self.command('if [ -e ran_build ]; then cp -rf ran_build lte_build_oai; fi', '\$', 30)
|
self.command('if [ -e ran_build ]; then cp -rf ran_build lte_build_oai; fi', '\$', 30)
|
||||||
self.close()
|
self.close()
|
||||||
@@ -300,7 +306,7 @@ class SSHConnection():
|
|||||||
self.command('cd ' + self.EPCSourceCodePath, '\$', 5)
|
self.command('cd ' + self.EPCSourceCodePath, '\$', 5)
|
||||||
self.command('source oaienv', '\$', 5)
|
self.command('source oaienv', '\$', 5)
|
||||||
self.command('cd scripts', '\$', 5)
|
self.command('cd scripts', '\$', 5)
|
||||||
self.command('echo ' + self.EPCPassword + ' | sudo -S ./run_hss 2>&1 | stdbuf -o0 awk \'{ print strftime("[%Y/%m/%d %H:%M:%S] ",systime()) $0 }\' | stdbuf -o0 tee -a hss_' + SSH.testCase_id + '.log &', 'Core state: 2 -> 3', 35)
|
self.command('echo ' + self.EPCPassword + ' | sudo -S ./run_hss 2>&1 | stdbuf -o0 awk \'{ print strftime("[%Y/%m/%d %H:%M:%S] ",systime()) $0 }\' | stdbuf -o0 tee -a hss_' + self.testCase_id + '.log &', 'Core state: 2 -> 3', 35)
|
||||||
else:
|
else:
|
||||||
logging.debug('Using the ltebox simulated HSS')
|
logging.debug('Using the ltebox simulated HSS')
|
||||||
self.command('if [ -d ' + self.EPCSourceCodePath + '/scripts ]; then echo ' + self.eNBPassword + ' | sudo -S rm -Rf ' + self.EPCSourceCodePath + '/scripts ; fi', '\$', 5)
|
self.command('if [ -d ' + self.EPCSourceCodePath + '/scripts ]; then echo ' + self.eNBPassword + ' | sudo -S rm -Rf ' + self.EPCSourceCodePath + '/scripts ; fi', '\$', 5)
|
||||||
@@ -326,7 +332,7 @@ class SSHConnection():
|
|||||||
logging.debug('\u001B[1;37;41m Hostname Not Found! \u001B[0m')
|
logging.debug('\u001B[1;37;41m Hostname Not Found! \u001B[0m')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
host_name = result.group('host_name')
|
host_name = result.group('host_name')
|
||||||
self.command('echo ' + self.EPCPassword + ' | sudo -S ./run_mme 2>&1 | stdbuf -o0 tee -a mme_' + SSH.testCase_id + '.log &', 'MME app initialization complete', 100)
|
self.command('echo ' + self.EPCPassword + ' | sudo -S ./run_mme 2>&1 | stdbuf -o0 tee -a mme_' + self.testCase_id + '.log &', 'MME app initialization complete', 100)
|
||||||
else:
|
else:
|
||||||
self.command('cd /opt/ltebox/tools', '\$', 5)
|
self.command('cd /opt/ltebox/tools', '\$', 5)
|
||||||
self.command('echo ' + self.EPCPassword + ' | sudo -S ./start_mme', '\$', 5)
|
self.command('echo ' + self.EPCPassword + ' | sudo -S ./start_mme', '\$', 5)
|
||||||
@@ -342,7 +348,7 @@ class SSHConnection():
|
|||||||
self.command('cd ' + self.EPCSourceCodePath, '\$', 5)
|
self.command('cd ' + self.EPCSourceCodePath, '\$', 5)
|
||||||
self.command('source oaienv', '\$', 5)
|
self.command('source oaienv', '\$', 5)
|
||||||
self.command('cd scripts', '\$', 5)
|
self.command('cd scripts', '\$', 5)
|
||||||
self.command('echo ' + self.EPCPassword + ' | sudo -S ./run_spgw 2>&1 | stdbuf -o0 tee -a spgw_' + SSH.testCase_id + '.log &', 'Initializing SPGW-APP task interface: DONE', 30)
|
self.command('echo ' + self.EPCPassword + ' | sudo -S ./run_spgw 2>&1 | stdbuf -o0 tee -a spgw_' + self.testCase_id + '.log &', 'Initializing SPGW-APP task interface: DONE', 30)
|
||||||
else:
|
else:
|
||||||
self.command('cd /opt/ltebox/tools', '\$', 5)
|
self.command('cd /opt/ltebox/tools', '\$', 5)
|
||||||
self.command('echo ' + self.EPCPassword + ' | sudo -S ./start_xGw', '\$', 5)
|
self.command('echo ' + self.EPCPassword + ' | sudo -S ./start_xGw', '\$', 5)
|
||||||
@@ -357,7 +363,7 @@ class SSHConnection():
|
|||||||
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
self.CreateHtmlTestRow(self.Initialize_eNB_args, 'KO', pStatus)
|
self.CreateHtmlTestRow(self.Initialize_eNB_args, 'KO', pStatus)
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
|
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
|
||||||
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
||||||
@@ -368,8 +374,8 @@ class SSHConnection():
|
|||||||
if result is not None:
|
if result is not None:
|
||||||
eth_interface = result.group('eth_interface')
|
eth_interface = result.group('eth_interface')
|
||||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
|
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
|
||||||
self.command('echo ' + self.EPCPassword + ' | sudo -S rm -f /tmp/enb_' + SSH.testCase_id + '_s1log.pcap', '\$', 5)
|
self.command('echo ' + self.EPCPassword + ' | sudo -S rm -f /tmp/enb_' + self.testCase_id + '_s1log.pcap', '\$', 5)
|
||||||
self.command('echo $USER; nohup sudo tshark -f "host ' + self.eNBIPAddress +'" -i ' + eth_interface + ' -w /tmp/enb_' + SSH.testCase_id + '_s1log.pcap > /tmp/tshark.log 2>&1 &', self.EPCUserName, 5)
|
self.command('echo $USER; nohup sudo tshark -f "host ' + self.eNBIPAddress +'" -i ' + eth_interface + ' -w /tmp/enb_' + self.testCase_id + '_s1log.pcap > /tmp/tshark.log 2>&1 &', self.EPCUserName, 5)
|
||||||
self.close()
|
self.close()
|
||||||
self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
||||||
self.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
self.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
||||||
@@ -384,7 +390,7 @@ class SSHConnection():
|
|||||||
logging.debug('\u001B[1m Compiling and launching T Tracer\u001B[0m')
|
logging.debug('\u001B[1m Compiling and launching T Tracer\u001B[0m')
|
||||||
self.command('cd common/utils/T/tracer', '\$', 5)
|
self.command('cd common/utils/T/tracer', '\$', 5)
|
||||||
self.command('make', '\$', 10)
|
self.command('make', '\$', 10)
|
||||||
self.command('echo $USER; nohup ./record -d ../T_messages.txt -o ' + self.eNBSourceCodePath + '/cmake_targets/enb_' + SSH.testCase_id + '_record.raw -ON -off VCD -off HEAVY -off LEGACY_GROUP_TRACE -off LEGACY_GROUP_DEBUG > ' + self.eNBSourceCodePath + '/cmake_targets/enb_' + SSH.testCase_id + '_record.log 2>&1 &', self.eNBUserName, 5)
|
self.command('echo $USER; nohup ./record -d ../T_messages.txt -o ' + self.eNBSourceCodePath + '/cmake_targets/enb_' + self.testCase_id + '_record.raw -ON -off VCD -off HEAVY -off LEGACY_GROUP_TRACE -off LEGACY_GROUP_DEBUG > ' + self.eNBSourceCodePath + '/cmake_targets/enb_' + self.testCase_id + '_record.log 2>&1 &', self.eNBUserName, 5)
|
||||||
self.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
self.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
||||||
full_config_file = full_config_file[:extIdx + 5]
|
full_config_file = full_config_file[:extIdx + 5]
|
||||||
config_path, config_file = os.path.split(full_config_file)
|
config_path, config_file = os.path.split(full_config_file)
|
||||||
@@ -402,12 +408,12 @@ class SSHConnection():
|
|||||||
# Launch eNB with the modified config file
|
# Launch eNB with the modified config file
|
||||||
self.command('source oaienv', '\$', 5)
|
self.command('source oaienv', '\$', 5)
|
||||||
self.command('cd cmake_targets', '\$', 5)
|
self.command('cd cmake_targets', '\$', 5)
|
||||||
self.command('echo "ulimit -c unlimited && ./lte_build_oai/build/lte-softmodem -O ' + self.eNBSourceCodePath + '/' + ci_full_config_file + extra_options + '" > ./my-lte-softmodem-run' + str(SSH.eNB_instance) + '.sh ', '\$', 5)
|
self.command('echo "ulimit -c unlimited && ./lte_build_oai/build/lte-softmodem -O ' + self.eNBSourceCodePath + '/' + ci_full_config_file + extra_options + '" > ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh ', '\$', 5)
|
||||||
self.command('chmod 775 ./my-lte-softmodem-run' + str(SSH.eNB_instance) + '.sh ', '\$', 5)
|
self.command('chmod 775 ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh ', '\$', 5)
|
||||||
self.command('echo ' + self.eNBPassword + ' | sudo -S rm -Rf enb_' + SSH.testCase_id + '.log', '\$', 5)
|
self.command('echo ' + self.eNBPassword + ' | sudo -S rm -Rf enb_' + self.testCase_id + '.log', '\$', 5)
|
||||||
self.command('echo ' + self.eNBPassword + ' | sudo -S -E daemon --inherit --unsafe --name=enb' + str(SSH.eNB_instance) + '_daemon --chdir=' + self.eNBSourceCodePath + '/cmake_targets -o ' + self.eNBSourceCodePath + '/cmake_targets/enb_' + SSH.testCase_id + '.log ./my-lte-softmodem-run' + str(SSH.eNB_instance) + '.sh', '\$', 5)
|
self.command('echo ' + self.eNBPassword + ' | sudo -S -E daemon --inherit --unsafe --name=enb' + str(self.eNB_instance) + '_daemon --chdir=' + self.eNBSourceCodePath + '/cmake_targets -o ' + self.eNBSourceCodePath + '/cmake_targets/enb_' + self.testCase_id + '.log ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh', '\$', 5)
|
||||||
if not rruCheck:
|
if not rruCheck:
|
||||||
self.eNBLogFile = 'enb_' + SSH.testCase_id + '.log'
|
self.eNBLogFile = 'enb_' + self.testCase_id + '.log'
|
||||||
time.sleep(6)
|
time.sleep(6)
|
||||||
doLoop = True
|
doLoop = True
|
||||||
loopCounter = 10
|
loopCounter = 10
|
||||||
@@ -422,7 +428,7 @@ class SSHConnection():
|
|||||||
doLoop = False
|
doLoop = False
|
||||||
logging.error('\u001B[1;37;41m eNB logging system did not show got sync! \u001B[0m')
|
logging.error('\u001B[1;37;41m eNB logging system did not show got sync! \u001B[0m')
|
||||||
self.CreateHtmlTestRow('-O ' + config_file + extra_options, 'KO', ALL_PROCESSES_OK)
|
self.CreateHtmlTestRow('-O ' + config_file + extra_options, 'KO', ALL_PROCESSES_OK)
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
# In case of T tracer recording, we need to kill tshark on EPC side
|
# In case of T tracer recording, we need to kill tshark on EPC side
|
||||||
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -431,12 +437,12 @@ class SSHConnection():
|
|||||||
self.command('echo ' + self.EPCPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
self.command('echo ' + self.EPCPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
||||||
self.close()
|
self.close()
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
pcap_log_file = 'enb_' + SSH.testCase_id + '_s1log.pcap'
|
pcap_log_file = 'enb_' + self.testCase_id + '_s1log.pcap'
|
||||||
self.copyin(self.EPCIPAddress, self.EPCUserName, self.EPCPassword, '/tmp/' + pcap_log_file, '.')
|
self.copyin(self.EPCIPAddress, self.EPCUserName, self.EPCPassword, '/tmp/' + pcap_log_file, '.')
|
||||||
self.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, pcap_log_file, self.eNBSourceCodePath + '/cmake_targets/.')
|
self.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, pcap_log_file, self.eNBSourceCodePath + '/cmake_targets/.')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
self.command('stdbuf -o0 cat enb_' + SSH.testCase_id + '.log | egrep --text --color=never -i "wait|sync"', '\$', 4)
|
self.command('stdbuf -o0 cat enb_' + self.testCase_id + '.log | egrep --text --color=never -i "wait|sync"', '\$', 4)
|
||||||
if rruCheck:
|
if rruCheck:
|
||||||
result = re.search('wait RUs', str(self.ssh.before))
|
result = re.search('wait RUs', str(self.ssh.before))
|
||||||
else:
|
else:
|
||||||
@@ -472,7 +478,7 @@ class SSHConnection():
|
|||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
for device_id in self.UEDevices:
|
for device_id in self.UEDevices:
|
||||||
p = Process(target = SSH.InitializeUE_common, args = (device_id,))
|
p = Process(target = self.InitializeUE_common, args = (device_id,))
|
||||||
p.daemon = True
|
p.daemon = True
|
||||||
p.start()
|
p.start()
|
||||||
multi_jobs.append(p)
|
multi_jobs.append(p)
|
||||||
@@ -639,7 +645,7 @@ class SSHConnection():
|
|||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
self.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
self.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB()
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
status_queue = SimpleQueue()
|
status_queue = SimpleQueue()
|
||||||
@@ -647,7 +653,7 @@ class SSHConnection():
|
|||||||
nb_ue_to_connect = 0
|
nb_ue_to_connect = 0
|
||||||
for device_id in self.UEDevices:
|
for device_id in self.UEDevices:
|
||||||
if (self.nbMaxUEtoAttach == -1) or (nb_ue_to_connect < self.nbMaxUEtoAttach):
|
if (self.nbMaxUEtoAttach == -1) or (nb_ue_to_connect < self.nbMaxUEtoAttach):
|
||||||
p = Process(target = SSH.AttachUE_common, args = (device_id, status_queue, lock,))
|
p = Process(target = self.AttachUE_common, args = (device_id, status_queue, lock,))
|
||||||
p.daemon = True
|
p.daemon = True
|
||||||
p.start()
|
p.start()
|
||||||
multi_jobs.append(p)
|
multi_jobs.append(p)
|
||||||
@@ -657,7 +663,7 @@ class SSHConnection():
|
|||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
self.CreateHtmlTestRow('N/A', 'KO', ALL_PROCESSES_OK)
|
self.CreateHtmlTestRow('N/A', 'KO', ALL_PROCESSES_OK)
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
self.AutoTerminateUEandeNB()
|
self.AutoTerminateUEandeNB()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
@@ -683,7 +689,7 @@ class SSHConnection():
|
|||||||
else:
|
else:
|
||||||
self.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue)
|
self.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB()
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def DetachUE_common(self, device_id):
|
def DetachUE_common(self, device_id):
|
||||||
@@ -704,11 +710,11 @@ class SSHConnection():
|
|||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
self.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
self.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB()
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
for device_id in self.UEDevices:
|
for device_id in self.UEDevices:
|
||||||
p = Process(target = SSH.DetachUE_common, args = (device_id,))
|
p = Process(target = self.DetachUE_common, args = (device_id,))
|
||||||
p.daemon = True
|
p.daemon = True
|
||||||
p.start()
|
p.start()
|
||||||
multi_jobs.append(p)
|
multi_jobs.append(p)
|
||||||
@@ -767,11 +773,11 @@ class SSHConnection():
|
|||||||
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
self.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
self.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
for device_id in self.UEDevices:
|
for device_id in self.UEDevices:
|
||||||
p = Process(target = SSH.RebootUE_common, args = (device_id,))
|
p = Process(target = self.RebootUE_common, args = (device_id,))
|
||||||
p.daemon = True
|
p.daemon = True
|
||||||
p.start()
|
p.start()
|
||||||
multi_jobs.append(p)
|
multi_jobs.append(p)
|
||||||
@@ -851,7 +857,7 @@ class SSHConnection():
|
|||||||
self.command('cd ' + self.EPCSourceCodePath, '\$', 5)
|
self.command('cd ' + self.EPCSourceCodePath, '\$', 5)
|
||||||
self.command('cd scripts', '\$', 5)
|
self.command('cd scripts', '\$', 5)
|
||||||
ping_time = re.findall("-c (\d+)",str(self.ping_args))
|
ping_time = re.findall("-c (\d+)",str(self.ping_args))
|
||||||
ping_status = self.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee -a ping_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
ping_status = self.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee -a ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
||||||
# TIMEOUT CASE
|
# TIMEOUT CASE
|
||||||
if ping_status < 0:
|
if ping_status < 0:
|
||||||
message = 'Ping with UE (' + str(UE_IPAddress) + ') crashed due to TIMEOUT!'
|
message = 'Ping with UE (' + str(UE_IPAddress) + ') crashed due to TIMEOUT!'
|
||||||
@@ -919,12 +925,12 @@ class SSHConnection():
|
|||||||
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
pStatus = self.CheckProcessExist(initialize_eNB_flag)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
self.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
self.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
ueIpStatus = self.GetAllUEIPAddresses()
|
ueIpStatus = self.GetAllUEIPAddresses()
|
||||||
if (ueIpStatus < 0):
|
if (ueIpStatus < 0):
|
||||||
self.CreateHtmlTestRow(self.ping_args, 'KO', UE_IP_ADDRESS_ISSUE)
|
self.CreateHtmlTestRow(self.ping_args, 'KO', UE_IP_ADDRESS_ISSUE)
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
i = 0
|
i = 0
|
||||||
@@ -932,7 +938,7 @@ class SSHConnection():
|
|||||||
status_queue = SimpleQueue()
|
status_queue = SimpleQueue()
|
||||||
for UE_IPAddress in self.UEIPAddresses:
|
for UE_IPAddress in self.UEIPAddresses:
|
||||||
device_id = self.UEDevices[i]
|
device_id = self.UEDevices[i]
|
||||||
p = Process(target = SSH.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,))
|
p = Process(target = self.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,))
|
||||||
p.daemon = True
|
p.daemon = True
|
||||||
p.start()
|
p.start()
|
||||||
multi_jobs.append(p)
|
multi_jobs.append(p)
|
||||||
@@ -943,7 +949,7 @@ class SSHConnection():
|
|||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
self.CreateHtmlTestRow(self.ping_args, 'KO', ALL_PROCESSES_OK)
|
self.CreateHtmlTestRow(self.ping_args, 'KO', ALL_PROCESSES_OK)
|
||||||
self.AutoTerminateUEandeNB()
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
ping_status = True
|
ping_status = True
|
||||||
@@ -962,7 +968,7 @@ class SSHConnection():
|
|||||||
else:
|
else:
|
||||||
self.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
|
self.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB()
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def Iperf_ComputeTime(self):
|
def Iperf_ComputeTime(self):
|
||||||
@@ -978,11 +984,11 @@ class SSHConnection():
|
|||||||
logging.debug('\u001B[1;37;41m Iperf bandwidth Not Found! \u001B[0m')
|
logging.debug('\u001B[1;37;41m Iperf bandwidth Not Found! \u001B[0m')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
iperf_bandwidth = result.group('iperf_bandwidth')
|
iperf_bandwidth = result.group('iperf_bandwidth')
|
||||||
if SSH.iperf_profile == 'balanced':
|
if self.iperf_profile == 'balanced':
|
||||||
iperf_bandwidth_new = float(iperf_bandwidth)/ue_num
|
iperf_bandwidth_new = float(iperf_bandwidth)/ue_num
|
||||||
if SSH.iperf_profile == 'single-ue':
|
if self.iperf_profile == 'single-ue':
|
||||||
iperf_bandwidth_new = float(iperf_bandwidth)
|
iperf_bandwidth_new = float(iperf_bandwidth)
|
||||||
if SSH.iperf_profile == 'unbalanced':
|
if self.iperf_profile == 'unbalanced':
|
||||||
# residual is 2% of max bw
|
# residual is 2% of max bw
|
||||||
residualBW = float(iperf_bandwidth) / 50
|
residualBW = float(iperf_bandwidth) / 50
|
||||||
if idx == 0:
|
if idx == 0:
|
||||||
@@ -998,7 +1004,7 @@ class SSHConnection():
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
def Iperf_analyzeV2TCPOutput(self, lock, UE_IPAddress, device_id, statusQueue, iperf_real_options):
|
def Iperf_analyzeV2TCPOutput(self, lock, UE_IPAddress, device_id, statusQueue, iperf_real_options):
|
||||||
self.command('awk -f /tmp/tcp_iperf_stats.awk /tmp/CI-eNB/scripts/iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
|
self.command('awk -f /tmp/tcp_iperf_stats.awk /tmp/CI-eNB/scripts/iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
||||||
result = re.search('Avg Bitrate : (?P<average>[0-9\.]+ Mbits\/sec) Max Bitrate : (?P<maximum>[0-9\.]+ Mbits\/sec) Min Bitrate : (?P<minimum>[0-9\.]+ Mbits\/sec)', str(self.ssh.before))
|
result = re.search('Avg Bitrate : (?P<average>[0-9\.]+ Mbits\/sec) Max Bitrate : (?P<maximum>[0-9\.]+ Mbits\/sec) Min Bitrate : (?P<minimum>[0-9\.]+ Mbits\/sec)', str(self.ssh.before))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
avgbitrate = result.group('average')
|
avgbitrate = result.group('average')
|
||||||
@@ -1104,7 +1110,7 @@ class SSHConnection():
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
def Iperf_analyzeV2Server(self, lock, UE_IPAddress, device_id, statusQueue, iperf_real_options):
|
def Iperf_analyzeV2Server(self, lock, UE_IPAddress, device_id, statusQueue, iperf_real_options):
|
||||||
if (not os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')):
|
if (not os.path.isfile('iperf_server_' + self.testCase_id + '_' + device_id + '.log')):
|
||||||
self.ping_iperf_wrong_exit(lock, UE_IPAddress, device_id, statusQueue, 'Could not analyze from server log')
|
self.ping_iperf_wrong_exit(lock, UE_IPAddress, device_id, statusQueue, 'Could not analyze from server log')
|
||||||
return
|
return
|
||||||
# Computing the requested bandwidth in float
|
# Computing the requested bandwidth in float
|
||||||
@@ -1129,7 +1135,7 @@ class SSHConnection():
|
|||||||
req_bandwidth = '%.1f Gbits/sec' % req_bw
|
req_bandwidth = '%.1f Gbits/sec' % req_bw
|
||||||
req_bw = req_bw * 1000000000
|
req_bw = req_bw * 1000000000
|
||||||
|
|
||||||
server_file = open('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', 'r')
|
server_file = open('iperf_server_' + self.testCase_id + '_' + device_id + '.log', 'r')
|
||||||
br_sum = 0.0
|
br_sum = 0.0
|
||||||
ji_sum = 0.0
|
ji_sum = 0.0
|
||||||
pl_sum = 0
|
pl_sum = 0
|
||||||
@@ -1254,12 +1260,12 @@ class SSHConnection():
|
|||||||
# Launch iperf server on EPC side
|
# Launch iperf server on EPC side
|
||||||
self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
|
self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
|
||||||
self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
|
self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
|
||||||
self.command('rm -f iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
|
self.command('rm -f iperf_server_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
||||||
port = 5001 + idx
|
port = 5001 + idx
|
||||||
if udpIperf:
|
if udpIperf:
|
||||||
self.command('echo $USER; nohup iperf -u -s -i 1 -p ' + str(port) + ' > iperf_server_' + SSH.testCase_id + '_' + device_id + '.log &', self.EPCUserName, 5)
|
self.command('echo $USER; nohup iperf -u -s -i 1 -p ' + str(port) + ' > iperf_server_' + self.testCase_id + '_' + device_id + '.log &', self.EPCUserName, 5)
|
||||||
else:
|
else:
|
||||||
self.command('echo $USER; nohup iperf -s -i 1 -p ' + str(port) + ' > iperf_server_' + SSH.testCase_id + '_' + device_id + '.log &', self.EPCUserName, 5)
|
self.command('echo $USER; nohup iperf -s -i 1 -p ' + str(port) + ' > iperf_server_' + self.testCase_id + '_' + device_id + '.log &', self.EPCUserName, 5)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
@@ -1276,8 +1282,8 @@ class SSHConnection():
|
|||||||
modified_options = modified_options.replace('-R','')
|
modified_options = modified_options.replace('-R','')
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
||||||
self.command('rm -f iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
|
self.command('rm -f iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
||||||
iperf_status = self.command('stdbuf -o0 adb -s ' + device_id + ' shell "/data/local/tmp/iperf -c ' + EPC_Iperf_UE_IPAddress + ' ' + modified_options + ' -p ' + str(port) + '" 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
|
iperf_status = self.command('stdbuf -o0 adb -s ' + device_id + ' shell "/data/local/tmp/iperf -c ' + EPC_Iperf_UE_IPAddress + ' ' + modified_options + ' -p ' + str(port) + '" 2>&1 | stdbuf -o0 tee -a iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
|
||||||
# TIMEOUT Case
|
# TIMEOUT Case
|
||||||
if iperf_status < 0:
|
if iperf_status < 0:
|
||||||
self.close()
|
self.close()
|
||||||
@@ -1295,15 +1301,15 @@ class SSHConnection():
|
|||||||
# in case of failure, retrieve server log
|
# in case of failure, retrieve server log
|
||||||
if (clientStatus == -1):
|
if (clientStatus == -1):
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
if (os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')):
|
if (os.path.isfile('iperf_server_' + self.testCase_id + '_' + device_id + '.log')):
|
||||||
os.remove('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')
|
os.remove('iperf_server_' + self.testCase_id + '_' + device_id + '.log')
|
||||||
self.copyin(self.EPCIPAddress, self.EPCUserName, self.EPCPassword, self.EPCSourceCodePath + '/scripts/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '.')
|
self.copyin(self.EPCIPAddress, self.EPCUserName, self.EPCPassword, self.EPCSourceCodePath + '/scripts/iperf_server_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
|
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
|
||||||
|
|
||||||
def Iperf_common(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue):
|
def Iperf_common(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue):
|
||||||
try:
|
try:
|
||||||
# Single-UE profile -- iperf only on one UE
|
# Single-UE profile -- iperf only on one UE
|
||||||
if SSH.iperf_profile == 'single-ue' and idx != 0:
|
if self.iperf_profile == 'single-ue' and idx != 0:
|
||||||
return
|
return
|
||||||
useIperf3 = False
|
useIperf3 = False
|
||||||
udpIperf = True
|
udpIperf = True
|
||||||
@@ -1334,13 +1340,13 @@ class SSHConnection():
|
|||||||
if (useIperf3):
|
if (useIperf3):
|
||||||
self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/iperf3 -s &', '\$', 5)
|
self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/iperf3 -s &', '\$', 5)
|
||||||
else:
|
else:
|
||||||
self.command('rm -f iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
|
self.command('rm -f iperf_server_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
||||||
result = re.search('-u', str(self.iperf_args))
|
result = re.search('-u', str(self.iperf_args))
|
||||||
if result is None:
|
if result is None:
|
||||||
self.command('echo $USER; nohup adb -s ' + device_id + ' shell "/data/local/tmp/iperf -s -i 1" > iperf_server_' + SSH.testCase_id + '_' + device_id + '.log &', self.ADBUserName, 5)
|
self.command('echo $USER; nohup adb -s ' + device_id + ' shell "/data/local/tmp/iperf -s -i 1" > iperf_server_' + self.testCase_id + '_' + device_id + '.log &', self.ADBUserName, 5)
|
||||||
udpIperf = False
|
udpIperf = False
|
||||||
else:
|
else:
|
||||||
self.command('echo $USER; nohup adb -s ' + device_id + ' shell "/data/local/tmp/iperf -u -s -i 1" > iperf_server_' + SSH.testCase_id + '_' + device_id + '.log &', self.ADBUserName, 5)
|
self.command('echo $USER; nohup adb -s ' + device_id + ' shell "/data/local/tmp/iperf -u -s -i 1" > iperf_server_' + self.testCase_id + '_' + device_id + '.log &', self.ADBUserName, 5)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
@@ -1355,14 +1361,14 @@ class SSHConnection():
|
|||||||
modified_options = str(self.iperf_args)
|
modified_options = str(self.iperf_args)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
||||||
self.command('rm -f iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
|
self.command('rm -f iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
||||||
if (useIperf3):
|
if (useIperf3):
|
||||||
self.command('stdbuf -o0 iperf3 -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
|
self.command('stdbuf -o0 iperf3 -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
|
||||||
|
|
||||||
clientStatus = 0
|
clientStatus = 0
|
||||||
self.Iperf_analyzeV3Output(lock, UE_IPAddress, device_id, statusQueue)
|
self.Iperf_analyzeV3Output(lock, UE_IPAddress, device_id, statusQueue)
|
||||||
else:
|
else:
|
||||||
iperf_status = self.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
|
iperf_status = self.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
|
||||||
if iperf_status < 0:
|
if iperf_status < 0:
|
||||||
self.close()
|
self.close()
|
||||||
message = 'iperf on UE (' + str(UE_IPAddress) + ') crashed due to TIMEOUT !'
|
message = 'iperf on UE (' + str(UE_IPAddress) + ') crashed due to TIMEOUT !'
|
||||||
@@ -1381,9 +1387,9 @@ class SSHConnection():
|
|||||||
self.close()
|
self.close()
|
||||||
if (clientStatus == -1):
|
if (clientStatus == -1):
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
if (os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')):
|
if (os.path.isfile('iperf_server_' + self.testCase_id + '_' + device_id + '.log')):
|
||||||
os.remove('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')
|
os.remove('iperf_server_' + self.testCase_id + '_' + device_id + '.log')
|
||||||
self.copyin(self.ADBIPAddress, self.ADBUserName, self.ADBPassword, self.EPCSourceCodePath + '/scripts/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '.')
|
self.copyin(self.ADBIPAddress, self.ADBUserName, self.ADBPassword, self.EPCSourceCodePath + '/scripts/iperf_server_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
|
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
|
||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
@@ -1397,13 +1403,13 @@ class SSHConnection():
|
|||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
self.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
self.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB()
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
ueIpStatus = self.GetAllUEIPAddresses()
|
ueIpStatus = self.GetAllUEIPAddresses()
|
||||||
if (ueIpStatus < 0):
|
if (ueIpStatus < 0):
|
||||||
self.CreateHtmlTestRow(self.iperf_args, 'KO', UE_IP_ADDRESS_ISSUE)
|
self.CreateHtmlTestRow(self.iperf_args, 'KO', UE_IP_ADDRESS_ISSUE)
|
||||||
self.AutoTerminateUEandeNB()
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
i = 0
|
i = 0
|
||||||
@@ -1423,7 +1429,7 @@ class SSHConnection():
|
|||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
self.CreateHtmlTestRow(self.iperf_args, 'KO', ALL_PROCESSES_OK)
|
self.CreateHtmlTestRow(self.iperf_args, 'KO', ALL_PROCESSES_OK)
|
||||||
self.AutoTerminateUEandeNB()
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
iperf_status = True
|
iperf_status = True
|
||||||
@@ -1447,7 +1453,7 @@ class SSHConnection():
|
|||||||
else:
|
else:
|
||||||
self.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
|
self.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB()
|
self.AutoTerminateUEandeNB()
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def CheckProcessExist(self, initialize_eNB_flag):
|
def CheckProcessExist(self, initialize_eNB_flag):
|
||||||
@@ -1699,8 +1705,8 @@ class SSHConnection():
|
|||||||
def TerminateeNB(self):
|
def TerminateeNB(self):
|
||||||
self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
||||||
self.command('cd ' + self.eNBSourceCodePath + '/cmake_targets', '\$', 5)
|
self.command('cd ' + self.eNBSourceCodePath + '/cmake_targets', '\$', 5)
|
||||||
self.command('echo ' + self.eNBPassword + ' | sudo -S daemon --name=enb' + str(SSH.eNB_instance) + '_daemon --stop', '\$', 5)
|
self.command('echo ' + self.eNBPassword + ' | sudo -S daemon --name=enb' + str(self.eNB_instance) + '_daemon --stop', '\$', 5)
|
||||||
self.command('rm -f my-lte-softmodem-run' + str(SSH.eNB_instance) + '.sh', '\$', 5)
|
self.command('rm -f my-lte-softmodem-run' + str(self.eNB_instance) + '.sh', '\$', 5)
|
||||||
self.command('echo ' + self.eNBPassword + ' | sudo -S killall --signal SIGINT lte-softmodem || true', '\$', 5)
|
self.command('echo ' + self.eNBPassword + ' | sudo -S killall --signal SIGINT lte-softmodem || true', '\$', 5)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
self.command('stdbuf -o0 ps -aux | grep -v grep | grep lte-softmodem', '\$', 5)
|
self.command('stdbuf -o0 ps -aux | grep -v grep | grep lte-softmodem', '\$', 5)
|
||||||
@@ -1744,7 +1750,7 @@ class SSHConnection():
|
|||||||
logStatus = self.AnalyzeLogFile_eNB(self.eNBLogFile)
|
logStatus = self.AnalyzeLogFile_eNB(self.eNBLogFile)
|
||||||
if (logStatus < 0):
|
if (logStatus < 0):
|
||||||
self.CreateHtmlTestRow('N/A', 'KO', logStatus)
|
self.CreateHtmlTestRow('N/A', 'KO', logStatus)
|
||||||
self.CreateHtmlFooter(False)
|
self.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
self.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK)
|
self.CreateHtmlTestRow('N/A', 'OK', ALL_PROCESSES_OK)
|
||||||
@@ -1818,7 +1824,7 @@ class SSHConnection():
|
|||||||
|
|
||||||
def TerminateUE(self):
|
def TerminateUE(self):
|
||||||
terminate_ue_flag = True
|
terminate_ue_flag = True
|
||||||
SSH.GetAllUEDevices(terminate_ue_flag)
|
self.GetAllUEDevices(terminate_ue_flag)
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
for device_id in self.UEDevices:
|
for device_id in self.UEDevices:
|
||||||
p = Process(target= SSH.TerminateUE_common, args = (device_id,))
|
p = Process(target= SSH.TerminateUE_common, args = (device_id,))
|
||||||
@@ -1840,6 +1846,10 @@ class SSHConnection():
|
|||||||
self.eNB_instance = '0'
|
self.eNB_instance = '0'
|
||||||
self.TerminateeNB()
|
self.TerminateeNB()
|
||||||
|
|
||||||
|
def IdleSleep(self):
|
||||||
|
time.sleep(self.idle_sleep_time)
|
||||||
|
self.CreateHtmlTestRow(str(self.idle_sleep_time) + ' sec', 'OK', ALL_PROCESSES_OK)
|
||||||
|
|
||||||
def LogCollectBuild(self):
|
def LogCollectBuild(self):
|
||||||
self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
|
||||||
self.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
self.command('cd ' + self.eNBSourceCodePath, '\$', 5)
|
||||||
@@ -1930,6 +1940,7 @@ class SSHConnection():
|
|||||||
self.htmlFile.write(' <title>Test Results for TEMPLATE_JOB_NAME job build #TEMPLATE_BUILD_ID</title>\n')
|
self.htmlFile.write(' <title>Test Results for TEMPLATE_JOB_NAME job build #TEMPLATE_BUILD_ID</title>\n')
|
||||||
self.htmlFile.write('</head>\n')
|
self.htmlFile.write('</head>\n')
|
||||||
self.htmlFile.write('<body><div class="container">\n')
|
self.htmlFile.write('<body><div class="container">\n')
|
||||||
|
self.htmlFile.write(' <br>\n')
|
||||||
self.htmlFile.write(' <table style="border-collapse: collapse; border: none;">\n')
|
self.htmlFile.write(' <table style="border-collapse: collapse; border: none;">\n')
|
||||||
self.htmlFile.write(' <tr style="border-collapse: collapse; border: none;">\n')
|
self.htmlFile.write(' <tr style="border-collapse: collapse; border: none;">\n')
|
||||||
self.htmlFile.write(' <td style="border-collapse: collapse; border: none;">\n')
|
self.htmlFile.write(' <td style="border-collapse: collapse; border: none;">\n')
|
||||||
@@ -1944,39 +1955,40 @@ class SSHConnection():
|
|||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.write(' </table>\n')
|
self.htmlFile.write(' </table>\n')
|
||||||
self.htmlFile.write(' <br>\n')
|
self.htmlFile.write(' <br>\n')
|
||||||
|
self.htmlFile.write(' <div class="alert alert-info"><strong> <span class="glyphicon glyphicon-dashboard"></span> TEMPLATE_STAGE_NAME</strong></div>\n')
|
||||||
self.htmlFile.write(' <table border = "1">\n')
|
self.htmlFile.write(' <table border = "1">\n')
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >Build Start Time (UTC)</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-time"></span> Build Start Time (UTC) </td>\n')
|
||||||
self.htmlFile.write(' <td>TEMPLATE_BUILD_TIME</td>\n')
|
self.htmlFile.write(' <td>TEMPLATE_BUILD_TIME</td>\n')
|
||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >GIT Repository</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-cloud-upload"></span> GIT Repository </td>\n')
|
||||||
self.htmlFile.write(' <td><a href="' + SSH.eNBRepository + '">' + SSH.eNBRepository + '</a></td>\n')
|
self.htmlFile.write(' <td><a href="' + self.eNBRepository + '">' + self.eNBRepository + '</a></td>\n')
|
||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >Job Trigger</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-wrench"></span> Job Trigger </td>\n')
|
||||||
if (SSH.eNB_AllowMerge):
|
if (self.eNB_AllowMerge):
|
||||||
self.htmlFile.write(' <td>Merge-Request</td>\n')
|
self.htmlFile.write(' <td>Merge-Request</td>\n')
|
||||||
else:
|
else:
|
||||||
self.htmlFile.write(' <td>Push to Branch</td>\n')
|
self.htmlFile.write(' <td>Push to Branch</td>\n')
|
||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
if (SSH.eNB_AllowMerge):
|
if (self.eNB_AllowMerge):
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >Source Branch</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-log-out"></span> Source Branch </td>\n')
|
||||||
else:
|
else:
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >Branch</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-tree-deciduous"></span> Branch</td>\n')
|
||||||
self.htmlFile.write(' <td>' + SSH.eNBBranch + '</td>\n')
|
self.htmlFile.write(' <td>' + self.eNBBranch + '</td>\n')
|
||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
if (SSH.eNB_AllowMerge):
|
if (self.eNB_AllowMerge):
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >Source Commit ID</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-tag"></span> Source Commit ID </td>\n')
|
||||||
else:
|
else:
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >Commit ID</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-tag"></span> Commit ID </td>\n')
|
||||||
self.htmlFile.write(' <td>' + SSH.eNBCommitID + '</td>\n')
|
self.htmlFile.write(' <td>' + self.eNBCommitID + '</td>\n')
|
||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
if (SSH.eNB_AllowMerge):
|
if (self.eNB_AllowMerge):
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >Target Branch</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-log-in"></span> Target Branch </td>\n')
|
||||||
if (self.eNBTargetBranch == ''):
|
if (self.eNBTargetBranch == ''):
|
||||||
self.htmlFile.write(' <td>develop</td>\n')
|
self.htmlFile.write(' <td>develop</td>\n')
|
||||||
else:
|
else:
|
||||||
@@ -1985,24 +1997,61 @@ class SSHConnection():
|
|||||||
self.htmlFile.write(' </table>\n')
|
self.htmlFile.write(' </table>\n')
|
||||||
|
|
||||||
terminate_ue_flag = True
|
terminate_ue_flag = True
|
||||||
SSH.GetAllUEDevices(terminate_ue_flag)
|
if (self.ADBIPAddress != 'none'):
|
||||||
SSH.GetAllCatMDevices(terminate_ue_flag)
|
self.GetAllUEDevices(terminate_ue_flag)
|
||||||
|
self.GetAllCatMDevices(terminate_ue_flag)
|
||||||
|
else:
|
||||||
|
self.UEDevices.append('doughq9rehg')
|
||||||
|
self.UEDevices.append('dnsgiuahgia')
|
||||||
|
self.UEDevices.append('uehgieng9')
|
||||||
self.htmlUEConnected = len(self.UEDevices)
|
self.htmlUEConnected = len(self.UEDevices)
|
||||||
|
|
||||||
self.htmlFile.write(' <h2><a href="#FinalStatus">Jump to Final Status</a></h2>\n')
|
self.htmlFile.write(' <h2><span class="glyphicon glyphicon-phone"></span> <span class="glyphicon glyphicon-menu-right"></span> ' + str(len(self.UEDevices)) + ' UE(s) is(are) connected to ADB bench server</h2>\n')
|
||||||
|
self.htmlFile.write(' <h2><span class="glyphicon glyphicon-phone"></span> <span class="glyphicon glyphicon-menu-right"></span> ' + str(len(self.CatMDevices)) + ' CAT-M UE(s) is(are) connected to bench server</h2>\n')
|
||||||
self.htmlFile.write(' <br>\n')
|
self.htmlFile.write(' <br>\n')
|
||||||
|
self.htmlFile.write(' <ul class="nav nav-pills">\n')
|
||||||
|
count = 0
|
||||||
|
while (count < self.nbTestXMLfiles):
|
||||||
|
pillMsg = ' <li><a data-toggle="pill" href="#'
|
||||||
|
pillMsg += self.htmlTabRefs[count]
|
||||||
|
pillMsg += '">'
|
||||||
|
pillMsg += self.htmlTabNames[count]
|
||||||
|
pillMsg += ' <span class="glyphicon glyphicon-'
|
||||||
|
pillMsg += self.htmlTabIcons[count]
|
||||||
|
pillMsg += '"></span></a></li>\n'
|
||||||
|
self.htmlFile.write(pillMsg)
|
||||||
|
count += 1
|
||||||
|
self.htmlFile.write(' </ul>\n')
|
||||||
|
self.htmlFile.write(' <div class="tab-content">\n')
|
||||||
|
self.htmlFile.close()
|
||||||
|
|
||||||
self.htmlFile.write(' <h2>' + str(len(self.UEDevices)) + ' UE(s) is(are) connected to ADB bench server</h2>\n')
|
def CreateHtmlTabHeader(self):
|
||||||
self.htmlFile.write(' <h2>' + str(len(self.CatMDevices)) + ' CAT-M UE(s) is(are) connected to bench server</h2>\n')
|
if (not self.htmlHeaderCreated):
|
||||||
self.htmlFile.write(' <br>\n')
|
if (not os.path.isfile('test_results.html')):
|
||||||
|
self.CreateHtmlHeader()
|
||||||
self.htmlFile.write(' <h2>Test Summary for ' + SSH.testXMLfile + '</h2>\n')
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
self.htmlFile.write(' <table border = "1">\n')
|
if (self.nbTestXMLfiles == 1):
|
||||||
|
self.htmlFile.write(' <div id="' + self.htmlTabRefs[0] + '" class="tab-pane fade">\n')
|
||||||
|
self.htmlFile.write(' <h3>Test Summary for <span class="glyphicon glyphicon-file"></span> ' + self.testXMLfiles[0] + '</h3>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <div id="build-tab" class="tab-pane fade">\n')
|
||||||
|
self.htmlFile.write(' <table class="table" border = "1">\n')
|
||||||
self.htmlFile.write(' <tr bgcolor = "#33CCFF" >\n')
|
self.htmlFile.write(' <tr bgcolor = "#33CCFF" >\n')
|
||||||
self.htmlFile.write(' <th>Test Id</th>\n')
|
self.htmlFile.write(' <th>Test Id</th>\n')
|
||||||
self.htmlFile.write(' <th>Test Desc</th>\n')
|
self.htmlFile.write(' <th>Test Desc</th>\n')
|
||||||
self.htmlFile.write(' <th>Test Options</th>\n')
|
self.htmlFile.write(' <th>Test Options</th>\n')
|
||||||
self.htmlFile.write(' <th>Test Status</th>\n')
|
self.htmlFile.write(' <th>Test Status</th>\n')
|
||||||
|
if (self.htmlUEConnected == -1):
|
||||||
|
terminate_ue_flag = True
|
||||||
|
if (self.ADBIPAddress != 'none'):
|
||||||
|
self.GetAllUEDevices(terminate_ue_flag)
|
||||||
|
self.GetAllCatMDevices(terminate_ue_flag)
|
||||||
|
else:
|
||||||
|
self.UEDevices.append('doughq9rehg')
|
||||||
|
self.UEDevices.append('dnsgiuahgia')
|
||||||
|
self.UEDevices.append('uehgieng9')
|
||||||
|
self.htmlUEConnected = len(self.UEDevices)
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
while (i < self.htmlUEConnected):
|
while (i < self.htmlUEConnected):
|
||||||
self.htmlFile.write(' <th>UE' + str(i) + ' Status</th>\n')
|
self.htmlFile.write(' <th>UE' + str(i) + ' Status</th>\n')
|
||||||
@@ -2010,28 +2059,44 @@ class SSHConnection():
|
|||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlHeaderCreated = True
|
self.htmlHeaderCreated = True
|
||||||
|
|
||||||
def CreateHtmlFooter(self, passStatus):
|
def CreateHtmlTabFooter(self, passStatus):
|
||||||
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
||||||
self.htmlFile.write(' <tr id="FinalStatus">\n')
|
self.htmlFile.write(' <tr">\n')
|
||||||
self.htmlFile.write(' <th bgcolor = "#33CCFF" colspan=2>Final Status</th>\n')
|
self.htmlFile.write(' <th bgcolor = "#33CCFF" colspan=2>Final Tab Status</th>\n')
|
||||||
if passStatus:
|
if passStatus:
|
||||||
self.htmlFile.write(' <th bgcolor = "green" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">PASS</font></th>\n')
|
self.htmlFile.write(' <th bgcolor = "green" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">PASS <span class="glyphicon glyphicon-ok"></span> </font></th>\n')
|
||||||
else:
|
else:
|
||||||
self.htmlFile.write(' <th bgcolor = "red" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">FAIL</font></th>\n')
|
self.htmlFile.write(' <th bgcolor = "red" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">FAIL <span class="glyphicon glyphicon-remove"></span> </font></th>\n')
|
||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.write(' </table>\n')
|
self.htmlFile.write(' </table>\n')
|
||||||
|
self.htmlFile.write(' </div>\n')
|
||||||
|
self.htmlFooterCreated = False
|
||||||
|
|
||||||
|
def CreateHtmlFooter(self, passStatus):
|
||||||
|
if (os.path.isfile('test_results.html')):
|
||||||
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
|
self.htmlFile.write('</div>\n')
|
||||||
|
self.htmlFile.write(' <p></p>\n')
|
||||||
|
self.htmlFile.write(' <table class="table">\n')
|
||||||
|
self.htmlFile.write(' <tr">\n')
|
||||||
|
self.htmlFile.write(' <th bgcolor = "#33CCFF">Final Status</th>\n')
|
||||||
|
if passStatus:
|
||||||
|
self.htmlFile.write(' <th bgcolor="green"><font color="white">PASS <span class="glyphicon glyphicon-ok"></span></font></th>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <th bgcolor="red"><font color="white">FAIL <span class="glyphicon glyphicon-remove"></span> </font></th>\n')
|
||||||
|
self.htmlFile.write(' </tr">\n')
|
||||||
|
self.htmlFile.write(' </table>\n')
|
||||||
self.htmlFile.write(' <p></p>\n')
|
self.htmlFile.write(' <p></p>\n')
|
||||||
self.htmlFile.write(' <div class="well well-lg">End of Test Report -- Copyright <span class="glyphicon glyphicon-copyright-mark"></span> 2018 <a href="http://www.openairinterface.org/">OpenAirInterface</a>. All Rights Reserved.</div>\n')
|
self.htmlFile.write(' <div class="well well-lg">End of Test Report -- Copyright <span class="glyphicon glyphicon-copyright-mark"></span> 2018 <a href="http://www.openairinterface.org/">OpenAirInterface</a>. All Rights Reserved.</div>\n')
|
||||||
self.htmlFile.write('</div></body>\n')
|
self.htmlFile.write('</div></body>\n')
|
||||||
self.htmlFile.write('</html>\n')
|
self.htmlFile.write('</html>\n')
|
||||||
self.htmlFile.close()
|
self.htmlFile.close()
|
||||||
self.htmlFooterCreated = False
|
|
||||||
|
|
||||||
def CreateHtmlTestRow(self, options, status, processesStatus):
|
def CreateHtmlTestRow(self, options, status, processesStatus):
|
||||||
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + SSH.testCase_id + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + self.testCase_id + '</td>\n')
|
||||||
self.htmlFile.write(' <td>' + SSH.desc + '</td>\n')
|
self.htmlFile.write(' <td>' + self.desc + '</td>\n')
|
||||||
self.htmlFile.write(' <td>' + str(options) + '</td>\n')
|
self.htmlFile.write(' <td>' + str(options) + '</td>\n')
|
||||||
if (str(status) == 'OK'):
|
if (str(status) == 'OK'):
|
||||||
self.htmlFile.write(' <td bgcolor = "lightgreen" >' + str(status) + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightgreen" >' + str(status) + '</td>\n')
|
||||||
@@ -2081,8 +2146,8 @@ class SSHConnection():
|
|||||||
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
||||||
addOrangeBK = False
|
addOrangeBK = False
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + SSH.testCase_id + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightcyan" >' + self.testCase_id + '</td>\n')
|
||||||
self.htmlFile.write(' <td>' + SSH.desc + '</td>\n')
|
self.htmlFile.write(' <td>' + self.desc + '</td>\n')
|
||||||
self.htmlFile.write(' <td>' + str(options) + '</td>\n')
|
self.htmlFile.write(' <td>' + str(options) + '</td>\n')
|
||||||
if (str(status) == 'OK'):
|
if (str(status) == 'OK'):
|
||||||
self.htmlFile.write(' <td bgcolor = "lightgreen" >' + str(status) + '</td>\n')
|
self.htmlFile.write(' <td bgcolor = "lightgreen" >' + str(status) + '</td>\n')
|
||||||
@@ -2126,6 +2191,7 @@ def Usage():
|
|||||||
print(' --help Show this help.')
|
print(' --help Show this help.')
|
||||||
print(' --mode=[Mode]')
|
print(' --mode=[Mode]')
|
||||||
print(' TesteNB')
|
print(' TesteNB')
|
||||||
|
print(' InitiateHtml, FinalizeHtml')
|
||||||
print(' TerminateeNB, TerminateUE, TerminateHSS, TerminateMME, TerminateSPGW')
|
print(' TerminateeNB, TerminateUE, TerminateHSS, TerminateMME, TerminateSPGW')
|
||||||
print(' LogCollectBuild, LogCollecteNB, LogCollectHSS, LogCollectMME, LogCollectSPGW, LogCollectPing, LogCollectIperf')
|
print(' LogCollectBuild, LogCollecteNB, LogCollectHSS, LogCollectMME, LogCollectSPGW, LogCollectPing, LogCollectIperf')
|
||||||
print(' --eNBIPAddress=[eNB\'s IP Address]')
|
print(' --eNBIPAddress=[eNB\'s IP Address]')
|
||||||
@@ -2149,7 +2215,7 @@ def Usage():
|
|||||||
print('------------------------------------------------------------')
|
print('------------------------------------------------------------')
|
||||||
|
|
||||||
def CheckClassValidity(action,id):
|
def CheckClassValidity(action,id):
|
||||||
if action != 'Build_eNB' and action != 'Initialize_eNB' and action != 'Terminate_eNB' and action != 'Initialize_UE' and action != 'Terminate_UE' and action != 'Attach_UE' and action != 'Detach_UE' and action != 'Ping' and action != 'Iperf' and action != 'Reboot_UE' and action != 'Initialize_HSS' and action != 'Terminate_HSS' and action != 'Initialize_MME' and action != 'Terminate_MME' and action != 'Initialize_SPGW' and action != 'Terminate_SPGW' and action != 'Initialize_CatM_module' and action != 'Terminate_CatM_module' and action != 'Attach_CatM_module' and action != 'Detach_CatM_module':
|
if action != 'Build_eNB' and action != 'Initialize_eNB' and action != 'Terminate_eNB' and action != 'Initialize_UE' and action != 'Terminate_UE' and action != 'Attach_UE' and action != 'Detach_UE' and action != 'Ping' and action != 'Iperf' and action != 'Reboot_UE' and action != 'Initialize_HSS' and action != 'Terminate_HSS' and action != 'Initialize_MME' and action != 'Terminate_MME' and action != 'Initialize_SPGW' and action != 'Terminate_SPGW' and action != 'Initialize_CatM_module' and action != 'Terminate_CatM_module' and action != 'Attach_CatM_module' and action != 'Detach_CatM_module' and action != 'IdleSleep':
|
||||||
logging.debug('ERROR: test-case ' + id + ' has wrong class ' + action)
|
logging.debug('ERROR: test-case ' + id + ' has wrong class ' + action)
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
@@ -2191,6 +2257,13 @@ def GetParametersFromXML(action):
|
|||||||
logging.debug('ERROR: test-case has wrong profile ' + SSH.iperf_profile)
|
logging.debug('ERROR: test-case has wrong profile ' + SSH.iperf_profile)
|
||||||
SSH.iperf_profile = 'balanced'
|
SSH.iperf_profile = 'balanced'
|
||||||
|
|
||||||
|
if action == 'IdleSleep':
|
||||||
|
string_field = test.findtext('idle_sleep_time_in_sec')
|
||||||
|
if (string_field is None):
|
||||||
|
SSH.idle_sleep_time = 5
|
||||||
|
else:
|
||||||
|
SSH.idle_sleep_time = int(string_field)
|
||||||
|
|
||||||
#check if given test is in list
|
#check if given test is in list
|
||||||
#it is in list if one of the strings in 'list' is at the beginning of 'test'
|
#it is in list if one of the strings in 'list' is at the beginning of 'test'
|
||||||
def test_in_list(test, list):
|
def test_in_list(test, list):
|
||||||
@@ -2281,7 +2354,13 @@ while len(argvs) > 1:
|
|||||||
SSH.ADBPassword = matchReg.group(1)
|
SSH.ADBPassword = matchReg.group(1)
|
||||||
elif re.match('^\-\-XMLTestFile=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-XMLTestFile=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-XMLTestFile=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-XMLTestFile=(.+)$', myArgv, re.IGNORECASE)
|
||||||
SSH.testXMLfile = matchReg.group(1)
|
SSH.testXMLfiles.append(matchReg.group(1))
|
||||||
|
SSH.nbTestXMLfiles += 1
|
||||||
|
elif re.match('^\-\-finalStatus=(.+)$', myArgv, re.IGNORECASE):
|
||||||
|
matchReg = re.match('^\-\-finalStatus=(.+)$', myArgv, re.IGNORECASE)
|
||||||
|
finalStatus = matchReg.group(1)
|
||||||
|
if ((finalStatus == 'true') or (finalStatus == 'True')):
|
||||||
|
SSH.finalStatus = True
|
||||||
else:
|
else:
|
||||||
Usage()
|
Usage()
|
||||||
sys.exit('Invalid Parameter: ' + myArgv)
|
sys.exit('Invalid Parameter: ' + myArgv)
|
||||||
@@ -2347,27 +2426,44 @@ elif re.match('^LogCollectIperf$', mode, re.IGNORECASE):
|
|||||||
Usage()
|
Usage()
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
SSH.LogCollectIperf()
|
SSH.LogCollectIperf()
|
||||||
|
elif re.match('^InitiateHtml$', mode, re.IGNORECASE):
|
||||||
|
if SSH.ADBIPAddress == '' or SSH.ADBUserName == '' or SSH.ADBPassword == '':
|
||||||
|
Usage()
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
count = 0
|
||||||
|
while (count < SSH.nbTestXMLfiles):
|
||||||
|
xml_test_file = sys.path[0] + "/" + SSH.testXMLfiles[count]
|
||||||
|
xmlTree = ET.parse(xml_test_file)
|
||||||
|
xmlRoot = xmlTree.getroot()
|
||||||
|
SSH.htmlTabRefs.append(xmlRoot.findtext('htmlTabRef',default='test-tab-' + str(count)))
|
||||||
|
SSH.htmlTabNames.append(xmlRoot.findtext('htmlTabName',default='Test-' + str(count)))
|
||||||
|
SSH.htmlTabIcons.append(xmlRoot.findtext('htmlTabIcon',default='info-sign'))
|
||||||
|
count += 1
|
||||||
|
SSH.CreateHtmlHeader()
|
||||||
|
elif re.match('^FinalizeHtml$', mode, re.IGNORECASE):
|
||||||
|
SSH.CreateHtmlFooter(SSH.finalStatus)
|
||||||
elif re.match('^TesteNB$', mode, re.IGNORECASE):
|
elif re.match('^TesteNB$', mode, re.IGNORECASE):
|
||||||
if SSH.eNBIPAddress == '' or SSH.eNBRepository == '' or SSH.eNBBranch == '' or SSH.eNBUserName == '' or SSH.eNBPassword == '' or SSH.eNBSourceCodePath == '' or SSH.EPCIPAddress == '' or SSH.EPCUserName == '' or SSH.EPCPassword == '' or SSH.EPCType == '' or SSH.EPCSourceCodePath == '' or SSH.ADBIPAddress == '' or SSH.ADBUserName == '' or SSH.ADBPassword == '':
|
if SSH.eNBIPAddress == '' or SSH.eNBRepository == '' or SSH.eNBBranch == '' or SSH.eNBUserName == '' or SSH.eNBPassword == '' or SSH.eNBSourceCodePath == '' or SSH.EPCIPAddress == '' or SSH.EPCUserName == '' or SSH.EPCPassword == '' or SSH.EPCType == '' or SSH.EPCSourceCodePath == '' or SSH.ADBIPAddress == '' or SSH.ADBUserName == '' or SSH.ADBPassword == '':
|
||||||
Usage()
|
Usage()
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
|
|
||||||
|
if (SSH.EPCIPAddress != 'none'):
|
||||||
SSH.copyout(SSH.EPCIPAddress, SSH.EPCUserName, SSH.EPCPassword, sys.path[0] + "/tcp_iperf_stats.awk", "/tmp")
|
SSH.copyout(SSH.EPCIPAddress, SSH.EPCUserName, SSH.EPCPassword, sys.path[0] + "/tcp_iperf_stats.awk", "/tmp")
|
||||||
SSH.copyout(SSH.EPCIPAddress, SSH.EPCUserName, SSH.EPCPassword, sys.path[0] + "/active_net_interfaces.awk", "/tmp")
|
SSH.copyout(SSH.EPCIPAddress, SSH.EPCUserName, SSH.EPCPassword, sys.path[0] + "/active_net_interfaces.awk", "/tmp")
|
||||||
SSH.CreateHtmlHeader()
|
|
||||||
|
|
||||||
#read test_case_list.xml file
|
#read test_case_list.xml file
|
||||||
# if no parameters for XML file, use default value
|
# if no parameters for XML file, use default value
|
||||||
if SSH.testXMLfile == '':
|
if (SSH.nbTestXMLfiles != 1):
|
||||||
xml_test_file = sys.path[0] + "/test_case_list.xml"
|
xml_test_file = sys.path[0] + "/test_case_list.xml"
|
||||||
else:
|
else:
|
||||||
xml_test_file = sys.path[0] + "/" + SSH.testXMLfile
|
xml_test_file = sys.path[0] + "/" + SSH.testXMLfiles[0]
|
||||||
|
|
||||||
xmlTree = ET.parse(xml_test_file)
|
xmlTree = ET.parse(xml_test_file)
|
||||||
xmlRoot = xmlTree.getroot()
|
xmlRoot = xmlTree.getroot()
|
||||||
|
|
||||||
exclusion_tests=xmlRoot.findtext('TestCaseExclusionList',default='')
|
exclusion_tests=xmlRoot.findtext('TestCaseExclusionList',default='')
|
||||||
requested_tests=xmlRoot.findtext('TestCaseRequestedList',default='')
|
requested_tests=xmlRoot.findtext('TestCaseRequestedList',default='')
|
||||||
|
if (SSH.nbTestXMLfiles == 1):
|
||||||
|
SSH.htmlTabRefs.append(xmlRoot.findtext('htmlTabRef',default='test-tab-0'))
|
||||||
all_tests=xmlRoot.findall('testCase')
|
all_tests=xmlRoot.findall('testCase')
|
||||||
|
|
||||||
exclusion_tests=exclusion_tests.split()
|
exclusion_tests=exclusion_tests.split()
|
||||||
@@ -2405,6 +2501,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE):
|
|||||||
|
|
||||||
signal.signal(signal.SIGUSR1, receive_signal)
|
signal.signal(signal.SIGUSR1, receive_signal)
|
||||||
|
|
||||||
|
SSH.CreateHtmlTabHeader()
|
||||||
|
|
||||||
for test_case_id in todo_tests:
|
for test_case_id in todo_tests:
|
||||||
for test in all_tests:
|
for test in all_tests:
|
||||||
id = test.get('id')
|
id = test.get('id')
|
||||||
@@ -2460,10 +2558,12 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE):
|
|||||||
SSH.InitializeSPGW()
|
SSH.InitializeSPGW()
|
||||||
elif action == 'Terminate_SPGW':
|
elif action == 'Terminate_SPGW':
|
||||||
SSH.TerminateSPGW()
|
SSH.TerminateSPGW()
|
||||||
|
elif action == 'IdleSleep':
|
||||||
|
SSH.IdleSleep()
|
||||||
else:
|
else:
|
||||||
sys.exit('Invalid action')
|
sys.exit('Invalid action')
|
||||||
|
|
||||||
SSH.CreateHtmlFooter(True)
|
SSH.CreateHtmlTabFooter(True)
|
||||||
else:
|
else:
|
||||||
Usage()
|
Usage()
|
||||||
sys.exit('Invalid mode')
|
sys.exit('Invalid mode')
|
||||||
|
|||||||
@@ -310,6 +310,7 @@ function report_build {
|
|||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
|
|
||||||
echo "JENKINS_WKSP = $JENKINS_WKSP"
|
echo "JENKINS_WKSP = $JENKINS_WKSP"
|
||||||
|
echo "GIT_URL = $GIT_URL"
|
||||||
|
|
||||||
cd ${JENKINS_WKSP}
|
cd ${JENKINS_WKSP}
|
||||||
echo "<!DOCTYPE html>" > ./build_results.html
|
echo "<!DOCTYPE html>" > ./build_results.html
|
||||||
@@ -323,6 +324,7 @@ function report_build {
|
|||||||
echo " <base href = \"http://www.openairinterface.org/\" />" >> ./build_results.html
|
echo " <base href = \"http://www.openairinterface.org/\" />" >> ./build_results.html
|
||||||
echo "</head>" >> ./build_results.html
|
echo "</head>" >> ./build_results.html
|
||||||
echo "<body><div class=\"container\">" >> ./build_results.html
|
echo "<body><div class=\"container\">" >> ./build_results.html
|
||||||
|
echo " <br>" >> ./build_results.html
|
||||||
echo " <table style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
echo " <table style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
||||||
echo " <tr style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
echo " <tr style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
||||||
echo " <td style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
echo " <td style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
||||||
@@ -339,45 +341,45 @@ function report_build {
|
|||||||
echo " <br>" >> ./build_results.html
|
echo " <br>" >> ./build_results.html
|
||||||
echo " <table border = \"1\">" >> ./build_results.html
|
echo " <table border = \"1\">" >> ./build_results.html
|
||||||
echo " <tr>" >> ./build_results.html
|
echo " <tr>" >> ./build_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Build Start Time (UTC)</td>" >> ./build_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-time\"></span> Build Start Time (UTC)</td>" >> ./build_results.html
|
||||||
echo " <td>TEMPLATE_BUILD_TIME</td>" >> ./build_results.html
|
echo " <td>TEMPLATE_BUILD_TIME</td>" >> ./build_results.html
|
||||||
echo " </tr>" >> ./build_results.html
|
echo " </tr>" >> ./build_results.html
|
||||||
echo " <tr>" >> ./build_results.html
|
echo " <tr>" >> ./build_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >GIT Repository</td>" >> ./build_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-cloud-upload\"></span> GIT Repository</td>" >> ./build_results.html
|
||||||
echo " <td>$GIT_URL</td>" >> ./build_results.html
|
echo " <td><a href=\"$GIT_URL\">$GIT_URL</a></td>" >> ./build_results.html
|
||||||
echo " </tr>" >> ./build_results.html
|
echo " </tr>" >> ./build_results.html
|
||||||
echo " <tr>" >> ./build_results.html
|
echo " <tr>" >> ./build_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Job Trigger</td>" >> ./build_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-wrench\"></span> Job Trigger</td>" >> ./build_results.html
|
||||||
if [ $PU_TRIG -eq 1 ]; then echo " <td>Push Event</td>" >> ./build_results.html; fi
|
if [ $PU_TRIG -eq 1 ]; then echo " <td>Push Event</td>" >> ./build_results.html; fi
|
||||||
if [ $MR_TRIG -eq 1 ]; then echo " <td>Merge-Request</td>" >> ./build_results.html; fi
|
if [ $MR_TRIG -eq 1 ]; then echo " <td>Merge-Request</td>" >> ./build_results.html; fi
|
||||||
echo " </tr>" >> ./build_results.html
|
echo " </tr>" >> ./build_results.html
|
||||||
if [ $PU_TRIG -eq 1 ]
|
if [ $PU_TRIG -eq 1 ]
|
||||||
then
|
then
|
||||||
echo " <tr>" >> ./build_results.html
|
echo " <tr>" >> ./build_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Branch</td>" >> ./build_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tree-deciduous\"></span> Branch</td>" >> ./build_results.html
|
||||||
echo " <td>$SOURCE_BRANCH</td>" >> ./build_results.html
|
echo " <td>$SOURCE_BRANCH</td>" >> ./build_results.html
|
||||||
echo " </tr>" >> ./build_results.html
|
echo " </tr>" >> ./build_results.html
|
||||||
echo " <tr>" >> ./build_results.html
|
echo " <tr>" >> ./build_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Commit ID</td>" >> ./build_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Commit ID</td>" >> ./build_results.html
|
||||||
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html
|
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html
|
||||||
echo " </tr>" >> ./build_results.html
|
echo " </tr>" >> ./build_results.html
|
||||||
fi
|
fi
|
||||||
if [ $MR_TRIG -eq 1 ]
|
if [ $MR_TRIG -eq 1 ]
|
||||||
then
|
then
|
||||||
echo " <tr>" >> ./build_results.html
|
echo " <tr>" >> ./build_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Source Branch</td>" >> ./build_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-log-out\"></span> Source Branch</td>" >> ./build_results.html
|
||||||
echo " <td>$SOURCE_BRANCH</td>" >> ./build_results.html
|
echo " <td>$SOURCE_BRANCH</td>" >> ./build_results.html
|
||||||
echo " </tr>" >> ./build_results.html
|
echo " </tr>" >> ./build_results.html
|
||||||
echo " <tr>" >> ./build_results.html
|
echo " <tr>" >> ./build_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Source Commit ID</td>" >> ./build_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Source Commit ID</td>" >> ./build_results.html
|
||||||
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html
|
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html
|
||||||
echo " </tr>" >> ./build_results.html
|
echo " </tr>" >> ./build_results.html
|
||||||
echo " <tr>" >> ./build_results.html
|
echo " <tr>" >> ./build_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Target Branch</td>" >> ./build_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-log-in\"></span> Target Branch</td>" >> ./build_results.html
|
||||||
echo " <td>$TARGET_BRANCH</td>" >> ./build_results.html
|
echo " <td>$TARGET_BRANCH</td>" >> ./build_results.html
|
||||||
echo " </tr>" >> ./build_results.html
|
echo " </tr>" >> ./build_results.html
|
||||||
echo " <tr>" >> ./build_results.html
|
echo " <tr>" >> ./build_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Target Commit ID</td>" >> ./build_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Target Commit ID</td>" >> ./build_results.html
|
||||||
echo " <td>$TARGET_COMMIT_ID</td>" >> ./build_results.html
|
echo " <td>$TARGET_COMMIT_ID</td>" >> ./build_results.html
|
||||||
echo " </tr>" >> ./build_results.html
|
echo " </tr>" >> ./build_results.html
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ function report_test {
|
|||||||
echo " <base href = \"http://www.openairinterface.org/\" />" >> ./test_simulator_results.html
|
echo " <base href = \"http://www.openairinterface.org/\" />" >> ./test_simulator_results.html
|
||||||
echo "</head>" >> ./test_simulator_results.html
|
echo "</head>" >> ./test_simulator_results.html
|
||||||
echo "<body><div class=\"container\">" >> ./test_simulator_results.html
|
echo "<body><div class=\"container\">" >> ./test_simulator_results.html
|
||||||
|
echo " <br>" >> ./test_simulator_results.html
|
||||||
echo " <table style=\"border-collapse: collapse; border: none;\">" >> ./test_simulator_results.html
|
echo " <table style=\"border-collapse: collapse; border: none;\">" >> ./test_simulator_results.html
|
||||||
echo " <tr style=\"border-collapse: collapse; border: none;\">" >> ./test_simulator_results.html
|
echo " <tr style=\"border-collapse: collapse; border: none;\">" >> ./test_simulator_results.html
|
||||||
echo " <td style=\"border-collapse: collapse; border: none;\">" >> ./test_simulator_results.html
|
echo " <td style=\"border-collapse: collapse; border: none;\">" >> ./test_simulator_results.html
|
||||||
@@ -116,45 +117,45 @@ function report_test {
|
|||||||
echo " <br>" >> ./test_simulator_results.html
|
echo " <br>" >> ./test_simulator_results.html
|
||||||
echo " <table border = \"1\">" >> ./test_simulator_results.html
|
echo " <table border = \"1\">" >> ./test_simulator_results.html
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Build Start Time (UTC)</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-time\"></span> Build Start Time (UTC)</td>" >> ./test_simulator_results.html
|
||||||
echo " <td>TEMPLATE_BUILD_TIME</td>" >> ./test_simulator_results.html
|
echo " <td>TEMPLATE_BUILD_TIME</td>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >GIT Repository</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-cloud-upload\"></span> GIT Repository</td>" >> ./test_simulator_results.html
|
||||||
echo " <td><a href=\"$GIT_URL\">$GIT_URL</a></td>" >> ./test_simulator_results.html
|
echo " <td><a href=\"$GIT_URL\">$GIT_URL</a></td>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Job Trigger</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-wrench\"></span> Job Trigger</td>" >> ./test_simulator_results.html
|
||||||
if [ $PU_TRIG -eq 1 ]; then echo " <td>Push Event</td>" >> ./test_simulator_results.html; fi
|
if [ $PU_TRIG -eq 1 ]; then echo " <td>Push Event</td>" >> ./test_simulator_results.html; fi
|
||||||
if [ $MR_TRIG -eq 1 ]; then echo " <td>Merge-Request</td>" >> ./test_simulator_results.html; fi
|
if [ $MR_TRIG -eq 1 ]; then echo " <td>Merge-Request</td>" >> ./test_simulator_results.html; fi
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
if [ $PU_TRIG -eq 1 ]
|
if [ $PU_TRIG -eq 1 ]
|
||||||
then
|
then
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Branch</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tree-deciduous\"></span> Branch</td>" >> ./test_simulator_results.html
|
||||||
echo " <td>$SOURCE_BRANCH</td>" >> ./test_simulator_results.html
|
echo " <td>$SOURCE_BRANCH</td>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Commit ID</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Commit ID</td>" >> ./test_simulator_results.html
|
||||||
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./test_simulator_results.html
|
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
fi
|
fi
|
||||||
if [ $MR_TRIG -eq 1 ]
|
if [ $MR_TRIG -eq 1 ]
|
||||||
then
|
then
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Source Branch</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-log-out\"></span> Source Branch</td>" >> ./test_simulator_results.html
|
||||||
echo " <td>$SOURCE_BRANCH</td>" >> ./test_simulator_results.html
|
echo " <td>$SOURCE_BRANCH</td>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Source Commit ID</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Source Commit ID</td>" >> ./test_simulator_results.html
|
||||||
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./test_simulator_results.html
|
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Target Branch</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-log-in\"></span> Target Branch</td>" >> ./test_simulator_results.html
|
||||||
echo " <td>$TARGET_BRANCH</td>" >> ./test_simulator_results.html
|
echo " <td>$TARGET_BRANCH</td>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
echo " <td bgcolor = \"lightcyan\" >Target Commit ID</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Target Commit ID</td>" >> ./test_simulator_results.html
|
||||||
echo " <td>$TARGET_COMMIT_ID</td>" >> ./test_simulator_results.html
|
echo " <td>$TARGET_COMMIT_ID</td>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,3 +1,23 @@
|
|||||||
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
BEGIN{max=0;min=10000}
|
BEGIN{max=0;min=10000}
|
||||||
{
|
{
|
||||||
if ($0 ~/Mbits/) {
|
if ($0 ~/Mbits/) {
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>build-tab</htmlTabRef>
|
||||||
|
<htmlTabName>Build</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010101
|
||||||
|
050101 060101 070101
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010101">
|
||||||
|
<class>Build_eNB</class>
|
||||||
|
<desc>Build eNB (USRP)</desc>
|
||||||
|
<Build_eNB_args>-w USRP -c --eNB</Build_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050101">
|
||||||
|
<class>Initialize_HSS</class>
|
||||||
|
<desc>Initialize HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060101">
|
||||||
|
<class>Initialize_MME</class>
|
||||||
|
<desc>Initialize MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070101">
|
||||||
|
<class>Initialize_SPGW</class>
|
||||||
|
<desc>Initialize SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>epc-closure</htmlTabRef>
|
||||||
|
<htmlTabName>EPC-Closure</htmlTabName>
|
||||||
|
<htmlTabIcon>log-out</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
050201 060201 070201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="050201">
|
||||||
|
<class>Terminate_HSS</class>
|
||||||
|
<desc>Terminate HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060201">
|
||||||
|
<class>Terminate_MME</class>
|
||||||
|
<desc>Terminate MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070201">
|
||||||
|
<class>Terminate_SPGW</class>
|
||||||
|
<desc>Terminate SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-05-tm1</htmlTabRef>
|
||||||
|
<htmlTabName>Test-05MHz-TM1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030104 040301 040501 040602 040601 040603 040642 040641 040643 040401 040201 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030104">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (TDD/Band40/5MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040501">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040601">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(balanced)</desc>
|
||||||
|
<iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040602">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040603">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(unbalanced)</desc>
|
||||||
|
<iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040641">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/2Mbps/UDP)(30 sec)(balanced)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040642">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040643">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/2Mbps/UDP)(30 sec)(unbalanced)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-10-tm1</htmlTabRef>
|
||||||
|
<htmlTabName>Test-10MHz-TM1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030114 040301 040511 040612 040611 040613 040652 040651 040653 040401 040201 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030114">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (TDD/Band40/10MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040511">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (10MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040611">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(balanced)</desc>
|
||||||
|
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040612">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040613">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(unbalanced)</desc>
|
||||||
|
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040651">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/2Mbps/UDP)(30 sec)(balanced)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040652">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040653">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/2Mbps/UDP)(30 sec)(unbalanced)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-20-tm1</htmlTabRef>
|
||||||
|
<htmlTabName>Test-20MHz-TM1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030124 040301 040521 040622 040621 040623 040662 040661 040663 040401 040201 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030124">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (TDD/Band40/20MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band40.tm1.100PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040521">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (20MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040621">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/13.5Mbps/UDP)(30 sec)(balanced)</desc>
|
||||||
|
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040622">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/13.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040623">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/13.5Mbps/UDP)(30 sec)(unbalanced)</desc>
|
||||||
|
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040661">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/2Mbps/UDP)(30 sec)(balanced)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040662">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040663">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/2Mbps/UDP)(30 sec)(unbalanced)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>tracer-test</htmlTabRef>
|
||||||
|
<htmlTabName>T-Tracer</htmlTabName>
|
||||||
|
<htmlTabIcon>duplicate</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030100 040300 040401 040201 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030100">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (TDD/Band40/5MHz) with T Tracer on</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf --T_stdout 0</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040300">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach single UE</desc>
|
||||||
|
<nbMaxUEtoAttach>1</nbMaxUEtoAttach>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -1,363 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
|
||||||
this work for additional information regarding copyright ownership.
|
|
||||||
The OpenAirInterface Software Alliance licenses this file to You under
|
|
||||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
||||||
except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.openairinterface.org/?page_id=698
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
||||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
||||||
contact@openairinterface.org
|
|
||||||
|
|
||||||
-->
|
|
||||||
<testCaseList>
|
|
||||||
<TestCaseRequestedList>
|
|
||||||
010101
|
|
||||||
050101 060101 070101 040101
|
|
||||||
030100 040300 040401 040201 030201
|
|
||||||
030101 040301 040501 040603 040604 040605 040606 040607 040641 040642 040643 040644 040401 040201 030201
|
|
||||||
030111 040301 040511 040613 040614 040615 040616 040617 040651 040652 040653 040654 040401 040201 030201
|
|
||||||
030121 040301 040521 040623 040624 040625 040626 040627 040662 040661 040663 040664 040401 040201 030201
|
|
||||||
050201 060201 070201
|
|
||||||
</TestCaseRequestedList>
|
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
|
||||||
|
|
||||||
<testCase id="010101">
|
|
||||||
<class>Build_eNB</class>
|
|
||||||
<desc>Build eNB (USRP)</desc>
|
|
||||||
<Build_eNB_args>-w USRP -c --eNB</Build_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030100">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize eNB (FDD/Band7/5MHz) with T Tracer on</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --T_stdout 0</Initialize_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030101">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize eNB (FDD/Band7/5MHz)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030111">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize eNB (FDD/Band7/10MHz)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030121">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize eNB (FDD/Band7/20MHz)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030201">
|
|
||||||
<class>Terminate_eNB</class>
|
|
||||||
<desc>Terminate eNB</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040101">
|
|
||||||
<class>Initialize_UE</class>
|
|
||||||
<desc>Initialize UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040201">
|
|
||||||
<class>Terminate_UE</class>
|
|
||||||
<desc>Terminate UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040300">
|
|
||||||
<class>Attach_UE</class>
|
|
||||||
<desc>Attach single UE</desc>
|
|
||||||
<nbMaxUEtoAttach>1</nbMaxUEtoAttach>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040301">
|
|
||||||
<class>Attach_UE</class>
|
|
||||||
<desc>Attach UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040401">
|
|
||||||
<class>Detach_UE</class>
|
|
||||||
<desc>Detach UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040501">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (5MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040511">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (10MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040521">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (20MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040603">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040604">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040605">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(unbalanced profile)</desc>
|
|
||||||
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>unbalanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040606">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - DL/TCP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040607">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - DL/TCP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040641">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - UL/9Mbps/UDP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-u -b 9M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040642">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - UL/9Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 9M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040643">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - UL/TCP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040644">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - UL/TCP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040613">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - DL/30Mbps/UDP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-u -b 30M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040614">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - DL/30Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 30M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040615">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - DL/30Mbps/UDP)(30 sec)(unbalanced profile)</desc>
|
|
||||||
<iperf_args>-u -b 30M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>unbalanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040616">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - DL/TCP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040617">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - DL/TCP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040651">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - UL/20Mbps/UDP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040652">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - UL/20Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040653">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - UL/TCP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040654">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - UL/TCP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040623">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - DL/70Mbps/UDP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-u -b 70M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040624">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - DL/70Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 70M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040625">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - DL/70Mbps/UDP)(30 sec)(unbalanced profile)</desc>
|
|
||||||
<iperf_args>-u -b 70M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>unbalanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040626">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - DL/TCP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040627">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - DL/TCP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040661">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - UL/20Mbps/UDP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040662">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - UL/20Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040663">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - UL/TCP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040664">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - UL/TCP)(30 sec)(balanced profile)</desc>
|
|
||||||
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="050101">
|
|
||||||
<class>Initialize_HSS</class>
|
|
||||||
<desc>Initialize HSS</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="060101">
|
|
||||||
<class>Initialize_MME</class>
|
|
||||||
<desc>Initialize MME</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="070101">
|
|
||||||
<class>Initialize_SPGW</class>
|
|
||||||
<desc>Initialize SPGW</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="050201">
|
|
||||||
<class>Terminate_HSS</class>
|
|
||||||
<desc>Terminate HSS</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="060201">
|
|
||||||
<class>Terminate_MME</class>
|
|
||||||
<desc>Terminate MME</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="070201">
|
|
||||||
<class>Terminate_SPGW</class>
|
|
||||||
<desc>Terminate SPGW</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
</testCaseList>
|
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>build-tab</htmlTabRef>
|
||||||
|
<htmlTabName>Build</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010101
|
||||||
|
050101 060101 070101
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010101">
|
||||||
|
<class>Build_eNB</class>
|
||||||
|
<desc>Build eNB (USRP)</desc>
|
||||||
|
<Build_eNB_args>-w USRP -c --eNB</Build_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050101">
|
||||||
|
<class>Initialize_HSS</class>
|
||||||
|
<desc>Initialize HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060101">
|
||||||
|
<class>Initialize_MME</class>
|
||||||
|
<desc>Initialize MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070101">
|
||||||
|
<class>Initialize_SPGW</class>
|
||||||
|
<desc>Initialize SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>epc-closure</htmlTabRef>
|
||||||
|
<htmlTabName>EPC-Closure</htmlTabName>
|
||||||
|
<htmlTabIcon>log-out</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
050201 060201 070201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="050201">
|
||||||
|
<class>Terminate_HSS</class>
|
||||||
|
<desc>Terminate HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060201">
|
||||||
|
<class>Terminate_MME</class>
|
||||||
|
<desc>Terminate MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070201">
|
||||||
|
<class>Terminate_SPGW</class>
|
||||||
|
<desc>Terminate SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-05-tm1</htmlTabRef>
|
||||||
|
<htmlTabName>Test-05MHz-TM1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030101 040301 040501 040603 040604 040605 040606 040607 040641 040642 040643 040644 040401 040201 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band7/5MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040501">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040603">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040604">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040605">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(unbalanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040606">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/TCP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040607">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/TCP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040641">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/9Mbps/UDP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 9M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040642">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/9Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 9M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040643">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/TCP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040644">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/TCP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-10-tm1</htmlTabRef>
|
||||||
|
<htmlTabName>Test-10MHz-TM1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030111 040301 040511 040613 040614 040615 040616 040617 040651 040652 040653 040654 040401 040201 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030111">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band7/10MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040511">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (10MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040613">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/30Mbps/UDP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 30M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040614">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/30Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 30M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040615">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/30Mbps/UDP)(30 sec)(unbalanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 30M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040616">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/TCP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040617">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/TCP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040651">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/20Mbps/UDP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040652">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/20Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040653">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/TCP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040654">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/TCP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-20-tm1</htmlTabRef>
|
||||||
|
<htmlTabName>Test-20MHz-TM1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030121 040301 040521 040623 040624 040625 040626 040627 040662 040661 040663 040664 040401 040201 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030121">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band7/20MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040521">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (20MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040623">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/70Mbps/UDP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 70M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040624">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/70Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 70M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040625">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/70Mbps/UDP)(30 sec)(unbalanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 70M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040626">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/TCP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040627">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/TCP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040661">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/20Mbps/UDP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040662">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/20Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040663">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/TCP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040664">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/TCP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>tracer-test</htmlTabRef>
|
||||||
|
<htmlTabName>T-Tracer</htmlTabName>
|
||||||
|
<htmlTabIcon>duplicate</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030100 040300 040401 040201 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030100">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band7/5MHz) with T Tracer on</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --T_stdout 0</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040300">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach single UE</desc>
|
||||||
|
<nbMaxUEtoAttach>1</nbMaxUEtoAttach>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -1,239 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
|
||||||
this work for additional information regarding copyright ownership.
|
|
||||||
The OpenAirInterface Software Alliance licenses this file to You under
|
|
||||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
||||||
except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.openairinterface.org/?page_id=698
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
||||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
||||||
contact@openairinterface.org
|
|
||||||
|
|
||||||
-->
|
|
||||||
<testCaseList>
|
|
||||||
<TestCaseRequestedList>
|
|
||||||
010101
|
|
||||||
050101 060101 070101 040101
|
|
||||||
030100 040300 040401 040201 030201
|
|
||||||
030104 040301 040501 040602 040601 040603 040642 040641 040643 040401 040201 030201
|
|
||||||
030114 040301 040511 040612 040611 040613 040652 040651 040653 040401 040201 030201
|
|
||||||
050201 060201 070201
|
|
||||||
</TestCaseRequestedList>
|
|
||||||
<!-- 20MHz is not stable enough to be run -->
|
|
||||||
<!--
|
|
||||||
030124 040301 040521 040622 040621 040623 040662 040661 040663 040401 040201 030201
|
|
||||||
-->
|
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
|
||||||
|
|
||||||
<testCase id="010101">
|
|
||||||
<class>Build_eNB</class>
|
|
||||||
<desc>Build eNB (USRP)</desc>
|
|
||||||
<Build_eNB_args>-w USRP -c --eNB</Build_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030100">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize eNB (TDD/Band40/5MHz) with T Tracer on</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf --T_stdout 0</Initialize_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030104">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize eNB (TDD/Band40/5MHz)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030114">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize eNB (TDD/Band40/10MHz/info)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030106">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize eNB (TDD/Band40/20MHz/info)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band40.tm1.100PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030201">
|
|
||||||
<class>Terminate_eNB</class>
|
|
||||||
<desc>Terminate eNB</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040101">
|
|
||||||
<class>Initialize_UE</class>
|
|
||||||
<desc>Initialize UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040201">
|
|
||||||
<class>Terminate_UE</class>
|
|
||||||
<desc>Terminate UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040300">
|
|
||||||
<class>Attach_UE</class>
|
|
||||||
<desc>Attach single UE</desc>
|
|
||||||
<nbMaxUEtoAttach>1</nbMaxUEtoAttach>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040301">
|
|
||||||
<class>Attach_UE</class>
|
|
||||||
<desc>Attach UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040401">
|
|
||||||
<class>Detach_UE</class>
|
|
||||||
<desc>Detach UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040501">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (5MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040511">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (10MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040601">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(balanced)</desc>
|
|
||||||
<iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040602">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
|
||||||
<iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040603">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(unbalanced)</desc>
|
|
||||||
<iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>unbalanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040611">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(balanced)</desc>
|
|
||||||
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040612">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
|
||||||
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040613">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(unbalanced)</desc>
|
|
||||||
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>unbalanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040641">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - UL/2Mbps/UDP)(30 sec)(balanced)</desc>
|
|
||||||
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040642">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
|
||||||
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040643">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - UL/2Mbps/UDP)(30 sec)(unbalanced)</desc>
|
|
||||||
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>unbalanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040651">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - UL/2Mbps/UDP)(30 sec)(balanced)</desc>
|
|
||||||
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>balanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040652">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
|
||||||
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040653">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - UL/2Mbps/UDP)(30 sec)(unbalanced)</desc>
|
|
||||||
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>unbalanced</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="050101">
|
|
||||||
<class>Initialize_HSS</class>
|
|
||||||
<desc>Initialize HSS</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="060101">
|
|
||||||
<class>Initialize_MME</class>
|
|
||||||
<desc>Initialize MME</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="070101">
|
|
||||||
<class>Initialize_SPGW</class>
|
|
||||||
<desc>Initialize SPGW</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="050201">
|
|
||||||
<class>Terminate_HSS</class>
|
|
||||||
<desc>Terminate HSS</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="060201">
|
|
||||||
<class>Terminate_MME</class>
|
|
||||||
<desc>Terminate MME</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="070201">
|
|
||||||
<class>Terminate_SPGW</class>
|
|
||||||
<desc>Terminate SPGW</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
</testCaseList>
|
|
||||||
@@ -1,217 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
|
||||||
this work for additional information regarding copyright ownership.
|
|
||||||
The OpenAirInterface Software Alliance licenses this file to You under
|
|
||||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
||||||
except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.openairinterface.org/?page_id=698
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
||||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
||||||
contact@openairinterface.org
|
|
||||||
|
|
||||||
-->
|
|
||||||
<testCaseList>
|
|
||||||
<!-- Only 5MHz/10MHz is tested since 20MHz does not work as in monolithic -->
|
|
||||||
<TestCaseRequestedList>
|
|
||||||
010101
|
|
||||||
050101 060101 070101 040101
|
|
||||||
030104 030105 040301 040501 040602 040642 040401 040201 030201 030202
|
|
||||||
030114 030115 040301 040511 040612 040652 040401 040201 030201 030202
|
|
||||||
050201 060201 070201
|
|
||||||
</TestCaseRequestedList>
|
|
||||||
<!--
|
|
||||||
030124 030125 040301 040521 040622 040662 040401 040201 030201 030202
|
|
||||||
-->
|
|
||||||
<TestCaseExclusionList>
|
|
||||||
</TestCaseExclusionList>
|
|
||||||
|
|
||||||
<testCase id="010101">
|
|
||||||
<class>Build_eNB</class>
|
|
||||||
<desc>Build eNB (USRP -- Ethernet Fronthaul)</desc>
|
|
||||||
<Build_eNB_args>-t ETHERNET -w USRP -c --eNB</Build_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030104">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RRU (TDD/Band40)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.tdd.band40.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030105">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RCC (TDD/Band40/5MHz)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band40.tm1.25PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>1</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030114">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RRU (TDD/Band40)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.tdd.band40.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030115">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RCC (TDD/Band40/10MHz/info)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band40.tm1.50PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>1</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030124">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RRU (TDD/Band40)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.tdd.band40.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030125">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RCC (TDD/Band40/20MHz/info)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band40.tm1.100PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>1</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030201">
|
|
||||||
<class>Terminate_eNB</class>
|
|
||||||
<desc>Terminate RCC</desc>
|
|
||||||
<eNB_instance>1</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030202">
|
|
||||||
<class>Terminate_eNB</class>
|
|
||||||
<desc>Terminate RRU</desc>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040101">
|
|
||||||
<class>Initialize_UE</class>
|
|
||||||
<desc>Initialize UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040201">
|
|
||||||
<class>Terminate_UE</class>
|
|
||||||
<desc>Terminate UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040301">
|
|
||||||
<class>Attach_UE</class>
|
|
||||||
<desc>Attach UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040401">
|
|
||||||
<class>Detach_UE</class>
|
|
||||||
<desc>Detach UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040501">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (5MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040511">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (10MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040521">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (20MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040602">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
|
||||||
<iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040612">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
|
||||||
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040622">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - DL/13.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
|
||||||
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040642">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
|
||||||
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040652">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
|
||||||
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040662">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
|
||||||
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="050101">
|
|
||||||
<class>Initialize_HSS</class>
|
|
||||||
<desc>Initialize HSS</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="060101">
|
|
||||||
<class>Initialize_MME</class>
|
|
||||||
<desc>Initialize MME</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="070101">
|
|
||||||
<class>Initialize_SPGW</class>
|
|
||||||
<desc>Initialize SPGW</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="050201">
|
|
||||||
<class>Terminate_HSS</class>
|
|
||||||
<desc>Terminate HSS</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="060201">
|
|
||||||
<class>Terminate_MME</class>
|
|
||||||
<desc>Terminate MME</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="070201">
|
|
||||||
<class>Terminate_SPGW</class>
|
|
||||||
<desc>Terminate SPGW</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
</testCaseList>
|
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>build-tab</htmlTabRef>
|
||||||
|
<htmlTabName>Build</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010101
|
||||||
|
050101 060101 070101
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010101">
|
||||||
|
<class>Build_eNB</class>
|
||||||
|
<desc>Build eNB (USRP -- Ethernet Fronthaul)</desc>
|
||||||
|
<Build_eNB_args>-t ETHERNET -w USRP -c --eNB</Build_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050101">
|
||||||
|
<class>Initialize_HSS</class>
|
||||||
|
<desc>Initialize HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060101">
|
||||||
|
<class>Initialize_MME</class>
|
||||||
|
<desc>Initialize MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070101">
|
||||||
|
<class>Initialize_SPGW</class>
|
||||||
|
<desc>Initialize SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>epc-closure</htmlTabRef>
|
||||||
|
<htmlTabName>EPC-Closure</htmlTabName>
|
||||||
|
<htmlTabIcon>log-out</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
050201 060201 070201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="050201">
|
||||||
|
<class>Terminate_HSS</class>
|
||||||
|
<desc>Terminate HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060201">
|
||||||
|
<class>Terminate_MME</class>
|
||||||
|
<desc>Terminate MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070201">
|
||||||
|
<class>Terminate_SPGW</class>
|
||||||
|
<desc>Terminate SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-05</htmlTabRef>
|
||||||
|
<htmlTabName>Test-05MHz</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030104 030105 040301 040501 040602 040642 040401 040201 030201 030202
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030104">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RRU (TDD/Band40)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.tdd.band40.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030105">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RCC (TDD/Band40/5MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band40.tm1.25PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RCC</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RRU</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040501">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040602">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040642">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-10</htmlTabRef>
|
||||||
|
<htmlTabName>Test-10MHz</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030114 030115 040301 040511 040612 040652 040401 040201 030201 030202
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030114">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RRU (TDD/Band40)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.tdd.band40.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030115">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RCC (TDD/Band40/10MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band40.tm1.50PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RCC</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RRU</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040511">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (10MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040612">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040652">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-20</htmlTabRef>
|
||||||
|
<htmlTabName>Test-20MHz</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030124 030125 040301 040521 040622 040662 040401 040201 030201 030202
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030124">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RRU (TDD/Band40)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.tdd.band40.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030125">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RCC (TDD/Band40/20MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band40.tm1.100PRB.FairScheduler.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RCC</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RRU</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040521">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (20MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>25</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040622">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/13.5Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040662">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -1,214 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
|
||||||
this work for additional information regarding copyright ownership.
|
|
||||||
The OpenAirInterface Software Alliance licenses this file to You under
|
|
||||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
||||||
except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.openairinterface.org/?page_id=698
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
||||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
||||||
contact@openairinterface.org
|
|
||||||
|
|
||||||
-->
|
|
||||||
<testCaseList>
|
|
||||||
<TestCaseRequestedList>
|
|
||||||
010101
|
|
||||||
050101 060101 070101 040101
|
|
||||||
030101 030102 040301 040501 040604 040642 040401 040201 030201 030202
|
|
||||||
030111 030112 040301 040511 040614 040652 040401 040201 030201 030202
|
|
||||||
030121 030122 040301 040521 040624 040662 040401 040201 030201 030202
|
|
||||||
050201 060201 070201
|
|
||||||
</TestCaseRequestedList>
|
|
||||||
<TestCaseExclusionList>
|
|
||||||
</TestCaseExclusionList>
|
|
||||||
|
|
||||||
<testCase id="010101">
|
|
||||||
<class>Build_eNB</class>
|
|
||||||
<desc>Build eNB (USRP -- Ethernet Fronthaul)</desc>
|
|
||||||
<Build_eNB_args>-t ETHERNET -w USRP -c --eNB</Build_eNB_args>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030101">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RRU (FDD/Band7)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.fdd.band7.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>1</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030102">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RCC (FDD/Band7/5MHz)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band7.tm1.if4p5.lo.25PRB.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030111">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RRU (FDD/Band7)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.fdd.band7.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>1</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030112">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RCC (FDD/Band7/10MHz)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band7.tm1.if4p5.lo.50PRB.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030121">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RRU (FDD/Band7)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.fdd.band7.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>1</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030122">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize RCC (FDD/Band7/20MHz)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band7.tm1.if4p5.lo.100PRB.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030201">
|
|
||||||
<class>Terminate_eNB</class>
|
|
||||||
<desc>Terminate RCC</desc>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="030202">
|
|
||||||
<class>Terminate_eNB</class>
|
|
||||||
<desc>Terminate RRU</desc>
|
|
||||||
<eNB_instance>1</eNB_instance>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040101">
|
|
||||||
<class>Initialize_UE</class>
|
|
||||||
<desc>Initialize UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040201">
|
|
||||||
<class>Terminate_UE</class>
|
|
||||||
<desc>Terminate UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040301">
|
|
||||||
<class>Attach_UE</class>
|
|
||||||
<desc>Attach UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040401">
|
|
||||||
<class>Detach_UE</class>
|
|
||||||
<desc>Detach UE</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040501">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (5MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040604">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040642">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (5MHz - UL/9Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 9M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040511">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (10MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040614">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - DL/32Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 32M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040652">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (10MHz - UL/20Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040521">
|
|
||||||
<class>Ping</class>
|
|
||||||
<desc>ping (20MHz - 20 sec)</desc>
|
|
||||||
<ping_args>-c 20</ping_args>
|
|
||||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040624">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - DL/70Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 70M -t 30 -i 1</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040662">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (20MHz - UL/20Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="050101">
|
|
||||||
<class>Initialize_HSS</class>
|
|
||||||
<desc>Initialize HSS</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="060101">
|
|
||||||
<class>Initialize_MME</class>
|
|
||||||
<desc>Initialize MME</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="070101">
|
|
||||||
<class>Initialize_SPGW</class>
|
|
||||||
<desc>Initialize SPGW</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="050201">
|
|
||||||
<class>Terminate_HSS</class>
|
|
||||||
<desc>Terminate HSS</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="060201">
|
|
||||||
<class>Terminate_MME</class>
|
|
||||||
<desc>Terminate MME</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="070201">
|
|
||||||
<class>Terminate_SPGW</class>
|
|
||||||
<desc>Terminate SPGW</desc>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
</testCaseList>
|
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>build-tab</htmlTabRef>
|
||||||
|
<htmlTabName>Build</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010101
|
||||||
|
050101 060101 070101 040101
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010101">
|
||||||
|
<class>Build_eNB</class>
|
||||||
|
<desc>Build eNB (USRP -- Ethernet Fronthaul)</desc>
|
||||||
|
<Build_eNB_args>-t ETHERNET -w USRP -c --eNB</Build_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050101">
|
||||||
|
<class>Initialize_HSS</class>
|
||||||
|
<desc>Initialize HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060101">
|
||||||
|
<class>Initialize_MME</class>
|
||||||
|
<desc>Initialize MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070101">
|
||||||
|
<class>Initialize_SPGW</class>
|
||||||
|
<desc>Initialize SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>epc-closure</htmlTabRef>
|
||||||
|
<htmlTabName>EPC-Closure</htmlTabName>
|
||||||
|
<htmlTabIcon>log-out</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
050201 060201 070201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="050201">
|
||||||
|
<class>Terminate_HSS</class>
|
||||||
|
<desc>Terminate HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060201">
|
||||||
|
<class>Terminate_MME</class>
|
||||||
|
<desc>Terminate MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070201">
|
||||||
|
<class>Terminate_SPGW</class>
|
||||||
|
<desc>Terminate SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-05</htmlTabRef>
|
||||||
|
<htmlTabName>Test-05MHz</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030101 030102 040301 040501 040604 040642 040401 040201 030201 030202
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RRU (FDD/Band7)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.fdd.band7.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030102">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RCC (FDD/Band7/5MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band7.tm1.if4p5.lo.25PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RCC</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RRU</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040501">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040604">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040642">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/9Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 9M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-10</htmlTabRef>
|
||||||
|
<htmlTabName>Test-10MHz</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030111 030112 040301 040511 040614 040652 040401 040201 030201 030202
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030111">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RRU (FDD/Band7)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.fdd.band7.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030112">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RCC (FDD/Band7/10MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band7.tm1.if4p5.lo.50PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RCC</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RRU</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040511">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (10MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040614">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/32Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 32M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040652">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/20Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-20</htmlTabRef>
|
||||||
|
<htmlTabName>Test-20MHz</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030121 030122 040301 040521 040624 040662 040401 040201 030201 030202
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030121">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RRU (FDD/Band7)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rru.fdd.band7.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030122">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize RCC (FDD/Band7/20MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/rcc.band7.tm1.if4p5.lo.100PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RCC</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate RRU</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040521">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (20MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040624">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/70Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 70M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040662">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/20Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -260,17 +260,17 @@ add_boolean_option(ENABLE_ITTI True "ITTI is internal messaging, should remain e
|
|||||||
set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
|
set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
|
||||||
if (${ENABLE_ITTI})
|
if (${ENABLE_ITTI})
|
||||||
add_library(ITTI
|
add_library(ITTI
|
||||||
# add .h files if depend on (this one is generated)
|
|
||||||
${OCP_ITTI}/intertask_interface.cpp
|
${OCP_ITTI}/intertask_interface.cpp
|
||||||
${OPENAIR_DIR}/common/utils/backtrace.c
|
${OPENAIR_DIR}/common/utils/backtrace.c
|
||||||
${OPENAIR_DIR}/common/utils/memory_pools.c
|
${OPENAIR_DIR}/common/utils/memory_pools.c
|
||||||
)
|
)
|
||||||
|
add_dependencies(ITTI rrc_flag)
|
||||||
set(ITTI_LIB ITTI)
|
set(ITTI_LIB ITTI)
|
||||||
set(GTPU_need_ITTI ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_eNB.c)
|
set(GTPU_need_ITTI ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_eNB.c)
|
||||||
endif (${ENABLE_ITTI})
|
endif (${ENABLE_ITTI})
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
# ASN.1 grammar C code generation & dependancies
|
# ASN.1 grammar C code generation & dependencies
|
||||||
################################
|
################################
|
||||||
# A difficulty: asn1c generates C code of a un-predictable list of files
|
# A difficulty: asn1c generates C code of a un-predictable list of files
|
||||||
# so, generate the c from asn1c once at cmake run time
|
# so, generate the c from asn1c once at cmake run time
|
||||||
@@ -278,8 +278,6 @@ endif (${ENABLE_ITTI})
|
|||||||
# (so creating new asn.1 objects instead of modifying the object attributes)
|
# (so creating new asn.1 objects instead of modifying the object attributes)
|
||||||
# New C code source file, cmake must be re-run (instead of re-running make only)
|
# New C code source file, cmake must be re-run (instead of re-running make only)
|
||||||
#############
|
#############
|
||||||
# set(asn1c_call "${OPENAIR_CMAKE}/tools/generate_asn1")
|
|
||||||
# set(fix_asn1c_call "${OPENAIR_CMAKE}/tools/fix_asn1")
|
|
||||||
set(asn1_generated_dir ${OPENAIR_BIN_DIR})
|
set(asn1_generated_dir ${OPENAIR_BIN_DIR})
|
||||||
|
|
||||||
set(protoc_call "${OPENAIR_CMAKE}/tools/generate_protobuf")
|
set(protoc_call "${OPENAIR_CMAKE}/tools/generate_protobuf")
|
||||||
@@ -317,32 +315,27 @@ elseif (${RRC_ASN1_VERSION} STREQUAL "Rel15")
|
|||||||
endif (${RRC_ASN1_VERSION} STREQUAL "Rel8")
|
endif (${RRC_ASN1_VERSION} STREQUAL "Rel8")
|
||||||
add_definitions(-DLTE_RRC_VERSION=${LTE_RRC_VERSION})
|
add_definitions(-DLTE_RRC_VERSION=${LTE_RRC_VERSION})
|
||||||
set (RRC_FULL_DIR ${asn1_generated_dir}/RRC_${RRC_ASN1_VERSION})
|
set (RRC_FULL_DIR ${asn1_generated_dir}/RRC_${RRC_ASN1_VERSION})
|
||||||
message("calling ASN1C_PREFIX=LTE_ asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR}")
|
|
||||||
execute_process(COMMAND mkdir -p ${RRC_FULL_DIR}
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
COMMAND env "ASN1C_PREFIX=LTE_" asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR}
|
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${RRC_FULL_DIR}" "${RRC_GRAMMAR}" "LTE_"
|
||||||
RESULT_VARIABLE ret)
|
RESULT_VARIABLE ret)
|
||||||
if (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
message(FATAL_ERROR "${ret}: error")
|
message(FATAL_ERROR "${ret}: error")
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
|
|
||||||
file(GLOB rrc_source ${RRC_FULL_DIR}/*.c)
|
file(GLOB rrc_source ${RRC_FULL_DIR}/*.c)
|
||||||
file(GLOB rrc_h ${RRC_FULL_DIR}/*.h)
|
add_custom_target (
|
||||||
set(rrc_h ${rrc_h} ${RRC_FULL_DIR}/asn_constant.h)
|
rrc_flag ALL
|
||||||
set_source_files_properties(${rrc_source} PROPERTIES COMPILE_FLAGS -w) # suppress warnings from generated code
|
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${RRC_FULL_DIR}" "${RRC_GRAMMAR}" "LTE_"
|
||||||
add_library(RRC_LIB ${rrc_h} ${rrc_source}
|
|
||||||
${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1_msg.c
|
|
||||||
${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c)
|
|
||||||
include_directories ("${RRC_FULL_DIR}")
|
|
||||||
|
|
||||||
# add the command to generate the source code
|
|
||||||
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
|
||||||
add_custom_command (
|
|
||||||
OUTPUT ${RRC_FULL_DIR}/asn_constant.h
|
|
||||||
COMMAND mkdir -p ${RRC_FULL_DIR}
|
|
||||||
COMMAND env "ASN1C_PREFIX=LTE_" asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR}
|
|
||||||
DEPENDS ${RRC_GRAMMAR}
|
DEPENDS ${RRC_GRAMMAR}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set_source_files_properties(${rrc_source} PROPERTIES COMPILE_FLAGS -w) # suppress warnings from generated code
|
||||||
|
add_library(RRC_LIB ${rrc_source}
|
||||||
|
${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1_msg.c
|
||||||
|
${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c)
|
||||||
|
add_dependencies(RRC_LIB rrc_flag)
|
||||||
|
include_directories ("${RRC_FULL_DIR}")
|
||||||
|
|
||||||
# S1AP
|
# S1AP
|
||||||
# Same limitation as described in RRC: unknown generated file list
|
# Same limitation as described in RRC: unknown generated file list
|
||||||
# so we generate it at cmake time
|
# so we generate it at cmake time
|
||||||
@@ -378,28 +371,26 @@ endif(${S1AP_RELEASE} STREQUAL "R8")
|
|||||||
add_definitions(-DS1AP_VERSION=${S1AP_VERSION})
|
add_definitions(-DS1AP_VERSION=${S1AP_VERSION})
|
||||||
set(S1AP_ASN_DIR ${S1AP_DIR}/MESSAGES/ASN1/${S1AP_RELEASE})
|
set(S1AP_ASN_DIR ${S1AP_DIR}/MESSAGES/ASN1/${S1AP_RELEASE})
|
||||||
set(S1AP_C_DIR ${asn1_generated_dir}/S1AP_${S1AP_RELEASE})
|
set(S1AP_C_DIR ${asn1_generated_dir}/S1AP_${S1AP_RELEASE})
|
||||||
message("calling ASN1C_PREFIX=S1AP_ asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}")
|
|
||||||
execute_process(COMMAND mkdir -p ${S1AP_C_DIR}
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
COMMAND env "ASN1C_PREFIX=S1AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}
|
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${S1AP_C_DIR}" "${S1AP_ASN_DIR}/${S1AP_ASN_FILES}" "S1AP_" -fno-include-deps
|
||||||
RESULT_VARIABLE ret)
|
RESULT_VARIABLE ret)
|
||||||
if (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
message(FATAL_ERROR "${ret}: error")
|
message(FATAL_ERROR "${ret}: error")
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
file(GLOB S1AP_source ${S1AP_C_DIR}/*.c)
|
file(GLOB S1AP_source ${S1AP_C_DIR}/*.c)
|
||||||
|
|
||||||
file(GLOB s1ap_h ${S1AP_C_DIR}/*.h)
|
add_custom_target (
|
||||||
set(s1ap_h ${s1ap_h})
|
s1ap_flag ALL
|
||||||
|
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${S1AP_C_DIR}" "${S1AP_ASN_DIR}/${S1AP_ASN_FILES}" "S1AP_" -fno-include-deps
|
||||||
add_custom_command (
|
DEPENDS "${S1AP_ASN_DIR}/${S1AP_ASN_FILES}"
|
||||||
OUTPUT ${S1AP_C_DIR}/S1AP_asn_constant.h
|
|
||||||
COMMAND mkdir -p ${S1AP_C_DIR}
|
|
||||||
COMMAND env "ASN1C_PREFIX=S1AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}
|
|
||||||
DEPENDS ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(S1AP_LIB
|
add_library(S1AP_LIB
|
||||||
${S1AP_source}
|
${S1AP_source}
|
||||||
${S1AP_DIR}/s1ap_common.c
|
${S1AP_DIR}/s1ap_common.c
|
||||||
)
|
)
|
||||||
|
add_dependencies(S1AP_LIB rrc_flag s1ap_flag)
|
||||||
|
|
||||||
include_directories ("${S1AP_C_DIR}")
|
include_directories ("${S1AP_C_DIR}")
|
||||||
include_directories ("${S1AP_DIR}")
|
include_directories ("${S1AP_DIR}")
|
||||||
@@ -418,6 +409,7 @@ add_library(S1AP_ENB
|
|||||||
${S1AP_DIR}/s1ap_eNB_trace.c
|
${S1AP_DIR}/s1ap_eNB_trace.c
|
||||||
${S1AP_DIR}/s1ap_eNB_ue_context.c
|
${S1AP_DIR}/s1ap_eNB_ue_context.c
|
||||||
)
|
)
|
||||||
|
add_dependencies(S1AP_ENB rrc_flag s1ap_flag)
|
||||||
|
|
||||||
#X2AP
|
#X2AP
|
||||||
# Same limitation as described in RRC/S1AP: unknown generated file list
|
# Same limitation as described in RRC/S1AP: unknown generated file list
|
||||||
@@ -445,22 +437,19 @@ endif(${X2AP_RELEASE} STREQUAL "R8")
|
|||||||
add_definitions(-DX2AP_VERSION=${X2AP_VERSION})
|
add_definitions(-DX2AP_VERSION=${X2AP_VERSION})
|
||||||
set(X2AP_ASN_DIR ${X2AP_DIR}/MESSAGES/ASN1/${X2AP_RELEASE})
|
set(X2AP_ASN_DIR ${X2AP_DIR}/MESSAGES/ASN1/${X2AP_RELEASE})
|
||||||
set(X2AP_C_DIR ${asn1_generated_dir}/X2AP_${X2AP_RELEASE})
|
set(X2AP_C_DIR ${asn1_generated_dir}/X2AP_${X2AP_RELEASE})
|
||||||
message("calling ASN1C_PREFIX=X2AP_ asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}")
|
|
||||||
execute_process(COMMAND mkdir -p ${X2AP_C_DIR}
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
COMMAND env "ASN1C_PREFIX=X2AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
|
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${X2AP_C_DIR}" "${X2AP_ASN_DIR}/${X2AP_ASN_FILES}" "X2AP_" -fno-include-deps
|
||||||
RESULT_VARIABLE ret)
|
RESULT_VARIABLE ret)
|
||||||
if (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
message(FATAL_ERROR "${ret}: error")
|
message(FATAL_ERROR "${ret}: error")
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
|
|
||||||
file(GLOB X2AP_source ${X2AP_C_DIR}/*.c)
|
file(GLOB X2AP_source ${X2AP_C_DIR}/*.c)
|
||||||
|
|
||||||
file(GLOB x2ap_h ${X2AP_C_DIR}/*.h)
|
add_custom_target (
|
||||||
set(x2ap_h ${x2ap_h})
|
x2_flag ALL
|
||||||
|
COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${X2AP_C_DIR}" "${X2AP_ASN_DIR}/${X2AP_ASN_FILES}" "X2AP_" -fno-include-deps
|
||||||
add_custom_command (
|
|
||||||
OUTPUT ${X2AP_C_DIR}/X2AP_asn_constant.h
|
|
||||||
COMMAND mkdir -p ${X2AP_C_DIR}
|
|
||||||
COMMAND env "ASN1C_PREFIX=X2AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
|
|
||||||
DEPENDS ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
|
DEPENDS ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -468,6 +457,7 @@ add_library(X2AP_LIB
|
|||||||
${X2AP_source}
|
${X2AP_source}
|
||||||
${X2AP_DIR}/x2ap_common.c
|
${X2AP_DIR}/x2ap_common.c
|
||||||
)
|
)
|
||||||
|
add_dependencies(X2AP_LIB rrc_flag x2_flag)
|
||||||
|
|
||||||
include_directories ("${X2AP_C_DIR}")
|
include_directories ("${X2AP_C_DIR}")
|
||||||
include_directories ("${X2AP_DIR}")
|
include_directories ("${X2AP_DIR}")
|
||||||
@@ -481,6 +471,7 @@ add_library(X2AP_ENB
|
|||||||
${X2AP_DIR}/x2ap_eNB_management_procedures.c
|
${X2AP_DIR}/x2ap_eNB_management_procedures.c
|
||||||
${X2AP_DIR}/x2ap_eNB_generate_messages.c
|
${X2AP_DIR}/x2ap_eNB_generate_messages.c
|
||||||
)
|
)
|
||||||
|
add_dependencies(X2AP_ENB rrc_flag x2_flag)
|
||||||
|
|
||||||
# Hardware dependant options
|
# Hardware dependant options
|
||||||
###################################
|
###################################
|
||||||
@@ -551,6 +542,15 @@ set(TPLIB_ETHERNET_SOURCE
|
|||||||
)
|
)
|
||||||
add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} )
|
add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} )
|
||||||
|
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/")
|
||||||
|
set(option_HWIRISLIB_lib "-l SoapySDR")
|
||||||
|
set(HWLIB_IRIS_SOURCE
|
||||||
|
${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp
|
||||||
|
)
|
||||||
|
add_library(oai_irisdevif MODULE ${HWLIB_IRIS_SOURCE})
|
||||||
|
target_include_directories(oai_irisdevif PRIVATE /usr/local/lib/SoapySDR/modules0.7/)
|
||||||
|
target_link_libraries(oai_irisdevif SoapySDR)
|
||||||
|
|
||||||
include_directories("${OPENAIR_TARGETS}/ARCH/mobipass/")
|
include_directories("${OPENAIR_TARGETS}/ARCH/mobipass/")
|
||||||
set(TPLIB_MOBIPASS_SOURCE
|
set(TPLIB_MOBIPASS_SOURCE
|
||||||
${OPENAIR_TARGETS}/ARCH/mobipass/interface.c
|
${OPENAIR_TARGETS}/ARCH/mobipass/interface.c
|
||||||
@@ -872,6 +872,7 @@ add_library(FLEXRAN_AGENT
|
|||||||
${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c
|
${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c
|
||||||
${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.c
|
${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.c
|
||||||
)
|
)
|
||||||
|
add_dependencies(FLEXRAN_AGENT rrc_flag)
|
||||||
set(FLEXRAN_AGENT_LIB FLEXRAN_AGENT)
|
set(FLEXRAN_AGENT_LIB FLEXRAN_AGENT)
|
||||||
#include_directories(${OPENAIR2_DIR}/ENB_APP)
|
#include_directories(${OPENAIR2_DIR}/ENB_APP)
|
||||||
|
|
||||||
@@ -937,6 +938,7 @@ set(UTIL_SRC
|
|||||||
# ${OPENAIR2_DIR}/UTIL/OTG/otg_rx.c
|
# ${OPENAIR2_DIR}/UTIL/OTG/otg_rx.c
|
||||||
)
|
)
|
||||||
add_library(UTIL ${UTIL_SRC})
|
add_library(UTIL ${UTIL_SRC})
|
||||||
|
add_dependencies(UTIL rrc_flag)
|
||||||
|
|
||||||
#set(OMG_SUMO_SRC
|
#set(OMG_SUMO_SRC
|
||||||
# ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c
|
# ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c
|
||||||
@@ -976,12 +978,14 @@ set(SCHED_SRC
|
|||||||
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c
|
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c
|
||||||
)
|
)
|
||||||
add_library(SCHED_LIB ${SCHED_SRC})
|
add_library(SCHED_LIB ${SCHED_SRC})
|
||||||
|
add_dependencies(SCHED_LIB rrc_flag)
|
||||||
|
|
||||||
set(SCHED_SRC_RU
|
set(SCHED_SRC_RU
|
||||||
${OPENAIR1_DIR}/SCHED/ru_procedures.c
|
${OPENAIR1_DIR}/SCHED/ru_procedures.c
|
||||||
${OPENAIR1_DIR}/SCHED/prach_procedures.c
|
${OPENAIR1_DIR}/SCHED/prach_procedures.c
|
||||||
)
|
)
|
||||||
add_library(SCHED_RU_LIB ${SCHED_SRC_RU})
|
add_library(SCHED_RU_LIB ${SCHED_SRC_RU})
|
||||||
|
add_dependencies(SCHED_RU_LIB rrc_flag)
|
||||||
|
|
||||||
set(SCHED_SRC_UE
|
set(SCHED_SRC_UE
|
||||||
${OPENAIR1_DIR}/SCHED_UE/phy_procedures_lte_ue.c
|
${OPENAIR1_DIR}/SCHED_UE/phy_procedures_lte_ue.c
|
||||||
@@ -991,6 +995,7 @@ set(SCHED_SRC_UE
|
|||||||
${OPENAIR1_DIR}/SCHED_UE/srs_pc.c
|
${OPENAIR1_DIR}/SCHED_UE/srs_pc.c
|
||||||
)
|
)
|
||||||
add_library(SCHED_UE_LIB ${SCHED_SRC_UE})
|
add_library(SCHED_UE_LIB ${SCHED_SRC_UE})
|
||||||
|
add_dependencies(SCHED_UE_LIB rrc_flag)
|
||||||
|
|
||||||
# nFAPI
|
# nFAPI
|
||||||
#################################
|
#################################
|
||||||
@@ -1042,6 +1047,7 @@ set(NFAPI_USER_SRC
|
|||||||
${NFAPI_USER_DIR}/nfapi_vnf.c
|
${NFAPI_USER_DIR}/nfapi_vnf.c
|
||||||
)
|
)
|
||||||
add_library(NFAPI_USER_LIB ${NFAPI_USER_SRC})
|
add_library(NFAPI_USER_LIB ${NFAPI_USER_SRC})
|
||||||
|
add_dependencies(NFAPI_USER_LIB rrc_flag)
|
||||||
include_directories(${NFAPI_USER_DIR})
|
include_directories(${NFAPI_USER_DIR})
|
||||||
|
|
||||||
# Layer 1
|
# Layer 1
|
||||||
@@ -1060,9 +1066,6 @@ set(PHY_TURBOIF
|
|||||||
|
|
||||||
add_library(coding MODULE ${PHY_TURBOSRC} )
|
add_library(coding MODULE ${PHY_TURBOSRC} )
|
||||||
set(PHY_SRC_COMMON
|
set(PHY_SRC_COMMON
|
||||||
# depend on code generation from asn1c
|
|
||||||
${RRC_FULL_DIR}/asn_constant.h
|
|
||||||
# actual source
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
|
||||||
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/slss.c
|
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/slss.c
|
||||||
@@ -1113,7 +1116,6 @@ set(PHY_SRC_COMMON
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_SRC
|
set(PHY_SRC
|
||||||
# actual source
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pss.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pss.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss_gen.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss_gen.c
|
||||||
@@ -1141,7 +1143,6 @@ set(PHY_SRC
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_SRC_RU
|
set(PHY_SRC_RU
|
||||||
# actual source
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_tools.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_tools.c
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
|
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
|
||||||
@@ -1155,7 +1156,6 @@ set(PHY_SRC_RU
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_SRC_UE
|
set(PHY_SRC_UE
|
||||||
# actual source
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/sss_ue.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/sss_ue.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss_gen.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss_gen.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
|
||||||
@@ -1204,9 +1204,13 @@ if (${COMPILATION_AVX2} STREQUAL "True")
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
add_library(PHY_COMMON ${PHY_SRC_COMMON})
|
add_library(PHY_COMMON ${PHY_SRC_COMMON})
|
||||||
|
add_dependencies(PHY_COMMON rrc_flag)
|
||||||
add_library(PHY ${PHY_SRC})
|
add_library(PHY ${PHY_SRC})
|
||||||
|
add_dependencies(PHY rrc_flag)
|
||||||
add_library(PHY_UE ${PHY_SRC_UE})
|
add_library(PHY_UE ${PHY_SRC_UE})
|
||||||
|
add_dependencies(PHY_UE rrc_flag)
|
||||||
add_library(PHY_RU ${PHY_SRC_RU})
|
add_library(PHY_RU ${PHY_SRC_RU})
|
||||||
|
add_dependencies(PHY_RU rrc_flag)
|
||||||
|
|
||||||
#Library for mex functions
|
#Library for mex functions
|
||||||
#########################3
|
#########################3
|
||||||
@@ -1376,11 +1380,13 @@ add_library(L2
|
|||||||
${MAC_SRC}
|
${MAC_SRC}
|
||||||
${ENB_APP_SRC})
|
${ENB_APP_SRC})
|
||||||
# ${OPENAIR2_DIR}/RRC/L2_INTERFACE/openair_rrc_L2_interface.c)
|
# ${OPENAIR2_DIR}/RRC/L2_INTERFACE/openair_rrc_L2_interface.c)
|
||||||
|
add_dependencies(L2 rrc_flag s1ap_flag x2_flag)
|
||||||
|
|
||||||
add_library(L2_UE
|
add_library(L2_UE
|
||||||
${L2_SRC_UE}
|
${L2_SRC_UE}
|
||||||
${MAC_SRC_UE}
|
${MAC_SRC_UE}
|
||||||
)
|
)
|
||||||
|
add_dependencies(L2_UE rrc_flag s1ap_flag x2_flag)
|
||||||
|
|
||||||
include_directories(${NFAPI_USER_DIR})
|
include_directories(${NFAPI_USER_DIR})
|
||||||
|
|
||||||
@@ -1406,6 +1412,7 @@ set (GTPV1U_SRC
|
|||||||
${GTPV1U_DIR}/gtpv1u_teid_pool.c
|
${GTPV1U_DIR}/gtpv1u_teid_pool.c
|
||||||
)
|
)
|
||||||
add_library(GTPV1U ${GTPV1U_SRC})
|
add_library(GTPV1U ${GTPV1U_SRC})
|
||||||
|
add_dependencies(GTPV1U rrc_flag)
|
||||||
|
|
||||||
set(SCTP_SRC
|
set(SCTP_SRC
|
||||||
${OPENAIR3_DIR}/SCTP/sctp_common.c
|
${OPENAIR3_DIR}/SCTP/sctp_common.c
|
||||||
@@ -1413,8 +1420,10 @@ set(SCTP_SRC
|
|||||||
${OPENAIR3_DIR}/SCTP/sctp_eNB_itti_messaging.c
|
${OPENAIR3_DIR}/SCTP/sctp_eNB_itti_messaging.c
|
||||||
)
|
)
|
||||||
add_library(SCTP_CLIENT ${SCTP_SRC})
|
add_library(SCTP_CLIENT ${SCTP_SRC})
|
||||||
|
add_dependencies(SCTP_CLIENT rrc_flag)
|
||||||
|
|
||||||
add_library(UDP ${OPENAIR3_DIR}/UDP/udp_eNB_task.c)
|
add_library(UDP ${OPENAIR3_DIR}/UDP/udp_eNB_task.c)
|
||||||
|
add_dependencies(UDP rrc_flag)
|
||||||
|
|
||||||
|
|
||||||
set(NAS_SRC ${OPENAIR3_DIR}/NAS/)
|
set(NAS_SRC ${OPENAIR3_DIR}/NAS/)
|
||||||
@@ -1663,6 +1672,7 @@ if(NAS_UE)
|
|||||||
${libnas_ue_esm_OBJS}
|
${libnas_ue_esm_OBJS}
|
||||||
${libnas_ue_esm_sap_OBJS}
|
${libnas_ue_esm_sap_OBJS}
|
||||||
)
|
)
|
||||||
|
add_dependencies(LIB_NAS_UE rrc_flag)
|
||||||
set(NAS_UE_LIB LIB_NAS_UE)
|
set(NAS_UE_LIB LIB_NAS_UE)
|
||||||
|
|
||||||
include_directories(${NAS_SRC}UE)
|
include_directories(${NAS_SRC}UE)
|
||||||
@@ -1786,6 +1796,15 @@ include_directories(${CRYPTO_INCLUDE_DIRS})
|
|||||||
if (${RF_BOARD} STREQUAL "OAI_USRP")
|
if (${RF_BOARD} STREQUAL "OAI_USRP")
|
||||||
find_package(Boost REQUIRED)
|
find_package(Boost REQUIRED)
|
||||||
include_directories(${LIBBOOST_INCLUDE_DIR})
|
include_directories(${LIBBOOST_INCLUDE_DIR})
|
||||||
|
|
||||||
|
elseif (${RF_BOARD} STREQUAL "OAI_IRIS")
|
||||||
|
include_directories("${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/")
|
||||||
|
include_directories("/usr/local/include/")
|
||||||
|
set(HW_SOURCE ${HW_SOURCE}
|
||||||
|
${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp)
|
||||||
|
LINK_DIRECTORIES("/usr/local/lib")
|
||||||
|
set(option_HW_lib "-lSoapySDR -rdynamic -ldl")
|
||||||
|
|
||||||
endif (${RF_BOARD} STREQUAL "OAI_USRP")
|
endif (${RF_BOARD} STREQUAL "OAI_USRP")
|
||||||
|
|
||||||
pkg_search_module(OPENPGM openpgm-5.1 openpgm-5.2)
|
pkg_search_module(OPENPGM openpgm-5.1 openpgm-5.2)
|
||||||
@@ -1920,8 +1939,6 @@ add_definitions(-DASN1_MINIMUM_VERSION=924)
|
|||||||
###################################################
|
###################################################
|
||||||
|
|
||||||
add_executable(lte-softmodem
|
add_executable(lte-softmodem
|
||||||
${rrc_h}
|
|
||||||
${s1ap_h}
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
@@ -1944,6 +1961,7 @@ add_executable(lte-softmodem
|
|||||||
${CONFIG_SOURCES}
|
${CONFIG_SOURCES}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
)
|
)
|
||||||
|
add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag)
|
||||||
|
|
||||||
target_link_libraries (lte-softmodem
|
target_link_libraries (lte-softmodem
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
@@ -1960,8 +1978,6 @@ target_link_libraries (lte-softmodem ${T_LIB})
|
|||||||
# lte-softmodem-nos1 is both eNB and UE implementation
|
# lte-softmodem-nos1 is both eNB and UE implementation
|
||||||
###################################################
|
###################################################
|
||||||
add_executable(lte-softmodem-nos1
|
add_executable(lte-softmodem-nos1
|
||||||
${rrc_h}
|
|
||||||
${s1ap_h}
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
@@ -1983,6 +1999,7 @@ add_executable(lte-softmodem-nos1
|
|||||||
${CONFIG_SOURCES}
|
${CONFIG_SOURCES}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
)
|
)
|
||||||
|
add_dependencies(lte-softmodem-nos1 rrc_flag s1ap_flag x2_flag)
|
||||||
target_link_libraries (lte-softmodem-nos1
|
target_link_libraries (lte-softmodem-nos1
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 ${RAL_LIB} ${ITTI_LIB}
|
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 ${RAL_LIB} ${ITTI_LIB}
|
||||||
@@ -1999,8 +2016,6 @@ target_link_libraries (lte-softmodem-nos1 ${T_LIB})
|
|||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
add_executable(lte-uesoftmodem
|
add_executable(lte-uesoftmodem
|
||||||
${rrc_h}
|
|
||||||
${s1ap_h}
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
||||||
@@ -2023,6 +2038,7 @@ add_executable(lte-uesoftmodem
|
|||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_dependencies(lte-uesoftmodem rrc_flag s1ap_flag x2_flag)
|
||||||
target_link_libraries (lte-uesoftmodem
|
target_link_libraries (lte-uesoftmodem
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU
|
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU
|
||||||
@@ -2038,8 +2054,6 @@ target_link_libraries (lte-uesoftmodem ${T_LIB})
|
|||||||
# lte-uesoftmodem-nos1 is UE implementation
|
# lte-uesoftmodem-nos1 is UE implementation
|
||||||
###################################################
|
###################################################
|
||||||
add_executable(lte-uesoftmodem-nos1
|
add_executable(lte-uesoftmodem-nos1
|
||||||
${rrc_h}
|
|
||||||
${s1ap_h}
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
||||||
@@ -2063,6 +2077,7 @@ add_executable(lte-uesoftmodem-nos1
|
|||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_dependencies(lte-uesoftmodem-nos1 rrc_flag s1ap_flag x2_flag)
|
||||||
target_link_libraries (lte-uesoftmodem-nos1
|
target_link_libraries (lte-uesoftmodem-nos1
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU ${RAL_LIB} ${ITTI_LIB}
|
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU ${RAL_LIB} ${ITTI_LIB}
|
||||||
|
|||||||
+22
-2
@@ -107,7 +107,7 @@ Options
|
|||||||
Rel8 limits the implementation to 3GPP Release 8 version
|
Rel8 limits the implementation to 3GPP Release 8 version
|
||||||
Rel10 limits the implementation to 3GPP Release 10 version
|
Rel10 limits the implementation to 3GPP Release 10 version
|
||||||
-w | --hardware
|
-w | --hardware
|
||||||
EXMIMO, USRP, BLADERF, ETHERNET, LMSSDR, None (Default)
|
EXMIMO, USRP, BLADERF, ETHERNET, LMSSDR, IRIS, None (Default)
|
||||||
Adds this RF board support (in external packages installation and in compilation)
|
Adds this RF board support (in external packages installation and in compilation)
|
||||||
-t | --transport protocol
|
-t | --transport protocol
|
||||||
ETHERNET , None
|
ETHERNET , None
|
||||||
@@ -231,7 +231,7 @@ function main() {
|
|||||||
-w | --hardware)
|
-w | --hardware)
|
||||||
HW="$2" #"${i#*=}"
|
HW="$2" #"${i#*=}"
|
||||||
# Use OAI_USRP as the key word USRP is used inside UHD driver
|
# Use OAI_USRP as the key word USRP is used inside UHD driver
|
||||||
if [ "$HW" != "BLADERF" -a "$HW" != "USRP" -a "$HW" != "LMSSDR" -a "$HW" != "None" -a "$HW" != "EXMIMO" ] ; then
|
if [ "$HW" != "BLADERF" -a "$HW" != "USRP" -a "$HW" != "LMSSDR" -a "$HW" != "None" -a "$HW" != "EXMIMO" -a "$HW" != "IRIS" ] ; then
|
||||||
echo_fatal "Unknown HW type $HW will exit..."
|
echo_fatal "Unknown HW type $HW will exit..."
|
||||||
else
|
else
|
||||||
if [ "$HW" == "USRP" ] ; then
|
if [ "$HW" == "USRP" ] ; then
|
||||||
@@ -243,6 +243,9 @@ function main() {
|
|||||||
if [ "$HW" == "LMSSDR" ] ; then
|
if [ "$HW" == "LMSSDR" ] ; then
|
||||||
HW="OAI_LMSSDR"
|
HW="OAI_LMSSDR"
|
||||||
fi
|
fi
|
||||||
|
if [ "$HW" == "IRIS" ] ; then
|
||||||
|
HW="OAI_IRIS"
|
||||||
|
fi
|
||||||
echo_info "Setting hardware to: $HW"
|
echo_info "Setting hardware to: $HW"
|
||||||
fi
|
fi
|
||||||
shift 2;;
|
shift 2;;
|
||||||
@@ -416,6 +419,8 @@ function main() {
|
|||||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||||
elif [ "$HW" = "OAI_LMSSDR" ] ; then
|
elif [ "$HW" = "OAI_LMSSDR" ] ; then
|
||||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||||
|
elif [ "$HW" = "OAI_IRIS" ] ; then
|
||||||
|
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||||
elif [ "$HW" = "None" ] ; then
|
elif [ "$HW" = "None" ] ; then
|
||||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||||
else
|
else
|
||||||
@@ -484,6 +489,13 @@ function main() {
|
|||||||
flash_firmware_bladerf
|
flash_firmware_bladerf
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
if [ "$HW" == "OAI_IRIS" ] ; then
|
||||||
|
echo_info "installing packages for IRIS support"
|
||||||
|
check_install_soapy
|
||||||
|
#if [ ! "$DISABLE_HARDWARE_DEPENDENCY" == "True" ]; then
|
||||||
|
# flash_firmware_iris
|
||||||
|
#fi
|
||||||
|
fi
|
||||||
echo_info "installing protobuf/protobuf-c for flexran agent support"
|
echo_info "installing protobuf/protobuf-c for flexran agent support"
|
||||||
install_protobuf_from_source
|
install_protobuf_from_source
|
||||||
install_protobuf_c_from_source
|
install_protobuf_c_from_source
|
||||||
@@ -759,6 +771,14 @@ function main() {
|
|||||||
ln -sf liboai_lmssdrdevif.so liboai_device.so
|
ln -sf liboai_lmssdrdevif.so liboai_device.so
|
||||||
ln -sf $dbin/liboai_lmssdrdevif.so.$REL $dbin/liboai_device.so
|
ln -sf $dbin/liboai_lmssdrdevif.so.$REL $dbin/liboai_device.so
|
||||||
echo_info "liboai_device.so is linked to LMSSDR device library"
|
echo_info "liboai_device.so is linked to LMSSDR device library"
|
||||||
|
elif [ "$HW" == "OAI_IRIS" ] ; then
|
||||||
|
compilations \
|
||||||
|
$build_dir oai_irisdevif \
|
||||||
|
liboai_irisdevif.so $dbin/liboai_irisdevif.so.$REL
|
||||||
|
|
||||||
|
ln -s liboai_irisdevif.so liboai_device.so
|
||||||
|
ln -s $dbin/liboai_irisdevif.so.$REL $dbin/liboai_device.so
|
||||||
|
echo_info "liboai_device.so is linked to IRIS device library"
|
||||||
else
|
else
|
||||||
echo_info "liboai_device.so is not linked to any device library"
|
echo_info "liboai_device.so is not linked to any device library"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -372,13 +372,81 @@ check_install_lmssdr_driver(){
|
|||||||
else
|
else
|
||||||
echo_error "lmssdr support implies installing lmssdr drivers and tools" \
|
echo_error "lmssdr support implies installing lmssdr drivers and tools" \
|
||||||
" from sources. check:"
|
" from sources. check:"
|
||||||
echo_info "https://open-cells.com/index.php/2017/05/10/limesdr-installation/"
|
echo_info "https://wiki.myriadrf.org/Lime_Suite"
|
||||||
echo_fatal "Cannot compile lmssdr device"
|
echo_fatal "Cannot compile lmssdr device"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
install_soapy_from_source(){
|
||||||
|
soapy_install_log=$OPENAIR_DIR/cmake_targets/log/soapy_install_log.txt
|
||||||
|
echo_info "\nInstalling Soapy EcoSystem from source. The log file for Soapy installation is here: $soapy_install_log "
|
||||||
|
(
|
||||||
|
cd /tmp
|
||||||
|
echo "Downloading SoapySDR"
|
||||||
|
rm -rf /tmp/soapysdr
|
||||||
|
git clone -b soapy-sdr-0.7.0 --single-branch https://github.com/pothosware/SoapySDR.git
|
||||||
|
cd SoapySDR
|
||||||
|
#git checkout tags/release_003_010_001_001
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
$CMAKE ../
|
||||||
|
echo "Compiling SoapySDR"
|
||||||
|
make -j`nproc`
|
||||||
|
$SUDO make install
|
||||||
|
$SUDO ldconfig
|
||||||
|
cd /tmp
|
||||||
|
echo "Downloading SoapyRemote"
|
||||||
|
rm -rf /tmp/soapyremote
|
||||||
|
git clone -b soapy-remote-0.5.0 --single-branch https://github.com/pothosware/SoapyRemote.git
|
||||||
|
cd SoapyRemote
|
||||||
|
#git checkout tags/release_003_010_001_001
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake ../
|
||||||
|
echo "Compiling SoapyRemote"
|
||||||
|
make -j`nproc`
|
||||||
|
$SUDO make install
|
||||||
|
$SUDO ldconfig
|
||||||
|
) >& $soapy_install_log
|
||||||
|
}
|
||||||
|
|
||||||
|
install_soapy_iris_from_source(){
|
||||||
|
iris_install_log=$OPENAIR_DIR/cmake_targets/log/iris_install_log.txt
|
||||||
|
echo_info "\nInstalling Iris driver from source. The log file for Iris driver installation is here: $iris_install_log "
|
||||||
|
(
|
||||||
|
cd /tmp
|
||||||
|
echo "Downloading SoapyIris"
|
||||||
|
rm -rf /tmp/sklk-soapyiris
|
||||||
|
git clone -b soapy-iris-2018.08.0.1 --single-branch https://github.com/skylarkwireless/sklk-soapyiris.git
|
||||||
|
cd sklk-soapyiris
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake ../
|
||||||
|
echo "Compiling SoapyIris"
|
||||||
|
make -j`nproc`
|
||||||
|
$SUDO make install
|
||||||
|
$SUDO ldconfig
|
||||||
|
) >& $iris_install_log
|
||||||
|
}
|
||||||
|
|
||||||
|
check_install_soapy () {
|
||||||
|
#if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||||
|
#first we remove old installation
|
||||||
|
$SUDO apt-get remove -y soapysdr soapysdr-server libsoapysdr-dev python-soapysdr python3-soapysdr soapysdr-module-remote || true
|
||||||
|
#$SUDO add-apt-repository -y ppa:myriadrf/drivers
|
||||||
|
#$SUDO apt-get update
|
||||||
|
#$SUDO apt-get install -y soapysdr soapysdr-server libsoapysdr-dev python-soapysdr python3-soapysdr soapysdr-module-remote
|
||||||
|
|
||||||
|
#elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
||||||
|
# $SUDO $INSTALLER -y install software-properties-common python3-software-properties python-software-properties subversion git python3 python-numpy python3-numpy cmake swig python-dev
|
||||||
|
install_soapy_from_source
|
||||||
|
#fi
|
||||||
|
install_soapy_iris_from_source
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
check_install_additional_tools (){
|
check_install_additional_tools (){
|
||||||
$SUDO $INSTALLER update -y
|
$SUDO $INSTALLER update -y
|
||||||
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||||
|
|||||||
Executable
+15
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
GENERATED_FULL_DIR=$1
|
||||||
|
shift
|
||||||
|
ASN1_SOURCE_DIR=$1
|
||||||
|
shift
|
||||||
|
export ASN1C_PREFIX=$1
|
||||||
|
shift
|
||||||
|
options=$*
|
||||||
|
done_flag="$GENERATED_FULL_DIR"/done
|
||||||
|
if [ "$done_flag" -ot $ASN1_SOURCE_DIR ] ; then
|
||||||
|
rm -f "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}*.c "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}*.h
|
||||||
|
mkdir -p "$GENERATED_FULL_DIR"
|
||||||
|
asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example $options -D $GENERATED_FULL_DIR $ASN1_SOURCE_DIR |& egrep -v "^Copied|^Compiled" | sort -u
|
||||||
|
fi
|
||||||
|
touch $done_flag
|
||||||
@@ -69,12 +69,12 @@ char uecap_xer_in;
|
|||||||
|
|
||||||
extern void init_eNB_afterRU(void);
|
extern void init_eNB_afterRU(void);
|
||||||
extern void init_UE_stub(int nb_inst,int,int);
|
extern void init_UE_stub(int nb_inst,int,int);
|
||||||
extern void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB, int frame, int subframe, eNB_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu);
|
extern void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB, int frame, int subframe, L1_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu);
|
||||||
extern void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, nfapi_ul_config_request_pdu_t *ul_config_pdu, uint16_t frame,uint8_t subframe,uint8_t srs_present);
|
extern void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, nfapi_ul_config_request_pdu_t *ul_config_pdu, uint16_t frame,uint8_t subframe,uint8_t srs_present);
|
||||||
extern void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, eNB_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t codeword_index, uint8_t *sdu);
|
extern void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, L1_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t codeword_index, uint8_t *sdu);
|
||||||
extern void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, eNB_rxtx_proc_t *proc, nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
|
extern void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, L1_rxtx_proc_t *proc, nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
|
||||||
extern void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, eNB_rxtx_proc_t *proc, nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
|
extern void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, L1_rxtx_proc_t *proc, nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
|
||||||
extern void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t *sdu);
|
extern void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t *sdu);
|
||||||
|
|
||||||
extern uint8_t nfapi_mode;
|
extern uint8_t nfapi_mode;
|
||||||
|
|
||||||
@@ -741,7 +741,7 @@ int pnf_phy_hi_dci0_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_hi_dci0_request_t*
|
|||||||
//phy_info* phy = (phy_info*)(pnf_p7->user_data);
|
//phy_info* phy = (phy_info*)(pnf_p7->user_data);
|
||||||
|
|
||||||
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||||
eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0];
|
L1_rxtx_proc_t *proc = &eNB->proc.L1_proc;
|
||||||
|
|
||||||
for (int i=0; i<req->hi_dci0_request_body.number_of_dci + req->hi_dci0_request_body.number_of_hi; i++) {
|
for (int i=0; i<req->hi_dci0_request_body.number_of_dci + req->hi_dci0_request_body.number_of_hi; i++) {
|
||||||
|
|
||||||
@@ -798,7 +798,7 @@ int pnf_phy_dl_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_dl_config_request
|
|||||||
int sf = NFAPI_SFNSF2SF(req->sfn_sf);
|
int sf = NFAPI_SFNSF2SF(req->sfn_sf);
|
||||||
|
|
||||||
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||||
eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0];
|
L1_rxtx_proc_t *proc = &eNB->proc.L1_proc;
|
||||||
nfapi_dl_config_request_pdu_t* dl_config_pdu_list = req->dl_config_request_body.dl_config_pdu_list;
|
nfapi_dl_config_request_pdu_t* dl_config_pdu_list = req->dl_config_request_body.dl_config_pdu_list;
|
||||||
LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[sf&1];
|
LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[sf&1];
|
||||||
|
|
||||||
@@ -869,7 +869,7 @@ int pnf_phy_dl_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_dl_config_request
|
|||||||
|
|
||||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DLSCH:pdu_index:%d handle_nfapi_dlsch_pdu(eNB, proc_rxtx, dlsch_pdu, transport_blocks:%d sdu:%p) eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols:%d\n", __FUNCTION__, rel8_pdu->pdu_index, rel8_pdu->transport_blocks, dlsch_sdu, eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols);
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DLSCH:pdu_index:%d handle_nfapi_dlsch_pdu(eNB, proc_rxtx, dlsch_pdu, transport_blocks:%d sdu:%p) eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols:%d\n", __FUNCTION__, rel8_pdu->pdu_index, rel8_pdu->transport_blocks, dlsch_sdu, eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols);
|
||||||
|
|
||||||
handle_nfapi_dlsch_pdu( eNB, sfn,sf, &eNB->proc.proc_rxtx[0], &dl_config_pdu_list[i], rel8_pdu->transport_blocks-1, dlsch_sdu);
|
handle_nfapi_dlsch_pdu( eNB, sfn,sf, &eNB->proc.L1_proc, &dl_config_pdu_list[i], rel8_pdu->transport_blocks-1, dlsch_sdu);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@@ -945,7 +945,7 @@ int pnf_phy_ul_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_ul_config_request
|
|||||||
uint16_t curr_sf = NFAPI_SFNSF2SF(req->sfn_sf);
|
uint16_t curr_sf = NFAPI_SFNSF2SF(req->sfn_sf);
|
||||||
|
|
||||||
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||||
eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0];
|
L1_rxtx_proc_t *proc = &eNB->proc.L1_proc;
|
||||||
nfapi_ul_config_request_pdu_t* ul_config_pdu_list = req->ul_config_request_body.ul_config_pdu_list;
|
nfapi_ul_config_request_pdu_t* ul_config_pdu_list = req->ul_config_request_body.ul_config_pdu_list;
|
||||||
|
|
||||||
for (int i=0;i<req->ul_config_request_body.number_of_pdus;i++) {
|
for (int i=0;i<req->ul_config_request_body.number_of_pdus;i++) {
|
||||||
|
|||||||
@@ -341,9 +341,9 @@ int pnf_config_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_config_
|
|||||||
|
|
||||||
int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
|
int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
|
||||||
|
|
||||||
eNB_proc_t *proc=&eNB->proc;
|
L1_proc_t *proc=&eNB->proc;
|
||||||
|
|
||||||
eNB_rxtx_proc_t *proc_rxtx=&proc->proc_rxtx[sf&1];
|
L1_rxtx_proc_t *L1_proc= (sf&1)? &proc->L1_proc : &proc->L1_proc_tx;
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||||
|
|
||||||
@@ -357,8 +357,8 @@ int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
|
|||||||
|
|
||||||
// wake up TX for subframe n+sf_ahead
|
// wake up TX for subframe n+sf_ahead
|
||||||
// lock the TX mutex and make sure the thread is ready
|
// lock the TX mutex and make sure the thread is ready
|
||||||
if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) {
|
if (pthread_mutex_timedlock(&L1_proc->mutex,&wait) != 0) {
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", proc_rxtx->subframe_rx&1,proc_rxtx->instance_cnt_rxtx );
|
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", L1_proc->subframe_rx&1,L1_proc->instance_cnt );
|
||||||
exit_fun( "error locking mutex_rxtx" );
|
exit_fun( "error locking mutex_rxtx" );
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
@@ -377,9 +377,9 @@ int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
|
|||||||
if (old_sf == 0 && old_sfn % 100==0) LOG_W( PHY,"[eNB] sfn/sf:%d%d old_sfn/sf:%d%d proc[rx:%d%d]\n", sfn, sf, old_sfn, old_sf, proc->frame_rx, proc->subframe_rx);
|
if (old_sf == 0 && old_sfn % 100==0) LOG_W( PHY,"[eNB] sfn/sf:%d%d old_sfn/sf:%d%d proc[rx:%d%d]\n", sfn, sf, old_sfn, old_sf, proc->frame_rx, proc->subframe_rx);
|
||||||
}
|
}
|
||||||
|
|
||||||
++proc_rxtx->instance_cnt_rxtx;
|
++L1_proc->instance_cnt;
|
||||||
|
|
||||||
//LOG_D( PHY,"[VNF-subframe_ind] sfn/sf:%d:%d proc[frame_rx:%d subframe_rx:%d] proc_rxtx->instance_cnt_rxtx:%d \n", sfn, sf, proc->frame_rx, proc->subframe_rx, proc_rxtx->instance_cnt_rxtx);
|
//LOG_D( PHY,"[VNF-subframe_ind] sfn/sf:%d:%d proc[frame_rx:%d subframe_rx:%d] L1_proc->instance_cnt_rxtx:%d \n", sfn, sf, proc->frame_rx, proc->subframe_rx, L1_proc->instance_cnt_rxtx);
|
||||||
|
|
||||||
// We have just received and processed the common part of a subframe, say n.
|
// We have just received and processed the common part of a subframe, say n.
|
||||||
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
|
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
|
||||||
@@ -387,23 +387,23 @@ int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
|
|||||||
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
|
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
|
||||||
// we want to generate subframe (n+N), so TS_tx = TX_rx+N*samples_per_tti,
|
// we want to generate subframe (n+N), so TS_tx = TX_rx+N*samples_per_tti,
|
||||||
// and proc->subframe_tx = proc->subframe_rx+sf_ahead
|
// and proc->subframe_tx = proc->subframe_rx+sf_ahead
|
||||||
proc_rxtx->timestamp_tx = proc->timestamp_rx + (sf_ahead*fp->samples_per_tti);
|
L1_proc->timestamp_tx = proc->timestamp_rx + (sf_ahead*fp->samples_per_tti);
|
||||||
proc_rxtx->frame_rx = proc->frame_rx;
|
L1_proc->frame_rx = proc->frame_rx;
|
||||||
proc_rxtx->subframe_rx = proc->subframe_rx;
|
L1_proc->subframe_rx = proc->subframe_rx;
|
||||||
proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > (9-sf_ahead)) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx;
|
L1_proc->frame_tx = (L1_proc->subframe_rx > (9-sf_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
||||||
proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + sf_ahead)%10;
|
L1_proc->subframe_tx = (L1_proc->subframe_rx + sf_ahead)%10;
|
||||||
|
|
||||||
//LOG_D(PHY, "sfn/sf:%d%d proc[rx:%d%d] proc_rxtx[instance_cnt_rxtx:%d rx:%d%d] About to wake rxtx thread\n\n", sfn, sf, proc->frame_rx, proc->subframe_rx, proc_rxtx->instance_cnt_rxtx, proc_rxtx->frame_rx, proc_rxtx->subframe_rx);
|
//LOG_D(PHY, "sfn/sf:%d%d proc[rx:%d%d] L1_proc[instance_cnt_rxtx:%d rx:%d%d] About to wake rxtx thread\n\n", sfn, sf, proc->frame_rx, proc->subframe_rx, L1_proc->instance_cnt_rxtx, L1_proc->frame_rx, L1_proc->subframe_rx);
|
||||||
|
|
||||||
// the thread can now be woken up
|
// the thread can now be woken up
|
||||||
if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) {
|
if (pthread_cond_signal(&L1_proc->cond) != 0) {
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n");
|
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n");
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
exit_fun( "ERROR pthread_cond_signal" );
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//LOG_D(PHY,"%s() About to attempt pthread_mutex_unlock\n", __FUNCTION__);
|
//LOG_D(PHY,"%s() About to attempt pthread_mutex_unlock\n", __FUNCTION__);
|
||||||
pthread_mutex_unlock( &proc_rxtx->mutex_rxtx );
|
pthread_mutex_unlock( &L1_proc->mutex );
|
||||||
//LOG_D(PHY,"%s() UNLOCKED pthread_mutex_unlock\n", __FUNCTION__);
|
//LOG_D(PHY,"%s() UNLOCKED pthread_mutex_unlock\n", __FUNCTION__);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
|
|||||||
unsigned char eNB_id);
|
unsigned char eNB_id);
|
||||||
|
|
||||||
int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
|
int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
module_id_t UE_id,
|
module_id_t UE_id,
|
||||||
uint8_t l,
|
uint8_t l,
|
||||||
uint8_t Ns);
|
uint8_t Ns);
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32
|
|||||||
#define SCALE 0x3FFF
|
#define SCALE 0x3FFF
|
||||||
|
|
||||||
int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB,
|
int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
module_id_t UE_id,
|
module_id_t UE_id,
|
||||||
unsigned char l,
|
unsigned char l,
|
||||||
unsigned char Ns) {
|
unsigned char Ns) {
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ int16_t find_ulsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void fill_pdcch_order(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu)
|
void fill_pdcch_order(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu)
|
||||||
{
|
{
|
||||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||||
uint8_t *dci_pdu = &dci_alloc->dci_pdu[0];
|
uint8_t *dci_pdu = &dci_alloc->dci_pdu[0];
|
||||||
@@ -224,7 +224,7 @@ void fill_pdcch_order(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_a
|
|||||||
proc->frame_tx, proc->subframe_tx, rel8->rnti);
|
proc->frame_tx, proc->subframe_tx, rel8->rnti);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu)
|
void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu)
|
||||||
{
|
{
|
||||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||||
uint8_t *dci_pdu = &dci_alloc->dci_pdu[0];
|
uint8_t *dci_pdu = &dci_alloc->dci_pdu[0];
|
||||||
@@ -1497,7 +1497,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *dci_alloc,nfapi_dl_config_mpdcch_pdu *pdu) {
|
void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,mDCI_ALLOC_t *dci_alloc,nfapi_dl_config_mpdcch_pdu *pdu) {
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||||
|
|
||||||
@@ -1770,7 +1770,7 @@ void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *d
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_dci0(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
void fill_dci0(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||||
DCI_ALLOC_t *dci_alloc,nfapi_hi_dci0_dci_pdu *pdu)
|
DCI_ALLOC_t *dci_alloc,nfapi_hi_dci0_dci_pdu *pdu)
|
||||||
{
|
{
|
||||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||||
|
|||||||
@@ -393,7 +393,7 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
|
|||||||
//start_meas(&eNB->dlsch_turbo_encoding_preperation_stats);
|
//start_meas(&eNB->dlsch_turbo_encoding_preperation_stats);
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
L1_proc_t *proc = &eNB->proc;
|
||||||
unsigned int G;
|
unsigned int G;
|
||||||
unsigned int crc=1;
|
unsigned int crc=1;
|
||||||
|
|
||||||
|
|||||||
@@ -169,7 +169,6 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
s = lte_gold_generic(&x1, &x2, 0);
|
s = lte_gold_generic(&x1, &x2, 0);
|
||||||
e += 32;
|
e += 32;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -705,7 +705,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
|
|
||||||
void generate_phich_top(PHY_VARS_eNB *eNB,
|
void generate_phich_top(PHY_VARS_eNB *eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
int16_t amp)
|
int16_t amp)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
||||||
|
|
||||||
int generate_mbsfn_pilot(PHY_VARS_eNB *eNB,
|
int generate_mbsfn_pilot(PHY_VARS_eNB *eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
int32_t **txdataF,
|
int32_t **txdataF,
|
||||||
int16_t amp)
|
int16_t amp)
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a)
|
void generate_mch(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,uint8_t *a)
|
||||||
{
|
{
|
||||||
|
|
||||||
int G;
|
int G;
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ int mch_modulation(int32_t **txdataF,
|
|||||||
@param abstraction_flag
|
@param abstraction_flag
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void generate_mch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t *a);
|
void generate_mch(PHY_VARS_eNB *phy_vars_eNB,L1_rxtx_proc_t *proc,uint8_t *a);
|
||||||
|
|
||||||
/** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals)
|
/** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals)
|
||||||
@param phy_vars_eNB Pointer to eNB variables
|
@param phy_vars_eNB Pointer to eNB variables
|
||||||
@@ -317,7 +317,7 @@ int32_t generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
int first_pilot_only);
|
int first_pilot_only);
|
||||||
|
|
||||||
int32_t generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB,
|
int32_t generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
int32_t **txdataF,
|
int32_t **txdataF,
|
||||||
int16_t amp);
|
int16_t amp);
|
||||||
|
|
||||||
@@ -410,13 +410,13 @@ void ulsch_extract_rbs_single(int32_t **rxdataF,
|
|||||||
void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,
|
void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,
|
||||||
int frame,
|
int frame,
|
||||||
int subframe,
|
int subframe,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
DCI_ALLOC_t *dci_alloc,
|
DCI_ALLOC_t *dci_alloc,
|
||||||
nfapi_dl_config_dci_dl_pdu *pdu);
|
nfapi_dl_config_dci_dl_pdu *pdu);
|
||||||
|
|
||||||
void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *dci_alloc,nfapi_dl_config_mpdcch_pdu *pdu);
|
void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,mDCI_ALLOC_t *dci_alloc,nfapi_dl_config_mpdcch_pdu *pdu);
|
||||||
|
|
||||||
void fill_dci0(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,
|
void fill_dci0(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,
|
||||||
nfapi_hi_dci0_dci_pdu *pdu);
|
nfapi_hi_dci0_dci_pdu *pdu);
|
||||||
|
|
||||||
void fill_ulsch(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame,int subframe);
|
void fill_ulsch(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame,int subframe);
|
||||||
@@ -427,7 +427,7 @@ int generate_eNB_ulsch_params_from_rar(PHY_VARS_eNB *eNB,
|
|||||||
unsigned char subframe);
|
unsigned char subframe);
|
||||||
|
|
||||||
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
|
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
void *dci_pdu,
|
void *dci_pdu,
|
||||||
rnti_t rnti,
|
rnti_t rnti,
|
||||||
DCI_format_t dci_format,
|
DCI_format_t dci_format,
|
||||||
@@ -466,7 +466,7 @@ void init_transport_channels(uint8_t);
|
|||||||
|
|
||||||
|
|
||||||
void rx_ulsch(PHY_VARS_eNB *eNB,
|
void rx_ulsch(PHY_VARS_eNB *eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
uint8_t UE_id);
|
uint8_t UE_id);
|
||||||
|
|
||||||
|
|
||||||
@@ -487,7 +487,7 @@ int ulsch_decoding_data_all(PHY_VARS_eNB *eNB,
|
|||||||
@returns 0 on success
|
@returns 0 on success
|
||||||
*/
|
*/
|
||||||
unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
|
unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
uint8_t UE_id,
|
uint8_t UE_id,
|
||||||
uint8_t control_only_flag,
|
uint8_t control_only_flag,
|
||||||
uint8_t Nbundled,
|
uint8_t Nbundled,
|
||||||
@@ -520,7 +520,7 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,
|
|||||||
int llr8_flag);
|
int llr8_flag);
|
||||||
|
|
||||||
void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
|
void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
int16_t amp);
|
int16_t amp);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -382,7 +382,7 @@ int ulsch_decoding_data_2thread0(td_params* tdp) {
|
|||||||
extern int oai_exit;
|
extern int oai_exit;
|
||||||
void *td_thread(void *param) {
|
void *td_thread(void *param) {
|
||||||
PHY_VARS_eNB *eNB = ((td_params*)param)->eNB;
|
PHY_VARS_eNB *eNB = ((td_params*)param)->eNB;
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
L1_proc_t *proc = &eNB->proc;
|
||||||
cpu_set_t cpuset;
|
cpu_set_t cpuset;
|
||||||
CPU_ZERO(&cpuset);
|
CPU_ZERO(&cpuset);
|
||||||
|
|
||||||
@@ -412,7 +412,7 @@ void *td_thread(void *param) {
|
|||||||
|
|
||||||
int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag) {
|
int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag) {
|
||||||
|
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
L1_proc_t *proc = &eNB->proc;
|
||||||
unsigned int r,r_offset=0,Kr,Kr_bytes;
|
unsigned int r,r_offset=0,Kr,Kr_bytes;
|
||||||
uint8_t crc_type;
|
uint8_t crc_type;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
@@ -762,7 +762,7 @@ static inline unsigned int lte_gold_unscram(unsigned int *x1, unsigned int *x2,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
|
||||||
uint8_t UE_id,
|
uint8_t UE_id,
|
||||||
uint8_t control_only_flag,
|
uint8_t control_only_flag,
|
||||||
uint8_t Nbundled,
|
uint8_t Nbundled,
|
||||||
|
|||||||
@@ -1104,7 +1104,7 @@ void init_ulsch_power_LUT(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void rx_ulsch(PHY_VARS_eNB *eNB,
|
void rx_ulsch(PHY_VARS_eNB *eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
uint8_t UE_id) {
|
uint8_t UE_id) {
|
||||||
|
|
||||||
|
|
||||||
@@ -1305,7 +1305,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void rx_ulsch_emul(PHY_VARS_eNB *eNB,
|
void rx_ulsch_emul(PHY_VARS_eNB *eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
uint8_t UE_index)
|
uint8_t UE_index)
|
||||||
{
|
{
|
||||||
LOG_I(PHY,"[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, UE_index %d\n",eNB->Mod_id,proc->subframe_rx,UE_index);
|
LOG_I(PHY,"[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, UE_index %d\n",eNB->Mod_id,proc->subframe_rx,UE_index);
|
||||||
|
|||||||
@@ -52,6 +52,13 @@
|
|||||||
#include "../LTE_TRANSPORT/transport_common_proto.h"
|
#include "../LTE_TRANSPORT/transport_common_proto.h"
|
||||||
#include "SCHED/sched_common.h"
|
#include "SCHED/sched_common.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
#undef LOG_D
|
||||||
|
#define LOG_D(A,B...) printf(B)
|
||||||
|
#undef LOG_I
|
||||||
|
#define LOG_I(A,B...) printf(B)
|
||||||
|
*/
|
||||||
|
|
||||||
extern uint16_t beta_cqi[16];
|
extern uint16_t beta_cqi[16];
|
||||||
extern uint16_t beta_ri[16];
|
extern uint16_t beta_ri[16];
|
||||||
extern uint16_t beta_ack[16];
|
extern uint16_t beta_ack[16];
|
||||||
@@ -1274,7 +1281,7 @@ void compute_llr_offset(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
|
symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
|
||||||
if((symbol_mod == 0) || symbol_mod == (4-frame_parms->Ncp))
|
if((symbol_mod == 0) || symbol_mod == (4-frame_parms->Ncp))
|
||||||
{
|
{
|
||||||
if (frame_parms->nb_antennas_tx == 2)
|
if (frame_parms->nb_antenna_ports_eNB == 2)
|
||||||
crs_re = 4;
|
crs_re = 4;
|
||||||
else
|
else
|
||||||
crs_re = 2;
|
crs_re = 2;
|
||||||
@@ -4222,7 +4229,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
|
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
void *dci_pdu,
|
void *dci_pdu,
|
||||||
uint16_t rnti,
|
uint16_t rnti,
|
||||||
DCI_format_t dci_format,
|
DCI_format_t dci_format,
|
||||||
|
|||||||
@@ -38,8 +38,7 @@
|
|||||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||||
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
||||||
//#define DEBUG_DLSCH_DECODING
|
//#define DEBUG_DLSCH_DECODING
|
||||||
#define UE_DEBUG_TRACE 1
|
//#define UE_DEBUG_TRACE 1
|
||||||
|
|
||||||
|
|
||||||
void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
|
void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
|
||||||
{
|
{
|
||||||
@@ -626,7 +625,7 @@ decoder_if_t *tc;
|
|||||||
|
|
||||||
if (err_flag == 1) {
|
if (err_flag == 1) {
|
||||||
#if UE_DEBUG_TRACE
|
#if UE_DEBUG_TRACE
|
||||||
LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
|
LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
|
||||||
phy_vars_ue->Mod_id, frame, subframe, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
|
phy_vars_ue->Mod_id, frame, subframe, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
|
||||||
#endif
|
#endif
|
||||||
dlsch->harq_ack[subframe].ack = 0;
|
dlsch->harq_ack[subframe].ack = 0;
|
||||||
@@ -650,7 +649,7 @@ decoder_if_t *tc;
|
|||||||
return((1+dlsch->max_turbo_iterations));
|
return((1+dlsch->max_turbo_iterations));
|
||||||
} else {
|
} else {
|
||||||
#if UE_DEBUG_TRACE
|
#if UE_DEBUG_TRACE
|
||||||
LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d TBS %d mcs %d nb_rb %d\n",
|
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d TBS %d mcs %d nb_rb %d\n",
|
||||||
phy_vars_ue->Mod_id,subframe,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
|
phy_vars_ue->Mod_id,subframe,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -4334,7 +4334,7 @@ void dlsch_channel_aver_band(int **dl_ch_estimates_ext,
|
|||||||
else
|
else
|
||||||
nre=12;
|
nre=12;
|
||||||
|
|
||||||
for (aatx=0; aatx<frame_parms->nb_antennas_tx; aatx++){
|
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++){
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
dl_ch128=(__m128i *)&dl_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx + aarx][symbol*frame_parms->N_RB_DL*12];
|
dl_ch128=(__m128i *)&dl_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx + aarx][symbol*frame_parms->N_RB_DL*12];
|
||||||
avg128D = _mm_setzero_si128();
|
avg128D = _mm_setzero_si128();
|
||||||
|
|||||||
@@ -673,14 +673,14 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
LOG_D(PHY,"[p %d : symb %d / FirstSym %d / Length %d]: @LLR Buff %p, @LLR Buff(symb) %p \n",
|
||||||
LOG_I(PHY,"dlsch_qpsk_llr: [symb %d / FirstSym %d / Length %d]: @LLR Buff %x, @LLR Buff(symb) %x \n",
|
frame_parms->nb_antenna_ports_eNB,
|
||||||
symbol,
|
symbol,
|
||||||
first_symbol_flag,
|
first_symbol_flag,
|
||||||
len,
|
len,
|
||||||
dlsch_llr,
|
dlsch_llr,
|
||||||
llr32);
|
llr32);
|
||||||
*/
|
|
||||||
|
|
||||||
qpsk_llr((short *)rxF,
|
qpsk_llr((short *)rxF,
|
||||||
(short *)llr32,
|
(short *)llr32,
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
|||||||
float time[FRAME_LENGTH_COMPLEX_SAMPLES];
|
float time[FRAME_LENGTH_COMPLEX_SAMPLES];
|
||||||
float time2[2048];
|
float time2[2048];
|
||||||
float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
|
float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
|
||||||
int frame = phy_vars_enb->proc.proc_rxtx[0].frame_tx;
|
int frame = phy_vars_enb->proc.L1_proc.frame_tx;
|
||||||
uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate;
|
uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate;
|
||||||
int coded_bits_per_codeword = 0;
|
int coded_bits_per_codeword = 0;
|
||||||
uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2
|
uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2
|
||||||
|
|||||||
+21
-17
@@ -257,9 +257,6 @@ typedef struct RU_proc_t_s {
|
|||||||
pthread_mutex_t mutex_pre_scd;
|
pthread_mutex_t mutex_pre_scd;
|
||||||
int instance_pre_scd;
|
int instance_pre_scd;
|
||||||
#endif
|
#endif
|
||||||
/// pipeline ready state
|
|
||||||
int ru_rx_ready;
|
|
||||||
int ru_tx_ready;
|
|
||||||
int emulate_rf_busy;
|
int emulate_rf_busy;
|
||||||
} RU_proc_t;
|
} RU_proc_t;
|
||||||
|
|
||||||
@@ -648,20 +645,25 @@ typedef struct {
|
|||||||
int frame_rx;
|
int frame_rx;
|
||||||
/// \brief Instance count for RXn-TXnp4 processing thread.
|
/// \brief Instance count for RXn-TXnp4 processing thread.
|
||||||
/// \internal This variable is protected by \ref mutex_rxtx.
|
/// \internal This variable is protected by \ref mutex_rxtx.
|
||||||
int instance_cnt_rxtx;
|
int instance_cnt;
|
||||||
/// pthread structure for RXn-TXnp4 processing thread
|
/// pthread structure for RXn-TXnp4 processing thread
|
||||||
pthread_t pthread_rxtx;
|
pthread_t pthread;
|
||||||
/// pthread attributes for RXn-TXnp4 processing thread
|
/// pthread attributes for RXn-TXnp4 processing thread
|
||||||
pthread_attr_t attr_rxtx;
|
pthread_attr_t attr;
|
||||||
/// condition variable for tx processing thread
|
/// condition variable for tx processing thread
|
||||||
pthread_cond_t cond_rxtx;
|
pthread_cond_t cond;
|
||||||
/// mutex for RXn-TXnp4 processing thread
|
/// mutex for RXn-TXnp4 processing thread
|
||||||
pthread_mutex_t mutex_rxtx;
|
pthread_mutex_t mutex;
|
||||||
/// scheduling parameters for RXn-TXnp4 thread
|
/// scheduling parameters for RXn-TXnp4 thread
|
||||||
struct sched_param sched_param_rxtx;
|
struct sched_param sched_param_rxtx;
|
||||||
/// pipeline ready state
|
|
||||||
int pipe_ready;
|
/// \internal This variable is protected by \ref mutex_RUs.
|
||||||
} eNB_rxtx_proc_t;
|
int instance_cnt_RUs;
|
||||||
|
/// condition variable for tx processing thread
|
||||||
|
pthread_cond_t cond_RUs;
|
||||||
|
/// mutex for RXn-TXnp4 processing thread
|
||||||
|
pthread_mutex_t mutex_RUs;
|
||||||
|
} L1_rxtx_proc_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct PHY_VARS_eNB_s *eNB;
|
struct PHY_VARS_eNB_s *eNB;
|
||||||
@@ -693,7 +695,7 @@ typedef struct {
|
|||||||
} te_params;
|
} te_params;
|
||||||
|
|
||||||
/// Context data structure for eNB subframe processing
|
/// Context data structure for eNB subframe processing
|
||||||
typedef struct eNB_proc_t_s {
|
typedef struct L1_proc_t_s {
|
||||||
/// Component Carrier index
|
/// Component Carrier index
|
||||||
uint8_t CC_id;
|
uint8_t CC_id;
|
||||||
/// thread index
|
/// thread index
|
||||||
@@ -804,12 +806,16 @@ typedef struct eNB_proc_t_s {
|
|||||||
pthread_mutex_t mutex_asynch_rxtx;
|
pthread_mutex_t mutex_asynch_rxtx;
|
||||||
/// mutex for RU access to eNB processing (PDSCH/PUSCH)
|
/// mutex for RU access to eNB processing (PDSCH/PUSCH)
|
||||||
pthread_mutex_t mutex_RU;
|
pthread_mutex_t mutex_RU;
|
||||||
|
/// mutex for eNB processing to access RU TX (PDSCH/PUSCH)
|
||||||
|
pthread_mutex_t mutex_RU_tx;
|
||||||
/// mutex for RU access to eNB processing (PRACH)
|
/// mutex for RU access to eNB processing (PRACH)
|
||||||
pthread_mutex_t mutex_RU_PRACH;
|
pthread_mutex_t mutex_RU_PRACH;
|
||||||
/// mutex for RU access to eNB processing (PRACH BR)
|
/// mutex for RU access to eNB processing (PRACH BR)
|
||||||
pthread_mutex_t mutex_RU_PRACH_br;
|
pthread_mutex_t mutex_RU_PRACH_br;
|
||||||
/// mask for RUs serving eNB (PDSCH/PUSCH)
|
/// mask for RUs serving eNB (PDSCH/PUSCH)
|
||||||
int RU_mask;
|
int RU_mask;
|
||||||
|
/// mask for RUs serving eNB (PDSCH/PUSCH)
|
||||||
|
int RU_mask_tx;
|
||||||
/// mask for RUs serving eNB (PRACH)
|
/// mask for RUs serving eNB (PRACH)
|
||||||
int RU_mask_prach;
|
int RU_mask_prach;
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
@@ -821,12 +827,10 @@ typedef struct eNB_proc_t_s {
|
|||||||
/// parameters for turbo-encoding worker thread
|
/// parameters for turbo-encoding worker thread
|
||||||
te_params tep[3];
|
te_params tep[3];
|
||||||
/// set of scheduling variables RXn-TXnp4 threads
|
/// set of scheduling variables RXn-TXnp4 threads
|
||||||
eNB_rxtx_proc_t proc_rxtx[2];
|
L1_rxtx_proc_t L1_proc,L1_proc_tx;
|
||||||
/// stats thread pthread descriptor
|
/// stats thread pthread descriptor
|
||||||
pthread_t process_stats_thread;
|
pthread_t process_stats_thread;
|
||||||
/// for waking up tx procedure
|
} L1_proc_t;
|
||||||
RU_proc_t *ru_proc;
|
|
||||||
} eNB_proc_t;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -894,7 +898,7 @@ typedef struct PHY_VARS_eNB_s {
|
|||||||
module_id_t Mod_id;
|
module_id_t Mod_id;
|
||||||
uint8_t CC_id;
|
uint8_t CC_id;
|
||||||
uint8_t configured;
|
uint8_t configured;
|
||||||
eNB_proc_t proc;
|
L1_proc_t proc;
|
||||||
int single_thread_flag;
|
int single_thread_flag;
|
||||||
int abstraction_flag;
|
int abstraction_flag;
|
||||||
int num_RU;
|
int num_RU;
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ extern uint8_t nfapi_mode;
|
|||||||
|
|
||||||
void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
|
void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
|
||||||
int frame, int subframe,
|
int frame, int subframe,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu)
|
nfapi_dl_config_request_pdu_t *dl_config_pdu)
|
||||||
{
|
{
|
||||||
int idx = subframe&1;
|
int idx = subframe&1;
|
||||||
@@ -66,7 +66,7 @@ void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
|
|||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
|
|
||||||
void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,
|
void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu)
|
nfapi_dl_config_request_pdu_t *dl_config_pdu)
|
||||||
{
|
{
|
||||||
int idx = proc->subframe_tx&1;
|
int idx = proc->subframe_tx&1;
|
||||||
@@ -81,7 +81,7 @@ void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||||
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
|
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
|
||||||
{
|
{
|
||||||
int idx = subframe&1;
|
int idx = subframe&1;
|
||||||
@@ -93,7 +93,7 @@ void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_r
|
|||||||
fill_dci0(eNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci], &hi_dci0_config_pdu->dci_pdu);
|
fill_dci0(eNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci], &hi_dci0_config_pdu->dci_pdu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||||
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
|
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
|
||||||
{
|
{
|
||||||
LTE_eNB_PHICH *phich = &eNB->phich_vars[subframe&1];
|
LTE_eNB_PHICH *phich = &eNB->phich_vars[subframe&1];
|
||||||
@@ -112,7 +112,7 @@ void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rx
|
|||||||
AssertFatal(phich->num_hi<32,"Maximum number of phich reached in subframe\n");
|
AssertFatal(phich->num_hi<32,"Maximum number of phich reached in subframe\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
||||||
uint8_t *sdu)
|
uint8_t *sdu)
|
||||||
{
|
{
|
||||||
@@ -139,7 +139,7 @@ extern uint32_t localRIV2alloc_LUT100_2[6000];
|
|||||||
extern uint32_t localRIV2alloc_LUT100_3[6000];
|
extern uint32_t localRIV2alloc_LUT100_3[6000];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
||||||
uint8_t codeword_index,
|
uint8_t codeword_index,
|
||||||
uint8_t *sdu)
|
uint8_t *sdu)
|
||||||
@@ -569,7 +569,7 @@ void handle_srs_pdu(PHY_VARS_eNB *eNB,nfapi_ul_config_request_pdu_t *ul_config_p
|
|||||||
AssertFatal(i<NUMBER_OF_UE_MAX,"No room for SRS processing\n");
|
AssertFatal(i<NUMBER_OF_UE_MAX,"No room for SRS processing\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
|
||||||
nfapi_ul_config_request_pdu_t *ul_config_pdu,
|
nfapi_ul_config_request_pdu_t *ul_config_pdu,
|
||||||
uint16_t frame,uint8_t subframe,uint8_t srs_present)
|
uint16_t frame,uint8_t subframe,uint8_t srs_present)
|
||||||
{
|
{
|
||||||
@@ -647,7 +647,7 @@ void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
|||||||
void schedule_response(Sched_Rsp_t *Sched_INFO)
|
void schedule_response(Sched_Rsp_t *Sched_INFO)
|
||||||
{
|
{
|
||||||
PHY_VARS_eNB *eNB;
|
PHY_VARS_eNB *eNB;
|
||||||
eNB_rxtx_proc_t *proc;
|
L1_rxtx_proc_t *proc;
|
||||||
// copy data from L2 interface into L1 structures
|
// copy data from L2 interface into L1 structures
|
||||||
module_id_t Mod_id = Sched_INFO->module_id;
|
module_id_t Mod_id = Sched_INFO->module_id;
|
||||||
uint8_t CC_id = Sched_INFO->CC_id;
|
uint8_t CC_id = Sched_INFO->CC_id;
|
||||||
@@ -670,7 +670,7 @@ void schedule_response(Sched_Rsp_t *Sched_INFO)
|
|||||||
|
|
||||||
eNB = RC.eNB[Mod_id][CC_id];
|
eNB = RC.eNB[Mod_id][CC_id];
|
||||||
fp = &eNB->frame_parms;
|
fp = &eNB->frame_parms;
|
||||||
proc = &eNB->proc.proc_rxtx[0];
|
proc = &eNB->proc.L1_proc;
|
||||||
|
|
||||||
/* TODO: check that following line is correct - in the meantime it is disabled */
|
/* TODO: check that following line is correct - in the meantime it is disabled */
|
||||||
//if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)==SF_UL)) return;
|
//if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)==SF_UL)) return;
|
||||||
|
|||||||
@@ -43,17 +43,17 @@ void fill_ulsch_cqi_indication(PHY_VARS_eNB *eNB,uint16_t frame,uint8_t subframe
|
|||||||
void fill_sr_indication(PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int subframe,uint32_t stat);
|
void fill_sr_indication(PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int subframe,uint32_t stat);
|
||||||
void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe);
|
void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe);
|
||||||
void fill_crc_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe,uint8_t crc_flag);
|
void fill_crc_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe,uint8_t crc_flag);
|
||||||
void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,nfapi_dl_config_request_pdu_t *dl_config_pdu);
|
void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,nfapi_dl_config_request_pdu_t *dl_config_pdu);
|
||||||
void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,nfapi_dl_config_request_pdu_t *dl_config_pdu);
|
void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,nfapi_dl_config_request_pdu_t *dl_config_pdu);
|
||||||
void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||||
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
|
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
|
||||||
void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||||
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
|
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
|
||||||
void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
||||||
uint8_t codeword_index,
|
uint8_t codeword_index,
|
||||||
uint8_t *sdu);
|
uint8_t *sdu);
|
||||||
void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
|
||||||
nfapi_ul_config_request_pdu_t *ul_config_pdu,
|
nfapi_ul_config_request_pdu_t *ul_config_pdu,
|
||||||
uint16_t frame,uint8_t subframe,uint8_t srs_present);
|
uint16_t frame,uint8_t subframe,uint8_t srs_present);
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
uint8_t dci_ndi_toggle_even[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
uint8_t dci_ndi_toggle_even[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
uint8_t dci_ndi_toggle_odd[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
uint8_t dci_ndi_toggle_odd[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
|
void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc)
|
||||||
{
|
{
|
||||||
/* SYRTEM */
|
/* SYRTEM */
|
||||||
uint8_t *dci_ndi_toggle_tmp = NULL;
|
uint8_t *dci_ndi_toggle_tmp = NULL;
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ lte_subframe_t get_subframe_direction(uint8_t Mod_id,uint8_t CC_id,uint8_t subfr
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) {
|
||||||
|
|
||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
@@ -314,7 +314,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,int frame, int subframe) {
|
|||||||
|
|
||||||
|
|
||||||
void pdsch_procedures(PHY_VARS_eNB *eNB,
|
void pdsch_procedures(PHY_VARS_eNB *eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
int harq_pid,
|
int harq_pid,
|
||||||
LTE_eNB_DLSCH_t *dlsch,
|
LTE_eNB_DLSCH_t *dlsch,
|
||||||
LTE_eNB_DLSCH_t *dlsch1,
|
LTE_eNB_DLSCH_t *dlsch1,
|
||||||
@@ -465,7 +465,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
|
|||||||
|
|
||||||
|
|
||||||
void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
|
void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
int do_meas)
|
int do_meas)
|
||||||
{
|
{
|
||||||
int frame=proc->frame_tx;
|
int frame=proc->frame_tx;
|
||||||
@@ -656,7 +656,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void srs_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
void srs_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) {
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||||
const int subframe = proc->subframe_rx;
|
const int subframe = proc->subframe_rx;
|
||||||
@@ -719,7 +719,7 @@ void fill_sr_indication(PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int subframe,u
|
|||||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uci_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
|
void uci_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc)
|
||||||
{
|
{
|
||||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||||
uint8_t SR_payload = 0,pucch_b0b1[4][2]= {{0,0},{0,0},{0,0},{0,0}},harq_ack[4]={0,0,0,0};
|
uint8_t SR_payload = 0,pucch_b0b1[4][2]= {{0,0},{0,0},{0,0},{0,0}},harq_ack[4]={0,0,0,0};
|
||||||
@@ -1253,7 +1253,7 @@ void uci_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
|
void pusch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc)
|
||||||
{
|
{
|
||||||
uint32_t ret=0,i;
|
uint32_t ret=0,i;
|
||||||
uint32_t harq_pid;
|
uint32_t harq_pid;
|
||||||
@@ -1474,7 +1474,7 @@ extern void *td_thread(void*);
|
|||||||
|
|
||||||
void init_td_thread(PHY_VARS_eNB *eNB) {
|
void init_td_thread(PHY_VARS_eNB *eNB) {
|
||||||
|
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
L1_proc_t *proc = &eNB->proc;
|
||||||
|
|
||||||
proc->tdp.eNB = eNB;
|
proc->tdp.eNB = eNB;
|
||||||
proc->instance_cnt_td = -1;
|
proc->instance_cnt_td = -1;
|
||||||
@@ -1488,7 +1488,7 @@ void init_td_thread(PHY_VARS_eNB *eNB) {
|
|||||||
}
|
}
|
||||||
void kill_td_thread(PHY_VARS_eNB *eNB) {
|
void kill_td_thread(PHY_VARS_eNB *eNB) {
|
||||||
|
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
L1_proc_t *proc = &eNB->proc;
|
||||||
proc->instance_cnt_td = 0;
|
proc->instance_cnt_td = 0;
|
||||||
pthread_cond_signal(&proc->cond_td);
|
pthread_cond_signal(&proc->cond_td);
|
||||||
|
|
||||||
@@ -1501,7 +1501,7 @@ extern void *te_thread(void*);
|
|||||||
|
|
||||||
void init_te_thread(PHY_VARS_eNB *eNB) {
|
void init_te_thread(PHY_VARS_eNB *eNB) {
|
||||||
|
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
L1_proc_t *proc = &eNB->proc;
|
||||||
|
|
||||||
for(int i=0; i<3 ;i++){
|
for(int i=0; i<3 ;i++){
|
||||||
proc->tep[i].eNB = eNB;
|
proc->tep[i].eNB = eNB;
|
||||||
@@ -1517,7 +1517,7 @@ void init_te_thread(PHY_VARS_eNB *eNB) {
|
|||||||
}
|
}
|
||||||
void kill_te_thread(PHY_VARS_eNB *eNB) {
|
void kill_te_thread(PHY_VARS_eNB *eNB) {
|
||||||
|
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
L1_proc_t *proc = &eNB->proc;
|
||||||
|
|
||||||
for(int i=0; i<3 ;i++){
|
for(int i=0; i<3 ;i++){
|
||||||
proc->tep[i].instance_cnt_te = 0;
|
proc->tep[i].instance_cnt_te = 0;
|
||||||
@@ -2033,7 +2033,7 @@ void fill_crc_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe,uint
|
|||||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
|
void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc)
|
||||||
{
|
{
|
||||||
//RX processing for ue-specific resources (i
|
//RX processing for ue-specific resources (i
|
||||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id)
|
|||||||
@param UE_id ID of UE which may be issuing the SR
|
@param UE_id ID of UE which may be issuing the SR
|
||||||
@returns 1 if TXOp is active.
|
@returns 1 if TXOp is active.
|
||||||
*/
|
*/
|
||||||
uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id);
|
uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,L1_rxtx_proc_t *proc,uint8_t UE_id);
|
||||||
|
|
||||||
/*! \brief Gives the UL subframe corresponding to a PDDCH order in subframe n
|
/*! \brief Gives the UL subframe corresponding to a PDDCH order in subframe n
|
||||||
@param frame_parms Pointer to DL frame parameters
|
@param frame_parms Pointer to DL frame parameters
|
||||||
@@ -247,7 +247,7 @@ TDD, this routine computes the procedure described in Section 10.1 of 36.213 (th
|
|||||||
@param n1_pucch3 Pointer to n1_pucch3
|
@param n1_pucch3 Pointer to n1_pucch3
|
||||||
*/
|
*/
|
||||||
void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
|
void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
uint8_t UE_id,
|
uint8_t UE_id,
|
||||||
int16_t *n1_pucch0,
|
int16_t *n1_pucch0,
|
||||||
int16_t *n1_pucch1,
|
int16_t *n1_pucch1,
|
||||||
@@ -266,7 +266,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
|
|||||||
*/
|
*/
|
||||||
void process_HARQ_feedback(uint8_t UE_id,
|
void process_HARQ_feedback(uint8_t UE_id,
|
||||||
PHY_VARS_eNB *phy_vars_eNB,
|
PHY_VARS_eNB *phy_vars_eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
uint8_t pusch_flag,
|
uint8_t pusch_flag,
|
||||||
uint8_t *pucch_payload,
|
uint8_t *pucch_payload,
|
||||||
uint8_t pucch_sel,
|
uint8_t pucch_sel,
|
||||||
|
|||||||
@@ -92,13 +92,13 @@ enum openair_HARQ_TYPE {
|
|||||||
@param abstraction_flag Indicator of PHY abstraction
|
@param abstraction_flag Indicator of PHY abstraction
|
||||||
@param do_meas Do inline timing measurement
|
@param do_meas Do inline timing measurement
|
||||||
*/
|
*/
|
||||||
void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,int do_meas);
|
void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,L1_rxtx_proc_t *proc,int do_meas);
|
||||||
|
|
||||||
/*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes.
|
/*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes.
|
||||||
@param phy_vars_eNB Pointer to eNB variables on which to act
|
@param phy_vars_eNB Pointer to eNB variables on which to act
|
||||||
@param proc Pointer to RXn-TXnp4 proc information
|
@param proc Pointer to RXn-TXnp4 proc information
|
||||||
*/
|
*/
|
||||||
void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc);
|
void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,L1_rxtx_proc_t *proc);
|
||||||
|
|
||||||
/*! \brief Scheduling for eNB TX procedures in TDD S-subframes.
|
/*! \brief Scheduling for eNB TX procedures in TDD S-subframes.
|
||||||
@param phy_vars_eNB Pointer to eNB variables on which to act
|
@param phy_vars_eNB Pointer to eNB variables on which to act
|
||||||
@@ -110,7 +110,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *pr
|
|||||||
@param phy_vars_eNB Pointer to eNB variables on which to act
|
@param phy_vars_eNB Pointer to eNB variables on which to act
|
||||||
@param abstraction_flag Indicator of PHY abstraction
|
@param abstraction_flag Indicator of PHY abstraction
|
||||||
*/
|
*/
|
||||||
void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc);
|
void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB,L1_rxtx_proc_t *proc);
|
||||||
|
|
||||||
/*! \brief Scheduling for eNB TX procedures in TDD S-subframes.
|
/*! \brief Scheduling for eNB TX procedures in TDD S-subframes.
|
||||||
@param phy_vars_eNB Pointer to eNB variables on which to act
|
@param phy_vars_eNB Pointer to eNB variables on which to act
|
||||||
@@ -121,7 +121,7 @@ void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB);
|
|||||||
/*! \brief Scheduling for eNB RX procedures in TDD S-subframes.
|
/*! \brief Scheduling for eNB RX procedures in TDD S-subframes.
|
||||||
@param phy_vars_eNB Pointer to eNB variables on which to act
|
@param phy_vars_eNB Pointer to eNB variables on which to act
|
||||||
*/
|
*/
|
||||||
void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc);
|
void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,L1_rxtx_proc_t *proc);
|
||||||
|
|
||||||
/*! \brief Scheduling for eNB PRACH RX procedures
|
/*! \brief Scheduling for eNB PRACH RX procedures
|
||||||
@param phy_vars_eNB Pointer to eNB variables on which to act
|
@param phy_vars_eNB Pointer to eNB variables on which to act
|
||||||
@@ -186,7 +186,7 @@ void ra_failed(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
|
|||||||
@param UE_id ID of UE which may be issuing the SR
|
@param UE_id ID of UE which may be issuing the SR
|
||||||
@returns 1 if TXOp is active.
|
@returns 1 if TXOp is active.
|
||||||
*/
|
*/
|
||||||
uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id);
|
uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,L1_rxtx_proc_t *proc,uint8_t UE_id);
|
||||||
|
|
||||||
int8_t find_ue_dlsch(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
int8_t find_ue_dlsch(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
||||||
int8_t find_ue_ulsch(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
int8_t find_ue_ulsch(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
||||||
|
|||||||
@@ -349,6 +349,7 @@ fill_dlsch_config(nfapi_dl_config_request_body_t * dl_req,
|
|||||||
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_mode = transmission_mode;
|
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_mode = transmission_mode;
|
||||||
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_prb_per_subband = num_bf_prb_per_subband;
|
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_prb_per_subband = num_bf_prb_per_subband;
|
||||||
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = num_bf_vector;
|
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = num_bf_vector;
|
||||||
|
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.initial_transmission_sf_io = 0xFFFF;
|
||||||
dl_req->number_pdu++;
|
dl_req->number_pdu++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -379,6 +380,7 @@ void fill_DCI(PHY_VARS_eNB *eNB,
|
|||||||
nfapi_dl_config_request_body_t *dl_req=&sched_resp->DL_req->dl_config_request_body;
|
nfapi_dl_config_request_body_t *dl_req=&sched_resp->DL_req->dl_config_request_body;
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu;
|
nfapi_dl_config_request_pdu_t *dl_config_pdu;
|
||||||
nfapi_tx_request_body_t *TX_req=&sched_resp->TX_req->tx_request_body;
|
nfapi_tx_request_body_t *TX_req=&sched_resp->TX_req->tx_request_body;
|
||||||
|
int NB_RB4TBS = common_flag == 0 ? NB_RB : (2+TPC);
|
||||||
|
|
||||||
dl_req->number_dci=0;
|
dl_req->number_dci=0;
|
||||||
dl_req->number_pdu=0;
|
dl_req->number_pdu=0;
|
||||||
@@ -391,26 +393,24 @@ void fill_DCI(PHY_VARS_eNB *eNB,
|
|||||||
case 2:
|
case 2:
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
if (common_flag == 0) {
|
|
||||||
|
|
||||||
dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu];
|
dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu];
|
||||||
memset((void *) dl_config_pdu, 0,
|
memset((void *) dl_config_pdu, 0,
|
||||||
sizeof(nfapi_dl_config_request_pdu_t));
|
sizeof(nfapi_dl_config_request_pdu_t));
|
||||||
dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE;
|
dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE;
|
||||||
dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu));
|
dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu));
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = (common_flag == 0) ? NFAPI_DL_DCI_FORMAT_1 : NFAPI_DL_DCI_FORMAT_1A;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = 4;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = 4;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = n_rnti+k;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = (common_flag == 0) ? n_rnti+k : SI_RNTI;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 1; // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = (common_flag ==0 ) ? 1: 2; // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power
|
||||||
|
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = 0;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = 0;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = TPC; // dont adjust power when retransmitting
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = TPC; // dont adjust power when retransmitting
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = ndi;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = (common_flag == 0) ? ndi : 0;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = mcs1;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = mcs1;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = rv;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = rv;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = DLSCH_RB_ALLOC;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = (common_flag == 0) ? DLSCH_RB_ALLOC : computeRIV(eNB->frame_parms.N_RB_DL,0,NB_RB);
|
||||||
//deactivate second codeword
|
//deactivate second codeword
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_2 = 0;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_2 = 0;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_2 = 1;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_2 = 1;
|
||||||
@@ -422,11 +422,12 @@ void fill_DCI(PHY_VARS_eNB *eNB,
|
|||||||
dl_req->number_pdu++;
|
dl_req->number_pdu++;
|
||||||
dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG;
|
dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG;
|
||||||
|
|
||||||
|
AssertFatal(TPC>=0 && TPC<2, "TPC should be 0 or 1\n");
|
||||||
|
|
||||||
fill_dlsch_config(dl_req,
|
fill_dlsch_config(dl_req,
|
||||||
get_TBS_DL(mcs1,NB_RB),
|
get_TBS_DL(mcs1,NB_RB4TBS),
|
||||||
(retrans > 0) ? -1 : 0, /* retransmission, no pdu_index */
|
(retrans > 0) ? -1 : 0, /* retransmission, no pdu_index */
|
||||||
n_rnti,
|
(common_flag == 0) ? n_rnti : SI_RNTI,
|
||||||
0, // type 0 allocation from 7.1.6 in 36.213
|
0, // type 0 allocation from 7.1.6 in 36.213
|
||||||
0, // virtual_resource_block_assignment_flag, unused here
|
0, // virtual_resource_block_assignment_flag, unused here
|
||||||
DLSCH_RB_ALLOC, // resource_block_coding,
|
DLSCH_RB_ALLOC, // resource_block_coding,
|
||||||
@@ -449,13 +450,10 @@ void fill_DCI(PHY_VARS_eNB *eNB,
|
|||||||
);
|
);
|
||||||
fill_tx_req(TX_req,
|
fill_tx_req(TX_req,
|
||||||
(frame * 10) + subframe,
|
(frame * 10) + subframe,
|
||||||
get_TBS_DL(mcs1,NB_RB),
|
get_TBS_DL(mcs1,NB_RB4TBS),
|
||||||
0,
|
0,
|
||||||
input_buffer[k]);
|
input_buffer[k]);
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -566,8 +564,7 @@ int main(int argc, char **argv)
|
|||||||
int eNB_id = 0;
|
int eNB_id = 0;
|
||||||
unsigned char round;
|
unsigned char round;
|
||||||
unsigned char i_mod = 2;
|
unsigned char i_mod = 2;
|
||||||
unsigned short NB_RB;
|
int NB_RB;
|
||||||
|
|
||||||
|
|
||||||
SCM_t channel_model=Rayleigh1;
|
SCM_t channel_model=Rayleigh1;
|
||||||
// unsigned char *input_data,*decoded_output;
|
// unsigned char *input_data,*decoded_output;
|
||||||
@@ -982,7 +979,6 @@ int main(int argc, char **argv)
|
|||||||
// alternatively you can disable ITTI completely in CMakeLists.txt
|
// alternatively you can disable ITTI completely in CMakeLists.txt
|
||||||
//itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL);
|
//itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL);
|
||||||
|
|
||||||
|
|
||||||
if (common_flag == 0) {
|
if (common_flag == 0) {
|
||||||
switch (N_RB_DL) {
|
switch (N_RB_DL) {
|
||||||
case 6:
|
case 6:
|
||||||
@@ -1004,8 +1000,12 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
NB_RB = conv_nprb(0,DLSCH_RB_ALLOC,N_RB_DL);
|
NB_RB = conv_nprb(0,DLSCH_RB_ALLOC,N_RB_DL);
|
||||||
} else
|
}
|
||||||
NB_RB = 4;
|
else {
|
||||||
|
if (rballocset==0) NB_RB = 8;
|
||||||
|
else NB_RB = DLSCH_RB_ALLOC;
|
||||||
|
AssertFatal(NB_RB <= N_RB_DL,"illegal NB_RB %d\n",NB_RB);
|
||||||
|
}
|
||||||
|
|
||||||
if (xforms==1) {
|
if (xforms==1) {
|
||||||
fl_initialize (&argc, argv, NULL, 0, 0);
|
fl_initialize (&argc, argv, NULL, 0, 0);
|
||||||
@@ -1341,7 +1341,7 @@ int main(int argc, char **argv)
|
|||||||
eNB->UE_stats[1].DL_pmi_single = 0;
|
eNB->UE_stats[1].DL_pmi_single = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
eNB_rxtx_proc_t *proc_eNB = &eNB->proc.proc_rxtx[0];//UE->current_thread_id[subframe]];
|
L1_rxtx_proc_t *proc_eNB = &eNB->proc.L1_proc;
|
||||||
|
|
||||||
if (input_fd==NULL) {
|
if (input_fd==NULL) {
|
||||||
|
|
||||||
@@ -1504,7 +1504,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
// Simulate HARQ procedures!!!
|
// Simulate HARQ procedures!!!
|
||||||
memset(CCE_table,0,800*sizeof(int));
|
memset(CCE_table,0,800*sizeof(int));
|
||||||
if (common_flag == 0) {
|
if (/*common_flag == 0*/ 1) {
|
||||||
|
|
||||||
num_dci=0;
|
num_dci=0;
|
||||||
num_common_dci=0;
|
num_common_dci=0;
|
||||||
@@ -1636,7 +1636,7 @@ int main(int argc, char **argv)
|
|||||||
if (generate_ue_dlsch_params_from_dci(proc->frame_rx,
|
if (generate_ue_dlsch_params_from_dci(proc->frame_rx,
|
||||||
proc->subframe_rx,
|
proc->subframe_rx,
|
||||||
(void *)&dci_alloc[0].dci_pdu,
|
(void *)&dci_alloc[0].dci_pdu,
|
||||||
n_rnti,
|
common_flag == 0 ? n_rnti : SI_RNTI,
|
||||||
dci_alloc[0].format,
|
dci_alloc[0].format,
|
||||||
UE->pdcch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id],
|
UE->pdcch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id],
|
||||||
UE->pdsch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id],
|
UE->pdsch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id],
|
||||||
|
|||||||
@@ -750,7 +750,7 @@ int main(int argc, char **argv)
|
|||||||
0,
|
0,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
eNB_rxtx_proc_t *proc_rxtx = &eNB->proc.proc_rxtx[subframe&1];
|
L1_rxtx_proc_t *proc_rxtx = (subframe == 0)? &eNB->proc.L1_proc: &eNB->proc.L1_proc_tx;
|
||||||
|
|
||||||
eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0);
|
eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0);
|
||||||
UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0);
|
UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0);
|
||||||
|
|||||||
@@ -85,8 +85,8 @@ int nfapi_mode = 0;
|
|||||||
|
|
||||||
extern void fep_full(RU_t *ru);
|
extern void fep_full(RU_t *ru);
|
||||||
extern void ru_fep_full_2thread(RU_t *ru);
|
extern void ru_fep_full_2thread(RU_t *ru);
|
||||||
extern void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc);
|
extern void eNB_fep_full(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc);
|
||||||
extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc);
|
extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc);
|
||||||
|
|
||||||
nfapi_dl_config_request_t DL_req;
|
nfapi_dl_config_request_t DL_req;
|
||||||
nfapi_ul_config_request_t UL_req;
|
nfapi_ul_config_request_t UL_req;
|
||||||
@@ -800,7 +800,7 @@ int main(int argc, char **argv) {
|
|||||||
UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
|
UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
|
||||||
eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
|
eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
|
||||||
UE->mac_enabled=0;
|
UE->mac_enabled=0;
|
||||||
eNB_rxtx_proc_t *proc_rxtx = &eNB->proc.proc_rxtx[subframe&1];
|
L1_rxtx_proc_t *proc_rxtx = &eNB->proc.L1_proc;
|
||||||
UE_rxtx_proc_t *proc_rxtx_ue = &UE->proc.proc_rxtx[subframe&1];
|
UE_rxtx_proc_t *proc_rxtx_ue = &UE->proc.proc_rxtx[subframe&1];
|
||||||
proc_rxtx->frame_rx=1;
|
proc_rxtx->frame_rx=1;
|
||||||
proc_rxtx->subframe_rx=subframe;
|
proc_rxtx->subframe_rx=subframe;
|
||||||
|
|||||||
@@ -3254,11 +3254,15 @@ nfapi_ul_config_request_pdu_t *has_ul_grant(module_id_t module_idP,
|
|||||||
return (NULL); // no ul grant at all for this UE
|
return (NULL); // no ul grant at all for this UE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
boolean_t
|
boolean_t
|
||||||
CCE_allocation_infeasible(int module_idP,
|
CCE_allocation_infeasible(int module_idP,
|
||||||
int CC_idP,
|
int CC_idP,
|
||||||
int format_flag,
|
int format_flag,
|
||||||
int subframe, int aggregation, int rnti)
|
int subframe,
|
||||||
|
int aggregation,
|
||||||
|
int rnti)
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
nfapi_dl_config_request_body_t *DL_req = &RC.mac[module_idP]->DL_req[CC_idP].dl_config_request_body;
|
nfapi_dl_config_request_body_t *DL_req = &RC.mac[module_idP]->DL_req[CC_idP].dl_config_request_body;
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req->dl_config_pdu_list[DL_req->number_pdu];
|
nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req->dl_config_pdu_list[DL_req->number_pdu];
|
||||||
@@ -3269,9 +3273,12 @@ CCE_allocation_infeasible(int module_idP,
|
|||||||
|
|
||||||
if (format_flag != 2) { // DL DCI
|
if (format_flag != 2) { // DL DCI
|
||||||
if (DL_req->number_pdu == MAX_NUM_DL_PDU) {
|
if (DL_req->number_pdu == MAX_NUM_DL_PDU) {
|
||||||
LOG_W(MAC,
|
LOG_W(MAC, "Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n",
|
||||||
"Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n",
|
subframe,
|
||||||
subframe, rnti);
|
rnti);
|
||||||
|
|
||||||
|
res = TRUE;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG;
|
||||||
dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE;
|
dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE;
|
||||||
@@ -3279,22 +3286,29 @@ CCE_allocation_infeasible(int module_idP,
|
|||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = (format_flag == 0) ? 2 : 1;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = (format_flag == 0) ? 2 : 1;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = aggregation;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = aggregation;
|
||||||
DL_req->number_pdu++;
|
DL_req->number_pdu++;
|
||||||
LOG_D(MAC,
|
|
||||||
"Subframe %d: Checking CCE feasibility format %d : (%x,%d) (%x,%d,%d)\n",
|
LOG_D(MAC, "Subframe %d: Checking CCE feasibility format %d : (%x,%d) \n",
|
||||||
subframe, format_flag, rnti, aggregation,
|
subframe,
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti,
|
format_flag,
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.
|
rnti,
|
||||||
aggregation_level,
|
aggregation);
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type);
|
|
||||||
ret = allocate_CCEs(module_idP, CC_idP, 0, subframe, 0);
|
ret = allocate_CCEs(module_idP, CC_idP, 0, subframe, 0);
|
||||||
if (ret == -1) res = TRUE;
|
|
||||||
|
if (ret == -1) {
|
||||||
|
res = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
DL_req->number_pdu--;
|
DL_req->number_pdu--;
|
||||||
}
|
}
|
||||||
} else { // ue-specific UL DCI
|
} else { // ue-specific UL DCI
|
||||||
if (HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi == MAX_NUM_HI_DCI0_PDU) {
|
if (HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi == MAX_NUM_HI_DCI0_PDU) {
|
||||||
LOG_W(MAC,
|
LOG_W(MAC, "Subframe %d: FAPI UL structure is full, skip scheduling UE %d\n",
|
||||||
"Subframe %d: FAPI UL structure is full, skip scheduling UE %d\n",
|
subframe,
|
||||||
subframe, rnti);
|
rnti);
|
||||||
|
|
||||||
|
res = TRUE;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_DCI_PDU_TYPE;
|
hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_DCI_PDU_TYPE;
|
||||||
hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG;
|
hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG;
|
||||||
@@ -3302,13 +3316,18 @@ CCE_allocation_infeasible(int module_idP,
|
|||||||
hi_dci0_pdu->dci_pdu.dci_pdu_rel8.aggregation_level = aggregation;
|
hi_dci0_pdu->dci_pdu.dci_pdu_rel8.aggregation_level = aggregation;
|
||||||
HI_DCI0_req->number_of_dci++;
|
HI_DCI0_req->number_of_dci++;
|
||||||
ret = allocate_CCEs(module_idP, CC_idP, 0, subframe, 0);
|
ret = allocate_CCEs(module_idP, CC_idP, 0, subframe, 0);
|
||||||
if (ret == -1) res = TRUE;
|
|
||||||
|
if (ret == -1) {
|
||||||
|
res = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
HI_DCI0_req->number_of_dci--;
|
HI_DCI0_req->number_of_dci--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_retransmission_timing(LTE_TDD_Config_t *tdd_Config, frame_t *frameP,
|
void get_retransmission_timing(LTE_TDD_Config_t *tdd_Config, frame_t *frameP,
|
||||||
sub_frame_t *subframeP)
|
sub_frame_t *subframeP)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1145,12 +1145,8 @@ schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
int32_t normalized_rx_power = 0;
|
int32_t normalized_rx_power = 0;
|
||||||
int32_t target_rx_power = 0;
|
int32_t target_rx_power = 0;
|
||||||
static int32_t tpc_accumulated = 0;
|
static int32_t tpc_accumulated = 0;
|
||||||
int UE_id = -1;
|
|
||||||
int n = 0;
|
|
||||||
int CC_id = 0;
|
|
||||||
int drop_ue = 0;
|
|
||||||
int n_rb_ul_val = 0;
|
|
||||||
int sched_frame = 0;
|
int sched_frame = 0;
|
||||||
|
int CC_id = 0;
|
||||||
eNB_MAC_INST *mac = NULL;
|
eNB_MAC_INST *mac = NULL;
|
||||||
COMMON_channels_t *cc = NULL;
|
COMMON_channels_t *cc = NULL;
|
||||||
UE_list_t *UE_list = NULL;
|
UE_list_t *UE_list = NULL;
|
||||||
@@ -1159,6 +1155,7 @@ schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
UE_sched_ctrl *UE_sched_ctrl_ptr = NULL;
|
UE_sched_ctrl *UE_sched_ctrl_ptr = NULL;
|
||||||
int rvidx_tab[4] = {0, 2, 3, 1};
|
int rvidx_tab[4] = {0, 2, 3, 1};
|
||||||
int first_rb_slice[NFAPI_CC_MAX];
|
int first_rb_slice[NFAPI_CC_MAX];
|
||||||
|
int n_rb_ul_tab[NFAPI_CC_MAX];
|
||||||
|
|
||||||
/* Init */
|
/* Init */
|
||||||
mac = RC.mac[module_idP];
|
mac = RC.mac[module_idP];
|
||||||
@@ -1166,6 +1163,7 @@ schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
UE_list = &(mac->UE_list);
|
UE_list = &(mac->UE_list);
|
||||||
sli = &(mac->slice_info);
|
sli = &(mac->slice_info);
|
||||||
memset(first_rb_slice, 0, NFAPI_CC_MAX * sizeof(int));
|
memset(first_rb_slice, 0, NFAPI_CC_MAX * sizeof(int));
|
||||||
|
memset(n_rb_ul_tab, 0, NFAPI_CC_MAX * sizeof(int));
|
||||||
sched_frame = frameP;
|
sched_frame = frameP;
|
||||||
|
|
||||||
if (sched_subframeP < subframeP) {
|
if (sched_subframeP < subframeP) {
|
||||||
@@ -1180,136 +1178,132 @@ schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
nfapi_ul_config_request_body_t *ul_req_tmp_body = &(ul_req_tmp->ul_config_request_body);
|
nfapi_ul_config_request_body_t *ul_req_tmp_body = &(ul_req_tmp->ul_config_request_body);
|
||||||
nfapi_ul_config_ulsch_harq_information *ulsch_harq_information;
|
nfapi_ul_config_ulsch_harq_information *ulsch_harq_information;
|
||||||
|
|
||||||
for (CC_id = 0; CC_id < RC.nb_mac_CC[module_idP]; ++CC_id) {
|
hi_dci0_req->sfn_sf = (frameP << 4) + subframeP;
|
||||||
n_rb_ul_val = to_prb(cc[CC_id].ul_Bandwidth);
|
|
||||||
UE_list->first_rb_offset[CC_id][slice_idx] = cmin(n_rb_ul_val, sli->ul[slice_idx].first_rb);
|
/* Note: RC.nb_mac_CC[module_idP] should be lower than or equal to NFAPI_CC_MAX */
|
||||||
|
for (CC_id = 0; CC_id < RC.nb_mac_CC[module_idP]; CC_id++) {
|
||||||
|
n_rb_ul_tab[CC_id] = to_prb(cc[CC_id].ul_Bandwidth);
|
||||||
|
UE_list->first_rb_offset[CC_id][slice_idx] = cmin(n_rb_ul_tab[CC_id], sli->ul[slice_idx].first_rb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ULSCH preprocessor: set UE_template->
|
||||||
|
* pre_allocated_nb_rb_ul[slice_idx]
|
||||||
|
* pre_assigned_mcs_ul
|
||||||
|
* pre_allocated_rb_table_index_ul
|
||||||
|
*/
|
||||||
ulsch_scheduler_pre_processor(module_idP, slice_idx, frameP, subframeP, sched_subframeP, first_rb);
|
ulsch_scheduler_pre_processor(module_idP, slice_idx, frameP, subframeP, sched_subframeP, first_rb);
|
||||||
|
|
||||||
for (CC_id = 0; CC_id < RC.nb_mac_CC[module_idP]; ++CC_id) {
|
for (CC_id = 0; CC_id < RC.nb_mac_CC[module_idP]; CC_id++) {
|
||||||
first_rb_slice[CC_id] = first_rb[CC_id] + UE_list->first_rb_offset[CC_id][slice_idx];
|
first_rb_slice[CC_id] = first_rb[CC_id] + UE_list->first_rb_offset[CC_id][slice_idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
hi_dci0_req->sfn_sf = (frameP << 4) + subframeP;
|
|
||||||
|
|
||||||
// loop over all active UEs
|
// loop over all active UEs
|
||||||
for (UE_id = UE_list->head_ul; UE_id >= 0;
|
for (int UE_id = UE_list->head_ul; UE_id >= 0; UE_id = UE_list->next_ul[UE_id]) {
|
||||||
UE_id = UE_list->next_ul[UE_id]) {
|
if (!ue_ul_slice_membership(module_idP, UE_id, slice_idx)) {
|
||||||
if (!ue_ul_slice_membership(module_idP, UE_id, slice_idx))
|
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// don't schedule if Msg4 is not received yet
|
// don't schedule if Msg4 is not received yet
|
||||||
if (UE_list->UE_template[UE_PCCID(module_idP, UE_id)][UE_id].
|
if (UE_list->UE_template[UE_PCCID(module_idP, UE_id)][UE_id].configured == FALSE) {
|
||||||
configured == FALSE) {
|
LOG_D(MAC, "[eNB %d] frame %d, subframe %d, UE %d: not configured, skipping UE scheduling \n",
|
||||||
LOG_D(MAC,
|
module_idP,
|
||||||
"[eNB %d] frame %d subfarme %d, UE %d: not configured, skipping UE scheduling \n",
|
frameP,
|
||||||
module_idP, frameP, subframeP, UE_id);
|
subframeP,
|
||||||
|
UE_id);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
rnti = UE_RNTI(module_idP, UE_id);
|
rnti = UE_RNTI(module_idP, UE_id);
|
||||||
|
|
||||||
if (rnti == NOT_A_RNTI) {
|
if (rnti == NOT_A_RNTI) {
|
||||||
LOG_W(MAC, "[eNB %d] frame %d subfarme %d, UE %d: no RNTI \n",
|
LOG_W(MAC, "[eNB %d] frame %d, subframe %d, UE %d: no RNTI \n",
|
||||||
module_idP, frameP, subframeP, UE_id);
|
module_idP,
|
||||||
continue;
|
frameP,
|
||||||
}
|
subframeP,
|
||||||
|
UE_id);
|
||||||
drop_ue = 0;
|
|
||||||
|
|
||||||
/* let's drop the UE if get_eNB_UE_stats returns NULL when calling it with any of the UE's active UL CCs */
|
|
||||||
/* TODO: refine?
|
|
||||||
|
|
||||||
for (n=0; n<UE_list->numactiveULCCs[UE_id]; n++) {
|
|
||||||
CC_id = UE_list->ordered_ULCCids[n][UE_id];
|
|
||||||
|
|
||||||
if (mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti) == NULL) {
|
|
||||||
LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: no PHY context\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id);
|
|
||||||
drop_ue = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} */
|
|
||||||
if (drop_ue == 1) {
|
|
||||||
/* we can't come here, ulsch_scheduler_pre_processor won't put in the list a UE with no PHY context */
|
|
||||||
abort();
|
|
||||||
|
|
||||||
/* TODO: this is a hack. Sometimes the UE has no PHY context but
|
|
||||||
* is still present in the MAC with 'ul_failure_timer' = 0 and
|
|
||||||
* 'ul_out_of_sync' = 0. It seems wrong and the UE stays there forever. Let's
|
|
||||||
* start an UL out of sync procedure in this case.
|
|
||||||
* The root cause of this problem has to be found and corrected.
|
|
||||||
* In the meantime, this hack...
|
|
||||||
*/
|
|
||||||
if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 0 &&
|
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 0) {
|
|
||||||
LOG_W(MAC,
|
|
||||||
"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: UE in weird state, let's put it 'out of sync'\n",
|
|
||||||
module_idP, frameP, subframeP, UE_id, rnti, CC_id);
|
|
||||||
// inform RRC of failure and clear timer
|
|
||||||
mac_eNB_rrc_ul_failure(module_idP, CC_id, frameP,
|
|
||||||
subframeP, rnti);
|
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0;
|
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// loop over all active UL CC_ids for this UE
|
// loop over all active UL CC_ids for this UE
|
||||||
for (n = 0; n < UE_list->numactiveULCCs[UE_id]; n++) {
|
for (int n = 0; n < UE_list->numactiveULCCs[UE_id]; n++) {
|
||||||
// This is the actual CC_id in the list
|
// This is the actual CC_id in the list
|
||||||
CC_id = UE_list->ordered_ULCCids[n][UE_id];
|
CC_id = UE_list->ordered_ULCCids[n][UE_id];
|
||||||
n_rb_ul_val = to_prb(cc[CC_id].ul_Bandwidth);
|
|
||||||
|
|
||||||
/*
|
/* should format_flag be 2 in CCE_allocation_infeasible??? */
|
||||||
aggregation=get_aggregation(get_bw_index(module_idP,CC_id),
|
/* this test seems to be way too long, can we provide an optimization? */
|
||||||
eNB_UE_stats->dl_cqi,
|
if (CCE_allocation_infeasible(module_idP, CC_id, 1, subframeP, aggregation, rnti)) {
|
||||||
format0);
|
LOG_W(MAC, "[eNB %d] frame %d, subframe %d, UE %d/%x CC %d: not enough CCE\n",
|
||||||
*/
|
module_idP,
|
||||||
|
frameP,
|
||||||
|
subframeP,
|
||||||
|
UE_id,
|
||||||
|
rnti,
|
||||||
|
CC_id);
|
||||||
|
|
||||||
if (CCE_allocation_infeasible
|
|
||||||
(module_idP, CC_id, 1, subframeP, aggregation, rnti)) {
|
|
||||||
LOG_W(MAC,
|
|
||||||
"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: not enough nCCE\n",
|
|
||||||
module_idP, frameP, subframeP, UE_id, rnti, CC_id);
|
|
||||||
continue; // break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* be sure that there are some free RBs */
|
|
||||||
if (first_rb_slice[CC_id] >= n_rb_ul_val - 1) {
|
|
||||||
LOG_W(MAC,
|
|
||||||
"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
|
|
||||||
module_idP, frameP, subframeP, UE_id, rnti, CC_id);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (eNB_UE_stats->mode == PUSCH) { // ue has a ulsch channel
|
/* be sure that there are some free RBs */
|
||||||
UE_template_ptr = &UE_list->UE_template[CC_id][UE_id];
|
if (first_rb_slice[CC_id] >= n_rb_ul_tab[CC_id] - 1) {
|
||||||
UE_sched_ctrl_ptr = &UE_list->UE_sched_ctrl[UE_id];
|
LOG_W(MAC, "[eNB %d] frame %d, subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
|
||||||
|
module_idP,
|
||||||
|
frameP,
|
||||||
|
subframeP,
|
||||||
|
UE_id,
|
||||||
|
rnti,
|
||||||
|
CC_id);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
UE_template_ptr = &(UE_list->UE_template[CC_id][UE_id]);
|
||||||
|
UE_sched_ctrl_ptr = &(UE_list->UE_sched_ctrl[UE_id]);
|
||||||
harq_pid = subframe2harqpid(&cc[CC_id], sched_frame, sched_subframeP);
|
harq_pid = subframe2harqpid(&cc[CC_id], sched_frame, sched_subframeP);
|
||||||
round_index = UE_sched_ctrl_ptr->round_UL[CC_id][harq_pid];
|
round_index = UE_sched_ctrl_ptr->round_UL[CC_id][harq_pid];
|
||||||
AssertFatal(round_index < 8, "round %d > 7 for UE %d/%x\n", round_index,
|
|
||||||
UE_id, rnti);
|
|
||||||
LOG_D(MAC,
|
|
||||||
"[eNB %d] frame %d subframe %d (sched_frame %d, sched_subframe %d), Checking PUSCH %d for UE %d/%x CC %d : aggregation level %d, N_RB_UL %d\n",
|
|
||||||
module_idP, frameP, subframeP, sched_frame, sched_subframeP, harq_pid, UE_id, rnti,
|
|
||||||
CC_id, aggregation, n_rb_ul_val);
|
|
||||||
RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP * 10) + subframeP] = UE_template_ptr->estimated_ul_buffer;
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO,RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP *
|
|
||||||
10) +
|
|
||||||
subframeP]);
|
|
||||||
|
|
||||||
if (UE_is_to_be_scheduled(module_idP, CC_id, UE_id) > 0 || round_index > 0) // || ((frameP%10)==0))
|
AssertFatal(round_index < 8, "round %d > 7 for UE %d/%x\n",
|
||||||
// if there is information on bsr of DCCH, DTCH or if there is UL_SR, or if there is a packet to retransmit, or we want to schedule a periodic feedback every 10 frames
|
round_index,
|
||||||
|
UE_id,
|
||||||
|
rnti);
|
||||||
|
|
||||||
|
LOG_D(MAC, "[eNB %d] frame %d subframe %d (sched_frame %d, sched_subframe %d), Checking PUSCH %d for UE %d/%x CC %d : aggregation level %d, N_RB_UL %d\n",
|
||||||
|
module_idP,
|
||||||
|
frameP,
|
||||||
|
subframeP,
|
||||||
|
sched_frame,
|
||||||
|
sched_subframeP,
|
||||||
|
harq_pid,
|
||||||
|
UE_id,
|
||||||
|
rnti,
|
||||||
|
CC_id,
|
||||||
|
aggregation,
|
||||||
|
n_rb_ul_tab[CC_id]);
|
||||||
|
|
||||||
|
RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP * 10) + subframeP] = UE_template_ptr->estimated_ul_buffer;
|
||||||
|
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO, RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP * 10) + subframeP]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there is information on bsr of DCCH, DTCH or if there is UL_SR,
|
||||||
|
* or if there is a packet to retransmit, or we want to schedule a periodic feedback
|
||||||
|
*/
|
||||||
|
if (UE_is_to_be_scheduled(module_idP, CC_id, UE_id) > 0 || round_index > 0)
|
||||||
{
|
{
|
||||||
LOG_D(MAC,
|
LOG_D(MAC, "[eNB %d][PUSCH %d] Frame %d subframe %d Scheduling UE %d/%x in round %d(SR %d,UL_inactivity timer %d,UL_failure timer %d,cqi_req_timer %d)\n",
|
||||||
"[eNB %d][PUSCH %d] Frame %d subframe %d Scheduling UE %d/%x in round %d(SR %d,UL_inactivity timer %d,UL_failure timer %d,cqi_req_timer %d)\n",
|
module_idP,
|
||||||
module_idP, harq_pid, frameP, subframeP, UE_id, rnti,
|
harq_pid,
|
||||||
round_index, UE_template_ptr->ul_SR,
|
frameP,
|
||||||
|
subframeP,
|
||||||
|
UE_id,
|
||||||
|
rnti,
|
||||||
|
round_index,
|
||||||
|
UE_template_ptr->ul_SR,
|
||||||
UE_sched_ctrl_ptr->ul_inactivity_timer,
|
UE_sched_ctrl_ptr->ul_inactivity_timer,
|
||||||
UE_sched_ctrl_ptr->ul_failure_timer,
|
UE_sched_ctrl_ptr->ul_failure_timer,
|
||||||
UE_sched_ctrl_ptr->cqi_req_timer);
|
UE_sched_ctrl_ptr->cqi_req_timer);
|
||||||
|
|
||||||
// reset the scheduling request
|
// reset the scheduling request
|
||||||
UE_template_ptr->ul_SR = 0;
|
UE_template_ptr->ul_SR = 0;
|
||||||
status = mac_eNB_get_rrc_status(module_idP, rnti);
|
status = mac_eNB_get_rrc_status(module_idP, rnti);
|
||||||
@@ -1408,7 +1402,7 @@ schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2 = UE_template_ptr->mcs_UL[harq_pid];
|
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2 = UE_template_ptr->mcs_UL[harq_pid];
|
||||||
// buffer_occupancy = UE_template_ptr->ul_total_buffer;
|
// buffer_occupancy = UE_template_ptr->ul_total_buffer;
|
||||||
|
|
||||||
while (((rb_table[rb_table_index] > (n_rb_ul_val - first_rb_slice[CC_id]))
|
while (((rb_table[rb_table_index] > (n_rb_ul_tab[CC_id] - first_rb_slice[CC_id]))
|
||||||
|| (rb_table[rb_table_index] > 45))
|
|| (rb_table[rb_table_index] > 45))
|
||||||
&& (rb_table_index > 0)) {
|
&& (rb_table_index > 0)) {
|
||||||
rb_table_index--;
|
rb_table_index--;
|
||||||
@@ -1665,7 +1659,7 @@ schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
first_rb[CC_id],UE_template_ptr->nb_rb_ul[harq_pid],
|
first_rb[CC_id],UE_template_ptr->nb_rb_ul[harq_pid],
|
||||||
harq_pid, round_index);
|
harq_pid, round_index);
|
||||||
|
|
||||||
rballoc = mac_xface->computeRIV(frame_parms->n_rb_ul_val,
|
rballoc = mac_xface->computeRIV(frame_parms->n_rb_ul_tab[CC_id],
|
||||||
first_rb[CC_id],
|
first_rb[CC_id],
|
||||||
UE_template_ptr->nb_rb_ul[harq_pid]);
|
UE_template_ptr->nb_rb_ul[harq_pid]);
|
||||||
first_rb[CC_id]+=UE_template_ptr->nb_rb_ul[harq_pid]; // increment for next UE allocation
|
first_rb[CC_id]+=UE_template_ptr->nb_rb_ul[harq_pid]; // increment for next UE allocation
|
||||||
@@ -1678,6 +1672,6 @@ schedule_ulsch_rnti(module_id_t module_idP,
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
} // UE_is_to_be_scheduled
|
} // UE_is_to_be_scheduled
|
||||||
} // loop over UE_id
|
} // loop over all active CC_ids
|
||||||
} // loop of CC_id
|
} // loop over UE_ids
|
||||||
}
|
}
|
||||||
|
|||||||
+137
-136
File diff suppressed because it is too large
Load Diff
@@ -590,7 +590,7 @@ int dl_config_req_UE_MAC(nfapi_dl_config_request_t* req, module_id_t Mod_id) //,
|
|||||||
//Mod_id = 0; // Currently static (only for one UE) but this should change.
|
//Mod_id = 0; // Currently static (only for one UE) but this should change.
|
||||||
|
|
||||||
/*struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
/*struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||||
eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0];*/
|
L1_rxtx_proc_t *proc = &eNB->proc.L1_proc;*/
|
||||||
nfapi_dl_config_request_pdu_t* dl_config_pdu_list = req->dl_config_request_body.dl_config_pdu_list;
|
nfapi_dl_config_request_pdu_t* dl_config_pdu_list = req->dl_config_request_body.dl_config_pdu_list;
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu_tmp;
|
nfapi_dl_config_request_pdu_t *dl_config_pdu_tmp;
|
||||||
|
|
||||||
@@ -941,14 +941,14 @@ void UE_config_stub_pnf(void) {
|
|||||||
|
|
||||||
/* Dummy functions*/
|
/* Dummy functions*/
|
||||||
|
|
||||||
void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||||
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
|
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||||
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
|
nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -957,14 +957,14 @@ void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rx
|
|||||||
|
|
||||||
void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
|
void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
|
||||||
int frame, int subframe,
|
int frame, int subframe,
|
||||||
eNB_rxtx_proc_t *proc,
|
L1_rxtx_proc_t *proc,
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu)
|
nfapi_dl_config_request_pdu_t *dl_config_pdu)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
||||||
uint8_t *sdu)
|
uint8_t *sdu)
|
||||||
{
|
{
|
||||||
@@ -972,7 +972,7 @@ void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
||||||
uint8_t codeword_index,
|
uint8_t codeword_index,
|
||||||
uint8_t *sdu)
|
uint8_t *sdu)
|
||||||
@@ -981,7 +981,7 @@ void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_pr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
|
||||||
nfapi_ul_config_request_pdu_t *ul_config_pdu,
|
nfapi_ul_config_request_pdu_t *ul_config_pdu,
|
||||||
uint16_t frame,uint8_t subframe,uint8_t srs_present)
|
uint16_t frame,uint8_t subframe,uint8_t srs_present)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -57,6 +57,9 @@ case USRP_X300_DEV:
|
|||||||
case LMSSDR_DEV:
|
case LMSSDR_DEV:
|
||||||
printf("[%s] has loaded LMSSDR device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
|
printf("[%s] has loaded LMSSDR device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
|
||||||
break;
|
break;
|
||||||
|
case IRIS_DEV:
|
||||||
|
printf("[%s] has loaded Iris device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
|
||||||
|
break;
|
||||||
case NONE_DEV:
|
case NONE_DEV:
|
||||||
printf("[%s] has not loaded a HW device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
|
printf("[%s] has not loaded a HW device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -95,6 +95,8 @@ typedef enum {
|
|||||||
BLADERF_DEV,
|
BLADERF_DEV,
|
||||||
/*!\brief device is LMSSDR (SoDeRa)*/
|
/*!\brief device is LMSSDR (SoDeRa)*/
|
||||||
LMSSDR_DEV,
|
LMSSDR_DEV,
|
||||||
|
/*!\brief device is Iris */
|
||||||
|
IRIS_DEV,
|
||||||
/*!\brief device is NONE*/
|
/*!\brief device is NONE*/
|
||||||
NONE_DEV,
|
NONE_DEV,
|
||||||
MAX_RF_DEV_TYPE
|
MAX_RF_DEV_TYPE
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
IRIS_OBJ += $(OPENAIR_TARGETS)/ARCH/IRIS/USERSPACE/LIB/iris_lib.o
|
||||||
|
IRIS_FILE_OBJ += $(OPENAIR_TARGETS)/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp
|
||||||
|
IRIS_CFLAGS += -I$(OPENAIR_TARGETS)/ARCH/COMMON -I$(OPENAIR_TARGETS)/ARCH/IRIS/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/COMMON
|
||||||
|
|
||||||
@@ -0,0 +1,852 @@
|
|||||||
|
|
||||||
|
/** iris_lib.cpp
|
||||||
|
*
|
||||||
|
* \authors: Rahman Doost-Mohammady : doost@rice.edu
|
||||||
|
* Clay Shepard : cws@rice.edu
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <SoapySDR/Device.hpp>
|
||||||
|
#include <SoapySDR/Formats.hpp>
|
||||||
|
#include <SoapySDR/Time.hpp>
|
||||||
|
//#include <boost/format.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
#include <complex>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cmath>
|
||||||
|
#include <time.h>
|
||||||
|
#include <limits>
|
||||||
|
#include "common/utils/LOG/log_extern.h"
|
||||||
|
#include "common_lib.h"
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
#ifdef __SSE4_1__
|
||||||
|
# include <smmintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __AVX2__
|
||||||
|
# include <immintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MOVE_DC
|
||||||
|
#define SAMPLE_RATE_DOWN 1
|
||||||
|
|
||||||
|
/*! \brief Iris Configuration */
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
// --------------------------------
|
||||||
|
// variables for Iris configuration
|
||||||
|
// --------------------------------
|
||||||
|
//! Iris device pointer
|
||||||
|
std::vector<SoapySDR::Device *> iris;
|
||||||
|
int device_num;
|
||||||
|
int rx_num_channels;
|
||||||
|
int tx_num_channels;
|
||||||
|
//create a send streamer and a receive streamer
|
||||||
|
//! Iris TX Stream
|
||||||
|
std::vector<SoapySDR::Stream *> txStream;
|
||||||
|
//! Iris RX Stream
|
||||||
|
std::vector<SoapySDR::Stream *> rxStream;
|
||||||
|
|
||||||
|
//! Sampling rate
|
||||||
|
double sample_rate;
|
||||||
|
|
||||||
|
//! time offset between transmiter timestamp and receiver timestamp;
|
||||||
|
double tdiff;
|
||||||
|
|
||||||
|
//! TX forward samples.
|
||||||
|
int tx_forward_nsamps; //166 for 20Mhz
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------
|
||||||
|
// Debug and output control
|
||||||
|
// --------------------------------
|
||||||
|
//! Number of underflows
|
||||||
|
int num_underflows;
|
||||||
|
//! Number of overflows
|
||||||
|
int num_overflows;
|
||||||
|
|
||||||
|
//! Number of sequential errors
|
||||||
|
int num_seq_errors;
|
||||||
|
//! tx count
|
||||||
|
int64_t tx_count;
|
||||||
|
//! rx count
|
||||||
|
int64_t rx_count;
|
||||||
|
//! timestamp of RX packet
|
||||||
|
openair0_timestamp rx_timestamp;
|
||||||
|
|
||||||
|
} iris_state_t;
|
||||||
|
|
||||||
|
/*! \brief Called to start the Iris lime transceiver. Return 0 if OK, < 0 if error
|
||||||
|
@param device pointer to the device structure specific to the RF hardware target
|
||||||
|
*/
|
||||||
|
static int trx_iris_start(openair0_device *device) {
|
||||||
|
iris_state_t *s = (iris_state_t *) device->priv;
|
||||||
|
|
||||||
|
long long timeNs = s->iris[0]->getHardwareTime("") + 500000;
|
||||||
|
int flags = 0;
|
||||||
|
//flags |= SOAPY_SDR_HAS_TIME;
|
||||||
|
int r;
|
||||||
|
for (r = 0; r < s->device_num; r++) {
|
||||||
|
int ret = s->iris[r]->activateStream(s->rxStream[r], flags, timeNs, 0);
|
||||||
|
int ret2 = s->iris[r]->activateStream(s->txStream[r]);
|
||||||
|
if (ret < 0 | ret2 < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief Stop Iris
|
||||||
|
* \param card refers to the hardware index to use
|
||||||
|
*/
|
||||||
|
int trx_iris_stop(openair0_device *device) {
|
||||||
|
iris_state_t *s = (iris_state_t *) device->priv;
|
||||||
|
int r;
|
||||||
|
for (r = 0; r < s->device_num; r++) {
|
||||||
|
s->iris[r]->deactivateStream(s->txStream[r]);
|
||||||
|
s->iris[r]->deactivateStream(s->rxStream[r]);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief Terminate operation of the Iris lime transceiver -- free all associated resources
|
||||||
|
* \param device the hardware to use
|
||||||
|
*/
|
||||||
|
static void trx_iris_end(openair0_device *device) {
|
||||||
|
LOG_I(HW, "Closing Iris device.\n");
|
||||||
|
trx_iris_stop(device);
|
||||||
|
iris_state_t *s = (iris_state_t *) device->priv;
|
||||||
|
int r;
|
||||||
|
for (r = 0; r < s->device_num; r++) {
|
||||||
|
s->iris[r]->closeStream(s->txStream[r]);
|
||||||
|
s->iris[r]->closeStream(s->rxStream[r]);
|
||||||
|
SoapySDR::Device::unmake(s->iris[r]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief Called to send samples to the Iris RF target
|
||||||
|
@param device pointer to the device structure specific to the RF hardware target
|
||||||
|
@param timestamp The timestamp at whicch the first sample MUST be sent
|
||||||
|
@param buff Buffer which holds the samples
|
||||||
|
@param nsamps number of samples to be sent
|
||||||
|
@param antenna_id index of the antenna if the device has multiple anteannas
|
||||||
|
@param flags flags must be set to TRUE if timestamp parameter needs to be applied
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
trx_iris_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
|
||||||
|
using namespace std::chrono;
|
||||||
|
static long long int loop = 0;
|
||||||
|
static long time_min = 0, time_max = 0, time_avg = 0;
|
||||||
|
struct timespec tp_start, tp_end;
|
||||||
|
long time_diff;
|
||||||
|
|
||||||
|
int ret = 0, ret_i = 0;
|
||||||
|
int flag = 0;
|
||||||
|
|
||||||
|
iris_state_t *s = (iris_state_t *) device->priv;
|
||||||
|
int nsamps2; // aligned to upper 32 or 16 byte boundary
|
||||||
|
#if defined(__x86_64) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
nsamps2 = (nsamps+7)>>3;
|
||||||
|
__m256i buff_tx[2][nsamps2];
|
||||||
|
#else
|
||||||
|
nsamps2 = (nsamps+3)>>2;
|
||||||
|
__m128i buff_tx[2][nsamps2];
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// bring RX data into 12 LSBs for softmodem RX
|
||||||
|
for (int i=0; i<cc; i++) {
|
||||||
|
for (int j=0; j<nsamps2; j++) {
|
||||||
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
buff_tx[i][j] = _mm256_slli_epi16(((__m256i *)buff[i])[j],4);
|
||||||
|
#else
|
||||||
|
buff_tx[i][j] = _mm_slli_epi16(((__m128i *)buff[i])[j],4);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clock_gettime(CLOCK_MONOTONIC_RAW, &tp_start);
|
||||||
|
|
||||||
|
// This hack was added by cws to help keep packets flowing
|
||||||
|
|
||||||
|
if (flags)
|
||||||
|
flag |= SOAPY_SDR_HAS_TIME;
|
||||||
|
else {
|
||||||
|
long long tempHack = s->iris[0]->getHardwareTime("");
|
||||||
|
return nsamps;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags == 2 || flags == 1) { // start of burst
|
||||||
|
|
||||||
|
} else if (flags == 3 | flags == 4) {
|
||||||
|
flag |= SOAPY_SDR_END_BURST;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
long long timeNs = SoapySDR::ticksToTimeNs(timestamp, s->sample_rate / SAMPLE_RATE_DOWN);
|
||||||
|
uint32_t *samps[2]; //= (uint32_t **)buff;
|
||||||
|
int r;
|
||||||
|
int m = s->tx_num_channels;
|
||||||
|
for (r = 0; r < s->device_num; r++) {
|
||||||
|
int samples_sent = 0;
|
||||||
|
samps[0] = (uint32_t *) buff_tx[m * r];
|
||||||
|
|
||||||
|
if (cc % 2 == 0)
|
||||||
|
samps[1] = (uint32_t *) buff_tx[m * r + 1]; //cws: it seems another thread can clobber these, so we need to save them locally.
|
||||||
|
#ifdef IRIS_DEBUG
|
||||||
|
int i;
|
||||||
|
for (i = 200; i < 216; i++)
|
||||||
|
printf("%d, ",((int16_t)(samps[0][i]>>16))>>4);
|
||||||
|
printf("\n");
|
||||||
|
//printf("\nHardware time before write: %lld, tx_time_stamp: %lld\n", s->iris[0]->getHardwareTime(""), timeNs);
|
||||||
|
#endif
|
||||||
|
ret = s->iris[r]->writeStream(s->txStream[r], (void **) samps, (size_t)(nsamps), flag, timeNs, 1000000);
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
printf("Unable to write stream!\n");
|
||||||
|
else
|
||||||
|
samples_sent = ret;
|
||||||
|
|
||||||
|
|
||||||
|
if (samples_sent != nsamps)
|
||||||
|
printf("[xmit] tx samples %d != %d\n", samples_sent, nsamps);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return nsamps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief Receive samples from hardware.
|
||||||
|
* Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
|
||||||
|
* the first channel. *ptimestamp is the time at which the first sample
|
||||||
|
* was received.
|
||||||
|
* \param device the hardware to use
|
||||||
|
* \param[out] ptimestamp the time at which the first sample was received.
|
||||||
|
* \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps.
|
||||||
|
* \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte.
|
||||||
|
* \param antenna_id Index of antenna for which to receive samples
|
||||||
|
* \returns the number of sample read
|
||||||
|
*/
|
||||||
|
static int trx_iris_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
|
||||||
|
int ret = 0;
|
||||||
|
static long long nextTime;
|
||||||
|
static bool nextTimeValid = false;
|
||||||
|
iris_state_t *s = (iris_state_t *) device->priv;
|
||||||
|
bool time_set = false;
|
||||||
|
long long timeNs = 0;
|
||||||
|
int flags;
|
||||||
|
int samples_received;
|
||||||
|
uint32_t *samps[2]; //= (uint32_t **)buff;
|
||||||
|
|
||||||
|
int r;
|
||||||
|
int m = s->rx_num_channels;
|
||||||
|
int nsamps2; // aligned to upper 32 or 16 byte boundary
|
||||||
|
#if defined(__x86_64) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
nsamps2 = (nsamps+7)>>3;
|
||||||
|
__m256i buff_tmp[2][nsamps2];
|
||||||
|
#else
|
||||||
|
nsamps2 = (nsamps+3)>>2;
|
||||||
|
__m128i buff_tmp[2][nsamps2];
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (r = 0; r < s->device_num; r++) {
|
||||||
|
flags = 0;
|
||||||
|
samples_received = 0;
|
||||||
|
samps[0] = (uint32_t *) buff_tmp[m * r];
|
||||||
|
if (cc % 2 == 0)
|
||||||
|
samps[1] = (uint32_t *) buff_tmp[m * r + 1];
|
||||||
|
|
||||||
|
flags = 0;
|
||||||
|
ret = s->iris[r]->readStream(s->rxStream[r], (void **) samps, (size_t)(nsamps), flags,
|
||||||
|
timeNs, 1000000);
|
||||||
|
if (ret < 0) {
|
||||||
|
if (ret == SOAPY_SDR_TIME_ERROR)
|
||||||
|
printf("[recv] Time Error in tx stream!\n");
|
||||||
|
else if (ret == SOAPY_SDR_OVERFLOW | (flags & SOAPY_SDR_END_ABRUPT))
|
||||||
|
printf("[recv] Overflow occured!\n");
|
||||||
|
else if (ret == SOAPY_SDR_TIMEOUT)
|
||||||
|
printf("[recv] Timeout occured!\n");
|
||||||
|
else if (ret == SOAPY_SDR_STREAM_ERROR)
|
||||||
|
printf("[recv] Stream (tx) error occured!\n");
|
||||||
|
else if (ret == SOAPY_SDR_CORRUPTION)
|
||||||
|
printf("[recv] Bad packet occured!\n");
|
||||||
|
break;
|
||||||
|
} else
|
||||||
|
samples_received = ret;
|
||||||
|
|
||||||
|
|
||||||
|
if (r == 0) {
|
||||||
|
if (samples_received == ret) // first batch
|
||||||
|
{
|
||||||
|
if (flags & SOAPY_SDR_HAS_TIME) {
|
||||||
|
s->rx_timestamp = SoapySDR::timeNsToTicks(timeNs, s->sample_rate / SAMPLE_RATE_DOWN);
|
||||||
|
*ptimestamp = s->rx_timestamp;
|
||||||
|
nextTime = timeNs;
|
||||||
|
nextTimeValid = true;
|
||||||
|
time_set = true;
|
||||||
|
//printf("1) time set %llu \n", *ptimestamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r == 0) {
|
||||||
|
if (samples_received == nsamps) {
|
||||||
|
|
||||||
|
if (flags & SOAPY_SDR_HAS_TIME) {
|
||||||
|
s->rx_timestamp = SoapySDR::timeNsToTicks(nextTime, s->sample_rate / SAMPLE_RATE_DOWN);
|
||||||
|
*ptimestamp = s->rx_timestamp;
|
||||||
|
nextTime = timeNs;
|
||||||
|
nextTimeValid = true;
|
||||||
|
time_set = true;
|
||||||
|
}
|
||||||
|
} else if (samples_received < nsamps)
|
||||||
|
printf("[recv] received %d samples out of %d\n", samples_received, nsamps);
|
||||||
|
|
||||||
|
s->rx_count += samples_received;
|
||||||
|
|
||||||
|
if (s->sample_rate != 0 && nextTimeValid) {
|
||||||
|
if (!time_set) {
|
||||||
|
s->rx_timestamp = SoapySDR::timeNsToTicks(nextTime, s->sample_rate / SAMPLE_RATE_DOWN);
|
||||||
|
*ptimestamp = s->rx_timestamp;
|
||||||
|
//printf("2) time set %llu, nextTime will be %llu \n", *ptimestamp, nextTime);
|
||||||
|
}
|
||||||
|
nextTime += SoapySDR::ticksToTimeNs(samples_received, s->sample_rate / SAMPLE_RATE_DOWN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// bring RX data into 12 LSBs for softmodem RX
|
||||||
|
for (int i=0; i<cc; i++) {
|
||||||
|
for (int j=0; j<nsamps2; j++) {
|
||||||
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
#ifdef __AVX2__
|
||||||
|
((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],4);
|
||||||
|
#else
|
||||||
|
((__m128i *)buff[i])[j] = _mm_srai_epi16(buff_tmp[i][j],4);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return samples_received;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief Get current timestamp of Iris
|
||||||
|
* \param device the hardware to use
|
||||||
|
*/
|
||||||
|
openair0_timestamp get_iris_time(openair0_device *device) {
|
||||||
|
iris_state_t *s = (iris_state_t *) device->priv;
|
||||||
|
return SoapySDR::timeNsToTicks(s->iris[0]->getHardwareTime(""), s->sample_rate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief Compares two variables within precision
|
||||||
|
* \param a first variable
|
||||||
|
* \param b second variable
|
||||||
|
*/
|
||||||
|
static bool is_equal(double a, double b) {
|
||||||
|
return std::fabs(a - b) < std::numeric_limits<double>::epsilon();
|
||||||
|
}
|
||||||
|
|
||||||
|
void *set_freq_thread(void *arg) {
|
||||||
|
|
||||||
|
openair0_device *device = (openair0_device *) arg;
|
||||||
|
iris_state_t *s = (iris_state_t *) device->priv;
|
||||||
|
int r, i;
|
||||||
|
printf("Setting Iris TX Freq %f, RX Freq %f\n", device->openair0_cfg[0].tx_freq[0],
|
||||||
|
device->openair0_cfg[0].rx_freq[0]);
|
||||||
|
// add check for the number of channels in the cfg
|
||||||
|
for (r = 0; r < s->device_num; r++) {
|
||||||
|
for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_RX); i++) {
|
||||||
|
if (i < s->rx_num_channels)
|
||||||
|
s->iris[r]->setFrequency(SOAPY_SDR_RX, i, "RF", device->openair0_cfg[0].rx_freq[i]);
|
||||||
|
}
|
||||||
|
for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_TX); i++) {
|
||||||
|
if (i < s->tx_num_channels)
|
||||||
|
s->iris[r]->setFrequency(SOAPY_SDR_TX, i, "RF", device->openair0_cfg[0].tx_freq[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief Set frequencies (TX/RX)
|
||||||
|
* \param device the hardware to use
|
||||||
|
* \param openair0_cfg RF frontend parameters set by application
|
||||||
|
* \param dummy dummy variable not used
|
||||||
|
* \returns 0 in success
|
||||||
|
*/
|
||||||
|
int trx_iris_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dont_block) {
|
||||||
|
iris_state_t *s = (iris_state_t *) device->priv;
|
||||||
|
pthread_t f_thread;
|
||||||
|
if (dont_block)
|
||||||
|
pthread_create(&f_thread, NULL, set_freq_thread, (void *) device);
|
||||||
|
else {
|
||||||
|
int r, i;
|
||||||
|
for (r = 0; r < s->device_num; r++) {
|
||||||
|
printf("Setting Iris TX Freq %f, RX Freq %f\n", openair0_cfg[0].tx_freq[0], openair0_cfg[0].rx_freq[0]);
|
||||||
|
for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_RX); i++) {
|
||||||
|
if (i < s->rx_num_channels) {
|
||||||
|
s->iris[r]->setFrequency(SOAPY_SDR_RX, i, "RF", openair0_cfg[0].rx_freq[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_TX); i++) {
|
||||||
|
if (i < s->tx_num_channels) {
|
||||||
|
s->iris[r]->setFrequency(SOAPY_SDR_TX, i, "RF", openair0_cfg[0].tx_freq[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Set Gains (TX/RX)
|
||||||
|
* \param device the hardware to use
|
||||||
|
* \param openair0_cfg RF frontend parameters set by application
|
||||||
|
* \returns 0 in success
|
||||||
|
*/
|
||||||
|
int trx_iris_set_gains(openair0_device *device,
|
||||||
|
openair0_config_t *openair0_cfg) {
|
||||||
|
iris_state_t *s = (iris_state_t *) device->priv;
|
||||||
|
int r;
|
||||||
|
for (r = 0; r < s->device_num; r++) {
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, 0, openair0_cfg[0].rx_gain[0]);
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_TX, 0, openair0_cfg[0].tx_gain[0]);
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, 1, openair0_cfg[0].rx_gain[1]);
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_TX, 1, openair0_cfg[0].tx_gain[1]);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief Iris RX calibration table */
|
||||||
|
rx_gain_calib_table_t calib_table_iris[] = {
|
||||||
|
{3500000000.0, 83},
|
||||||
|
{2660000000.0, 83},
|
||||||
|
{2580000000.0, 83},
|
||||||
|
{2300000000.0, 83},
|
||||||
|
{1880000000.0, 83},
|
||||||
|
{816000000.0, 83},
|
||||||
|
{-1, 0}};
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief Set RX gain offset
|
||||||
|
* \param openair0_cfg RF frontend parameters set by application
|
||||||
|
* \param chain_index RF chain to apply settings to
|
||||||
|
* \returns 0 in success
|
||||||
|
*/
|
||||||
|
void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index, int bw_gain_adjust) {
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
// loop through calibration table to find best adjustment factor for RX frequency
|
||||||
|
double min_diff = 6e9, diff, gain_adj = 0.0;
|
||||||
|
if (bw_gain_adjust == 1) {
|
||||||
|
switch ((int) openair0_cfg[0].sample_rate) {
|
||||||
|
case 30720000:
|
||||||
|
break;
|
||||||
|
case 23040000:
|
||||||
|
gain_adj = 1.25;
|
||||||
|
break;
|
||||||
|
case 15360000:
|
||||||
|
gain_adj = 3.0;
|
||||||
|
break;
|
||||||
|
case 7680000:
|
||||||
|
gain_adj = 6.0;
|
||||||
|
break;
|
||||||
|
case 3840000:
|
||||||
|
gain_adj = 9.0;
|
||||||
|
break;
|
||||||
|
case 1920000:
|
||||||
|
gain_adj = 12.0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("unknown sampling rate %d\n", (int) openair0_cfg[0].sample_rate);
|
||||||
|
exit(-1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (openair0_cfg->rx_gain_calib_table[i].freq > 0) {
|
||||||
|
diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq);
|
||||||
|
printf("cal %d: freq %f, offset %f, diff %f\n",
|
||||||
|
i,
|
||||||
|
openair0_cfg->rx_gain_calib_table[i].freq,
|
||||||
|
openair0_cfg->rx_gain_calib_table[i].offset, diff);
|
||||||
|
if (min_diff > diff) {
|
||||||
|
min_diff = diff;
|
||||||
|
openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset + gain_adj;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief print the Iris statistics
|
||||||
|
* \param device the hardware to use
|
||||||
|
* \returns 0 on success
|
||||||
|
*/
|
||||||
|
int trx_iris_get_stats(openair0_device *device) {
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief Reset the Iris statistics
|
||||||
|
* \param device the hardware to use
|
||||||
|
* \returns 0 on success
|
||||||
|
*/
|
||||||
|
int trx_iris_reset_stats(openair0_device *device) {
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
/*! \brief Initialize Openair Iris target. It returns 0 if OK
|
||||||
|
* \param device the hardware to use
|
||||||
|
* \param openair0_cfg RF frontend parameters set by application
|
||||||
|
*/
|
||||||
|
int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
|
||||||
|
|
||||||
|
size_t i, r, card;
|
||||||
|
int bw_gain_adjust = 0;
|
||||||
|
openair0_cfg[0].rx_gain_calib_table = calib_table_iris;
|
||||||
|
iris_state_t *s = (iris_state_t *) malloc(sizeof(iris_state_t));
|
||||||
|
memset(s, 0, sizeof(iris_state_t));
|
||||||
|
|
||||||
|
std::string devFE("DEV");
|
||||||
|
std::string cbrsFE("CBRS");
|
||||||
|
std::string wireFormat("WIRE");
|
||||||
|
|
||||||
|
// Initialize Iris device
|
||||||
|
device->openair0_cfg = openair0_cfg;
|
||||||
|
SoapySDR::Kwargs args;
|
||||||
|
args["driver"] = "iris";
|
||||||
|
char *iris_addrs = device->openair0_cfg[0].sdr_addrs;
|
||||||
|
if (iris_addrs == NULL)
|
||||||
|
{
|
||||||
|
s->iris.push_back(SoapySDR::Device::make(args));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *serial = strtok(iris_addrs, ",");
|
||||||
|
while (serial != NULL) {
|
||||||
|
LOG_I(HW, "Attempting to open Iris device %s\n", serial);
|
||||||
|
args["serial"] = serial;
|
||||||
|
s->iris.push_back(SoapySDR::Device::make(args));
|
||||||
|
serial = strtok(NULL, ",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s->device_num = s->iris.size();
|
||||||
|
device->type = IRIS_DEV;
|
||||||
|
|
||||||
|
|
||||||
|
switch ((int) openair0_cfg[0].sample_rate) {
|
||||||
|
case 30720000:
|
||||||
|
//openair0_cfg[0].samples_per_packet = 1024;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 115;
|
||||||
|
openair0_cfg[0].tx_bw = 20e6;
|
||||||
|
openair0_cfg[0].rx_bw = 20e6;
|
||||||
|
break;
|
||||||
|
case 23040000:
|
||||||
|
//openair0_cfg[0].samples_per_packet = 1024;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 113;
|
||||||
|
openair0_cfg[0].tx_bw = 15e6;
|
||||||
|
openair0_cfg[0].rx_bw = 15e6;
|
||||||
|
break;
|
||||||
|
case 15360000:
|
||||||
|
//openair0_cfg[0].samples_per_packet = 1024;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 60;
|
||||||
|
openair0_cfg[0].tx_bw = 10e6;
|
||||||
|
openair0_cfg[0].rx_bw = 10e6;
|
||||||
|
break;
|
||||||
|
case 7680000:
|
||||||
|
//openair0_cfg[0].samples_per_packet = 1024;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 30;
|
||||||
|
openair0_cfg[0].tx_bw = 5e6;
|
||||||
|
openair0_cfg[0].rx_bw = 5e6;
|
||||||
|
break;
|
||||||
|
case 1920000:
|
||||||
|
//openair0_cfg[0].samples_per_packet = 1024;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 20;
|
||||||
|
openair0_cfg[0].tx_bw = 1.4e6;
|
||||||
|
openair0_cfg[0].rx_bw = 1.4e6;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("Error: unknown sampling rate %f\n", openair0_cfg[0].sample_rate);
|
||||||
|
exit(-1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("tx_sample_advance %d\n", openair0_cfg[0].tx_sample_advance);
|
||||||
|
s->rx_num_channels = openair0_cfg[0].rx_num_channels;
|
||||||
|
s->tx_num_channels = openair0_cfg[0].tx_num_channels;
|
||||||
|
if ((s->rx_num_channels == 1 || s->rx_num_channels == 2) && (s->tx_num_channels == 1 || s->tx_num_channels == 2))
|
||||||
|
printf("Enabling %d rx and %d tx channel(s) on each device...\n", s->rx_num_channels, s->tx_num_channels);
|
||||||
|
else {
|
||||||
|
printf("Invalid rx or tx number of channels (%d, %d)\n", s->rx_num_channels, s->tx_num_channels);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (r = 0; r < s->device_num; r++) {
|
||||||
|
//this is unnecessary -- it will set the correct master clock based on sample rate
|
||||||
|
/*switch ((int) openair0_cfg[0].sample_rate) {
|
||||||
|
case 1920000:
|
||||||
|
s->iris[r]->setMasterClockRate(256 * openair0_cfg[0].sample_rate);
|
||||||
|
break;
|
||||||
|
case 3840000:
|
||||||
|
s->iris[r]->setMasterClockRate(128 * openair0_cfg[0].sample_rate);
|
||||||
|
break;
|
||||||
|
case 7680000:
|
||||||
|
s->iris[r]->setMasterClockRate(64 * openair0_cfg[0].sample_rate);
|
||||||
|
break;
|
||||||
|
case 15360000:
|
||||||
|
s->iris[r]->setMasterClockRate(32 * openair0_cfg[0].sample_rate);
|
||||||
|
break;
|
||||||
|
case 30720000:
|
||||||
|
s->iris[r]->setMasterClockRate(16 * openair0_cfg[0].sample_rate);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("Error: unknown sampling rate %f\n", openair0_cfg[0].sample_rate);
|
||||||
|
exit(-1);
|
||||||
|
break;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_RX); i++) {
|
||||||
|
if (i < s->rx_num_channels) {
|
||||||
|
s->iris[r]->setSampleRate(SOAPY_SDR_RX, i, openair0_cfg[0].sample_rate / SAMPLE_RATE_DOWN);
|
||||||
|
#ifdef MOVE_DC
|
||||||
|
printf("Moving DC out of main carrier for rx...\n");
|
||||||
|
s->iris[r]->setFrequency(SOAPY_SDR_RX, i, "RF", openair0_cfg[0].rx_freq[i]-.75*openair0_cfg[0].sample_rate);
|
||||||
|
s->iris[r]->setFrequency(SOAPY_SDR_RX, i, "BB", .75*openair0_cfg[0].sample_rate);
|
||||||
|
#else
|
||||||
|
s->iris[r]->setFrequency(SOAPY_SDR_RX, i, "RF", openair0_cfg[0].rx_freq[i]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
set_rx_gain_offset(&openair0_cfg[0], i, bw_gain_adjust);
|
||||||
|
//s->iris[r]->setGain(SOAPY_SDR_RX, i, openair0_cfg[0].rx_gain[i] - openair0_cfg[0].rx_gain_offset[i]);
|
||||||
|
printf("rx gain offset: %f, rx_gain: %f, tx_tgain: %f\n", openair0_cfg[0].rx_gain_offset[i], openair0_cfg[0].rx_gain[i], openair0_cfg[0].tx_gain[i]);
|
||||||
|
if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) != 0) {
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, i, "LNA", openair0_cfg[0].rx_gain[i] - openair0_cfg[0].rx_gain_offset[i]);
|
||||||
|
//s->iris[r]->setGain(SOAPY_SDR_RX, i, "LNA", 0);
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, i, "LNA1", 30);
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, i, "LNA2", 17);
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, i, "TIA", 7);
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, i, "PGA", 18);
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, i, "ATTN", 0);
|
||||||
|
} else {
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, i, "LNA", openair0_cfg[0].rx_gain[i] - openair0_cfg[0].rx_gain_offset[i]); // [0,30]
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, i, "TIA", 7); // [0,12,6]
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_RX, i, "PGA", 18); // [-12,19,1]
|
||||||
|
//s->iris[r]->setGain(SOAPY_SDR_RX, i, 50); // [-12,19,1]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
s->iris[r]->setDCOffsetMode(SOAPY_SDR_RX, i, true); // move somewhere else
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_TX); i++) {
|
||||||
|
if (i < s->tx_num_channels) {
|
||||||
|
s->iris[r]->setSampleRate(SOAPY_SDR_TX, i, openair0_cfg[0].sample_rate / SAMPLE_RATE_DOWN);
|
||||||
|
#ifdef MOVE_DC
|
||||||
|
printf("Moving DC out of main carrier for tx...\n");
|
||||||
|
s->iris[r]->setFrequency(SOAPY_SDR_TX, i, "RF", openair0_cfg[0].tx_freq[i]-.75*openair0_cfg[0].sample_rate);
|
||||||
|
s->iris[r]->setFrequency(SOAPY_SDR_TX, i, "BB", .75*openair0_cfg[0].sample_rate);
|
||||||
|
#else
|
||||||
|
s->iris[r]->setFrequency(SOAPY_SDR_TX, i, "RF", openair0_cfg[0].tx_freq[i]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) == 0) {
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", openair0_cfg[0].tx_gain[i]);
|
||||||
|
//s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", 50);
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_TX, i, "IAMP", 12);
|
||||||
|
//s->iris[r]->writeSetting("TX_ENABLE_DELAY", "0");
|
||||||
|
//s->iris[r]->writeSetting("TX_DISABLE_DELAY", "100");
|
||||||
|
} else {
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", openair0_cfg[0].tx_gain[i]);
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_TX, i, "ATTN", 0); // [-18, 0, 6] dB
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_TX, i, "IAMP", 6); // [-12, 12, 1] dB
|
||||||
|
//s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", 44); //openair0_cfg[0].tx_gain[i]);
|
||||||
|
//s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", 35); // [0, 52, 1] dB
|
||||||
|
//s->iris[r]->setGain(SOAPY_SDR_TX, i, "PA1", 17); // 17 ??? dB
|
||||||
|
s->iris[r]->setGain(SOAPY_SDR_TX, i, "PA2", 0); // [0, 17, 17] dB
|
||||||
|
//s->iris[r]->setGain(SOAPY_SDR_TX, i, "PA3", 20); // 33 ??? dB
|
||||||
|
s->iris[r]->writeSetting("TX_ENABLE_DELAY", "0");
|
||||||
|
s->iris[r]->writeSetting("TX_DISABLE_DELAY", "100");
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (openair0_cfg[0].duplex_mode == 0) {
|
||||||
|
// printf("\nFDD: Enable TX antenna override\n");
|
||||||
|
// s->iris[r]->writeSetting(SOAPY_SDR_TX, i, "TX_ENB_OVERRIDE",
|
||||||
|
// "true"); // From Josh: forces tx switching to be on always transmit regardless of bursts
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
printf("Actual master clock: %fMHz...\n", (s->iris[r]->getMasterClockRate() / 1e6));
|
||||||
|
|
||||||
|
int tx_filt_bw = openair0_cfg[0].tx_bw;
|
||||||
|
int rx_filt_bw = openair0_cfg[0].rx_bw;
|
||||||
|
#ifdef MOVE_DC //the filter is centered around the carrier, so we have to expand it if we have moved the DC tone.
|
||||||
|
tx_filt_bw *= 3;
|
||||||
|
rx_filt_bw *= 3;
|
||||||
|
#endif
|
||||||
|
/* Setting TX/RX BW */
|
||||||
|
for (i = 0; i < s->tx_num_channels; i++) {
|
||||||
|
if (i < s->iris[r]->getNumChannels(SOAPY_SDR_TX)) {
|
||||||
|
s->iris[r]->setBandwidth(SOAPY_SDR_TX, i, tx_filt_bw);
|
||||||
|
printf("Setting tx bandwidth on channel %lu/%lu: BW %f (readback %f)\n", i,
|
||||||
|
s->iris[r]->getNumChannels(SOAPY_SDR_TX), tx_filt_bw / 1e6,
|
||||||
|
s->iris[r]->getBandwidth(SOAPY_SDR_TX, i) / 1e6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0; i < s->rx_num_channels; i++) {
|
||||||
|
if (i < s->iris[r]->getNumChannels(SOAPY_SDR_RX)) {
|
||||||
|
s->iris[r]->setBandwidth(SOAPY_SDR_RX, i, rx_filt_bw);
|
||||||
|
printf("Setting rx bandwidth on channel %lu/%lu : BW %f (readback %f)\n", i,
|
||||||
|
s->iris[r]->getNumChannels(SOAPY_SDR_RX), rx_filt_bw / 1e6,
|
||||||
|
s->iris[r]->getBandwidth(SOAPY_SDR_RX, i) / 1e6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_TX); i++) {
|
||||||
|
if (i < s->tx_num_channels) {
|
||||||
|
printf("\nUsing SKLK calibration...\n");
|
||||||
|
s->iris[r]->writeSetting(SOAPY_SDR_TX, i, "CALIBRATE", "SKLK");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_RX); i++) {
|
||||||
|
if (i < s->rx_num_channels) {
|
||||||
|
printf("\nUsing SKLK calibration...\n");
|
||||||
|
s->iris[r]->writeSetting(SOAPY_SDR_RX, i, "CALIBRATE", "SKLK");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) == 0) {
|
||||||
|
for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_RX); i++) {
|
||||||
|
if (openair0_cfg[0].duplex_mode == 0) {
|
||||||
|
printf("\nFDD: Setting receive antenna to %s\n", s->iris[r]->listAntennas(SOAPY_SDR_RX, i)[1].c_str());
|
||||||
|
if (i < s->rx_num_channels)
|
||||||
|
s->iris[r]->setAntenna(SOAPY_SDR_RX, i, "RX");
|
||||||
|
} else {
|
||||||
|
printf("\nTDD: Setting receive antenna to %s\n", s->iris[r]->listAntennas(SOAPY_SDR_RX, i)[0].c_str());
|
||||||
|
if (i < s->rx_num_channels)
|
||||||
|
s->iris[r]->setAntenna(SOAPY_SDR_RX, i, "TRX");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//s->iris[r]->writeSetting("TX_SW_DELAY", std::to_string(
|
||||||
|
// -openair0_cfg[0].tx_sample_advance)); //should offset switching to compensate for RF path (Lime) delay -- this will eventually be automated
|
||||||
|
|
||||||
|
// create tx & rx streamer
|
||||||
|
//const SoapySDR::Kwargs &arg = SoapySDR::Kwargs();
|
||||||
|
std::map <std::string, std::string> rxStreamArgs;
|
||||||
|
rxStreamArgs["WIRE"] = SOAPY_SDR_CS16;
|
||||||
|
|
||||||
|
std::vector <size_t> channels;
|
||||||
|
for (i = 0; i < s->rx_num_channels; i++)
|
||||||
|
if (i < s->iris[r]->getNumChannels(SOAPY_SDR_RX))
|
||||||
|
channels.push_back(i);
|
||||||
|
s->rxStream.push_back(s->iris[r]->setupStream(SOAPY_SDR_RX, SOAPY_SDR_CS16, channels));//, rxStreamArgs));
|
||||||
|
|
||||||
|
std::vector <size_t> tx_channels = {};
|
||||||
|
for (i = 0; i < s->tx_num_channels; i++)
|
||||||
|
if (i < s->iris[r]->getNumChannels(SOAPY_SDR_TX))
|
||||||
|
tx_channels.push_back(i);
|
||||||
|
s->txStream.push_back(s->iris[r]->setupStream(SOAPY_SDR_TX, SOAPY_SDR_CS16, tx_channels)); //, arg));
|
||||||
|
//s->iris[r]->setHardwareTime(0, "");
|
||||||
|
|
||||||
|
std::cout << "Front end detected: " << s->iris[r]->getHardwareInfo()["frontend"] << "\n";
|
||||||
|
for (i = 0; i < s->rx_num_channels; i++) {
|
||||||
|
if (i < s->iris[r]->getNumChannels(SOAPY_SDR_RX)) {
|
||||||
|
printf("RX Channel %lu\n", i);
|
||||||
|
printf("Actual RX sample rate: %fMSps...\n", (s->iris[r]->getSampleRate(SOAPY_SDR_RX, i) / 1e6));
|
||||||
|
printf("Actual RX frequency: %fGHz...\n", (s->iris[r]->getFrequency(SOAPY_SDR_RX, i) / 1e9));
|
||||||
|
printf("Actual RX gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_RX, i)));
|
||||||
|
printf("Actual RX LNA gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_RX, i, "LNA")));
|
||||||
|
printf("Actual RX PGA gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_RX, i, "PGA")));
|
||||||
|
printf("Actual RX TIA gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_RX, i, "TIA")));
|
||||||
|
if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) != 0) {
|
||||||
|
printf("Actual RX LNA1 gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_RX, i, "LNA1")));
|
||||||
|
printf("Actual RX LNA2 gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_RX, i, "LNA2")));
|
||||||
|
}
|
||||||
|
printf("Actual RX bandwidth: %fM...\n", (s->iris[r]->getBandwidth(SOAPY_SDR_RX, i) / 1e6));
|
||||||
|
printf("Actual RX antenna: %s...\n", (s->iris[r]->getAntenna(SOAPY_SDR_RX, i).c_str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < s->tx_num_channels; i++) {
|
||||||
|
if (i < s->iris[r]->getNumChannels(SOAPY_SDR_TX)) {
|
||||||
|
printf("TX Channel %lu\n", i);
|
||||||
|
printf("Actual TX sample rate: %fMSps...\n", (s->iris[r]->getSampleRate(SOAPY_SDR_TX, i) / 1e6));
|
||||||
|
printf("Actual TX frequency: %fGHz...\n", (s->iris[r]->getFrequency(SOAPY_SDR_TX, i) / 1e9));
|
||||||
|
printf("Actual TX gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_TX, i)));
|
||||||
|
printf("Actual TX PAD gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_TX, i, "PAD")));
|
||||||
|
printf("Actual TX IAMP gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_TX, i, "IAMP")));
|
||||||
|
if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) != 0) {
|
||||||
|
printf("Actual TX PA1 gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_TX, i, "PA1")));
|
||||||
|
printf("Actual TX PA2 gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_TX, i, "PA2")));
|
||||||
|
printf("Actual TX PA3 gain: %f...\n", (s->iris[r]->getGain(SOAPY_SDR_TX, i, "PA3")));
|
||||||
|
}
|
||||||
|
printf("Actual TX bandwidth: %fM...\n", (s->iris[r]->getBandwidth(SOAPY_SDR_TX, i) / 1e6));
|
||||||
|
printf("Actual TX antenna: %s...\n", (s->iris[r]->getAntenna(SOAPY_SDR_TX, i).c_str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s->iris[0]->writeSetting("SYNC_DELAYS", "");
|
||||||
|
for (r = 0; r < s->device_num; r++)
|
||||||
|
s->iris[r]->setHardwareTime(0, "TRIGGER");
|
||||||
|
s->iris[0]->writeSetting("TRIGGER_GEN", "");
|
||||||
|
for (r = 0; r < s->device_num; r++)
|
||||||
|
printf("Device timestamp: %f...\n", (s->iris[r]->getHardwareTime("TRIGGER") / 1e9));
|
||||||
|
|
||||||
|
device->priv = s;
|
||||||
|
device->trx_start_func = trx_iris_start;
|
||||||
|
device->trx_write_func = trx_iris_write;
|
||||||
|
device->trx_read_func = trx_iris_read;
|
||||||
|
device->trx_get_stats_func = trx_iris_get_stats;
|
||||||
|
device->trx_reset_stats_func = trx_iris_reset_stats;
|
||||||
|
device->trx_end_func = trx_iris_end;
|
||||||
|
device->trx_stop_func = trx_iris_stop;
|
||||||
|
device->trx_set_freq_func = trx_iris_set_freq;
|
||||||
|
device->trx_set_gains_func = trx_iris_set_gains;
|
||||||
|
device->openair0_cfg = openair0_cfg;
|
||||||
|
|
||||||
|
s->sample_rate = openair0_cfg[0].sample_rate;
|
||||||
|
// TODO:
|
||||||
|
// init tx_forward_nsamps based iris_time_offset ex
|
||||||
|
if (is_equal(s->sample_rate, (double) 30.72e6))
|
||||||
|
s->tx_forward_nsamps = 176;
|
||||||
|
if (is_equal(s->sample_rate, (double) 15.36e6))
|
||||||
|
s->tx_forward_nsamps = 90;
|
||||||
|
if (is_equal(s->sample_rate, (double) 7.68e6))
|
||||||
|
s->tx_forward_nsamps = 50;
|
||||||
|
|
||||||
|
LOG_I(HW, "Finished initializing %d Iris device(s).\n", s->device_num);
|
||||||
|
fflush(stdout);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -193,7 +193,7 @@ int trx_lms_start(openair0_device *device){
|
|||||||
LMS_EnableChannel(lms_device,LMS_CH_RX,1,true);
|
LMS_EnableChannel(lms_device,LMS_CH_RX,1,true);
|
||||||
LMS_EnableChannel(lms_device,LMS_CH_TX,1,true);
|
LMS_EnableChannel(lms_device,LMS_CH_TX,1,true);
|
||||||
} */
|
} */
|
||||||
LMS_VCTCXOWrite(lms_device,129);
|
LMS_VCTCXOWrite(lms_device,129, true);
|
||||||
|
|
||||||
if (LMS_SetSampleRate(lms_device,device->openair0_cfg->sample_rate,2)!=0)
|
if (LMS_SetSampleRate(lms_device,device->openair0_cfg->sample_rate,2)!=0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,264 @@
|
|||||||
|
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_ENB";
|
||||||
|
|
||||||
|
eNB_name = "eNB_Eurecom_LTEBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } );
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "eNodeB_3GPP";
|
||||||
|
node_timing = "synch_to_ext_device";
|
||||||
|
node_synch_ref = 0;
|
||||||
|
frame_type = "TDD";
|
||||||
|
tdd_config = 3;
|
||||||
|
tdd_config_s = 0;
|
||||||
|
prefix_type = "NORMAL";
|
||||||
|
eutra_band = 38;
|
||||||
|
downlink_frequency = 2580000000L;
|
||||||
|
uplink_frequency_offset = 0;
|
||||||
|
Nid_cell = 10;
|
||||||
|
N_RB_DL = 25;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 52; # [~50 for DEV-FE, ~30 for CBRS-FE]
|
||||||
|
rx_gain = 115; # [115 for DEV-FE, 90 for CBRS-FE]
|
||||||
|
pbch_repetition = "FALSE";
|
||||||
|
prach_root = 0;
|
||||||
|
prach_config_index = 0;
|
||||||
|
prach_high_speed = "DISABLE";
|
||||||
|
prach_zero_correlation = 1;
|
||||||
|
prach_freq_offset = 2;
|
||||||
|
pucch_delta_shift = 1;
|
||||||
|
pucch_nRB_CQI = 1;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 32;
|
||||||
|
pdsch_referenceSignalPower = -30;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnabled = "ENABLE";
|
||||||
|
pusch_groupAssignment = 0;
|
||||||
|
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||||
|
pusch_nDMRS1 = 1;
|
||||||
|
phich_duration = "NORMAL";
|
||||||
|
phich_resource = "ONESIXTH";
|
||||||
|
srs_enable = "DISABLE";
|
||||||
|
/* srs_BandwidthConfig =;
|
||||||
|
srs_SubframeConfig =;
|
||||||
|
srs_ackNackST =;
|
||||||
|
srs_MaxUpPts =;*/
|
||||||
|
|
||||||
|
pusch_p0_Nominal = -70;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -96;
|
||||||
|
msg3_delta_Preamble = 6;
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
|
||||||
|
rach_numberOfRA_Preambles = 64;
|
||||||
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
|
/*
|
||||||
|
rach_sizeOfRA_PreamblesGroupA = ;
|
||||||
|
rach_messageSizeGroupA = ;
|
||||||
|
rach_messagePowerOffsetGroupB = ;
|
||||||
|
*/
|
||||||
|
rach_powerRampingStep = 4;
|
||||||
|
rach_preambleInitialReceivedTargetPower = -96;
|
||||||
|
rach_preambleTransMax = 10;
|
||||||
|
rach_raResponseWindowSize = 10;
|
||||||
|
rach_macContentionResolutionTimer = 48;
|
||||||
|
rach_maxHARQ_Msg3Tx = 4;
|
||||||
|
|
||||||
|
pcch_default_PagingCycle = 128;
|
||||||
|
pcch_nB = "oneT";
|
||||||
|
bcch_modificationPeriodCoeff = 2;
|
||||||
|
ue_TimersAndConstants_t300 = 1000;
|
||||||
|
ue_TimersAndConstants_t301 = 1000;
|
||||||
|
ue_TimersAndConstants_t310 = 1000;
|
||||||
|
ue_TimersAndConstants_t311 = 10000;
|
||||||
|
ue_TimersAndConstants_n310 = 20;
|
||||||
|
ue_TimersAndConstants_n311 = 1;
|
||||||
|
ue_TransmissionMode = 1;
|
||||||
|
|
||||||
|
//Parameters for SIB18
|
||||||
|
rxPool_sc_CP_Len = "normal";
|
||||||
|
rxPool_sc_Period = "sf40";
|
||||||
|
rxPool_data_CP_Len = "normal";
|
||||||
|
rxPool_ResourceConfig_prb_Num = 20;
|
||||||
|
rxPool_ResourceConfig_prb_Start = 5;
|
||||||
|
rxPool_ResourceConfig_prb_End = 44;
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
/* rxPool_dataHoppingConfig_hoppingParameter = 0;
|
||||||
|
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
||||||
|
rxPool_dataHoppingConfig_rbOffset = 0;
|
||||||
|
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
||||||
|
*/
|
||||||
|
// Parameters for SIB19
|
||||||
|
discRxPool_cp_Len = "normal"
|
||||||
|
discRxPool_discPeriod = "rf32"
|
||||||
|
discRxPool_numRetx = 1;
|
||||||
|
discRxPool_numRepetition = 2;
|
||||||
|
discRxPool_ResourceConfig_prb_Num = 5;
|
||||||
|
discRxPool_ResourceConfig_prb_Start = 3;
|
||||||
|
discRxPool_ResourceConfig_prb_End = 21;
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
srb1_parameters :
|
||||||
|
{
|
||||||
|
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||||
|
timer_poll_retransmit = 80;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||||
|
timer_reordering = 35;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||||
|
timer_status_prohibit = 0;
|
||||||
|
|
||||||
|
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||||
|
poll_pdu = 4;
|
||||||
|
|
||||||
|
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||||
|
poll_byte = 99999;
|
||||||
|
|
||||||
|
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||||
|
max_retx_threshold = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "127.0.0.20";
|
||||||
|
ipv6 = "fe80::d65d:dfff:fe1d:f4d4";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eno1";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.10/8";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "enp5s0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.10/8";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
|
||||||
|
ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.10/8";
|
||||||
|
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
phy_test_mode = 0;
|
||||||
|
puSch10xSnr = 200;
|
||||||
|
puCch10xSnr = 200;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 1
|
||||||
|
nb_rx = 1
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 125;
|
||||||
|
eNB_instances = [0];
|
||||||
|
#sdr_addrs = "RF3C000025";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_CONTROLLER :
|
||||||
|
{
|
||||||
|
FLEXRAN_ENABLED = "no";
|
||||||
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
|
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
||||||
|
FLEXRAN_PORT = 2210;
|
||||||
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
};
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,264 @@
|
|||||||
|
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_ENB";
|
||||||
|
|
||||||
|
eNB_name = "eNB_Eurecom_LTEBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } );
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "eNodeB_3GPP";
|
||||||
|
node_timing = "synch_to_ext_device";
|
||||||
|
node_synch_ref = 0;
|
||||||
|
frame_type = "TDD";
|
||||||
|
tdd_config = 1;
|
||||||
|
tdd_config_s = 0;
|
||||||
|
prefix_type = "NORMAL";
|
||||||
|
eutra_band = 42;
|
||||||
|
downlink_frequency = 3500000000L;
|
||||||
|
uplink_frequency_offset = 0;
|
||||||
|
Nid_cell = 10;
|
||||||
|
N_RB_DL = 25;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 48; # [~50 for DEV-FE, ~30 for CBRS-FE]
|
||||||
|
rx_gain = 80; # [115 for DEV-FE, 90 for CBRS-FE]
|
||||||
|
pbch_repetition = "FALSE";
|
||||||
|
prach_root = 0;
|
||||||
|
prach_config_index = 0;
|
||||||
|
prach_high_speed = "DISABLE";
|
||||||
|
prach_zero_correlation = 1;
|
||||||
|
prach_freq_offset = 2;
|
||||||
|
pucch_delta_shift = 1;
|
||||||
|
pucch_nRB_CQI = 1;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 32;
|
||||||
|
pdsch_referenceSignalPower = -30;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnabled = "ENABLE";
|
||||||
|
pusch_groupAssignment = 0;
|
||||||
|
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||||
|
pusch_nDMRS1 = 1;
|
||||||
|
phich_duration = "NORMAL";
|
||||||
|
phich_resource = "ONESIXTH";
|
||||||
|
srs_enable = "DISABLE";
|
||||||
|
/* srs_BandwidthConfig =;
|
||||||
|
srs_SubframeConfig =;
|
||||||
|
srs_ackNackST =;
|
||||||
|
srs_MaxUpPts =;*/
|
||||||
|
|
||||||
|
pusch_p0_Nominal = -70;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -96;
|
||||||
|
msg3_delta_Preamble = 6;
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
|
||||||
|
rach_numberOfRA_Preambles = 64;
|
||||||
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
|
/*
|
||||||
|
rach_sizeOfRA_PreamblesGroupA = ;
|
||||||
|
rach_messageSizeGroupA = ;
|
||||||
|
rach_messagePowerOffsetGroupB = ;
|
||||||
|
*/
|
||||||
|
rach_powerRampingStep = 4;
|
||||||
|
rach_preambleInitialReceivedTargetPower = -96;
|
||||||
|
rach_preambleTransMax = 10;
|
||||||
|
rach_raResponseWindowSize = 10;
|
||||||
|
rach_macContentionResolutionTimer = 48;
|
||||||
|
rach_maxHARQ_Msg3Tx = 4;
|
||||||
|
|
||||||
|
pcch_default_PagingCycle = 128;
|
||||||
|
pcch_nB = "oneT";
|
||||||
|
bcch_modificationPeriodCoeff = 2;
|
||||||
|
ue_TimersAndConstants_t300 = 1000;
|
||||||
|
ue_TimersAndConstants_t301 = 1000;
|
||||||
|
ue_TimersAndConstants_t310 = 1000;
|
||||||
|
ue_TimersAndConstants_t311 = 10000;
|
||||||
|
ue_TimersAndConstants_n310 = 20;
|
||||||
|
ue_TimersAndConstants_n311 = 1;
|
||||||
|
ue_TransmissionMode = 1;
|
||||||
|
|
||||||
|
//Parameters for SIB18
|
||||||
|
rxPool_sc_CP_Len = "normal";
|
||||||
|
rxPool_sc_Period = "sf40";
|
||||||
|
rxPool_data_CP_Len = "normal";
|
||||||
|
rxPool_ResourceConfig_prb_Num = 20;
|
||||||
|
rxPool_ResourceConfig_prb_Start = 5;
|
||||||
|
rxPool_ResourceConfig_prb_End = 44;
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
/* rxPool_dataHoppingConfig_hoppingParameter = 0;
|
||||||
|
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
||||||
|
rxPool_dataHoppingConfig_rbOffset = 0;
|
||||||
|
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
||||||
|
*/
|
||||||
|
// Parameters for SIB19
|
||||||
|
discRxPool_cp_Len = "normal"
|
||||||
|
discRxPool_discPeriod = "rf32"
|
||||||
|
discRxPool_numRetx = 1;
|
||||||
|
discRxPool_numRepetition = 2;
|
||||||
|
discRxPool_ResourceConfig_prb_Num = 5;
|
||||||
|
discRxPool_ResourceConfig_prb_Start = 3;
|
||||||
|
discRxPool_ResourceConfig_prb_End = 21;
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
srb1_parameters :
|
||||||
|
{
|
||||||
|
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||||
|
timer_poll_retransmit = 80;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||||
|
timer_reordering = 35;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||||
|
timer_status_prohibit = 0;
|
||||||
|
|
||||||
|
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||||
|
poll_pdu = 4;
|
||||||
|
|
||||||
|
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||||
|
poll_byte = 99999;
|
||||||
|
|
||||||
|
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||||
|
max_retx_threshold = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "127.0.0.20";
|
||||||
|
ipv6 = "fe80::d65d:dfff:fe1d:f4d4";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eno1";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.10/8";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "enp5s0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.10/8";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
|
||||||
|
ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.10/8";
|
||||||
|
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
phy_test_mode = 0;
|
||||||
|
puSch10xSnr = 200;
|
||||||
|
puCch10xSnr = 200;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 1;
|
||||||
|
nb_rx = 1;
|
||||||
|
att_tx = 44; #apparently this is being used as tx_gain...
|
||||||
|
att_rx = 0; #apparently max_rxgain - att_rx -83 is what is used for rx_gain (at least for 5 MHz)
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 107;
|
||||||
|
eNB_instances = [0];
|
||||||
|
#sdr_addrs = "RF3E000025";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_CONTROLLER :
|
||||||
|
{
|
||||||
|
FLEXRAN_ENABLED = "no";
|
||||||
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
|
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
||||||
|
FLEXRAN_PORT = 2210;
|
||||||
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
};
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ eNBs =
|
|||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
|
||||||
plmn_list = ( { mcc = 208; mnc = 93; mnc_length = 2; } );
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } );
|
||||||
|
|
||||||
tr_s_preference = "local_mac"
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
@@ -138,7 +138,7 @@ eNBs =
|
|||||||
|
|
||||||
|
|
||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
mme_ip_address = ( { ipv4 = "192.168.12.148";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
@@ -187,7 +187,7 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 116;
|
max_rxgain = 116;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
|
sdr_addrs = "type=x300";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,264 @@
|
|||||||
|
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_ENB";
|
||||||
|
|
||||||
|
eNB_name = "eNB_Eurecom_LTEBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } );
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "eNodeB_3GPP";
|
||||||
|
node_timing = "synch_to_ext_device";
|
||||||
|
node_synch_ref = 0;
|
||||||
|
frame_type = "FDD";
|
||||||
|
tdd_config = 3;
|
||||||
|
tdd_config_s = 0;
|
||||||
|
prefix_type = "NORMAL";
|
||||||
|
eutra_band = 7;
|
||||||
|
downlink_frequency = 2660000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 10;
|
||||||
|
N_RB_DL = 25;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 52; # [~50 for DEV-FE, ~30 for CBRS-FE]
|
||||||
|
rx_gain = 115; # [115 for DEV-FE, 90 for CBRS-FE]
|
||||||
|
pbch_repetition = "FALSE";
|
||||||
|
prach_root = 0;
|
||||||
|
prach_config_index = 0;
|
||||||
|
prach_high_speed = "DISABLE";
|
||||||
|
prach_zero_correlation = 1;
|
||||||
|
prach_freq_offset = 2;
|
||||||
|
pucch_delta_shift = 1;
|
||||||
|
pucch_nRB_CQI = 1;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 32;
|
||||||
|
pdsch_referenceSignalPower = -30;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnabled = "ENABLE";
|
||||||
|
pusch_groupAssignment = 0;
|
||||||
|
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||||
|
pusch_nDMRS1 = 1;
|
||||||
|
phich_duration = "NORMAL";
|
||||||
|
phich_resource = "ONESIXTH";
|
||||||
|
srs_enable = "DISABLE";
|
||||||
|
/* srs_BandwidthConfig =;
|
||||||
|
srs_SubframeConfig =;
|
||||||
|
srs_ackNackST =;
|
||||||
|
srs_MaxUpPts =;*/
|
||||||
|
|
||||||
|
pusch_p0_Nominal = -70;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -96;
|
||||||
|
msg3_delta_Preamble = 6;
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
|
||||||
|
rach_numberOfRA_Preambles = 64;
|
||||||
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
|
/*
|
||||||
|
rach_sizeOfRA_PreamblesGroupA = ;
|
||||||
|
rach_messageSizeGroupA = ;
|
||||||
|
rach_messagePowerOffsetGroupB = ;
|
||||||
|
*/
|
||||||
|
rach_powerRampingStep = 4;
|
||||||
|
rach_preambleInitialReceivedTargetPower = -96;
|
||||||
|
rach_preambleTransMax = 10;
|
||||||
|
rach_raResponseWindowSize = 10;
|
||||||
|
rach_macContentionResolutionTimer = 48;
|
||||||
|
rach_maxHARQ_Msg3Tx = 4;
|
||||||
|
|
||||||
|
pcch_default_PagingCycle = 128;
|
||||||
|
pcch_nB = "oneT";
|
||||||
|
bcch_modificationPeriodCoeff = 2;
|
||||||
|
ue_TimersAndConstants_t300 = 1000;
|
||||||
|
ue_TimersAndConstants_t301 = 1000;
|
||||||
|
ue_TimersAndConstants_t310 = 1000;
|
||||||
|
ue_TimersAndConstants_t311 = 10000;
|
||||||
|
ue_TimersAndConstants_n310 = 20;
|
||||||
|
ue_TimersAndConstants_n311 = 1;
|
||||||
|
ue_TransmissionMode = 1;
|
||||||
|
|
||||||
|
//Parameters for SIB18
|
||||||
|
rxPool_sc_CP_Len = "normal";
|
||||||
|
rxPool_sc_Period = "sf40";
|
||||||
|
rxPool_data_CP_Len = "normal";
|
||||||
|
rxPool_ResourceConfig_prb_Num = 20;
|
||||||
|
rxPool_ResourceConfig_prb_Start = 5;
|
||||||
|
rxPool_ResourceConfig_prb_End = 44;
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
/* rxPool_dataHoppingConfig_hoppingParameter = 0;
|
||||||
|
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
||||||
|
rxPool_dataHoppingConfig_rbOffset = 0;
|
||||||
|
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
||||||
|
*/
|
||||||
|
// Parameters for SIB19
|
||||||
|
discRxPool_cp_Len = "normal"
|
||||||
|
discRxPool_discPeriod = "rf32"
|
||||||
|
discRxPool_numRetx = 1;
|
||||||
|
discRxPool_numRepetition = 2;
|
||||||
|
discRxPool_ResourceConfig_prb_Num = 5;
|
||||||
|
discRxPool_ResourceConfig_prb_Start = 3;
|
||||||
|
discRxPool_ResourceConfig_prb_End = 21;
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
srb1_parameters :
|
||||||
|
{
|
||||||
|
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||||
|
timer_poll_retransmit = 80;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||||
|
timer_reordering = 35;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||||
|
timer_status_prohibit = 0;
|
||||||
|
|
||||||
|
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||||
|
poll_pdu = 4;
|
||||||
|
|
||||||
|
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||||
|
poll_byte = 99999;
|
||||||
|
|
||||||
|
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||||
|
max_retx_threshold = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "127.0.0.20";
|
||||||
|
ipv6 = "fe80::d65d:dfff:fe1d:f4d4";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "lo";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.10/8";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "lo";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.10/8";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
|
||||||
|
ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.10/8";
|
||||||
|
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
phy_test_mode = 0;
|
||||||
|
puSch10xSnr = 200;
|
||||||
|
puCch10xSnr = 200;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 1
|
||||||
|
nb_rx = 1
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 125;
|
||||||
|
eNB_instances = [0];
|
||||||
|
sdr_addrs = "RF3E000028";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_CONTROLLER :
|
||||||
|
{
|
||||||
|
FLEXRAN_ENABLED = "no";
|
||||||
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
|
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
||||||
|
FLEXRAN_PORT = 2210;
|
||||||
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
};
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|
||||||
+179
-163
@@ -143,8 +143,8 @@ extern double cpuf;
|
|||||||
void init_eNB(int,int);
|
void init_eNB(int,int);
|
||||||
void stop_eNB(int nb_inst);
|
void stop_eNB(int nb_inst);
|
||||||
|
|
||||||
int wakeup_tx(PHY_VARS_eNB *eNB,RU_proc_t *ru_proc);
|
int wakeup_tx(PHY_VARS_eNB *eNB);
|
||||||
int wakeup_txfh(eNB_rxtx_proc_t *proc,RU_proc_t *ru_proc);
|
int wakeup_txfh(L1_rxtx_proc_t *proc,PHY_VARS_eNB *eNB);
|
||||||
void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
|
void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
|
void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
|
||||||
@@ -158,8 +158,9 @@ extern void add_subframe(uint16_t *frameP, uint16_t *subframeP, int offset);
|
|||||||
#define TICK_TO_US(ts) (ts.trials==0?0:ts.diff/ts.trials)
|
#define TICK_TO_US(ts) (ts.trials==0?0:ts.diff/ts.trials)
|
||||||
|
|
||||||
|
|
||||||
static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_name) {
|
static inline int rxtx(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, char *thread_name) {
|
||||||
start_meas(&softmodem_stats_rxtx_sf);
|
start_meas(&softmodem_stats_rxtx_sf);
|
||||||
|
//L1_rxtx_proc_t *L1_proc_tx = &eNB->proc.L1_proc_tx;
|
||||||
|
|
||||||
// *******************************************************************
|
// *******************************************************************
|
||||||
|
|
||||||
@@ -217,14 +218,6 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
|
|||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER, 1 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER, 1 );
|
||||||
|
|
||||||
if(get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) {
|
|
||||||
if(wait_on_condition(&proc[1].mutex_rxtx,&proc[1].cond_rxtx,&proc[1].pipe_ready,"wakeup_tx")<0) {
|
|
||||||
LOG_E(PHY,"Frame %d, subframe %d: TX1 not ready\n",proc[1].frame_rx,proc[1].subframe_rx);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (release_thread(&proc[1].mutex_rxtx,&proc[1].pipe_ready,"wakeup_tx")<0) return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||||
eNB->UL_INFO.frame = proc->frame_rx;
|
eNB->UL_INFO.frame = proc->frame_rx;
|
||||||
@@ -290,19 +283,19 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void *tx_thread(void *param) {
|
static void* L1_thread_tx(void* param) {
|
||||||
eNB_proc_t *eNB_proc = (eNB_proc_t *)param;
|
|
||||||
eNB_rxtx_proc_t *proc = &eNB_proc->proc_rxtx[1];
|
L1_proc_t *eNB_proc = (L1_proc_t*)param;
|
||||||
|
L1_rxtx_proc_t *proc = &eNB_proc->L1_proc_tx;
|
||||||
PHY_VARS_eNB *eNB = RC.eNB[0][proc->CC_id];
|
PHY_VARS_eNB *eNB = RC.eNB[0][proc->CC_id];
|
||||||
char thread_name[100];
|
char thread_name[100];
|
||||||
sprintf(thread_name,"TXnp4_%d\n",&eNB->proc.proc_rxtx[0] == proc ? 0 : 1);
|
sprintf(thread_name,"TXnp4_%d\n",&eNB->proc.L1_proc == proc ? 0 : 1);
|
||||||
thread_top_init(thread_name,1,470000,500000,500000);
|
thread_top_init(thread_name,1,470000,500000,500000);
|
||||||
|
|
||||||
//wait_sync("tx_thread");
|
//wait_sync("tx_thread");
|
||||||
|
|
||||||
while (!oai_exit) {
|
while (!oai_exit) {
|
||||||
if (wait_on_condition(&proc->mutex_rxtx,&proc->cond_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
if (wait_on_condition(&proc->mutex,&proc->cond,&proc->instance_cnt,thread_name)<0) break;
|
||||||
|
|
||||||
if (oai_exit) break;
|
if (oai_exit) break;
|
||||||
|
|
||||||
// *****************************************
|
// *****************************************
|
||||||
@@ -316,19 +309,17 @@ static void *tx_thread(void *param) {
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB,proc->frame_rx);
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB,proc->frame_rx);
|
||||||
phy_procedures_eNB_TX(eNB, proc, 1);
|
phy_procedures_eNB_TX(eNB, proc, 1);
|
||||||
|
|
||||||
if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
|
||||||
|
|
||||||
pthread_mutex_lock( &proc->mutex_rxtx );
|
pthread_mutex_lock( &proc->mutex );
|
||||||
proc->pipe_ready++;
|
proc->instance_cnt = -1;
|
||||||
|
|
||||||
// the thread can now be woken up
|
// the thread can now be woken up
|
||||||
if (pthread_cond_signal(&proc->cond_rxtx) != 0) {
|
if (pthread_cond_signal(&proc->cond) != 0) {
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
exit_fun( "ERROR pthread_cond_signal" );
|
||||||
}
|
}
|
||||||
|
pthread_mutex_unlock( &proc->mutex );
|
||||||
pthread_mutex_unlock( &proc->mutex_rxtx );
|
wakeup_txfh(proc,eNB);
|
||||||
wakeup_txfh(proc,eNB_proc->ru_proc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -336,31 +327,34 @@ static void *tx_thread(void *param) {
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief The RX UE-specific and TX thread of eNB.
|
* \brief The RX UE-specific and TX thread of eNB.
|
||||||
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
|
* \param param is a \ref L1_proc_t structure which contains the info what to process.
|
||||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void *eNB_thread_rxtx( void *param ) {
|
static void* L1_thread( void* param ) {
|
||||||
|
|
||||||
static int eNB_thread_rxtx_status;
|
static int eNB_thread_rxtx_status;
|
||||||
//eNB_proc_t *eNB_proc = (eNB_proc_t*)param;
|
//L1_proc_t *eNB_proc = (L1_proc_t*)param;
|
||||||
eNB_rxtx_proc_t *proc;
|
L1_rxtx_proc_t *proc;
|
||||||
|
|
||||||
// Working
|
// Working
|
||||||
if(nfapi_mode ==2){
|
if(nfapi_mode ==2){
|
||||||
proc = (eNB_rxtx_proc_t *)param;
|
proc = (L1_rxtx_proc_t*)param;
|
||||||
} else {
|
}
|
||||||
eNB_proc_t *eNB_proc = (eNB_proc_t *)param;
|
else{
|
||||||
proc = &eNB_proc->proc_rxtx[0];
|
L1_proc_t *eNB_proc = (L1_proc_t*)param;
|
||||||
|
proc = &eNB_proc->L1_proc;
|
||||||
}
|
}
|
||||||
|
|
||||||
PHY_VARS_eNB *eNB = RC.eNB[0][proc->CC_id];
|
PHY_VARS_eNB *eNB = RC.eNB[0][proc->CC_id];
|
||||||
//RU_proc_t *ru_proc = NULL;
|
|
||||||
char thread_name[100];
|
char thread_name[100];
|
||||||
cpu_set_t cpuset;
|
cpu_set_t cpuset;
|
||||||
CPU_ZERO(&cpuset);
|
CPU_ZERO(&cpuset);
|
||||||
// set default return value
|
// set default return value
|
||||||
eNB_thread_rxtx_status = 0;
|
eNB_thread_rxtx_status = 0;
|
||||||
sprintf(thread_name,"RXn_TXnp4_%d\n",&eNB->proc.proc_rxtx[0] == proc ? 0 : 1);
|
|
||||||
|
sprintf(thread_name,"RXn_TXnp4_%d\n",&eNB->proc.L1_proc == proc ? 0 : 1);
|
||||||
thread_top_init(thread_name,1,470000,500000,500000);
|
thread_top_init(thread_name,1,470000,500000,500000);
|
||||||
pthread_setname_np( pthread_self(),"rxtx processing");
|
pthread_setname_np( pthread_self(),"rxtx processing");
|
||||||
LOG_I(PHY,"thread rxtx created id=%ld\n", syscall(__NR_gettid));
|
LOG_I(PHY,"thread rxtx created id=%ld\n", syscall(__NR_gettid));
|
||||||
@@ -369,7 +363,7 @@ static void *eNB_thread_rxtx( void *param ) {
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 );
|
||||||
T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx));
|
T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx));
|
||||||
|
|
||||||
if (wait_on_condition(&proc->mutex_rxtx,&proc->cond_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
if (wait_on_condition(&proc->mutex,&proc->cond,&proc->instance_cnt,thread_name)<0) break;
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_CPUID_ENB_THREAD_RXTX,sched_getcpu());
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_CPUID_ENB_THREAD_RXTX,sched_getcpu());
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 1 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 1 );
|
||||||
@@ -384,25 +378,11 @@ static void *eNB_thread_rxtx( void *param ) {
|
|||||||
if (rxtx(eNB,proc,thread_name) < 0) break;
|
if (rxtx(eNB,proc,thread_name) < 0) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
if(get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT) phy_procedures_eNB_TX(eNB, proc, 1);
|
||||||
|
if (release_thread(&proc->mutex,&proc->instance_cnt,thread_name)<0) break;
|
||||||
pthread_mutex_lock( &proc->mutex_rxtx );
|
|
||||||
proc->pipe_ready++;
|
|
||||||
|
|
||||||
// the thread can now be woken up
|
|
||||||
if (pthread_cond_signal(&proc->cond_rxtx) != 0) {
|
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock( &proc->mutex_rxtx );
|
|
||||||
|
|
||||||
if (nfapi_mode!=2){
|
if (nfapi_mode!=2){
|
||||||
if(get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) wakeup_tx(eNB,eNB->proc.ru_proc);
|
if(get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) wakeup_tx(eNB);
|
||||||
else if(get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT) {
|
else if(get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT) wakeup_txfh(proc,eNB);
|
||||||
phy_procedures_eNB_TX(eNB, proc, 1);
|
|
||||||
wakeup_txfh(proc,eNB->proc.ru_proc);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} // while !oai_exit
|
} // while !oai_exit
|
||||||
|
|
||||||
@@ -412,9 +392,10 @@ static void *eNB_thread_rxtx( void *param ) {
|
|||||||
return &eNB_thread_rxtx_status;
|
return &eNB_thread_rxtx_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void eNB_top(PHY_VARS_eNB *eNB, int frame_rx, int subframe_rx, char *string,RU_t *ru) {
|
void eNB_top(PHY_VARS_eNB *eNB, int frame_rx, int subframe_rx, char *string,RU_t *ru)
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
{
|
||||||
eNB_rxtx_proc_t *proc_rxtx = &proc->proc_rxtx[0];
|
L1_proc_t *proc = &eNB->proc;
|
||||||
|
L1_rxtx_proc_t *L1_proc = &proc->L1_proc;
|
||||||
LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
|
||||||
RU_proc_t *ru_proc=&ru->proc;
|
RU_proc_t *ru_proc=&ru->proc;
|
||||||
proc->frame_rx = frame_rx;
|
proc->frame_rx = frame_rx;
|
||||||
@@ -422,51 +403,59 @@ void eNB_top(PHY_VARS_eNB *eNB, int frame_rx, int subframe_rx, char *string,RU_t
|
|||||||
|
|
||||||
if (!oai_exit) {
|
if (!oai_exit) {
|
||||||
T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx));
|
T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx));
|
||||||
proc_rxtx->timestamp_tx = ru_proc->timestamp_rx + (sf_ahead*fp->samples_per_tti);
|
|
||||||
proc_rxtx->frame_rx = ru_proc->frame_rx;
|
|
||||||
proc_rxtx->subframe_rx = ru_proc->subframe_rx;
|
|
||||||
proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > (9-sf_ahead)) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx;
|
|
||||||
proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + sf_ahead)%10;
|
|
||||||
|
|
||||||
if (rxtx(eNB,proc_rxtx,string) < 0) LOG_E(PHY,"eNB %d CC_id %d failed during execution\n",eNB->Mod_id,eNB->CC_id);
|
L1_proc->timestamp_tx = ru_proc->timestamp_rx + (sf_ahead*fp->samples_per_tti);
|
||||||
|
L1_proc->frame_rx = ru_proc->frame_rx;
|
||||||
|
L1_proc->subframe_rx = ru_proc->subframe_rx;
|
||||||
|
L1_proc->frame_tx = (L1_proc->subframe_rx > (9-sf_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
||||||
|
L1_proc->subframe_tx = (L1_proc->subframe_rx + sf_ahead)%10;
|
||||||
|
|
||||||
ru_proc->timestamp_tx = proc_rxtx->timestamp_tx;
|
if (rxtx(eNB,L1_proc,string) < 0) LOG_E(PHY,"eNB %d CC_id %d failed during execution\n",eNB->Mod_id,eNB->CC_id);
|
||||||
ru_proc->subframe_tx = proc_rxtx->subframe_tx;
|
ru_proc->timestamp_tx = L1_proc->timestamp_tx;
|
||||||
ru_proc->frame_tx = proc_rxtx->frame_tx;
|
ru_proc->subframe_tx = L1_proc->subframe_tx;
|
||||||
|
ru_proc->frame_tx = L1_proc->frame_tx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int wakeup_txfh(eNB_rxtx_proc_t *proc,RU_proc_t *ru_proc) {
|
int wakeup_txfh(L1_rxtx_proc_t *proc,PHY_VARS_eNB *eNB) {
|
||||||
if(ru_proc == NULL)
|
|
||||||
return(0);
|
RU_t *ru;
|
||||||
|
RU_proc_t *ru_proc;
|
||||||
|
|
||||||
|
|
||||||
struct timespec wait;
|
struct timespec wait;
|
||||||
wait.tv_sec=0;
|
wait.tv_sec=0;
|
||||||
wait.tv_nsec=5000000L;
|
wait.tv_nsec=5000000L;
|
||||||
|
|
||||||
if(wait_on_condition(&ru_proc->mutex_eNBs,&ru_proc->cond_eNBs,&ru_proc->ru_tx_ready,"wakeup_txfh")<0) {
|
if(wait_on_condition(&proc->mutex_RUs,&proc->cond_RUs,&proc->instance_cnt_RUs,"wakeup_txfh")<0) {
|
||||||
LOG_E(PHY,"Frame %d, subframe %d: TX FH not ready\n", ru_proc->frame_tx, ru_proc->subframe_tx);
|
LOG_E(PHY,"Frame %d, subframe %d: TX FH not ready\n", proc->frame_tx, proc->subframe_tx);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
pthread_mutex_lock(&eNB->proc.mutex_RU_tx);
|
||||||
|
eNB->proc.RU_mask_tx = 0;
|
||||||
|
pthread_mutex_unlock(&eNB->proc.mutex_RU_tx);
|
||||||
|
if (release_thread(&proc->mutex_RUs,&proc->instance_cnt_RUs,"wakeup_txfh")<0) return(-1);
|
||||||
|
|
||||||
if (release_thread(&ru_proc->mutex_eNBs,&ru_proc->ru_tx_ready,"wakeup_txfh")<0) return(-1);
|
for(int i=0; i<eNB->num_RU; i++)
|
||||||
|
{
|
||||||
|
ru = eNB->RU_list[i];
|
||||||
|
ru_proc = &ru->proc;
|
||||||
if (ru_proc->instance_cnt_eNBs == 0) {
|
if (ru_proc->instance_cnt_eNBs == 0) {
|
||||||
LOG_E(PHY,"Frame %d, subframe %d: TX FH thread busy, dropping Frame %d, subframe %d\n", ru_proc->frame_tx, ru_proc->subframe_tx, proc->frame_rx, proc->subframe_rx);
|
LOG_E(PHY,"Frame %d, subframe %d: TX FH thread busy, dropping Frame %d, subframe %d\n", ru_proc->frame_tx, ru_proc->subframe_tx, proc->frame_rx, proc->subframe_rx);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pthread_mutex_timedlock(&ru_proc->mutex_eNBs,&wait) != 0) {
|
if (pthread_mutex_timedlock(&ru_proc->mutex_eNBs,&wait) != 0) {
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX1 thread %d (IC %d)\n", ru_proc->subframe_rx&1,ru_proc->instance_cnt_eNBs );
|
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX1 thread %d (IC %d)\n", ru_proc->subframe_rx&1,ru_proc->instance_cnt_eNBs );
|
||||||
exit_fun( "error locking mutex_eNB" );
|
exit_fun( "error locking mutex_eNB" );
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
++ru_proc->instance_cnt_eNBs;
|
ru_proc->instance_cnt_eNBs = 0;
|
||||||
ru_proc->timestamp_tx = proc->timestamp_tx;
|
ru_proc->timestamp_tx = proc->timestamp_tx;
|
||||||
ru_proc->subframe_tx = proc->subframe_tx;
|
ru_proc->subframe_tx = proc->subframe_tx;
|
||||||
ru_proc->frame_tx = proc->frame_tx;
|
ru_proc->frame_tx = proc->frame_tx;
|
||||||
|
|
||||||
|
|
||||||
// the thread can now be woken up
|
// the thread can now be woken up
|
||||||
if (pthread_cond_signal(&ru_proc->cond_eNBs) != 0) {
|
if (pthread_cond_signal(&ru_proc->cond_eNBs) != 0) {
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
||||||
@@ -475,51 +464,60 @@ int wakeup_txfh(eNB_rxtx_proc_t *proc,RU_proc_t *ru_proc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock( &ru_proc->mutex_eNBs );
|
pthread_mutex_unlock( &ru_proc->mutex_eNBs );
|
||||||
|
}
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int wakeup_tx(PHY_VARS_eNB *eNB,RU_proc_t *ru_proc) {
|
int wakeup_tx(PHY_VARS_eNB *eNB) {
|
||||||
eNB_proc_t *proc=&eNB->proc;
|
|
||||||
eNB_rxtx_proc_t *proc_rxtx1=&proc->proc_rxtx[1];//*proc_rxtx=&proc->proc_rxtx[proc->frame_rx&1];
|
L1_proc_t *proc=&eNB->proc;
|
||||||
eNB_rxtx_proc_t *proc_rxtx0=&proc->proc_rxtx[0];
|
|
||||||
|
L1_rxtx_proc_t *L1_proc_tx = &proc->L1_proc_tx;
|
||||||
|
L1_rxtx_proc_t *L1_proc = &proc->L1_proc;
|
||||||
|
|
||||||
|
|
||||||
struct timespec wait;
|
struct timespec wait;
|
||||||
wait.tv_sec=0;
|
wait.tv_sec=0;
|
||||||
wait.tv_nsec=5000000L;
|
wait.tv_nsec=5000000L;
|
||||||
|
|
||||||
if (proc_rxtx1->instance_cnt_rxtx == 0) {
|
|
||||||
LOG_E(PHY,"Frame %d, subframe %d: TX1 thread busy, dropping\n",proc_rxtx1->frame_rx,proc_rxtx1->subframe_rx);
|
if (pthread_mutex_timedlock(&L1_proc_tx->mutex,&wait) != 0) {
|
||||||
|
LOG_E(PHY, "[SCHED][eNB] ERROR locking mutex for eNB L1_thread_tx\n");
|
||||||
|
exit_fun("ERROR pthread_lock");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
while(L1_proc_tx->instance_cnt == 0){
|
||||||
if (pthread_mutex_timedlock(&proc_rxtx1->mutex_rxtx,&wait) != 0) {
|
pthread_cond_wait(&L1_proc_tx->cond,&L1_proc_tx->mutex);
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX1 thread %d (IC %d)\n", proc_rxtx1->subframe_rx&1,proc_rxtx1->instance_cnt_rxtx );
|
|
||||||
exit_fun( "error locking mutex_tx" );
|
|
||||||
return(-1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
++proc_rxtx1->instance_cnt_rxtx;
|
L1_proc_tx->instance_cnt = 0;
|
||||||
proc_rxtx1->subframe_rx = proc_rxtx0->subframe_rx;
|
|
||||||
proc_rxtx1->frame_rx = proc_rxtx0->frame_rx;
|
|
||||||
proc_rxtx1->subframe_tx = proc_rxtx0->subframe_tx;
|
L1_proc_tx->subframe_rx = L1_proc->subframe_rx;
|
||||||
proc_rxtx1->frame_tx = proc_rxtx0->frame_tx;
|
L1_proc_tx->frame_rx = L1_proc->frame_rx;
|
||||||
proc_rxtx1->timestamp_tx = proc_rxtx0->timestamp_tx;
|
L1_proc_tx->subframe_tx = L1_proc->subframe_tx;
|
||||||
|
L1_proc_tx->frame_tx = L1_proc->frame_tx;
|
||||||
|
L1_proc_tx->timestamp_tx = L1_proc->timestamp_tx;
|
||||||
|
|
||||||
// the thread can now be woken up
|
// the thread can now be woken up
|
||||||
if (pthread_cond_signal(&proc_rxtx1->cond_rxtx) != 0) {
|
if (pthread_cond_signal(&L1_proc_tx->cond) != 0) {
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
exit_fun( "ERROR pthread_cond_signal" );
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock( &proc_rxtx1->mutex_rxtx );
|
pthread_mutex_unlock( &L1_proc_tx->mutex);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
|
int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
|
||||||
eNB_proc_t *proc=&eNB->proc;
|
|
||||||
|
L1_proc_t *proc=&eNB->proc;
|
||||||
RU_proc_t *ru_proc=&ru->proc;
|
RU_proc_t *ru_proc=&ru->proc;
|
||||||
eNB_rxtx_proc_t *proc_rxtx0=&proc->proc_rxtx[0];
|
|
||||||
//eNB_rxtx_proc_t *proc_rxtx1=&proc->proc_rxtx[1];
|
L1_rxtx_proc_t *L1_proc=&proc->L1_proc;
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||||
int i;
|
int i;
|
||||||
struct timespec wait;
|
struct timespec wait;
|
||||||
@@ -547,52 +545,48 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
|
|||||||
wait.tv_sec=0;
|
wait.tv_sec=0;
|
||||||
wait.tv_nsec=5000000L;
|
wait.tv_nsec=5000000L;
|
||||||
|
|
||||||
if(wait_on_condition(&proc_rxtx0->mutex_rxtx,&proc_rxtx0->cond_rxtx,&proc_rxtx0->pipe_ready,"wakeup_rxtx")<0) {
|
|
||||||
LOG_E(PHY,"Frame %d, subframe %d: RXTX0 not ready\n",proc_rxtx0->frame_rx,proc_rxtx0->subframe_rx);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (release_thread(&proc_rxtx0->mutex_rxtx,&proc_rxtx0->pipe_ready,"wakeup_rxtx")<0) return(-1);
|
if (L1_proc->instance_cnt == 0) {
|
||||||
|
LOG_E(PHY,"Frame %d, subframe %d: RXTX0 thread busy, dropping\n",L1_proc->frame_rx,L1_proc->subframe_rx);
|
||||||
if (proc_rxtx0->instance_cnt_rxtx == 0) {
|
|
||||||
LOG_E(PHY,"Frame %d, subframe %d: RXTX0 thread busy, dropping\n",proc_rxtx0->frame_rx,proc_rxtx0->subframe_rx);
|
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// wake up TX for subframe n+sf_ahead
|
// wake up TX for subframe n+sf_ahead
|
||||||
// lock the TX mutex and make sure the thread is ready
|
// lock the TX mutex and make sure the thread is ready
|
||||||
if (pthread_mutex_timedlock(&proc_rxtx0->mutex_rxtx,&wait) != 0) {
|
if (pthread_mutex_timedlock(&L1_proc->mutex,&wait) != 0) {
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", proc_rxtx0->subframe_rx&1,proc_rxtx0->instance_cnt_rxtx );
|
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", L1_proc->subframe_rx&1,L1_proc->instance_cnt );
|
||||||
exit_fun( "error locking mutex_rxtx" );
|
exit_fun( "error locking mutex_rxtx" );
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
++proc_rxtx0->instance_cnt_rxtx;
|
++L1_proc->instance_cnt;
|
||||||
|
|
||||||
// We have just received and processed the common part of a subframe, say n.
|
// We have just received and processed the common part of a subframe, say n.
|
||||||
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
|
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
|
||||||
// transmitted timestamp of the next TX slot (first).
|
// transmitted timestamp of the next TX slot (first).
|
||||||
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
|
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
|
||||||
// we want to generate subframe (n+sf_ahead), so TS_tx = TX_rx+sf_ahead*samples_per_tti,
|
// we want to generate subframe (n+sf_ahead), so TS_tx = TX_rx+sf_ahead*samples_per_tti,
|
||||||
// and proc->subframe_tx = proc->subframe_rx+sf_ahead
|
// and proc->subframe_tx = proc->subframe_rx+sf_ahead
|
||||||
proc_rxtx0->timestamp_tx = ru_proc->timestamp_rx + (sf_ahead*fp->samples_per_tti);
|
L1_proc->timestamp_tx = ru_proc->timestamp_rx + (sf_ahead*fp->samples_per_tti);
|
||||||
proc_rxtx0->frame_rx = ru_proc->frame_rx;
|
L1_proc->frame_rx = ru_proc->frame_rx;
|
||||||
proc_rxtx0->subframe_rx = ru_proc->subframe_rx;
|
L1_proc->subframe_rx = ru_proc->subframe_rx;
|
||||||
proc_rxtx0->frame_tx = (proc_rxtx0->subframe_rx > (9-sf_ahead)) ? (proc_rxtx0->frame_rx+1)&1023 : proc_rxtx0->frame_rx;
|
L1_proc->frame_tx = (L1_proc->subframe_rx > (9-sf_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
||||||
proc_rxtx0->subframe_tx = (proc_rxtx0->subframe_rx + sf_ahead)%10;
|
L1_proc->subframe_tx = (L1_proc->subframe_rx + sf_ahead)%10;
|
||||||
|
|
||||||
// the thread can now be woken up
|
// the thread can now be woken up
|
||||||
if (pthread_cond_signal(&proc_rxtx0->cond_rxtx) != 0) {
|
if (pthread_cond_signal(&L1_proc->cond) != 0) {
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n");
|
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n");
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
exit_fun( "ERROR pthread_cond_signal" );
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock( &proc_rxtx0->mutex_rxtx );
|
pthread_mutex_unlock( &L1_proc->mutex);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) {
|
void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) {
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
|
||||||
|
L1_proc_t *proc = &eNB->proc;
|
||||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -654,7 +648,8 @@ void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) {
|
|||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) {
|
void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) {
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
|
||||||
|
L1_proc_t *proc = &eNB->proc;
|
||||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -718,13 +713,14 @@ void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) {
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief The prach receive thread of eNB.
|
* \brief The prach receive thread of eNB.
|
||||||
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
|
* \param param is a \ref L1_proc_t structure which contains the info what to process.
|
||||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
||||||
*/
|
*/
|
||||||
static void *eNB_thread_prach( void *param ) {
|
static void *eNB_thread_prach( void *param ) {
|
||||||
static int eNB_thread_prach_status;
|
static int eNB_thread_prach_status;
|
||||||
PHY_VARS_eNB *eNB= (PHY_VARS_eNB *)param;
|
PHY_VARS_eNB *eNB= (PHY_VARS_eNB *)param;
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
L1_proc_t *proc = &eNB->proc;
|
||||||
|
|
||||||
// set default return value
|
// set default return value
|
||||||
eNB_thread_prach_status = 0;
|
eNB_thread_prach_status = 0;
|
||||||
thread_top_init("eNB_thread_prach",1,500000,1000000,20000000);
|
thread_top_init("eNB_thread_prach",1,500000,1000000,20000000);
|
||||||
@@ -754,13 +750,14 @@ static void *eNB_thread_prach( void *param ) {
|
|||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
/*!
|
/*!
|
||||||
* \brief The prach receive thread of eNB for BL/CE UEs.
|
* \brief The prach receive thread of eNB for BL/CE UEs.
|
||||||
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
|
* \param param is a \ref L1_proc_t structure which contains the info what to process.
|
||||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
||||||
*/
|
*/
|
||||||
static void *eNB_thread_prach_br( void *param ) {
|
static void *eNB_thread_prach_br( void *param ) {
|
||||||
static int eNB_thread_prach_status;
|
static int eNB_thread_prach_status;
|
||||||
PHY_VARS_eNB *eNB= (PHY_VARS_eNB *)param;
|
PHY_VARS_eNB *eNB= (PHY_VARS_eNB *)param;
|
||||||
eNB_proc_t *proc = &eNB->proc;
|
L1_proc_t *proc = &eNB->proc;
|
||||||
|
|
||||||
// set default return value
|
// set default return value
|
||||||
eNB_thread_prach_status = 0;
|
eNB_thread_prach_status = 0;
|
||||||
thread_top_init("eNB_thread_prach_br",1,500000,1000000,20000000);
|
thread_top_init("eNB_thread_prach_br",1,500000,1000000,20000000);
|
||||||
@@ -827,8 +824,8 @@ void init_eNB_proc(int inst) {
|
|||||||
/*int i=0;*/
|
/*int i=0;*/
|
||||||
int CC_id;
|
int CC_id;
|
||||||
PHY_VARS_eNB *eNB;
|
PHY_VARS_eNB *eNB;
|
||||||
eNB_proc_t *proc;
|
L1_proc_t *proc;
|
||||||
eNB_rxtx_proc_t *proc_rxtx;
|
L1_rxtx_proc_t *L1_proc, *L1_proc_tx;
|
||||||
pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_prach=NULL;
|
pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_prach=NULL;
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
pthread_attr_t *attr_prach_br=NULL;
|
pthread_attr_t *attr_prach_br=NULL;
|
||||||
@@ -841,34 +838,45 @@ void init_eNB_proc(int inst) {
|
|||||||
LOG_I(PHY,"Initializing eNB processes instance:%d CC_id %d \n",inst,CC_id);
|
LOG_I(PHY,"Initializing eNB processes instance:%d CC_id %d \n",inst,CC_id);
|
||||||
#endif
|
#endif
|
||||||
proc = &eNB->proc;
|
proc = &eNB->proc;
|
||||||
proc_rxtx = proc->proc_rxtx;
|
|
||||||
proc_rxtx[0].instance_cnt_rxtx = -1;
|
L1_proc = &proc->L1_proc;
|
||||||
proc_rxtx[1].instance_cnt_rxtx = -1;
|
L1_proc_tx = &proc->L1_proc_tx;
|
||||||
proc_rxtx[0].pipe_ready = 0;
|
L1_proc->instance_cnt = -1;
|
||||||
proc_rxtx[1].pipe_ready = 0;
|
L1_proc_tx->instance_cnt = -1;
|
||||||
|
L1_proc->instance_cnt_RUs = 0;
|
||||||
|
L1_proc_tx->instance_cnt_RUs = 0;
|
||||||
proc->instance_cnt_prach = -1;
|
proc->instance_cnt_prach = -1;
|
||||||
proc->instance_cnt_asynch_rxtx = -1;
|
proc->instance_cnt_asynch_rxtx = -1;
|
||||||
proc->instance_cnt_synch = -1;
|
proc->instance_cnt_synch = -1;
|
||||||
proc->CC_id = CC_id;
|
proc->CC_id = CC_id;
|
||||||
|
|
||||||
proc->first_rx =1;
|
proc->first_rx =1;
|
||||||
proc->first_tx =1;
|
proc->first_tx =1;
|
||||||
|
proc->RU_mask_tx = (1<<eNB->num_RU)-1;
|
||||||
proc->RU_mask =0;
|
proc->RU_mask =0;
|
||||||
proc->RU_mask_prach =0;
|
proc->RU_mask_prach =0;
|
||||||
|
|
||||||
pthread_mutex_init( &eNB->UL_INFO_mutex, NULL);
|
pthread_mutex_init( &eNB->UL_INFO_mutex, NULL);
|
||||||
pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL);
|
pthread_mutex_init( &L1_proc->mutex, NULL);
|
||||||
pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL);
|
pthread_mutex_init( &L1_proc_tx->mutex, NULL);
|
||||||
pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL);
|
pthread_cond_init( &L1_proc->cond, NULL);
|
||||||
pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL);
|
pthread_cond_init( &L1_proc_tx->cond, NULL);
|
||||||
|
pthread_mutex_init( &L1_proc->mutex_RUs, NULL);
|
||||||
|
pthread_mutex_init( &L1_proc_tx->mutex_RUs, NULL);
|
||||||
|
pthread_cond_init( &L1_proc->cond_RUs, NULL);
|
||||||
|
pthread_cond_init( &L1_proc_tx->cond_RUs, NULL);
|
||||||
|
|
||||||
pthread_mutex_init( &proc->mutex_prach, NULL);
|
pthread_mutex_init( &proc->mutex_prach, NULL);
|
||||||
pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL);
|
pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL);
|
||||||
pthread_mutex_init( &proc->mutex_RU,NULL);
|
pthread_mutex_init( &proc->mutex_RU,NULL);
|
||||||
|
pthread_mutex_init( &proc->mutex_RU_tx,NULL);
|
||||||
pthread_mutex_init( &proc->mutex_RU_PRACH,NULL);
|
pthread_mutex_init( &proc->mutex_RU_PRACH,NULL);
|
||||||
pthread_cond_init( &proc->cond_prach, NULL);
|
pthread_cond_init( &proc->cond_prach, NULL);
|
||||||
pthread_cond_init( &proc->cond_asynch_rxtx, NULL);
|
pthread_cond_init( &proc->cond_asynch_rxtx, NULL);
|
||||||
pthread_attr_init( &proc->attr_prach);
|
pthread_attr_init( &proc->attr_prach);
|
||||||
pthread_attr_init( &proc->attr_asynch_rxtx);
|
pthread_attr_init( &proc->attr_asynch_rxtx);
|
||||||
pthread_attr_init( &proc_rxtx[0].attr_rxtx);
|
pthread_attr_init( &L1_proc->attr);
|
||||||
pthread_attr_init( &proc_rxtx[1].attr_rxtx);
|
pthread_attr_init( &L1_proc_tx->attr);
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
proc->instance_cnt_prach_br = -1;
|
proc->instance_cnt_prach_br = -1;
|
||||||
proc->RU_mask_prach_br=0;
|
proc->RU_mask_prach_br=0;
|
||||||
@@ -878,8 +886,8 @@ void init_eNB_proc(int inst) {
|
|||||||
pthread_attr_init( &proc->attr_prach_br);
|
pthread_attr_init( &proc->attr_prach_br);
|
||||||
#endif
|
#endif
|
||||||
#ifndef DEADLINE_SCHEDULER
|
#ifndef DEADLINE_SCHEDULER
|
||||||
attr0 = &proc_rxtx[0].attr_rxtx;
|
attr0 = &L1_proc->attr;
|
||||||
attr1 = &proc_rxtx[1].attr_rxtx;
|
attr1 = &L1_proc_tx->attr;
|
||||||
attr_prach = &proc->attr_prach;
|
attr_prach = &proc->attr_prach;
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
attr_prach_br = &proc->attr_prach_br;
|
attr_prach_br = &proc->attr_prach_br;
|
||||||
@@ -896,21 +904,15 @@ void init_eNB_proc(int inst) {
|
|||||||
LOG_I(PHY,"eNB->single_thread_flag:%d\n", eNB->single_thread_flag);
|
LOG_I(PHY,"eNB->single_thread_flag:%d\n", eNB->single_thread_flag);
|
||||||
|
|
||||||
if ((get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) && nfapi_mode!=2) {
|
if ((get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) && nfapi_mode!=2) {
|
||||||
pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc );
|
pthread_create( &L1_proc->pthread, attr0, L1_thread, proc );
|
||||||
pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, tx_thread, proc);
|
pthread_create( &L1_proc_tx->pthread, attr1, L1_thread_tx, proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_create( &proc->pthread_prach, attr_prach, eNB_thread_prach, eNB );
|
pthread_create( &proc->pthread_prach, attr_prach, eNB_thread_prach, eNB );
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
pthread_create( &proc->pthread_prach_br, attr_prach_br, eNB_thread_prach_br, eNB );
|
pthread_create( &proc->pthread_prach_br, attr_prach_br, eNB_thread_prach_br, eNB );
|
||||||
#endif
|
#endif
|
||||||
/*char name[16];
|
|
||||||
if (eNB->single_thread_flag==0) {
|
|
||||||
snprintf( name, sizeof(name), "RXTX0 %d", i );
|
|
||||||
pthread_setname_np( proc_rxtx[0].pthread_rxtx, name );
|
|
||||||
snprintf( name, sizeof(name), "RXTX1 %d", i );
|
|
||||||
pthread_setname_np( proc_rxtx[1].pthread_rxtx, name );
|
|
||||||
}*/
|
|
||||||
AssertFatal(proc->instance_cnt_prach == -1,"instance_cnt_prach = %d\n",proc->instance_cnt_prach);
|
AssertFatal(proc->instance_cnt_prach == -1,"instance_cnt_prach = %d\n",proc->instance_cnt_prach);
|
||||||
|
|
||||||
if (opp_enabled == 1) pthread_create(&proc->process_stats_thread,NULL,process_stats_thread,(void *)eNB);
|
if (opp_enabled == 1) pthread_create(&proc->process_stats_thread,NULL,process_stats_thread,(void *)eNB);
|
||||||
@@ -923,7 +925,7 @@ void init_eNB_proc(int inst) {
|
|||||||
|
|
||||||
if (eNB->node_timing == synch_to_ext_device) { //master
|
if (eNB->node_timing == synch_to_ext_device) { //master
|
||||||
eNB->proc.num_slaves = MAX_NUM_CCs-1;
|
eNB->proc.num_slaves = MAX_NUM_CCs-1;
|
||||||
eNB->proc.slave_proc = (eNB_proc_t**)malloc(eNB->proc.num_slaves*sizeof(eNB_proc_t*));
|
eNB->proc.slave_proc = (L1_proc_t**)malloc(eNB->proc.num_slaves*sizeof(L1_proc_t*));
|
||||||
|
|
||||||
for (i=0; i< eNB->proc.num_slaves; i++) {
|
for (i=0; i< eNB->proc.num_slaves; i++) {
|
||||||
if (i < CC_id) eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i]->proc);
|
if (i < CC_id) eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i]->proc);
|
||||||
@@ -946,14 +948,15 @@ void init_eNB_proc(int inst) {
|
|||||||
void kill_eNB_proc(int inst) {
|
void kill_eNB_proc(int inst) {
|
||||||
int *status;
|
int *status;
|
||||||
PHY_VARS_eNB *eNB;
|
PHY_VARS_eNB *eNB;
|
||||||
eNB_proc_t *proc;
|
L1_proc_t *proc;
|
||||||
eNB_rxtx_proc_t *proc_rxtx;
|
L1_rxtx_proc_t *L1_proc, *L1_proc_tx;
|
||||||
int i;
|
|
||||||
|
|
||||||
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
eNB=RC.eNB[inst][CC_id];
|
eNB=RC.eNB[inst][CC_id];
|
||||||
|
|
||||||
proc = &eNB->proc;
|
proc = &eNB->proc;
|
||||||
proc_rxtx = &proc->proc_rxtx[0];
|
L1_proc = &proc->L1_proc;
|
||||||
|
L1_proc_tx = &proc->L1_proc_tx;
|
||||||
|
|
||||||
if(get_thread_worker_conf() == WORKER_ENABLE) {
|
if(get_thread_worker_conf() == WORKER_ENABLE) {
|
||||||
kill_td_thread(eNB);
|
kill_td_thread(eNB);
|
||||||
@@ -962,12 +965,16 @@ void kill_eNB_proc(int inst) {
|
|||||||
|
|
||||||
LOG_I(PHY, "Killing TX CC_id %d inst %d\n", CC_id, inst );
|
LOG_I(PHY, "Killing TX CC_id %d inst %d\n", CC_id, inst );
|
||||||
|
|
||||||
for (i=0; i<2; i++) {
|
if ((get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) && nfapi_mode!=2) {
|
||||||
pthread_mutex_lock(&proc_rxtx[i].mutex_rxtx);
|
pthread_mutex_lock(&L1_proc->mutex);
|
||||||
proc_rxtx[i].instance_cnt_rxtx = 0;
|
L1_proc->instance_cnt = 0;
|
||||||
proc_rxtx[i].pipe_ready = 0;
|
pthread_cond_signal(&L1_proc->cond);
|
||||||
pthread_cond_signal(&proc_rxtx[i].cond_rxtx);
|
pthread_mutex_unlock(&L1_proc->mutex);
|
||||||
pthread_mutex_unlock(&proc_rxtx[i].mutex_rxtx);
|
|
||||||
|
pthread_mutex_lock(&L1_proc_tx->mutex);
|
||||||
|
L1_proc_tx->instance_cnt = 0;
|
||||||
|
pthread_cond_signal(&L1_proc_tx->cond);
|
||||||
|
pthread_mutex_unlock(&L1_proc_tx->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&proc->mutex_prach);
|
pthread_mutex_lock(&proc->mutex_prach);
|
||||||
@@ -991,18 +998,27 @@ void kill_eNB_proc(int inst) {
|
|||||||
LOG_I(PHY, "Destroying UL_INFO mutex\n");
|
LOG_I(PHY, "Destroying UL_INFO mutex\n");
|
||||||
pthread_mutex_destroy(&eNB->UL_INFO_mutex);
|
pthread_mutex_destroy(&eNB->UL_INFO_mutex);
|
||||||
|
|
||||||
for (i=0; i<2; i++) {
|
if ((get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) && nfapi_mode!=2) {
|
||||||
LOG_I(PHY, "Joining rxtx[%d] mutex/cond\n",i);
|
LOG_I(PHY, "Joining L1_proc mutex/cond\n");
|
||||||
pthread_join( proc_rxtx[i].pthread_rxtx, (void **)&status );
|
pthread_join( L1_proc->pthread, (void**)&status );
|
||||||
LOG_I(PHY, "Destroying rxtx[%d] mutex/cond\n",i);
|
LOG_I(PHY, "Joining L1_proc_tx mutex/cond\n");
|
||||||
pthread_mutex_destroy( &proc_rxtx[i].mutex_rxtx );
|
pthread_join( L1_proc_tx->pthread, (void**)&status );
|
||||||
pthread_cond_destroy( &proc_rxtx[i].cond_rxtx );
|
|
||||||
}
|
}
|
||||||
|
LOG_I(PHY, "Destroying L1_proc mutex/cond\n");
|
||||||
|
pthread_mutex_destroy( &L1_proc->mutex );
|
||||||
|
pthread_cond_destroy( &L1_proc->cond );
|
||||||
|
pthread_mutex_destroy( &L1_proc->mutex_RUs );
|
||||||
|
pthread_cond_destroy( &L1_proc->cond_RUs );
|
||||||
|
LOG_I(PHY, "Destroying L1_proc_tx mutex/cond\n");
|
||||||
|
pthread_mutex_destroy( &L1_proc_tx->mutex );
|
||||||
|
pthread_cond_destroy( &L1_proc_tx->cond );
|
||||||
|
pthread_mutex_destroy( &L1_proc_tx->mutex_RUs );
|
||||||
|
pthread_cond_destroy( &L1_proc_tx->cond_RUs );
|
||||||
|
|
||||||
pthread_attr_destroy(&proc->attr_prach);
|
pthread_attr_destroy(&proc->attr_prach);
|
||||||
pthread_attr_destroy(&proc->attr_asynch_rxtx);
|
pthread_attr_destroy(&proc->attr_asynch_rxtx);
|
||||||
pthread_attr_destroy(&proc_rxtx[0].attr_rxtx);
|
pthread_attr_destroy(&L1_proc->attr);
|
||||||
pthread_attr_destroy(&proc_rxtx[1].attr_rxtx);
|
pthread_attr_destroy(&L1_proc_tx->attr);
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
pthread_mutex_destroy(&proc->mutex_RU_PRACH_br);
|
pthread_mutex_destroy(&proc->mutex_RU_PRACH_br);
|
||||||
pthread_attr_destroy(&proc->attr_prach_br);
|
pthread_attr_destroy(&proc->attr_prach_br);
|
||||||
|
|||||||
+41
-19
@@ -761,9 +761,9 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
|
|||||||
proc->timestamp_rx = ts-ru->ts_offset;
|
proc->timestamp_rx = ts-ru->ts_offset;
|
||||||
|
|
||||||
// AssertFatal(rxs == fp->samples_per_tti,
|
// AssertFatal(rxs == fp->samples_per_tti,
|
||||||
// "rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs);
|
// "rx_rf: Asked for %d samples, got %d from SDR\n",fp->samples_per_tti,rxs);
|
||||||
if(rxs != fp->samples_per_tti){
|
if(rxs != fp->samples_per_tti){
|
||||||
LOG_E(PHY,"rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs);
|
LOG_E(PHY,"rx_rf: Asked for %d samples, got %d from SDR\n",fp->samples_per_tti,rxs);
|
||||||
late_control=STATE_BURST_TERMINATE;
|
late_control=STATE_BURST_TERMINATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -956,7 +956,7 @@ void tx_rf(RU_t *ru) {
|
|||||||
/*!
|
/*!
|
||||||
* \brief The Asynchronous RX/TX FH thread of RAU/RCC/eNB/RRU.
|
* \brief The Asynchronous RX/TX FH thread of RAU/RCC/eNB/RRU.
|
||||||
* This handles the RX FH for an asynchronous RRU/UE
|
* This handles the RX FH for an asynchronous RRU/UE
|
||||||
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
|
* \param param is a \ref L1_proc_t structure which contains the info what to process.
|
||||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
||||||
*/
|
*/
|
||||||
static void* ru_thread_asynch_rxtx( void* param ) {
|
static void* ru_thread_asynch_rxtx( void* param ) {
|
||||||
@@ -1249,12 +1249,12 @@ void do_ru_synch(RU_t *ru) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void wakeup_eNBs(RU_t *ru) {
|
void wakeup_L1s(RU_t *ru) {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
PHY_VARS_eNB **eNB_list = ru->eNB_list;
|
PHY_VARS_eNB **eNB_list = ru->eNB_list;
|
||||||
|
|
||||||
LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d ru->eNB_top:%p\n",ru->num_eNB,ru->idx, ru->eNB_top);
|
LOG_D(PHY,"wakeup_L1s (num %d) for RU %d ru->eNB_top:%p\n",ru->num_eNB,ru->idx, ru->eNB_top);
|
||||||
|
|
||||||
|
|
||||||
if (ru->num_eNB==1 && ru->eNB_top!=0 && get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD) {
|
if (ru->num_eNB==1 && ru->eNB_top!=0 && get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD) {
|
||||||
@@ -1273,7 +1273,6 @@ void wakeup_eNBs(RU_t *ru) {
|
|||||||
for (i=0;i<ru->num_eNB;i++)
|
for (i=0;i<ru->num_eNB;i++)
|
||||||
{
|
{
|
||||||
LOG_D(PHY,"ru->wakeup_rxtx:%p\n", ru->wakeup_rxtx);
|
LOG_D(PHY,"ru->wakeup_rxtx:%p\n", ru->wakeup_rxtx);
|
||||||
eNB_list[i]->proc.ru_proc = &ru->proc;
|
|
||||||
if (ru->wakeup_rxtx!=0 && ru->wakeup_rxtx(eNB_list[i],ru) < 0)
|
if (ru->wakeup_rxtx!=0 && ru->wakeup_rxtx(eNB_list[i],ru) < 0)
|
||||||
{
|
{
|
||||||
LOG_E(PHY,"could not wakeup eNB rxtx process for subframe %d\n", ru->proc.subframe_rx);
|
LOG_E(PHY,"could not wakeup eNB rxtx process for subframe %d\n", ru->proc.subframe_rx);
|
||||||
@@ -1531,6 +1530,10 @@ volatile int16_t phy_tx_end;
|
|||||||
static void* ru_thread_tx( void* param ) {
|
static void* ru_thread_tx( void* param ) {
|
||||||
RU_t *ru = (RU_t*)param;
|
RU_t *ru = (RU_t*)param;
|
||||||
RU_proc_t *proc = &ru->proc;
|
RU_proc_t *proc = &ru->proc;
|
||||||
|
PHY_VARS_eNB *eNB;
|
||||||
|
L1_proc_t *eNB_proc;
|
||||||
|
L1_rxtx_proc_t *L1_proc;
|
||||||
|
|
||||||
cpu_set_t cpuset;
|
cpu_set_t cpuset;
|
||||||
CPU_ZERO(&cpuset);
|
CPU_ZERO(&cpuset);
|
||||||
|
|
||||||
@@ -1568,15 +1571,37 @@ static void* ru_thread_tx( void* param ) {
|
|||||||
if (ru->fh_north_out) ru->fh_north_out(ru);
|
if (ru->fh_north_out) ru->fh_north_out(ru);
|
||||||
}
|
}
|
||||||
release_thread(&proc->mutex_eNBs,&proc->instance_cnt_eNBs,"ru_thread_tx");
|
release_thread(&proc->mutex_eNBs,&proc->instance_cnt_eNBs,"ru_thread_tx");
|
||||||
|
for(int i = 0; i<ru->num_eNB; i++)
|
||||||
|
{
|
||||||
|
eNB = ru->eNB_list[i];
|
||||||
|
eNB_proc = &eNB->proc;
|
||||||
|
L1_proc = (get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT)? &eNB_proc->L1_proc_tx : &eNB_proc->L1_proc;
|
||||||
|
pthread_mutex_lock(&eNB_proc->mutex_RU_tx);
|
||||||
|
for (int j=0;j<eNB->num_RU;j++) {
|
||||||
|
if (ru == eNB->RU_list[j]) {
|
||||||
|
if ((eNB_proc->RU_mask_tx&(1<<j)) > 0)
|
||||||
|
LOG_E(PHY,"eNB %d frame %d, subframe %d : previous information from RU tx %d (num_RU %d,mask %x) has not been served yet!\n",
|
||||||
|
eNB->Mod_id,eNB_proc->frame_rx,eNB_proc->subframe_rx,ru->idx,eNB->num_RU,eNB_proc->RU_mask_tx);
|
||||||
|
eNB_proc->RU_mask_tx |= (1<<j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (eNB_proc->RU_mask_tx != (1<<eNB->num_RU)-1) { // not all RUs have provided their information so return
|
||||||
|
pthread_mutex_unlock(&eNB_proc->mutex_RU_tx);
|
||||||
|
}
|
||||||
|
else { // all RUs TX are finished so send the ready signal to eNB processing
|
||||||
|
eNB_proc->RU_mask_tx = 0;
|
||||||
|
pthread_mutex_unlock(&eNB_proc->mutex_RU_tx);
|
||||||
|
|
||||||
pthread_mutex_lock( &proc->mutex_eNBs );
|
pthread_mutex_lock( &L1_proc->mutex_RUs);
|
||||||
proc->ru_tx_ready++;
|
L1_proc->instance_cnt_RUs = 0;
|
||||||
// the thread can now be woken up
|
// the thread can now be woken up
|
||||||
if (pthread_cond_signal(&proc->cond_eNBs) != 0) {
|
if (pthread_cond_signal(&L1_proc->cond_RUs) != 0) {
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
exit_fun( "ERROR pthread_cond_signal" );
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock( &proc->mutex_eNBs );
|
pthread_mutex_unlock( &L1_proc->mutex_RUs );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
release_thread(&proc->mutex_FH1,&proc->instance_cnt_FH1,"ru_thread_tx");
|
release_thread(&proc->mutex_FH1,&proc->instance_cnt_FH1,"ru_thread_tx");
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1785,7 +1810,7 @@ static void* ru_thread( void* param ) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// wakeup all eNB processes waiting for this RU
|
// wakeup all eNB processes waiting for this RU
|
||||||
if (ru->num_eNB>0) wakeup_eNBs(ru);
|
if (ru->num_eNB>0) wakeup_L1s(ru);
|
||||||
|
|
||||||
#ifndef PHY_TX_THREAD
|
#ifndef PHY_TX_THREAD
|
||||||
if(get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD || ru->num_eNB==0){
|
if(get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD || ru->num_eNB==0){
|
||||||
@@ -1963,7 +1988,7 @@ void* pre_scd_thread( void* param ){
|
|||||||
#ifdef PHY_TX_THREAD
|
#ifdef PHY_TX_THREAD
|
||||||
/*!
|
/*!
|
||||||
* \brief The phy tx thread of eNB.
|
* \brief The phy tx thread of eNB.
|
||||||
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
|
* \param param is a \ref L1_proc_t structure which contains the info what to process.
|
||||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
||||||
*/
|
*/
|
||||||
static void* eNB_thread_phy_tx( void* param ) {
|
static void* eNB_thread_phy_tx( void* param ) {
|
||||||
@@ -1974,7 +1999,7 @@ static void* eNB_thread_phy_tx( void* param ) {
|
|||||||
RU_proc_t *proc = &ru->proc;
|
RU_proc_t *proc = &ru->proc;
|
||||||
PHY_VARS_eNB **eNB_list = ru->eNB_list;
|
PHY_VARS_eNB **eNB_list = ru->eNB_list;
|
||||||
|
|
||||||
eNB_rxtx_proc_t proc_rxtx;
|
L1_rxtx_proc_t L1_proc;
|
||||||
|
|
||||||
// set default return value
|
// set default return value
|
||||||
eNB_thread_phy_tx_status = 0;
|
eNB_thread_phy_tx_status = 0;
|
||||||
@@ -1991,9 +2016,9 @@ static void* eNB_thread_phy_tx( void* param ) {
|
|||||||
|
|
||||||
LOG_D(PHY,"Running eNB phy tx procedures\n");
|
LOG_D(PHY,"Running eNB phy tx procedures\n");
|
||||||
if(ru->num_eNB == 1){
|
if(ru->num_eNB == 1){
|
||||||
proc_rxtx.subframe_tx = proc->subframe_phy_tx;
|
L1_proc.subframe_tx = proc->subframe_phy_tx;
|
||||||
proc_rxtx.frame_tx = proc->frame_phy_tx;
|
L1_proc.frame_tx = proc->frame_phy_tx;
|
||||||
phy_procedures_eNB_TX(eNB_list[0], &proc_rxtx, 1);
|
phy_procedures_eNB_TX(eNB_list[0], &L1_proc, 1);
|
||||||
phy_tx_txdataF_end = 1;
|
phy_tx_txdataF_end = 1;
|
||||||
if(pthread_mutex_lock(&ru->proc.mutex_rf_tx) != 0){
|
if(pthread_mutex_lock(&ru->proc.mutex_rf_tx) != 0){
|
||||||
LOG_E( PHY, "[RU] ERROR pthread_mutex_lock for rf tx thread (IC %d)\n", ru->proc.instance_cnt_rf_tx);
|
LOG_E( PHY, "[RU] ERROR pthread_mutex_lock for rf tx thread (IC %d)\n", ru->proc.instance_cnt_rf_tx);
|
||||||
@@ -2125,8 +2150,6 @@ void init_RU_proc(RU_t *ru) {
|
|||||||
proc->frame_offset = 0;
|
proc->frame_offset = 0;
|
||||||
proc->num_slaves = 0;
|
proc->num_slaves = 0;
|
||||||
proc->frame_tx_unwrap = 0;
|
proc->frame_tx_unwrap = 0;
|
||||||
proc->ru_rx_ready = 0;
|
|
||||||
proc->ru_tx_ready = 0;
|
|
||||||
|
|
||||||
for (i=0;i<10;i++) proc->symbol_mask[i]=0;
|
for (i=0;i<10;i++) proc->symbol_mask[i]=0;
|
||||||
|
|
||||||
@@ -2301,7 +2324,6 @@ void kill_RU_proc(RU_t *ru)
|
|||||||
pthread_mutex_unlock(&proc->mutex_synch);
|
pthread_mutex_unlock(&proc->mutex_synch);
|
||||||
|
|
||||||
pthread_mutex_lock(&proc->mutex_eNBs);
|
pthread_mutex_lock(&proc->mutex_eNBs);
|
||||||
proc->ru_tx_ready = 0;
|
|
||||||
proc->instance_cnt_eNBs = 1;
|
proc->instance_cnt_eNBs = 1;
|
||||||
// cond_eNBs is used by both ru_thread and ru_thread_tx, so we need to send
|
// cond_eNBs is used by both ru_thread and ru_thread_tx, so we need to send
|
||||||
// a broadcast to wake up both threads
|
// a broadcast to wake up both threads
|
||||||
|
|||||||
@@ -189,6 +189,8 @@ extern void print_opp_meas(void);
|
|||||||
extern void init_eNB_afterRU(void);
|
extern void init_eNB_afterRU(void);
|
||||||
|
|
||||||
int transmission_mode=1;
|
int transmission_mode=1;
|
||||||
|
int emulate_rf = 0;
|
||||||
|
int numerology = 0;
|
||||||
|
|
||||||
THREAD_STRUCT thread_struct;
|
THREAD_STRUCT thread_struct;
|
||||||
/* struct for ethernet specific parameters given in eNB conf file */
|
/* struct for ethernet specific parameters given in eNB conf file */
|
||||||
|
|||||||
Reference in New Issue
Block a user