Merge remote-tracking branch 'origin/develop-nr' into test-x310
This commit is contained in:
@@ -0,0 +1,380 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Abstraction function to send social media messages:
|
||||||
|
// like on Slack or Mattermost
|
||||||
|
def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) {
|
||||||
|
if (params.pipelineUsesSlack != null) {
|
||||||
|
if (params.pipelineUsesSlack) {
|
||||||
|
slackSend channel: pipeChannel, color: pipeColor, message: pipeMessage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the phone resource
|
||||||
|
def ciUSRPsResource = params.USRPsResource
|
||||||
|
|
||||||
|
// Terminate Status
|
||||||
|
def termUE = 0
|
||||||
|
def termENB = 1
|
||||||
|
def termStatusArray = new Boolean[2]
|
||||||
|
termStatusArray[termUE] = false
|
||||||
|
termStatusArray[termENB] = false
|
||||||
|
|
||||||
|
// Global Parameters.
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
def eNB_TargetBranch
|
||||||
|
def PROJECT_NAME = "test-boris"
|
||||||
|
def GIT_COMMIT_AUTHORi
|
||||||
|
def GIT_COMMIT_EMAIL
|
||||||
|
def testStageName
|
||||||
|
// Reversing list because pop() will take the last (right-most) element
|
||||||
|
//def modeList = ['TesteNB', 'TestUE', 'TesteNB'].reverse()
|
||||||
|
|
||||||
|
// Global Parameters not to break the main.py command line and code.
|
||||||
|
def ADB_IPAddress = "none"
|
||||||
|
def ADB_Username = "none"
|
||||||
|
def ADB_Password = "none"
|
||||||
|
def EPC_IPAddress = "none"
|
||||||
|
def EPC_Username = "none"
|
||||||
|
def EPC_Password = "none"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
gitLabConnection('OAI GitLab')
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock (ciUSRPsResource)
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage ('Retrieve latest from branch') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
checkout([$class: 'GitSCM', branches: [[name: "${params.Branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'https://gitlab.eurecom.fr/oai/openairinterface5g.git']]])
|
||||||
|
sh "git clean -x -d -ff"
|
||||||
|
sh "git log -n1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("print latest commit info") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo "Building on: "
|
||||||
|
echo " Repository -- ${GIT_URL}"
|
||||||
|
echo " Branch -- ${GIT_BRANCH}"
|
||||||
|
echo " Commit -- ${GIT_COMMIT}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
JOB_TIMESTAMP = sh returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"'
|
||||||
|
JOB_TIMESTAMP = JOB_TIMESTAMP.trim()
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already too late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
if (params.eNB_Repository == null) {
|
||||||
|
eNB_Repository = GIT_URL
|
||||||
|
} else {
|
||||||
|
eNB_Repository = params.eNB_Repository
|
||||||
|
}
|
||||||
|
echo "eNB_Repository = ${eNB_Repository}"
|
||||||
|
if (params.eNB_Branch== null) {
|
||||||
|
eNB_Branch = GIT_BRANCH
|
||||||
|
} else {
|
||||||
|
eNB_Branch = params.eNB_Branch
|
||||||
|
}
|
||||||
|
echo "eNB_Branch = ${eNB_Branch}"
|
||||||
|
if (params.eNB_CommitID == null) {
|
||||||
|
eNB_CommitID = GIT_COMMIT
|
||||||
|
} else {
|
||||||
|
eNB_CommitID = params.eNB_CommitID
|
||||||
|
}
|
||||||
|
echo "eNB_CommitID = ${eNB_CommitID}"
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
} else {
|
||||||
|
testStageName = params.pipelineTestStageName
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.USRPsResource == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.eNB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.UE_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.UE_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
GIT_COMMIT_AUTHOR = sh (
|
||||||
|
script: 'git show -s --pretty=%an',
|
||||||
|
returnStdout: true
|
||||||
|
).trim()
|
||||||
|
echo "The author of the commit is: ${GIT_COMMIT_AUTHOR}"
|
||||||
|
GIT_COMMIT_EMAIL = sh (
|
||||||
|
script: 'git show -s --pretty=%ae',
|
||||||
|
returnStdout: true
|
||||||
|
).trim()
|
||||||
|
echo "The email of the author is: ${GIT_COMMIT_EMAIL}"
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Build and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/gnb_usrp_build.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNB_AllowMerge=${eNB_AllowMergeRequestProcess} --ADBIPAddress=${ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} ${mainPythonAllXmlFiles}"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --UEIPAddress=${params.eNB_IPAddress} --UEUserName=${eNB_Username} --UEPassword=${eNB_Password} --eNBBranch=${eNB_Branch} --eNBSourceCodePath=${params.eNB_SourceCodePath} --UESourceCodePath=${params.eNB_SourceCodePath} --eNBRepository=${eNB_Repository} --eNBCommitID=${eNB_CommitID} --ADBIPAddress=${ADB_IPAddress} --EPCIPAddress=${EPC_IPAddress} --XMLTestFile=${xmlFile}"
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Terminate") {
|
||||||
|
parallel {
|
||||||
|
stage('Terminate NR UE') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate NR UE\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateOAIUE --UEIPAddress=${params.eNB_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
termStatusArray[termUE] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate NR eNB') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate NR eNB\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateeNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
termStatusArray[termENB] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Log Collection') {
|
||||||
|
parallel {
|
||||||
|
stage('Log Collection (gNB and NR UE - Build)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (gNB and NR UE - Build)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectBuild --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (gNB and NR UE - Build)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/build.log.zip ./build.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("build.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "build.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (gNB - Run)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (gNB - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (gNB - Run)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("enb.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "enb.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("ci-scripts/test_results.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>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts "test_results-${JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (NR UE - Run)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (gNB - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectOAIUE --UEIPAddress=${params.eNB_IPAddress} --UEUserName=${eNB_Username} --UEPassword=${eNB_Password} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --UESourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (gNB - Run)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/ue.log.zip ./ue.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("ue.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "ue.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
echo "This is a MERGE event"
|
||||||
|
} else {
|
||||||
|
gitlabCommitStatus(name: "Test-gNB-nrUE") {
|
||||||
|
if ((currentBuild.result == null) || (currentBuild.result == 'SUCCESS')) {
|
||||||
|
echo "Setting the gitlab commit status to pass"
|
||||||
|
} else {
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emailext attachmentsPattern: '*results*.html',
|
||||||
|
body: '''Hi,
|
||||||
|
Here are attached HTML report files for $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
|
||||||
|
|
||||||
|
Regards,
|
||||||
|
OAI CI Team''',
|
||||||
|
replyTo: 'no-reply@openairinterface.org',
|
||||||
|
subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!',
|
||||||
|
to: GIT_COMMIT_EMAIL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): passed (" + BUILD_URL + ")"
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
echo "This is a MERGE event"
|
||||||
|
//addGitLabMRComment comment: message
|
||||||
|
def message2 = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): passed (" + BUILD_URL + ") -- MergeRequest #" + env.gitlabMergeRequestIid + " (" + env.gitlabMergeRequestTitle + ")"
|
||||||
|
sendSocialMediaMessage('ci-test', 'good', message2)
|
||||||
|
} else {
|
||||||
|
sendSocialMediaMessage('ci-test', 'good', message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ")"
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
echo "This is a MERGE event"
|
||||||
|
//addGitLabMRComment comment: message
|
||||||
|
def message2 = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ") -- MergeRequest #" + env.gitlabMergeRequestIid + " (" + env.gitlabMergeRequestTitle + ")"
|
||||||
|
sendSocialMediaMessage('ci-test', 'danger', message2)
|
||||||
|
} else {
|
||||||
|
sendSocialMediaMessage('ci-test', 'danger', message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,298 @@
|
|||||||
|
Active_gNBs = ( "gNB-Eurecom-5GNRBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
gNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
gNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_GNB";
|
||||||
|
|
||||||
|
gNB_name = "gNB-Eurecom-5GNRBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;});
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_gNODEB";
|
||||||
|
node_timing = "synch_to_ext_device";
|
||||||
|
node_synch_ref = 0;
|
||||||
|
frame_type = "TDD";
|
||||||
|
DL_prefix_type = "NORMAL";
|
||||||
|
UL_prefix_type = "NORMAL";
|
||||||
|
eutra_band = 78;
|
||||||
|
downlink_frequency = 3510000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 106;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 90;
|
||||||
|
rx_gain = 125;
|
||||||
|
MIB_subCarrierSpacingCommon = 30;
|
||||||
|
MIB_ssb_SubcarrierOffset = 0;
|
||||||
|
MIB_dmrs_TypeA_Position = 2;
|
||||||
|
pdcch_ConfigSIB1 = 0;
|
||||||
|
SIB1_frequencyOffsetSSB = "khz5";
|
||||||
|
SIB1_ssb_PeriodicityServingCell = 5;
|
||||||
|
SIB1_ss_PBCH_BlockPower = -60;
|
||||||
|
absoluteFrequencySSB = 0;
|
||||||
|
DL_FreqBandIndicatorNR = 15;
|
||||||
|
DL_absoluteFrequencyPointA = 15;
|
||||||
|
DL_offsetToCarrier = 15;
|
||||||
|
DL_SCS_SubcarrierSpacing = "kHz30";
|
||||||
|
DL_SCS_SpecificCarrier_k0 = 0;
|
||||||
|
DL_carrierBandwidth = 15;
|
||||||
|
DL_locationAndBandwidth = 15;
|
||||||
|
DL_BWP_SubcarrierSpacing = "kHz30";
|
||||||
|
DL_BWP_prefix_type = "NORMAL";
|
||||||
|
UL_FreqBandIndicatorNR = 15;
|
||||||
|
UL_absoluteFrequencyPointA = 13;
|
||||||
|
UL_additionalSpectrumEmission = 3;
|
||||||
|
UL_p_Max = -1;
|
||||||
|
UL_frequencyShift7p5khz = "TRUE";
|
||||||
|
UL_offsetToCarrier = 10;
|
||||||
|
UL_SCS_SubcarrierSpacing = "kHz30";
|
||||||
|
UL_SCS_SpecificCarrier_k0 = 0;
|
||||||
|
UL_carrierBandwidth = 15;
|
||||||
|
UL_locationAndBandwidth = 15;
|
||||||
|
UL_BWP_SubcarrierSpacing = "kHz30";
|
||||||
|
UL_BWP_prefix_type = "NORMAL";
|
||||||
|
UL_timeAlignmentTimerCommon = "infinity";
|
||||||
|
ServingCellConfigCommon_n_TimingAdvanceOffset = "n0"
|
||||||
|
ServingCellConfigCommon_ssb_PositionsInBurst_PR = 0x01;
|
||||||
|
ServingCellConfigCommon_ssb_periodicityServingCell = 10;
|
||||||
|
ServingCellConfigCommon_dmrs_TypeA_Position = 2;
|
||||||
|
NIA_SubcarrierSpacing = "kHz15";
|
||||||
|
ServingCellConfigCommon_ss_PBCH_BlockPower = -60;
|
||||||
|
referenceSubcarrierSpacing = "kHz15";
|
||||||
|
dl_UL_TransmissionPeriodicity = "ms0p5";
|
||||||
|
nrofDownlinkSlots = 10;
|
||||||
|
nrofDownlinkSymbols = 10;
|
||||||
|
nrofUplinkSlots = 10;
|
||||||
|
nrofUplinkSymbols = 10;
|
||||||
|
rach_totalNumberOfRA_Preambles = 63;
|
||||||
|
rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_choice = "oneEighth";
|
||||||
|
rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_oneEighth = 4;
|
||||||
|
rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_oneFourth = 8;
|
||||||
|
rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_oneHalf = 16;
|
||||||
|
rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_one = 24;
|
||||||
|
rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_two = 32;
|
||||||
|
rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_four = 8;
|
||||||
|
rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_eight = 4;
|
||||||
|
rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_sixteen = 2;
|
||||||
|
rach_groupBconfigured = "ENABLE";
|
||||||
|
rach_ra_Msg3SizeGroupA = 56;
|
||||||
|
rach_messagePowerOffsetGroupB = "dB0";
|
||||||
|
rach_numberOfRA_PreamblesGroupA = 32;
|
||||||
|
rach_ra_ContentionResolutionTimer = 8;
|
||||||
|
rsrp_ThresholdSSB = 64;
|
||||||
|
rsrp_ThresholdSSB_SUL = 64;
|
||||||
|
prach_RootSequenceIndex_choice = "l839";
|
||||||
|
prach_RootSequenceIndex_l839 = 0;
|
||||||
|
prach_RootSequenceIndex_l139 = 0;
|
||||||
|
prach_msg1_SubcarrierSpacing = "kHz30";
|
||||||
|
restrictedSetConfig = "unrestrictedSet";
|
||||||
|
msg3_transformPrecoding = "ENABLE";
|
||||||
|
prach_ConfigurationIndex = 10;
|
||||||
|
prach_msg1_FDM = "one";
|
||||||
|
prach_msg1_FrequencyStart = 10;
|
||||||
|
zeroCorrelationZoneConfig = 10;
|
||||||
|
preambleReceivedTargetPower = -150;
|
||||||
|
preambleTransMax = 6;
|
||||||
|
powerRampingStep = "dB0";
|
||||||
|
ra_ResponseWindow = 8;
|
||||||
|
groupHoppingEnabledTransformPrecoding = "ENABLE";
|
||||||
|
msg3_DeltaPreamble = 0;
|
||||||
|
p0_NominalWithGrant = 0;
|
||||||
|
PUSCH_TimeDomainResourceAllocation_k2 = 0;
|
||||||
|
PUSCH_TimeDomainResourceAllocation_mappingType = "typeA";
|
||||||
|
PUSCH_TimeDomainResourceAllocation_startSymbolAndLength = 0;
|
||||||
|
pucch_ResourceCommon = 0;
|
||||||
|
pucch_GroupHopping = "neither";
|
||||||
|
hoppingId = 0;
|
||||||
|
p0_nominal = -30;
|
||||||
|
PDSCH_TimeDomainResourceAllocation_k0 = 2;
|
||||||
|
PDSCH_TimeDomainResourceAllocation_mappingType = "typeA";
|
||||||
|
PDSCH_TimeDomainResourceAllocation_startSymbolAndLength = 0;
|
||||||
|
rateMatchPatternId = 0;
|
||||||
|
RateMatchPattern_patternType = "bitmaps";
|
||||||
|
symbolsInResourceBlock = "oneSlot";
|
||||||
|
periodicityAndPattern = 2;
|
||||||
|
RateMatchPattern_controlResourceSet = 5;
|
||||||
|
RateMatchPattern_subcarrierSpacing = "kHz30";
|
||||||
|
RateMatchPattern_mode = "dynamic";
|
||||||
|
controlResourceSetZero = 0;
|
||||||
|
searchSpaceZero = 0;
|
||||||
|
searchSpaceSIB1 = 10;
|
||||||
|
searchSpaceOtherSystemInformation = 10;
|
||||||
|
pagingSearchSpace = 10;
|
||||||
|
ra_SearchSpace = 10;
|
||||||
|
PDCCH_common_controlResourceSetId = 5;
|
||||||
|
PDCCH_common_ControlResourceSet_duration = 2;
|
||||||
|
PDCCH_cce_REG_MappingType = "nonInterleaved";
|
||||||
|
PDCCH_reg_BundleSize = 3;
|
||||||
|
PDCCH_interleaverSize = 3;
|
||||||
|
PDCCH_shiftIndex = 10;
|
||||||
|
PDCCH_precoderGranularity = "sameAsREG-bundle";
|
||||||
|
PDCCH_TCI_StateId = 32;
|
||||||
|
tci_PresentInDCI = "ENABLE";
|
||||||
|
PDCCH_DMRS_ScramblingID = 0;
|
||||||
|
SearchSpaceId = 10;
|
||||||
|
commonSearchSpaces_controlResourceSetId = 5;
|
||||||
|
SearchSpace_monitoringSlotPeriodicityAndOffset_choice = "sl1";
|
||||||
|
SearchSpace_monitoringSlotPeriodicityAndOffset_value = 0;
|
||||||
|
SearchSpace_duration = 2;
|
||||||
|
SearchSpace_nrofCandidates_aggregationLevel1 = 0;
|
||||||
|
SearchSpace_nrofCandidates_aggregationLevel2 = 0;
|
||||||
|
SearchSpace_nrofCandidates_aggregationLevel4 = 0;
|
||||||
|
SearchSpace_nrofCandidates_aggregationLevel8 = 0;
|
||||||
|
SearchSpace_nrofCandidates_aggregationLevel16 = 0;
|
||||||
|
SearchSpace_searchSpaceType = "common";
|
||||||
|
Common_dci_Format2_0_nrofCandidates_SFI_aggregationLevel1 = 1;
|
||||||
|
Common_dci_Format2_0_nrofCandidates_SFI_aggregationLevel2 = 1;
|
||||||
|
Common_dci_Format2_0_nrofCandidates_SFI_aggregationLevel4 = 1;
|
||||||
|
Common_dci_Format2_0_nrofCandidates_SFI_aggregationLevel8 = 1;
|
||||||
|
Common_dci_Format2_0_nrofCandidates_SFI_aggregationLevel16 = 1;
|
||||||
|
Common_dci_Format2_3_monitoringPeriodicity = 1;
|
||||||
|
Common_dci_Format2_3_nrofPDCCH_Candidates = 1;
|
||||||
|
ue_Specific__dci_Formats = "formats0-0-And-1-0";
|
||||||
|
RateMatchPatternLTE_CRS_carrierFreqDL = 6;
|
||||||
|
RateMatchPatternLTE_CRS_carrierBandwidthDL = 6;
|
||||||
|
RateMatchPatternLTE_CRS_nrofCRS_Ports = 1;
|
||||||
|
RateMatchPatternLTE_CRS_v_Shift = 0;
|
||||||
|
RateMatchPatternLTE_CRS_radioframeAllocationPeriod = 1;
|
||||||
|
RateMatchPatternLTE_CRS_radioframeAllocationOffset = 0;
|
||||||
|
RateMatchPatternLTE_CRS_subframeAllocation_choice = "oneFrame";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
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 = "192.168.12.26";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
|
||||||
|
GNB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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 = 114;
|
||||||
|
eNB_instances = [0];
|
||||||
|
sdr_addrs = "addr=192.168.20.2,second_addr=192.168.10.2,mgmt_addr=192.168.20.2,clock_source=external,time_source=external";
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
|
||||||
+853
-83
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,64 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>run-OAI-gNB-NR-UE-USRP</htmlTabRef>
|
||||||
|
<htmlTabName>run OAI gNB and OAI NR UE USRP</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
090101 000001 090102 000001 090108 090109
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="090101">
|
||||||
|
<class>Initialize_OAI_eNB</class>
|
||||||
|
<desc>Initialize gNB USRP</desc>
|
||||||
|
<Initialize_OAI_eNB_args>-O ../../../ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf</Initialize_OAI_eNB_args>
|
||||||
|
<air_interface>NR</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="090102">
|
||||||
|
<class>Initialize_OAI_UE</class>
|
||||||
|
<desc>Initialize NR UE USRP</desc>
|
||||||
|
<Initialize_OAI_UE_args>-C 3510000000 --numerology 1 -r 106 --phy-test --usrp-args "addr=192.168.30.2,clock_source=external,time_source=external" --threadoffset 16</Initialize_OAI_UE_args>
|
||||||
|
<air_interface>NR</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="090108">
|
||||||
|
<class>Terminate_OAI_UE</class>
|
||||||
|
<desc>Terminate NR UE</desc>
|
||||||
|
<air_interface>NR</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="090109">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate gNB</desc>
|
||||||
|
<air_interface>NR</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>gnb-build-tab</htmlTabRef>
|
||||||
|
<htmlTabName>Build-gNB</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010101
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010101">
|
||||||
|
<mode>TesteNB</mode>
|
||||||
|
<class>Build_eNB</class>
|
||||||
|
<desc>Build gNB (USRP)</desc>
|
||||||
|
<Build_eNB_args>--gNB -w USRP</Build_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>nr-ue-build-tab</htmlTabRef>
|
||||||
|
<htmlTabName>Build-NR-UE</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010102
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010102">
|
||||||
|
<mode>TestUE</mode>
|
||||||
|
<class>Build_OAI_UE</class>
|
||||||
|
<desc>Build NR UE (USRP)</desc>
|
||||||
|
<Build_OAI_UE_args>--nrUE -w USRP</Build_OAI_UE_args>
|
||||||
|
<clean_repository>false</clean_repository>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -134,7 +134,6 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
NR_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0;
|
NR_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0;
|
||||||
|
|
||||||
uint8_t beamforming_mode;
|
uint8_t beamforming_mode;
|
||||||
uint32_t *rballoc;
|
|
||||||
|
|
||||||
int32_t **rxdataF_comp_ptr;
|
int32_t **rxdataF_comp_ptr;
|
||||||
int32_t **dl_ch_mag_ptr;
|
int32_t **dl_ch_mag_ptr;
|
||||||
@@ -265,25 +264,14 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((frame_parms->Ncp == NORMAL) && (symbol>=7)) ||
|
if (dlsch0_harq->mimo_mode>NR_DUALSTREAM) {
|
||||||
((frame_parms->Ncp == EXTENDED) && (symbol>=6)))
|
|
||||||
rballoc = dlsch0_harq->rb_alloc_odd;
|
|
||||||
else
|
|
||||||
rballoc = dlsch0_harq->rb_alloc_even;
|
|
||||||
|
|
||||||
|
|
||||||
if (dlsch0_harq->mimo_mode>DUALSTREAM_PUSCH_PRECODING) {
|
|
||||||
LOG_E(PHY,"This transmission mode is not yet supported!\n");
|
LOG_E(PHY,"This transmission mode is not yet supported!\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((dlsch0_harq->mimo_mode==LARGE_CDD) || ((dlsch0_harq->mimo_mode>=DUALSTREAM_UNIFORM_PRECODING1) && (dlsch0_harq->mimo_mode<=DUALSTREAM_PUSCH_PRECODING))) {
|
if (dlsch0_harq->mimo_mode==NR_DUALSTREAM) {
|
||||||
DevAssert(dlsch1_harq);
|
DevAssert(dlsch1_harq);
|
||||||
if (eNB_id!=eNB_id_i) {
|
|
||||||
LOG_E(PHY,"TM3/TM4 requires to set eNB_id==eNB_id_i!\n");
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
@@ -376,46 +364,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
ue->high_speed_flag,
|
ue->high_speed_flag,
|
||||||
frame_parms);
|
frame_parms);
|
||||||
|
|
||||||
|
} /*else if(beamforming_mode>7) {
|
||||||
/*
|
|
||||||
if (rx_type==rx_IC_single_stream) {
|
|
||||||
if (eNB_id_i<ue->n_connected_eNB)
|
|
||||||
nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
|
|
||||||
common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].dl_ch_estimates[eNB_id_i],
|
|
||||||
pdsch_vars[eNB_id_i]->rxdataF_ext,
|
|
||||||
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
|
|
||||||
dlsch0_harq->pmi_alloc,
|
|
||||||
pdsch_vars[eNB_id_i]->pmi_ext,
|
|
||||||
rballoc,
|
|
||||||
symbol,
|
|
||||||
nr_tti_rx,
|
|
||||||
ue->high_speed_flag,
|
|
||||||
frame_parms);
|
|
||||||
else
|
|
||||||
nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
|
|
||||||
common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].dl_ch_estimates[eNB_id],
|
|
||||||
pdsch_vars[eNB_id_i]->rxdataF_ext,
|
|
||||||
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
|
|
||||||
dlsch0_harq->pmi_alloc,
|
|
||||||
pdsch_vars[eNB_id_i]->pmi_ext,
|
|
||||||
rballoc,
|
|
||||||
symbol,
|
|
||||||
nr_tti_rx,
|
|
||||||
ue->high_speed_flag,
|
|
||||||
frame_parms);
|
|
||||||
}*/
|
|
||||||
} /*else if (beamforming_mode==7) { //else if beamforming_mode == 7
|
|
||||||
nb_rb = dlsch_extract_rbs_TM7(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
|
|
||||||
pdsch_vars[eNB_id]->dl_bf_ch_estimates,
|
|
||||||
pdsch_vars[eNB_id]->rxdataF_ext,
|
|
||||||
pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext,
|
|
||||||
rballoc,
|
|
||||||
symbol,
|
|
||||||
nr_tti_rx,
|
|
||||||
ue->high_speed_flag,
|
|
||||||
frame_parms);
|
|
||||||
|
|
||||||
} else if(beamforming_mode>7) {
|
|
||||||
LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n");
|
LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n");
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
@@ -451,20 +400,6 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pilots,
|
pilots,
|
||||||
nb_rb);
|
nb_rb);
|
||||||
|
|
||||||
if ((dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) &&
|
|
||||||
(rx_type==rx_IC_single_stream) &&
|
|
||||||
(eNB_id_i==ue->n_connected_eNB) &&
|
|
||||||
(dlsch0_harq->dl_power_off==0)
|
|
||||||
) // TM5 two-user
|
|
||||||
{
|
|
||||||
nr_dlsch_scale_channel(pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
|
|
||||||
frame_parms,
|
|
||||||
dlsch,
|
|
||||||
symbol,
|
|
||||||
pilots,
|
|
||||||
nb_rb);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
||||||
#if DISABLE_LOG_X
|
#if DISABLE_LOG_X
|
||||||
@@ -479,7 +414,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
#endif
|
#endif
|
||||||
if (first_symbol_flag==1) {
|
if (first_symbol_flag==1) {
|
||||||
if (beamforming_mode==0){
|
if (beamforming_mode==0){
|
||||||
if (dlsch0_harq->mimo_mode<LARGE_CDD) {
|
if (dlsch0_harq->mimo_mode<NR_DUALSTREAM) {
|
||||||
nr_dlsch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
nr_dlsch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
avg,
|
avg,
|
||||||
@@ -493,9 +428,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2)+1;
|
pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2)+1;
|
||||||
}
|
}
|
||||||
else if ((dlsch0_harq->mimo_mode == LARGE_CDD) ||
|
else if (dlsch0_harq->mimo_mode == NR_DUALSTREAM)
|
||||||
((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
|
|
||||||
(dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING)))
|
|
||||||
{
|
{
|
||||||
nr_dlsch_channel_level_median(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
nr_dlsch_channel_level_median(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||||
median,
|
median,
|
||||||
@@ -514,54 +447,16 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1; // this might need to be tuned
|
pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1; // this might need to be tuned
|
||||||
|
|
||||||
}/*
|
}
|
||||||
else if (dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding (TM5, TM6)
|
|
||||||
if ((rx_type==rx_IC_single_stream) && (eNB_id_i==ue->n_connected_eNB) && (dlsch0_harq->dl_power_off==0)) {
|
|
||||||
dlsch_channel_level_TM56(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
|
||||||
frame_parms,
|
|
||||||
pdsch_vars[eNB_id]->pmi_ext,
|
|
||||||
avg,
|
|
||||||
symbol,
|
|
||||||
nb_rb);
|
|
||||||
avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1];
|
|
||||||
pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (dlsch0_harq->dl_power_off==1) { //TM6
|
|
||||||
|
|
||||||
nr_dlsch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
|
||||||
frame_parms,
|
|
||||||
avg,
|
|
||||||
symbol,
|
|
||||||
nb_rb);
|
|
||||||
|
|
||||||
avgs = 0;
|
|
||||||
for (aatx=0;aatx<frame_parms->nb_antenna_ports_eNB;aatx++)
|
|
||||||
for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
|
|
||||||
avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
|
|
||||||
|
|
||||||
pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1;
|
|
||||||
pdsch_vars[eNB_id]->log2_maxh++;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (beamforming_mode==7)
|
#ifdef UE_DEBUG_TRACE
|
||||||
dlsch_channel_level_TM7(pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext,
|
|
||||||
frame_parms,
|
|
||||||
avg,
|
|
||||||
symbol,
|
|
||||||
nb_rb);*/
|
|
||||||
}
|
|
||||||
//#ifdef UE_DEBUG_TRACE
|
|
||||||
LOG_I(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",
|
LOG_I(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",
|
||||||
frame%1024,nr_tti_rx, pdsch_vars[eNB_id]->log2_maxh,
|
frame%1024,nr_tti_rx, pdsch_vars[eNB_id]->log2_maxh,
|
||||||
pdsch_vars[eNB_id]->log2_maxh0,
|
pdsch_vars[eNB_id]->log2_maxh0,
|
||||||
pdsch_vars[eNB_id]->log2_maxh1,
|
pdsch_vars[eNB_id]->log2_maxh1,
|
||||||
avg[0],avgs);
|
avg[0],avgs);
|
||||||
//LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
|
//LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
|
||||||
//#endif
|
#endif
|
||||||
|
|
||||||
//wait until pdcch is decoded
|
//wait until pdcch is decoded
|
||||||
//proc->channel_level = 1;
|
//proc->channel_level = 1;
|
||||||
@@ -598,7 +493,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
||||||
#endif
|
#endif
|
||||||
// Now channel compensation
|
// Now channel compensation
|
||||||
if (dlsch0_harq->mimo_mode<LARGE_CDD) {
|
if (dlsch0_harq->mimo_mode<NR_DUALSTREAM) {
|
||||||
nr_dlsch_channel_compensation(pdsch_vars[eNB_id]->rxdataF_ext,
|
nr_dlsch_channel_compensation(pdsch_vars[eNB_id]->rxdataF_ext,
|
||||||
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||||
pdsch_vars[eNB_id]->dl_ch_mag0,
|
pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||||
@@ -649,8 +544,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
else if ((dlsch0_harq->mimo_mode == LARGE_CDD) || ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
|
else if (dlsch0_harq->mimo_mode == NR_DUALSTREAM){
|
||||||
(dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){
|
|
||||||
nr_dlsch_channel_compensation_core(pdsch_vars[eNB_id]->rxdataF_ext,
|
nr_dlsch_channel_compensation_core(pdsch_vars[eNB_id]->rxdataF_ext,
|
||||||
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||||
pdsch_vars[eNB_id]->dl_ch_mag0,
|
pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||||
@@ -712,9 +606,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (frame_parms->nb_antennas_rx > 1) {
|
if (frame_parms->nb_antennas_rx > 1) {
|
||||||
if ((dlsch0_harq->mimo_mode == LARGE_CDD) ||
|
if (dlsch0_harq->mimo_mode == NR_DUALSTREAM){
|
||||||
((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
|
|
||||||
(dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){ // TM3 or TM4
|
|
||||||
nr_dlsch_detection_mrc_core(pdsch_vars[eNB_id]->rxdataF_comp0,
|
nr_dlsch_detection_mrc_core(pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||||
NULL,
|
NULL,
|
||||||
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
||||||
@@ -733,33 +625,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
} */
|
} */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
// printf("Combining");
|
|
||||||
if ((dlsch0_harq->mimo_mode == SISO) ||
|
|
||||||
((dlsch0_harq->mimo_mode >= UNIFORM_PRECODING11) &&
|
|
||||||
(dlsch0_harq->mimo_mode <= PUSCH_PRECODING0)) ||
|
|
||||||
(dlsch0_harq->mimo_mode == TM7)) {
|
|
||||||
/*
|
|
||||||
dlsch_siso(frame_parms,
|
|
||||||
pdsch_vars[eNB_id]->rxdataF_comp,
|
|
||||||
pdsch_vars[eNB_id_i]->rxdataF_comp,
|
|
||||||
symbol,
|
|
||||||
nb_rb);
|
|
||||||
*/
|
|
||||||
} else if (dlsch0_harq->mimo_mode == ALAMOUTI) {
|
|
||||||
dlsch_alamouti(frame_parms,
|
|
||||||
pdsch_vars[eNB_id]->rxdataF_comp0,
|
|
||||||
pdsch_vars[eNB_id]->dl_ch_mag0,
|
|
||||||
pdsch_vars[eNB_id]->dl_ch_magb0,
|
|
||||||
symbol,
|
|
||||||
nb_rb);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//printf("start compute LLR\n");
|
//printf("start compute LLR\n");
|
||||||
if ((dlsch0_harq->mimo_mode == LARGE_CDD) ||
|
if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
|
||||||
((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
|
|
||||||
(dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))) {
|
|
||||||
rxdataF_comp_ptr = pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round];
|
rxdataF_comp_ptr = pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round];
|
||||||
dl_ch_mag_ptr = pdsch_vars[eNB_id]->dl_ch_mag1[harq_pid][round];
|
dl_ch_mag_ptr = pdsch_vars[eNB_id]->dl_ch_mag1[harq_pid][round];
|
||||||
}
|
}
|
||||||
@@ -1989,7 +1857,7 @@ void nr_dlsch_channel_level(int **dl_ch_estimates_ext,
|
|||||||
#if defined(__x86_64__)||defined(__i386__)
|
#if defined(__x86_64__)||defined(__i386__)
|
||||||
|
|
||||||
short rb;
|
short rb;
|
||||||
unsigned char aatx,aarx,nre=12;
|
unsigned char aatx,aarx;
|
||||||
__m128i *dl_ch128, avg128D;
|
__m128i *dl_ch128, avg128D;
|
||||||
|
|
||||||
//nb_rb*nre = y * 2^x
|
//nb_rb*nre = y * 2^x
|
||||||
|
|||||||
@@ -822,11 +822,11 @@ void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
pllr_symbol += llr_offset;
|
pllr_symbol += llr_offset;
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
|
ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*nb_rb*12)];
|
||||||
ch_magb = (__m128i*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)];
|
ch_magb = (__m128i*)&dl_ch_magb[0][(symbol*nb_rb*12)];
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
|
ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*nb_rb*12)];
|
||||||
ch_magb = (int16x8_t*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)];
|
ch_magb = (int16x8_t*)&dl_ch_magb[0][(symbol*nb_rb*12)];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// printf("nr_dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
|
// printf("nr_dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ typedef struct {
|
|||||||
/// Redundancy-version of the current sub-frame
|
/// Redundancy-version of the current sub-frame
|
||||||
uint8_t rvidx;
|
uint8_t rvidx;
|
||||||
/// MIMO mode for this DLSCH
|
/// MIMO mode for this DLSCH
|
||||||
MIMO_mode_t mimo_mode;
|
MIMO_nrmode_t mimo_mode;
|
||||||
/// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
|
/// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
|
||||||
int16_t w[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448];
|
int16_t w[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448];
|
||||||
/// for abstraction soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
|
/// for abstraction soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
|
||||||
|
|||||||
@@ -704,6 +704,11 @@ typedef enum {
|
|||||||
TM9_10=14
|
TM9_10=14
|
||||||
} MIMO_mode_t;
|
} MIMO_mode_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NR_SISO=0,
|
||||||
|
NR_DUALSTREAM=1
|
||||||
|
} MIMO_nrmode_t;
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
/// MRT
|
/// MRT
|
||||||
|
|||||||
@@ -1238,6 +1238,8 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
// wait for end of program
|
// wait for end of program
|
||||||
printf("TYPE <CTRL-C> TO TERMINATE\n");
|
printf("TYPE <CTRL-C> TO TERMINATE\n");
|
||||||
|
fflush(stdout);
|
||||||
|
fflush(stderr);
|
||||||
//getchar();
|
//getchar();
|
||||||
|
|
||||||
#if defined(ENABLE_ITTI)
|
#if defined(ENABLE_ITTI)
|
||||||
|
|||||||
Reference in New Issue
Block a user