Merge remote-tracking branch 'origin/signal-delay' into ru_rau_enhancement_L1_renaming
Conflicts: openair1/PHY/defs_eNB.h openair1/SCHED/fapi_l1.c openair1/SCHED/phy_procedures_lte_eNb.c openair1/SCHED/prach_procedures.c openair2/LAYER2/MAC/eNB_scheduler.c openair2/LAYER2/MAC/eNB_scheduler_RA.c openair2/LAYER2/MAC/eNB_scheduler_primitives.c targets/RT/USER/lte-enb.c targets/RT/USER/lte-ru.c targets/RT/USER/lte-softmodem.c targets/RT/USER/lte-uesoftmodem.c
This commit is contained in:
+111
-218
@@ -178,14 +178,6 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ("Start VM -- L2-Sim") {
|
|
||||||
steps {
|
|
||||||
timeout (time: 5, unit: 'MINUTES') {
|
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant l2-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage ("Start VM -- phy-sim") {
|
stage ("Start VM -- phy-sim") {
|
||||||
steps {
|
steps {
|
||||||
timeout (time: 5, unit: 'MINUTES') {
|
timeout (time: 5, unit: 'MINUTES') {
|
||||||
@@ -235,7 +227,7 @@ pipeline {
|
|||||||
steps {
|
steps {
|
||||||
gitlabCommitStatus(name: "Build eNb-ethernet") {
|
gitlabCommitStatus(name: "Build eNb-ethernet") {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 20, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -244,20 +236,11 @@ pipeline {
|
|||||||
steps {
|
steps {
|
||||||
gitlabCommitStatus(name: "Build UE-ethernet") {
|
gitlabCommitStatus(name: "Build UE-ethernet") {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 20, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Build L2-Simulator-eNB") {
|
|
||||||
steps {
|
|
||||||
//gitlabCommitStatus(name: "Build UE-ethernet") {
|
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant l2-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
|
||||||
}
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ("Build physical simulators") {
|
stage ("Build physical simulators") {
|
||||||
steps {
|
steps {
|
||||||
gitlabCommitStatus(name: "Build phy-sim") {
|
gitlabCommitStatus(name: "Build phy-sim") {
|
||||||
@@ -388,6 +371,36 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage ("Test L1 simulator") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
|
try {
|
||||||
|
gitlabCommitStatus(name: "Test L1-sim") {
|
||||||
|
sh "./ci-scripts/oai-ci-vm-tool test --workspace $WORKSPACE --variant l1-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Test RF simulator") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
|
try {
|
||||||
|
gitlabCommitStatus(name: "Test RF-sim") {
|
||||||
|
sh "./ci-scripts/oai-ci-vm-tool test --workspace $WORKSPACE --variant rf-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
stage ("Test L2 simulator") {
|
stage ("Test L2 simulator") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
@@ -408,44 +421,13 @@ pipeline {
|
|||||||
stage ("Test MONOLITHIC - FDD - Band 7 - B210") {
|
stage ("Test MONOLITHIC - FDD - Band 7 - B210") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
if ("MERGE".equals(env.gitlabActionType)) {
|
triggerSlaveJob ('eNB-CI-FDD-Band7-B210', 'Test-Mono-FDD-Band7')
|
||||||
gitlabCommitStatus(name: "Test-Mono-FDD-Band7") {
|
|
||||||
build job: 'eNB-CI-FDD-Band7-B210',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: true),
|
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
|
||||||
]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
gitlabCommitStatus(name: "Test-Mono-FDD-Band7") {
|
|
||||||
build job: 'eNB-CI-FDD-Band7-B210',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: false)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
// In case of any non-success, we are retrieving the HTML report of the last completed
|
|
||||||
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
|
|
||||||
always {
|
always {
|
||||||
script {
|
script {
|
||||||
if (!fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
|
finalizeSlaveJob('eNB-CI-FDD-Band7-B210')
|
||||||
copyArtifacts(projectName: 'eNB-CI-FDD-Band7-B210',
|
|
||||||
filter: 'test_results*.html',
|
|
||||||
selector: lastCompleted())
|
|
||||||
if (fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
|
|
||||||
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' test_results-eNB-CI-FDD-Band7-B210.html"
|
|
||||||
archiveArtifacts artifacts: 'test_results-eNB-CI-FDD-Band7-B210.html'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
@@ -458,44 +440,13 @@ pipeline {
|
|||||||
stage ("Test MONOLITHIC - TDD - Band 40 - B210") {
|
stage ("Test MONOLITHIC - TDD - Band 40 - B210") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
if ("MERGE".equals(env.gitlabActionType)) {
|
triggerSlaveJob ('eNB-CI-TDD-Band40-B210', 'Test-Mono-TDD-Band40')
|
||||||
gitlabCommitStatus(name: "Test-Mono-TDD-Band40") {
|
|
||||||
build job: 'eNB-CI-TDD-Band40-B210',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: true),
|
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
|
||||||
]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
gitlabCommitStatus(name: "Test-Mono-TDD-Band40") {
|
|
||||||
build job: 'eNB-CI-TDD-Band40-B210',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: false)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
// In case of any non-success, we are retrieving the HTML report of the last completed
|
|
||||||
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
|
|
||||||
always {
|
always {
|
||||||
script {
|
script {
|
||||||
if (!fileExists('test_results-eNB-CI-TDD-Band40-B210.html')) {
|
finalizeSlaveJob('eNB-CI-TDD-Band40-B210')
|
||||||
copyArtifacts(projectName: 'eNB-CI-TDD-Band40-B210',
|
|
||||||
filter: 'test_results*.html',
|
|
||||||
selector: lastCompleted())
|
|
||||||
if (fileExists('test_results-eNB-CI-TDD-Band40-B210.html')) {
|
|
||||||
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' test_results-eNB-CI-TDD-Band40-B210.html"
|
|
||||||
archiveArtifacts artifacts: 'test_results-eNB-CI-TDD-Band40-B210.html'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
@@ -508,44 +459,13 @@ pipeline {
|
|||||||
stage ("Test IF4p5 - FDD - Band 7 - B210") {
|
stage ("Test IF4p5 - FDD - Band 7 - B210") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
if ("MERGE".equals(env.gitlabActionType)) {
|
triggerSlaveJob ('eNB-CI-IF4p5-FDD-Band7-B210', 'Test-IF4p5-FDD-Band7')
|
||||||
gitlabCommitStatus(name: "Test-IF4p5-FDD-Band7") {
|
|
||||||
build job: 'eNB-CI-IF4p5-FDD-Band7-B210',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: true),
|
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
|
||||||
]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
gitlabCommitStatus(name: "Test-IF4p5-FDD-Band7") {
|
|
||||||
build job: 'eNB-CI-IF4p5-FDD-Band7-B210',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: false)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
// In case of any non-success, we are retrieving the HTML report of the last completed
|
|
||||||
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
|
|
||||||
always {
|
always {
|
||||||
script {
|
script {
|
||||||
if (!fileExists('test_results-eNB-CI-IF4p5-FDD-Band7-B210.html')) {
|
finalizeSlaveJob('eNB-CI-IF4p5-FDD-Band7-B210')
|
||||||
copyArtifacts(projectName: 'eNB-CI-IF4p5-FDD-Band7-B210',
|
|
||||||
filter: 'test_results*.html',
|
|
||||||
selector: lastCompleted())
|
|
||||||
if (fileExists('test_results-eNB-CI-IF4p5-FDD-Band7-B210.html')) {
|
|
||||||
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' test_results-eNB-CI-IF4p5-FDD-Band7-B210.html"
|
|
||||||
archiveArtifacts artifacts: 'test_results-eNB-CI-IF4p5-FDD-Band7-B210.html'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
@@ -558,44 +478,13 @@ pipeline {
|
|||||||
stage ("Test IF4p5 - TDD - Band 40 - B210") {
|
stage ("Test IF4p5 - TDD - Band 40 - B210") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
if ("MERGE".equals(env.gitlabActionType)) {
|
triggerSlaveJob ('eNB-CI-IF4p5-TDD-Band40-B210', 'Test-IF4p5-TDD-Band40')
|
||||||
gitlabCommitStatus(name: "Test-IF4p5-TDD-Band40") {
|
|
||||||
build job: 'eNB-CI-IF4p5-TDD-Band40-B210',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: true),
|
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
|
||||||
]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
gitlabCommitStatus(name: "Test-IF4p5-TDD-Band40") {
|
|
||||||
build job: 'eNB-CI-IF4p5-TDD-Band40-B210',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: false)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
// In case of any non-success, we are retrieving the HTML report of the last completed
|
|
||||||
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
|
|
||||||
always {
|
always {
|
||||||
script {
|
script {
|
||||||
if (!fileExists('test_results-eNB-CI-IF4p5-TDD-Band40-B210.html')) {
|
finalizeSlaveJob('eNB-CI-IF4p5-TDD-Band40-B210')
|
||||||
copyArtifacts(projectName: 'eNB-CI-IF4p5-TDD-Band40-B210',
|
|
||||||
filter: 'test_results*.html',
|
|
||||||
selector: lastCompleted())
|
|
||||||
if (fileExists('test_results-eNB-CI-IF4p5-TDD-Band40-B210.html')) {
|
|
||||||
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' test_results-eNB-CI-IF4p5-TDD-Band40-B210.html"
|
|
||||||
archiveArtifacts artifacts: 'test_results-eNB-CI-IF4p5-TDD-Band40-B210.html'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
@@ -608,44 +497,13 @@ pipeline {
|
|||||||
stage ("Test MONOLITHIC - FDD - Band 13 - B210") {
|
stage ("Test MONOLITHIC - FDD - Band 13 - B210") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
if ("MERGE".equals(env.gitlabActionType)) {
|
triggerSlaveJob ('eNB-CI-MONO-FDD-Band13-B210', 'Test-Mono-FDD-Band13')
|
||||||
gitlabCommitStatus(name: "Test-Mono-FDD-Band13") {
|
|
||||||
build job: 'eNB-CI-MONO-FDD-Band13-B210',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: true),
|
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
|
||||||
]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
gitlabCommitStatus(name: "Test-Mono-FDD-Band13") {
|
|
||||||
build job: 'eNB-CI-MONO-FDD-Band13-B210',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: false)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
// In case of any non-success, we are retrieving the HTML report of the last completed
|
|
||||||
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
|
|
||||||
always {
|
always {
|
||||||
script {
|
script {
|
||||||
if (!fileExists('test_results-eNB-CI-MONO-FDD-Band13-B210.html')) {
|
finalizeSlaveJob('eNB-CI-MONO-FDD-Band13-B210')
|
||||||
copyArtifacts(projectName: 'eNB-CI-MONO-FDD-Band13-B210',
|
|
||||||
filter: 'test_results*.html',
|
|
||||||
selector: lastCompleted())
|
|
||||||
if (fileExists('test_results-eNB-CI-MONO-FDD-Band13-B210.html')) {
|
|
||||||
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' test_results-eNB-CI-MONO-FDD-Band13-B210.html"
|
|
||||||
archiveArtifacts artifacts: 'test_results-eNB-CI-MONO-FDD-Band13-B210.html'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
@@ -655,47 +513,19 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Test OAI UE Sniffing - FDD - Band 20 - B200") {
|
stage ("Test OAI UE - FDD - Bands 20/7 - B200") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
if ("MERGE".equals(env.gitlabActionType)) {
|
triggerSlaveJobNoGitLab ('UE-CI-FDD-Band20-B200')
|
||||||
//gitlabCommitStatus(name: "Test-OAI-UE-FDD-Band20") {
|
// calling a second job sequentially
|
||||||
build job: 'UE-CI-FDD-Band20-B200',
|
triggerSlaveJob ('eNB-UE-CI-MONO-FDD-Band7-B200', 'Test-eNB-OAI-UE-FDD-Band7')
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: true),
|
|
||||||
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
|
||||||
]
|
|
||||||
//}
|
|
||||||
} else {
|
|
||||||
//gitlabCommitStatus(name: "Test-OAI-UE-FDD-Band20") {
|
|
||||||
build job: 'UE-CI-FDD-Band20-B200',
|
|
||||||
parameters: [
|
|
||||||
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
|
||||||
string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
|
|
||||||
string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
|
|
||||||
booleanParam(name: 'eNB_mergeRequest', value: false)
|
|
||||||
]
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
// In case of any non-success, we are retrieving the HTML report of the last completed
|
|
||||||
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
|
|
||||||
always {
|
always {
|
||||||
script {
|
script {
|
||||||
if (!fileExists('test_results-UE-CI-FDD-Band20-B200.html')) {
|
finalizeSlaveJob('UE-CI-FDD-Band20-B200')
|
||||||
copyArtifacts(projectName: 'UE-CI-FDD-Band20-B200',
|
finalizeSlaveJob('eNB-UE-CI-MONO-FDD-Band7-B200')
|
||||||
filter: 'test_results*.html',
|
|
||||||
selector: lastCompleted())
|
|
||||||
if (fileExists('test_results-UE-CI-FDD-Band20-B200.html')) {
|
|
||||||
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' test_results-UE-CI-FDD-Band20-B200.html"
|
|
||||||
archiveArtifacts artifacts: 'test_results-UE-CI-FDD-Band20-B200.html'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
@@ -783,3 +613,66 @@ OAI CI Team''',
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---- Slave Job functions
|
||||||
|
|
||||||
|
def triggerSlaveJob (jobName, gitlabStatusName) {
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
gitlabCommitStatus(name: gitlabStatusName) {
|
||||||
|
build job: jobName,
|
||||||
|
parameters: [
|
||||||
|
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
||||||
|
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
||||||
|
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
||||||
|
booleanParam(name: 'eNB_mergeRequest', value: true),
|
||||||
|
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
||||||
|
]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gitlabCommitStatus(name: gitlabStatusName) {
|
||||||
|
build job: jobName,
|
||||||
|
parameters: [
|
||||||
|
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
||||||
|
string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
|
||||||
|
string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
|
||||||
|
booleanParam(name: 'eNB_mergeRequest', value: false)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def triggerSlaveJobNoGitLab (jobName) {
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
build job: jobName,
|
||||||
|
parameters: [
|
||||||
|
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
||||||
|
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
||||||
|
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
||||||
|
booleanParam(name: 'eNB_mergeRequest', value: true),
|
||||||
|
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
||||||
|
]
|
||||||
|
} else {
|
||||||
|
build job: jobName,
|
||||||
|
parameters: [
|
||||||
|
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
||||||
|
string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
|
||||||
|
string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
|
||||||
|
booleanParam(name: 'eNB_mergeRequest', value: false)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def finalizeSlaveJob(jobName) {
|
||||||
|
// In case of any non-success, we are retrieving the HTML report of the last completed
|
||||||
|
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
|
||||||
|
fileName = "test_results-${jobName}.html"
|
||||||
|
if (!fileExists(fileName)) {
|
||||||
|
copyArtifacts(projectName: jobName,
|
||||||
|
filter: 'test_results*.html',
|
||||||
|
selector: lastCompleted())
|
||||||
|
if (fileExists(fileName)) {
|
||||||
|
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' ${fileName}"
|
||||||
|
archiveArtifacts artifacts: fileName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,376 @@
|
|||||||
|
#!/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
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
// Name of the phone resource
|
||||||
|
def ciSmartPhoneResource = params.smartphonesResource
|
||||||
|
|
||||||
|
// Name of the phone resource
|
||||||
|
def oaiUEResource = params.oaiUEResource
|
||||||
|
|
||||||
|
// Terminate Status
|
||||||
|
def termENB = 0
|
||||||
|
def termOAIUE = 1
|
||||||
|
def termStatusArray = new Boolean[termOAIUE + 1]
|
||||||
|
termStatusArray[termENB] = false
|
||||||
|
termStatusArray[termOAIUE] = false
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: [[resource: ciSmartPhoneResource]], resource: ciSmartPhoneResource)
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists("ci-scripts/" + xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.smartphonesResource == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.oaiUEResource == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.UE_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.UE_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.UE_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// the following 4 parameters should be pushed by the master trigger
|
||||||
|
// if not present, take the job GIT variables (used for developing)
|
||||||
|
if (params.eNB_Repository == null) {
|
||||||
|
eNB_Repository = env.GIT_URL
|
||||||
|
} else {
|
||||||
|
eNB_Repository = params.eNB_Repository
|
||||||
|
}
|
||||||
|
echo "eNB_Repository : ${eNB_Repository}"
|
||||||
|
if (params.eNB_Branch == null) {
|
||||||
|
eNB_Branch = env.GIT_BRANCH
|
||||||
|
} else {
|
||||||
|
eNB_Branch = params.eNB_Branch
|
||||||
|
}
|
||||||
|
echo "eNB_Branch : ${eNB_Branch}"
|
||||||
|
if (params.eNB_CommitID == null) {
|
||||||
|
eNB_CommitID = env.GIT_COMMIT
|
||||||
|
} else {
|
||||||
|
eNB_CommitID = params.eNB_CommitID
|
||||||
|
}
|
||||||
|
echo "eNB_CommitID : ${eNB_CommitID}"
|
||||||
|
if (params.eNB_mergeRequest != null) {
|
||||||
|
eNB_AllowMergeRequestProcess = params.eNB_mergeRequest
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
if (params.eNB_TargetBranch != null) {
|
||||||
|
eNB_TargetBranch = params.eNB_TargetBranch
|
||||||
|
} else {
|
||||||
|
eNB_TargetBranch = 'develop'
|
||||||
|
}
|
||||||
|
echo "eNB_TargetBranch : ${eNB_TargetBranch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.EPC_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Type == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.ADB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.ADB_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||||
|
} else {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
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'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
||||||
|
]) {
|
||||||
|
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) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
sh "python3 main.py --mode=TesteNB --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNB_AllowMerge=${eNB_AllowMergeRequestProcess} --eNBTargetBranch=${eNB_TargetBranch} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password} --UESourceCodePath=${params.UE_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) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Terminate") {
|
||||||
|
parallel {
|
||||||
|
stage('Terminate eNB') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate 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('Terminate OAI-UE') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate OAI-UE\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateOAIUE --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
termStatusArray[termOAIUE] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection') {
|
||||||
|
parallel {
|
||||||
|
stage('Log Collection (eNB - Run)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - 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 (eNB - 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 (OAI UE - Run)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (OAI UE - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectOAIUE --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password} --UESourceCodePath=${params.UE_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (OAI UE - Run)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${UE_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${UE_Username}@${params.UE_IPAddress}:${UE_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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (Ping)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (Ping)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectPing --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (Ping)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/ping.log.zip ./ping.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("ping.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "ping.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (Iperf)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (Iperf)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectIperf --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (Iperf)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/iperf.log.zip ./iperf.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("iperf.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "iperf.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
if (params.pipelineZipsConsoleLog != null) {
|
||||||
|
if (params.pipelineZipsConsoleLog) {
|
||||||
|
echo "Archiving Jenkins console log"
|
||||||
|
sh "wget --no-check-certificate --no-proxy ${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_ID}/consoleText -O consoleText.log || true"
|
||||||
|
sh "zip -m consoleText.log.${env.BUILD_ID}.zip consoleText.log || true"
|
||||||
|
if(fileExists("consoleText.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "consoleText.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Making sure that we really shutdown every thing before leaving
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
if (!termStatusArray[termENB]) {
|
||||||
|
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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!termStatusArray[termOAIUE]) {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateOAIUE --UEIPAddress=${params.UE_IPAddress} --UEUserName=${UE_Username} --UEPassword=${UE_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
BEGIN{lineIdx=0;captureUEDesc=0}
|
||||||
|
{
|
||||||
|
if ($0 ~/UE0/) {
|
||||||
|
captureUEDesc = 1
|
||||||
|
}
|
||||||
|
if (captureUEDesc == 1) {
|
||||||
|
captureLine[lineIdx] = $0
|
||||||
|
lineIdx = lineIdx + 1
|
||||||
|
}
|
||||||
|
print $0
|
||||||
|
}
|
||||||
|
END {
|
||||||
|
for (ueIdx = 1; ueIdx < num_ues; ueIdx++) {
|
||||||
|
print ""
|
||||||
|
for (k = 0; k < lineIdx; k++) {
|
||||||
|
if (captureLine[k] ~/UE0/) {
|
||||||
|
mLine = captureLine[k]
|
||||||
|
gsub("UE0", "UE"ueIdx, mLine)
|
||||||
|
print mLine
|
||||||
|
} else {
|
||||||
|
if (captureLine[k] ~/MSIN=/) {
|
||||||
|
mLine = captureLine[k]
|
||||||
|
MSIN=sprintf("%08d", 1111+int(ueIdx))
|
||||||
|
gsub("00001111", MSIN, mLine)
|
||||||
|
print mLine
|
||||||
|
} else {
|
||||||
|
print captureLine[k]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
BEGIN{lineIdx=0}
|
||||||
|
{
|
||||||
|
captureLine[lineIdx] = $0
|
||||||
|
lineIdx = lineIdx + 1
|
||||||
|
print $0
|
||||||
|
}
|
||||||
|
END{
|
||||||
|
for (ueIdx = 1; ueIdx < num_ues; ueIdx++) {
|
||||||
|
for (k = 0; k < lineIdx; k++) {
|
||||||
|
if (captureLine[k] ~/UserName=/) {
|
||||||
|
mLine = captureLine[k]
|
||||||
|
MSIN=sprintf("%08d", 1111+int(ueIdx))
|
||||||
|
gsub("00001111", MSIN, mLine)
|
||||||
|
print mLine
|
||||||
|
} else {
|
||||||
|
if (captureLine[k] ~/SubscriptionIndex/) {
|
||||||
|
mLine = captureLine[k]
|
||||||
|
MSIN=sprintf("%d", 111+int(ueIdx))
|
||||||
|
gsub("111", MSIN, mLine)
|
||||||
|
print mLine
|
||||||
|
} else {
|
||||||
|
print captureLine[k]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -213,6 +213,6 @@ function build_on_vm {
|
|||||||
echo "sudo -E daemon --inherit --unsafe --name=build_daemon --chdir=/home/ubuntu/tmp/cmake_targets -o /home/ubuntu/tmp/cmake_targets/log/install-build.txt ./my-vm-build.sh" >> $VM_CMDS
|
echo "sudo -E daemon --inherit --unsafe --name=build_daemon --chdir=/home/ubuntu/tmp/cmake_targets -o /home/ubuntu/tmp/cmake_targets/log/install-build.txt ./my-vm-build.sh" >> $VM_CMDS
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
ssh -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR < $VM_CMDS
|
ssh -T -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR < $VM_CMDS
|
||||||
rm -f $VM_CMDS
|
rm -f $VM_CMDS
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,221 @@
|
|||||||
|
Active_eNBs = ( "eNB-CU-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-CU-Eurecom-LTEBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } )
|
||||||
|
|
||||||
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
tr_s_preference = "f1"
|
||||||
|
|
||||||
|
local_s_if_name = "lo";
|
||||||
|
remote_s_address = "127.0.0.3";
|
||||||
|
local_s_address = "127.0.0.4";
|
||||||
|
local_s_portc = 501;
|
||||||
|
remote_s_portc = 500;
|
||||||
|
local_s_portd = 601;
|
||||||
|
remote_s_portd = 600;
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_eNodeB";
|
||||||
|
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 = 2680000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 100;
|
||||||
|
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 = 0;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 0;
|
||||||
|
pdsch_referenceSignalPower = -29;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnable = "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 = -96;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -104;
|
||||||
|
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 = -108;
|
||||||
|
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 = "CI_MME_IP_ADDR";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES : {
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
ENB_IPV4_ADDRESS_FOR_X2C = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config = {
|
||||||
|
global_log_level = "info";
|
||||||
|
global_log_verbosity = "medium";
|
||||||
|
pdcp_log_level = "info";
|
||||||
|
pdcp_log_verbosity = "high";
|
||||||
|
rrc_log_level = "info";
|
||||||
|
rrc_log_verbosity = "medium";
|
||||||
|
flexran_agent_log_level = "info";
|
||||||
|
flexran_agent_log_verbosity = "medium";
|
||||||
|
gtp_log_level = "info";
|
||||||
|
gtp_log_verbosity = "medium";
|
||||||
|
};
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
@@ -0,0 +1,221 @@
|
|||||||
|
Active_eNBs = ( "eNB-CU-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-CU-Eurecom-LTEBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } )
|
||||||
|
|
||||||
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
tr_s_preference = "f1"
|
||||||
|
|
||||||
|
local_s_if_name = "lo";
|
||||||
|
remote_s_address = "127.0.0.3";
|
||||||
|
local_s_address = "127.0.0.4";
|
||||||
|
local_s_portc = 501;
|
||||||
|
remote_s_portc = 500;
|
||||||
|
local_s_portd = 601;
|
||||||
|
remote_s_portd = 600;
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_eNodeB";
|
||||||
|
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 = 2680000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 25;
|
||||||
|
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 = 0;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 0;
|
||||||
|
pdsch_referenceSignalPower = -25;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnable = "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 = -96;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -104;
|
||||||
|
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 = -108;
|
||||||
|
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 = "CI_MME_IP_ADDR";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES : {
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
ENB_IPV4_ADDRESS_FOR_X2C = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config = {
|
||||||
|
global_log_level = "info";
|
||||||
|
global_log_verbosity = "medium";
|
||||||
|
pdcp_log_level = "info";
|
||||||
|
pdcp_log_verbosity = "high";
|
||||||
|
rrc_log_level = "info";
|
||||||
|
rrc_log_verbosity = "medium";
|
||||||
|
flexran_agent_log_level = "info";
|
||||||
|
flexran_agent_log_verbosity = "medium";
|
||||||
|
gtp_log_level = "info";
|
||||||
|
gtp_log_verbosity = "medium";
|
||||||
|
};
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
@@ -0,0 +1,221 @@
|
|||||||
|
Active_eNBs = ( "eNB-CU-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-CU-Eurecom-LTEBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } )
|
||||||
|
|
||||||
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
tr_s_preference = "f1"
|
||||||
|
|
||||||
|
local_s_if_name = "lo";
|
||||||
|
remote_s_address = "127.0.0.3";
|
||||||
|
local_s_address = "127.0.0.4";
|
||||||
|
local_s_portc = 501;
|
||||||
|
remote_s_portc = 500;
|
||||||
|
local_s_portd = 601;
|
||||||
|
remote_s_portd = 600;
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_eNodeB";
|
||||||
|
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 = 2680000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 50;
|
||||||
|
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 = 0;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 0;
|
||||||
|
pdsch_referenceSignalPower = -27;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnable = "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 = -96;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -104;
|
||||||
|
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 = -108;
|
||||||
|
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 = "CI_MME_IP_ADDR";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES : {
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
ENB_IPV4_ADDRESS_FOR_X2C = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config = {
|
||||||
|
global_log_level = "info";
|
||||||
|
global_log_verbosity = "medium";
|
||||||
|
pdcp_log_level = "info";
|
||||||
|
pdcp_log_verbosity = "high";
|
||||||
|
rrc_log_level = "info";
|
||||||
|
rrc_log_verbosity = "medium";
|
||||||
|
flexran_agent_log_level = "info";
|
||||||
|
flexran_agent_log_verbosity = "medium";
|
||||||
|
gtp_log_level = "info";
|
||||||
|
gtp_log_verbosity = "medium";
|
||||||
|
};
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
Active_eNBs = ( "eNB-Eurecom-DU");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_CU_ID = 0xe00;
|
||||||
|
|
||||||
|
eNB_name = "eNB-Eurecom-DU";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } )
|
||||||
|
|
||||||
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_eNODEB";
|
||||||
|
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 = 2680000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 100;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 90;
|
||||||
|
rx_gain = 115;
|
||||||
|
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "f1";
|
||||||
|
local_n_if_name = "lo";
|
||||||
|
remote_n_address = "127.0.0.4";
|
||||||
|
local_n_address = "127.0.0.3";
|
||||||
|
local_n_portc = 500;
|
||||||
|
remote_n_portc = 501;
|
||||||
|
local_n_portd = 600;
|
||||||
|
remote_n_portd = 601;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes";
|
||||||
|
nb_tx = 1;
|
||||||
|
nb_rx = 1;
|
||||||
|
att_tx = 10;
|
||||||
|
att_rx = 10;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -29;
|
||||||
|
max_rxgain = 115;
|
||||||
|
eNB_instances = [0];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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";
|
||||||
|
flexran_agent_log_level = "info";
|
||||||
|
flexran_agent_log_verbosity = "medium";
|
||||||
|
};
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
Active_eNBs = ( "eNB-Eurecom-DU");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_CU_ID = 0xe00;
|
||||||
|
|
||||||
|
eNB_name = "eNB-Eurecom-DU";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } )
|
||||||
|
|
||||||
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_eNODEB";
|
||||||
|
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 = 2680000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 25;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 90;
|
||||||
|
rx_gain = 125;
|
||||||
|
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "f1";
|
||||||
|
local_n_if_name = "lo";
|
||||||
|
remote_n_address = "127.0.0.4";
|
||||||
|
local_n_address = "127.0.0.3";
|
||||||
|
local_n_portc = 500;
|
||||||
|
remote_n_portc = 501;
|
||||||
|
local_n_portd = 600;
|
||||||
|
remote_n_portd = 601;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes";
|
||||||
|
nb_tx = 1;
|
||||||
|
nb_rx = 1;
|
||||||
|
att_tx = 10;
|
||||||
|
att_rx = 10;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -25;
|
||||||
|
max_rxgain = 125;
|
||||||
|
eNB_instances = [0];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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";
|
||||||
|
flexran_agent_log_level = "info";
|
||||||
|
flexran_agent_log_verbosity = "medium";
|
||||||
|
};
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
Active_eNBs = ( "eNB-Eurecom-DU");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_CU_ID = 0xe00;
|
||||||
|
|
||||||
|
eNB_name = "eNB-Eurecom-DU";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } )
|
||||||
|
|
||||||
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_eNODEB";
|
||||||
|
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 = 2680000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 50;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 90;
|
||||||
|
rx_gain = 120;
|
||||||
|
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "f1";
|
||||||
|
local_n_if_name = "lo";
|
||||||
|
remote_n_address = "127.0.0.4";
|
||||||
|
local_n_address = "127.0.0.3";
|
||||||
|
local_n_portc = 500;
|
||||||
|
remote_n_portc = 501;
|
||||||
|
local_n_portd = 600;
|
||||||
|
remote_n_portd = 601;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes";
|
||||||
|
nb_tx = 1;
|
||||||
|
nb_rx = 1;
|
||||||
|
att_tx = 10;
|
||||||
|
att_rx = 10;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 120;
|
||||||
|
eNB_instances = [0];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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";
|
||||||
|
flexran_agent_log_level = "info";
|
||||||
|
flexran_agent_log_verbosity = "medium";
|
||||||
|
};
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
@@ -201,13 +201,13 @@ eNBs =
|
|||||||
MACRLCs = (
|
MACRLCs = (
|
||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
local_s_if_name = "lo:";
|
local_s_if_name = "ens3";
|
||||||
remote_s_address = "127.0.0.1";
|
remote_s_address = "CI_UE_IP_ADDR";
|
||||||
local_s_address = "127.0.0.2";
|
local_s_address = "CI_ENB_IP_ADDR";
|
||||||
local_s_portc = 50001;
|
local_s_portc = 50001;
|
||||||
remote_s_portc = 50000;
|
remote_s_portc = 50000;
|
||||||
local_s_portd = 50011;
|
local_s_portd = 50011;
|
||||||
remote_s_portd = 50010;
|
remote_s_portd = 50010;
|
||||||
tr_s_preference = "nfapi";
|
tr_s_preference = "nfapi";
|
||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
}
|
}
|
||||||
@@ -216,7 +216,7 @@ MACRLCs = (
|
|||||||
THREAD_STRUCT = (
|
THREAD_STRUCT = (
|
||||||
{
|
{
|
||||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
#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";
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
worker_config = "WORKER_ENABLE";
|
worker_config = "WORKER_ENABLE";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ L1s = (
|
|||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_n_preference = "nfapi";
|
tr_n_preference = "nfapi";
|
||||||
local_n_if_name = "lo";
|
local_n_if_name = "ens3";
|
||||||
remote_n_address = "127.0.0.2";
|
remote_n_address = "CI_ENB_IP_ADDR";
|
||||||
local_n_address = "127.0.0.1";
|
local_n_address = "CI_UE_IP_ADDR";
|
||||||
local_n_portc = 50000;
|
local_n_portc = 50000;
|
||||||
remote_n_portc = 50001;
|
remote_n_portc = 50001;
|
||||||
local_n_portd = 50010;
|
local_n_portd = 50010;
|
||||||
remote_n_portd = 50011;
|
remote_n_portd = 50011;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
RUs = (
|
RUs = (
|
||||||
|
|||||||
+526
-290
File diff suppressed because it is too large
Load Diff
+100
-35
@@ -34,14 +34,19 @@ function top_usage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function variant_usage {
|
function variant_usage {
|
||||||
|
echo " # OpenAirInterface Build Variants"
|
||||||
echo " --variant enb-usrp OR -v1"
|
echo " --variant enb-usrp OR -v1"
|
||||||
echo " --variant basic-sim OR -v2"
|
echo " --variant basic-sim OR -v2"
|
||||||
echo " --variant phy-sim OR -v3"
|
echo " --variant phy-sim OR -v3"
|
||||||
echo " --variant cppcheck OR -v4"
|
echo " --variant cppcheck OR -v4"
|
||||||
echo " --variant enb-ethernet OR -v7"
|
echo " --variant enb-ethernet OR -v7"
|
||||||
echo " --variant ue-ethernet OR -v8"
|
echo " --variant ue-ethernet OR -v8"
|
||||||
echo " --variant l2-sim OR -v9"
|
echo " # non-OSA Build Variants"
|
||||||
echo " --variant flexran-rtc OR -v10"
|
echo " --variant flexran-rtc OR -v10"
|
||||||
|
echo " # OpenAirInterface Test Variants"
|
||||||
|
echo " --variant l1-sim OR -v20"
|
||||||
|
echo " --variant rf-sim OR -v21"
|
||||||
|
echo " --variant l2-sim OR -v22"
|
||||||
}
|
}
|
||||||
|
|
||||||
MY_DIR=$(dirname $(readlink -f $0))
|
MY_DIR=$(dirname $(readlink -f $0))
|
||||||
@@ -270,31 +275,23 @@ case $key in
|
|||||||
;;
|
;;
|
||||||
-v7)
|
-v7)
|
||||||
VM_NAME=ci-enb-ethernet
|
VM_NAME=ci-enb-ethernet
|
||||||
|
VM_MEMORY=4096
|
||||||
|
VM_CPU=4
|
||||||
ARCHIVES_LOC=enb_eth
|
ARCHIVES_LOC=enb_eth
|
||||||
LOG_PATTERN=.Rel14.txt
|
LOG_PATTERN=.Rel14.txt
|
||||||
NB_PATTERN_FILES=8
|
NB_PATTERN_FILES=6
|
||||||
BUILD_OPTIONS="--eNB -t ETHERNET --noS1"
|
BUILD_OPTIONS="--eNB -t ETHERNET"
|
||||||
NBARGS=$[$NBARGS+256]
|
NBARGS=$[$NBARGS+256]
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
-v8)
|
-v8)
|
||||||
VM_NAME=ci-ue-ethernet
|
VM_NAME=ci-ue-ethernet
|
||||||
|
VM_MEMORY=4096
|
||||||
|
VM_CPU=4
|
||||||
ARCHIVES_LOC=ue_eth
|
ARCHIVES_LOC=ue_eth
|
||||||
LOG_PATTERN=.Rel14.txt
|
LOG_PATTERN=.Rel14.txt
|
||||||
NB_PATTERN_FILES=8
|
NB_PATTERN_FILES=10
|
||||||
BUILD_OPTIONS="--UE -t ETHERNET --noS1"
|
BUILD_OPTIONS="--UE -t ETHERNET"
|
||||||
NBARGS=$[$NBARGS+256]
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-v9)
|
|
||||||
VM_NAME=ci-l2-sim
|
|
||||||
VM_MEMORY=8192
|
|
||||||
VM_CPU=8
|
|
||||||
ARCHIVES_LOC=l2_sim
|
|
||||||
LOG_PATTERN=.Rel14.txt
|
|
||||||
NB_PATTERN_FILES=6
|
|
||||||
BUILD_OPTIONS="--eNB -t ETHERNET"
|
|
||||||
RUN_OPTIONS="complex"
|
|
||||||
NBARGS=$[$NBARGS+256]
|
NBARGS=$[$NBARGS+256]
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
@@ -307,6 +304,27 @@ case $key in
|
|||||||
NBARGS=$[$NBARGS+256]
|
NBARGS=$[$NBARGS+256]
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
-v20)
|
||||||
|
VM_NAME=ci-l1-sim
|
||||||
|
ARCHIVES_LOC=l1_sim
|
||||||
|
RUN_OPTIONS="complex"
|
||||||
|
NBARGS=$[$NBARGS+256]
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v21)
|
||||||
|
VM_NAME=ci-rf-sim
|
||||||
|
ARCHIVES_LOC=rf_sim
|
||||||
|
RUN_OPTIONS="complex"
|
||||||
|
NBARGS=$[$NBARGS+256]
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v22)
|
||||||
|
VM_NAME=ci-l2-sim
|
||||||
|
ARCHIVES_LOC=l2_sim
|
||||||
|
RUN_OPTIONS="complex"
|
||||||
|
NBARGS=$[$NBARGS+256]
|
||||||
|
shift
|
||||||
|
;;
|
||||||
--variant)
|
--variant)
|
||||||
variant="$2"
|
variant="$2"
|
||||||
case $variant in
|
case $variant in
|
||||||
@@ -349,29 +367,22 @@ case $key in
|
|||||||
;;
|
;;
|
||||||
enb-ethernet)
|
enb-ethernet)
|
||||||
VM_NAME=ci-enb-ethernet
|
VM_NAME=ci-enb-ethernet
|
||||||
|
VM_MEMORY=4096
|
||||||
|
VM_CPU=4
|
||||||
ARCHIVES_LOC=enb_eth
|
ARCHIVES_LOC=enb_eth
|
||||||
LOG_PATTERN=.Rel14.txt
|
LOG_PATTERN=.Rel14.txt
|
||||||
NB_PATTERN_FILES=8
|
NB_PATTERN_FILES=6
|
||||||
BUILD_OPTIONS="--eNB -t ETHERNET --noS1"
|
BUILD_OPTIONS="--eNB -t ETHERNET"
|
||||||
NBARGS=$[$NBARGS+256]
|
NBARGS=$[$NBARGS+256]
|
||||||
;;
|
;;
|
||||||
ue-ethernet)
|
ue-ethernet)
|
||||||
VM_NAME=ci-ue-ethernet
|
VM_NAME=ci-ue-ethernet
|
||||||
|
VM_MEMORY=4096
|
||||||
|
VM_CPU=4
|
||||||
ARCHIVES_LOC=ue_eth
|
ARCHIVES_LOC=ue_eth
|
||||||
LOG_PATTERN=.Rel14.txt
|
LOG_PATTERN=.Rel14.txt
|
||||||
NB_PATTERN_FILES=8
|
NB_PATTERN_FILES=10
|
||||||
BUILD_OPTIONS="--UE -t ETHERNET --noS1"
|
BUILD_OPTIONS="--UE -t ETHERNET"
|
||||||
NBARGS=$[$NBARGS+256]
|
|
||||||
;;
|
|
||||||
l2-sim)
|
|
||||||
VM_NAME=ci-l2-sim
|
|
||||||
VM_MEMORY=8192
|
|
||||||
VM_CPU=8
|
|
||||||
ARCHIVES_LOC=l2_sim
|
|
||||||
LOG_PATTERN=.Rel14.txt
|
|
||||||
NB_PATTERN_FILES=6
|
|
||||||
BUILD_OPTIONS="--eNB -t ETHERNET"
|
|
||||||
RUN_OPTIONS="complex"
|
|
||||||
NBARGS=$[$NBARGS+256]
|
NBARGS=$[$NBARGS+256]
|
||||||
;;
|
;;
|
||||||
flexran-rtc)
|
flexran-rtc)
|
||||||
@@ -382,6 +393,24 @@ case $key in
|
|||||||
BUILD_OPTIONS="cmake . && make -j2"
|
BUILD_OPTIONS="cmake . && make -j2"
|
||||||
NBARGS=$[$NBARGS+256]
|
NBARGS=$[$NBARGS+256]
|
||||||
;;
|
;;
|
||||||
|
l1-sim)
|
||||||
|
VM_NAME=ci-l1-sim
|
||||||
|
ARCHIVES_LOC=l1_sim
|
||||||
|
RUN_OPTIONS="complex"
|
||||||
|
NBARGS=$[$NBARGS+256]
|
||||||
|
;;
|
||||||
|
rf-sim)
|
||||||
|
VM_NAME=ci-rf-sim
|
||||||
|
ARCHIVES_LOC=rf_sim
|
||||||
|
RUN_OPTIONS="complex"
|
||||||
|
NBARGS=$[$NBARGS+256]
|
||||||
|
;;
|
||||||
|
l2-sim)
|
||||||
|
VM_NAME=ci-l2-sim
|
||||||
|
ARCHIVES_LOC=l2_sim
|
||||||
|
RUN_OPTIONS="complex"
|
||||||
|
NBARGS=$[$NBARGS+256]
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo ""
|
echo ""
|
||||||
echo "Syntax Error: Invalid Variant option -> $variant"
|
echo "Syntax Error: Invalid Variant option -> $variant"
|
||||||
@@ -536,11 +565,23 @@ ARCHIVES_LOC=${JENKINS_WKSP}/archives/${ARCHIVES_LOC}
|
|||||||
STATUS=0
|
STATUS=0
|
||||||
if [ $CREATE_CMD -eq 1 ]
|
if [ $CREATE_CMD -eq 1 ]
|
||||||
then
|
then
|
||||||
create_vm
|
if [[ $VM_NAME =~ .*-l2-sim.* ]]
|
||||||
|
then
|
||||||
|
echo "Selected variant is no more a build variant"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
create_vm
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
if [ $BUILD_CMD -eq 1 ]
|
if [ $BUILD_CMD -eq 1 ]
|
||||||
then
|
then
|
||||||
build_on_vm
|
if [[ $VM_NAME =~ .*-l2-sim.* ]]
|
||||||
|
then
|
||||||
|
echo "Selected variant is no more a build variant"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
build_on_vm
|
||||||
|
fi
|
||||||
if [ $DAEMON -eq 0 ] && [ $STATUS -eq 0 ]
|
if [ $DAEMON -eq 0 ] && [ $STATUS -eq 0 ]
|
||||||
then
|
then
|
||||||
check_on_vm_build
|
check_on_vm_build
|
||||||
@@ -548,7 +589,13 @@ then
|
|||||||
fi
|
fi
|
||||||
if [ $WAIT_CMD -eq 1 ]
|
if [ $WAIT_CMD -eq 1 ]
|
||||||
then
|
then
|
||||||
wait_on_vm_build
|
if [[ $VM_NAME =~ .*-l2-sim.* ]]
|
||||||
|
then
|
||||||
|
echo "Selected variant is no more a build variant"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
wait_on_vm_build
|
||||||
|
fi
|
||||||
if [ $STATUS -eq 0 ]
|
if [ $STATUS -eq 0 ]
|
||||||
then
|
then
|
||||||
check_on_vm_build
|
check_on_vm_build
|
||||||
@@ -556,6 +603,24 @@ then
|
|||||||
fi
|
fi
|
||||||
if [ $TEST_CMD -eq 1 ]
|
if [ $TEST_CMD -eq 1 ]
|
||||||
then
|
then
|
||||||
|
# Comment out or delete the following lines if you want to run L1-simulator in your branch and/or merge request
|
||||||
|
if [[ $VM_NAME =~ .*-l1-sim.* ]]
|
||||||
|
then
|
||||||
|
echo "Currently L1-Simulator Testing is not implemented / enabled"
|
||||||
|
echo "Comment out these lines in ./ci-scripts/oai-ci-vm-tool if you want to run it"
|
||||||
|
echo "STATUS seems OK"
|
||||||
|
exit $STATUS
|
||||||
|
fi
|
||||||
|
# end to comment out for L1-simulator
|
||||||
|
# Comment out or delete the following lines if you want to run RF-simulator in your branch and/or merge request
|
||||||
|
if [[ $VM_NAME =~ .*-rf-sim.* ]]
|
||||||
|
then
|
||||||
|
echo "Currently RF-Simulator Testing is not implemented / enabled"
|
||||||
|
echo "Comment out these lines in ./ci-scripts/oai-ci-vm-tool if you want to run it"
|
||||||
|
echo "STATUS seems OK"
|
||||||
|
exit $STATUS
|
||||||
|
fi
|
||||||
|
# end to comment out for RF-simulator
|
||||||
ARCHIVES_LOC=${ARCHIVES_LOC}/test
|
ARCHIVES_LOC=${ARCHIVES_LOC}/test
|
||||||
run_test_on_vm
|
run_test_on_vm
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -599,25 +599,25 @@ function report_build {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
summary_table_header "OAI Build eNB -- ETHERNET transport option" ./archives/enb_eth
|
summary_table_header "OAI Build eNB -- ETHERNET transport option" ./archives/enb_eth
|
||||||
summary_table_row "LTE SoftModem w/o S1 - Release 14" ./archives/enb_eth/lte-softmodem-nos1.Rel14.txt "Built target lte-softmodem" ./enb_eth_row1.html
|
summary_table_row "LTE SoftModem - Release 14" ./archives/enb_eth/lte-softmodem.Rel14.txt "Built target lte-softmodem" ./enb_eth_row1.html
|
||||||
summary_table_row "Coding - Release 14" ./archives/enb_eth/coding.Rel14.txt "Built target coding" ./enb_eth_row2.html
|
summary_table_row "Coding - Release 14" ./archives/enb_eth/coding.Rel14.txt "Built target coding" ./enb_eth_row2.html
|
||||||
summary_table_row "OAI ETHERNET transport - Release 14" ./archives/enb_eth/oai_eth_transpro.Rel14.txt "Built target oai_eth_transpro" ./enb_eth_row3.html
|
summary_table_row "OAI ETHERNET transport - Release 14" ./archives/enb_eth/oai_eth_transpro.Rel14.txt "Built target oai_eth_transpro" ./enb_eth_row3.html
|
||||||
summary_table_row "Parameters Lib Config - Release 14" ./archives/enb_eth/params_libconfig.Rel14.txt "Built target params_libconfig" ./enb_eth_row4.html
|
summary_table_row "Parameters Lib Config - Release 14" ./archives/enb_eth/params_libconfig.Rel14.txt "Built target params_libconfig" ./enb_eth_row4.html
|
||||||
summary_table_row "RB Tools - Release 14" ./archives/enb_eth/rb_tool.Rel14.txt "Built target rb_tool" ./enb_eth_row5.html
|
summary_table_row "RF Simulator - Release 14" ./archives/enb_eth/rfsimulator.Rel14.txt "Built target rfsimulator" ./enb_eth_row5.html
|
||||||
summary_table_row "NAS Mesh - Release 14" ./archives/enb_eth/nasmesh.Rel14.txt "Built target nasmesh" ./enb_eth_row6.html
|
summary_table_row "TCP OAI Bridge - Release 14" ./archives/enb_eth/tcp_bridge_oai.Rel14.txt "Built target tcp_bridge_oai" ./enb_eth_row6.html
|
||||||
summary_table_row "RF Simulator - Release 14" ./archives/enb_eth/rfsimulator.Rel14.txt "Built target rfsimulator" ./enb_eth_row7.html
|
|
||||||
summary_table_row "TCP OAI Bridge - Release 14" ./archives/enb_eth/tcp_bridge_oai.Rel14.txt "Built target tcp_bridge_oai" ./enb_eth_row8.html
|
|
||||||
summary_table_footer
|
summary_table_footer
|
||||||
|
|
||||||
summary_table_header "OAI Build UE -- ETHERNET transport option" ./archives/ue_eth
|
summary_table_header "OAI Build UE -- ETHERNET transport option" ./archives/ue_eth
|
||||||
summary_table_row "LTE UE SoftModem w/o S1 - Release 14" ./archives/ue_eth/lte-uesoftmodem-nos1.Rel14.txt "Built target lte-uesoftmodem" ./ue_eth_row1.html
|
summary_table_row "LTE UE SoftModem - Release 14" ./archives/ue_eth/lte-uesoftmodem.Rel14.txt "Built target lte-uesoftmodem" ./ue_eth_row1.html
|
||||||
summary_table_row "Coding - Release 14" ./archives/ue_eth/coding.Rel14.txt "Built target coding" ./ue_eth_row2.html
|
summary_table_row "Coding - Release 14" ./archives/ue_eth/coding.Rel14.txt "Built target coding" ./ue_eth_row2.html
|
||||||
summary_table_row "OAI ETHERNET transport - Release 14" ./archives/ue_eth/oai_eth_transpro.Rel14.txt "Built target oai_eth_transpro" ./ue_eth_row3.html
|
summary_table_row "OAI ETHERNET transport - Release 14" ./archives/ue_eth/oai_eth_transpro.Rel14.txt "Built target oai_eth_transpro" ./ue_eth_row3.html
|
||||||
summary_table_row "Parameters Lib Config - Release 14" ./archives/ue_eth/params_libconfig.Rel14.txt "Built target params_libconfig" ./ue_eth_row4.html
|
summary_table_row "Parameters Lib Config - Release 14" ./archives/ue_eth/params_libconfig.Rel14.txt "Built target params_libconfig" ./ue_eth_row4.html
|
||||||
summary_table_row "RB Tools - Release 14" ./archives/ue_eth/rb_tool.Rel14.txt "Built target rb_tool" ./ue_eth_row5.html
|
summary_table_row "RF Simulator - Release 14" ./archives/ue_eth/rfsimulator.Rel14.txt "Built target rfsimulator" ./ue_eth_row5.html
|
||||||
summary_table_row "NAS Mesh - Release 14" ./archives/ue_eth/nasmesh.Rel14.txt "Built target nasmesh" ./ue_eth_row6.html
|
summary_table_row "TCP OAI Bridge - Release 14" ./archives/ue_eth/tcp_bridge_oai.Rel14.txt "Built target tcp_bridge_oai" ./ue_eth_row6.html
|
||||||
summary_table_row "RF Simulator - Release 14" ./archives/ue_eth/rfsimulator.Rel14.txt "Built target rfsimulator" ./ue_eth_row7.html
|
summary_table_row "Conf 2 UE Data - Release 14" ./archives/ue_eth/conf2uedata.Rel14.txt "Built target conf2uedata" ./ue_eth_row7.html
|
||||||
summary_table_row "TCP OAI Bridge - Release 14" ./archives/ue_eth/tcp_bridge_oai.Rel14.txt "Built target tcp_bridge_oai" ./ue_eth_row8.html
|
summary_table_row "NVRAM - Release 14" ./archives/ue_eth/nvram.Rel14.txt "Built target nvram" ./ue_eth_row8.html
|
||||||
|
summary_table_row "UE IP - Release 14" ./archives/ue_eth/ue_ip.Rel14.txt "Built target ue_ip" ./ue_eth_row9.html
|
||||||
|
summary_table_row "USIM - Release 14" ./archives/ue_eth/usim.Rel14.txt "Built target usim" ./ue_eth_row9a.html
|
||||||
summary_table_footer
|
summary_table_footer
|
||||||
|
|
||||||
if [ -e ./archives/red_hat ]
|
if [ -e ./archives/red_hat ]
|
||||||
|
|||||||
+152
-156
@@ -80,6 +80,121 @@ function report_test_usage {
|
|||||||
echo ""
|
echo ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function analyzePingFiles {
|
||||||
|
for PING_CASE in $PING_LOGS
|
||||||
|
do
|
||||||
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
|
NAME=`echo $PING_CASE | sed -e "s#$ARCHIVES_LOC/##"`
|
||||||
|
echo " <td>$NAME</td>" >> ./test_simulator_results.html
|
||||||
|
CMD=`egrep "COMMAND IS" $PING_CASE | sed -e "s#COMMAND IS: ##"`
|
||||||
|
echo " <td>$CMD</td>" >> ./test_simulator_results.html
|
||||||
|
FILE_COMPLETE=`egrep -c "ping statistics" $PING_CASE`
|
||||||
|
if [ $FILE_COMPLETE -eq 0 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
||||||
|
echo " <td>N/A</td>" >> ./test_simulator_results.html
|
||||||
|
else
|
||||||
|
NB_TR_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s# packets transmitted.*##"`
|
||||||
|
NB_RC_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*packets transmitted, ##" -e "s# received,.*##"`
|
||||||
|
if [ $NB_TR_PACKETS -eq $NB_RC_PACKETS ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
||||||
|
fi
|
||||||
|
echo " <td>" >> ./test_simulator_results.html
|
||||||
|
echo " <pre>" >> ./test_simulator_results.html
|
||||||
|
STATS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*received, ##" -e "s#, time.*##" -e "s# packet loss##"`
|
||||||
|
echo "Packet Loss : $STATS" >> ./test_simulator_results.html
|
||||||
|
RTTMIN=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[1] " " $5}'`
|
||||||
|
echo "RTT Minimal : $RTTMIN" >> ./test_simulator_results.html
|
||||||
|
RTTAVG=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[2] " " $5}'`
|
||||||
|
echo "RTT Average : $RTTAVG" >> ./test_simulator_results.html
|
||||||
|
RTTMAX=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[3] " " $5}'`
|
||||||
|
echo "RTT Maximal : $RTTMAX" >> ./test_simulator_results.html
|
||||||
|
echo " </pre>" >> ./test_simulator_results.html
|
||||||
|
echo " </td>" >> ./test_simulator_results.html
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function analyzeIperfFiles {
|
||||||
|
for IPERF_CASE in $IPERF_TESTS
|
||||||
|
do
|
||||||
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
|
NAME=`echo $IPERF_CASE | sed -e "s#$ARCHIVES_LOC/##"`
|
||||||
|
echo " <td>$NAME</td>" >> ./test_simulator_results.html
|
||||||
|
CMD=`egrep "COMMAND IS" $IPERF_CASE | sed -e "s#COMMAND IS: ##"`
|
||||||
|
echo " <td>$CMD</td>" >> ./test_simulator_results.html
|
||||||
|
REQ_BITRATE=`echo $CMD | sed -e "s#^.*-b ##" -e "s#-i 1.*##"`
|
||||||
|
if [[ $REQ_BITRATE =~ .*K.* ]]
|
||||||
|
then
|
||||||
|
REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#K##"`
|
||||||
|
FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000.0" | bc -l`
|
||||||
|
fi
|
||||||
|
if [[ $REQ_BITRATE =~ .*M.* ]]
|
||||||
|
then
|
||||||
|
REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#M##"`
|
||||||
|
FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000.0" | bc -l`
|
||||||
|
fi
|
||||||
|
if [[ $REQ_BITRATE =~ .*G.* ]]
|
||||||
|
then
|
||||||
|
REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#G##"`
|
||||||
|
FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000000.0" | bc -l`
|
||||||
|
fi
|
||||||
|
FILE_COMPLETE=`egrep -c "Server Report" $IPERF_CASE`
|
||||||
|
if [ $FILE_COMPLETE -eq 0 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
||||||
|
SERVER_FILE=`echo $IPERF_CASE | sed -e "s#client#server#"`
|
||||||
|
FLOAT_EFF_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; printf "%.0f", br}'`
|
||||||
|
EFFECTIVE_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; if(br>1000000){printf "%.2f MBits/sec", br/1000000}}'`
|
||||||
|
PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
|
||||||
|
JITTER=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*/sec *##" -e "s# *ms.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{jitter=s/n; printf "%.3f ms", jitter}'`
|
||||||
|
PACKETLOSS_NOSIGN=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*(##" -e "s#%.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{per=s/n; printf "%.1f", per}'`
|
||||||
|
PACKETLOSS=`echo "${PACKETLOSS_NOSIGN}%"`
|
||||||
|
else
|
||||||
|
EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
|
||||||
|
if [[ $EFFECTIVE_BITRATE =~ .*Kbits/sec.* ]]
|
||||||
|
then
|
||||||
|
EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Kbits/sec.*##"`
|
||||||
|
FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000" | bc -l`
|
||||||
|
fi
|
||||||
|
if [[ $EFFECTIVE_BITRATE =~ .*Mbits/sec.* ]]
|
||||||
|
then
|
||||||
|
EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Mbits/sec.*##"`
|
||||||
|
FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000" | bc -l`
|
||||||
|
fi
|
||||||
|
if [[ $EFFECTIVE_BITRATE =~ .*Gbits/sec.* ]]
|
||||||
|
then
|
||||||
|
EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Gbits/sec.*##"`
|
||||||
|
FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000000" | bc -l`
|
||||||
|
fi
|
||||||
|
PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
|
||||||
|
PERF_INT=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.0f", $0}'`
|
||||||
|
if [[ $PERF_INT -lt 70 ]]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
|
||||||
|
fi
|
||||||
|
EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
|
||||||
|
JITTER=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*Mbits/sec *##" -e "s#ms.*#ms#"`
|
||||||
|
PACKETLOSS=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*(##" -e "s#).*##"`
|
||||||
|
fi
|
||||||
|
echo " <td>" >> ./test_simulator_results.html
|
||||||
|
echo " <pre>" >> ./test_simulator_results.html
|
||||||
|
echo "Bitrate : $EFFECTIVE_BITRATE" >> ./test_simulator_results.html
|
||||||
|
echo "Bitrate Perf : $PERF %" >> ./test_simulator_results.html
|
||||||
|
echo "Jitter : $JITTER" >> ./test_simulator_results.html
|
||||||
|
echo "Packet Loss : $PACKETLOSS" >> ./test_simulator_results.html
|
||||||
|
echo " </pre>" >> ./test_simulator_results.html
|
||||||
|
echo " </td>" >> ./test_simulator_results.html
|
||||||
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
function report_test {
|
function report_test {
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "OAI CI VM script"
|
echo "OAI CI VM script"
|
||||||
@@ -215,6 +330,14 @@ function report_test {
|
|||||||
BW_CASES=(05 10 20)
|
BW_CASES=(05 10 20)
|
||||||
for TMODE in ${TRANS_MODES[@]}
|
for TMODE in ${TRANS_MODES[@]}
|
||||||
do
|
do
|
||||||
|
echo " <tr bgcolor = \"#8FBC8F\" >" >> ./test_simulator_results.html
|
||||||
|
if [[ $TMODE =~ .*fdd.* ]]
|
||||||
|
then
|
||||||
|
echo " <td align = \"center\" colspan = 4 >Test in FDD</td>" >> ./test_simulator_results.html
|
||||||
|
else
|
||||||
|
echo " <td align = \"center\" colspan = 4 >Test in TDD</td>" >> ./test_simulator_results.html
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
for BW in ${BW_CASES[@]}
|
for BW in ${BW_CASES[@]}
|
||||||
do
|
do
|
||||||
ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}MHz_enb.log
|
ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}MHz_enb.log
|
||||||
@@ -279,124 +402,11 @@ function report_test {
|
|||||||
echo " </pre></td>" >> ./test_simulator_results.html
|
echo " </pre></td>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
fi
|
fi
|
||||||
PING_CASE=$ARCHIVES_LOC/${TMODE}_${BW}MHz_ping_ue.txt
|
PING_LOGS=`ls $ARCHIVES_LOC/${TMODE}_${BW}MHz_ping_ue.txt 2> /dev/null`
|
||||||
if [ -f $PING_CASE ]
|
analyzePingFiles
|
||||||
then
|
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
|
||||||
NAME=`echo $PING_CASE | sed -e "s#$ARCHIVES_LOC/##"`
|
|
||||||
echo " <td>$NAME</td>" >> ./test_simulator_results.html
|
|
||||||
CMD=`egrep "COMMAND IS" $PING_CASE | sed -e "s#COMMAND IS: ##"`
|
|
||||||
echo " <td>$CMD</td>" >> ./test_simulator_results.html
|
|
||||||
FILE_COMPLETE=`egrep -c "ping statistics" $PING_CASE`
|
|
||||||
if [ $FILE_COMPLETE -eq 0 ]
|
|
||||||
then
|
|
||||||
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
|
||||||
echo " <td>N/A</td>" >> ./test_simulator_results.html
|
|
||||||
else
|
|
||||||
NB_TR_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s# packets transmitted.*##"`
|
|
||||||
NB_RC_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*packets transmitted, ##" -e "s# received,.*##"`
|
|
||||||
if [ $NB_TR_PACKETS -eq $NB_RC_PACKETS ]
|
|
||||||
then
|
|
||||||
echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
|
|
||||||
else
|
|
||||||
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
|
||||||
fi
|
|
||||||
echo " <td>" >> ./test_simulator_results.html
|
|
||||||
echo " <pre>" >> ./test_simulator_results.html
|
|
||||||
STATS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*received, ##" -e "s#, time.*##" -e "s# packet loss##"`
|
|
||||||
echo "Packet Loss : $STATS" >> ./test_simulator_results.html
|
|
||||||
RTTMIN=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[1] " " $5}'`
|
|
||||||
echo "RTT Minimal : $RTTMIN" >> ./test_simulator_results.html
|
|
||||||
RTTAVG=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[2] " " $5}'`
|
|
||||||
echo "RTT Average : $RTTAVG" >> ./test_simulator_results.html
|
|
||||||
RTTMAX=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[3] " " $5}'`
|
|
||||||
echo "RTT Maximal : $RTTMAX" >> ./test_simulator_results.html
|
|
||||||
echo " </pre>" >> ./test_simulator_results.html
|
|
||||||
echo " </td>" >> ./test_simulator_results.html
|
|
||||||
fi
|
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f $ARCHIVES_LOC/${TMODE}_${BW}*iperf*dl*client*txt ]
|
IPERF_TESTS=`ls $ARCHIVES_LOC/${TMODE}_${BW}*iperf*client*txt 2> /dev/null`
|
||||||
then
|
analyzeIperfFiles
|
||||||
IPERF_TESTS=`ls $ARCHIVES_LOC/${TMODE}_${BW}*iperf*client*txt`
|
|
||||||
else
|
|
||||||
echo "There are no iperf files"
|
|
||||||
IPERF_TESTS=""
|
|
||||||
fi
|
|
||||||
for IPERF_CASE in $IPERF_TESTS
|
|
||||||
do
|
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
|
||||||
NAME=`echo $IPERF_CASE | sed -e "s#$ARCHIVES_LOC/##"`
|
|
||||||
echo " <td>$NAME</td>" >> ./test_simulator_results.html
|
|
||||||
CMD=`egrep "COMMAND IS" $IPERF_CASE | sed -e "s#COMMAND IS: ##"`
|
|
||||||
echo " <td>$CMD</td>" >> ./test_simulator_results.html
|
|
||||||
REQ_BITRATE=`echo $CMD | sed -e "s#^.*-b ##" -e "s#-i 1.*##"`
|
|
||||||
if [[ $REQ_BITRATE =~ .*K.* ]]
|
|
||||||
then
|
|
||||||
REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#K##"`
|
|
||||||
FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000.0" | bc -l`
|
|
||||||
fi
|
|
||||||
if [[ $REQ_BITRATE =~ .*M.* ]]
|
|
||||||
then
|
|
||||||
REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#M##"`
|
|
||||||
FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000.0" | bc -l`
|
|
||||||
fi
|
|
||||||
if [[ $REQ_BITRATE =~ .*G.* ]]
|
|
||||||
then
|
|
||||||
REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#G##"`
|
|
||||||
FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000000.0" | bc -l`
|
|
||||||
fi
|
|
||||||
FILE_COMPLETE=`egrep -c "Server Report" $IPERF_CASE`
|
|
||||||
if [ $FILE_COMPLETE -eq 0 ]
|
|
||||||
then
|
|
||||||
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
|
||||||
SERVER_FILE=`echo $IPERF_CASE | sed -e "s#client#server#"`
|
|
||||||
FLOAT_EFF_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; printf "%.0f", br}'`
|
|
||||||
EFFECTIVE_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; if(br>1000000){printf "%.2f MBits/sec", br/1000000}}'`
|
|
||||||
PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
|
|
||||||
JITTER=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*/sec *##" -e "s# *ms.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{jitter=s/n; printf "%.3f ms", jitter}'`
|
|
||||||
PACKETLOSS_NOSIGN=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*(##" -e "s#%.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{per=s/n; printf "%.1f", per}'`
|
|
||||||
PACKETLOSS=`echo "${PACKETLOSS_NOSIGN}%"`
|
|
||||||
else
|
|
||||||
EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
|
|
||||||
if [[ $EFFECTIVE_BITRATE =~ .*Kbits/sec.* ]]
|
|
||||||
then
|
|
||||||
EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Kbits/sec.*##"`
|
|
||||||
FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000" | bc -l`
|
|
||||||
fi
|
|
||||||
if [[ $EFFECTIVE_BITRATE =~ .*Mbits/sec.* ]]
|
|
||||||
then
|
|
||||||
EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Mbits/sec.*##"`
|
|
||||||
FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000" | bc -l`
|
|
||||||
fi
|
|
||||||
if [[ $EFFECTIVE_BITRATE =~ .*Gbits/sec.* ]]
|
|
||||||
then
|
|
||||||
EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Gbits/sec.*##"`
|
|
||||||
FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000000" | bc -l`
|
|
||||||
fi
|
|
||||||
PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
|
|
||||||
PERF_INT=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.0f", $0}'`
|
|
||||||
if [[ $PERF_INT -lt 70 ]]
|
|
||||||
then
|
|
||||||
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
|
||||||
else
|
|
||||||
echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
|
|
||||||
fi
|
|
||||||
EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
|
|
||||||
JITTER=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*Mbits/sec *##" -e "s#ms.*#ms#"`
|
|
||||||
PACKETLOSS=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*(##" -e "s#).*##"`
|
|
||||||
fi
|
|
||||||
echo " <td>" >> ./test_simulator_results.html
|
|
||||||
echo " <pre>" >> ./test_simulator_results.html
|
|
||||||
echo "Bitrate : $EFFECTIVE_BITRATE" >> ./test_simulator_results.html
|
|
||||||
echo "Bitrate Perf : $PERF %" >> ./test_simulator_results.html
|
|
||||||
echo "Jitter : $JITTER" >> ./test_simulator_results.html
|
|
||||||
echo "Packet Loss : $PACKETLOSS" >> ./test_simulator_results.html
|
|
||||||
echo " </pre>" >> ./test_simulator_results.html
|
|
||||||
echo " </td>" >> ./test_simulator_results.html
|
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
|
||||||
done
|
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -466,13 +476,27 @@ function report_test {
|
|||||||
echo " <th>Statistics</th>" >> ./test_simulator_results.html
|
echo " <th>Statistics</th>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
|
|
||||||
|
EPC_CONFIGS=("wS1" "noS1")
|
||||||
TRANS_MODES=("fdd")
|
TRANS_MODES=("fdd")
|
||||||
BW_CASES=(05)
|
BW_CASES=(05)
|
||||||
for TMODE in ${TRANS_MODES[@]}
|
NB_USERS=(01 04)
|
||||||
|
for CN_CONFIG in ${EPC_CONFIGS[@]}
|
||||||
do
|
do
|
||||||
|
for TMODE in ${TRANS_MODES[@]}
|
||||||
|
do
|
||||||
for BW in ${BW_CASES[@]}
|
for BW in ${BW_CASES[@]}
|
||||||
do
|
do
|
||||||
ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}MHz_enb.log
|
for UES in ${NB_USERS[@]}
|
||||||
|
do
|
||||||
|
echo " <tr bgcolor = \"#8FBC8F\" >" >> ./test_simulator_results.html
|
||||||
|
if [[ $CN_CONFIG =~ .*wS1.* ]]
|
||||||
|
then
|
||||||
|
echo " <td align = \"center\" colspan = 4 >Test with EPC (aka withS1): ${TMODE} -- ${BW}MHz -- ${UES} user(s)</td>" >> ./test_simulator_results.html
|
||||||
|
else
|
||||||
|
echo " <td align = \"center\" colspan = 4 >Test without EPC (aka noS1): ${TMODE} -- ${BW}MHz -- ${UES} user(s)</td>" >> ./test_simulator_results.html
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
|
ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}MHz_${UES}users_${CN_CONFIG}_enb.log
|
||||||
UE_LOG=`echo $ENB_LOG | sed -e "s#enb#ue#"`
|
UE_LOG=`echo $ENB_LOG | sed -e "s#enb#ue#"`
|
||||||
if [ -f $ENB_LOG ] && [ -f $UE_LOG ]
|
if [ -f $ENB_LOG ] && [ -f $UE_LOG ]
|
||||||
then
|
then
|
||||||
@@ -512,45 +536,17 @@ function report_test {
|
|||||||
echo " </pre></td>" >> ./test_simulator_results.html
|
echo " </pre></td>" >> ./test_simulator_results.html
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
fi
|
fi
|
||||||
PING_CASE=$ARCHIVES_LOC/${TMODE}_${BW}MHz_ping_epc.txt
|
PING_LOGS=`ls $ARCHIVES_LOC/${TMODE}_${BW}MHz_${UES}users_${CN_CONFIG}_ping*.log 2> /dev/null`
|
||||||
if [ -f $PING_CASE ]
|
analyzePingFiles
|
||||||
then
|
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
|
||||||
NAME=`echo $PING_CASE | sed -e "s#$ARCHIVES_LOC/##"`
|
|
||||||
echo " <td>$NAME</td>" >> ./test_simulator_results.html
|
|
||||||
CMD=`egrep "COMMAND IS" $PING_CASE | sed -e "s#COMMAND IS: ##"`
|
|
||||||
echo " <td>$CMD</td>" >> ./test_simulator_results.html
|
|
||||||
FILE_COMPLETE=`egrep -c "ping statistics" $PING_CASE`
|
|
||||||
if [ $FILE_COMPLETE -eq 0 ]
|
|
||||||
then
|
|
||||||
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
|
||||||
echo " <td>N/A</td>" >> ./test_simulator_results.html
|
|
||||||
else
|
|
||||||
NB_TR_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s# packets transmitted.*##"`
|
|
||||||
NB_RC_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*packets transmitted, ##" -e "s# received,.*##"`
|
|
||||||
if [ $NB_TR_PACKETS -eq $NB_RC_PACKETS ]
|
|
||||||
then
|
|
||||||
echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
|
|
||||||
else
|
|
||||||
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
|
||||||
fi
|
|
||||||
echo " <td>" >> ./test_simulator_results.html
|
|
||||||
echo " <pre>" >> ./test_simulator_results.html
|
|
||||||
STATS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*received, ##" -e "s#, time.*##" -e "s# packet loss##"`
|
|
||||||
echo "Packet Loss : $STATS" >> ./test_simulator_results.html
|
|
||||||
RTTMIN=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[1] " " $5}'`
|
|
||||||
echo "RTT Minimal : $RTTMIN" >> ./test_simulator_results.html
|
|
||||||
RTTAVG=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[2] " " $5}'`
|
|
||||||
echo "RTT Average : $RTTAVG" >> ./test_simulator_results.html
|
|
||||||
RTTMAX=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[3] " " $5}'`
|
|
||||||
echo "RTT Maximal : $RTTMAX" >> ./test_simulator_results.html
|
|
||||||
echo " </pre>" >> ./test_simulator_results.html
|
|
||||||
echo " </td>" >> ./test_simulator_results.html
|
|
||||||
fi
|
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
IPERF_TESTS=`ls $ARCHIVES_LOC/${TMODE}_${BW}MHz_${UES}users_${CN_CONFIG}_iperf_dl*client*txt 2> /dev/null`
|
||||||
|
analyzeIperfFiles
|
||||||
|
|
||||||
|
IPERF_TESTS=`ls $ARCHIVES_LOC/${TMODE}_${BW}MHz_${UES}users_${CN_CONFIG}_iperf_ul*client*txt 2> /dev/null`
|
||||||
|
analyzeIperfFiles
|
||||||
|
done
|
||||||
done
|
done
|
||||||
|
done
|
||||||
done
|
done
|
||||||
|
|
||||||
echo " </table>" >> ./test_simulator_results.html
|
echo " </table>" >> ./test_simulator_results.html
|
||||||
|
|||||||
+1126
-509
File diff suppressed because it is too large
Load Diff
@@ -98,7 +98,7 @@ function wait_on_vm_build {
|
|||||||
echo "while [ \$(ps -aux | grep --color=never build_oai | grep -v grep | wc -l) -gt 0 ]; do sleep 3; done" >> $VM_CMDS
|
echo "while [ \$(ps -aux | grep --color=never build_oai | grep -v grep | wc -l) -gt 0 ]; do sleep 3; done" >> $VM_CMDS
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ssh -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR < $VM_CMDS
|
ssh -T -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR < $VM_CMDS
|
||||||
rm -f $VM_CMDS
|
rm -f $VM_CMDS
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,11 +124,16 @@ function check_on_vm_build {
|
|||||||
|
|
||||||
if [ $KEEP_VM_ALIVE -eq 0 ]
|
if [ $KEEP_VM_ALIVE -eq 0 ]
|
||||||
then
|
then
|
||||||
|
if [[ "$VM_NAME" == *"-enb-ethernet"* ]] || [[ "$VM_NAME" == *"-ue-ethernet"* ]]
|
||||||
|
then
|
||||||
|
echo "Hack to not destroy in current pipeline"
|
||||||
|
else
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "Destroying VM"
|
echo "Destroying VM"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
uvt-kvm destroy $VM_NAME
|
uvt-kvm destroy $VM_NAME
|
||||||
ssh-keygen -R $VM_IP_ADDR
|
ssh-keygen -R $VM_IP_ADDR
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
rm -f $VM_CMDS
|
rm -f $VM_CMDS
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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-nos1-tunnel</htmlTabRef>
|
||||||
|
<htmlTabName>Test-05MHz-TM1-noS1-tunnel</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
030101 000001 090101 000002 040501 040502 000001 040601 040641 040642 000001 090109 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000003">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>60</idle_sleep_time_in_sec>
|
||||||
|
</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 --noS1</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="090101">
|
||||||
|
<class>Initialize_OAI_UE</class>
|
||||||
|
<desc>Initialize OAI UE (FDD/Band7/5MHz)</desc>
|
||||||
|
<Initialize_OAI_UE_args>-C 2680000000 -r 25 --ue-rxgain 120 --ue-txgain 0 --ue-max-power 0 --ue-scan-carrier --nokrnmod 1 --noS1</Initialize_OAI_UE_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="090109">
|
||||||
|
<class>Terminate_OAI_UE</class>
|
||||||
|
<desc>Terminate OAI UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040501">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)(from eNB to OAI UE)</desc>
|
||||||
|
<ping_args>-I oaitun_enb1 -c 20 10.0.1.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040502">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)(from OAI UE to eNB)</desc>
|
||||||
|
<ping_args>-I oaitun_ue1 -c 20 10.0.1.1</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040601">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/1Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-c 10.0.1.2 -u -b 1M -t 30 -i 1 -fm -B 10.0.1.1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040602">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/1.2Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-c 10.0.1.2 -u -b 1.2M -t 30 -i 1 -fm -B 10.0.1.1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040641">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/1Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-c 10.0.1.1 -u -b 1M -t 30 -i 1 -fm -B 10.0.1.2 -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/8Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-c 10.0.1.1 -u -b 8M -t 30 -i 1 -fm -B 10.0.1.2 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</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-f1-05</htmlTabRef>
|
||||||
|
<htmlTabName>Test-F1-CU/DU-05MHz</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030142 030141 040301 040541 040601 040641 040401 040201 030201 030202
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030141">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize DU (FDD/Band7/5MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/du.band7.tm1.25PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030142">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize CU (FDD/Band7/5MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/cu.band7.tm1.25PRB.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate CU</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate DU</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="040541">
|
||||||
|
<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="040601">
|
||||||
|
<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="040641">
|
||||||
|
<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>60</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-f1-10</htmlTabRef>
|
||||||
|
<htmlTabName>Test-F1-CU/DU-10MHz</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030152 030151 040301 040551 040611 040651 040401 040201 030201 030202
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030151">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize DU (FDD/Band7/10MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/du.band7.tm1.50PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030152">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize CU (FDD/Band7/10MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/cu.band7.tm1.50PRB.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate CU</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate DU</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="040551">
|
||||||
|
<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="040611">
|
||||||
|
<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="040651">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/15Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>60</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-f1-20</htmlTabRef>
|
||||||
|
<htmlTabName>Test-F1-CU/DU-20MHz</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030162 030161 040301 040561 040621 040661 040401 040201 030201 030202
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030161">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize DU (FDD/Band7/20MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/du.band7.tm1.100PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030162">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize CU (FDD/Band7/20MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/cu.band7.tm1.100PRB.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate CU</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030202">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate DU</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="040561">
|
||||||
|
<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="040621">
|
||||||
|
<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="040661">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/15Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>60</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (10MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
<desc>iperf (10MHz - UL/2Mbps/UDP)(30 sec)(single-ue)</desc>
|
||||||
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
<iperf_args>-u -b 2M -t 30 -i 1 -R</iperf_args>
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>60</iperf_packetloss_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>test-05</htmlTabRef>
|
<htmlTabRef>test-if4p5-05</htmlTabRef>
|
||||||
<htmlTabName>Test-05MHz</htmlTabName>
|
<htmlTabName>Test-IF4.5-05MHz</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>test-10</htmlTabRef>
|
<htmlTabRef>test-if4p5-10</htmlTabRef>
|
||||||
<htmlTabName>Test-10MHz</htmlTabName>
|
<htmlTabName>Test-IF4.5-10MHz</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>test-20</htmlTabRef>
|
<htmlTabRef>test-if4p5-20</htmlTabRef>
|
||||||
<htmlTabName>Test-20MHz</htmlTabName>
|
<htmlTabName>Test-IF4.5-20MHz</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -25,14 +25,14 @@
|
|||||||
<htmlTabName>Test-10Mhz-Orange</htmlTabName>
|
<htmlTabName>Test-10Mhz-Orange</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
090102 000001 090109
|
090110 000001 090109
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="090102">
|
<testCase id="090110">
|
||||||
<class>Initialize_OAI_UE</class>
|
<class>Initialize_OAI_UE</class>
|
||||||
<desc>Initialize OAI UE -- sniffing Orange frequency</desc>
|
<desc>Initialize OAI UE -- sniffing Orange frequency</desc>
|
||||||
<Initialize_OAI_UE_args>-C 816000000 -r 50 --ue-rxgain 130 --ue-scan-carrier --no-L2-connect</Initialize_OAI_UE_args>
|
<Initialize_OAI_UE_args>-C 816000000 -r 50 --ue-rxgain 130 --ue-scan-carrier --no-L2-connect --nokrnmod 1</Initialize_OAI_UE_args>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
|||||||
@@ -25,14 +25,14 @@
|
|||||||
<htmlTabName>Test-10MHz-SFR</htmlTabName>
|
<htmlTabName>Test-10MHz-SFR</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
090104 000001 090109
|
090111 000001 090109
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="090104">
|
<testCase id="090111">
|
||||||
<class>Initialize_OAI_UE</class>
|
<class>Initialize_OAI_UE</class>
|
||||||
<desc>Initialize OAI UE -- sniffing SFR frequency</desc>
|
<desc>Initialize OAI UE -- sniffing SFR frequency</desc>
|
||||||
<Initialize_OAI_UE_args>-C 806000000 -r 50 --ue-rxgain 130 --ue-scan-carrier --no-L2-connect</Initialize_OAI_UE_args>
|
<Initialize_OAI_UE_args>-C 806000000 -r 50 --ue-rxgain 130 --ue-scan-carrier --no-L2-connect --nokrnmod 1</Initialize_OAI_UE_args>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
|||||||
@@ -664,12 +664,7 @@ add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION w
|
|||||||
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE")
|
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||||
add_boolean_option(UESIM_EXPANSION False "enable UESIM_EXPANSION with max 256 UE")
|
add_boolean_option(UESIM_EXPANSION False "enable UESIM_EXPANSION with max 256 UE")
|
||||||
|
|
||||||
#############################################################################
|
########################
|
||||||
# Flag for UE compilation to avoid issues in common eNB/UE PDCP/RLC functions
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
add_boolean_option(UETARGET False "set UE as target for compiler")
|
|
||||||
|
|
||||||
# Include order
|
# Include order
|
||||||
##########################
|
##########################
|
||||||
add_boolean_option(ENB_MODE True "Swap the include directories between openair2 and openair3" )
|
add_boolean_option(ENB_MODE True "Swap the include directories between openair2 and openair3" )
|
||||||
@@ -2298,6 +2293,7 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr
|
|||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${CONFIG_SOURCES}
|
${CONFIG_SOURCES}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
|
${NFAPI_USER_DIR}/nfapi.c
|
||||||
)
|
)
|
||||||
target_link_libraries (${myExe}
|
target_link_libraries (${myExe}
|
||||||
|
|
||||||
|
|||||||
@@ -70,7 +70,6 @@ DISABLE_LOG_X="False"
|
|||||||
USRP_REC_PLAY="False"
|
USRP_REC_PLAY="False"
|
||||||
BUILD_ECLIPSE=0
|
BUILD_ECLIPSE=0
|
||||||
UE_NAS_USE_TUN="False"
|
UE_NAS_USE_TUN="False"
|
||||||
UETARGET="False"
|
|
||||||
BASIC_SIMULATOR=0
|
BASIC_SIMULATOR=0
|
||||||
trap handle_ctrl_c INT
|
trap handle_ctrl_c INT
|
||||||
|
|
||||||
@@ -219,7 +218,6 @@ function main() {
|
|||||||
shift;;
|
shift;;
|
||||||
--UE)
|
--UE)
|
||||||
UE=1
|
UE=1
|
||||||
UETARGET="True"
|
|
||||||
echo_info "Will compile UE"
|
echo_info "Will compile UE"
|
||||||
shift;;
|
shift;;
|
||||||
--mu)
|
--mu)
|
||||||
@@ -549,9 +547,6 @@ function main() {
|
|||||||
echo "set (UE_TIMING_TRACE $UE_TIMING_TRACE)" >> $cmake_file
|
echo "set (UE_TIMING_TRACE $UE_TIMING_TRACE)" >> $cmake_file
|
||||||
echo "set (DISABLE_LOG_X $DISABLE_LOG_X)" >> $cmake_file
|
echo "set (DISABLE_LOG_X $DISABLE_LOG_X)" >> $cmake_file
|
||||||
echo "set (USRP_REC_PLAY $USRP_REC_PLAY)" >> $cmake_file
|
echo "set (USRP_REC_PLAY $USRP_REC_PLAY)" >> $cmake_file
|
||||||
if [ "$UE" = 1 ] ; then
|
|
||||||
echo "set (UETARGET $UETARGET )" >> $cmake_file
|
|
||||||
fi
|
|
||||||
if [ "$UE" = 1 -a "$NOS1" = "0" ] ; then
|
if [ "$UE" = 1 -a "$NOS1" = "0" ] ; then
|
||||||
echo_info "Compiling UE S1 build : enabling Linux and NETLINK"
|
echo_info "Compiling UE S1 build : enabling Linux and NETLINK"
|
||||||
echo "set (LINUX True )" >> $cmake_file
|
echo "set (LINUX True )" >> $cmake_file
|
||||||
@@ -945,7 +940,6 @@ function main() {
|
|||||||
echo "set (USRP_REC_PLAY $USRP_REC_PLAY)" >> $cmake_file
|
echo "set (USRP_REC_PLAY $USRP_REC_PLAY)" >> $cmake_file
|
||||||
echo "set (LINUX True )" >> $cmake_file
|
echo "set (LINUX True )" >> $cmake_file
|
||||||
echo "set (PDCP_USE_NETLINK True )" >> $cmake_file
|
echo "set (PDCP_USE_NETLINK True )" >> $cmake_file
|
||||||
echo "set (UETARGET True )" >> $cmake_file
|
|
||||||
echo "set (BASIC_SIMULATOR \"True\" )" >> $cmake_file
|
echo "set (BASIC_SIMULATOR \"True\" )" >> $cmake_file
|
||||||
# echo "set (UE_NAS_USE_TUN \"True\" )" >> $cmake_file
|
# echo "set (UE_NAS_USE_TUN \"True\" )" >> $cmake_file
|
||||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../../CMakeLists.txt)' >> $cmake_file
|
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../../CMakeLists.txt)' >> $cmake_file
|
||||||
|
|||||||
@@ -130,9 +130,13 @@ static void paint(gui *_gui, widget *_this)
|
|||||||
this->common.y + FLIP(y),
|
this->common.y + FLIP(y),
|
||||||
this->common.x + this->vrule_width + 5,
|
this->common.x + this->vrule_width + 5,
|
||||||
this->common.y + FLIP(y));
|
this->common.y + FLIP(y));
|
||||||
|
/* do not print out of the widget (take care of top) */
|
||||||
|
y = FLIP(y)-this->label_height/2+this->label_baseline;
|
||||||
|
if (y - this->label_baseline < 0)
|
||||||
|
y = this->label_baseline;
|
||||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
||||||
this->common.x + this->vrule_width - vwidth - 2,
|
this->common.x + this->vrule_width - vwidth - 2,
|
||||||
this->common.y + FLIP(y)-this->label_height/2+this->label_baseline,
|
this->common.y + y,
|
||||||
v);
|
v);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
+102
-197
@@ -23,9 +23,6 @@ typedef struct {
|
|||||||
view *pdcpview;
|
view *pdcpview;
|
||||||
view *rrcview;
|
view *rrcview;
|
||||||
view *legacy;
|
view *legacy;
|
||||||
widget *current_ue_label;
|
|
||||||
widget *prev_ue_button;
|
|
||||||
widget *next_ue_button;
|
|
||||||
widget *pdsch_iq_ue_xy_plot;
|
widget *pdsch_iq_ue_xy_plot;
|
||||||
widget *dl_estimate_ue_xy_plot;
|
widget *dl_estimate_ue_xy_plot;
|
||||||
widget *pdcch_energy_ue_xy_plot;
|
widget *pdcch_energy_ue_xy_plot;
|
||||||
@@ -121,15 +118,14 @@ static void *gui_thread(void *_g)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static filter *ticktime_filter(void *database, char *event, int i, int ue)
|
static filter *ticktime_filter(void *database, char *event, int i)
|
||||||
{
|
{
|
||||||
/* filter is "harq_pid == i && UE_id == 0 && eNB_id == 0" */
|
/* filter is "harq_pid == i and eNB_id == 0" */
|
||||||
return
|
return
|
||||||
filter_and(
|
filter_and(
|
||||||
filter_eq(filter_evarg(database, event, "harq_pid"), filter_int(i)),
|
filter_eq(filter_evarg(database, event, "harq_pid"), filter_int(i)),
|
||||||
filter_and(
|
filter_eq(filter_evarg(database, event, "eNB_ID"), filter_int(0)));
|
||||||
filter_eq(filter_evarg(database, event, "UE_id"), filter_int(ue)),
|
|
||||||
filter_eq(filter_evarg(database, event, "eNB_ID"), filter_int(0))));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_current_ue(gui *g, ue_data *e, int ue)
|
static void set_current_ue(gui *g, ue_data *e, int ue)
|
||||||
@@ -137,8 +133,6 @@ static void set_current_ue(gui *g, ue_data *e, int ue)
|
|||||||
int i;
|
int i;
|
||||||
char s[256];
|
char s[256];
|
||||||
|
|
||||||
sprintf(s, "[UE %d] ", ue);
|
|
||||||
label_set_text(g, e->e->current_ue_label, s);
|
|
||||||
sprintf(s, "PDSCH IQ [UE %d]", ue);
|
sprintf(s, "PDSCH IQ [UE %d]", ue);
|
||||||
xy_plot_set_title(g, e->e->pdsch_iq_ue_xy_plot, s);
|
xy_plot_set_title(g, e->e->pdsch_iq_ue_xy_plot, s);
|
||||||
sprintf(s, "DL estimated channel [UE %d]", ue);
|
sprintf(s, "DL estimated channel [UE %d]", ue);
|
||||||
@@ -161,97 +155,24 @@ static void set_current_ue(gui *g, ue_data *e, int ue)
|
|||||||
xy_plot_set_title(g, e->e->pucch_power_xy_plot, s);
|
xy_plot_set_title(g, e->e->pucch_power_xy_plot, s);
|
||||||
sprintf(s, "PHY Measurements [UE %d]", ue);
|
sprintf(s, "PHY Measurements [UE %d]", ue);
|
||||||
xy_plot_set_title(g, e->e->phy_meas_xy_plot, s);
|
xy_plot_set_title(g, e->e->phy_meas_xy_plot, s);
|
||||||
|
|
||||||
logger_set_filter(e->e->pdsch_iq_ue_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_PDSCH_IQ", "UE_ID"),
|
|
||||||
filter_int(ue)));
|
|
||||||
logger_set_filter(e->e->dl_estimate_ue_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_DL_CHANNEL_ESTIMATE", "UE_ID"),
|
|
||||||
filter_int(ue)));
|
|
||||||
logger_set_filter(e->e->pdcch_energy_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_PDCCH_ENERGY", "UE_ID"),
|
|
||||||
filter_int(ue)));
|
|
||||||
logger_set_filter(e->e->pdsch_energy_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_PDSCH_ENERGY", "UE_ID"),
|
|
||||||
filter_int(ue)));
|
|
||||||
logger_set_filter(e->e->phy_meas_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_MEAS", "UE_ID"),
|
|
||||||
filter_int(ue)));
|
|
||||||
/*logger_set_filter(e->pucch1_energy_ue_energy_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
|
|
||||||
filter_int(ue)));*/
|
|
||||||
/*logger_set_filter(e->e->pdcch_iq_ue_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_PDCCH_IQ", "UE_ID"),
|
|
||||||
filter_int(ue)));*/
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
logger_set_filter(e->e->dl_dci_logger[i],
|
logger_set_filter(e->e->dl_dci_logger[i],
|
||||||
ticktime_filter(e->database, "UE_PHY_DLSCH_UE_DCI", i, ue));
|
ticktime_filter(e->database, "UE_PHY_DLSCH_UE_DCI", i));
|
||||||
logger_set_filter(e->e->dl_ack_logger[i],
|
logger_set_filter(e->e->dl_ack_logger[i],
|
||||||
ticktime_filter(e->database, "UE_PHY_DLSCH_UE_ACK", i, ue));
|
ticktime_filter(e->database, "UE_PHY_DLSCH_UE_ACK", i));
|
||||||
logger_set_filter(e->e->dl_nack_logger[i],
|
logger_set_filter(e->e->dl_nack_logger[i],
|
||||||
ticktime_filter(e->database, "UE_PHY_DLSCH_UE_NACK", i, ue));
|
ticktime_filter(e->database, "UE_PHY_DLSCH_UE_NACK", i));
|
||||||
logger_set_filter(e->e->ul_dci_logger[i],
|
logger_set_filter(e->e->ul_dci_logger[i],
|
||||||
ticktime_filter(e->database, "UE_PHY_ULSCH_UE_DCI", i, ue));
|
ticktime_filter(e->database, "UE_PHY_ULSCH_UE_DCI", i));
|
||||||
/*logger_set_filter(e->ul_dci_retransmission_logger[i],
|
/*logger_set_filter(e->ul_dci_retransmission_logger[i],
|
||||||
ticktime_filter(e->database,
|
ticktime_filter(e->database,
|
||||||
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i, ue));*/
|
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i));*/
|
||||||
logger_set_filter(e->e->ul_ack_logger[i],
|
logger_set_filter(e->e->ul_ack_logger[i],
|
||||||
ticktime_filter(e->database, "UE_PHY_ULSCH_UE_ACK", i, ue));
|
ticktime_filter(e->database, "UE_PHY_ULSCH_UE_ACK", i));
|
||||||
logger_set_filter(e->e->ul_nack_logger[i],
|
logger_set_filter(e->e->ul_nack_logger[i],
|
||||||
ticktime_filter(e->database, "UE_PHY_ULSCH_UE_NACK", i, ue));
|
ticktime_filter(e->database, "UE_PHY_ULSCH_UE_NACK", i));
|
||||||
}
|
}
|
||||||
logger_set_filter(e->e->dl_mcs_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_DLSCH_UE_DCI", "UE_id"),
|
|
||||||
filter_int(ue)));
|
|
||||||
logger_set_filter(e->e->ul_mcs_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_ULSCH_UE_DCI", "UE_id"),
|
|
||||||
filter_int(ue)));
|
|
||||||
logger_set_filter(e->e->pusch_power_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_PUSCH_TX_POWER", "UE_id"),
|
|
||||||
filter_int(ue)));
|
|
||||||
logger_set_filter(e->e->pusch_ampl_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_PUSCH_TX_POWER", "UE_id"),
|
|
||||||
filter_int(ue)));
|
|
||||||
logger_set_filter(e->e->pucch_power_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_PUCCH_TX_POWER", "UE_id"),
|
|
||||||
filter_int(ue)));
|
|
||||||
logger_set_filter(e->e->pucch_ampl_logger,
|
|
||||||
filter_eq(
|
|
||||||
filter_evarg(e->database, "UE_PHY_PUCCH_TX_POWER", "UE_id"),
|
|
||||||
filter_int(ue)));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void click(void *private, gui *g,
|
|
||||||
char *notification, widget *w, void *notification_data)
|
|
||||||
{
|
|
||||||
int *d = notification_data;
|
|
||||||
int button = d[0];
|
|
||||||
ue_data *ed = private;
|
|
||||||
ue_gui *e = ed->e;
|
|
||||||
int ue = ed->ue;
|
|
||||||
|
|
||||||
if (button != 1) return;
|
|
||||||
if (w == e->prev_ue_button) { ue--; if (ue < 0) ue = 0; }
|
|
||||||
if (w == e->next_ue_button) ue++;
|
|
||||||
|
|
||||||
if (pthread_mutex_lock(&ed->lock)) abort();
|
|
||||||
if (ue != ed->ue) {
|
|
||||||
set_current_ue(g, ed, ue);
|
|
||||||
ed->ue = ue;
|
|
||||||
}
|
|
||||||
if (pthread_mutex_unlock(&ed->lock)) abort();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
||||||
@@ -271,7 +192,7 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
|||||||
widget *text;
|
widget *text;
|
||||||
view *textview;
|
view *textview;
|
||||||
int i;
|
int i;
|
||||||
widget *w, *w2;
|
widget *w;
|
||||||
view *v;
|
view *v;
|
||||||
logger *l;
|
logger *l;
|
||||||
|
|
||||||
@@ -283,24 +204,8 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
|||||||
widget_add_child(g, top_container, line, -1);
|
widget_add_child(g, top_container, line, -1);
|
||||||
logo = new_image(g, openair_logo_png, openair_logo_png_len);
|
logo = new_image(g, openair_logo_png, openair_logo_png_len);
|
||||||
|
|
||||||
/* logo + prev/next UE buttons */
|
/* logo */
|
||||||
col = new_container(g, VERTICAL);
|
widget_add_child(g, line, logo, -1);
|
||||||
widget_add_child(g, col, logo, -1);
|
|
||||||
w = new_container(g, HORIZONTAL);
|
|
||||||
widget_add_child(g, col, w, -1);
|
|
||||||
w2 = new_label(g, "");
|
|
||||||
widget_add_child(g, w, w2, -1);
|
|
||||||
e->current_ue_label = w2;
|
|
||||||
/* TODO: use button widget, not label widget */
|
|
||||||
w2 = new_label(g, " [prev UE] ");
|
|
||||||
widget_add_child(g, w, w2, -1);
|
|
||||||
label_set_clickable(g, w2, 1);
|
|
||||||
e->prev_ue_button = w2;
|
|
||||||
w2 = new_label(g, " [next UE] ");
|
|
||||||
widget_add_child(g, w, w2, -1);
|
|
||||||
label_set_clickable(g, w2, 1);
|
|
||||||
e->next_ue_button = w2;
|
|
||||||
widget_add_child(g, line, col, -1);
|
|
||||||
|
|
||||||
input_signal_plot = new_xy_plot(g, 256, 55, "input signal", 20);
|
input_signal_plot = new_xy_plot(g, 256, 55, "input signal", 20);
|
||||||
widget_add_child(g, line, input_signal_plot, -1);
|
widget_add_child(g, line, input_signal_plot, -1);
|
||||||
@@ -356,80 +261,13 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
|||||||
v = new_view_tti(10, g, w, new_color(g, "#0c720c"));
|
v = new_view_tti(10, g, w, new_color(g, "#0c720c"));
|
||||||
logger_add_view(l, v);
|
logger_add_view(l, v);
|
||||||
e->phy_meas_logger = l;
|
e->phy_meas_logger = l;
|
||||||
|
|
||||||
/* UE x PDSCH energy */
|
/* a bit of space */
|
||||||
w = new_xy_plot(g, 128, 55, "", 50);
|
line = new_container(g, HORIZONTAL);
|
||||||
e->pdsch_energy_ue_xy_plot = w;
|
widget_add_child(g, top_container, line, -1);
|
||||||
|
w = new_space(g, 1, 10);
|
||||||
widget_add_child(g, line, w, -1);
|
widget_add_child(g, line, w, -1);
|
||||||
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
|
||||||
l = new_ttilog(h, database,
|
|
||||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level00", 1);
|
|
||||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
|
||||||
logger_add_view(l, v);
|
|
||||||
e->pdsch_energy_logger = l;
|
|
||||||
l = new_ttilog(h, database,
|
|
||||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level01", 1);
|
|
||||||
v = new_view_tti(10, g, w, new_color(g, "#00ff00"));
|
|
||||||
logger_add_view(l, v);
|
|
||||||
e->pdsch_energy_logger = l;
|
|
||||||
l = new_ttilog(h, database,
|
|
||||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level10", 1);
|
|
||||||
v = new_view_tti(10, g, w, new_color(g, "#0f0f0f"));
|
|
||||||
logger_add_view(l, v);
|
|
||||||
e->pdsch_energy_logger = l;
|
|
||||||
l = new_ttilog(h, database,
|
|
||||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level11", 1);
|
|
||||||
v = new_view_tti(10, g, w, new_color(g, "#0000ff"));
|
|
||||||
logger_add_view(l, v);
|
|
||||||
e->pdsch_energy_logger = l;
|
|
||||||
|
|
||||||
/* UE x PDCCH energy */
|
|
||||||
w = new_xy_plot(g, 128, 55, "", 50);
|
|
||||||
e->pdcch_energy_ue_xy_plot = w;
|
|
||||||
widget_add_child(g, line, w, -1);
|
|
||||||
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
|
||||||
l = new_ttilog(h, database,
|
|
||||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level00", 1);
|
|
||||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
|
||||||
logger_add_view(l, v);
|
|
||||||
e->pdcch_energy_logger = l;
|
|
||||||
l = new_ttilog(h, database,
|
|
||||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level01", 1);
|
|
||||||
v = new_view_tti(10, g, w, new_color(g, "#00ff00"));
|
|
||||||
logger_add_view(l, v);
|
|
||||||
e->pdcch_energy_logger = l;
|
|
||||||
l = new_ttilog(h, database,
|
|
||||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level10", 1);
|
|
||||||
v = new_view_tti(10, g, w, new_color(g, "#0f0f0f"));
|
|
||||||
logger_add_view(l, v);
|
|
||||||
e->pdcch_energy_logger = l;
|
|
||||||
l = new_ttilog(h, database,
|
|
||||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level11", 1);
|
|
||||||
v = new_view_tti(10, g, w, new_color(g, "#0000ff"));
|
|
||||||
logger_add_view(l, v);
|
|
||||||
e->pdcch_energy_logger = l;
|
|
||||||
|
|
||||||
/* UE x PDCCH IQ data */
|
|
||||||
w = new_xy_plot(g, 55, 55, "", 50);
|
|
||||||
e->pdcch_iq_ue_xy_plot = w;
|
|
||||||
widget_add_child(g, line, w, -1);
|
|
||||||
xy_plot_set_range(g, w, -100, 100, -100, 100);
|
|
||||||
l = new_iqlog(h, database, "UE_PHY_PDCCH_IQ", "nb_rb",
|
|
||||||
"NB_RB_DL", "symbols_per_tti", "rxdataF_comp");
|
|
||||||
v = new_view_xy(100*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE);
|
|
||||||
logger_add_view(l, v);
|
|
||||||
e->pdcch_iq_ue_logger = l;
|
|
||||||
|
|
||||||
/* UE x PDCCH IQ data */
|
|
||||||
/*w = new_xy_plot(g, 55, 55, "", 50);
|
|
||||||
e->pdcch_iq_ue_xy_plot = w;
|
|
||||||
widget_add_child(g, line, w, -1);
|
|
||||||
xy_plot_set_range(g, w, -2000, 2000, -2000, 2000);
|
|
||||||
l = new_iqdotlog(h, database, "UE_PHY_PDCCH_IQ", "I", "Q");
|
|
||||||
v = new_view_xy(500, 10, g, w, new_color(g,"#000"), XY_LOOP_MODE);
|
|
||||||
logger_add_view(l, v);
|
|
||||||
e->pdcch_iq_ue_logger = l;*/
|
|
||||||
|
|
||||||
/* UE x DL mcs */
|
/* UE x DL mcs */
|
||||||
line = new_container(g, HORIZONTAL);
|
line = new_container(g, HORIZONTAL);
|
||||||
widget_add_child(g, top_container, line, -1);
|
widget_add_child(g, top_container, line, -1);
|
||||||
@@ -448,7 +286,7 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
|||||||
xy_plot_set_range(g, w, 0, 1024*10, -2, 30);
|
xy_plot_set_range(g, w, 0, 1024*10, -2, 30);
|
||||||
e->ul_mcs_xy_plot = w;
|
e->ul_mcs_xy_plot = w;
|
||||||
widget_add_child(g, line, w, -1);
|
widget_add_child(g, line, w, -1);
|
||||||
l = new_ticked_ttilog(h, database, "UE_PHY_UL_TICK", "frame", "subframe",
|
l = new_ticked_ttilog(h, database, "UE_PHY_DL_TICK", "frame", "subframe",
|
||||||
"UE_PHY_ULSCH_UE_DCI", "mcs", 0, -1);
|
"UE_PHY_ULSCH_UE_DCI", "mcs", 0, -1);
|
||||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||||
logger_add_view(l, v);
|
logger_add_view(l, v);
|
||||||
@@ -471,7 +309,7 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
|||||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"));
|
v = new_view_tti(10, g, w, new_color(g, "#720c0c"));
|
||||||
logger_add_view(l, v);
|
logger_add_view(l, v);
|
||||||
e->pusch_ampl_logger = l;
|
e->pusch_ampl_logger = l;
|
||||||
|
|
||||||
/* UE x PUCCH TX Power */
|
/* UE x PUCCH TX Power */
|
||||||
// line = new_container(g, HORIZONTAL);
|
// line = new_container(g, HORIZONTAL);
|
||||||
// widget_add_child(g, top_container, line, -1);
|
// widget_add_child(g, top_container, line, -1);
|
||||||
@@ -489,8 +327,81 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
|||||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"));
|
v = new_view_tti(10, g, w, new_color(g, "#720c0c"));
|
||||||
logger_add_view(l, v);
|
logger_add_view(l, v);
|
||||||
e->pucch_ampl_logger = l;
|
e->pucch_ampl_logger = l;
|
||||||
|
|
||||||
|
/* UE x PDSCH energy */
|
||||||
|
w = new_xy_plot(g, 128, 55, "", 50);
|
||||||
|
e->pdsch_energy_ue_xy_plot = w;
|
||||||
|
widget_add_child(g, line, w, -1);
|
||||||
|
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
||||||
|
l = new_ttilog(h, database,
|
||||||
|
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level00", 1);
|
||||||
|
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pdsch_energy_logger = l;
|
||||||
|
l = new_ttilog(h, database,
|
||||||
|
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level01", 1);
|
||||||
|
v = new_view_tti(10, g, w, new_color(g, "#00ff00"));
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pdsch_energy_logger = l;
|
||||||
|
l = new_ttilog(h, database,
|
||||||
|
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level10", 1);
|
||||||
|
v = new_view_tti(10, g, w, new_color(g, "#0f0f0f"));
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pdsch_energy_logger = l;
|
||||||
|
l = new_ttilog(h, database,
|
||||||
|
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level11", 1);
|
||||||
|
v = new_view_tti(10, g, w, new_color(g, "#0000ff"));
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pdsch_energy_logger = l;
|
||||||
|
|
||||||
|
/* UE x PDCCH energy */
|
||||||
|
w = new_xy_plot(g, 128, 55, "", 50);
|
||||||
|
e->pdcch_energy_ue_xy_plot = w;
|
||||||
|
widget_add_child(g, line, w, -1);
|
||||||
|
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
||||||
|
l = new_ttilog(h, database,
|
||||||
|
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level00", 1);
|
||||||
|
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pdcch_energy_logger = l;
|
||||||
|
l = new_ttilog(h, database,
|
||||||
|
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level01", 1);
|
||||||
|
v = new_view_tti(10, g, w, new_color(g, "#00ff00"));
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pdcch_energy_logger = l;
|
||||||
|
l = new_ttilog(h, database,
|
||||||
|
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level10", 1);
|
||||||
|
v = new_view_tti(10, g, w, new_color(g, "#0f0f0f"));
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pdcch_energy_logger = l;
|
||||||
|
l = new_ttilog(h, database,
|
||||||
|
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level11", 1);
|
||||||
|
v = new_view_tti(10, g, w, new_color(g, "#0000ff"));
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pdcch_energy_logger = l;
|
||||||
|
|
||||||
|
/* UE x PDCCH IQ data */
|
||||||
|
w = new_xy_plot(g, 55, 55, "", 50);
|
||||||
|
e->pdcch_iq_ue_xy_plot = w;
|
||||||
|
widget_add_child(g, line, w, -1);
|
||||||
|
xy_plot_set_range(g, w, -100, 100, -100, 100);
|
||||||
|
l = new_iqlog(h, database, "UE_PHY_PDCCH_IQ", "nb_rb",
|
||||||
|
"NB_RB_DL", "symbols_per_tti", "rxdataF_comp");
|
||||||
|
v = new_view_xy(100*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE);
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pdcch_iq_ue_logger = l;
|
||||||
|
|
||||||
|
/* UE x PDCCH IQ data */
|
||||||
|
/*w = new_xy_plot(g, 55, 55, "", 50);
|
||||||
|
e->pdcch_iq_ue_xy_plot = w;
|
||||||
|
widget_add_child(g, line, w, -1);
|
||||||
|
xy_plot_set_range(g, w, -2000, 2000, -2000, 2000);
|
||||||
|
l = new_iqdotlog(h, database, "UE_PHY_PDCCH_IQ", "I", "Q");
|
||||||
|
v = new_view_xy(500, 10, g, w, new_color(g,"#000"), XY_LOOP_MODE);
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pdcch_iq_ue_logger = l;*/
|
||||||
|
|
||||||
|
|
||||||
/* downlink/uplink UE DCIs */
|
/* downlink/uplink UE DCIs */
|
||||||
widget_add_child(g, top_container,
|
widget_add_child(g, top_container,
|
||||||
new_label(g,"DL/UL TICK/DCI/ACK/NACK [all UEs]"), -1);
|
new_label(g,"DL/UL TICK/DCI/ACK/NACK [all UEs]"), -1);
|
||||||
@@ -600,14 +511,14 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
|||||||
logger_add_view(timelog, subview);
|
logger_add_view(timelog, subview);
|
||||||
e->ul_dci_logger[i] = timelog;
|
e->ul_dci_logger[i] = timelog;
|
||||||
/* retransmission */
|
/* retransmission */
|
||||||
|
|
||||||
timelog = new_ticklog(h, database,
|
timelog = new_ticklog(h, database,
|
||||||
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", "frame", "subframe");
|
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", "frame", "subframe");
|
||||||
subview = new_subview_ticktime(timeview, i+9+1,
|
subview = new_subview_ticktime(timeview, i+9+1,
|
||||||
new_color(g,"#99f"), 3600*1000);
|
new_color(g,"#99f"), 3600*1000);
|
||||||
logger_add_view(timelog, subview);
|
logger_add_view(timelog, subview);
|
||||||
e->ul_dci_retransmission_logger[i] = timelog;
|
e->ul_dci_retransmission_logger[i] = timelog;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* UL ACK */
|
/* UL ACK */
|
||||||
@@ -707,8 +618,6 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
set_current_ue(g, ed, 0);
|
set_current_ue(g, ed, 0);
|
||||||
register_notifier(g, "click", e->prev_ue_button, click, ed);
|
|
||||||
register_notifier(g, "click", e->next_ue_button, click, ed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void view_add_log(view *v, char *log, event_handler *h, void *database,
|
void view_add_log(view *v, char *log, event_handler *h, void *database,
|
||||||
@@ -824,13 +733,11 @@ int main(int n, char **v)
|
|||||||
on_off(database, "UE_PHY_PUSCH_TX_POWER", is_on, 1);
|
on_off(database, "UE_PHY_PUSCH_TX_POWER", is_on, 1);
|
||||||
on_off(database, "UE_PHY_PUCCH_TX_POWER", is_on, 1);
|
on_off(database, "UE_PHY_PUCCH_TX_POWER", is_on, 1);
|
||||||
on_off(database, "UE_PHY_MEAS", is_on, 1);
|
on_off(database, "UE_PHY_MEAS", is_on, 1);
|
||||||
|
|
||||||
on_off(database, "LEGACY_GROUP_INFO", is_on, 1);
|
on_off(database, "LEGACY_GROUP_INFO", is_on, 1);
|
||||||
on_off(database, "LEGACY_GROUP_ERROR", is_on, 1);
|
on_off(database, "LEGACY_GROUP_ERROR", is_on, 1);
|
||||||
on_off(database, "LEGACY_GROUP_WARNING", is_on, 1);
|
on_off(database, "LEGACY_GROUP_WARNING", is_on, 1);
|
||||||
|
|
||||||
view_add_log(eg.phyview, "UE_PHY_UL_TICK", h, database, is_on);
|
|
||||||
view_add_log(eg.phyview, "UE_PHY_DL_TICK", h, database, is_on);
|
|
||||||
view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_DCI", h, database, is_on);
|
view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_DCI", h, database, is_on);
|
||||||
view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_ACK", h, database, is_on);
|
view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_ACK", h, database, is_on);
|
||||||
view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_NACK",h, database, is_on);
|
view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_NACK",h, database, is_on);
|
||||||
@@ -838,8 +745,6 @@ int main(int n, char **v)
|
|||||||
view_add_log(eg.phyview, "UE_PHY_ULSCH_UE_ACK", h, database, is_on);
|
view_add_log(eg.phyview, "UE_PHY_ULSCH_UE_ACK", h, database, is_on);
|
||||||
view_add_log(eg.phyview, "UE_PHY_ULSCH_UE_NACK", h, database, is_on);
|
view_add_log(eg.phyview, "UE_PHY_ULSCH_UE_NACK", h, database, is_on);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* deactivate those two by default, they are a bit heavy */
|
/* deactivate those two by default, they are a bit heavy */
|
||||||
//on_off(database, "ENB_MAC_UE_UL_SDU_WITH_DATA", is_on, 0);
|
//on_off(database, "ENB_MAC_UE_UL_SDU_WITH_DATA", is_on, 0);
|
||||||
//on_off(database, "ENB_MAC_UE_UL_PDU_WITH_DATA", is_on, 0);
|
//on_off(database, "ENB_MAC_UE_UL_PDU_WITH_DATA", is_on, 0);
|
||||||
|
|||||||
@@ -21,31 +21,55 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
|
#include "common/utils/LOG/log.h"
|
||||||
|
static char nfapi_str_mode[6][24] = {"MONOLITHIC","PNF","VNF","UE_STUB_PNF","UE_STUB_OFFNET","<UNKNOWN NFAPI MODE>"};
|
||||||
|
|
||||||
void set_thread_priority(int priority)
|
typedef struct {
|
||||||
{
|
nfapi_mode_t nfapi_mode;
|
||||||
|
} nfapi_params_t;
|
||||||
|
|
||||||
|
static nfapi_params_t nfapi_params;
|
||||||
|
|
||||||
|
void set_thread_priority(int priority) {
|
||||||
//printf("%s(priority:%d)\n", __FUNCTION__, priority);
|
//printf("%s(priority:%d)\n", __FUNCTION__, priority);
|
||||||
|
|
||||||
pthread_attr_t ptAttr;
|
pthread_attr_t ptAttr;
|
||||||
|
|
||||||
struct sched_param schedParam;
|
struct sched_param schedParam;
|
||||||
schedParam.__sched_priority = priority; //79;
|
schedParam.__sched_priority = priority; //79;
|
||||||
if(sched_setscheduler(0, SCHED_RR, &schedParam) != 0)
|
|
||||||
{
|
if(sched_setscheduler(0, SCHED_RR, &schedParam) != 0) {
|
||||||
printf("Failed to set scheduler to SCHED_RR\n");
|
printf("Failed to set scheduler to SCHED_RR\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pthread_attr_setschedpolicy(&ptAttr, SCHED_RR) != 0)
|
if(pthread_attr_setschedpolicy(&ptAttr, SCHED_RR) != 0) {
|
||||||
{
|
|
||||||
printf("Failed to set pthread sched policy SCHED_RR\n");
|
printf("Failed to set pthread sched policy SCHED_RR\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_attr_setinheritsched(&ptAttr, PTHREAD_EXPLICIT_SCHED);
|
pthread_attr_setinheritsched(&ptAttr, PTHREAD_EXPLICIT_SCHED);
|
||||||
|
|
||||||
struct sched_param thread_params;
|
struct sched_param thread_params;
|
||||||
thread_params.sched_priority = 20;
|
thread_params.sched_priority = 20;
|
||||||
if(pthread_attr_setschedparam(&ptAttr, &thread_params) != 0)
|
|
||||||
{
|
if(pthread_attr_setschedparam(&ptAttr, &thread_params) != 0) {
|
||||||
printf("failed to set sched param\n");
|
printf("failed to set sched param\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *nfapi_get_strmode(void) {
|
||||||
|
if (nfapi_params.nfapi_mode > NFAPI_MODE_UNKNOWN)
|
||||||
|
return nfapi_str_mode[NFAPI_MODE_UNKNOWN];
|
||||||
|
|
||||||
|
return nfapi_str_mode[nfapi_params.nfapi_mode];
|
||||||
|
}
|
||||||
|
|
||||||
|
void nfapi_logmode() {
|
||||||
|
LOG_I(ENB_APP,"nfapi running mode: %s\n",nfapi_get_strmode());
|
||||||
|
}
|
||||||
|
|
||||||
|
nfapi_mode_t nfapi_getmode(void) {
|
||||||
|
return nfapi_params.nfapi_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nfapi_setmode(nfapi_mode_t nfapi_mode) {
|
||||||
|
nfapi_params.nfapi_mode = nfapi_mode;
|
||||||
|
nfapi_logmode();
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "nfapi_pnf_interface.h"
|
#include "nfapi_pnf_interface.h"
|
||||||
#include "nfapi.h"
|
#include "nfapi.h"
|
||||||
#include "nfapi_pnf.h"
|
#include "nfapi_pnf.h"
|
||||||
@@ -76,7 +77,7 @@ extern void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame, int subfra
|
|||||||
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_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,L1_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;
|
|
||||||
|
|
||||||
nfapi_tx_request_pdu_t *tx_request_pdu[1023][10][10]; // [frame][subframe][max_num_pdus]
|
nfapi_tx_request_pdu_t *tx_request_pdu[1023][10][10]; // [frame][subframe][max_num_pdus]
|
||||||
|
|
||||||
@@ -485,7 +486,7 @@ int config_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfap
|
|||||||
// to keep only the necessary just to keep the nfapi FSM rolling by sending a dummy response.
|
// to keep only the necessary just to keep the nfapi FSM rolling by sending a dummy response.
|
||||||
LTE_DL_FRAME_PARMS *fp;
|
LTE_DL_FRAME_PARMS *fp;
|
||||||
|
|
||||||
if (nfapi_mode!=3) {
|
if (NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
|
||||||
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||||
fp = &eNB->frame_parms;
|
fp = &eNB->frame_parms;
|
||||||
} else {
|
} else {
|
||||||
@@ -647,7 +648,7 @@ int config_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfap
|
|||||||
num_tlv++;
|
num_tlv++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nfapi_mode!=3) {
|
if(NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
|
||||||
printf("[PNF] CONFIG_REQUEST[num_tlv:%d] TLVs processed:%d\n", req->num_tlv, num_tlv);
|
printf("[PNF] CONFIG_REQUEST[num_tlv:%d] TLVs processed:%d\n", req->num_tlv, num_tlv);
|
||||||
printf("[PNF] Simulating PHY CONFIG - DJP\n");
|
printf("[PNF] Simulating PHY CONFIG - DJP\n");
|
||||||
PHY_Config_t phy_config;
|
PHY_Config_t phy_config;
|
||||||
@@ -672,7 +673,7 @@ int config_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfap
|
|||||||
nfapi_pnf_config_resp(config, &nfapi_resp);
|
nfapi_pnf_config_resp(config, &nfapi_resp);
|
||||||
printf("[PNF] Sent NFAPI_CONFIG_RESPONSE phy_id:%d\n", phy_info->id);
|
printf("[PNF] Sent NFAPI_CONFIG_RESPONSE phy_id:%d\n", phy_info->id);
|
||||||
|
|
||||||
if(nfapi_mode ==3)
|
if(NFAPI_MODE==NFAPI_UE_STUB_PNF)
|
||||||
free(fp);
|
free(fp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1023,7 +1024,7 @@ int start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfapi
|
|||||||
p7_config->tx_req = &pnf_phy_tx_req;
|
p7_config->tx_req = &pnf_phy_tx_req;
|
||||||
p7_config->lbt_dl_config_req = &pnf_phy_lbt_dl_config_req;
|
p7_config->lbt_dl_config_req = &pnf_phy_lbt_dl_config_req;
|
||||||
|
|
||||||
if (nfapi_mode==3) {
|
if (NFAPI_MODE==NFAPI_UE_STUB_PNF) {
|
||||||
p7_config->dl_config_req = &memcpy_dl_config_req;
|
p7_config->dl_config_req = &memcpy_dl_config_req;
|
||||||
p7_config->ul_config_req = &memcpy_ul_config_req;
|
p7_config->ul_config_req = &memcpy_ul_config_req;
|
||||||
p7_config->hi_dci0_req = &memcpy_hi_dci0_req;
|
p7_config->hi_dci0_req = &memcpy_hi_dci0_req;
|
||||||
@@ -1080,7 +1081,7 @@ int start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfapi
|
|||||||
//phy_init_RU(RC.ru[0]);
|
//phy_init_RU(RC.ru[0]);
|
||||||
printf("[PNF] About to call init_eNB_afterRU()\n");
|
printf("[PNF] About to call init_eNB_afterRU()\n");
|
||||||
|
|
||||||
if (nfapi_mode != 3) {
|
if (NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
|
||||||
init_eNB_afterRU();
|
init_eNB_afterRU();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1364,8 +1365,8 @@ void *pnf_start_thread(void *ptr) {
|
|||||||
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port) {
|
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port) {
|
||||||
printf("%s() PNF\n\n\n\n\n\n", __FUNCTION__);
|
printf("%s() PNF\n\n\n\n\n\n", __FUNCTION__);
|
||||||
|
|
||||||
if(nfapi_mode!=3) {
|
if(NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
|
||||||
nfapi_mode = 1; // PNF!
|
nfapi_setmode(NFAPI_PNF); // PNF!
|
||||||
}
|
}
|
||||||
|
|
||||||
nfapi_pnf_config_t *config = nfapi_pnf_config_create();
|
nfapi_pnf_config_t *config = nfapi_pnf_config_create();
|
||||||
|
|||||||
@@ -904,10 +904,10 @@ void vnf_start_thread(void *ptr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static vnf_info vnf;
|
static vnf_info vnf;
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
/*------------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------------*/
|
||||||
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
|
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
|
||||||
nfapi_mode = 2;
|
nfapi_setmode(NFAPI_MODE_VNF);
|
||||||
memset(&vnf, 0, sizeof(vnf));
|
memset(&vnf, 0, sizeof(vnf));
|
||||||
memset(vnf.p7_vnfs, 0, sizeof(vnf.p7_vnfs));
|
memset(vnf.p7_vnfs, 0, sizeof(vnf.p7_vnfs));
|
||||||
vnf.p7_vnfs[0].timing_window = 32;
|
vnf.p7_vnfs[0].timing_window = 32;
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2017 Cisco Systems, Inc.
|
* Copyright 2017 Cisco Systems, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
@@ -20,48 +20,62 @@
|
|||||||
#include "nfapi_interface.h"
|
#include "nfapi_interface.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
P5_VENDOR_EXT_REQ = NFAPI_VENDOR_EXT_MSG_MIN,
|
P5_VENDOR_EXT_REQ = NFAPI_VENDOR_EXT_MSG_MIN,
|
||||||
P5_VENDOR_EXT_RSP,
|
P5_VENDOR_EXT_RSP,
|
||||||
|
|
||||||
P7_VENDOR_EXT_REQ,
|
P7_VENDOR_EXT_REQ,
|
||||||
P7_VENDOR_EXT_IND
|
P7_VENDOR_EXT_IND
|
||||||
|
|
||||||
} vendor_ext_message_id_e;
|
} vendor_ext_message_id_e;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_p4_p5_message_header_t header;
|
nfapi_p4_p5_message_header_t header;
|
||||||
uint16_t dummy1;
|
uint16_t dummy1;
|
||||||
uint16_t dummy2;
|
uint16_t dummy2;
|
||||||
} vendor_ext_p5_req;
|
} vendor_ext_p5_req;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_p4_p5_message_header_t header;
|
nfapi_p4_p5_message_header_t header;
|
||||||
uint16_t error_code;
|
uint16_t error_code;
|
||||||
} vendor_ext_p5_rsp;
|
} vendor_ext_p5_rsp;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_p7_message_header_t header;
|
nfapi_p7_message_header_t header;
|
||||||
uint16_t dummy1;
|
uint16_t dummy1;
|
||||||
uint16_t dummy2;
|
uint16_t dummy2;
|
||||||
} vendor_ext_p7_req;
|
} vendor_ext_p7_req;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_p7_message_header_t header;
|
nfapi_p7_message_header_t header;
|
||||||
uint16_t error_code;
|
uint16_t error_code;
|
||||||
} vendor_ext_p7_ind;
|
} vendor_ext_p7_ind;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint32_t dummy;
|
uint32_t dummy;
|
||||||
} vendor_ext_tlv_1;
|
} vendor_ext_tlv_1;
|
||||||
|
|
||||||
#define VENDOR_EXT_TLV_1_TAG 0xF001
|
#define VENDOR_EXT_TLV_1_TAG 0xF001
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint32_t dummy;
|
uint32_t dummy;
|
||||||
} vendor_ext_tlv_2;
|
} vendor_ext_tlv_2;
|
||||||
|
|
||||||
#define VENDOR_EXT_TLV_2_TAG 0xF002
|
#define VENDOR_EXT_TLV_2_TAG 0xF002
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NFAPI_MONOLITHIC=0,
|
||||||
|
NFAPI_MODE_PNF,
|
||||||
|
NFAPI_MODE_VNF,
|
||||||
|
NFAPI_UE_STUB_PNF,
|
||||||
|
NFAPI_UE_STUB_OFFNET,
|
||||||
|
NFAPI_MODE_UNKNOWN
|
||||||
|
} nfapi_mode_t;
|
||||||
|
|
||||||
|
char *nfapi_get_strmode(void);
|
||||||
|
void nfapi_logmode(void);
|
||||||
|
nfapi_mode_t nfapi_getmode(void);
|
||||||
|
void nfapi_setmode(nfapi_mode_t nfapi_mode);
|
||||||
|
#define NFAPI_MODE (nfapi_getmode())
|
||||||
#endif // _VENDOR_EXT_
|
#endif // _VENDOR_EXT_
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ int lte_segmentation(unsigned char *input_buffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((*C)>MAX_NUM_DLSCH_SEGMENTS) {
|
if ((*C)>MAX_NUM_DLSCH_SEGMENTS) {
|
||||||
|
printf("%d\n",*(int*)0);
|
||||||
LOG_E(PHY,"lte_segmentation.c: too many segments %d, B %d, L %d, Bprime %d\n",*C,B,L,Bprime);
|
LOG_E(PHY,"lte_segmentation.c: too many segments %d, B %d, L %d, Bprime %d\n",*C,B,L,Bprime);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|||||||
+230
-332
@@ -34,19 +34,17 @@
|
|||||||
#include "PHY/LTE_TRANSPORT/transport_common_proto.h"
|
#include "PHY/LTE_TRANSPORT/transport_common_proto.h"
|
||||||
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
||||||
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
void init_7_5KHz(void);
|
void init_7_5KHz(void);
|
||||||
|
|
||||||
uint8_t dmrs1_tab_ue[8] = {0,2,3,4,6,8,9,10};
|
uint8_t dmrs1_tab_ue[8] = {0,2,3,4,6,8,9,10};
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
|
|
||||||
void phy_config_sib1_ue(module_id_t Mod_id,int CC_id,
|
void phy_config_sib1_ue(module_id_t Mod_id,int CC_id,
|
||||||
uint8_t eNB_id,
|
uint8_t eNB_id,
|
||||||
LTE_TDD_Config_t *tdd_Config,
|
LTE_TDD_Config_t *tdd_Config,
|
||||||
uint8_t SIwindowsize,
|
uint8_t SIwindowsize,
|
||||||
uint16_t SIperiod)
|
uint16_t SIperiod) {
|
||||||
{
|
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms;
|
||||||
|
|
||||||
if (tdd_Config) {
|
if (tdd_Config) {
|
||||||
@@ -64,44 +62,29 @@ void phy_config_sib2_ue(module_id_t Mod_id,int CC_id,
|
|||||||
LTE_ARFCN_ValueEUTRA_t *ul_CarrierFreq,
|
LTE_ARFCN_ValueEUTRA_t *ul_CarrierFreq,
|
||||||
long *ul_Bandwidth,
|
long *ul_Bandwidth,
|
||||||
LTE_AdditionalSpectrumEmission_t *additionalSpectrumEmission,
|
LTE_AdditionalSpectrumEmission_t *additionalSpectrumEmission,
|
||||||
struct LTE_MBSFN_SubframeConfigList *mbsfn_SubframeConfigList)
|
struct LTE_MBSFN_SubframeConfigList *mbsfn_SubframeConfigList) {
|
||||||
{
|
|
||||||
|
|
||||||
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||||
LTE_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
LOG_I(PHY,"[UE%d] Applying radioResourceConfigCommon from eNB%d\n",Mod_id,eNB_id);
|
LOG_I(PHY,"[UE%d] Applying radioResourceConfigCommon from eNB%d\n",Mod_id,eNB_id);
|
||||||
|
|
||||||
fp->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex;
|
fp->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex;
|
||||||
|
|
||||||
fp->prach_config_common.prach_Config_enabled=1;
|
fp->prach_config_common.prach_Config_enabled=1;
|
||||||
fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex;
|
fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex;
|
||||||
fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag;
|
fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag;
|
||||||
fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig;
|
fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig;
|
||||||
fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset;
|
fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset;
|
||||||
|
|
||||||
compute_prach_seq(fp->prach_config_common.rootSequenceIndex,
|
compute_prach_seq(fp->prach_config_common.rootSequenceIndex,
|
||||||
fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
|
fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
|
||||||
fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
|
fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
|
||||||
fp->prach_config_common.prach_ConfigInfo.highSpeedFlag,
|
fp->prach_config_common.prach_ConfigInfo.highSpeedFlag,
|
||||||
fp->frame_type,ue->X_u);
|
fp->frame_type,ue->X_u);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift;
|
fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift;
|
||||||
fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI;
|
fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI;
|
||||||
fp->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN;
|
fp->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN;
|
||||||
fp->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN;
|
fp->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fp->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower;
|
fp->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower;
|
||||||
fp->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b;
|
fp->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b;
|
||||||
|
|
||||||
|
|
||||||
fp->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB;
|
fp->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB;
|
||||||
fp->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode;
|
fp->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode;
|
||||||
fp->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset;
|
fp->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset;
|
||||||
@@ -110,8 +93,6 @@ void phy_config_sib2_ue(module_id_t Mod_id,int CC_id,
|
|||||||
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH;
|
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH;
|
||||||
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled;
|
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled;
|
||||||
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab_ue[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift];
|
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab_ue[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift];
|
||||||
|
|
||||||
|
|
||||||
init_ul_hopping(fp);
|
init_ul_hopping(fp);
|
||||||
fp->soundingrs_ul_config_common.enabled_flag = 0;
|
fp->soundingrs_ul_config_common.enabled_flag = 0;
|
||||||
|
|
||||||
@@ -127,8 +108,6 @@ void phy_config_sib2_ue(module_id_t Mod_id,int CC_id,
|
|||||||
fp->soundingrs_ul_config_common.srs_MaxUpPts = 0;
|
fp->soundingrs_ul_config_common.srs_MaxUpPts = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fp->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH;
|
fp->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH;
|
||||||
fp->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha;
|
fp->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha;
|
||||||
fp->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH;
|
fp->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH;
|
||||||
@@ -138,16 +117,11 @@ void phy_config_sib2_ue(module_id_t Mod_id,int CC_id,
|
|||||||
fp->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2;
|
fp->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2;
|
||||||
fp->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a;
|
fp->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a;
|
||||||
fp->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b;
|
fp->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b;
|
||||||
|
|
||||||
fp->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx;
|
fp->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx;
|
||||||
|
|
||||||
// Now configure some of the Physical Channels
|
// Now configure some of the Physical Channels
|
||||||
|
|
||||||
// PUCCH
|
// PUCCH
|
||||||
init_ncs_cell(fp,ue->ncs_cell);
|
init_ncs_cell(fp,ue->ncs_cell);
|
||||||
|
|
||||||
init_ul_hopping(fp);
|
init_ul_hopping(fp);
|
||||||
|
|
||||||
// PCH
|
// PCH
|
||||||
init_ue_paging_info(ue,radioResourceConfigCommon->pcch_Config.defaultPagingCycle,radioResourceConfigCommon->pcch_Config.nB);
|
init_ue_paging_info(ue,radioResourceConfigCommon->pcch_Config.defaultPagingCycle,radioResourceConfigCommon->pcch_Config.nB);
|
||||||
|
|
||||||
@@ -171,7 +145,6 @@ void phy_config_sib2_ue(module_id_t Mod_id,int CC_id,
|
|||||||
mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]|
|
mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]|
|
||||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)|
|
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)|
|
||||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]<<16);
|
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]<<16);
|
||||||
|
|
||||||
LOG_I(PHY, "[CONFIG] LTE_MBSFN_SubframeConfig[%d] pattern is %x\n", i,
|
LOG_I(PHY, "[CONFIG] LTE_MBSFN_SubframeConfig[%d] pattern is %x\n", i,
|
||||||
fp->MBSFN_config[i].mbsfn_SubframeConfig);
|
fp->MBSFN_config[i].mbsfn_SubframeConfig);
|
||||||
}
|
}
|
||||||
@@ -179,16 +152,11 @@ void phy_config_sib2_ue(module_id_t Mod_id,int CC_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_OUT);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void phy_config_sib13_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,int mbsfn_Area_idx,
|
void phy_config_sib13_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,int mbsfn_Area_idx,
|
||||||
long mbsfn_AreaId_r9)
|
long mbsfn_AreaId_r9) {
|
||||||
{
|
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms;
|
||||||
|
|
||||||
|
|
||||||
LOG_I(PHY,"[UE%d] Applying MBSFN_Area_id %ld for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx);
|
LOG_I(PHY,"[UE%d] Applying MBSFN_Area_id %ld for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx);
|
||||||
|
|
||||||
if (mbsfn_Area_idx == 0) {
|
if (mbsfn_Area_idx == 0) {
|
||||||
@@ -197,16 +165,13 @@ void phy_config_sib13_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,int mbsfn_A
|
|||||||
}
|
}
|
||||||
|
|
||||||
lte_gold_mbsfn(fp,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_mbsfn_table,fp->Nid_cell_mbsfn);
|
lte_gold_mbsfn(fp,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_mbsfn_table,fp->Nid_cell_mbsfn);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configures UE MAC and PHY with radioResourceCommon received in mobilityControlInfo IE during Handover
|
* Configures UE MAC and PHY with radioResourceCommon received in mobilityControlInfo IE during Handover
|
||||||
*/
|
*/
|
||||||
void phy_config_afterHO_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_id, LTE_MobilityControlInfo_t *mobilityControlInfo, uint8_t ho_failed)
|
void phy_config_afterHO_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_id, LTE_MobilityControlInfo_t *mobilityControlInfo, uint8_t ho_failed) {
|
||||||
{
|
|
||||||
|
|
||||||
if(mobilityControlInfo!=NULL) {
|
if(mobilityControlInfo!=NULL) {
|
||||||
LTE_RadioResourceConfigCommon_t *radioResourceConfigCommon = &mobilityControlInfo->radioResourceConfigCommon;
|
LTE_RadioResourceConfigCommon_t *radioResourceConfigCommon = &mobilityControlInfo->radioResourceConfigCommon;
|
||||||
LOG_I(PHY,"radioResourceConfigCommon %p\n", radioResourceConfigCommon);
|
LOG_I(PHY,"radioResourceConfigCommon %p\n", radioResourceConfigCommon);
|
||||||
@@ -215,44 +180,35 @@ void phy_config_afterHO_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_id, LTE_
|
|||||||
sizeof(LTE_DL_FRAME_PARMS));
|
sizeof(LTE_DL_FRAME_PARMS));
|
||||||
PHY_vars_UE_g[Mod_id][CC_id]->ho_triggered = 1;
|
PHY_vars_UE_g[Mod_id][CC_id]->ho_triggered = 1;
|
||||||
//PHY_vars_UE_g[UE_id]->UE_mode[0] = PRACH;
|
//PHY_vars_UE_g[UE_id]->UE_mode[0] = PRACH;
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms;
|
||||||
// int N_ZC;
|
// int N_ZC;
|
||||||
// uint8_t prach_fmt;
|
// uint8_t prach_fmt;
|
||||||
// int u;
|
// int u;
|
||||||
|
|
||||||
LOG_I(PHY,"[UE%d] Handover triggered: Applying radioResourceConfigCommon from eNB %d\n",
|
LOG_I(PHY,"[UE%d] Handover triggered: Applying radioResourceConfigCommon from eNB %d\n",
|
||||||
Mod_id,eNB_id);
|
Mod_id,eNB_id);
|
||||||
|
|
||||||
fp->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex;
|
fp->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex;
|
||||||
fp->prach_config_common.prach_Config_enabled=1;
|
fp->prach_config_common.prach_Config_enabled=1;
|
||||||
fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex;
|
fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex;
|
||||||
fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->highSpeedFlag;
|
fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->highSpeedFlag;
|
||||||
fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->zeroCorrelationZoneConfig;
|
fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->zeroCorrelationZoneConfig;
|
||||||
fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_FreqOffset;
|
fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_FreqOffset;
|
||||||
|
|
||||||
// prach_fmt = get_prach_fmt(radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex,fp->frame_type);
|
// prach_fmt = get_prach_fmt(radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex,fp->frame_type);
|
||||||
// N_ZC = (prach_fmt <4)?839:139;
|
// N_ZC = (prach_fmt <4)?839:139;
|
||||||
// u = (prach_fmt < 4) ? prach_root_sequence_map0_3[fp->prach_config_common.rootSequenceIndex] :
|
// u = (prach_fmt < 4) ? prach_root_sequence_map0_3[fp->prach_config_common.rootSequenceIndex] :
|
||||||
// prach_root_sequence_map4[fp->prach_config_common.rootSequenceIndex];
|
// prach_root_sequence_map4[fp->prach_config_common.rootSequenceIndex];
|
||||||
|
|
||||||
//compute_prach_seq(u,N_ZC, PHY_vars_UE_g[Mod_id]->X_u);
|
//compute_prach_seq(u,N_ZC, PHY_vars_UE_g[Mod_id]->X_u);
|
||||||
compute_prach_seq(PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.rootSequenceIndex,
|
compute_prach_seq(PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.rootSequenceIndex,
|
||||||
PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
|
PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
|
||||||
PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
|
PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,
|
||||||
PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,
|
PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,
|
||||||
fp->frame_type,
|
fp->frame_type,
|
||||||
PHY_vars_UE_g[Mod_id][CC_id]->X_u);
|
PHY_vars_UE_g[Mod_id][CC_id]->X_u);
|
||||||
|
|
||||||
|
|
||||||
fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon->deltaPUCCH_Shift;
|
fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon->deltaPUCCH_Shift;
|
||||||
fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon->nRB_CQI;
|
fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon->nRB_CQI;
|
||||||
fp->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon->nCS_AN;
|
fp->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon->nCS_AN;
|
||||||
fp->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon->n1PUCCH_AN;
|
fp->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon->n1PUCCH_AN;
|
||||||
fp->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon->referenceSignalPower;
|
fp->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon->referenceSignalPower;
|
||||||
fp->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon->p_b;
|
fp->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon->p_b;
|
||||||
|
|
||||||
|
|
||||||
fp->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB;
|
fp->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB;
|
||||||
fp->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode;
|
fp->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode;
|
||||||
fp->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset;
|
fp->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset;
|
||||||
@@ -261,7 +217,6 @@ void phy_config_afterHO_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_id, LTE_
|
|||||||
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH;
|
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH;
|
||||||
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled;
|
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled;
|
||||||
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift;
|
fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift;
|
||||||
|
|
||||||
init_ul_hopping(fp);
|
init_ul_hopping(fp);
|
||||||
fp->soundingrs_ul_config_common.enabled_flag = 0;
|
fp->soundingrs_ul_config_common.enabled_flag = 0;
|
||||||
|
|
||||||
@@ -286,7 +241,6 @@ void phy_config_afterHO_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_id, LTE_
|
|||||||
fp->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2;
|
fp->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2;
|
||||||
fp->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2a;
|
fp->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2a;
|
||||||
fp->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2b;
|
fp->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2b;
|
||||||
|
|
||||||
fp->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon->maxHARQ_Msg3Tx;
|
fp->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon->maxHARQ_Msg3Tx;
|
||||||
|
|
||||||
// Now configure some of the Physical Channels
|
// Now configure some of the Physical Channels
|
||||||
@@ -304,20 +258,14 @@ void phy_config_afterHO_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_id, LTE_
|
|||||||
//Target CellId
|
//Target CellId
|
||||||
fp->Nid_cell = mobilityControlInfo->targetPhysCellId;
|
fp->Nid_cell = mobilityControlInfo->targetPhysCellId;
|
||||||
fp->nushift = fp->Nid_cell%6;
|
fp->nushift = fp->Nid_cell%6;
|
||||||
|
|
||||||
// PUCCH
|
// PUCCH
|
||||||
init_ncs_cell(fp,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell);
|
init_ncs_cell(fp,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell);
|
||||||
|
|
||||||
init_ul_hopping(fp);
|
init_ul_hopping(fp);
|
||||||
|
|
||||||
// RNTI
|
// RNTI
|
||||||
|
|
||||||
|
|
||||||
PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[0][eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8);
|
PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[0][eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8);
|
||||||
PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8);
|
PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8);
|
||||||
|
|
||||||
LOG_I(PHY,"SET C-RNTI %x %x\n",PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[0][eNB_id]->crnti,
|
LOG_I(PHY,"SET C-RNTI %x %x\n",PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[0][eNB_id]->crnti,
|
||||||
PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_id]->crnti);
|
PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_id]->crnti);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ho_failed) {
|
if(ho_failed) {
|
||||||
@@ -327,12 +275,9 @@ void phy_config_afterHO_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_id, LTE_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void phy_config_meas_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index,uint8_t n_adj_cells,unsigned int *adj_cell_id)
|
void phy_config_meas_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index,uint8_t n_adj_cells,unsigned int *adj_cell_id) {
|
||||||
{
|
|
||||||
|
|
||||||
PHY_MEASUREMENTS *phy_meas = &PHY_vars_UE_g[Mod_id][CC_id]->measurements;
|
PHY_MEASUREMENTS *phy_meas = &PHY_vars_UE_g[Mod_id][CC_id]->measurements;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
LOG_I(PHY,"Configuring inter-cell measurements for %d cells, ids: \n",n_adj_cells);
|
LOG_I(PHY,"Configuring inter-cell measurements for %d cells, ids: \n",n_adj_cells);
|
||||||
|
|
||||||
for (i=0; i<n_adj_cells; i++) {
|
for (i=0; i<n_adj_cells; i++) {
|
||||||
@@ -341,25 +286,20 @@ void phy_config_meas_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index,uint8
|
|||||||
}
|
}
|
||||||
|
|
||||||
phy_meas->n_adj_cells = n_adj_cells;
|
phy_meas->n_adj_cells = n_adj_cells;
|
||||||
memcpy((void*)phy_meas->adj_cell_id,(void *)adj_cell_id,n_adj_cells*sizeof(unsigned int));
|
memcpy((void *)phy_meas->adj_cell_id,(void *)adj_cell_id,n_adj_cells*sizeof(unsigned int));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
void phy_config_dedicated_scell_ue(uint8_t Mod_id,
|
void phy_config_dedicated_scell_ue(uint8_t Mod_id,
|
||||||
uint8_t eNB_index,
|
uint8_t eNB_index,
|
||||||
LTE_SCellToAddMod_r10_t *sCellToAddMod_r10,
|
LTE_SCellToAddMod_r10_t *sCellToAddMod_r10,
|
||||||
int CC_id)
|
int CC_id) {
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void phy_config_harq_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
void phy_config_harq_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||||
uint16_t max_harq_tx )
|
uint16_t max_harq_tx ) {
|
||||||
{
|
|
||||||
|
|
||||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||||
phy_vars_ue->ulsch[eNB_id]->Mlimit = max_harq_tx;
|
phy_vars_ue->ulsch[eNB_id]->Mlimit = max_harq_tx;
|
||||||
}
|
}
|
||||||
@@ -367,12 +307,9 @@ void phy_config_harq_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
extern uint16_t beta_cqi[16];
|
extern uint16_t beta_cqi[16];
|
||||||
|
|
||||||
void phy_config_dedicated_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
void phy_config_dedicated_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||||
struct LTE_PhysicalConfigDedicated *physicalConfigDedicated )
|
struct LTE_PhysicalConfigDedicated *physicalConfigDedicated ) {
|
||||||
{
|
|
||||||
|
|
||||||
static uint8_t first_dedicated_configuration = 0;
|
static uint8_t first_dedicated_configuration = 0;
|
||||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||||
|
|
||||||
phy_vars_ue->total_TBS[eNB_id]=0;
|
phy_vars_ue->total_TBS[eNB_id]=0;
|
||||||
phy_vars_ue->total_TBS_last[eNB_id]=0;
|
phy_vars_ue->total_TBS_last[eNB_id]=0;
|
||||||
phy_vars_ue->bitrate[eNB_id]=0;
|
phy_vars_ue->bitrate[eNB_id]=0;
|
||||||
@@ -382,7 +319,6 @@ void phy_config_dedicated_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
phy_vars_ue->dlsch_received[eNB_id]=0;
|
phy_vars_ue->dlsch_received[eNB_id]=0;
|
||||||
phy_vars_ue->dlsch_received_last[eNB_id]=0;
|
phy_vars_ue->dlsch_received_last[eNB_id]=0;
|
||||||
phy_vars_ue->dlsch_fer[eNB_id]=0;
|
phy_vars_ue->dlsch_fer[eNB_id]=0;
|
||||||
|
|
||||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
|
||||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;
|
||||||
|
|
||||||
@@ -418,18 +354,14 @@ void phy_config_dedicated_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index;
|
phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index;
|
||||||
phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index;
|
phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index;
|
||||||
phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index;
|
phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index;
|
||||||
|
|
||||||
|
|
||||||
LOG_D(PHY,"pusch_config_dedicated.betaOffset_ACK_Index %d\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index);
|
LOG_D(PHY,"pusch_config_dedicated.betaOffset_ACK_Index %d\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index);
|
||||||
LOG_D(PHY,"pusch_config_dedicated.betaOffset_RI_Index %d\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index);
|
LOG_D(PHY,"pusch_config_dedicated.betaOffset_RI_Index %d\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index);
|
||||||
LOG_D(PHY,"pusch_config_dedicated.betaOffset_CQI_Index %d => %d)\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index,beta_cqi[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index]);
|
LOG_D(PHY,"pusch_config_dedicated.betaOffset_CQI_Index %d => %d)\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index,
|
||||||
|
beta_cqi[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index]);
|
||||||
LOG_D(PHY,"\n");
|
LOG_D(PHY,"\n");
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (physicalConfigDedicated->uplinkPowerControlDedicated) {
|
if (physicalConfigDedicated->uplinkPowerControlDedicated) {
|
||||||
|
|
||||||
phy_vars_ue->ul_power_control_dedicated[eNB_id].p0_UE_PUSCH = physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUSCH;
|
phy_vars_ue->ul_power_control_dedicated[eNB_id].p0_UE_PUSCH = physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUSCH;
|
||||||
phy_vars_ue->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled= physicalConfigDedicated->uplinkPowerControlDedicated->deltaMCS_Enabled;
|
phy_vars_ue->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled= physicalConfigDedicated->uplinkPowerControlDedicated->deltaMCS_Enabled;
|
||||||
phy_vars_ue->ul_power_control_dedicated[eNB_id].accumulationEnabled= physicalConfigDedicated->uplinkPowerControlDedicated->accumulationEnabled;
|
phy_vars_ue->ul_power_control_dedicated[eNB_id].accumulationEnabled= physicalConfigDedicated->uplinkPowerControlDedicated->accumulationEnabled;
|
||||||
@@ -448,32 +380,40 @@ void phy_config_dedicated_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
if (physicalConfigDedicated->antennaInfo) {
|
if (physicalConfigDedicated->antennaInfo) {
|
||||||
phy_vars_ue->transmission_mode[eNB_id] = 1+(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode);
|
phy_vars_ue->transmission_mode[eNB_id] = 1+(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode);
|
||||||
LOG_I(PHY,"Transmission Mode %d\n",phy_vars_ue->transmission_mode[eNB_id]);
|
LOG_I(PHY,"Transmission Mode %d\n",phy_vars_ue->transmission_mode[eNB_id]);
|
||||||
|
|
||||||
switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) {
|
switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) {
|
||||||
case LTE_AntennaInfoDedicated__transmissionMode_tm1:
|
case LTE_AntennaInfoDedicated__transmissionMode_tm1:
|
||||||
phy_vars_ue->transmission_mode[eNB_id] = 1;
|
phy_vars_ue->transmission_mode[eNB_id] = 1;
|
||||||
break;
|
break;
|
||||||
case LTE_AntennaInfoDedicated__transmissionMode_tm2:
|
|
||||||
phy_vars_ue->transmission_mode[eNB_id] = 2;
|
case LTE_AntennaInfoDedicated__transmissionMode_tm2:
|
||||||
break;
|
phy_vars_ue->transmission_mode[eNB_id] = 2;
|
||||||
case LTE_AntennaInfoDedicated__transmissionMode_tm3:
|
break;
|
||||||
phy_vars_ue->transmission_mode[eNB_id] = 3;
|
|
||||||
break;
|
case LTE_AntennaInfoDedicated__transmissionMode_tm3:
|
||||||
case LTE_AntennaInfoDedicated__transmissionMode_tm4:
|
phy_vars_ue->transmission_mode[eNB_id] = 3;
|
||||||
phy_vars_ue->transmission_mode[eNB_id] = 4;
|
break;
|
||||||
break;
|
|
||||||
case LTE_AntennaInfoDedicated__transmissionMode_tm5:
|
case LTE_AntennaInfoDedicated__transmissionMode_tm4:
|
||||||
phy_vars_ue->transmission_mode[eNB_id] = 5;
|
phy_vars_ue->transmission_mode[eNB_id] = 4;
|
||||||
break;
|
break;
|
||||||
case LTE_AntennaInfoDedicated__transmissionMode_tm6:
|
|
||||||
phy_vars_ue->transmission_mode[eNB_id] = 6;
|
case LTE_AntennaInfoDedicated__transmissionMode_tm5:
|
||||||
break;
|
phy_vars_ue->transmission_mode[eNB_id] = 5;
|
||||||
case LTE_AntennaInfoDedicated__transmissionMode_tm7:
|
break;
|
||||||
lte_gold_ue_spec_port5(phy_vars_ue->lte_gold_uespec_port5_table, phy_vars_ue->frame_parms.Nid_cell, phy_vars_ue->pdcch_vars[0][eNB_id]->crnti);
|
|
||||||
phy_vars_ue->transmission_mode[eNB_id] = 7;
|
case LTE_AntennaInfoDedicated__transmissionMode_tm6:
|
||||||
break;
|
phy_vars_ue->transmission_mode[eNB_id] = 6;
|
||||||
default:
|
break;
|
||||||
LOG_E(PHY,"Unknown transmission mode!\n");
|
|
||||||
break;
|
case LTE_AntennaInfoDedicated__transmissionMode_tm7:
|
||||||
|
lte_gold_ue_spec_port5(phy_vars_ue->lte_gold_uespec_port5_table, phy_vars_ue->frame_parms.Nid_cell, phy_vars_ue->pdcch_vars[0][eNB_id]->crnti);
|
||||||
|
phy_vars_ue->transmission_mode[eNB_id] = 7;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOG_E(PHY,"Unknown transmission mode!\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_D(PHY,"[UE %d] Received NULL physicalConfigDedicated->antennaInfo from eNB %d\n",Mod_id, eNB_id);
|
LOG_D(PHY,"[UE %d] Received NULL physicalConfigDedicated->antennaInfo from eNB %d\n",Mod_id, eNB_id);
|
||||||
@@ -484,19 +424,17 @@ void phy_config_dedicated_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex = physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex;
|
phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex = physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex;
|
||||||
phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex=physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_ConfigIndex;
|
phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex=physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_ConfigIndex;
|
||||||
phy_vars_ue->scheduling_request_config[eNB_id].dsr_TransMax=physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax;
|
phy_vars_ue->scheduling_request_config[eNB_id].dsr_TransMax=physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax;
|
||||||
|
|
||||||
LOG_D(PHY,"scheduling_request_config.sr_PUCCH_ResourceIndex %d\n",phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
|
LOG_D(PHY,"scheduling_request_config.sr_PUCCH_ResourceIndex %d\n",phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
|
||||||
LOG_D(PHY,"scheduling_request_config.sr_ConfigIndex %d\n",phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex);
|
LOG_D(PHY,"scheduling_request_config.sr_ConfigIndex %d\n",phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex);
|
||||||
LOG_D(PHY,"scheduling_request_config.dsr_TransMax %d\n",phy_vars_ue->scheduling_request_config[eNB_id].dsr_TransMax);
|
LOG_D(PHY,"scheduling_request_config.dsr_TransMax %d\n",phy_vars_ue->scheduling_request_config[eNB_id].dsr_TransMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(PHY,"------------------------------------------------------------\n");
|
LOG_D(PHY,"------------------------------------------------------------\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated) {
|
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated) {
|
||||||
|
|
||||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = 0;
|
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = 0;
|
||||||
|
|
||||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated->present == LTE_SoundingRS_UL_ConfigDedicated_PR_setup) {
|
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated->present == LTE_SoundingRS_UL_ConfigDedicated_PR_setup) {
|
||||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = 1;
|
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = 1;
|
||||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].duration = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.duration;
|
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].duration = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.duration;
|
||||||
@@ -506,34 +444,32 @@ void phy_config_dedicated_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_ConfigIndex = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex;
|
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_ConfigIndex = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex;
|
||||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_HoppingBandwidth = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;
|
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_HoppingBandwidth = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;
|
||||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb;
|
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb;
|
||||||
|
|
||||||
|
|
||||||
LOG_D(PHY,"soundingrs_ul_config_dedicated.srs_ConfigIndex %d\n",phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_ConfigIndex);
|
LOG_D(PHY,"soundingrs_ul_config_dedicated.srs_ConfigIndex %d\n",phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_ConfigIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(PHY,"------------------------------------------------------------\n");
|
LOG_D(PHY,"------------------------------------------------------------\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (physicalConfigDedicated->cqi_ReportConfig) {
|
if (physicalConfigDedicated->cqi_ReportConfig) {
|
||||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic) {
|
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic) {
|
||||||
// configure PUSCH CQI reporting
|
// configure PUSCH CQI reporting
|
||||||
phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic;
|
phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic;
|
||||||
|
|
||||||
if ((phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm12) &&
|
if ((phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm12) &&
|
||||||
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm30) &&
|
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm30) &&
|
||||||
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm31))
|
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm31))
|
||||||
LOG_E(PHY,"Unsupported Aperiodic CQI Feedback Mode : %d\n",phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic);
|
LOG_E(PHY,"Unsupported Aperiodic CQI Feedback Mode : %d\n",phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) {
|
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) {
|
||||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == LTE_CQI_ReportPeriodic_PR_setup) {
|
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == LTE_CQI_ReportPeriodic_PR_setup) {
|
||||||
// configure PUCCH CQI reporting
|
// configure PUCCH CQI reporting
|
||||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
|
||||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex;
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex;
|
||||||
|
|
||||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex)
|
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex)
|
||||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex;
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex;
|
||||||
}
|
} else if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == LTE_CQI_ReportPeriodic_PR_release) {
|
||||||
else if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == LTE_CQI_ReportPeriodic_PR_release) {
|
|
||||||
// handle release
|
// handle release
|
||||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
|
||||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;
|
||||||
@@ -559,28 +495,25 @@ void phy_config_dedicated_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
|
|
||||||
// fill cqi parameters for periodic CQI reporting
|
// fill cqi parameters for periodic CQI reporting
|
||||||
get_cqipmiri_params(phy_vars_ue,eNB_id);
|
get_cqipmiri_params(phy_vars_ue,eNB_id);
|
||||||
|
|
||||||
// disable MIB SIB decoding once we are on connected mode
|
// disable MIB SIB decoding once we are on connected mode
|
||||||
first_dedicated_configuration ++;
|
first_dedicated_configuration ++;
|
||||||
if(first_dedicated_configuration > 1)
|
|
||||||
{
|
if(first_dedicated_configuration > 1) {
|
||||||
LOG_I(PHY,"Disable SIB MIB decoding \n");
|
LOG_I(PHY,"Disable SIB MIB decoding \n");
|
||||||
phy_vars_ue->decode_SIB = 0;
|
phy_vars_ue->decode_SIB = 0;
|
||||||
phy_vars_ue->decode_MIB = 0;
|
phy_vars_ue->decode_MIB = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nfapi_mode!=3){
|
if(NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
|
||||||
//phy_vars_ue->pdcch_vars[1][eNB_id]->crnti = phy_vars_ue->pdcch_vars[0][eNB_id]->crnti;
|
//phy_vars_ue->pdcch_vars[1][eNB_id]->crnti = phy_vars_ue->pdcch_vars[0][eNB_id]->crnti;
|
||||||
if(phy_vars_ue->pdcch_vars[0][eNB_id]->crnti == 0x1234)
|
if(phy_vars_ue->pdcch_vars[0][eNB_id]->crnti == 0x1234)
|
||||||
phy_vars_ue->pdcch_vars[0][eNB_id]->crnti = phy_vars_ue->pdcch_vars[1][eNB_id]->crnti;
|
phy_vars_ue->pdcch_vars[0][eNB_id]->crnti = phy_vars_ue->pdcch_vars[1][eNB_id]->crnti;
|
||||||
else
|
else
|
||||||
phy_vars_ue->pdcch_vars[1][eNB_id]->crnti = phy_vars_ue->pdcch_vars[0][eNB_id]->crnti;
|
phy_vars_ue->pdcch_vars[1][eNB_id]->crnti = phy_vars_ue->pdcch_vars[0][eNB_id]->crnti;
|
||||||
|
|
||||||
LOG_I(PHY,"C-RNTI %x %x \n", phy_vars_ue->pdcch_vars[0][eNB_id]->crnti,
|
LOG_I(PHY,"C-RNTI %x %x \n", phy_vars_ue->pdcch_vars[0][eNB_id]->crnti,
|
||||||
phy_vars_ue->pdcch_vars[1][eNB_id]->crnti);
|
phy_vars_ue->pdcch_vars[1][eNB_id]->crnti);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Helper function to allocate memory for DLSCH data structures.
|
/*! \brief Helper function to allocate memory for DLSCH data structures.
|
||||||
@@ -588,88 +521,71 @@ void phy_config_dedicated_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
* \param[in] frame_parms LTE_DL_FRAME_PARMS structure.
|
* \param[in] frame_parms LTE_DL_FRAME_PARMS structure.
|
||||||
* \note This function is optimistic in that it expects malloc() to succeed.
|
* \note This function is optimistic in that it expects malloc() to succeed.
|
||||||
*/
|
*/
|
||||||
void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS* const fp )
|
void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH *const pdsch, const LTE_DL_FRAME_PARMS *const fp ) {
|
||||||
{
|
|
||||||
AssertFatal( pdsch, "pdsch==0" );
|
AssertFatal( pdsch, "pdsch==0" );
|
||||||
|
pdsch->pmi_ext = (uint8_t *)malloc16_clear( fp->N_RB_DL );
|
||||||
pdsch->pmi_ext = (uint8_t*)malloc16_clear( fp->N_RB_DL );
|
pdsch->llr[0] = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||||
pdsch->llr[0] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
pdsch->llr128 = (int16_t **)malloc16_clear( sizeof(int16_t *) );
|
||||||
pdsch->llr128 = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
|
||||||
// FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV
|
// FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV
|
||||||
// FK, 11-3-2015: this is only as a temporary pointer, no memory is stored there
|
// FK, 11-3-2015: this is only as a temporary pointer, no memory is stored there
|
||||||
|
pdsch->rxdataF_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
|
pdsch->rxdataF_uespec_pilots = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pdsch->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
pdsch->rxdataF_comp0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pdsch->rxdataF_uespec_pilots = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
pdsch->rho = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||||
pdsch->rxdataF_comp0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
pdsch->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pdsch->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
|
pdsch->dl_bf_ch_estimates = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pdsch->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
pdsch->dl_bf_ch_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pdsch->dl_bf_ch_estimates = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
|
||||||
pdsch->dl_bf_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
|
||||||
//pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
//pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||||
//pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
//pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||||
pdsch->dl_ch_mag0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
pdsch->dl_ch_mag0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pdsch->dl_ch_magb0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
pdsch->dl_ch_magb0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
|
|
||||||
|
|
||||||
// the allocated memory size is fixed:
|
// the allocated memory size is fixed:
|
||||||
AssertFatal( fp->nb_antennas_rx <= 2, "nb_antennas_rx > 2" );
|
AssertFatal( fp->nb_antennas_rx <= 2, "nb_antennas_rx > 2" );
|
||||||
|
|
||||||
for (int i=0; i<fp->nb_antennas_rx; i++) {
|
for (int i=0; i<fp->nb_antennas_rx; i++) {
|
||||||
pdsch->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) );
|
pdsch->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) );
|
||||||
|
|
||||||
for (int j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
|
for (int j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
|
||||||
const int idx = (j<<1)+i;
|
const int idx = (j<<1)+i;
|
||||||
const size_t num = 7*2*fp->N_RB_DL*12;
|
const size_t num = 7*2*fp->N_RB_DL*12;
|
||||||
pdsch->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
pdsch->rxdataF_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
pdsch->rxdataF_uespec_pilots[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12);
|
pdsch->rxdataF_uespec_pilots[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12);
|
||||||
pdsch->rxdataF_comp0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
pdsch->rxdataF_comp0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
pdsch->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
pdsch->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
pdsch->dl_bf_ch_estimates[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * fp->ofdm_symbol_size*7*2);
|
pdsch->dl_bf_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->ofdm_symbol_size*7*2);
|
||||||
pdsch->dl_bf_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
pdsch->dl_bf_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
//pdsch->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
//pdsch->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||||
//pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
//pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||||
pdsch->dl_ch_mag0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
pdsch->dl_ch_mag0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
pdsch->dl_ch_magb0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
pdsch->dl_ch_magb0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int init_lte_ue_signal(PHY_VARS_UE *ue,
|
int init_lte_ue_signal(PHY_VARS_UE *ue,
|
||||||
int nb_connected_eNB,
|
int nb_connected_eNB,
|
||||||
uint8_t abstraction_flag)
|
uint8_t abstraction_flag) {
|
||||||
{
|
|
||||||
|
|
||||||
// create shortcuts
|
// create shortcuts
|
||||||
LTE_DL_FRAME_PARMS* const fp = &ue->frame_parms;
|
LTE_DL_FRAME_PARMS *const fp = &ue->frame_parms;
|
||||||
LTE_UE_COMMON* const common_vars = &ue->common_vars;
|
LTE_UE_COMMON *const common_vars = &ue->common_vars;
|
||||||
LTE_UE_PDSCH** const pdsch_vars_SI = ue->pdsch_vars_SI;
|
LTE_UE_PDSCH **const pdsch_vars_SI = ue->pdsch_vars_SI;
|
||||||
LTE_UE_PDSCH** const pdsch_vars_ra = ue->pdsch_vars_ra;
|
LTE_UE_PDSCH **const pdsch_vars_ra = ue->pdsch_vars_ra;
|
||||||
LTE_UE_PDSCH** const pdsch_vars_p = ue->pdsch_vars_p;
|
LTE_UE_PDSCH **const pdsch_vars_p = ue->pdsch_vars_p;
|
||||||
LTE_UE_PDSCH** const pdsch_vars_mch = ue->pdsch_vars_MCH;
|
LTE_UE_PDSCH **const pdsch_vars_mch = ue->pdsch_vars_MCH;
|
||||||
LTE_UE_PDSCH* (*pdsch_vars_th)[][NUMBER_OF_CONNECTED_eNB_MAX+1] = &ue->pdsch_vars;
|
LTE_UE_PDSCH* (*pdsch_vars_th)[][NUMBER_OF_CONNECTED_eNB_MAX+1] = &ue->pdsch_vars;
|
||||||
LTE_UE_PDCCH* (*pdcch_vars_th)[][NUMBER_OF_CONNECTED_eNB_MAX] = &ue->pdcch_vars;
|
LTE_UE_PDCCH* (*pdcch_vars_th)[][NUMBER_OF_CONNECTED_eNB_MAX] = &ue->pdcch_vars;
|
||||||
LTE_UE_PBCH** const pbch_vars = ue->pbch_vars;
|
LTE_UE_PBCH **const pbch_vars = ue->pbch_vars;
|
||||||
LTE_UE_PRACH** const prach_vars = ue->prach_vars;
|
LTE_UE_PRACH **const prach_vars = ue->prach_vars;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int i,j,k,l;
|
int i,j,k,l;
|
||||||
int eNB_id;
|
int eNB_id;
|
||||||
int th_id;
|
int th_id;
|
||||||
|
|
||||||
LOG_D(PHY,"Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx);
|
LOG_D(PHY,"Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
init_dfts();
|
init_dfts();
|
||||||
init_frame_parms(&ue->frame_parms,1);
|
init_frame_parms(&ue->frame_parms,1);
|
||||||
lte_sync_time_init(&ue->frame_parms);
|
lte_sync_time_init(&ue->frame_parms);
|
||||||
init_lte_top(&ue->frame_parms);
|
init_lte_top(&ue->frame_parms);
|
||||||
init_7_5KHz();
|
init_7_5KHz();
|
||||||
init_ul_hopping(&ue->frame_parms);
|
init_ul_hopping(&ue->frame_parms);
|
||||||
|
|
||||||
|
|
||||||
// many memory allocation sizes are hard coded
|
// many memory allocation sizes are hard coded
|
||||||
AssertFatal( fp->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[eNB_id]" );
|
AssertFatal( fp->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[eNB_id]" );
|
||||||
AssertFatal( ue->n_connected_eNB <= NUMBER_OF_CONNECTED_eNB_MAX, "n_connected_eNB is too large" );
|
AssertFatal( ue->n_connected_eNB <= NUMBER_OF_CONNECTED_eNB_MAX, "n_connected_eNB is too large" );
|
||||||
@@ -690,49 +606,44 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
|
|||||||
ue->total_received_bits[eNB_id] = 0;
|
ue->total_received_bits[eNB_id] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0;i<10;i++)
|
for (i=0; i<10; i++)
|
||||||
ue->tx_power_dBm[i]=-127;
|
ue->tx_power_dBm[i]=-127;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// init TX buffers
|
// init TX buffers
|
||||||
|
common_vars->txdata = (int32_t **)malloc16( fp->nb_antennas_tx*sizeof(int32_t *) );
|
||||||
common_vars->txdata = (int32_t**)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) );
|
common_vars->txdataF = (int32_t **)malloc16( fp->nb_antennas_tx*sizeof(int32_t *) );
|
||||||
common_vars->txdataF = (int32_t **)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) );
|
|
||||||
|
|
||||||
for (i=0; i<fp->nb_antennas_tx; i++) {
|
for (i=0; i<fp->nb_antennas_tx; i++) {
|
||||||
|
common_vars->txdata[i] = (int32_t *)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
|
||||||
common_vars->txdata[i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
|
|
||||||
common_vars->txdataF[i] = (int32_t *)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) );
|
common_vars->txdataF[i] = (int32_t *)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// init RX buffers
|
|
||||||
|
|
||||||
common_vars->rxdata = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
|
||||||
common_vars->common_vars_rx_data_per_thread[0].rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
|
||||||
common_vars->common_vars_rx_data_per_thread[1].rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
|
||||||
|
|
||||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
|
||||||
common_vars->rxdata[i] = (int32_t*) malloc16_clear( (fp->samples_per_tti*10+2048)*sizeof(int32_t) );
|
|
||||||
LOG_I(PHY,"common_vars->rxdata[%d] %p\n",i,common_vars->rxdata[i]);
|
|
||||||
common_vars->common_vars_rx_data_per_thread[0].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) );
|
|
||||||
common_vars->common_vars_rx_data_per_thread[1].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// init RX buffers
|
||||||
|
common_vars->rxdata = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||||
|
common_vars->common_vars_rx_data_per_thread[0].rxdataF = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||||
|
common_vars->common_vars_rx_data_per_thread[1].rxdataF = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||||
|
|
||||||
|
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||||
|
common_vars->rxdata[i] = (int32_t *) malloc16_clear( (fp->samples_per_tti*10+2048)*sizeof(int32_t) );
|
||||||
|
LOG_I(PHY,"common_vars->rxdata[%d] %p\n",i,common_vars->rxdata[i]);
|
||||||
|
common_vars->common_vars_rx_data_per_thread[0].rxdataF[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) );
|
||||||
|
common_vars->common_vars_rx_data_per_thread[1].rxdataF[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) );
|
||||||
|
}
|
||||||
|
|
||||||
// Channel estimates
|
// Channel estimates
|
||||||
for (eNB_id=0; eNB_id<7; eNB_id++) {
|
for (eNB_id=0; eNB_id<7; eNB_id++) {
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
|
common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates[eNB_id] = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
|
||||||
common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
|
common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates_time[eNB_id] = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<fp->nb_antennas_rx; i++)
|
for (i=0; i<fp->nb_antennas_rx; i++)
|
||||||
for (j=0; j<4; j++) {
|
for (j=0; j<4; j++) {
|
||||||
int idx = (j<<1) + i;
|
int idx = (j<<1) + i;
|
||||||
|
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
|
common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates[eNB_id][idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
|
||||||
common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
|
common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates_time[eNB_id][idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -740,11 +651,11 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
|
|||||||
// DLSCH
|
// DLSCH
|
||||||
for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) {
|
for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) {
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdsch_vars_th)[th_id][eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
|
(*pdsch_vars_th)[th_id][eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdcch_vars_th)[th_id][eNB_id] = (LTE_UE_PDCCH *)malloc16_clear(sizeof(LTE_UE_PDCCH));
|
(*pdcch_vars_th)[th_id][eNB_id] = (LTE_UE_PDCCH *)malloc16_clear(sizeof(LTE_UE_PDCCH));
|
||||||
}
|
}
|
||||||
|
|
||||||
pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
|
pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
|
||||||
@@ -759,161 +670,159 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
|
(*pdsch_vars_th)[th_id][eNB_id]->llr_shifts = (uint8_t *)malloc16_clear(7*2*fp->N_RB_DL*12);
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->llr_shifts_p = (*pdsch_vars_th)[0][eNB_id]->llr_shifts;
|
(*pdsch_vars_th)[th_id][eNB_id]->llr_shifts_p = (*pdsch_vars_th)[0][eNB_id]->llr_shifts;
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
(*pdsch_vars_th)[th_id][eNB_id]->llr[1] = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
(*pdsch_vars_th)[th_id][eNB_id]->llr128_2ndstream = (int16_t **)malloc16_clear( sizeof(int16_t *) );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
|
(*pdsch_vars_th)[th_id][eNB_id]->rho = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i=0; i<fp->nb_antennas_rx; i++){
|
for (int i=0; i<fp->nb_antennas_rx; i++) {
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->rho[i] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
(*pdsch_vars_th)[th_id][eNB_id]->rho[i] = (int32_t *)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_rho2_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<fp->nb_antennas_rx; i++)
|
for (i=0; i<fp->nb_antennas_rx; i++)
|
||||||
for (j=0; j<4; j++) {
|
for (j=0; j<4; j++) {
|
||||||
const int idx = (j<<1)+i;
|
const int idx = (j<<1)+i;
|
||||||
const size_t num = 7*2*fp->N_RB_DL*12+4;
|
const size_t num = 7*2*fp->N_RB_DL*12+4;
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
}
|
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_rho2_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//const size_t num = 7*2*fp->N_RB_DL*12+4;
|
//const size_t num = 7*2*fp->N_RB_DL*12+4;
|
||||||
for (k=0;k<8;k++) { //harq_pid
|
for (k=0; k<8; k++) { //harq_pid
|
||||||
for (l=0;l<8;l++) { //round
|
for (l=0; l<8; l++) { //round
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->rxdataF_comp1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdsch_vars_th)[th_id][eNB_id]->rxdataF_comp1[k][l] = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[k][l] = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_mag1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_mag1[k][l] = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_magb1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_magb1[k][l] = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i=0; i<fp->nb_antennas_rx; i++)
|
||||||
for (int i=0; i<fp->nb_antennas_rx; i++)
|
for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++)
|
||||||
for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++)
|
const int idx = (j<<1)+i;
|
||||||
const int idx = (j<<1)+i;
|
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[k][l][idx] = (int32_t *)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->rxdataF_comp1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
(*pdsch_vars_th)[th_id][eNB_id]->rxdataF_comp1[k][l][idx] = (int32_t *)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_mag1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_mag1[k][l][idx] = (int32_t *)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_magb1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
(*pdsch_vars_th)[th_id][eNB_id]->dl_ch_magb1[k][l][idx] = (int32_t *)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp );
|
phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp );
|
||||||
phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp );
|
phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp );
|
||||||
phy_init_lte_ue__PDSCH( pdsch_vars_p[eNB_id], fp );
|
phy_init_lte_ue__PDSCH( pdsch_vars_p[eNB_id], fp );
|
||||||
phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp );
|
phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp );
|
||||||
|
|
||||||
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
|
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->llr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
(*pdcch_vars_th)[th_id][eNB_id]->llr = (uint16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
(*pdcch_vars_th)[th_id][eNB_id]->llr16 = (uint16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
(*pdcch_vars_th)[th_id][eNB_id]->wbar = (uint16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 );
|
(*pdcch_vars_th)[th_id][eNB_id]->e_rx = (int8_t *)malloc16_clear( 4*2*100*12 );
|
||||||
|
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdcch_vars_th)[th_id][eNB_id]->rho = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||||
//ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) );
|
//ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) );
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) );
|
(*pdcch_vars_th)[th_id][eNB_id]->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(100*12*4) );
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
|
for (j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
|
||||||
int idx = (j<<1)+i;
|
int idx = (j<<1)+i;
|
||||||
// size_t num = 7*2*fp->N_RB_DL*12;
|
// size_t num = 7*2*fp->N_RB_DL*12;
|
||||||
size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB
|
size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
}
|
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp );
|
phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp );
|
||||||
phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp );
|
phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp );
|
||||||
phy_init_lte_ue__PDSCH( pdsch_vars_p[eNB_id], fp );
|
phy_init_lte_ue__PDSCH( pdsch_vars_p[eNB_id], fp );
|
||||||
phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp );
|
phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp );
|
||||||
|
|
||||||
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
|
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->llr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
(*pdcch_vars_th)[th_id][eNB_id]->llr = (uint16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
(*pdcch_vars_th)[th_id][eNB_id]->llr16 = (uint16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
(*pdcch_vars_th)[th_id][eNB_id]->wbar = (uint16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 );
|
(*pdcch_vars_th)[th_id][eNB_id]->e_rx = (int8_t *)malloc16_clear( 4*2*100*12 );
|
||||||
|
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdcch_vars_th)[th_id][eNB_id]->rho = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
|
||||||
|
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->dciFormat = 0;
|
(*pdcch_vars_th)[th_id][eNB_id]->dciFormat = 0;
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->agregationLevel = 0xFF;
|
(*pdcch_vars_th)[th_id][eNB_id]->agregationLevel = 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||||
//ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) );
|
//ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) );
|
||||||
|
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) );
|
(*pdcch_vars_th)[th_id][eNB_id]->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(100*12*4) );
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
|
for (j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
|
||||||
int idx = (j<<1)+i;
|
int idx = (j<<1)+i;
|
||||||
// size_t num = 7*2*fp->N_RB_DL*12;
|
// size_t num = 7*2*fp->N_RB_DL*12;
|
||||||
size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB
|
size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
}
|
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PBCH
|
// PBCH
|
||||||
pbch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
pbch_vars[eNB_id]->rxdataF_ext = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||||
pbch_vars[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
pbch_vars[eNB_id]->rxdataF_comp = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pbch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
pbch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pbch_vars[eNB_id]->llr = (int8_t*)malloc16_clear( 1920 );
|
pbch_vars[eNB_id]->llr = (int8_t *)malloc16_clear( 1920 );
|
||||||
prach_vars[eNB_id]->prachF = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
prach_vars[eNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
||||||
prach_vars[eNB_id]->prach = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
prach_vars[eNB_id]->prach = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
||||||
|
|
||||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||||
pbch_vars[eNB_id]->rxdataF_ext[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 );
|
pbch_vars[eNB_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*6*12*4 );
|
||||||
|
|
||||||
for (j=0; j<4; j++) {//fp->nb_antennas_tx;j++) {
|
for (j=0; j<4; j++) {//fp->nb_antennas_tx;j++) {
|
||||||
int idx = (j<<1)+i;
|
int idx = (j<<1)+i;
|
||||||
pbch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 );
|
pbch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*6*12*4 );
|
||||||
pbch_vars[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 );
|
pbch_vars[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*6*12*4 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pbch_vars[eNB_id]->decoded_output = (uint8_t *)malloc16_clear( 64 );
|
||||||
pbch_vars[eNB_id]->decoded_output = (uint8_t*)malloc16_clear( 64 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialization for the last instance of pdsch_vars (used for MU-MIMO)
|
// initialization for the last instance of pdsch_vars (used for MU-MIMO)
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdsch_vars_th)[th_id][eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
|
(*pdsch_vars_th)[th_id][eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
|
||||||
}
|
}
|
||||||
|
|
||||||
pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
|
pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
|
||||||
@@ -922,13 +831,12 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
|
|||||||
|
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
phy_init_lte_ue__PDSCH( (*pdsch_vars_th)[th_id][eNB_id], fp );
|
phy_init_lte_ue__PDSCH( (*pdsch_vars_th)[th_id][eNB_id], fp );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
(*pdsch_vars_th)[th_id][eNB_id]->llr[1] = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ue->sinr_CQI_dB = (double *) malloc16_clear( fp->N_RB_DL*12*sizeof(double) );
|
||||||
ue->sinr_CQI_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) );
|
|
||||||
|
|
||||||
ue->init_averaging = 1;
|
ue->init_averaging = 1;
|
||||||
|
|
||||||
// default value until overwritten by RRCConnectionReconfiguration
|
// default value until overwritten by RRCConnectionReconfiguration
|
||||||
if (fp->nb_antenna_ports_eNB==2)
|
if (fp->nb_antenna_ports_eNB==2)
|
||||||
ue->pdsch_config_dedicated->p_a = dBm3;
|
ue->pdsch_config_dedicated->p_a = dBm3;
|
||||||
@@ -938,40 +846,30 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
|
|||||||
// set channel estimation to do linear interpolation in time
|
// set channel estimation to do linear interpolation in time
|
||||||
ue->high_speed_flag = 1;
|
ue->high_speed_flag = 1;
|
||||||
ue->ch_est_alpha = 24576;
|
ue->ch_est_alpha = 24576;
|
||||||
|
|
||||||
// enable MIB/SIB decoding by default
|
// enable MIB/SIB decoding by default
|
||||||
ue->decode_MIB = 1;
|
ue->decode_MIB = 1;
|
||||||
ue->decode_SIB = 1;
|
ue->decode_SIB = 1;
|
||||||
|
|
||||||
init_prach_tables(839);
|
init_prach_tables(839);
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) {
|
void init_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) {
|
||||||
|
|
||||||
int i,j,k;
|
int i,j,k;
|
||||||
|
|
||||||
for (i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) {
|
for (i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) {
|
||||||
for (j=0; j<2; j++) {
|
for (j=0; j<2; j++) {
|
||||||
for (k=0; k<2; k++) {
|
for (k=0; k<2; k++) {
|
||||||
AssertFatal((ue->dlsch[k][i][j] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag))!=NULL,"Can't get ue dlsch structures\n");
|
AssertFatal((ue->dlsch[k][i][j] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag))!=NULL,"Can't get ue dlsch structures\n");
|
||||||
|
LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[i][j]);
|
||||||
LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[i][j]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AssertFatal((ue->ulsch[i] = new_ue_ulsch(ue->frame_parms.N_RB_UL, abstraction_flag))!=NULL,"Can't get ue ulsch structures\n");
|
AssertFatal((ue->ulsch[i] = new_ue_ulsch(ue->frame_parms.N_RB_UL, abstraction_flag))!=NULL,"Can't get ue ulsch structures\n");
|
||||||
|
|
||||||
ue->dlsch_SI[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag);
|
ue->dlsch_SI[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag);
|
||||||
ue->dlsch_ra[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag);
|
ue->dlsch_ra[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag);
|
||||||
|
|
||||||
ue->transmission_mode[i] = ue->frame_parms.nb_antenna_ports_eNB==1 ? 1 : 2;
|
ue->transmission_mode[i] = ue->frame_parms.nb_antenna_ports_eNB==1 ? 1 : 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
ue->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
|
ue->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
|
||||||
|
|
||||||
ue->dlsch_MCH[0] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS_MBSFN,ue->frame_parms.N_RB_DL,0);
|
ue->dlsch_MCH[0] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS_MBSFN,ue->frame_parms.N_RB_DL,0);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -528,7 +528,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t
|
|||||||
|
|
||||||
dlsch0->harq_mask |= (1 << rel8->harq_process);
|
dlsch0->harq_mask |= (1 << rel8->harq_process);
|
||||||
|
|
||||||
if (rel8->rnti_type == 1) LOG_D(PHY,"DCI 1A: round %d, mcs %d, rballoc %x, rv %d, rnti %x, harq process %d\n",dlsch0_harq->round,rel8->mcs_1,rel8->resource_block_coding,rel8->redundancy_version_1,rel8->rnti,rel8->harq_process);
|
if (rel8->rnti_type == 1) LOG_D(PHY,"DCI 1A: round %d, mcs %d, TBS %d, rballoc %x, rv %d, rnti %x, harq process %d\n",dlsch0_harq->round,rel8->mcs_1,dlsch0_harq->TBS,rel8->resource_block_coding,rel8->redundancy_version_1,rel8->rnti,rel8->harq_process);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case NFAPI_DL_DCI_FORMAT_1:
|
case NFAPI_DL_DCI_FORMAT_1:
|
||||||
@@ -1750,6 +1750,7 @@ void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,mDCI_ALLOC_t *dc
|
|||||||
if (dlsch0->rnti != rel13->rnti) { // if rnti of dlsch is not the same as in the config, this is a new entry
|
if (dlsch0->rnti != rel13->rnti) { // if rnti of dlsch is not the same as in the config, this is a new entry
|
||||||
dlsch0_harq->round = 0;
|
dlsch0_harq->round = 0;
|
||||||
dlsch0->harq_mask =0;
|
dlsch0->harq_mask =0;
|
||||||
|
printf("*********************** rnti %x => %x, pos %d\n",rel13->rnti,dlsch0->rnti,UE_id);
|
||||||
}
|
}
|
||||||
if ((dlsch0->harq_mask & (1 << rel13->harq_process)) > 0) {
|
if ((dlsch0->harq_mask & (1 << rel13->harq_process)) > 0) {
|
||||||
if ((rel13->new_data_indicator != dlsch0_harq->ndi)||(dci_alloc->ra_flag==1))
|
if ((rel13->new_data_indicator != dlsch0_harq->ndi)||(dci_alloc->ra_flag==1))
|
||||||
@@ -1768,7 +1769,8 @@ void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,mDCI_ALLOC_t *dc
|
|||||||
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][1];
|
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][1];
|
||||||
else if (rel13->tpc == 1) //N1A_PRB=3, get TBS from table using mcs and nb_rb=3
|
else if (rel13->tpc == 1) //N1A_PRB=3, get TBS from table using mcs and nb_rb=3
|
||||||
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][2];
|
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][2];
|
||||||
LOG_D(PHY,"TBS = %d(%d)\n",dlsch0_harq->TBS,dlsch0_harq->mcs);
|
else AssertFatal(1==0,"Don't know how to set TBS (TPC %d)\n",rel13->tpc);
|
||||||
|
LOG_D(PHY,"fill_mdci_and_dlsch : TBS = %d(%d) %p, %x\n",dlsch0_harq->TBS,dlsch0_harq->mcs,dlsch0,rel13->rnti);
|
||||||
}
|
}
|
||||||
dlsch0->active = 1;
|
dlsch0->active = 1;
|
||||||
dlsch0->harq_mask |= (1 << rel13->harq_process);
|
dlsch0->harq_mask |= (1 << rel13->harq_process);
|
||||||
|
|||||||
@@ -571,6 +571,8 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
|
|||||||
unsigned int L,C,B;
|
unsigned int L,C,B;
|
||||||
B = dlsch->harq_processes[dlsch->harq_ids[frame%2][subframe]]->B;
|
B = dlsch->harq_processes[dlsch->harq_ids[frame%2][subframe]]->B;
|
||||||
|
|
||||||
|
LOG_D(PHY,"B %d, harq_pid %d\n",B,dlsch->harq_ids[frame%2][subframe]);
|
||||||
|
|
||||||
if(B<=6144) {
|
if(B<=6144) {
|
||||||
L=0;
|
L=0;
|
||||||
C=1;
|
C=1;
|
||||||
@@ -703,7 +705,7 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
|
|||||||
// if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet
|
// if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet
|
||||||
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
|
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
|
||||||
#ifdef DEBUG_DLSCH_CODING
|
#ifdef DEBUG_DLSCH_CODING
|
||||||
printf("encoding thinks this is a new packet for harq_pid %d (%p) \n",harq_pid,dlsch->harq_processes[harq_pid]->b);
|
printf("encoding thinks this is a new packet for harq_pid %d (%p), A %d \n",harq_pid,dlsch,A);
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
int i;
|
int i;
|
||||||
|
|||||||
@@ -2171,8 +2171,6 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
|||||||
uint8_t beamforming_mode,
|
uint8_t beamforming_mode,
|
||||||
uint16_t tc_rnti)
|
uint16_t tc_rnti)
|
||||||
{
|
{
|
||||||
|
|
||||||
uint8_t harq_pid=0;
|
|
||||||
uint8_t frame_type=frame_parms->frame_type;
|
uint8_t frame_type=frame_parms->frame_type;
|
||||||
uint8_t tpmi=0;
|
uint8_t tpmi=0;
|
||||||
LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
|
LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
|
||||||
@@ -2488,15 +2486,15 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
|||||||
case format1E_2A_M10PRB:
|
case format1E_2A_M10PRB:
|
||||||
if (!dlsch[0]) return -1;
|
if (!dlsch[0]) return -1;
|
||||||
|
|
||||||
harq_pid = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->harq_pid;
|
dci_info_extarcted.harq_pid = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->harq_pid;
|
||||||
|
|
||||||
if (harq_pid>=8) {
|
if (dci_info_extarcted.harq_pid>=8) {
|
||||||
LOG_E(PHY,"Format 1E_2A_M10PRB: harq_pid=%d >= 8\n", harq_pid);
|
LOG_E(PHY,"Format 1E_2A_M10PRB: harq_pid=%d >= 8\n", dci_info_extarcted.harq_pid);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
dlsch[0]->current_harq_pid = harq_pid;
|
dlsch[0]->current_harq_pid = dci_info_extarcted.harq_pid;
|
||||||
dlsch[0]->harq_ack[subframe].harq_id = harq_pid;
|
dlsch[0]->harq_ack[subframe].harq_id = dci_info_extarcted.harq_pid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
tbswap = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tb_swap;
|
tbswap = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tb_swap;
|
||||||
@@ -2511,7 +2509,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
|||||||
*/
|
*/
|
||||||
dlsch0 = dlsch[0];
|
dlsch0 = dlsch[0];
|
||||||
|
|
||||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
dlsch0_harq = dlsch[0]->harq_processes[dci_info_extarcted.harq_pid];
|
||||||
// Needs to be checked
|
// Needs to be checked
|
||||||
dlsch0_harq->codeword=0;
|
dlsch0_harq->codeword=0;
|
||||||
conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
|
conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
|
||||||
@@ -2627,7 +2625,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
|||||||
// is NAK or an ACK was not received
|
// is NAK or an ACK was not received
|
||||||
|
|
||||||
dlsch0->harq_ack[subframe].ack = 1;
|
dlsch0->harq_ack[subframe].ack = 1;
|
||||||
dlsch0->harq_ack[subframe].harq_id = harq_pid;
|
dlsch0->harq_ack[subframe].harq_id = dci_info_extarcted.harq_pid;
|
||||||
dlsch0->harq_ack[subframe].send_harq_status = 1;
|
dlsch0->harq_ack[subframe].send_harq_status = 1;
|
||||||
dlsch0->active = 0;
|
dlsch0->active = 0;
|
||||||
return(0);
|
return(0);
|
||||||
@@ -2683,7 +2681,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
|||||||
{
|
{
|
||||||
T(T_UE_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame%1024), T_INT(subframe),
|
T(T_UE_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame%1024), T_INT(subframe),
|
||||||
T_INT(dlsch[0]->rnti), T_INT(dci_format),
|
T_INT(dlsch[0]->rnti), T_INT(dci_format),
|
||||||
T_INT(harq_pid),
|
T_INT(dci_info_extarcted.harq_pid),
|
||||||
T_INT(dlsch0_harq->mcs),
|
T_INT(dlsch0_harq->mcs),
|
||||||
T_INT(dlsch0_harq->TBS));
|
T_INT(dlsch0_harq->TBS));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1052,15 +1052,42 @@ static inline void wait_sync(char *thread_name) {
|
|||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int wakeup_thread(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) {
|
static inline int wakeup_thread(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name, int sleeptime,int sleep_cnt_max) {
|
||||||
int rc;
|
int rc;
|
||||||
|
int sleep_cnt=0;
|
||||||
|
|
||||||
if ((rc = pthread_mutex_lock(mutex)) != 0) {
|
if ((rc = pthread_mutex_lock(mutex)) != 0) {
|
||||||
LOG_E(PHY, "wakeup_thread(): error locking mutex for %s (%d %s, %p)\n",
|
LOG_E(PHY, "wakeup_thread(): error locking mutex for %s (%d %s, %p)\n",
|
||||||
name, rc, strerror(rc), (void *)mutex);
|
name, rc, strerror(rc), (void *)mutex);
|
||||||
exit_fun("nothing to add");
|
exit_fun("nothing to add");
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
while (*instance_cnt == 0) {
|
||||||
|
if ((rc = pthread_mutex_unlock(mutex)) != 0) {
|
||||||
|
LOG_E(PHY, "wakeup_thread(): error unlocking mutex for %s (%d %s, %p)\n",
|
||||||
|
name, rc, strerror(rc), (void *)mutex);
|
||||||
|
exit_fun("nothing to add");
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
sleep_cnt++;
|
||||||
|
if (sleep_cnt>sleep_cnt_max) return(-1);
|
||||||
|
usleep(sleeptime);
|
||||||
|
if ((rc = pthread_mutex_lock(mutex)) != 0) {
|
||||||
|
LOG_E(PHY, "wakeup_thread(): error locking mutex for %s (%d %s, %p)\n",
|
||||||
|
name, rc, strerror(rc), (void *)mutex);
|
||||||
|
exit_fun("nothing to add");
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
*instance_cnt = *instance_cnt + 1;
|
*instance_cnt = *instance_cnt + 1;
|
||||||
|
|
||||||
|
if ((rc = pthread_mutex_unlock(mutex)) != 0) {
|
||||||
|
LOG_E(PHY, "wakeup_thread(): error locking mutex for %s (%d %s, %p)\n",
|
||||||
|
name, rc, strerror(rc), (void *)mutex);
|
||||||
|
exit_fun("nothing to add");
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
// the thread can now be woken up
|
// the thread can now be woken up
|
||||||
if (pthread_cond_signal(cond) != 0) {
|
if (pthread_cond_signal(cond) != 0) {
|
||||||
LOG_E( PHY, "ERROR pthread_cond_signal\n");
|
LOG_E( PHY, "ERROR pthread_cond_signal\n");
|
||||||
|
|||||||
@@ -471,6 +471,10 @@ typedef struct RU_t_s{
|
|||||||
int16_t *dmrssync;
|
int16_t *dmrssync;
|
||||||
/// OTA synchronization correlator output
|
/// OTA synchronization correlator output
|
||||||
uint64_t *dmrs_corr;
|
uint64_t *dmrs_corr;
|
||||||
|
/// sleep time in us for delaying L1 wakeup
|
||||||
|
int wakeup_L1_sleeptime;
|
||||||
|
/// maximum number of sleeps
|
||||||
|
int wakeup_L1_sleep_cnt_max;
|
||||||
} RU_t;
|
} RU_t;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+315
-383
File diff suppressed because it is too large
Load Diff
+1089
-1237
File diff suppressed because it is too large
Load Diff
@@ -37,6 +37,7 @@
|
|||||||
#include "fapi_l1.h"
|
#include "fapi_l1.h"
|
||||||
#include "nfapi_pnf.h"
|
#include "nfapi_pnf.h"
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -46,92 +47,86 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#if defined(ENABLE_ITTI)
|
#if defined(ENABLE_ITTI)
|
||||||
# include "intertask_interface.h"
|
#include "intertask_interface.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern uint32_t nfapi_mode;
|
|
||||||
|
|
||||||
extern int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind);
|
extern int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind);
|
||||||
|
|
||||||
void prach_procedures(PHY_VARS_eNB *eNB
|
void prach_procedures(PHY_VARS_eNB *eNB
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
,
|
,
|
||||||
int br_flag
|
int br_flag
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
uint16_t max_preamble[4],max_preamble_energy[4],max_preamble_delay[4];
|
uint16_t max_preamble[4],max_preamble_energy[4],max_preamble_delay[4];
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
int frame,subframe;
|
int frame,subframe;
|
||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
|
|
||||||
if (br_flag==1) {
|
if (br_flag==1) {
|
||||||
subframe = eNB->proc.subframe_prach_br;
|
subframe = eNB->proc.subframe_prach_br;
|
||||||
frame = eNB->proc.frame_prach_br;
|
frame = eNB->proc.frame_prach_br;
|
||||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||||
eNB->UL_INFO.rach_ind_br.rach_indication_body.number_of_preambles=0;
|
eNB->UL_INFO.rach_ind_br.rach_indication_body.number_of_preambles=0;
|
||||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||||
eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles=0;
|
eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles=0;
|
||||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||||
subframe = eNB->proc.subframe_prach;
|
subframe = eNB->proc.subframe_prach;
|
||||||
frame = eNB->proc.frame_prach;
|
frame = eNB->proc.frame_prach;
|
||||||
}
|
}
|
||||||
|
|
||||||
RU_t *ru;
|
RU_t *ru;
|
||||||
int aa=0;
|
int aa=0;
|
||||||
int ru_aa;
|
int ru_aa;
|
||||||
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
|
||||||
|
|
||||||
|
for (i=0; i<eNB->num_RU; i++) {
|
||||||
|
|
||||||
for (i=0;i<eNB->num_RU;i++) {
|
|
||||||
ru=eNB->RU_list[i];
|
ru=eNB->RU_list[i];
|
||||||
for (ru_aa=0,aa=0;ru_aa<ru->nb_rx;ru_aa++,aa++) {
|
|
||||||
|
for (ru_aa=0,aa=0; ru_aa<ru->nb_rx; ru_aa++,aa++) {
|
||||||
eNB->prach_vars.rxsigF[0][aa] = eNB->RU_list[i]->prach_rxsigF[ru_aa];
|
eNB->prach_vars.rxsigF[0][aa] = eNB->RU_list[i]->prach_rxsigF[ru_aa];
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
int ce_level;
|
int ce_level;
|
||||||
|
|
||||||
if (br_flag==1)
|
if (br_flag==1)
|
||||||
for (ce_level=0;ce_level<4;ce_level++) eNB->prach_vars_br.rxsigF[ce_level][aa] = eNB->RU_list[i]->prach_rxsigF_br[ce_level][ru_aa];
|
for (ce_level=0; ce_level<4; ce_level++) eNB->prach_vars_br.rxsigF[ce_level][aa] = eNB->RU_list[i]->prach_rxsigF_br[ce_level][ru_aa];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// run PRACH detection for CE-level 0 only for now when br_flag is set
|
// run PRACH detection for CE-level 0 only for now when br_flag is set
|
||||||
rx_prach(eNB,
|
rx_prach(eNB,
|
||||||
eNB->RU_list[0],
|
eNB->RU_list[0],
|
||||||
&max_preamble[0],
|
&max_preamble[0],
|
||||||
&max_preamble_energy[0],
|
&max_preamble_energy[0],
|
||||||
&max_preamble_delay[0],
|
&max_preamble_delay[0],
|
||||||
frame,
|
frame,
|
||||||
0
|
0
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
,br_flag
|
,br_flag
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
||||||
LOG_D(PHY,"[RAPROC] Frame %d, subframe %d : BR %d Most likely preamble %d, energy %d dB delay %d (prach_energy counter %d)\n",
|
LOG_D(PHY,"[RAPROC] Frame %d, subframe %d : BR %d Most likely preamble %d, energy %d dB delay %d (prach_energy counter %d)\n",
|
||||||
frame,subframe,br_flag,
|
frame,subframe,br_flag,
|
||||||
max_preamble[0],
|
max_preamble[0],
|
||||||
max_preamble_energy[0]/10,
|
max_preamble_energy[0]/10,
|
||||||
max_preamble_delay[0],
|
max_preamble_delay[0],
|
||||||
eNB->prach_energy_counter);
|
eNB->prach_energy_counter);
|
||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
|
|
||||||
if (br_flag==1) {
|
if (br_flag==1) {
|
||||||
int prach_mask;
|
int prach_mask;
|
||||||
|
|
||||||
prach_mask = is_prach_subframe (&eNB->frame_parms, eNB->proc.frame_prach_br, eNB->proc.subframe_prach_br);
|
prach_mask = is_prach_subframe (&eNB->frame_parms, eNB->proc.frame_prach_br, eNB->proc.subframe_prach_br);
|
||||||
|
|
||||||
eNB->UL_INFO.rach_ind_br.rach_indication_body.preamble_list = eNB->preamble_list_br;
|
eNB->UL_INFO.rach_ind_br.rach_indication_body.preamble_list = eNB->preamble_list_br;
|
||||||
int ind = 0;
|
int ind = 0;
|
||||||
int ce_level = 0;
|
int ce_level = 0;
|
||||||
/* Save for later, it doesn't work
|
/* Save for later, it doesn't work
|
||||||
for (int ind=0,ce_level=0;ce_level<4;ce_level++) {
|
for (int ind=0,ce_level=0;ce_level<4;ce_level++) {
|
||||||
|
|
||||||
if ((eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[ce_level]==1)&&
|
if ((eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[ce_level]==1)&&
|
||||||
@@ -144,7 +139,6 @@ void prach_procedures(PHY_VARS_eNB *eNB
|
|||||||
if (eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[0] == 1) {
|
if (eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[0] == 1) {
|
||||||
if ((eNB->prach_energy_counter == 100) && (max_preamble_energy[0] > eNB->measurements.prach_I0 + eNB->prach_DTX_threshold_emtc[0])) {
|
if ((eNB->prach_energy_counter == 100) && (max_preamble_energy[0] > eNB->measurements.prach_I0 + eNB->prach_DTX_threshold_emtc[0])) {
|
||||||
eNB->UL_INFO.rach_ind_br.rach_indication_body.number_of_preambles++;
|
eNB->UL_INFO.rach_ind_br.rach_indication_body.number_of_preambles++;
|
||||||
|
|
||||||
eNB->preamble_list_br[ind].preamble_rel8.timing_advance = max_preamble_delay[ind]; //
|
eNB->preamble_list_br[ind].preamble_rel8.timing_advance = max_preamble_delay[ind]; //
|
||||||
eNB->preamble_list_br[ind].preamble_rel8.preamble = max_preamble[ind];
|
eNB->preamble_list_br[ind].preamble_rel8.preamble = max_preamble[ind];
|
||||||
// note: fid is implicitly 0 here, this is the rule for eMTC RA-RNTI from 36.321, Section 5.1.4
|
// note: fid is implicitly 0 here, this is the rule for eMTC RA-RNTI from 36.321, Section 5.1.4
|
||||||
@@ -159,70 +153,61 @@ void prach_procedures(PHY_VARS_eNB *eNB
|
|||||||
eNB->preamble_list_br[ind].preamble_rel8.preamble, eNB->preamble_list_br[ind].preamble_rel8.rnti, eNB->preamble_list_br[ind].preamble_rel13.rach_resource_type);
|
eNB->preamble_list_br[ind].preamble_rel8.preamble, eNB->preamble_list_br[ind].preamble_rel8.rnti, eNB->preamble_list_br[ind].preamble_rel13.rach_resource_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
ind++;
|
/*
|
||||||
}
|
ind++;
|
||||||
} */// ce_level
|
}
|
||||||
}
|
} */// ce_level
|
||||||
else
|
} else
|
||||||
#endif
|
#endif
|
||||||
|
{
|
||||||
|
if ((eNB->prach_energy_counter == 100) &&
|
||||||
|
(max_preamble_energy[0] > eNB->measurements.prach_I0+eNB->prach_DTX_threshold)) {
|
||||||
|
LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n",
|
||||||
|
eNB->Mod_id,
|
||||||
|
eNB->CC_id,
|
||||||
|
frame,
|
||||||
|
subframe,
|
||||||
|
max_preamble[0],
|
||||||
|
max_preamble_energy[0]/10,
|
||||||
|
max_preamble_energy[0]%10,
|
||||||
|
max_preamble_delay[0]);
|
||||||
|
T(T_ENB_PHY_INITIATE_RA_PROCEDURE, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe),
|
||||||
|
T_INT(max_preamble[0]), T_INT(max_preamble_energy[0]), T_INT(max_preamble_delay[0]));
|
||||||
|
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||||
|
eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles = 1;
|
||||||
|
eNB->UL_INFO.rach_ind.rach_indication_body.preamble_list = &eNB->preamble_list[0];
|
||||||
|
eNB->UL_INFO.rach_ind.rach_indication_body.tl.tag = NFAPI_RACH_INDICATION_BODY_TAG;
|
||||||
|
eNB->UL_INFO.rach_ind.header.message_id = NFAPI_RACH_INDICATION;
|
||||||
|
eNB->UL_INFO.rach_ind.sfn_sf = frame<<4 | subframe;
|
||||||
|
eNB->preamble_list[0].preamble_rel8.tl.tag = NFAPI_PREAMBLE_REL8_TAG;
|
||||||
|
eNB->preamble_list[0].preamble_rel8.timing_advance = max_preamble_delay[0];
|
||||||
|
eNB->preamble_list[0].preamble_rel8.preamble = max_preamble[0];
|
||||||
|
eNB->preamble_list[0].preamble_rel8.rnti = 1+subframe; // note: fid is implicitly 0 here
|
||||||
|
eNB->preamble_list[0].preamble_rel13.rach_resource_type = 0;
|
||||||
|
eNB->preamble_list[0].instance_length = 0; //don't know exactly what this is
|
||||||
|
|
||||||
{
|
if (NFAPI_MODE==NFAPI_MODE_PNF) { // If NFAPI PNF then we need to send the message to the VNF
|
||||||
if ((eNB->prach_energy_counter == 100) &&
|
LOG_D(PHY,"Filling NFAPI indication for RACH : SFN_SF:%d TA %d, Preamble %d, rnti %x, rach_resource_type %d\n",
|
||||||
(max_preamble_energy[0] > eNB->measurements.prach_I0+eNB->prach_DTX_threshold)) {
|
NFAPI_SFNSF2DEC(eNB->UL_INFO.rach_ind.sfn_sf),
|
||||||
|
eNB->preamble_list[0].preamble_rel8.timing_advance,
|
||||||
LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n",
|
eNB->preamble_list[0].preamble_rel8.preamble,
|
||||||
eNB->Mod_id,
|
eNB->preamble_list[0].preamble_rel8.rnti,
|
||||||
eNB->CC_id,
|
eNB->preamble_list[0].preamble_rel13.rach_resource_type);
|
||||||
frame,
|
oai_nfapi_rach_ind(&eNB->UL_INFO.rach_ind);
|
||||||
subframe,
|
eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles = 0;
|
||||||
max_preamble[0],
|
|
||||||
max_preamble_energy[0]/10,
|
|
||||||
max_preamble_energy[0]%10,
|
|
||||||
max_preamble_delay[0]);
|
|
||||||
|
|
||||||
T(T_ENB_PHY_INITIATE_RA_PROCEDURE, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe),
|
|
||||||
T_INT(max_preamble[0]), T_INT(max_preamble_energy[0]), T_INT(max_preamble_delay[0]));
|
|
||||||
|
|
||||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
|
||||||
|
|
||||||
eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles = 1;
|
|
||||||
eNB->UL_INFO.rach_ind.rach_indication_body.preamble_list = &eNB->preamble_list[0];
|
|
||||||
eNB->UL_INFO.rach_ind.rach_indication_body.tl.tag = NFAPI_RACH_INDICATION_BODY_TAG;
|
|
||||||
eNB->UL_INFO.rach_ind.header.message_id = NFAPI_RACH_INDICATION;
|
|
||||||
eNB->UL_INFO.rach_ind.sfn_sf = frame<<4 | subframe;
|
|
||||||
|
|
||||||
eNB->preamble_list[0].preamble_rel8.tl.tag = NFAPI_PREAMBLE_REL8_TAG;
|
|
||||||
eNB->preamble_list[0].preamble_rel8.timing_advance = max_preamble_delay[0];
|
|
||||||
eNB->preamble_list[0].preamble_rel8.preamble = max_preamble[0];
|
|
||||||
eNB->preamble_list[0].preamble_rel8.rnti = 1+subframe; // note: fid is implicitly 0 here
|
|
||||||
eNB->preamble_list[0].preamble_rel13.rach_resource_type = 0;
|
|
||||||
eNB->preamble_list[0].instance_length = 0; //don't know exactly what this is
|
|
||||||
|
|
||||||
if (nfapi_mode == 1) { // If NFAPI PNF then we need to send the message to the VNF
|
|
||||||
|
|
||||||
LOG_D(PHY,"Filling NFAPI indication for RACH : SFN_SF:%d TA %d, Preamble %d, rnti %x, rach_resource_type %d\n",
|
|
||||||
NFAPI_SFNSF2DEC(eNB->UL_INFO.rach_ind.sfn_sf),
|
|
||||||
eNB->preamble_list[0].preamble_rel8.timing_advance,
|
|
||||||
eNB->preamble_list[0].preamble_rel8.preamble,
|
|
||||||
eNB->preamble_list[0].preamble_rel8.rnti,
|
|
||||||
eNB->preamble_list[0].preamble_rel13.rach_resource_type);
|
|
||||||
|
|
||||||
oai_nfapi_rach_ind(&eNB->UL_INFO.rach_ind);
|
|
||||||
|
|
||||||
eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
|
||||||
/* write_output("prach.m","prachsig",eNB->prach_vars.rxsigF[0][0],839,1,1);
|
|
||||||
exit(-1);*/
|
|
||||||
} // max_preamble_energy > prach_I0 + 100
|
|
||||||
else {
|
|
||||||
eNB->measurements.prach_I0 = ((eNB->measurements.prach_I0*900)>>10) + ((max_preamble_energy[0]*124)>>10);
|
|
||||||
if (frame==0) LOG_I(PHY,"prach_I0 = %d.%d dB\n",eNB->measurements.prach_I0/10,eNB->measurements.prach_I0%10);
|
|
||||||
if (eNB->prach_energy_counter < 100) eNB->prach_energy_counter++;
|
|
||||||
}
|
}
|
||||||
} // else br_flag
|
|
||||||
|
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
|
||||||
|
} // max_preamble_energy > prach_I0 + 100
|
||||||
|
else {
|
||||||
|
eNB->measurements.prach_I0 = ((eNB->measurements.prach_I0*900)>>10) + ((max_preamble_energy[0]*124)>>10);
|
||||||
|
|
||||||
|
if (frame==0) LOG_I(PHY,"prach_I0 = %d.%d dB\n",eNB->measurements.prach_I0/10,eNB->measurements.prach_I0%10);
|
||||||
|
|
||||||
|
if (eNB->prach_energy_counter < 100) eNB->prach_energy_counter++;
|
||||||
|
}
|
||||||
|
} // else br_flag
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1517,15 +1517,19 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
|
|||||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK = ack_status_cw0 + ack_status_cw1;
|
ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK = ack_status_cw0 + ack_status_cw1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ue->ulsch[eNB_id]->o_ACK[0]) {
|
||||||
|
T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti),
|
||||||
|
T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid));
|
||||||
|
} else {
|
||||||
|
T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti),
|
||||||
|
T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid));
|
||||||
|
}
|
||||||
|
|
||||||
if ( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) {
|
if ( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) {
|
||||||
if(ue->ulsch[eNB_id]->o_ACK[0]) {
|
if(ue->ulsch[eNB_id]->o_ACK[0]) {
|
||||||
LOG_I(PHY,"PUSCH ACK\n");
|
LOG_I(PHY,"PUSCH ACK\n");
|
||||||
T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti),
|
|
||||||
T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid));
|
|
||||||
} else {
|
} else {
|
||||||
LOG_I(PHY,"PUSCH NACK\n");
|
LOG_I(PHY,"PUSCH NACK\n");
|
||||||
T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti),
|
|
||||||
T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_I(PHY,"[UE %d][PDSCH %x] AbsSubFrame %d.%d Generating ACK (%d,%d) for %d bits on PUSCH\n",
|
LOG_I(PHY,"[UE %d][PDSCH %x] AbsSubFrame %d.%d Generating ACK (%d,%d) for %d bits on PUSCH\n",
|
||||||
@@ -2037,14 +2041,12 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) {
|
if (pucch_payload[0]) {
|
||||||
if(pucch_payload[0]) {
|
T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti),
|
||||||
T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti),
|
T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid));
|
||||||
T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid));
|
} else {
|
||||||
} else {
|
T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti),
|
||||||
T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti),
|
T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid));
|
||||||
T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_pucch1x(ue->common_vars.txdataF,
|
generate_pucch1x(ue->common_vars.txdataF,
|
||||||
@@ -2741,18 +2743,21 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
|
|||||||
CBA_RNTI,
|
CBA_RNTI,
|
||||||
eNB_id,
|
eNB_id,
|
||||||
0)==0)) {
|
0)==0)) {
|
||||||
|
int harq_pid = subframe2harq_pid(&ue->frame_parms,
|
||||||
|
pdcch_alloc2ul_frame(&ue->frame_parms,proc->frame_rx,proc->subframe_rx),
|
||||||
|
pdcch_alloc2ul_subframe(&ue->frame_parms,proc->subframe_rx));
|
||||||
|
T(T_UE_PHY_ULSCH_UE_DCI, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(proc->subframe_rx),
|
||||||
|
T_INT(dci_alloc_rx[i].rnti),
|
||||||
|
T_INT(harq_pid),
|
||||||
|
T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs),
|
||||||
|
T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->round),
|
||||||
|
T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb),
|
||||||
|
T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb),
|
||||||
|
T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS));
|
||||||
if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) {
|
if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) {
|
||||||
LOG_USEDINLOG_VAR(int8_t,harq_pid) = subframe2harq_pid(&ue->frame_parms,
|
LOG_USEDINLOG_VAR(int8_t,harq_pid) = subframe2harq_pid(&ue->frame_parms,
|
||||||
pdcch_alloc2ul_frame(&ue->frame_parms,proc->frame_rx,proc->subframe_rx),
|
pdcch_alloc2ul_frame(&ue->frame_parms,proc->frame_rx,proc->subframe_rx),
|
||||||
pdcch_alloc2ul_subframe(&ue->frame_parms,proc->subframe_rx));
|
pdcch_alloc2ul_subframe(&ue->frame_parms,proc->subframe_rx));
|
||||||
T(T_UE_PHY_ULSCH_UE_DCI, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(proc->subframe_rx),
|
|
||||||
T_INT(dci_alloc_rx[i].rnti),
|
|
||||||
T_INT(harq_pid),
|
|
||||||
T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs),
|
|
||||||
T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->round),
|
|
||||||
T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb),
|
|
||||||
T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb),
|
|
||||||
T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS));
|
|
||||||
LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx);
|
LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,12 +36,10 @@
|
|||||||
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
||||||
#include "PHY/phy_extern_ue.h"
|
#include "PHY/phy_extern_ue.h"
|
||||||
#include "PHY/LTE_ESTIMATION/lte_estimation.h"
|
#include "PHY/LTE_ESTIMATION/lte_estimation.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
|
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
|
|
||||||
int16_t get_hundred_times_delta_IF(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t harq_pid)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
int16_t get_hundred_times_delta_IF(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t harq_pid) {
|
||||||
uint32_t Nre = 2*ue->ulsch[eNB_id]->harq_processes[harq_pid]->Nsymb_initial *
|
uint32_t Nre = 2*ue->ulsch[eNB_id]->harq_processes[harq_pid]->Nsymb_initial *
|
||||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb*12;
|
ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb*12;
|
||||||
|
|
||||||
@@ -51,9 +49,8 @@ int16_t get_hundred_times_delta_IF(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t harq_p
|
|||||||
uint32_t MPR_x100 = 100*ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/Nre;
|
uint32_t MPR_x100 = 100*ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/Nre;
|
||||||
// Note: MPR=is the effective spectral efficiency of the PUSCH
|
// Note: MPR=is the effective spectral efficiency of the PUSCH
|
||||||
// FK 20140908 sumKr is only set after the ulsch_encoding
|
// FK 20140908 sumKr is only set after the ulsch_encoding
|
||||||
|
|
||||||
uint16_t beta_offset_pusch = (ue->ulsch[eNB_id]->harq_processes[harq_pid]->control_only == 1) ?
|
uint16_t beta_offset_pusch = (ue->ulsch[eNB_id]->harq_processes[harq_pid]->control_only == 1) ?
|
||||||
ue->ulsch[eNB_id]->beta_offset_cqi_times8:8;
|
ue->ulsch[eNB_id]->beta_offset_cqi_times8:8;
|
||||||
|
|
||||||
if (ue->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled == 1) {
|
if (ue->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled == 1) {
|
||||||
// This is the formula from Section 5.1.1.1 in 36.213 10*log10(deltaIF_PUSCH = (2^(MPR*Ks)-1)*beta_offset_pusch)
|
// This is the formula from Section 5.1.1.1 in 36.213 10*log10(deltaIF_PUSCH = (2^(MPR*Ks)-1)*beta_offset_pusch)
|
||||||
@@ -67,34 +64,24 @@ int16_t get_hundred_times_delta_IF(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t harq_p
|
|||||||
|
|
||||||
uint8_t alpha_lut[8] = {0,40,50,60,70,80,90,100};
|
uint8_t alpha_lut[8] = {0,40,50,60,70,80,90,100};
|
||||||
|
|
||||||
void pusch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag)
|
void pusch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag) {
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t harq_pid = subframe2harq_pid(&ue->frame_parms,
|
uint8_t harq_pid = subframe2harq_pid(&ue->frame_parms,
|
||||||
proc->frame_tx,
|
proc->frame_tx,
|
||||||
proc->subframe_tx);
|
proc->subframe_tx);
|
||||||
|
|
||||||
uint8_t nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb;
|
uint8_t nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb;
|
||||||
int16_t PL;
|
int16_t PL;
|
||||||
|
|
||||||
|
|
||||||
// P_pusch = 10*log10(nb_rb + P_opusch(j)+ alpha(u)*PL + delta_TF(i) + f(i))
|
// P_pusch = 10*log10(nb_rb + P_opusch(j)+ alpha(u)*PL + delta_TF(i) + f(i))
|
||||||
//
|
//
|
||||||
// P_opusch(0) = P_oPTR + deltaP_Msg3 if PUSCH is transporting Msg3
|
// P_opusch(0) = P_oPTR + deltaP_Msg3 if PUSCH is transporting Msg3
|
||||||
// else
|
// else
|
||||||
// P_opusch(0) = PO_NOMINAL_PUSCH(j) + P_O_UE_PUSCH(j)
|
// P_opusch(0) = PO_NOMINAL_PUSCH(j) + P_O_UE_PUSCH(j)
|
||||||
PL = get_PL(ue->Mod_id,ue->CC_id,eNB_id);
|
PL = get_PL(ue->Mod_id,ue->CC_id,eNB_id);
|
||||||
|
|
||||||
ue->ulsch[eNB_id]->Po_PUSCH = (hundred_times_log10_NPRB[nb_rb-1]+
|
ue->ulsch[eNB_id]->Po_PUSCH = (hundred_times_log10_NPRB[nb_rb-1]+
|
||||||
get_hundred_times_delta_IF(ue,eNB_id,harq_pid) +
|
get_hundred_times_delta_IF(ue,eNB_id,harq_pid) +
|
||||||
100*ue->ulsch[eNB_id]->f_pusch)/100;
|
100*ue->ulsch[eNB_id]->f_pusch)/100;
|
||||||
|
|
||||||
if(ue->ulsch_Msg3_active[eNB_id] == 1) { // Msg3 PUSCH
|
if(ue->ulsch_Msg3_active[eNB_id] == 1) { // Msg3 PUSCH
|
||||||
|
|
||||||
ue->ulsch[eNB_id]->Po_PUSCH += (get_Po_NOMINAL_PUSCH(ue->Mod_id,0) + PL);
|
ue->ulsch[eNB_id]->Po_PUSCH += (get_Po_NOMINAL_PUSCH(ue->Mod_id,0) + PL);
|
||||||
|
|
||||||
|
|
||||||
LOG_I(PHY,"[UE %d][RAPROC] frame %d, subframe %d: Msg3 Po_PUSCH %d dBm (%d,%d,100*PL=%d,%d,%d)\n",
|
LOG_I(PHY,"[UE %d][RAPROC] frame %d, subframe %d: Msg3 Po_PUSCH %d dBm (%d,%d,100*PL=%d,%d,%d)\n",
|
||||||
ue->Mod_id,proc->frame_tx,proc->subframe_tx,ue->ulsch[eNB_id]->Po_PUSCH,
|
ue->Mod_id,proc->frame_tx,proc->subframe_tx,ue->ulsch[eNB_id]->Po_PUSCH,
|
||||||
100*get_Po_NOMINAL_PUSCH(ue->Mod_id,0),
|
100*get_Po_NOMINAL_PUSCH(ue->Mod_id,0),
|
||||||
@@ -104,10 +91,9 @@ void pusch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_
|
|||||||
100*ue->ulsch[eNB_id]->f_pusch);
|
100*ue->ulsch[eNB_id]->f_pusch);
|
||||||
} else if (j==0) { // SPS PUSCH
|
} else if (j==0) { // SPS PUSCH
|
||||||
} else if (j==1) { // Normal PUSCH
|
} else if (j==1) { // Normal PUSCH
|
||||||
|
|
||||||
ue->ulsch[eNB_id]->Po_PUSCH += ((alpha_lut[ue->frame_parms.ul_power_control_config_common.alpha]*PL)/100);
|
ue->ulsch[eNB_id]->Po_PUSCH += ((alpha_lut[ue->frame_parms.ul_power_control_config_common.alpha]*PL)/100);
|
||||||
ue->ulsch[eNB_id]->Po_PUSCH += ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH;
|
ue->ulsch[eNB_id]->Po_PUSCH += ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH;
|
||||||
ue->ulsch[eNB_id]->PHR = ue->tx_power_max_dBm-ue->ulsch[eNB_id]->Po_PUSCH;
|
ue->ulsch[eNB_id]->PHR = ue->tx_power_max_dBm-ue->ulsch[eNB_id]->Po_PUSCH;
|
||||||
|
|
||||||
if (ue->ulsch[eNB_id]->PHR < -23)
|
if (ue->ulsch[eNB_id]->PHR < -23)
|
||||||
ue->ulsch[eNB_id]->PHR = -23;
|
ue->ulsch[eNB_id]->PHR = -23;
|
||||||
@@ -126,13 +112,11 @@ void pusch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_
|
|||||||
get_hundred_times_delta_IF(ue,eNB_id,harq_pid)/100.0,
|
get_hundred_times_delta_IF(ue,eNB_id,harq_pid)/100.0,
|
||||||
ue->ulsch[eNB_id]->f_pusch);
|
ue->ulsch[eNB_id]->f_pusch);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id,uint8_t eNB_index)
|
int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id,uint8_t eNB_index) {
|
||||||
{
|
if(NFAPI_MODE!=NFAPI_UE_STUB_PNF)
|
||||||
if(nfapi_mode!=3)
|
return PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->PHR;
|
||||||
return PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->PHR;
|
else
|
||||||
else
|
return 40; // l1l2 simulator => ideal conditions
|
||||||
return 40; // For nfapi_mode=3 consider ideal conditions
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,11 +92,11 @@ static int tun_alloc(char *dev) {
|
|||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int netlink_init_tun(char *ifprefix) {
|
int netlink_init_tun(char *ifprefix, int num_if) {
|
||||||
int ret;
|
int ret;
|
||||||
char ifname[64];
|
char ifname[64];
|
||||||
|
|
||||||
for (int i = 0; i < NUMBER_OF_UE_MAX; i++) {
|
for (int i = 0; i < num_if; i++) {
|
||||||
sprintf(ifname, "oaitun_%.3s%d",ifprefix,i+1);
|
sprintf(ifname, "oaitun_%.3s%d",ifprefix,i+1);
|
||||||
nas_sock_fd[i] = tun_alloc(ifname);
|
nas_sock_fd[i] = tun_alloc(ifname);
|
||||||
|
|
||||||
|
|||||||
@@ -62,6 +62,6 @@ int multicast_link_read_data_from_sock(uint8_t eNB_flag);
|
|||||||
void clear_eNB_transport_info(uint8_t);
|
void clear_eNB_transport_info(uint8_t);
|
||||||
void clear_UE_transport_info(uint8_t);
|
void clear_UE_transport_info(uint8_t);
|
||||||
int netlink_init(void);
|
int netlink_init(void);
|
||||||
int netlink_init_tun(char *ifsuffix);
|
int netlink_init_tun(char *ifsuffix, int num_if);
|
||||||
|
|
||||||
#endif /* EMU_PROTO_H_ */
|
#endif /* EMU_PROTO_H_ */
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
#include "SCHED_UE/sched_UE.h"
|
#include "SCHED_UE/sched_UE.h"
|
||||||
#include "common/config/config_load_configmodule.h"
|
#include "common/config/config_load_configmodule.h"
|
||||||
#include "PHY/INIT/phy_init.h"
|
#include "PHY/INIT/phy_init.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
|
|
||||||
void feptx_ofdm(RU_t *ru);
|
void feptx_ofdm(RU_t *ru);
|
||||||
void feptx_prec(RU_t *ru);
|
void feptx_prec(RU_t *ru);
|
||||||
@@ -471,7 +471,7 @@ int n_users = 1;
|
|||||||
int subframe=7;
|
int subframe=7;
|
||||||
int num_common_dci=0,num_ue_spec_dci=0,num_dci=0,num_pdcch_symbols=1;
|
int num_common_dci=0,num_ue_spec_dci=0,num_dci=0,num_pdcch_symbols=1;
|
||||||
uint16_t n_rnti=0x1234;
|
uint16_t n_rnti=0x1234;
|
||||||
int nfapi_mode=0;
|
|
||||||
int abstx=0;
|
int abstx=0;
|
||||||
int Nid_cell=0;
|
int Nid_cell=0;
|
||||||
int N_RB_DL=25;
|
int N_RB_DL=25;
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
|
|
||||||
#include "PHY/TOOLS/lte_phy_scope.h"
|
#include "PHY/TOOLS/lte_phy_scope.h"
|
||||||
#include "dummy_functions.c"
|
#include "dummy_functions.c"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "common/config/config_load_configmodule.h"
|
#include "common/config/config_load_configmodule.h"
|
||||||
double cpuf;
|
double cpuf;
|
||||||
#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
|
#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
|
||||||
@@ -81,7 +81,7 @@ double t_tx_min = 1000000000; /*!< \brief initial min process time for tx */
|
|||||||
double t_rx_min = 1000000000; /*!< \brief initial min process time for tx */
|
double t_rx_min = 1000000000; /*!< \brief initial min process time for tx */
|
||||||
int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
|
int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
|
||||||
int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
|
int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
|
||||||
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);
|
||||||
|
|||||||
+826
-869
File diff suppressed because it is too large
Load Diff
+330
-411
File diff suppressed because it is too large
Load Diff
+272
-278
@@ -32,12 +32,12 @@
|
|||||||
|
|
||||||
#include "COMMON/platform_types.h"
|
#include "COMMON/platform_types.h"
|
||||||
#include "COMMON/platform_constants.h"
|
#include "COMMON/platform_constants.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "SCHED_UE/sched_UE.h"
|
#include "SCHED_UE/sched_UE.h"
|
||||||
#include "LTE_SystemInformationBlockType2.h"
|
#include "LTE_SystemInformationBlockType2.h"
|
||||||
//#include "RadioResourceConfigCommonSIB.h"
|
|
||||||
#include "LTE_RadioResourceConfigDedicated.h"
|
#include "LTE_RadioResourceConfigDedicated.h"
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0))
|
||||||
#include "LTE_PRACH-ConfigSIB-v1310.h"
|
#include "LTE_PRACH-ConfigSIB-v1310.h"
|
||||||
#endif
|
#endif
|
||||||
#include "LTE_MeasGapConfig.h"
|
#include "LTE_MeasGapConfig.h"
|
||||||
#include "LTE_MeasObjectToAddModList.h"
|
#include "LTE_MeasObjectToAddModList.h"
|
||||||
@@ -52,51 +52,38 @@
|
|||||||
|
|
||||||
#include "common/ran_context.h"
|
#include "common/ran_context.h"
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||||
#include "LTE_MBSFN-AreaInfoList-r9.h"
|
#include "LTE_MBSFN-AreaInfoList-r9.h"
|
||||||
#include "LTE_MBSFN-AreaInfo-r9.h"
|
#include "LTE_MBSFN-AreaInfo-r9.h"
|
||||||
#include "LTE_MBSFN-SubframeConfigList.h"
|
#include "LTE_MBSFN-SubframeConfigList.h"
|
||||||
#include "LTE_PMCH-InfoList-r9.h"
|
#include "LTE_PMCH-InfoList-r9.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void mac_init_cell_params(int Mod_idP,int CC_idP);
|
extern void mac_init_cell_params(int Mod_idP,int CC_idP);
|
||||||
extern void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
|
extern void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
|
||||||
|
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
|
|
||||||
|
|
||||||
/* sec 5.9, 36.321: MAC Reset Procedure */
|
/* sec 5.9, 36.321: MAC Reset Procedure */
|
||||||
void ue_mac_reset(module_id_t module_idP, uint8_t eNB_index)
|
void ue_mac_reset(module_id_t module_idP, uint8_t eNB_index) {
|
||||||
{
|
|
||||||
|
|
||||||
//Resetting Bj
|
//Resetting Bj
|
||||||
UE_mac_inst[module_idP].scheduling_info.Bj[0] = 0;
|
UE_mac_inst[module_idP].scheduling_info.Bj[0] = 0;
|
||||||
UE_mac_inst[module_idP].scheduling_info.Bj[1] = 0;
|
UE_mac_inst[module_idP].scheduling_info.Bj[1] = 0;
|
||||||
UE_mac_inst[module_idP].scheduling_info.Bj[2] = 0;
|
UE_mac_inst[module_idP].scheduling_info.Bj[2] = 0;
|
||||||
|
|
||||||
//Stopping all timers
|
//Stopping all timers
|
||||||
|
|
||||||
//timeAlignmentTimer expires
|
//timeAlignmentTimer expires
|
||||||
|
|
||||||
// PHY changes for UE MAC reset
|
// PHY changes for UE MAC reset
|
||||||
phy_reset_ue(module_idP, 0, eNB_index);
|
phy_reset_ue(module_idP, 0, eNB_index);
|
||||||
|
|
||||||
// notify RRC to relase PUCCH/SRS
|
// notify RRC to relase PUCCH/SRS
|
||||||
// cancel all pending SRs
|
// cancel all pending SRs
|
||||||
UE_mac_inst[module_idP].scheduling_info.SR_pending = 0;
|
UE_mac_inst[module_idP].scheduling_info.SR_pending = 0;
|
||||||
UE_mac_inst[module_idP].scheduling_info.SR_COUNTER = 0;
|
UE_mac_inst[module_idP].scheduling_info.SR_COUNTER = 0;
|
||||||
|
|
||||||
//Set BSR Trigger Bmp and remove timer flags
|
//Set BSR Trigger Bmp and remove timer flags
|
||||||
UE_mac_inst[module_idP].BSR_reporting_active = BSR_TRIGGER_NONE;
|
UE_mac_inst[module_idP].BSR_reporting_active = BSR_TRIGGER_NONE;
|
||||||
|
|
||||||
// stop ongoing RACH procedure
|
// stop ongoing RACH procedure
|
||||||
|
|
||||||
// discard explicitly signaled ra_PreambleIndex and ra_RACH_MaskIndex, if any
|
// discard explicitly signaled ra_PreambleIndex and ra_RACH_MaskIndex, if any
|
||||||
UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = 0; // check!
|
UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = 0; // check!
|
||||||
UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0;
|
UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0;
|
||||||
|
ue_init_mac(module_idP); //This will hopefully do the rest of the MAC reset procedure
|
||||||
|
|
||||||
ue_init_mac(module_idP); //This will hopefully do the rest of the MAC reset procedure
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t **rxdata;
|
int32_t **rxdata;
|
||||||
@@ -105,209 +92,207 @@ int32_t **txdata;
|
|||||||
|
|
||||||
int
|
int
|
||||||
rrc_mac_config_req_ue(module_id_t Mod_idP,
|
rrc_mac_config_req_ue(module_id_t Mod_idP,
|
||||||
int CC_idP,
|
int CC_idP,
|
||||||
uint8_t eNB_index,
|
uint8_t eNB_index,
|
||||||
LTE_RadioResourceConfigCommonSIB_t *
|
LTE_RadioResourceConfigCommonSIB_t *
|
||||||
radioResourceConfigCommon,
|
radioResourceConfigCommon,
|
||||||
struct LTE_PhysicalConfigDedicated
|
struct LTE_PhysicalConfigDedicated
|
||||||
*physicalConfigDedicated,
|
*physicalConfigDedicated,
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
LTE_SCellToAddMod_r10_t * sCellToAddMod_r10,
|
LTE_SCellToAddMod_r10_t *sCellToAddMod_r10,
|
||||||
//struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
|
//struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
|
||||||
#endif
|
#endif
|
||||||
LTE_MeasObjectToAddMod_t ** measObj,
|
LTE_MeasObjectToAddMod_t **measObj,
|
||||||
LTE_MAC_MainConfig_t * mac_MainConfig,
|
LTE_MAC_MainConfig_t *mac_MainConfig,
|
||||||
long logicalChannelIdentity,
|
long logicalChannelIdentity,
|
||||||
LTE_LogicalChannelConfig_t * logicalChannelConfig,
|
LTE_LogicalChannelConfig_t *logicalChannelConfig,
|
||||||
LTE_MeasGapConfig_t * measGapConfig,
|
LTE_MeasGapConfig_t *measGapConfig,
|
||||||
LTE_TDD_Config_t * tdd_Config,
|
LTE_TDD_Config_t *tdd_Config,
|
||||||
LTE_MobilityControlInfo_t * mobilityControlInfo,
|
LTE_MobilityControlInfo_t *mobilityControlInfo,
|
||||||
uint8_t * SIwindowsize,
|
uint8_t *SIwindowsize,
|
||||||
uint16_t * SIperiod,
|
uint16_t *SIperiod,
|
||||||
LTE_ARFCN_ValueEUTRA_t * ul_CarrierFreq,
|
LTE_ARFCN_ValueEUTRA_t *ul_CarrierFreq,
|
||||||
long *ul_Bandwidth,
|
long *ul_Bandwidth,
|
||||||
LTE_AdditionalSpectrumEmission_t *
|
LTE_AdditionalSpectrumEmission_t *
|
||||||
additionalSpectrumEmission,
|
additionalSpectrumEmission,
|
||||||
struct LTE_MBSFN_SubframeConfigList
|
struct LTE_MBSFN_SubframeConfigList
|
||||||
*mbsfn_SubframeConfigList
|
*mbsfn_SubframeConfigList
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||||
, uint8_t MBMS_Flag,
|
, uint8_t MBMS_Flag,
|
||||||
LTE_MBSFN_AreaInfoList_r9_t * mbsfn_AreaInfoList,
|
LTE_MBSFN_AreaInfoList_r9_t *mbsfn_AreaInfoList,
|
||||||
LTE_PMCH_InfoList_r9_t * pmch_InfoList
|
LTE_PMCH_InfoList_r9_t *pmch_InfoList
|
||||||
#endif
|
#endif
|
||||||
#ifdef CBA
|
#ifdef CBA
|
||||||
, uint8_t num_active_cba_groups, uint16_t cba_rnti
|
, uint8_t num_active_cba_groups, uint16_t cba_rnti
|
||||||
#endif
|
#endif
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
,config_action_t config_action
|
,config_action_t config_action
|
||||||
,const uint32_t * const sourceL2Id
|
,const uint32_t *const sourceL2Id
|
||||||
,const uint32_t * const destinationL2Id
|
,const uint32_t *const destinationL2Id
|
||||||
#endif
|
#endif
|
||||||
)
|
) {
|
||||||
{
|
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
|
||||||
(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_IN);
|
(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
LOG_I(MAC, "[CONFIG][UE %d] Configuring MAC/PHY from eNB %d\n",
|
LOG_I(MAC, "[CONFIG][UE %d] Configuring MAC/PHY from eNB %d\n",
|
||||||
Mod_idP, eNB_index);
|
Mod_idP, eNB_index);
|
||||||
|
|
||||||
if (tdd_Config != NULL) {
|
if (tdd_Config != NULL) {
|
||||||
UE_mac_inst[Mod_idP].tdd_Config = tdd_Config;
|
UE_mac_inst[Mod_idP].tdd_Config = tdd_Config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (tdd_Config && SIwindowsize && SIperiod) {
|
if (tdd_Config && SIwindowsize && SIperiod) {
|
||||||
phy_config_sib1_ue(Mod_idP, 0, eNB_index, tdd_Config,
|
phy_config_sib1_ue(Mod_idP, 0, eNB_index, tdd_Config,
|
||||||
*SIwindowsize, *SIperiod);
|
*SIwindowsize, *SIperiod);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (radioResourceConfigCommon != NULL) {
|
if (radioResourceConfigCommon != NULL) {
|
||||||
UE_mac_inst[Mod_idP].radioResourceConfigCommon =
|
UE_mac_inst[Mod_idP].radioResourceConfigCommon =
|
||||||
radioResourceConfigCommon;
|
radioResourceConfigCommon;
|
||||||
phy_config_sib2_ue(Mod_idP, 0, eNB_index,
|
phy_config_sib2_ue(Mod_idP, 0, eNB_index,
|
||||||
radioResourceConfigCommon, ul_CarrierFreq,
|
radioResourceConfigCommon, ul_CarrierFreq,
|
||||||
ul_Bandwidth, additionalSpectrumEmission,
|
ul_Bandwidth, additionalSpectrumEmission,
|
||||||
mbsfn_SubframeConfigList);
|
mbsfn_SubframeConfigList);
|
||||||
}
|
}
|
||||||
|
|
||||||
// SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters->logicalChannelGroup
|
// SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters->logicalChannelGroup
|
||||||
if (logicalChannelConfig != NULL) {
|
if (logicalChannelConfig != NULL) {
|
||||||
LOG_I(MAC,
|
LOG_I(MAC,
|
||||||
"[CONFIG][UE %d] Applying RRC logicalChannelConfig from eNB%d\n",
|
"[CONFIG][UE %d] Applying RRC logicalChannelConfig from eNB%d\n",
|
||||||
Mod_idP, eNB_index);
|
Mod_idP, eNB_index);
|
||||||
UE_mac_inst[Mod_idP].logicalChannelConfig[logicalChannelIdentity] =
|
UE_mac_inst[Mod_idP].logicalChannelConfig[logicalChannelIdentity] =
|
||||||
logicalChannelConfig;
|
logicalChannelConfig;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.Bj[logicalChannelIdentity] = 0; // initilize the bucket for this lcid
|
UE_mac_inst[Mod_idP].scheduling_info.Bj[logicalChannelIdentity] = 0; // initilize the bucket for this lcid
|
||||||
|
|
||||||
AssertFatal(logicalChannelConfig->ul_SpecificParameters != NULL,
|
AssertFatal(logicalChannelConfig->ul_SpecificParameters != NULL,
|
||||||
"[UE %d] LCID %ld NULL ul_SpecificParameters\n",
|
"[UE %d] LCID %ld NULL ul_SpecificParameters\n",
|
||||||
Mod_idP, logicalChannelIdentity);
|
Mod_idP, logicalChannelIdentity);
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.bucket_size[logicalChannelIdentity] = logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate * logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration; // set the max bucket size
|
UE_mac_inst[Mod_idP].scheduling_info.bucket_size[logicalChannelIdentity] = logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate *
|
||||||
|
logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration; // set the max bucket size
|
||||||
|
|
||||||
if (logicalChannelConfig->ul_SpecificParameters->
|
if (logicalChannelConfig->ul_SpecificParameters->
|
||||||
logicalChannelGroup != NULL) {
|
logicalChannelGroup != NULL) {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.
|
UE_mac_inst[Mod_idP].scheduling_info.
|
||||||
LCGID[logicalChannelIdentity] =
|
LCGID[logicalChannelIdentity] =
|
||||||
*logicalChannelConfig->ul_SpecificParameters->
|
*logicalChannelConfig->ul_SpecificParameters->
|
||||||
logicalChannelGroup;
|
logicalChannelGroup;
|
||||||
LOG_D(MAC,
|
LOG_D(MAC,
|
||||||
"[CONFIG][UE %d] LCID %ld is attached to the LCGID %ld\n",
|
"[CONFIG][UE %d] LCID %ld is attached to the LCGID %ld\n",
|
||||||
Mod_idP, logicalChannelIdentity,
|
Mod_idP, logicalChannelIdentity,
|
||||||
*logicalChannelConfig->
|
*logicalChannelConfig->
|
||||||
ul_SpecificParameters->logicalChannelGroup);
|
ul_SpecificParameters->logicalChannelGroup);
|
||||||
} else {
|
} else {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.
|
UE_mac_inst[Mod_idP].scheduling_info.
|
||||||
LCGID[logicalChannelIdentity] = MAX_NUM_LCGID;
|
LCGID[logicalChannelIdentity] = MAX_NUM_LCGID;
|
||||||
}
|
}
|
||||||
|
|
||||||
UE_mac_inst[Mod_idP].
|
UE_mac_inst[Mod_idP].
|
||||||
scheduling_info.LCID_buffer_remain[logicalChannelIdentity] = 0;
|
scheduling_info.LCID_buffer_remain[logicalChannelIdentity] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mac_MainConfig != NULL) {
|
if (mac_MainConfig != NULL) {
|
||||||
LOG_I(MAC,
|
LOG_I(MAC,
|
||||||
"[CONFIG][UE%d] Applying RRC macMainConfig from eNB%d\n",
|
"[CONFIG][UE%d] Applying RRC macMainConfig from eNB%d\n",
|
||||||
Mod_idP, eNB_index);
|
Mod_idP, eNB_index);
|
||||||
UE_mac_inst[Mod_idP].macConfig = mac_MainConfig;
|
UE_mac_inst[Mod_idP].macConfig = mac_MainConfig;
|
||||||
UE_mac_inst[Mod_idP].measGapConfig = measGapConfig;
|
UE_mac_inst[Mod_idP].measGapConfig = measGapConfig;
|
||||||
|
|
||||||
if (mac_MainConfig->ul_SCH_Config) {
|
if (mac_MainConfig->ul_SCH_Config) {
|
||||||
|
|
||||||
if (mac_MainConfig->ul_SCH_Config->periodicBSR_Timer) {
|
if (mac_MainConfig->ul_SCH_Config->periodicBSR_Timer) {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer =
|
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer =
|
||||||
(uint16_t) *
|
(uint16_t) *
|
||||||
mac_MainConfig->ul_SCH_Config->periodicBSR_Timer;
|
mac_MainConfig->ul_SCH_Config->periodicBSR_Timer;
|
||||||
} else {
|
} else {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer =
|
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer =
|
||||||
#if (LTE_RRC_VERSION < MAKE_VERSION(12, 0, 0))
|
#if (LTE_RRC_VERSION < MAKE_VERSION(12, 0, 0))
|
||||||
(uint16_t)
|
(uint16_t)
|
||||||
LTE_MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity
|
LTE_MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity
|
||||||
#else
|
#else
|
||||||
(uint16_t) LTE_PeriodicBSR_Timer_r12_infinity;
|
(uint16_t) LTE_PeriodicBSR_Timer_r12_infinity;
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mac_MainConfig->ul_SCH_Config->maxHARQ_Tx) {
|
if (mac_MainConfig->ul_SCH_Config->maxHARQ_Tx) {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx =
|
UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx =
|
||||||
(uint16_t) * mac_MainConfig->ul_SCH_Config->maxHARQ_Tx;
|
(uint16_t) * mac_MainConfig->ul_SCH_Config->maxHARQ_Tx;
|
||||||
} else {
|
} else {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx =
|
UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx =
|
||||||
(uint16_t)
|
(uint16_t)
|
||||||
LTE_MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5;
|
LTE_MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5;
|
||||||
}
|
}
|
||||||
if(nfapi_mode!=3)
|
|
||||||
|
if(NFAPI_MODE != NFAPI_UE_STUB_PNF)
|
||||||
phy_config_harq_ue(Mod_idP, 0, eNB_index,
|
phy_config_harq_ue(Mod_idP, 0, eNB_index,
|
||||||
UE_mac_inst[Mod_idP].
|
UE_mac_inst[Mod_idP].
|
||||||
scheduling_info.maxHARQ_Tx);
|
scheduling_info.maxHARQ_Tx);
|
||||||
|
|
||||||
if (mac_MainConfig->ul_SCH_Config->retxBSR_Timer) {
|
if (mac_MainConfig->ul_SCH_Config->retxBSR_Timer) {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer =
|
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer =
|
||||||
(uint16_t) mac_MainConfig->ul_SCH_Config->
|
(uint16_t) mac_MainConfig->ul_SCH_Config->
|
||||||
retxBSR_Timer;
|
retxBSR_Timer;
|
||||||
} else {
|
} else {
|
||||||
#if (LTE_RRC_VERSION < MAKE_VERSION(12, 0, 0))
|
#if (LTE_RRC_VERSION < MAKE_VERSION(12, 0, 0))
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer =
|
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer =
|
||||||
(uint16_t)
|
(uint16_t)
|
||||||
LTE_MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560;
|
LTE_MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560;
|
||||||
#else
|
#else
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer =
|
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer =
|
||||||
(uint16_t) LTE_RetxBSR_Timer_r12_sf2560;
|
(uint16_t) LTE_RetxBSR_Timer_r12_sf2560;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
|
|
||||||
if (mac_MainConfig->ext1
|
if (mac_MainConfig->ext1
|
||||||
&& mac_MainConfig->ext1->sr_ProhibitTimer_r9) {
|
&& mac_MainConfig->ext1->sr_ProhibitTimer_r9) {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer =
|
UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer =
|
||||||
(uint16_t) * mac_MainConfig->ext1->sr_ProhibitTimer_r9;
|
(uint16_t) * mac_MainConfig->ext1->sr_ProhibitTimer_r9;
|
||||||
} else {
|
} else {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = 0;
|
UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mac_MainConfig->ext2
|
if (mac_MainConfig->ext2
|
||||||
&& mac_MainConfig->ext2->mac_MainConfig_v1020) {
|
&& mac_MainConfig->ext2->mac_MainConfig_v1020) {
|
||||||
if (mac_MainConfig->ext2->
|
if (mac_MainConfig->ext2->
|
||||||
mac_MainConfig_v1020->extendedBSR_Sizes_r10) {
|
mac_MainConfig_v1020->extendedBSR_Sizes_r10) {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.
|
UE_mac_inst[Mod_idP].scheduling_info.
|
||||||
extendedBSR_Sizes_r10 =
|
extendedBSR_Sizes_r10 =
|
||||||
(uint16_t) *
|
(uint16_t) *
|
||||||
mac_MainConfig->ext2->
|
mac_MainConfig->ext2->
|
||||||
mac_MainConfig_v1020->extendedBSR_Sizes_r10;
|
mac_MainConfig_v1020->extendedBSR_Sizes_r10;
|
||||||
} else {
|
} else {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.
|
UE_mac_inst[Mod_idP].scheduling_info.
|
||||||
extendedBSR_Sizes_r10 = (uint16_t) 0;
|
extendedBSR_Sizes_r10 = (uint16_t) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mac_MainConfig->ext2->mac_MainConfig_v1020->
|
if (mac_MainConfig->ext2->mac_MainConfig_v1020->
|
||||||
extendedPHR_r10) {
|
extendedPHR_r10) {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 =
|
UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 =
|
||||||
(uint16_t) *
|
(uint16_t) *
|
||||||
mac_MainConfig->ext2->mac_MainConfig_v1020->
|
mac_MainConfig->ext2->mac_MainConfig_v1020->
|
||||||
extendedPHR_r10;
|
extendedPHR_r10;
|
||||||
} else {
|
} else {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 =
|
UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 =
|
||||||
(uint16_t) 0;
|
(uint16_t) 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.extendedBSR_Sizes_r10 =
|
UE_mac_inst[Mod_idP].scheduling_info.extendedBSR_Sizes_r10 =
|
||||||
(uint16_t) 0;
|
(uint16_t) 0;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 =
|
UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 =
|
||||||
(uint16_t) 0;
|
(uint16_t) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_SF =
|
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_SF =
|
||||||
MAC_UE_BSR_TIMER_NOT_RUNNING;
|
MAC_UE_BSR_TIMER_NOT_RUNNING;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_SF =
|
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_SF =
|
||||||
MAC_UE_BSR_TIMER_NOT_RUNNING;
|
MAC_UE_BSR_TIMER_NOT_RUNNING;
|
||||||
|
|
||||||
UE_mac_inst[Mod_idP].BSR_reporting_active = BSR_TRIGGER_NONE;
|
UE_mac_inst[Mod_idP].BSR_reporting_active = BSR_TRIGGER_NONE;
|
||||||
|
|
||||||
LOG_D(MAC, "[UE %d]: periodic BSR %d (SF), retx BSR %d (SF)\n",
|
LOG_D(MAC, "[UE %d]: periodic BSR %d (SF), retx BSR %d (SF)\n",
|
||||||
Mod_idP,
|
Mod_idP,
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_SF,
|
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_SF,
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_SF);
|
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_SF);
|
||||||
|
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.drx_config =
|
UE_mac_inst[Mod_idP].scheduling_info.drx_config =
|
||||||
mac_MainConfig->drx_Config;
|
mac_MainConfig->drx_Config;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.phr_config =
|
UE_mac_inst[Mod_idP].scheduling_info.phr_config =
|
||||||
@@ -315,62 +300,62 @@ rrc_mac_config_req_ue(module_id_t Mod_idP,
|
|||||||
|
|
||||||
if (mac_MainConfig->phr_Config) {
|
if (mac_MainConfig->phr_Config) {
|
||||||
UE_mac_inst[Mod_idP].PHR_state =
|
UE_mac_inst[Mod_idP].PHR_state =
|
||||||
mac_MainConfig->phr_Config->present;
|
mac_MainConfig->phr_Config->present;
|
||||||
UE_mac_inst[Mod_idP].PHR_reconfigured = 1;
|
UE_mac_inst[Mod_idP].PHR_reconfigured = 1;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer =
|
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer =
|
||||||
mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer;
|
mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer =
|
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer =
|
||||||
mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer;
|
mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange =
|
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange =
|
||||||
mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange;
|
mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange;
|
||||||
} else {
|
} else {
|
||||||
UE_mac_inst[Mod_idP].PHR_reconfigured = 0;
|
UE_mac_inst[Mod_idP].PHR_reconfigured = 0;
|
||||||
UE_mac_inst[Mod_idP].PHR_state =
|
UE_mac_inst[Mod_idP].PHR_state =
|
||||||
LTE_MAC_MainConfig__phr_Config_PR_setup;
|
LTE_MAC_MainConfig__phr_Config_PR_setup;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer =
|
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer =
|
||||||
LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20;
|
LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer =
|
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer =
|
||||||
LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20;
|
LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange =
|
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange =
|
||||||
LTE_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1;
|
LTE_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1;
|
||||||
}
|
}
|
||||||
|
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF =
|
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF =
|
||||||
get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_idP].
|
get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_idP].
|
||||||
scheduling_info.periodicPHR_Timer);
|
scheduling_info.periodicPHR_Timer);
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF =
|
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF =
|
||||||
get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_idP].
|
get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_idP].
|
||||||
scheduling_info.prohibitPHR_Timer);
|
scheduling_info.prohibitPHR_Timer);
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db =
|
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db =
|
||||||
get_db_dl_PathlossChange(UE_mac_inst[Mod_idP].
|
get_db_dl_PathlossChange(UE_mac_inst[Mod_idP].
|
||||||
scheduling_info.PathlossChange);
|
scheduling_info.PathlossChange);
|
||||||
UE_mac_inst[Mod_idP].PHR_reporting_active = 0;
|
UE_mac_inst[Mod_idP].PHR_reporting_active = 0;
|
||||||
LOG_D(MAC,
|
LOG_D(MAC,
|
||||||
"[UE %d] config PHR (%d): periodic %d (SF) prohibit %d (SF) pathlosschange %d (db) \n",
|
"[UE %d] config PHR (%d): periodic %d (SF) prohibit %d (SF) pathlosschange %d (db) \n",
|
||||||
Mod_idP,
|
Mod_idP,
|
||||||
(mac_MainConfig->phr_Config) ? mac_MainConfig->
|
(mac_MainConfig->phr_Config) ? mac_MainConfig->
|
||||||
phr_Config->present : -1,
|
phr_Config->present : -1,
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF,
|
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF,
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF,
|
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF,
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db);
|
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (physicalConfigDedicated != NULL) {
|
if (physicalConfigDedicated != NULL) {
|
||||||
if(nfapi_mode!=3)
|
if(NFAPI_MODE != NFAPI_UE_STUB_PNF)
|
||||||
phy_config_dedicated_ue(Mod_idP, 0, eNB_index,
|
phy_config_dedicated_ue(Mod_idP, 0, eNB_index,
|
||||||
physicalConfigDedicated);
|
physicalConfigDedicated);
|
||||||
UE_mac_inst[Mod_idP].physicalConfigDedicated = physicalConfigDedicated; // for SR proc
|
|
||||||
|
UE_mac_inst[Mod_idP].physicalConfigDedicated = physicalConfigDedicated; // for SR proc
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
|
|
||||||
if (sCellToAddMod_r10 != NULL) {
|
if (sCellToAddMod_r10 != NULL) {
|
||||||
|
|
||||||
|
|
||||||
phy_config_dedicated_scell_ue(Mod_idP, eNB_index,
|
phy_config_dedicated_scell_ue(Mod_idP, eNB_index,
|
||||||
sCellToAddMod_r10, 1);
|
sCellToAddMod_r10, 1);
|
||||||
UE_mac_inst[Mod_idP].physicalConfigDedicatedSCell_r10 = sCellToAddMod_r10->radioResourceConfigDedicatedSCell_r10->physicalConfigDedicatedSCell_r10; // using SCell index 0
|
UE_mac_inst[Mod_idP].physicalConfigDedicatedSCell_r10 = sCellToAddMod_r10->radioResourceConfigDedicatedSCell_r10->physicalConfigDedicatedSCell_r10; // using SCell index 0
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (measObj != NULL) {
|
if (measObj != NULL) {
|
||||||
@@ -378,104 +363,104 @@ rrc_mac_config_req_ue(module_id_t Mod_idP,
|
|||||||
measObj[0]->measObject.present == LTE_MeasObjectToAddMod__measObject_PR_measObjectEUTRA &&
|
measObj[0]->measObject.present == LTE_MeasObjectToAddMod__measObject_PR_measObjectEUTRA &&
|
||||||
measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList != NULL) {
|
measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList != NULL) {
|
||||||
UE_mac_inst[Mod_idP].n_adj_cells =
|
UE_mac_inst[Mod_idP].n_adj_cells =
|
||||||
measObj[0]->measObject.choice.
|
measObj[0]->measObject.choice.
|
||||||
measObjectEUTRA.cellsToAddModList->list.count;
|
measObjectEUTRA.cellsToAddModList->list.count;
|
||||||
LOG_I(MAC, "Number of adjacent cells %d\n",
|
LOG_I(MAC, "Number of adjacent cells %d\n",
|
||||||
UE_mac_inst[Mod_idP].n_adj_cells);
|
UE_mac_inst[Mod_idP].n_adj_cells);
|
||||||
|
|
||||||
for (i = 0; i < UE_mac_inst[Mod_idP].n_adj_cells; i++) {
|
for (i = 0; i < UE_mac_inst[Mod_idP].n_adj_cells; i++) {
|
||||||
UE_mac_inst[Mod_idP].adj_cell_id[i] =
|
UE_mac_inst[Mod_idP].adj_cell_id[i] =
|
||||||
measObj[0]->measObject.choice.
|
measObj[0]->measObject.choice.
|
||||||
measObjectEUTRA.cellsToAddModList->list.array[i]->
|
measObjectEUTRA.cellsToAddModList->list.array[i]->
|
||||||
physCellId;
|
physCellId;
|
||||||
LOG_I(MAC, "Cell %d : Nid_cell %d\n", i,
|
LOG_I(MAC, "Cell %d : Nid_cell %d\n", i,
|
||||||
UE_mac_inst[Mod_idP].adj_cell_id[i]);
|
UE_mac_inst[Mod_idP].adj_cell_id[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
phy_config_meas_ue(Mod_idP, 0, eNB_index,
|
phy_config_meas_ue(Mod_idP, 0, eNB_index,
|
||||||
UE_mac_inst[Mod_idP].n_adj_cells,
|
UE_mac_inst[Mod_idP].n_adj_cells,
|
||||||
UE_mac_inst[Mod_idP].adj_cell_id);
|
UE_mac_inst[Mod_idP].adj_cell_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (mobilityControlInfo != NULL) {
|
if (mobilityControlInfo != NULL) {
|
||||||
|
|
||||||
LOG_D(MAC, "[UE%d] MAC Reset procedure triggered by RRC eNB %d \n",
|
LOG_D(MAC, "[UE%d] MAC Reset procedure triggered by RRC eNB %d \n",
|
||||||
Mod_idP, eNB_index);
|
Mod_idP, eNB_index);
|
||||||
ue_mac_reset(Mod_idP, eNB_index);
|
ue_mac_reset(Mod_idP, eNB_index);
|
||||||
|
|
||||||
if (mobilityControlInfo->radioResourceConfigCommon.
|
if (mobilityControlInfo->radioResourceConfigCommon.
|
||||||
rach_ConfigCommon) {
|
rach_ConfigCommon) {
|
||||||
memcpy((void *)
|
memcpy((void *)
|
||||||
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
||||||
rach_ConfigCommon,
|
rach_ConfigCommon,
|
||||||
(void *) mobilityControlInfo->
|
(void *) mobilityControlInfo->
|
||||||
radioResourceConfigCommon.rach_ConfigCommon,
|
radioResourceConfigCommon.rach_ConfigCommon,
|
||||||
sizeof(LTE_RACH_ConfigCommon_t));
|
sizeof(LTE_RACH_ConfigCommon_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy((void *) &UE_mac_inst[Mod_idP].
|
memcpy((void *) &UE_mac_inst[Mod_idP].
|
||||||
radioResourceConfigCommon->prach_Config.prach_ConfigInfo,
|
radioResourceConfigCommon->prach_Config.prach_ConfigInfo,
|
||||||
(void *) mobilityControlInfo->
|
(void *) mobilityControlInfo->
|
||||||
radioResourceConfigCommon.prach_Config.prach_ConfigInfo,
|
radioResourceConfigCommon.prach_Config.prach_ConfigInfo,
|
||||||
sizeof(LTE_PRACH_ConfigInfo_t));
|
sizeof(LTE_PRACH_ConfigInfo_t));
|
||||||
UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
||||||
prach_Config.rootSequenceIndex =
|
prach_Config.rootSequenceIndex =
|
||||||
mobilityControlInfo->radioResourceConfigCommon.
|
mobilityControlInfo->radioResourceConfigCommon.
|
||||||
prach_Config.rootSequenceIndex;
|
prach_Config.rootSequenceIndex;
|
||||||
|
|
||||||
if (mobilityControlInfo->radioResourceConfigCommon.
|
if (mobilityControlInfo->radioResourceConfigCommon.
|
||||||
pdsch_ConfigCommon) {
|
pdsch_ConfigCommon) {
|
||||||
memcpy((void *)
|
memcpy((void *)
|
||||||
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
||||||
pdsch_ConfigCommon,
|
pdsch_ConfigCommon,
|
||||||
(void *) mobilityControlInfo->
|
(void *) mobilityControlInfo->
|
||||||
radioResourceConfigCommon.pdsch_ConfigCommon,
|
radioResourceConfigCommon.pdsch_ConfigCommon,
|
||||||
sizeof(LTE_PDSCH_ConfigCommon_t));
|
sizeof(LTE_PDSCH_ConfigCommon_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
// not a pointer: mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon
|
// not a pointer: mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon
|
||||||
memcpy((void *) &UE_mac_inst[Mod_idP].
|
memcpy((void *) &UE_mac_inst[Mod_idP].
|
||||||
radioResourceConfigCommon->pusch_ConfigCommon,
|
radioResourceConfigCommon->pusch_ConfigCommon,
|
||||||
(void *) &mobilityControlInfo->
|
(void *) &mobilityControlInfo->
|
||||||
radioResourceConfigCommon.pusch_ConfigCommon,
|
radioResourceConfigCommon.pusch_ConfigCommon,
|
||||||
sizeof(LTE_PUSCH_ConfigCommon_t));
|
sizeof(LTE_PUSCH_ConfigCommon_t));
|
||||||
|
|
||||||
if (mobilityControlInfo->radioResourceConfigCommon.phich_Config) {
|
if (mobilityControlInfo->radioResourceConfigCommon.phich_Config) {
|
||||||
/* memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->phich_Config,
|
/* memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->phich_Config,
|
||||||
(void *)mobilityControlInfo->radioResourceConfigCommon.phich_Config,
|
(void *)mobilityControlInfo->radioResourceConfigCommon.phich_Config,
|
||||||
sizeof(LTE_PHICH_Config_t)); */
|
sizeof(LTE_PHICH_Config_t)); */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mobilityControlInfo->radioResourceConfigCommon.
|
if (mobilityControlInfo->radioResourceConfigCommon.
|
||||||
pucch_ConfigCommon) {
|
pucch_ConfigCommon) {
|
||||||
memcpy((void *)
|
memcpy((void *)
|
||||||
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
||||||
pucch_ConfigCommon,
|
pucch_ConfigCommon,
|
||||||
(void *) mobilityControlInfo->
|
(void *) mobilityControlInfo->
|
||||||
radioResourceConfigCommon.pucch_ConfigCommon,
|
radioResourceConfigCommon.pucch_ConfigCommon,
|
||||||
sizeof(LTE_PUCCH_ConfigCommon_t));
|
sizeof(LTE_PUCCH_ConfigCommon_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mobilityControlInfo->
|
if (mobilityControlInfo->
|
||||||
radioResourceConfigCommon.soundingRS_UL_ConfigCommon) {
|
radioResourceConfigCommon.soundingRS_UL_ConfigCommon) {
|
||||||
memcpy((void *)
|
memcpy((void *)
|
||||||
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
||||||
soundingRS_UL_ConfigCommon,
|
soundingRS_UL_ConfigCommon,
|
||||||
(void *) mobilityControlInfo->
|
(void *) mobilityControlInfo->
|
||||||
radioResourceConfigCommon.soundingRS_UL_ConfigCommon,
|
radioResourceConfigCommon.soundingRS_UL_ConfigCommon,
|
||||||
sizeof(LTE_SoundingRS_UL_ConfigCommon_t));
|
sizeof(LTE_SoundingRS_UL_ConfigCommon_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mobilityControlInfo->
|
if (mobilityControlInfo->
|
||||||
radioResourceConfigCommon.uplinkPowerControlCommon) {
|
radioResourceConfigCommon.uplinkPowerControlCommon) {
|
||||||
memcpy((void *)
|
memcpy((void *)
|
||||||
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
||||||
uplinkPowerControlCommon,
|
uplinkPowerControlCommon,
|
||||||
(void *) mobilityControlInfo->
|
(void *) mobilityControlInfo->
|
||||||
radioResourceConfigCommon.uplinkPowerControlCommon,
|
radioResourceConfigCommon.uplinkPowerControlCommon,
|
||||||
sizeof(LTE_UplinkPowerControlCommon_t));
|
sizeof(LTE_UplinkPowerControlCommon_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
//configure antennaInfoCommon somewhere here..
|
//configure antennaInfoCommon somewhere here..
|
||||||
if (mobilityControlInfo->radioResourceConfigCommon.p_Max) {
|
if (mobilityControlInfo->radioResourceConfigCommon.p_Max) {
|
||||||
//to be configured
|
//to be configured
|
||||||
@@ -483,97 +468,97 @@ rrc_mac_config_req_ue(module_id_t Mod_idP,
|
|||||||
|
|
||||||
if (mobilityControlInfo->radioResourceConfigCommon.tdd_Config) {
|
if (mobilityControlInfo->radioResourceConfigCommon.tdd_Config) {
|
||||||
UE_mac_inst[Mod_idP].tdd_Config =
|
UE_mac_inst[Mod_idP].tdd_Config =
|
||||||
mobilityControlInfo->radioResourceConfigCommon.tdd_Config;
|
mobilityControlInfo->radioResourceConfigCommon.tdd_Config;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mobilityControlInfo->
|
if (mobilityControlInfo->
|
||||||
radioResourceConfigCommon.ul_CyclicPrefixLength) {
|
radioResourceConfigCommon.ul_CyclicPrefixLength) {
|
||||||
memcpy((void *)
|
memcpy((void *)
|
||||||
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
&UE_mac_inst[Mod_idP].radioResourceConfigCommon->
|
||||||
ul_CyclicPrefixLength,
|
ul_CyclicPrefixLength,
|
||||||
(void *) mobilityControlInfo->
|
(void *) mobilityControlInfo->
|
||||||
radioResourceConfigCommon.ul_CyclicPrefixLength,
|
radioResourceConfigCommon.ul_CyclicPrefixLength,
|
||||||
sizeof(LTE_UL_CyclicPrefixLength_t));
|
sizeof(LTE_UL_CyclicPrefixLength_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
// store the previous rnti in case of failure, and set thenew rnti
|
// store the previous rnti in case of failure, and set thenew rnti
|
||||||
UE_mac_inst[Mod_idP].crnti_before_ho = UE_mac_inst[Mod_idP].crnti;
|
UE_mac_inst[Mod_idP].crnti_before_ho = UE_mac_inst[Mod_idP].crnti;
|
||||||
UE_mac_inst[Mod_idP].crnti =
|
UE_mac_inst[Mod_idP].crnti =
|
||||||
((mobilityControlInfo->
|
((mobilityControlInfo->
|
||||||
newUE_Identity.buf[0]) | (mobilityControlInfo->
|
newUE_Identity.buf[0]) | (mobilityControlInfo->
|
||||||
newUE_Identity.buf[1] << 8));
|
newUE_Identity.buf[1] << 8));
|
||||||
LOG_I(MAC, "[UE %d] Received new identity %x from %d\n", Mod_idP,
|
LOG_I(MAC, "[UE %d] Received new identity %x from %d\n", Mod_idP,
|
||||||
UE_mac_inst[Mod_idP].crnti, eNB_index);
|
UE_mac_inst[Mod_idP].crnti, eNB_index);
|
||||||
UE_mac_inst[Mod_idP].rach_ConfigDedicated =
|
UE_mac_inst[Mod_idP].rach_ConfigDedicated =
|
||||||
malloc(sizeof(*mobilityControlInfo->rach_ConfigDedicated));
|
malloc(sizeof(*mobilityControlInfo->rach_ConfigDedicated));
|
||||||
|
|
||||||
if (mobilityControlInfo->rach_ConfigDedicated) {
|
if (mobilityControlInfo->rach_ConfigDedicated) {
|
||||||
memcpy((void *) UE_mac_inst[Mod_idP].rach_ConfigDedicated,
|
memcpy((void *) UE_mac_inst[Mod_idP].rach_ConfigDedicated,
|
||||||
(void *) mobilityControlInfo->rach_ConfigDedicated,
|
(void *) mobilityControlInfo->rach_ConfigDedicated,
|
||||||
sizeof(*mobilityControlInfo->rach_ConfigDedicated));
|
sizeof(*mobilityControlInfo->rach_ConfigDedicated));
|
||||||
}
|
}
|
||||||
|
|
||||||
phy_config_afterHO_ue(Mod_idP, 0, eNB_index, mobilityControlInfo,
|
phy_config_afterHO_ue(Mod_idP, 0, eNB_index, mobilityControlInfo,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (mbsfn_SubframeConfigList != NULL) {
|
if (mbsfn_SubframeConfigList != NULL) {
|
||||||
LOG_I(MAC,
|
LOG_I(MAC,
|
||||||
"[UE %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n",
|
"[UE %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n",
|
||||||
Mod_idP, mbsfn_SubframeConfigList->list.count);
|
Mod_idP, mbsfn_SubframeConfigList->list.count);
|
||||||
UE_mac_inst[Mod_idP].num_sf_allocation_pattern =
|
UE_mac_inst[Mod_idP].num_sf_allocation_pattern =
|
||||||
mbsfn_SubframeConfigList->list.count;
|
mbsfn_SubframeConfigList->list.count;
|
||||||
|
|
||||||
for (i = 0; i < mbsfn_SubframeConfigList->list.count; i++) {
|
for (i = 0; i < mbsfn_SubframeConfigList->list.count; i++) {
|
||||||
LOG_I(MAC,
|
LOG_I(MAC,
|
||||||
"[UE %d] Configuring MBSFN_SubframeConfig %d from received SIB2 \n",
|
"[UE %d] Configuring MBSFN_SubframeConfig %d from received SIB2 \n",
|
||||||
Mod_idP, i);
|
Mod_idP, i);
|
||||||
UE_mac_inst[Mod_idP].mbsfn_SubframeConfig[i] =
|
UE_mac_inst[Mod_idP].mbsfn_SubframeConfig[i] =
|
||||||
mbsfn_SubframeConfigList->list.array[i];
|
mbsfn_SubframeConfigList->list.array[i];
|
||||||
// LOG_I("[UE %d] MBSFN_SubframeConfig[%d] pattern is %ld\n", Mod_idP,
|
// LOG_I("[UE %d] MBSFN_SubframeConfig[%d] pattern is %ld\n", Mod_idP,
|
||||||
// UE_mac_inst[Mod_idP].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]);
|
// UE_mac_inst[Mod_idP].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
|
|
||||||
if (mbsfn_AreaInfoList != NULL) {
|
if (mbsfn_AreaInfoList != NULL) {
|
||||||
LOG_I(MAC, "[UE %d][CONFIG] Received %d MBSFN Area Info\n",
|
LOG_I(MAC, "[UE %d][CONFIG] Received %d MBSFN Area Info\n",
|
||||||
Mod_idP, mbsfn_AreaInfoList->list.count);
|
Mod_idP, mbsfn_AreaInfoList->list.count);
|
||||||
UE_mac_inst[Mod_idP].num_active_mbsfn_area =
|
UE_mac_inst[Mod_idP].num_active_mbsfn_area =
|
||||||
mbsfn_AreaInfoList->list.count;
|
mbsfn_AreaInfoList->list.count;
|
||||||
|
|
||||||
for (i = 0; i < mbsfn_AreaInfoList->list.count; i++) {
|
for (i = 0; i < mbsfn_AreaInfoList->list.count; i++) {
|
||||||
UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i] =
|
UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i] =
|
||||||
mbsfn_AreaInfoList->list.array[i];
|
mbsfn_AreaInfoList->list.array[i];
|
||||||
LOG_I(MAC,
|
LOG_I(MAC,
|
||||||
"[UE %d] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n",
|
"[UE %d] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n",
|
||||||
Mod_idP, i,
|
Mod_idP, i,
|
||||||
UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i]->
|
UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i]->
|
||||||
mcch_Config_r9.mcch_RepetitionPeriod_r9);
|
mcch_Config_r9.mcch_RepetitionPeriod_r9);
|
||||||
phy_config_sib13_ue(Mod_idP, 0, eNB_index, i,
|
phy_config_sib13_ue(Mod_idP, 0, eNB_index, i,
|
||||||
UE_mac_inst[Mod_idP].
|
UE_mac_inst[Mod_idP].
|
||||||
mbsfn_AreaInfo[i]->mbsfn_AreaId_r9);
|
mbsfn_AreaInfo[i]->mbsfn_AreaId_r9);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pmch_InfoList != NULL) {
|
if (pmch_InfoList != NULL) {
|
||||||
|
|
||||||
// LOG_I(MAC,"DUY: lcid when entering rrc_mac config_req is %02d\n",(pmch_InfoList->list.array[0]->mbms_SessionInfoList_r9.list.array[0]->logicalChannelIdentity_r9));
|
// LOG_I(MAC,"DUY: lcid when entering rrc_mac config_req is %02d\n",(pmch_InfoList->list.array[0]->mbms_SessionInfoList_r9.list.array[0]->logicalChannelIdentity_r9));
|
||||||
|
|
||||||
LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n",
|
LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n",
|
||||||
Mod_idP);
|
Mod_idP);
|
||||||
|
|
||||||
for (i = 0; i < pmch_InfoList->list.count; i++) {
|
for (i = 0; i < pmch_InfoList->list.count; i++) {
|
||||||
UE_mac_inst[Mod_idP].pmch_Config[i] =
|
UE_mac_inst[Mod_idP].pmch_Config[i] =
|
||||||
&pmch_InfoList->list.array[i]->pmch_Config_r9;
|
&pmch_InfoList->list.array[i]->pmch_Config_r9;
|
||||||
LOG_I(MAC, "[UE %d] PMCH[%d]: MCH_Scheduling_Period = %ld\n",
|
LOG_I(MAC, "[UE %d] PMCH[%d]: MCH_Scheduling_Period = %ld\n",
|
||||||
Mod_idP, i,
|
Mod_idP, i,
|
||||||
UE_mac_inst[Mod_idP].
|
UE_mac_inst[Mod_idP].
|
||||||
pmch_Config[i]->mch_SchedulingPeriod_r9);
|
pmch_Config[i]->mch_SchedulingPeriod_r9);
|
||||||
}
|
}
|
||||||
|
|
||||||
UE_mac_inst[Mod_idP].mcch_status = 1;
|
UE_mac_inst[Mod_idP].mcch_status = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef CBA
|
#ifdef CBA
|
||||||
|
|
||||||
@@ -581,44 +566,53 @@ rrc_mac_config_req_ue(module_id_t Mod_idP,
|
|||||||
UE_mac_inst[Mod_idP].cba_rnti[num_active_cba_groups - 1] =
|
UE_mac_inst[Mod_idP].cba_rnti[num_active_cba_groups - 1] =
|
||||||
cba_rnti;
|
cba_rnti;
|
||||||
LOG_D(MAC,
|
LOG_D(MAC,
|
||||||
"[UE %d] configure CBA group %d RNTI %x for eNB %d (total active cba group %d)\n",
|
"[UE %d] configure CBA group %d RNTI %x for eNB %d (total active cba group %d)\n",
|
||||||
Mod_idP, Mod_idP % num_active_cba_groups, cba_rnti,
|
Mod_idP, Mod_idP % num_active_cba_groups, cba_rnti,
|
||||||
eNB_index, num_active_cba_groups);
|
eNB_index, num_active_cba_groups);
|
||||||
phy_config_cba_rnti(Mod_idP, CC_idP, eNB_flagP, eNB_index,
|
phy_config_cba_rnti(Mod_idP, CC_idP, eNB_flagP, eNB_index,
|
||||||
cba_rnti, num_active_cba_groups - 1,
|
cba_rnti, num_active_cba_groups - 1,
|
||||||
num_active_cba_groups);
|
num_active_cba_groups);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
|
||||||
(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT);
|
(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT);
|
||||||
//for D2D
|
//for D2D
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
switch (config_action) {
|
|
||||||
|
switch (config_action) {
|
||||||
case CONFIG_ACTION_ADD:
|
case CONFIG_ACTION_ADD:
|
||||||
if (sourceL2Id){
|
if (sourceL2Id) {
|
||||||
UE_mac_inst[Mod_idP].sourceL2Id = *sourceL2Id;
|
UE_mac_inst[Mod_idP].sourceL2Id = *sourceL2Id;
|
||||||
LOG_I(MAC,"[UE %d] Configure source L2Id 0x%08x \n", Mod_idP, *sourceL2Id );
|
LOG_I(MAC,"[UE %d] Configure source L2Id 0x%08x \n", Mod_idP, *sourceL2Id );
|
||||||
}
|
}
|
||||||
if (destinationL2Id) {
|
|
||||||
LOG_I(MAC,"[UE %d] Configure destination L2Id 0x%08x\n", Mod_idP, *destinationL2Id );
|
if (destinationL2Id) {
|
||||||
int j = 0;
|
LOG_I(MAC,"[UE %d] Configure destination L2Id 0x%08x\n", Mod_idP, *destinationL2Id );
|
||||||
int i = 0;
|
int j = 0;
|
||||||
for (i=0; i< MAX_NUM_DEST; i++) {
|
int i = 0;
|
||||||
if ((UE_mac_inst[Mod_idP].destinationList[i] == 0) && (j == 0)) j = i+1;
|
|
||||||
if (UE_mac_inst[Mod_idP].destinationList[i] == *destinationL2Id) break; //destination already exists!
|
for (i=0; i< MAX_NUM_DEST; i++) {
|
||||||
}
|
if ((UE_mac_inst[Mod_idP].destinationList[i] == 0) && (j == 0)) j = i+1;
|
||||||
if ((i == MAX_NUM_DEST) && (j > 0)) UE_mac_inst[Mod_idP].destinationList[j-1] = *destinationL2Id;
|
|
||||||
UE_mac_inst[Mod_idP].numCommFlows++;
|
if (UE_mac_inst[Mod_idP].destinationList[i] == *destinationL2Id) break; //destination already exists!
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
if ((i == MAX_NUM_DEST) && (j > 0)) UE_mac_inst[Mod_idP].destinationList[j-1] = *destinationL2Id;
|
||||||
|
|
||||||
|
UE_mac_inst[Mod_idP].numCommFlows++;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
case CONFIG_ACTION_REMOVE:
|
case CONFIG_ACTION_REMOVE:
|
||||||
//TODO
|
//TODO
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
#endif
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -676,6 +676,9 @@ typedef struct {
|
|||||||
/// Number of Allocated RBs for UL after scheduling
|
/// Number of Allocated RBs for UL after scheduling
|
||||||
uint16_t first_rb_ul[8]; // num_max_harq
|
uint16_t first_rb_ul[8]; // num_max_harq
|
||||||
|
|
||||||
|
/// Is CQI requested for UL after scheduling 1st transmission
|
||||||
|
uint8_t cqi_req[8]; // num_max_harq
|
||||||
|
|
||||||
/// Cyclic shift for DMRS after scheduling
|
/// Cyclic shift for DMRS after scheduling
|
||||||
uint16_t cshift[8]; // num_max_harq
|
uint16_t cshift[8]; // num_max_harq
|
||||||
|
|
||||||
|
|||||||
+310
-325
@@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
#include "LAYER2/MAC/mac_proto.h"
|
#include "LAYER2/MAC/mac_proto.h"
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||||
#include "UTIL/OPT/opt.h"
|
#include "UTIL/OPT/opt.h"
|
||||||
#include "OCG.h"
|
#include "OCG.h"
|
||||||
@@ -55,7 +56,7 @@
|
|||||||
#include "eNB_scheduler_fairRR.h"
|
#include "eNB_scheduler_fairRR.h"
|
||||||
|
|
||||||
#if defined(ENABLE_ITTI)
|
#if defined(ENABLE_ITTI)
|
||||||
#include "intertask_interface.h"
|
#include "intertask_interface.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
@@ -70,10 +71,7 @@ uint16_t pdcch_order_table[6] = { 31, 31, 511, 2047, 2047, 8191 };
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
schedule_SRS(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
|
schedule_SRS(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) {
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
eNB_MAC_INST *eNB = RC.mac[module_idP];
|
eNB_MAC_INST *eNB = RC.mac[module_idP];
|
||||||
UE_list_t *UE_list = &eNB->UE_list;
|
UE_list_t *UE_list = &eNB->UE_list;
|
||||||
nfapi_ul_config_request_body_t *ul_req;
|
nfapi_ul_config_request_body_t *ul_req;
|
||||||
@@ -82,82 +80,84 @@ schedule_SRS(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
|
|||||||
LTE_SoundingRS_UL_ConfigCommon_t *soundingRS_UL_ConfigCommon;
|
LTE_SoundingRS_UL_ConfigCommon_t *soundingRS_UL_ConfigCommon;
|
||||||
struct LTE_SoundingRS_UL_ConfigDedicated *soundingRS_UL_ConfigDedicated;
|
struct LTE_SoundingRS_UL_ConfigDedicated *soundingRS_UL_ConfigDedicated;
|
||||||
uint8_t TSFC;
|
uint8_t TSFC;
|
||||||
uint16_t deltaTSFC; // bitmap
|
uint16_t deltaTSFC; // bitmap
|
||||||
uint8_t srs_SubframeConfig;
|
uint8_t srs_SubframeConfig;
|
||||||
|
|
||||||
// table for TSFC (Period) and deltaSFC (offset)
|
// table for TSFC (Period) and deltaSFC (offset)
|
||||||
const uint16_t deltaTSFCTabType1[15][2] = { {1, 1}, {1, 2}, {2, 2}, {1, 5}, {2, 5}, {4, 5}, {8, 5}, {3, 5}, {12, 5}, {1, 10}, {2, 10}, {4, 10}, {8, 10}, {351, 10}, {383, 10} }; // Table 5.5.3.3-2 3GPP 36.211 FDD
|
const uint16_t deltaTSFCTabType1[15][2] = { {1, 1}, {1, 2}, {2, 2}, {1, 5}, {2, 5}, {4, 5}, {8, 5}, {3, 5}, {12, 5}, {1, 10}, {2, 10}, {4, 10}, {8, 10}, {351, 10}, {383, 10} }; // Table 5.5.3.3-2 3GPP 36.211 FDD
|
||||||
const uint16_t deltaTSFCTabType2[14][2] = { {2, 5}, {6, 5}, {10, 5}, {18, 5}, {14, 5}, {22, 5}, {26, 5}, {30, 5}, {70, 10}, {74, 10}, {194, 10}, {326, 10}, {586, 10}, {210, 10} }; // Table 5.5.3.3-2 3GPP 36.211 TDD
|
const uint16_t deltaTSFCTabType2[14][2] = { {2, 5}, {6, 5}, {10, 5}, {18, 5}, {14, 5}, {22, 5}, {26, 5}, {30, 5}, {70, 10}, {74, 10}, {194, 10}, {326, 10}, {586, 10}, {210, 10} }; // Table 5.5.3.3-2 3GPP 36.211 TDD
|
||||||
|
|
||||||
uint16_t srsPeriodicity, srsOffset;
|
uint16_t srsPeriodicity, srsOffset;
|
||||||
|
|
||||||
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||||
soundingRS_UL_ConfigCommon = &cc[CC_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon;
|
soundingRS_UL_ConfigCommon = &cc[CC_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon;
|
||||||
|
|
||||||
// check if SRS is enabled in this frame/subframe
|
// check if SRS is enabled in this frame/subframe
|
||||||
if (soundingRS_UL_ConfigCommon) {
|
if (soundingRS_UL_ConfigCommon) {
|
||||||
srs_SubframeConfig = soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig;
|
srs_SubframeConfig = soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig;
|
||||||
if (cc[CC_id].tdd_Config == NULL) { // FDD
|
|
||||||
deltaTSFC = deltaTSFCTabType1[srs_SubframeConfig][0];
|
if (cc[CC_id].tdd_Config == NULL) { // FDD
|
||||||
TSFC = deltaTSFCTabType1[srs_SubframeConfig][1];
|
deltaTSFC = deltaTSFCTabType1[srs_SubframeConfig][0];
|
||||||
} else { // TDD
|
TSFC = deltaTSFCTabType1[srs_SubframeConfig][1];
|
||||||
deltaTSFC = deltaTSFCTabType2[srs_SubframeConfig][0];
|
} else { // TDD
|
||||||
TSFC = deltaTSFCTabType2[srs_SubframeConfig][1];
|
deltaTSFC = deltaTSFCTabType2[srs_SubframeConfig][0];
|
||||||
|
TSFC = deltaTSFCTabType2[srs_SubframeConfig][1];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sounding reference signal subframes are the subframes satisfying ns/2 mod TSFC (- deltaTSFC
|
// Sounding reference signal subframes are the subframes satisfying ns/2 mod TSFC (- deltaTSFC
|
||||||
uint16_t tmp = (subframeP % TSFC);
|
uint16_t tmp = (subframeP % TSFC);
|
||||||
|
|
||||||
if ((1 << tmp) & deltaTSFC) {
|
|
||||||
// This is an SRS subframe, loop over UEs
|
|
||||||
for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) {
|
|
||||||
if (!RC.mac[module_idP]->UE_list.active[UE_id]) continue;
|
|
||||||
ul_req = &RC.mac[module_idP]->UL_req[CC_id].ul_config_request_body;
|
|
||||||
// drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet
|
|
||||||
if (mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) continue;
|
|
||||||
|
|
||||||
AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL,
|
|
||||||
"physicalConfigDedicated is null for UE %d\n",
|
|
||||||
UE_id);
|
|
||||||
|
|
||||||
if ((soundingRS_UL_ConfigDedicated = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated) != NULL) {
|
|
||||||
if (soundingRS_UL_ConfigDedicated->present == LTE_SoundingRS_UL_ConfigDedicated_PR_setup) {
|
|
||||||
get_srs_pos(&cc[CC_id],
|
|
||||||
soundingRS_UL_ConfigDedicated->choice.
|
|
||||||
setup.srs_ConfigIndex,
|
|
||||||
&srsPeriodicity, &srsOffset);
|
|
||||||
|
|
||||||
if (((10 * frameP + subframeP) % srsPeriodicity) == srsOffset) {
|
if ((1 << tmp) & deltaTSFC) {
|
||||||
// Program SRS
|
// This is an SRS subframe, loop over UEs
|
||||||
ul_req->srs_present = 1;
|
for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) {
|
||||||
nfapi_ul_config_request_pdu_t * ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus];
|
if (!RC.mac[module_idP]->UE_list.active[UE_id]) continue;
|
||||||
memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t));
|
|
||||||
ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_SRS_PDU_TYPE;
|
ul_req = &RC.mac[module_idP]->UL_req[CC_id].ul_config_request_body;
|
||||||
ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_srs_pdu));
|
|
||||||
ul_config_pdu->srs_pdu.srs_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG;
|
// drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet
|
||||||
ul_config_pdu->srs_pdu.srs_pdu_rel8.size = (uint8_t)sizeof(nfapi_ul_config_srs_pdu);
|
if (mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) continue;
|
||||||
ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti;
|
|
||||||
ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth;
|
AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL,
|
||||||
ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position = soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition;
|
"physicalConfigDedicated is null for UE %d\n",
|
||||||
ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;;
|
UE_id);
|
||||||
ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb = soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb;
|
|
||||||
ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs = soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex;
|
if ((soundingRS_UL_ConfigDedicated = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated) != NULL) {
|
||||||
ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift = soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift; // ul_config_pdu->srs_pdu.srs_pdu_rel10.antenna_port = ;//
|
if (soundingRS_UL_ConfigDedicated->present == LTE_SoundingRS_UL_ConfigDedicated_PR_setup) {
|
||||||
// ul_config_pdu->srs_pdu.srs_pdu_rel13.number_of_combs = ;//
|
get_srs_pos(&cc[CC_id],
|
||||||
RC.mac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP;
|
soundingRS_UL_ConfigDedicated->choice.
|
||||||
RC.mac[module_idP]->UL_req[CC_id].header.message_id = NFAPI_UL_CONFIG_REQUEST;
|
setup.srs_ConfigIndex,
|
||||||
ul_req->number_of_pdus++;
|
&srsPeriodicity, &srsOffset);
|
||||||
} // if (((10*frameP+subframeP) % srsPeriodicity) == srsOffset)
|
|
||||||
} // if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup)
|
if (((10 * frameP + subframeP) % srsPeriodicity) == srsOffset) {
|
||||||
} // if ((soundingRS_UL_ConfigDedicated = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated)!=NULL)
|
// Program SRS
|
||||||
} // for (UE_id ...
|
ul_req->srs_present = 1;
|
||||||
} // if((1<<tmp) & deltaTSFC)
|
nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus];
|
||||||
|
memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t));
|
||||||
} // SRS config
|
ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_SRS_PDU_TYPE;
|
||||||
|
ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_srs_pdu));
|
||||||
|
ul_config_pdu->srs_pdu.srs_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG;
|
||||||
|
ul_config_pdu->srs_pdu.srs_pdu_rel8.size = (uint8_t)sizeof(nfapi_ul_config_srs_pdu);
|
||||||
|
ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti;
|
||||||
|
ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth;
|
||||||
|
ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position = soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition;
|
||||||
|
ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;;
|
||||||
|
ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb = soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb;
|
||||||
|
ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs = soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex;
|
||||||
|
ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift =
|
||||||
|
soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift; // ul_config_pdu->srs_pdu.srs_pdu_rel10.antenna_port = ;//
|
||||||
|
// ul_config_pdu->srs_pdu.srs_pdu_rel13.number_of_combs = ;//
|
||||||
|
RC.mac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP;
|
||||||
|
RC.mac[module_idP]->UL_req[CC_id].header.message_id = NFAPI_UL_CONFIG_REQUEST;
|
||||||
|
ul_req->number_of_pdus++;
|
||||||
|
} // if (((10*frameP+subframeP) % srsPeriodicity) == srsOffset)
|
||||||
|
} // if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup)
|
||||||
|
} // if ((soundingRS_UL_ConfigDedicated = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated)!=NULL)
|
||||||
|
} // for (UE_id ...
|
||||||
|
} // if((1<<tmp) & deltaTSFC)
|
||||||
|
} // SRS config
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
schedule_CSI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
|
schedule_CSI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) {
|
||||||
{
|
|
||||||
eNB_MAC_INST *eNB = RC.mac[module_idP];
|
eNB_MAC_INST *eNB = RC.mac[module_idP];
|
||||||
UE_list_t *UE_list = &eNB->UE_list;
|
UE_list_t *UE_list = &eNB->UE_list;
|
||||||
COMMON_channels_t *cc;
|
COMMON_channels_t *cc;
|
||||||
@@ -168,8 +168,8 @@ schedule_CSI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
|
|||||||
int H;
|
int H;
|
||||||
|
|
||||||
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||||
|
|
||||||
cc = &eNB->common_channels[CC_id];
|
cc = &eNB->common_channels[CC_id];
|
||||||
|
|
||||||
for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) {
|
for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) {
|
||||||
if (!UE_list->active[UE_id]) continue;
|
if (!UE_list->active[UE_id]) continue;
|
||||||
|
|
||||||
@@ -179,67 +179,64 @@ schedule_CSI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
|
|||||||
if (mac_eNB_get_rrc_status(module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) continue;
|
if (mac_eNB_get_rrc_status(module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) continue;
|
||||||
|
|
||||||
AssertFatal(UE_list->
|
AssertFatal(UE_list->
|
||||||
UE_template[CC_id][UE_id].physicalConfigDedicated
|
UE_template[CC_id][UE_id].physicalConfigDedicated
|
||||||
!= NULL,
|
!= NULL,
|
||||||
"physicalConfigDedicated is null for UE %d\n",
|
"physicalConfigDedicated is null for UE %d\n",
|
||||||
UE_id);
|
UE_id);
|
||||||
|
|
||||||
if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig) {
|
if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig) {
|
||||||
if ((cqi_ReportPeriodic = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) != NULL
|
if ((cqi_ReportPeriodic = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) != NULL
|
||||||
&& (cqi_ReportPeriodic->present != LTE_CQI_ReportPeriodic_PR_release)) {
|
&& (cqi_ReportPeriodic->present != LTE_CQI_ReportPeriodic_PR_release)) {
|
||||||
//Rel8 Periodic CQI/PMI/RI reporting
|
//Rel8 Periodic CQI/PMI/RI reporting
|
||||||
|
get_csi_params(cc, cqi_ReportPeriodic, &Npd,
|
||||||
get_csi_params(cc, cqi_ReportPeriodic, &Npd,
|
&N_OFFSET_CQI, &H);
|
||||||
&N_OFFSET_CQI, &H);
|
|
||||||
|
|
||||||
if ((((frameP * 10) + subframeP) % Npd) == N_OFFSET_CQI) { // CQI opportunity
|
|
||||||
UE_list->UE_sched_ctrl[UE_id].feedback_cnt[CC_id] = (((frameP * 10) + subframeP) / Npd) % H;
|
|
||||||
// Program CQI
|
|
||||||
nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus];
|
|
||||||
memset((void *) ul_config_pdu, 0,
|
|
||||||
sizeof(nfapi_ul_config_request_pdu_t));
|
|
||||||
ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE;
|
|
||||||
ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_uci_cqi_pdu));
|
|
||||||
ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG;
|
|
||||||
ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti;
|
|
||||||
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG;
|
|
||||||
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.pucch_index = cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
|
|
||||||
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.dl_cqi_pmi_size = get_rel8_dl_cqi_pmi_size(&UE_list->UE_sched_ctrl[UE_id], CC_id, cc,
|
|
||||||
get_tmode(module_idP, CC_id, UE_id),
|
|
||||||
cqi_ReportPeriodic);
|
|
||||||
ul_req->number_of_pdus++;
|
|
||||||
ul_req->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
|
|
||||||
|
|
||||||
|
if ((((frameP * 10) + subframeP) % Npd) == N_OFFSET_CQI) { // CQI opportunity
|
||||||
|
UE_list->UE_sched_ctrl[UE_id].feedback_cnt[CC_id] = (((frameP * 10) + subframeP) / Npd) % H;
|
||||||
|
// Program CQI
|
||||||
|
nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus];
|
||||||
|
memset((void *) ul_config_pdu, 0,
|
||||||
|
sizeof(nfapi_ul_config_request_pdu_t));
|
||||||
|
ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE;
|
||||||
|
ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_uci_cqi_pdu));
|
||||||
|
ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG;
|
||||||
|
ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti;
|
||||||
|
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG;
|
||||||
|
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.pucch_index = cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
|
||||||
|
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.dl_cqi_pmi_size = get_rel8_dl_cqi_pmi_size(&UE_list->UE_sched_ctrl[UE_id], CC_id, cc,
|
||||||
|
get_tmode(module_idP, CC_id, UE_id),
|
||||||
|
cqi_ReportPeriodic);
|
||||||
|
ul_req->number_of_pdus++;
|
||||||
|
ul_req->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
// PUT rel10-13 UCI options here
|
// PUT rel10-13 UCI options here
|
||||||
#endif
|
#endif
|
||||||
} else
|
} else if ((cqi_ReportPeriodic->choice.setup.ri_ConfigIndex)
|
||||||
if ((cqi_ReportPeriodic->choice.setup.ri_ConfigIndex)
|
&& ((((frameP * 10) + subframeP) % ((H * Npd) << (*cqi_ReportPeriodic->choice.setup.ri_ConfigIndex / 161))) == N_OFFSET_CQI + (*cqi_ReportPeriodic->choice.setup.ri_ConfigIndex %
|
||||||
&& ((((frameP * 10) + subframeP) % ((H * Npd) << (*cqi_ReportPeriodic->choice.setup.ri_ConfigIndex / 161))) == N_OFFSET_CQI + (*cqi_ReportPeriodic->choice.setup.ri_ConfigIndex % 161))) { // RI opportunity
|
161))) { // RI opportunity
|
||||||
// Program RI
|
// Program RI
|
||||||
nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus];
|
nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus];
|
||||||
memset((void *) ul_config_pdu, 0,
|
memset((void *) ul_config_pdu, 0,
|
||||||
sizeof(nfapi_ul_config_request_pdu_t));
|
sizeof(nfapi_ul_config_request_pdu_t));
|
||||||
ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE;
|
ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE;
|
||||||
ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_uci_cqi_pdu));
|
ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_uci_cqi_pdu));
|
||||||
ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG;
|
ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG;
|
||||||
ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti;
|
ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti;
|
||||||
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG;
|
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG;
|
||||||
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.pucch_index = cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
|
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.pucch_index = cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
|
||||||
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.dl_cqi_pmi_size = (cc->p_eNB == 2) ? 1 : 2;
|
ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.dl_cqi_pmi_size = (cc->p_eNB == 2) ? 1 : 2;
|
||||||
RC.mac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP;
|
RC.mac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP;
|
||||||
ul_req->number_of_pdus++;
|
ul_req->number_of_pdus++;
|
||||||
ul_req->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
|
ul_req->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
|
||||||
}
|
}
|
||||||
} // if ((cqi_ReportPeriodic = cqi_ReportConfig->cqi_ReportPeriodic)!=NULL) {
|
} // if ((cqi_ReportPeriodic = cqi_ReportConfig->cqi_ReportPeriodic)!=NULL) {
|
||||||
} // if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig)
|
} // if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig)
|
||||||
} // for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
|
} // for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
|
||||||
} // for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
} // for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
schedule_SR(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
|
schedule_SR(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) {
|
||||||
{
|
|
||||||
eNB_MAC_INST *eNB = RC.mac[module_idP];
|
eNB_MAC_INST *eNB = RC.mac[module_idP];
|
||||||
UE_list_t *UE_list = &eNB->UE_list;
|
UE_list_t *UE_list = &eNB->UE_list;
|
||||||
nfapi_ul_config_request_t *ul_req;
|
nfapi_ul_config_request_t *ul_req;
|
||||||
@@ -267,91 +264,89 @@ schedule_SR(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
|
|||||||
if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated== NULL) continue;
|
if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated== NULL) continue;
|
||||||
|
|
||||||
if ((SRconfig = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig) != NULL) {
|
if ((SRconfig = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig) != NULL) {
|
||||||
if (SRconfig->present == LTE_SchedulingRequestConfig_PR_setup) {
|
if (SRconfig->present == LTE_SchedulingRequestConfig_PR_setup) {
|
||||||
if (SRconfig->choice.setup.sr_ConfigIndex <= 4) { // 5 ms SR period
|
if (SRconfig->choice.setup.sr_ConfigIndex <= 4) { // 5 ms SR period
|
||||||
if ((subframeP % 5) != SRconfig->choice.setup.sr_ConfigIndex) continue;
|
if ((subframeP % 5) != SRconfig->choice.setup.sr_ConfigIndex) continue;
|
||||||
} else if (SRconfig->choice.setup.sr_ConfigIndex <= 14) { // 10 ms SR period
|
} else if (SRconfig->choice.setup.sr_ConfigIndex <= 14) { // 10 ms SR period
|
||||||
if (subframeP != (SRconfig->choice.setup.sr_ConfigIndex - 5)) continue;
|
if (subframeP != (SRconfig->choice.setup.sr_ConfigIndex - 5)) continue;
|
||||||
} else if (SRconfig->choice.setup.sr_ConfigIndex <= 34) { // 20 ms SR period
|
} else if (SRconfig->choice.setup.sr_ConfigIndex <= 34) { // 20 ms SR period
|
||||||
if ((10 * (frameP & 1) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 15)) continue;
|
if ((10 * (frameP & 1) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 15)) continue;
|
||||||
} else if (SRconfig->choice.setup.sr_ConfigIndex <= 74) { // 40 ms SR period
|
} else if (SRconfig->choice.setup.sr_ConfigIndex <= 74) { // 40 ms SR period
|
||||||
if ((10 * (frameP & 3) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 35)) continue;
|
if ((10 * (frameP & 3) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 35)) continue;
|
||||||
} else if (SRconfig->choice.setup.sr_ConfigIndex <= 154) { // 80 ms SR period
|
} else if (SRconfig->choice.setup.sr_ConfigIndex <= 154) { // 80 ms SR period
|
||||||
if ((10 * (frameP & 7) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 75)) continue;
|
if ((10 * (frameP & 7) + subframeP) != (SRconfig->choice.setup.sr_ConfigIndex - 75)) continue;
|
||||||
}
|
}
|
||||||
} // SRconfig->present == SchedulingRequestConfig_PR_setup)
|
} // SRconfig->present == SchedulingRequestConfig_PR_setup)
|
||||||
} // SRconfig = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig)!=NULL)
|
} // SRconfig = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig)!=NULL)
|
||||||
|
|
||||||
// if we get here there is some PUCCH1 reception to schedule for SR
|
// if we get here there is some PUCCH1 reception to schedule for SR
|
||||||
|
|
||||||
skip_ue = 0;
|
skip_ue = 0;
|
||||||
is_harq = 0;
|
is_harq = 0;
|
||||||
|
|
||||||
// check that there is no existing UL grant for ULSCH which overrides the SR
|
// check that there is no existing UL grant for ULSCH which overrides the SR
|
||||||
for (i = 0; i < ul_req_body->number_of_pdus; i++) {
|
for (i = 0; i < ul_req_body->number_of_pdus; i++) {
|
||||||
if (((ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) ||
|
if (((ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) ||
|
||||||
(ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) ||
|
(ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) ||
|
||||||
(ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) ||
|
(ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) ||
|
||||||
(ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE)) &&
|
(ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE)) &&
|
||||||
(ul_req_body->ul_config_pdu_list[i].ulsch_pdu.ulsch_pdu_rel8.rnti == UE_list->UE_template[CC_id][UE_id].rnti)) {
|
(ul_req_body->ul_config_pdu_list[i].ulsch_pdu.ulsch_pdu_rel8.rnti == UE_list->UE_template[CC_id][UE_id].rnti)) {
|
||||||
skip_ue = 1;
|
skip_ue = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* if there is already an HARQ pdu, convert to SR_HARQ */
|
/* if there is already an HARQ pdu, convert to SR_HARQ */
|
||||||
else if ((ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) &&
|
else if ((ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) &&
|
||||||
(ul_req_body->ul_config_pdu_list[i].uci_harq_pdu.ue_information.ue_information_rel8.rnti == UE_list->UE_template[CC_id][UE_id].rnti)) {
|
(ul_req_body->ul_config_pdu_list[i].uci_harq_pdu.ue_information.ue_information_rel8.rnti == UE_list->UE_template[CC_id][UE_id].rnti)) {
|
||||||
is_harq = 1;
|
is_harq = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// drop the allocation because ULSCH with handle it with BSR
|
// drop the allocation because ULSCH with handle it with BSR
|
||||||
if (skip_ue == 1) continue;
|
if (skip_ue == 1) continue;
|
||||||
|
|
||||||
LOG_D(MAC,"Frame %d, Subframe %d : Scheduling SR for UE %d/%x is_harq:%d\n",frameP,subframeP,UE_id,UE_list->UE_template[CC_id][UE_id].rnti, is_harq);
|
LOG_D(MAC,"Frame %d, Subframe %d : Scheduling SR for UE %d/%x is_harq:%d\n",frameP,subframeP,UE_id,UE_list->UE_template[CC_id][UE_id].rnti, is_harq);
|
||||||
|
|
||||||
// check Rel10 or Rel8 SR
|
// check Rel10 or Rel8 SR
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
|
|
||||||
if ((UE_list-> UE_template[CC_id][UE_id].physicalConfigDedicated->ext2)
|
if ((UE_list-> UE_template[CC_id][UE_id].physicalConfigDedicated->ext2)
|
||||||
&& (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020)
|
&& (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020)
|
||||||
&& (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020)) {
|
&& (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020)) {
|
||||||
sr.sr_information_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG;
|
sr.sr_information_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG;
|
||||||
sr.sr_information_rel10.number_of_pucch_resources = 1;
|
sr.sr_information_rel10.number_of_pucch_resources = 1;
|
||||||
sr.sr_information_rel10.pucch_index_p1 = *UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020->sr_PUCCH_ResourceIndexP1_r10;
|
sr.sr_information_rel10.pucch_index_p1 = *UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->ext2->schedulingRequestConfig_v1020->sr_PUCCH_ResourceIndexP1_r10;
|
||||||
LOG_D(MAC,"REL10 PUCCH INDEX P1:%d\n", sr.sr_information_rel10.pucch_index_p1);
|
LOG_D(MAC,"REL10 PUCCH INDEX P1:%d\n", sr.sr_information_rel10.pucch_index_p1);
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
sr.sr_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG;
|
sr.sr_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG;
|
||||||
sr.sr_information_rel8.pucch_index = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex;
|
sr.sr_information_rel8.pucch_index = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex;
|
||||||
LOG_D(MAC,"REL8 PUCCH INDEX:%d\n", sr.sr_information_rel8.pucch_index);
|
LOG_D(MAC,"REL8 PUCCH INDEX:%d\n", sr.sr_information_rel8.pucch_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if there is already an HARQ pdu, convert to SR_HARQ */
|
/* if there is already an HARQ pdu, convert to SR_HARQ */
|
||||||
if (is_harq) {
|
if (is_harq) {
|
||||||
nfapi_ul_config_harq_information h = ul_req_body->ul_config_pdu_list[i].uci_harq_pdu.harq_information;
|
nfapi_ul_config_harq_information h = ul_req_body->ul_config_pdu_list[i].uci_harq_pdu.harq_information;
|
||||||
ul_req_body->ul_config_pdu_list[i].pdu_type = NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE;
|
ul_req_body->ul_config_pdu_list[i].pdu_type = NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE;
|
||||||
ul_req_body->ul_config_pdu_list[i].uci_sr_harq_pdu.sr_information = sr;
|
ul_req_body->ul_config_pdu_list[i].uci_sr_harq_pdu.sr_information = sr;
|
||||||
ul_req_body->ul_config_pdu_list[i].uci_sr_harq_pdu.harq_information = h;
|
ul_req_body->ul_config_pdu_list[i].uci_sr_harq_pdu.harq_information = h;
|
||||||
} else {
|
} else {
|
||||||
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].pdu_type = NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE;
|
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].pdu_type = NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE;
|
||||||
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG;
|
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG;
|
||||||
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti;
|
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti;
|
||||||
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel11.tl.tag = 0;
|
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel11.tl.tag = 0;
|
||||||
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel13.tl.tag = 0;
|
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel13.tl.tag = 0;
|
||||||
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.sr_information = sr;
|
ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.sr_information = sr;
|
||||||
ul_req_body->number_of_pdus++;
|
ul_req_body->number_of_pdus++;
|
||||||
} /* if (is_harq) */
|
} /* if (is_harq) */
|
||||||
ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
|
|
||||||
} // for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id])
|
|
||||||
} // for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++)
|
|
||||||
}
|
|
||||||
|
|
||||||
extern uint8_t nfapi_mode;
|
ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
|
||||||
|
} // for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id])
|
||||||
|
} // for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++)
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
check_ul_failure(module_id_t module_idP, int CC_id, int UE_id,
|
check_ul_failure(module_id_t module_idP, int CC_id, int UE_id,
|
||||||
frame_t frameP, sub_frame_t subframeP)
|
frame_t frameP, sub_frame_t subframeP) {
|
||||||
{
|
|
||||||
UE_list_t *UE_list = &RC.mac[module_idP]->UE_list;
|
UE_list_t *UE_list = &RC.mac[module_idP]->UE_list;
|
||||||
nfapi_dl_config_request_t *DL_req = &RC.mac[module_idP]->DL_req[0];
|
nfapi_dl_config_request_t *DL_req = &RC.mac[module_idP]->DL_req[0];
|
||||||
uint16_t rnti = UE_RNTI(module_idP, UE_id);
|
uint16_t rnti = UE_RNTI(module_idP, UE_id);
|
||||||
@@ -363,9 +358,9 @@ check_ul_failure(module_id_t module_idP, int CC_id, int UE_id,
|
|||||||
if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 1)
|
if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 1)
|
||||||
LOG_I(MAC, "UE %d rnti %x: UL Failure timer %d \n", UE_id, rnti,
|
LOG_I(MAC, "UE %d rnti %x: UL Failure timer %d \n", UE_id, rnti,
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer);
|
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer);
|
||||||
|
|
||||||
if (UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent == 0) {
|
if (UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent == 0) {
|
||||||
UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 1;
|
UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 1;
|
||||||
|
|
||||||
// add a format 1A dci for this UE to request an RA procedure (only one UE per subframe)
|
// add a format 1A dci for this UE to request an RA procedure (only one UE per subframe)
|
||||||
nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req[CC_id].dl_config_request_body.dl_config_pdu_list[DL_req[CC_id].dl_config_request_body.number_pdu];
|
nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req[CC_id].dl_config_request_body.dl_config_pdu_list[DL_req[CC_id].dl_config_request_body.number_pdu];
|
||||||
memset((void *) dl_config_pdu, 0,sizeof(nfapi_dl_config_request_pdu_t));
|
memset((void *) dl_config_pdu, 0,sizeof(nfapi_dl_config_request_pdu_t));
|
||||||
@@ -374,34 +369,35 @@ check_ul_failure(module_id_t module_idP, int CC_id, int UE_id,
|
|||||||
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.dci_format = NFAPI_DL_DCI_FORMAT_1A;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1A;
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = get_aggregation(get_bw_index(module_idP, CC_id),
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = get_aggregation(get_bw_index(module_idP, CC_id),
|
||||||
UE_list->UE_sched_ctrl[UE_id].
|
UE_list->UE_sched_ctrl[UE_id].
|
||||||
dl_cqi[CC_id], format1A);
|
dl_cqi[CC_id], format1A);
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = rnti;
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = 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 = 1; // 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
|
||||||
|
|
||||||
AssertFatal((cc[CC_id].mib->message.dl_Bandwidth >= 0) && (cc[CC_id].mib->message.dl_Bandwidth < 6),
|
AssertFatal((cc[CC_id].mib->message.dl_Bandwidth >= 0) && (cc[CC_id].mib->message.dl_Bandwidth < 6),
|
||||||
"illegal dl_Bandwidth %d\n",
|
"illegal dl_Bandwidth %d\n",
|
||||||
(int) cc[CC_id].mib->message.dl_Bandwidth);
|
(int) cc[CC_id].mib->message.dl_Bandwidth);
|
||||||
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = pdcch_order_table[cc[CC_id].mib->message.dl_Bandwidth];
|
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = pdcch_order_table[cc[CC_id].mib->message.dl_Bandwidth];
|
||||||
DL_req[CC_id].dl_config_request_body.number_dci++;
|
DL_req[CC_id].dl_config_request_body.number_dci++;
|
||||||
DL_req[CC_id].dl_config_request_body.number_pdu++;
|
DL_req[CC_id].dl_config_request_body.number_pdu++;
|
||||||
DL_req[CC_id].dl_config_request_body.tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG;
|
DL_req[CC_id].dl_config_request_body.tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG;
|
||||||
LOG_D(MAC,
|
LOG_D(MAC,
|
||||||
"UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d), resource_block_coding %d \n",
|
"UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d), resource_block_coding %d \n",
|
||||||
UE_id, rnti,
|
UE_id, rnti,
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer,
|
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer,
|
||||||
dl_config_pdu->dci_dl_pdu.
|
dl_config_pdu->dci_dl_pdu.
|
||||||
dci_dl_pdu_rel8.resource_block_coding);
|
dci_dl_pdu_rel8.resource_block_coding);
|
||||||
} else { // ra_pdcch_sent==1
|
} else { // ra_pdcch_sent==1
|
||||||
LOG_D(MAC,
|
LOG_D(MAC,
|
||||||
"UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n",
|
"UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n",
|
||||||
UE_id, rnti,
|
UE_id, rnti,
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer);
|
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer);
|
||||||
if ((UE_list->UE_sched_ctrl[UE_id].ul_failure_timer % 80) == 0) UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 0; // resend every 8 frames
|
|
||||||
|
if ((UE_list->UE_sched_ctrl[UE_id].ul_failure_timer % 80) == 0) UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 0; // resend every 8 frames
|
||||||
}
|
}
|
||||||
|
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer++;
|
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer++;
|
||||||
|
|
||||||
// check threshold
|
// check threshold
|
||||||
if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer > 4000) {
|
if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer > 4000) {
|
||||||
// note: probably ul_failure_timer should be less than UE radio link failure time(see T310/N310/N311)
|
// note: probably ul_failure_timer should be less than UE radio link failure time(see T310/N310/N311)
|
||||||
@@ -416,114 +412,91 @@ check_ul_failure(module_id_t module_idP, int CC_id, int UE_id,
|
|||||||
} else {
|
} else {
|
||||||
// inform RRC of failure and clear timer
|
// inform RRC of failure and clear timer
|
||||||
LOG_I(MAC,
|
LOG_I(MAC,
|
||||||
"UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n",
|
"UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n",
|
||||||
UE_id, rnti);
|
UE_id, rnti);
|
||||||
mac_eNB_rrc_ul_failure(module_idP, CC_id, frameP, subframeP,rnti);
|
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_failure_timer = 0;
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 1;
|
UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 1;
|
||||||
}
|
}
|
||||||
} // ul_failure_timer>0
|
} // ul_failure_timer>0
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
clear_nfapi_information(eNB_MAC_INST * eNB, int CC_idP,
|
clear_nfapi_information(eNB_MAC_INST *eNB, int CC_idP,
|
||||||
frame_t frameP, sub_frame_t subframeP)
|
frame_t frameP, sub_frame_t subframeP) {
|
||||||
{
|
|
||||||
nfapi_dl_config_request_t *DL_req = &eNB->DL_req[0];
|
nfapi_dl_config_request_t *DL_req = &eNB->DL_req[0];
|
||||||
nfapi_ul_config_request_t *UL_req = &eNB->UL_req[0];
|
nfapi_ul_config_request_t *UL_req = &eNB->UL_req[0];
|
||||||
nfapi_hi_dci0_request_t *HI_DCI0_req = &eNB->HI_DCI0_req[CC_idP][subframeP];
|
nfapi_hi_dci0_request_t *HI_DCI0_req = &eNB->HI_DCI0_req[CC_idP][subframeP];
|
||||||
nfapi_tx_request_t *TX_req = &eNB->TX_req[0];
|
nfapi_tx_request_t *TX_req = &eNB->TX_req[0];
|
||||||
|
|
||||||
eNB->pdu_index[CC_idP] = 0;
|
eNB->pdu_index[CC_idP] = 0;
|
||||||
|
|
||||||
if (nfapi_mode==0 || nfapi_mode == 1) { // monolithic or PNF
|
if (NFAPI_MODE == NFAPI_MODE_PNF || NFAPI_MODE == NFAPI_MONOLITHIC) { // monolithic or PNF
|
||||||
|
|
||||||
DL_req[CC_idP].dl_config_request_body.number_pdcch_ofdm_symbols = 1;
|
DL_req[CC_idP].dl_config_request_body.number_pdcch_ofdm_symbols = 1;
|
||||||
DL_req[CC_idP].dl_config_request_body.number_dci = 0;
|
DL_req[CC_idP].dl_config_request_body.number_dci = 0;
|
||||||
DL_req[CC_idP].dl_config_request_body.number_pdu = 0;
|
DL_req[CC_idP].dl_config_request_body.number_pdu = 0;
|
||||||
DL_req[CC_idP].dl_config_request_body.number_pdsch_rnti = 0;
|
DL_req[CC_idP].dl_config_request_body.number_pdsch_rnti = 0;
|
||||||
DL_req[CC_idP].dl_config_request_body.transmission_power_pcfich = 6000;
|
DL_req[CC_idP].dl_config_request_body.transmission_power_pcfich = 6000;
|
||||||
DL_req[CC_idP].sfn_sf = subframeP + (frameP<<4);
|
DL_req[CC_idP].sfn_sf = subframeP + (frameP<<4);
|
||||||
|
|
||||||
HI_DCI0_req->hi_dci0_request_body.sfnsf = subframeP + (frameP<<4);
|
HI_DCI0_req->hi_dci0_request_body.sfnsf = subframeP + (frameP<<4);
|
||||||
HI_DCI0_req->hi_dci0_request_body.number_of_dci = 0;
|
HI_DCI0_req->hi_dci0_request_body.number_of_dci = 0;
|
||||||
|
|
||||||
|
|
||||||
UL_req[CC_idP].ul_config_request_body.number_of_pdus = 0;
|
UL_req[CC_idP].ul_config_request_body.number_of_pdus = 0;
|
||||||
UL_req[CC_idP].ul_config_request_body.rach_prach_frequency_resources = 0; // ignored, handled by PHY for now
|
UL_req[CC_idP].ul_config_request_body.rach_prach_frequency_resources = 0; // ignored, handled by PHY for now
|
||||||
UL_req[CC_idP].ul_config_request_body.srs_present = 0; // ignored, handled by PHY for now
|
UL_req[CC_idP].ul_config_request_body.srs_present = 0; // ignored, handled by PHY for now
|
||||||
|
|
||||||
TX_req[CC_idP].tx_request_body.number_of_pdus = 0;
|
TX_req[CC_idP].tx_request_body.number_of_pdus = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
copy_ulreq(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
|
copy_ulreq(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) {
|
||||||
{
|
|
||||||
int CC_id;
|
int CC_id;
|
||||||
eNB_MAC_INST *mac = RC.mac[module_idP];
|
eNB_MAC_INST *mac = RC.mac[module_idP];
|
||||||
|
|
||||||
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||||
|
|
||||||
nfapi_ul_config_request_t *ul_req_tmp = &mac->UL_req_tmp[CC_id][subframeP];
|
nfapi_ul_config_request_t *ul_req_tmp = &mac->UL_req_tmp[CC_id][subframeP];
|
||||||
nfapi_ul_config_request_t *ul_req = &mac->UL_req[CC_id];
|
nfapi_ul_config_request_t *ul_req = &mac->UL_req[CC_id];
|
||||||
nfapi_ul_config_request_pdu_t *ul_req_pdu = ul_req->ul_config_request_body.ul_config_pdu_list;
|
nfapi_ul_config_request_pdu_t *ul_req_pdu = ul_req->ul_config_request_body.ul_config_pdu_list;
|
||||||
|
|
||||||
*ul_req = *ul_req_tmp;
|
*ul_req = *ul_req_tmp;
|
||||||
LOG_D(MAC,"SFN.SF %d.%d: Copying %d UL pdus to UL_req (sfn_sf %d.%d)\n",frameP,subframeP,ul_req->ul_config_request_body.number_of_pdus,ul_req->sfn_sf>>4,ul_req->sfn_sf&0xf);
|
|
||||||
// Restore the pointer
|
// Restore the pointer
|
||||||
ul_req->ul_config_request_body.ul_config_pdu_list = ul_req_pdu;
|
ul_req->ul_config_request_body.ul_config_pdu_list = ul_req_pdu;
|
||||||
ul_req->sfn_sf = (frameP<<4) + subframeP;
|
ul_req->sfn_sf = (frameP<<4) + subframeP;
|
||||||
ul_req_tmp->ul_config_request_body.number_of_pdus = 0;
|
ul_req_tmp->ul_config_request_body.number_of_pdus = 0;
|
||||||
|
|
||||||
if (ul_req->ul_config_request_body.number_of_pdus>0)
|
if (ul_req->ul_config_request_body.number_of_pdus>0) {
|
||||||
{
|
LOG_D(PHY, "%s() active NOW (frameP:%d subframeP:%d) pdus:%d\n", __FUNCTION__, frameP, subframeP, ul_req->ul_config_request_body.number_of_pdus);
|
||||||
LOG_D(MAC, "%s() active NOW (frameP:%d subframeP:%d) pdus:%d\n", __FUNCTION__, frameP, subframeP, ul_req->ul_config_request_body.number_of_pdus);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
memcpy((void *)ul_req->ul_config_request_body.ul_config_pdu_list,
|
||||||
memcpy((void*)ul_req->ul_config_request_body.ul_config_pdu_list,
|
(void *)ul_req_tmp->ul_config_request_body.ul_config_pdu_list,
|
||||||
(void*)ul_req_tmp->ul_config_request_body.ul_config_pdu_list,
|
ul_req->ul_config_request_body.number_of_pdus*sizeof(nfapi_ul_config_request_pdu_t));
|
||||||
ul_req->ul_config_request_body.number_of_pdus*sizeof(nfapi_ul_config_request_pdu_t));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP,
|
eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP,
|
||||||
sub_frame_t subframeP)
|
sub_frame_t subframeP) {
|
||||||
{
|
|
||||||
|
|
||||||
int mbsfn_status[MAX_NUM_CCs];
|
int mbsfn_status[MAX_NUM_CCs];
|
||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
|
|
||||||
int CC_id, i = -1;
|
int CC_id, i = -1;
|
||||||
UE_list_t *UE_list = &RC.mac[module_idP]->UE_list;
|
UE_list_t *UE_list = &RC.mac[module_idP]->UE_list;
|
||||||
rnti_t rnti;
|
rnti_t rnti;
|
||||||
|
|
||||||
COMMON_channels_t *cc = RC.mac[module_idP]->common_channels;
|
COMMON_channels_t *cc = RC.mac[module_idP]->common_channels;
|
||||||
|
|
||||||
start_meas(&RC.mac[module_idP]->eNB_scheduler);
|
start_meas(&RC.mac[module_idP]->eNB_scheduler);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
|
||||||
(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,
|
(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,
|
||||||
VCD_FUNCTION_IN);
|
VCD_FUNCTION_IN);
|
||||||
|
|
||||||
RC.mac[module_idP]->frame = frameP;
|
RC.mac[module_idP]->frame = frameP;
|
||||||
RC.mac[module_idP]->subframe = subframeP;
|
RC.mac[module_idP]->subframe = subframeP;
|
||||||
|
|
||||||
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||||
mbsfn_status[CC_id] = 0;
|
mbsfn_status[CC_id] = 0;
|
||||||
|
|
||||||
// clear vrb_maps
|
// clear vrb_maps
|
||||||
memset(cc[CC_id].vrb_map, 0, 100);
|
memset(cc[CC_id].vrb_map, 0, 100);
|
||||||
memset(cc[CC_id].vrb_map_UL, 0, 100);
|
memset(cc[CC_id].vrb_map_UL, 0, 100);
|
||||||
|
|
||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
cc[CC_id].mcch_active = 0;
|
cc[CC_id].mcch_active = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
clear_nfapi_information(RC.mac[module_idP], CC_id, frameP, subframeP);
|
clear_nfapi_information(RC.mac[module_idP], CC_id, frameP, subframeP);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -532,105 +505,115 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP,
|
|||||||
if (UE_list->active[i]) {
|
if (UE_list->active[i]) {
|
||||||
rnti = UE_RNTI(module_idP, i);
|
rnti = UE_RNTI(module_idP, i);
|
||||||
CC_id = UE_PCCID(module_idP, i);
|
CC_id = UE_PCCID(module_idP, i);
|
||||||
|
|
||||||
if (((frameP&127) == 0) && (subframeP == 0)) {
|
if (((frameP&127) == 0) && (subframeP == 0)) {
|
||||||
LOG_I(MAC,
|
LOG_I(MAC,
|
||||||
"UE rnti %x : %s, PHR %d dB DL CQI %d PUSCH SNR %d PUCCH SNR %d\n",
|
"UE rnti %x : %s, PHR %d dB DL CQI %d PUSCH SNR %d PUCCH SNR %d\n",
|
||||||
rnti,
|
rnti,
|
||||||
UE_list->UE_sched_ctrl[i].ul_out_of_sync ==
|
UE_list->UE_sched_ctrl[i].ul_out_of_sync ==
|
||||||
0 ? "in synch" : "out of sync",
|
0 ? "in synch" : "out of sync",
|
||||||
UE_list->UE_template[CC_id][i].phr_info,
|
UE_list->UE_template[CC_id][i].phr_info,
|
||||||
UE_list->UE_sched_ctrl[i].dl_cqi[CC_id],
|
UE_list->UE_sched_ctrl[i].dl_cqi[CC_id],
|
||||||
(5*UE_list->UE_sched_ctrl[i].pusch_snr[CC_id] - 640) / 10,
|
(5*UE_list->UE_sched_ctrl[i].pusch_snr[CC_id] - 640) / 10,
|
||||||
(5*UE_list->UE_sched_ctrl[i].pucch1_snr[CC_id] - 640) / 10);
|
(5*UE_list->UE_sched_ctrl[i].pucch1_snr[CC_id] - 640) / 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
RC.eNB[module_idP][CC_id]->pusch_stats_bsr[i][(frameP * 10) +
|
RC.eNB[module_idP][CC_id]->pusch_stats_bsr[i][(frameP * 10) +
|
||||||
subframeP] = -63;
|
subframeP] = -63;
|
||||||
|
|
||||||
if (i == UE_list->head)
|
if (i == UE_list->head)
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
|
||||||
(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,
|
(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,
|
||||||
RC.eNB[module_idP][CC_id]->
|
RC.eNB[module_idP][CC_id]->
|
||||||
pusch_stats_bsr[i][(frameP * 10) + subframeP]);
|
pusch_stats_bsr[i][(frameP * 10) + subframeP]);
|
||||||
|
|
||||||
// increment this, it is cleared when we receive an sdu
|
// increment this, it is cleared when we receive an sdu
|
||||||
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ul_inactivity_timer++;
|
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ul_inactivity_timer++;
|
||||||
|
|
||||||
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].cqi_req_timer++;
|
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].cqi_req_timer++;
|
||||||
LOG_D(MAC, "UE %d/%x : ul_inactivity %d, cqi_req %d\n", i, rnti,
|
LOG_D(MAC, "UE %d/%x : ul_inactivity %d, cqi_req %d\n", i, rnti,
|
||||||
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].
|
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].
|
||||||
ul_inactivity_timer,
|
ul_inactivity_timer,
|
||||||
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].cqi_req_timer);
|
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].cqi_req_timer);
|
||||||
check_ul_failure(module_idP, CC_id, i, frameP, subframeP);
|
check_ul_failure(module_idP, CC_id, i, frameP, subframeP);
|
||||||
|
|
||||||
if (RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer > 0) {
|
if (RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer > 0) {
|
||||||
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer++;
|
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer++;
|
||||||
if(RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer >=
|
|
||||||
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer_thres) {
|
if(RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer >=
|
||||||
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer = 0;
|
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer_thres) {
|
||||||
|
RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer = 0;
|
||||||
|
|
||||||
//clear reestablish_rnti_map
|
//clear reestablish_rnti_map
|
||||||
if(RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer_thres >20){
|
if(RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer_thres >20) {
|
||||||
for (int ue_id_l = 0; ue_id_l < MAX_MOBILES_PER_ENB; ue_id_l++) {
|
for (int ue_id_l = 0; ue_id_l < MAX_MOBILES_PER_ENB; ue_id_l++) {
|
||||||
if (reestablish_rnti_map[ue_id_l][0] == rnti) {
|
if (reestablish_rnti_map[ue_id_l][0] == rnti) {
|
||||||
// clear currentC-RNTI from map
|
// clear currentC-RNTI from map
|
||||||
reestablish_rnti_map[ue_id_l][0] = 0;
|
reestablish_rnti_map[ue_id_l][0] = 0;
|
||||||
reestablish_rnti_map[ue_id_l][1] = 0;
|
reestablish_rnti_map[ue_id_l][1] = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, rnti, 0, 0,module_idP);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, rnti, 0, 0,module_idP);
|
||||||
rrc_rlc_remove_ue(&ctxt);
|
rrc_rlc_remove_ue(&ctxt);
|
||||||
pdcp_remove_UE(&ctxt);
|
pdcp_remove_UE(&ctxt);
|
||||||
}
|
}
|
||||||
// Note: This should not be done in the MAC!
|
|
||||||
for (int ii=0; ii<MAX_MOBILES_PER_ENB; ii++) {
|
// Note: This should not be done in the MAC!
|
||||||
LTE_eNB_ULSCH_t *ulsch = RC.eNB[module_idP][CC_id]->ulsch[ii];
|
for (int ii=0; ii<MAX_MOBILES_PER_ENB; ii++) {
|
||||||
if((ulsch != NULL) && (ulsch->rnti == rnti)){
|
LTE_eNB_ULSCH_t *ulsch = RC.eNB[module_idP][CC_id]->ulsch[ii];
|
||||||
|
|
||||||
|
if((ulsch != NULL) && (ulsch->rnti == rnti)) {
|
||||||
void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
|
void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
|
||||||
LOG_I(MAC, "clean_eNb_ulsch UE %x \n", rnti);
|
LOG_I(MAC, "clean_eNb_ulsch UE %x \n", rnti);
|
||||||
clean_eNb_ulsch(ulsch);
|
clean_eNb_ulsch(ulsch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int ii=0; ii<MAX_MOBILES_PER_ENB; ii++) {
|
|
||||||
LTE_eNB_DLSCH_t *dlsch = RC.eNB[module_idP][CC_id]->dlsch[ii][0];
|
for (int ii=0; ii<MAX_MOBILES_PER_ENB; ii++) {
|
||||||
if((dlsch != NULL) && (dlsch->rnti == rnti)){
|
LTE_eNB_DLSCH_t *dlsch = RC.eNB[module_idP][CC_id]->dlsch[ii][0];
|
||||||
|
|
||||||
|
if((dlsch != NULL) && (dlsch->rnti == rnti)) {
|
||||||
void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
|
void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
|
||||||
LOG_I(MAC, "clean_eNb_dlsch UE %x \n", rnti);
|
LOG_I(MAC, "clean_eNb_dlsch UE %x \n", rnti);
|
||||||
clean_eNb_dlsch(dlsch);
|
clean_eNb_dlsch(dlsch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int j = 0; j < 10; j++){
|
for(int j = 0; j < 10; j++) {
|
||||||
nfapi_ul_config_request_body_t *ul_req_tmp = NULL;
|
nfapi_ul_config_request_body_t *ul_req_tmp = NULL;
|
||||||
ul_req_tmp = &RC.mac[module_idP]->UL_req_tmp[CC_id][j].ul_config_request_body;
|
ul_req_tmp = &RC.mac[module_idP]->UL_req_tmp[CC_id][j].ul_config_request_body;
|
||||||
if(ul_req_tmp){
|
|
||||||
int pdu_number = ul_req_tmp->number_of_pdus;
|
if(ul_req_tmp) {
|
||||||
for(int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--){
|
int pdu_number = ul_req_tmp->number_of_pdus;
|
||||||
if(ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti){
|
|
||||||
LOG_I(MAC, "remove UE %x from ul_config_pdu_list %d/%d\n", rnti, pdu_index, pdu_number);
|
for(int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--) {
|
||||||
if(pdu_index < pdu_number -1){
|
if(ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) {
|
||||||
memcpy(&ul_req_tmp->ul_config_pdu_list[pdu_index], &ul_req_tmp->ul_config_pdu_list[pdu_index+1], (pdu_number-1-pdu_index) * sizeof(nfapi_ul_config_request_pdu_t));
|
LOG_I(MAC, "remove UE %x from ul_config_pdu_list %d/%d\n", rnti, pdu_index, pdu_number);
|
||||||
}
|
|
||||||
ul_req_tmp->number_of_pdus--;
|
if(pdu_index < pdu_number -1) {
|
||||||
}
|
memcpy(&ul_req_tmp->ul_config_pdu_list[pdu_index], &ul_req_tmp->ul_config_pdu_list[pdu_index+1], (pdu_number-1-pdu_index) * sizeof(nfapi_ul_config_request_pdu_t));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
ul_req_tmp->number_of_pdus--;
|
||||||
rrc_mac_remove_ue(module_idP,rnti);
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rrc_mac_remove_ue(module_idP,rnti);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (!defined(PRE_SCD_THREAD))
|
#if (!defined(PRE_SCD_THREAD))
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES,
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES,
|
||||||
NOT_A_RNTI, frameP, subframeP,
|
NOT_A_RNTI, frameP, subframeP,
|
||||||
module_idP);
|
module_idP);
|
||||||
pdcp_run(&ctxt);
|
pdcp_run(&ctxt);
|
||||||
|
|
||||||
rrc_rx_tx(&ctxt, CC_id);
|
rrc_rx_tx(&ctxt, CC_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||||
|
|
||||||
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||||
@@ -642,27 +625,29 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int debug_flag=0;
|
static int debug_flag=0;
|
||||||
void (*schedule_ulsch_p)(module_id_t module_idP, frame_t frameP, sub_frame_t subframe)=NULL;
|
void (*schedule_ulsch_p)(module_id_t module_idP, frame_t frameP, sub_frame_t subframe)=NULL;
|
||||||
void (*schedule_ue_spec_p)(module_id_t module_idP, frame_t frameP, sub_frame_t subframe, int *mbsfn_flag)=NULL;
|
void (*schedule_ue_spec_p)(module_id_t module_idP, frame_t frameP, sub_frame_t subframe, int *mbsfn_flag)=NULL;
|
||||||
if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_DEFAULT){
|
|
||||||
|
if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_DEFAULT) {
|
||||||
schedule_ulsch_p = schedule_ulsch;
|
schedule_ulsch_p = schedule_ulsch;
|
||||||
schedule_ue_spec_p = schedule_dlsch;
|
schedule_ue_spec_p = schedule_dlsch;
|
||||||
}else if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_FAIR_RR){
|
} else if(RC.mac[module_idP]->scheduler_mode == SCHED_MODE_FAIR_RR) {
|
||||||
memset(dlsch_ue_select, 0, sizeof(dlsch_ue_select));
|
memset(dlsch_ue_select, 0, sizeof(dlsch_ue_select));
|
||||||
schedule_ulsch_p = schedule_ulsch_fairRR;
|
schedule_ulsch_p = schedule_ulsch_fairRR;
|
||||||
schedule_ue_spec_p = schedule_ue_spec_fairRR;
|
schedule_ue_spec_p = schedule_ue_spec_fairRR;
|
||||||
}
|
}
|
||||||
if(debug_flag==0){
|
|
||||||
|
if(debug_flag==0) {
|
||||||
LOG_E(MAC,"SCHED_MODE=%d\n",RC.mac[module_idP]->scheduler_mode);
|
LOG_E(MAC,"SCHED_MODE=%d\n",RC.mac[module_idP]->scheduler_mode);
|
||||||
debug_flag=1;
|
debug_flag=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This schedules MIB
|
// This schedules MIB
|
||||||
if ((subframeP == 0) && (frameP & 3) == 0)
|
if ((subframeP == 0) && (frameP & 3) == 0)
|
||||||
schedule_mib(module_idP, frameP, subframeP);
|
schedule_mib(module_idP, frameP, subframeP);
|
||||||
if (get_softmodem_params()->phy_test == 0){
|
|
||||||
|
if (get_softmodem_params()->phy_test == 0) {
|
||||||
// This schedules SI for legacy LTE and eMTC starting in subframeP
|
// This schedules SI for legacy LTE and eMTC starting in subframeP
|
||||||
schedule_SI(module_idP, frameP, subframeP);
|
schedule_SI(module_idP, frameP, subframeP);
|
||||||
// This schedules Paging in subframeP
|
// This schedules Paging in subframeP
|
||||||
@@ -673,12 +658,14 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP,
|
|||||||
copy_ulreq(module_idP, frameP, subframeP);
|
copy_ulreq(module_idP, frameP, subframeP);
|
||||||
// This schedules SRS in subframeP
|
// This schedules SRS in subframeP
|
||||||
schedule_SRS(module_idP, frameP, subframeP);
|
schedule_SRS(module_idP, frameP, subframeP);
|
||||||
|
|
||||||
// This schedules ULSCH in subframeP (dci0)
|
// This schedules ULSCH in subframeP (dci0)
|
||||||
if (schedule_ulsch_p != NULL) {
|
if (schedule_ulsch_p != NULL) {
|
||||||
schedule_ulsch_p(module_idP, frameP, subframeP);
|
schedule_ulsch_p(module_idP, frameP, subframeP);
|
||||||
} else {
|
} else {
|
||||||
LOG_E(MAC," %s %d: schedule_ulsch_p is NULL, function not called\n",__FILE__,__LINE__);
|
LOG_E(MAC," %s %d: schedule_ulsch_p is NULL, function not called\n",__FILE__,__LINE__);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This schedules UCI_SR in subframeP
|
// This schedules UCI_SR in subframeP
|
||||||
schedule_SR(module_idP, frameP, subframeP);
|
schedule_SR(module_idP, frameP, subframeP);
|
||||||
// This schedules UCI_CSI in subframeP
|
// This schedules UCI_CSI in subframeP
|
||||||
@@ -687,15 +674,14 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP,
|
|||||||
// This schedules DLSCH in subframeP
|
// This schedules DLSCH in subframeP
|
||||||
schedule_ue_spec_br(module_idP, frameP, subframeP);
|
schedule_ue_spec_br(module_idP, frameP, subframeP);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// This schedules DLSCH in subframeP
|
// This schedules DLSCH in subframeP
|
||||||
if (schedule_ue_spec_p != NULL) {
|
if (schedule_ue_spec_p != NULL) {
|
||||||
schedule_ue_spec_p(module_idP, frameP, subframeP, mbsfn_status);
|
schedule_ue_spec_p(module_idP, frameP, subframeP, mbsfn_status);
|
||||||
} else {
|
} else {
|
||||||
LOG_E(MAC," %s %d: schedule_ue_spec_p is NULL, function not called\n",__FILE__,__LINE__);
|
LOG_E(MAC," %s %d: schedule_ue_spec_p is NULL, function not called\n",__FILE__,__LINE__);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
}
|
|
||||||
else{
|
|
||||||
schedule_ulsch_phy_test(module_idP,frameP,subframeP);
|
schedule_ulsch_phy_test(module_idP,frameP,subframeP);
|
||||||
schedule_ue_spec_phy_test(module_idP,frameP,subframeP,mbsfn_status);
|
schedule_ue_spec_phy_test(module_idP,frameP,subframeP,mbsfn_status);
|
||||||
}
|
}
|
||||||
@@ -711,8 +697,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP,
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop_meas(&RC.mac[module_idP]->eNB_scheduler);
|
stop_meas(&RC.mac[module_idP]->eNB_scheduler);
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
|
||||||
(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,
|
(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,
|
||||||
VCD_FUNCTION_OUT);
|
VCD_FUNCTION_OUT);
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -672,8 +672,10 @@ schedule_SI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
|
|||||||
mcs = 7;
|
mcs = 7;
|
||||||
} else if (bcch_sdu_length <= 49) {
|
} else if (bcch_sdu_length <= 49) {
|
||||||
mcs = 8;
|
mcs = 8;
|
||||||
}
|
} else if (bcch_sdu_length <= 59) {
|
||||||
|
mcs = 9;
|
||||||
|
}
|
||||||
|
else AssertFatal(1==0,"Cannot Assign mcs for bcch_sdu_length %d (max mcs 9)\n",bcch_sdu_length);
|
||||||
|
|
||||||
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,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -40,6 +40,7 @@
|
|||||||
#include "LAYER2/MAC/mac_extern.h"
|
#include "LAYER2/MAC/mac_extern.h"
|
||||||
#include "LAYER2/MAC/eNB_scheduler_fairRR.h"
|
#include "LAYER2/MAC/eNB_scheduler_fairRR.h"
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||||
#include "UTIL/OPT/opt.h"
|
#include "UTIL/OPT/opt.h"
|
||||||
#include "OCG.h"
|
#include "OCG.h"
|
||||||
@@ -49,7 +50,7 @@
|
|||||||
|
|
||||||
#include "T.h"
|
#include "T.h"
|
||||||
|
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
#ifdef PHY_TX_THREAD
|
#ifdef PHY_TX_THREAD
|
||||||
extern volatile int16_t phy_tx_txdataF_end;
|
extern volatile int16_t phy_tx_txdataF_end;
|
||||||
extern int oai_exit;
|
extern int oai_exit;
|
||||||
@@ -841,7 +842,6 @@ schedule_ue_spec_fairRR(module_id_t module_idP,
|
|||||||
#ifdef DEBUG_eNB_SCHEDULER
|
#ifdef DEBUG_eNB_SCHEDULER
|
||||||
int k;
|
int k;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
start_meas(&eNB->schedule_dlsch);
|
start_meas(&eNB->schedule_dlsch);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
|
||||||
(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH, VCD_FUNCTION_IN);
|
(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH, VCD_FUNCTION_IN);
|
||||||
@@ -1012,7 +1012,7 @@ schedule_ue_spec_fairRR(module_id_t module_idP,
|
|||||||
DevCheck(((eNB_UE_stats->dl_cqi < MIN_CQI_VALUE) || (eNB_UE_stats->dl_cqi > MAX_CQI_VALUE)),
|
DevCheck(((eNB_UE_stats->dl_cqi < MIN_CQI_VALUE) || (eNB_UE_stats->dl_cqi > MAX_CQI_VALUE)),
|
||||||
eNB_UE_stats->dl_cqi, MIN_CQI_VALUE, MAX_CQI_VALUE);
|
eNB_UE_stats->dl_cqi, MIN_CQI_VALUE, MAX_CQI_VALUE);
|
||||||
*/
|
*/
|
||||||
if (nfapi_mode) {
|
if (NFAPI_MODE != NFAPI_MONOLITHIC) {
|
||||||
eNB_UE_stats->dlsch_mcs1 = 10;//cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]];
|
eNB_UE_stats->dlsch_mcs1 = 10;//cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]];
|
||||||
} else {
|
} else {
|
||||||
eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]];
|
eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]];
|
||||||
@@ -2994,10 +2994,10 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP,
|
|||||||
last_ulsch_ue_id[CC_id] = ulsch_ue_select[CC_id].list[ulsch_ue_num].UE_id;
|
last_ulsch_ue_id[CC_id] = ulsch_ue_select[CC_id].list[ulsch_ue_num].UE_id;
|
||||||
}
|
}
|
||||||
} else if (ulsch_ue_select[CC_id].list[ulsch_ue_num].ue_priority == SCH_UL_RETRANS) { // round > 0 => retransmission
|
} else if (ulsch_ue_select[CC_id].list[ulsch_ue_num].ue_priority == SCH_UL_RETRANS) { // round > 0 => retransmission
|
||||||
T(T_ENB_MAC_UE_UL_SCHEDULE_RETRANSMISSION, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP),
|
|
||||||
T_INT(subframeP), T_INT(harq_pid), T_INT(UE_template->mcs_UL[harq_pid]), T_INT(first_rb[CC_id]), T_INT(rb_table[rb_table_index]),
|
|
||||||
T_INT(round));
|
|
||||||
round = UE_sched_ctrl->round_UL[CC_id][harq_pid];
|
round = UE_sched_ctrl->round_UL[CC_id][harq_pid];
|
||||||
|
T(T_ENB_MAC_UE_UL_SCHEDULE_RETRANSMISSION, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP),
|
||||||
|
T_INT(subframeP), T_INT(harq_pid), T_INT(UE_template->mcs_UL[harq_pid]), T_INT(ulsch_ue_select[CC_id].list[ulsch_ue_num].start_rb), T_INT(ulsch_ue_select[CC_id].list[ulsch_ue_num].nb_rb),
|
||||||
|
T_INT(round));
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power=normalized_rx_power;
|
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power=normalized_rx_power;
|
||||||
UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power;
|
UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power;
|
||||||
uint8_t mcs_rv = 0;
|
uint8_t mcs_rv = 0;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -815,6 +815,9 @@ typedef struct {
|
|||||||
/// Number of Allocated RBs for UL after scheduling
|
/// Number of Allocated RBs for UL after scheduling
|
||||||
uint16_t first_rb_ul[8]; // num_max_harq
|
uint16_t first_rb_ul[8]; // num_max_harq
|
||||||
|
|
||||||
|
/// Is CQI requested for UL after scheduling 1st transmission
|
||||||
|
uint8_t cqi_req[8]; // num_max_harq
|
||||||
|
|
||||||
/// Cyclic shift for DMRS after scheduling
|
/// Cyclic shift for DMRS after scheduling
|
||||||
uint16_t cshift[8]; // num_max_harq
|
uint16_t cshift[8]; // num_max_harq
|
||||||
|
|
||||||
|
|||||||
@@ -711,8 +711,6 @@ int rrc_mac_remove_ue(module_id_t Mod_id, rnti_t rntiP);
|
|||||||
void store_dlsch_buffer(module_id_t Mod_id, int slice_idx, frame_t frameP, sub_frame_t subframeP);
|
void store_dlsch_buffer(module_id_t Mod_id, int slice_idx, frame_t frameP, sub_frame_t subframeP);
|
||||||
void assign_rbs_required(module_id_t Mod_id, int slice_idx, frame_t frameP, sub_frame_t subframe, uint16_t nb_rbs_required[NFAPI_CC_MAX][MAX_MOBILES_PER_ENB], int min_rb_unit[NFAPI_CC_MAX]);
|
void assign_rbs_required(module_id_t Mod_id, int slice_idx, frame_t frameP, sub_frame_t subframe, uint16_t nb_rbs_required[NFAPI_CC_MAX][MAX_MOBILES_PER_ENB], int min_rb_unit[NFAPI_CC_MAX]);
|
||||||
|
|
||||||
int maxround(module_id_t Mod_id, uint16_t rnti, int frame,
|
|
||||||
sub_frame_t subframe, uint8_t ul_flag);
|
|
||||||
void swap_UEs(UE_list_t * listP, int nodeiP, int nodejP, int ul_flag);
|
void swap_UEs(UE_list_t * listP, int nodeiP, int nodejP, int ul_flag);
|
||||||
int prev(UE_list_t * listP, int nodeP, int ul_flag);
|
int prev(UE_list_t * listP, int nodeP, int ul_flag);
|
||||||
void dump_ue_list(UE_list_t * listP, int ul_flag);
|
void dump_ue_list(UE_list_t * listP, int ul_flag);
|
||||||
@@ -730,11 +728,11 @@ void set_ul_DAI(int module_idP,
|
|||||||
|
|
||||||
void ulsch_scheduler_pre_processor(module_id_t module_idP, int slice_idx, int frameP,
|
void ulsch_scheduler_pre_processor(module_id_t module_idP, int slice_idx, int frameP,
|
||||||
sub_frame_t subframeP,
|
sub_frame_t subframeP,
|
||||||
|
int sched_frameP,
|
||||||
unsigned char sched_subframeP,
|
unsigned char sched_subframeP,
|
||||||
uint16_t * first_rb);
|
uint16_t * first_rb);
|
||||||
void store_ulsch_buffer(module_id_t module_idP, int frameP,
|
void store_ulsch_buffer(module_id_t module_idP, int frameP,
|
||||||
sub_frame_t subframeP);
|
sub_frame_t subframeP);
|
||||||
void sort_ue_ul(module_id_t module_idP, int slice_idx, int frameP, sub_frame_t subframeP, rnti_t *rntiTable);
|
|
||||||
void assign_max_mcs_min_rb(module_id_t module_idP, int slice_idx, int frameP,
|
void assign_max_mcs_min_rb(module_id_t module_idP, int slice_idx, int frameP,
|
||||||
sub_frame_t subframeP, uint16_t * first_rb);
|
sub_frame_t subframeP, uint16_t * first_rb);
|
||||||
void adjust_bsr_info(int buffer_occupancy, uint16_t TBS,
|
void adjust_bsr_info(int buffer_occupancy, uint16_t TBS,
|
||||||
|
|||||||
@@ -39,12 +39,12 @@
|
|||||||
#include "LAYER2/PDCP_v10.1.0/pdcp.h"
|
#include "LAYER2/PDCP_v10.1.0/pdcp.h"
|
||||||
#include "RRC/LTE/rrc_defs.h"
|
#include "RRC/LTE/rrc_defs.h"
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
|
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
|
||||||
|
|
||||||
|
|
||||||
#include "common/ran_context.h"
|
#include "common/ran_context.h"
|
||||||
extern FILL_UL_INFO_MUTEX_t fill_ul_mutex;
|
extern FILL_UL_INFO_MUTEX_t fill_ul_mutex;
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
extern void openair_rrc_top_init_ue( int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, uint8_t HO_active);
|
extern void openair_rrc_top_init_ue( int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, uint8_t HO_active);
|
||||||
|
|
||||||
void dl_phy_sync_success(module_id_t module_idP, frame_t frameP, unsigned char eNB_index, uint8_t first_sync) { //init as MR
|
void dl_phy_sync_success(module_id_t module_idP, frame_t frameP, unsigned char eNB_index, uint8_t first_sync) { //init as MR
|
||||||
@@ -91,7 +91,7 @@ mac_top_init_ue(int eMBMS_active, char *uecap_xer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// mutex below are used for multiple UE's L2 FAPI simulation.
|
// mutex below are used for multiple UE's L2 FAPI simulation.
|
||||||
if (nfapi_mode == 3) {
|
if (NFAPI_MODE == NFAPI_UE_STUB_PNF) {
|
||||||
pthread_mutex_init(&fill_ul_mutex.rx_mutex,NULL);
|
pthread_mutex_init(&fill_ul_mutex.rx_mutex,NULL);
|
||||||
pthread_mutex_init(&fill_ul_mutex.crc_mutex,NULL);
|
pthread_mutex_init(&fill_ul_mutex.crc_mutex,NULL);
|
||||||
pthread_mutex_init(&fill_ul_mutex.sr_mutex,NULL);
|
pthread_mutex_init(&fill_ul_mutex.sr_mutex,NULL);
|
||||||
|
|||||||
@@ -56,6 +56,13 @@ extern RAN_CONTEXT_t RC;
|
|||||||
|
|
||||||
//#define ICIC 0
|
//#define ICIC 0
|
||||||
|
|
||||||
|
void
|
||||||
|
sort_ue_ul(module_id_t module_idP,
|
||||||
|
int slice_idx,
|
||||||
|
int sched_frameP,
|
||||||
|
sub_frame_t sched_subframeP,
|
||||||
|
rnti_t *rntiTable);
|
||||||
|
|
||||||
/* this function checks that get_eNB_UE_stats returns
|
/* this function checks that get_eNB_UE_stats returns
|
||||||
* a non-NULL pointer for all the active CCs of an UE
|
* a non-NULL pointer for all the active CCs of an UE
|
||||||
*/
|
*/
|
||||||
@@ -264,7 +271,7 @@ assign_rbs_required(module_id_t Mod_id,
|
|||||||
// This function scans all CC_ids for a particular UE to find the maximum round index of its HARQ processes
|
// This function scans all CC_ids for a particular UE to find the maximum round index of its HARQ processes
|
||||||
int
|
int
|
||||||
maxround(module_id_t Mod_id, uint16_t rnti, int frame,
|
maxround(module_id_t Mod_id, uint16_t rnti, int frame,
|
||||||
sub_frame_t subframe, uint8_t ul_flag) {
|
sub_frame_t subframe) {
|
||||||
uint8_t round, round_max = 0, UE_id;
|
uint8_t round, round_max = 0, UE_id;
|
||||||
int CC_id, harq_pid;
|
int CC_id, harq_pid;
|
||||||
UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list;
|
UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list;
|
||||||
@@ -284,6 +291,28 @@ maxround(module_id_t Mod_id, uint16_t rnti, int frame,
|
|||||||
return round_max;
|
return round_max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
maxround_ul(module_id_t Mod_id, uint16_t rnti, int sched_frame,
|
||||||
|
sub_frame_t sched_subframe) {
|
||||||
|
uint8_t round, round_max = 0, UE_id;
|
||||||
|
int CC_id, harq_pid;
|
||||||
|
UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list;
|
||||||
|
COMMON_channels_t *cc;
|
||||||
|
|
||||||
|
for (CC_id = 0; CC_id < RC.nb_mac_CC[Mod_id]; CC_id++) {
|
||||||
|
cc = &RC.mac[Mod_id]->common_channels[CC_id];
|
||||||
|
UE_id = find_UE_id(Mod_id, rnti);
|
||||||
|
harq_pid = subframe2harqpid(cc, sched_frame, sched_subframe);
|
||||||
|
round = UE_list->UE_sched_ctrl[UE_id].round_UL[CC_id][harq_pid];
|
||||||
|
|
||||||
|
if (round > round_max) {
|
||||||
|
round_max = round;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return round_max;
|
||||||
|
}
|
||||||
|
|
||||||
// This function scans all CC_ids for a particular UE to find the maximum DL CQI
|
// This function scans all CC_ids for a particular UE to find the maximum DL CQI
|
||||||
// it returns -1 if the UE is not found in PHY layer (get_eNB_UE_stats gives NULL)
|
// it returns -1 if the UE is not found in PHY layer (get_eNB_UE_stats gives NULL)
|
||||||
int maxcqi(module_id_t Mod_id, int32_t UE_id) {
|
int maxcqi(module_id_t Mod_id, int32_t UE_id) {
|
||||||
@@ -332,10 +361,10 @@ static int ue_dl_compare(const void *_a, const void *_b, void *_params) {
|
|||||||
int UE_id2 = *(const int *) _b;
|
int UE_id2 = *(const int *) _b;
|
||||||
int rnti1 = UE_RNTI(params->Mod_idP, UE_id1);
|
int rnti1 = UE_RNTI(params->Mod_idP, UE_id1);
|
||||||
int pCC_id1 = UE_PCCID(params->Mod_idP, UE_id1);
|
int pCC_id1 = UE_PCCID(params->Mod_idP, UE_id1);
|
||||||
int round1 = maxround(params->Mod_idP, rnti1, params->frameP, params->subframeP, 1);
|
int round1 = maxround(params->Mod_idP, rnti1, params->frameP, params->subframeP);
|
||||||
int rnti2 = UE_RNTI(params->Mod_idP, UE_id2);
|
int rnti2 = UE_RNTI(params->Mod_idP, UE_id2);
|
||||||
int pCC_id2 = UE_PCCID(params->Mod_idP, UE_id2);
|
int pCC_id2 = UE_PCCID(params->Mod_idP, UE_id2);
|
||||||
int round2 = maxround(params->Mod_idP, rnti2, params->frameP, params->subframeP, 1);
|
int round2 = maxround(params->Mod_idP, rnti2, params->frameP, params->subframeP);
|
||||||
int cqi1 = maxcqi(params->Mod_idP, UE_id1);
|
int cqi1 = maxcqi(params->Mod_idP, UE_id1);
|
||||||
int cqi2 = maxcqi(params->Mod_idP, UE_id2);
|
int cqi2 = maxcqi(params->Mod_idP, UE_id2);
|
||||||
long lcgid1 = min_lcgidpriority(params->Mod_idP, UE_id1);
|
long lcgid1 = min_lcgidpriority(params->Mod_idP, UE_id1);
|
||||||
@@ -1626,6 +1655,7 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
|||||||
int slice_idx,
|
int slice_idx,
|
||||||
int frameP,
|
int frameP,
|
||||||
sub_frame_t subframeP,
|
sub_frame_t subframeP,
|
||||||
|
int sched_frameP,
|
||||||
unsigned char sched_subframeP,
|
unsigned char sched_subframeP,
|
||||||
uint16_t *first_rb) {
|
uint16_t *first_rb) {
|
||||||
int UE_id;
|
int UE_id;
|
||||||
@@ -1646,7 +1676,7 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
|||||||
|
|
||||||
// sort ues
|
// sort ues
|
||||||
LOG_D(MAC, "In ulsch_preprocessor: sort ue \n");
|
LOG_D(MAC, "In ulsch_preprocessor: sort ue \n");
|
||||||
sort_ue_ul(module_idP, slice_idx, frameP, subframeP, rntiTable);
|
sort_ue_ul(module_idP, slice_idx, sched_frameP, sched_subframeP, rntiTable);
|
||||||
// maximize MCS and then allocate required RB according to the buffer occupancy with the limit of max available UL RB
|
// maximize MCS and then allocate required RB according to the buffer occupancy with the limit of max available UL RB
|
||||||
LOG_D(MAC, "In ulsch_preprocessor: assign max mcs min rb\n");
|
LOG_D(MAC, "In ulsch_preprocessor: assign max mcs min rb\n");
|
||||||
assign_max_mcs_min_rb(module_idP, slice_idx, frameP, subframeP, first_rb);
|
assign_max_mcs_min_rb(module_idP, slice_idx, frameP, subframeP, first_rb);
|
||||||
@@ -1741,11 +1771,11 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP,
|
|||||||
CC_id = UE_list->ordered_ULCCids[n][UE_id];
|
CC_id = UE_list->ordered_ULCCids[n][UE_id];
|
||||||
UE_template = &UE_list->UE_template[CC_id][UE_id];
|
UE_template = &UE_list->UE_template[CC_id][UE_id];
|
||||||
harq_pid = subframe2harqpid(&RC.mac[module_idP]->common_channels[CC_id],
|
harq_pid = subframe2harqpid(&RC.mac[module_idP]->common_channels[CC_id],
|
||||||
frameP, sched_subframeP);
|
sched_frameP, sched_subframeP);
|
||||||
|
|
||||||
// mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,openair_harq_UL);
|
// mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,openair_harq_UL);
|
||||||
|
|
||||||
if (UE_list->UE_sched_ctrl[UE_id].round_UL[CC_id] > 0) {
|
if (UE_list->UE_sched_ctrl[UE_id].round_UL[CC_id][harq_pid] > 0) {
|
||||||
nb_allocated_rbs[CC_id][UE_id] = UE_list->UE_template[CC_id][UE_id].nb_rb_ul[harq_pid];
|
nb_allocated_rbs[CC_id][UE_id] = UE_list->UE_template[CC_id][UE_id].nb_rb_ul[harq_pid];
|
||||||
} else {
|
} else {
|
||||||
nb_allocated_rbs[CC_id][UE_id] =
|
nb_allocated_rbs[CC_id][UE_id] =
|
||||||
@@ -1924,8 +1954,8 @@ assign_max_mcs_min_rb(module_id_t module_idP,
|
|||||||
|
|
||||||
struct sort_ue_ul_params {
|
struct sort_ue_ul_params {
|
||||||
int module_idP;
|
int module_idP;
|
||||||
int frameP;
|
int sched_frameP;
|
||||||
int subframeP;
|
int sched_subframeP;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ue_ul_compare(const void *_a, const void *_b, void *_params) {
|
static int ue_ul_compare(const void *_a, const void *_b, void *_params) {
|
||||||
@@ -1935,12 +1965,12 @@ static int ue_ul_compare(const void *_a, const void *_b, void *_params) {
|
|||||||
int UE_id2 = *(const int *) _b;
|
int UE_id2 = *(const int *) _b;
|
||||||
int rnti1 = UE_RNTI(params->module_idP, UE_id1);
|
int rnti1 = UE_RNTI(params->module_idP, UE_id1);
|
||||||
int pCCid1 = UE_PCCID(params->module_idP, UE_id1);
|
int pCCid1 = UE_PCCID(params->module_idP, UE_id1);
|
||||||
int round1 = maxround(params->module_idP, rnti1, params->frameP,
|
int round1 = maxround_ul(params->module_idP, rnti1, params->sched_frameP,
|
||||||
params->subframeP, 1);
|
params->sched_subframeP);
|
||||||
int rnti2 = UE_RNTI(params->module_idP, UE_id2);
|
int rnti2 = UE_RNTI(params->module_idP, UE_id2);
|
||||||
int pCCid2 = UE_PCCID(params->module_idP, UE_id2);
|
int pCCid2 = UE_PCCID(params->module_idP, UE_id2);
|
||||||
int round2 = maxround(params->module_idP, rnti2, params->frameP,
|
int round2 = maxround_ul(params->module_idP, rnti2, params->sched_frameP,
|
||||||
params->subframeP, 1);
|
params->sched_subframeP);
|
||||||
|
|
||||||
if (round1 > round2)
|
if (round1 > round2)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -1984,14 +2014,14 @@ static int ue_ul_compare(const void *_a, const void *_b, void *_params) {
|
|||||||
void
|
void
|
||||||
sort_ue_ul(module_id_t module_idP,
|
sort_ue_ul(module_id_t module_idP,
|
||||||
int slice_idx,
|
int slice_idx,
|
||||||
int frameP,
|
int sched_frameP,
|
||||||
sub_frame_t subframeP,
|
sub_frame_t sched_subframeP,
|
||||||
rnti_t *rntiTable)
|
rnti_t *rntiTable)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int list[MAX_MOBILES_PER_ENB];
|
int list[MAX_MOBILES_PER_ENB];
|
||||||
int list_size = 0;
|
int list_size = 0;
|
||||||
struct sort_ue_ul_params params = { module_idP, frameP, subframeP };
|
struct sort_ue_ul_params params = { module_idP, sched_frameP, sched_subframeP };
|
||||||
UE_list_t *UE_list = &RC.mac[module_idP]->UE_list;
|
UE_list_t *UE_list = &RC.mac[module_idP]->UE_list;
|
||||||
|
|
||||||
for (i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
|
|||||||
+510
-509
File diff suppressed because it is too large
Load Diff
+2604
-2718
File diff suppressed because it is too large
Load Diff
+240
-276
@@ -46,10 +46,12 @@
|
|||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include "platform_constants.h"
|
#include "platform_constants.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||||
#include "msc.h"
|
#include "msc.h"
|
||||||
#include "common/ngran_types.h"
|
#include "common/ngran_types.h"
|
||||||
#include "targets/COMMON/openairinterface5g_limits.h"
|
#include "targets/COMMON/openairinterface5g_limits.h"
|
||||||
|
#include "targets/RT/USER/lte-softmodem.h"
|
||||||
#include "SIMULATION/ETH_TRANSPORT/proto.h"
|
#include "SIMULATION/ETH_TRANSPORT/proto.h"
|
||||||
#include "UTIL/OSA/osa_defs.h"
|
#include "UTIL/OSA/osa_defs.h"
|
||||||
#include "openair2/RRC/NAS/nas_config.h"
|
#include "openair2/RRC/NAS/nas_config.h"
|
||||||
@@ -60,9 +62,8 @@
|
|||||||
# include "gtpv1u.h"
|
# include "gtpv1u.h"
|
||||||
|
|
||||||
#include "ENB_APP/enb_config.h"
|
#include "ENB_APP/enb_config.h"
|
||||||
#ifndef UETARGET
|
|
||||||
#include "LAYER2/PROTO_AGENT/proto_agent.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int otg_enabled;
|
extern int otg_enabled;
|
||||||
extern uint8_t nfapi_mode;
|
extern uint8_t nfapi_mode;
|
||||||
@@ -83,7 +84,7 @@ hash_table_t *pdcp_coll_p = NULL;
|
|||||||
|
|
||||||
|
|
||||||
/* pdcp module parameters and related functions*/
|
/* pdcp module parameters and related functions*/
|
||||||
static pdcp_params_t pdcp_params= {0};
|
static pdcp_params_t pdcp_params= {0,NULL};
|
||||||
|
|
||||||
uint64_t get_pdcp_optmask(void) {
|
uint64_t get_pdcp_optmask(void) {
|
||||||
return pdcp_params.optmask;
|
return pdcp_params.optmask;
|
||||||
@@ -190,22 +191,9 @@ boolean_t pdcp_data_req(
|
|||||||
sdu_buffer_sizeP);
|
sdu_buffer_sizeP);
|
||||||
LOG_UI(PDCP, "Before rlc_data_req 1, srb_flagP: %d, rb_idP: %d \n", srb_flagP, rb_idP);
|
LOG_UI(PDCP, "Before rlc_data_req 1, srb_flagP: %d, rb_idP: %d \n", srb_flagP, rb_idP);
|
||||||
}
|
}
|
||||||
#ifndef UETARGET
|
|
||||||
if (NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
|
|
||||||
/* currently, there is no support to send also the source/destinationL2Id */
|
|
||||||
proto_agent_send_rlc_data_req(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP,
|
|
||||||
confirmP, sdu_buffer_sizeP, pdcp_pdu_p);
|
|
||||||
/* assume good status */
|
|
||||||
rlc_status = RLC_OP_STATUS_OK;
|
|
||||||
|
|
||||||
} else
|
rlc_status = pdcp_params.send_rlc_data_req_func(ctxt_pP, srb_flagP, NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)?MBMS_FLAG_NO:MBMS_FLAG_YES, rb_idP, muiP,
|
||||||
#endif
|
confirmP, sdu_buffer_sizeP, pdcp_pdu_p,NULL,NULL);
|
||||||
{
|
|
||||||
rlc_status = rlc_data_req(ctxt_pP, srb_flagP, MBMS_FLAG_YES, rb_idP, muiP,
|
|
||||||
confirmP, sdu_buffer_sizeP, pdcp_pdu_p
|
|
||||||
,NULL, NULL
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
rlc_status = RLC_OP_STATUS_OUT_OF_RESSOURCES;
|
rlc_status = RLC_OP_STATUS_OUT_OF_RESSOURCES;
|
||||||
LOG_E(PDCP,PROTOCOL_CTXT_FMT" PDCP_DATA_REQ SDU DROPPED, OUT OF MEMORY \n",
|
LOG_E(PDCP,PROTOCOL_CTXT_FMT" PDCP_DATA_REQ SDU DROPPED, OUT OF MEMORY \n",
|
||||||
@@ -364,74 +352,55 @@ boolean_t pdcp_data_req(
|
|||||||
*/
|
*/
|
||||||
LOG_DUMPMSG(PDCP,DEBUG_PDCP,(char *)pdcp_pdu_p->data,pdcp_pdu_size,
|
LOG_DUMPMSG(PDCP,DEBUG_PDCP,(char *)pdcp_pdu_p->data,pdcp_pdu_size,
|
||||||
"[MSG] PDCP DL %s PDU on rb_id %d\n",(srb_flagP)? "CONTROL" : "DATA", rb_idP);
|
"[MSG] PDCP DL %s PDU on rb_id %d\n",(srb_flagP)? "CONTROL" : "DATA", rb_idP);
|
||||||
|
|
||||||
if ((pdcp_pdu_p!=NULL) && (srb_flagP == 0) && (ctxt_pP->enb_flag == 1))
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef UETARGET
|
if ((pdcp_pdu_p!=NULL) && (srb_flagP == 0) && (ctxt_pP->enb_flag == 1)) {
|
||||||
LOG_D(PDCP, "pdcp data req on drb %d, size %d, rnti %x, node_type %d \n",
|
LOG_D(PDCP, "pdcp data req on drb %d, size %d, rnti %x, node_type %d \n",
|
||||||
rb_idP, pdcp_pdu_size, ctxt_pP->rnti, RC.rrc[ctxt_pP->module_id]->node_type);
|
rb_idP, pdcp_pdu_size, ctxt_pP->rnti, RC.rrc[ctxt_pP->module_id]->node_type);
|
||||||
|
|
||||||
if (NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
|
if (ctxt_pP->enb_flag == ENB_FLAG_YES && NODE_IS_DU(RC.rrc[ctxt_pP->module_id]->node_type)) {
|
||||||
/* currently, there is no support to send also the source/destinationL2Id */
|
|
||||||
proto_agent_send_rlc_data_req(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP,
|
|
||||||
confirmP, pdcp_pdu_size, pdcp_pdu_p);
|
|
||||||
/* assume good status */
|
|
||||||
rlc_status = RLC_OP_STATUS_OK;
|
|
||||||
ret = TRUE;
|
|
||||||
LOG_D(PDCP, "proto_agent_send_rlc_data_req for UE RNTI %x, rb %d, pdu size %d \n",
|
|
||||||
ctxt_pP->rnti, rb_idP, pdcp_pdu_size);
|
|
||||||
|
|
||||||
} else if (NODE_IS_DU(RC.rrc[ctxt_pP->module_id]->node_type)){
|
|
||||||
LOG_E(PDCP, "Can't be DU, bad node type %d \n", RC.rrc[ctxt_pP->module_id]->node_type);
|
LOG_E(PDCP, "Can't be DU, bad node type %d \n", RC.rrc[ctxt_pP->module_id]->node_type);
|
||||||
ret=FALSE;
|
ret=FALSE;
|
||||||
} else
|
} else {
|
||||||
#endif
|
rlc_status = pdcp_params.send_rlc_data_req_func(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP,
|
||||||
{
|
confirmP, pdcp_pdu_size, pdcp_pdu_p,sourceL2Id,
|
||||||
rlc_status = rlc_data_req(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP,
|
destinationL2Id);
|
||||||
confirmP, pdcp_pdu_size, pdcp_pdu_p, sourceL2Id,
|
|
||||||
destinationL2Id
|
|
||||||
);
|
|
||||||
switch (rlc_status) {
|
|
||||||
case RLC_OP_STATUS_OK:
|
|
||||||
LOG_D(PDCP, "Data sending request over RLC succeeded!\n");
|
|
||||||
ret=TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RLC_OP_STATUS_BAD_PARAMETER:
|
switch (rlc_status) {
|
||||||
LOG_W(PDCP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n");
|
case RLC_OP_STATUS_OK:
|
||||||
ret= FALSE;
|
LOG_D(PDCP, "Data sending request over RLC succeeded!\n");
|
||||||
break;
|
ret=TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
case RLC_OP_STATUS_INTERNAL_ERROR:
|
case RLC_OP_STATUS_BAD_PARAMETER:
|
||||||
LOG_W(PDCP, "Data sending request over RLC failed with 'Internal Error' reason!\n");
|
LOG_W(PDCP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n");
|
||||||
ret= FALSE;
|
ret= FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RLC_OP_STATUS_OUT_OF_RESSOURCES:
|
case RLC_OP_STATUS_INTERNAL_ERROR:
|
||||||
LOG_W(PDCP, "Data sending request over RLC failed with 'Out of Resources' reason!\n");
|
LOG_W(PDCP, "Data sending request over RLC failed with 'Internal Error' reason!\n");
|
||||||
ret= FALSE;
|
ret= FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
case RLC_OP_STATUS_OUT_OF_RESSOURCES:
|
||||||
LOG_W(PDCP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status);
|
LOG_W(PDCP, "Data sending request over RLC failed with 'Out of Resources' reason!\n");
|
||||||
ret= FALSE;
|
ret= FALSE;
|
||||||
break;
|
break;
|
||||||
} // switch case
|
|
||||||
} /* end if node_type is CU */
|
|
||||||
}
|
|
||||||
else // SRB
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifndef UETARGET
|
default:
|
||||||
if (NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
|
LOG_W(PDCP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status);
|
||||||
|
ret= FALSE;
|
||||||
|
break;
|
||||||
|
} // switch case
|
||||||
|
} /* end if node_type is not DU */
|
||||||
|
} else { // SRB
|
||||||
|
if (ctxt_pP->enb_flag == ENB_FLAG_YES && NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
|
||||||
// DL transfer
|
// DL transfer
|
||||||
MessageDef *message_p;
|
MessageDef *message_p;
|
||||||
// Note: the acyual task must be TASK_PDCP_ENB, but this task is not created
|
// Note: the acyual task must be TASK_PDCP_ENB, but this task is not created
|
||||||
message_p = itti_alloc_new_message (TASK_PDCP_ENB, F1AP_DL_RRC_MESSAGE);
|
message_p = itti_alloc_new_message (TASK_PDCP_ENB, F1AP_DL_RRC_MESSAGE);
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).rrc_container = &pdcp_pdu_p->data[0] ;
|
F1AP_DL_RRC_MESSAGE (message_p).rrc_container = &pdcp_pdu_p->data[0] ;
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).rrc_container_length = pdcp_pdu_size;
|
F1AP_DL_RRC_MESSAGE (message_p).rrc_container_length = pdcp_pdu_size;
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).gNB_CU_ue_id = 0;
|
F1AP_DL_RRC_MESSAGE (message_p).gNB_CU_ue_id = 0;
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).gNB_DU_ue_id = 0;
|
F1AP_DL_RRC_MESSAGE (message_p).gNB_DU_ue_id = 0;
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).old_gNB_DU_ue_id = 0xFFFFFFFF; // unknown
|
F1AP_DL_RRC_MESSAGE (message_p).old_gNB_DU_ue_id = 0xFFFFFFFF; // unknown
|
||||||
F1AP_DL_RRC_MESSAGE (message_p).rnti = ctxt_pP->rnti;
|
F1AP_DL_RRC_MESSAGE (message_p).rnti = ctxt_pP->rnti;
|
||||||
@@ -442,10 +411,7 @@ boolean_t pdcp_data_req(
|
|||||||
//CU_send_DL_RRC_MESSAGE_TRANSFER(ctxt_pP->module_id, message_p);
|
//CU_send_DL_RRC_MESSAGE_TRANSFER(ctxt_pP->module_id, message_p);
|
||||||
LOG_I(PDCP, "Send F1AP_DL_RRC_MESSAGE with ITTI\n");
|
LOG_I(PDCP, "Send F1AP_DL_RRC_MESSAGE with ITTI\n");
|
||||||
ret=TRUE;
|
ret=TRUE;
|
||||||
|
} else {
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
rlc_status = rlc_data_req(ctxt_pP
|
rlc_status = rlc_data_req(ctxt_pP
|
||||||
, srb_flagP
|
, srb_flagP
|
||||||
, MBMS_FLAG_NO
|
, MBMS_FLAG_NO
|
||||||
@@ -454,11 +420,10 @@ boolean_t pdcp_data_req(
|
|||||||
, confirmP
|
, confirmP
|
||||||
, pdcp_pdu_size
|
, pdcp_pdu_size
|
||||||
, pdcp_pdu_p
|
, pdcp_pdu_p
|
||||||
#ifdef Rel14
|
|
||||||
,NULL
|
,NULL
|
||||||
,NULL
|
,NULL
|
||||||
#endif
|
);
|
||||||
);
|
|
||||||
switch (rlc_status) {
|
switch (rlc_status) {
|
||||||
case RLC_OP_STATUS_OK:
|
case RLC_OP_STATUS_OK:
|
||||||
LOG_D(PDCP, "Data sending request over RLC succeeded!\n");
|
LOG_D(PDCP, "Data sending request over RLC succeeded!\n");
|
||||||
@@ -719,13 +684,13 @@ pdcp_data_ind(
|
|||||||
}
|
}
|
||||||
|
|
||||||
security_ok = pdcp_validate_security(ctxt_pP,
|
security_ok = pdcp_validate_security(ctxt_pP,
|
||||||
pdcp_p,
|
pdcp_p,
|
||||||
srb_flagP,
|
srb_flagP,
|
||||||
rb_idP,
|
rb_idP,
|
||||||
pdcp_header_len,
|
pdcp_header_len,
|
||||||
rx_hfn_for_count,
|
rx_hfn_for_count,
|
||||||
pdcp_sn_for_count,
|
pdcp_sn_for_count,
|
||||||
sdu_buffer_pP->data,
|
sdu_buffer_pP->data,
|
||||||
sdu_buffer_sizeP - pdcp_tailer_len) == 0;
|
sdu_buffer_sizeP - pdcp_tailer_len) == 0;
|
||||||
|
|
||||||
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
||||||
@@ -788,35 +753,106 @@ pdcp_data_ind(
|
|||||||
payload_offset=pdcp_header_len;// PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE;
|
payload_offset=pdcp_header_len;// PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE;
|
||||||
|
|
||||||
switch (pdcp_p->rlc_mode) {
|
switch (pdcp_p->rlc_mode) {
|
||||||
case RLC_MODE_AM: {
|
case RLC_MODE_AM: {
|
||||||
/* process as described in 36.323 5.1.2.1.2 */
|
/* process as described in 36.323 5.1.2.1.2 */
|
||||||
int reordering_window;
|
int reordering_window;
|
||||||
|
|
||||||
if (pdcp_p->seq_num_size == 7)
|
if (pdcp_p->seq_num_size == 7)
|
||||||
reordering_window = REORDERING_WINDOW_SN_7BIT;
|
reordering_window = REORDERING_WINDOW_SN_7BIT;
|
||||||
else
|
else
|
||||||
reordering_window = REORDERING_WINDOW_SN_12BIT;
|
reordering_window = REORDERING_WINDOW_SN_12BIT;
|
||||||
|
|
||||||
|
if (sequence_number - pdcp_p->last_submitted_pdcp_rx_sn > reordering_window ||
|
||||||
|
(pdcp_p->last_submitted_pdcp_rx_sn - sequence_number >= 0 &&
|
||||||
|
pdcp_p->last_submitted_pdcp_rx_sn - sequence_number < reordering_window)) {
|
||||||
|
/* TODO: specs say to decipher and do header decompression */
|
||||||
|
LOG_W(PDCP,
|
||||||
|
PROTOCOL_PDCP_CTXT_FMT"discard PDU, out of\n",
|
||||||
|
PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p));
|
||||||
|
LOG_W(PDCP, "Ignoring PDU...\n");
|
||||||
|
free_mem_block(sdu_buffer_pP, __func__);
|
||||||
|
/* TODO: indicate integrity verification failure to upper layer */
|
||||||
|
return FALSE;
|
||||||
|
} else if (pdcp_p->next_pdcp_rx_sn - sequence_number > reordering_window) {
|
||||||
|
pdcp_p->rx_hfn++;
|
||||||
|
rx_hfn_for_count = pdcp_p->rx_hfn;
|
||||||
|
pdcp_sn_for_count = sequence_number;
|
||||||
|
pdcp_p->next_pdcp_rx_sn = sequence_number + 1;
|
||||||
|
} else if (sequence_number - pdcp_p->next_pdcp_rx_sn >= reordering_window) {
|
||||||
|
rx_hfn_for_count = pdcp_p->rx_hfn - 1;
|
||||||
|
pdcp_sn_for_count = sequence_number;
|
||||||
|
} else if (sequence_number >= pdcp_p->next_pdcp_rx_sn) {
|
||||||
|
rx_hfn_for_count = pdcp_p->rx_hfn;
|
||||||
|
pdcp_sn_for_count = sequence_number;
|
||||||
|
pdcp_p->next_pdcp_rx_sn = sequence_number + 1;
|
||||||
|
|
||||||
|
if (pdcp_p->next_pdcp_rx_sn > pdcp_p->maximum_pdcp_rx_sn) {
|
||||||
|
pdcp_p->next_pdcp_rx_sn = 0;
|
||||||
|
pdcp_p->rx_hfn++;
|
||||||
|
}
|
||||||
|
} else { /* sequence_number < pdcp_p->next_pdcp_rx_sn */
|
||||||
|
rx_hfn_for_count = pdcp_p->rx_hfn;
|
||||||
|
pdcp_sn_for_count = sequence_number;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdcp_p->security_activated == 1) {
|
||||||
|
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
||||||
|
start_meas(&eNB_pdcp_stats[ctxt_pP->module_id].validate_security);
|
||||||
|
} else {
|
||||||
|
start_meas(&UE_pdcp_stats[ctxt_pP->module_id].validate_security);
|
||||||
|
}
|
||||||
|
|
||||||
|
security_ok = pdcp_validate_security(ctxt_pP,
|
||||||
|
pdcp_p,
|
||||||
|
srb_flagP,
|
||||||
|
rb_idP,
|
||||||
|
pdcp_header_len,
|
||||||
|
rx_hfn_for_count,
|
||||||
|
pdcp_sn_for_count,
|
||||||
|
sdu_buffer_pP->data,
|
||||||
|
sdu_buffer_sizeP - pdcp_tailer_len) == 0;
|
||||||
|
|
||||||
|
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
||||||
|
stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].validate_security);
|
||||||
|
} else {
|
||||||
|
stop_meas(&UE_pdcp_stats[ctxt_pP->module_id].validate_security);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
security_ok = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (security_ok == 0) {
|
||||||
|
LOG_W(PDCP,
|
||||||
|
PROTOCOL_PDCP_CTXT_FMT"security not validated for incoming PDPC DRB RLC/AM PDU\n",
|
||||||
|
PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p));
|
||||||
|
LOG_W(PDCP, "Ignoring PDU...\n");
|
||||||
|
free_mem_block(sdu_buffer_pP, __func__);
|
||||||
|
/* TODO: indicate integrity verification failure to upper layer */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: specs say we have to store this PDU in a list and then deliver
|
||||||
|
* stored packets to upper layers according to a well defined
|
||||||
|
* procedure. The code below that deals with delivery is today
|
||||||
|
* too complex to do this properly, so we only send the current
|
||||||
|
* received packet. This is not correct and has to be fixed
|
||||||
|
* some day.
|
||||||
|
* In the meantime, let's pretend the last submitted PDCP SDU
|
||||||
|
* is the current one.
|
||||||
|
* TODO: we also have to deal with re-establishment PDU (control PDUs)
|
||||||
|
* that contain no SDU.
|
||||||
|
*/
|
||||||
|
pdcp_p->last_submitted_pdcp_rx_sn = sequence_number;
|
||||||
|
break;
|
||||||
|
} /* case RLC_MODE_AM */
|
||||||
|
|
||||||
|
case RLC_MODE_UM:
|
||||||
|
|
||||||
|
/* process as described in 36.323 5.1.2.1.3 */
|
||||||
|
if (sequence_number < pdcp_p->next_pdcp_rx_sn) {
|
||||||
|
pdcp_p->rx_hfn++;
|
||||||
|
}
|
||||||
|
|
||||||
if (sequence_number - pdcp_p->last_submitted_pdcp_rx_sn > reordering_window ||
|
|
||||||
(pdcp_p->last_submitted_pdcp_rx_sn - sequence_number >= 0 &&
|
|
||||||
pdcp_p->last_submitted_pdcp_rx_sn - sequence_number < reordering_window)) {
|
|
||||||
/* TODO: specs say to decipher and do header decompression */
|
|
||||||
LOG_W(PDCP,
|
|
||||||
PROTOCOL_PDCP_CTXT_FMT"discard PDU, out of\n",
|
|
||||||
PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p));
|
|
||||||
LOG_W(PDCP, "Ignoring PDU...\n");
|
|
||||||
free_mem_block(sdu_buffer_pP, __func__);
|
|
||||||
/* TODO: indicate integrity verification failure to upper layer */
|
|
||||||
return FALSE;
|
|
||||||
} else if (pdcp_p->next_pdcp_rx_sn - sequence_number > reordering_window) {
|
|
||||||
pdcp_p->rx_hfn++;
|
|
||||||
rx_hfn_for_count = pdcp_p->rx_hfn;
|
|
||||||
pdcp_sn_for_count = sequence_number;
|
|
||||||
pdcp_p->next_pdcp_rx_sn = sequence_number + 1;
|
|
||||||
} else if (sequence_number - pdcp_p->next_pdcp_rx_sn >= reordering_window) {
|
|
||||||
rx_hfn_for_count = pdcp_p->rx_hfn - 1;
|
|
||||||
pdcp_sn_for_count = sequence_number;
|
|
||||||
} else if (sequence_number >= pdcp_p->next_pdcp_rx_sn) {
|
|
||||||
rx_hfn_for_count = pdcp_p->rx_hfn;
|
rx_hfn_for_count = pdcp_p->rx_hfn;
|
||||||
pdcp_sn_for_count = sequence_number;
|
pdcp_sn_for_count = sequence_number;
|
||||||
pdcp_p->next_pdcp_rx_sn = sequence_number + 1;
|
pdcp_p->next_pdcp_rx_sn = sequence_number + 1;
|
||||||
@@ -825,119 +861,48 @@ pdcp_data_ind(
|
|||||||
pdcp_p->next_pdcp_rx_sn = 0;
|
pdcp_p->next_pdcp_rx_sn = 0;
|
||||||
pdcp_p->rx_hfn++;
|
pdcp_p->rx_hfn++;
|
||||||
}
|
}
|
||||||
} else { /* sequence_number < pdcp_p->next_pdcp_rx_sn */
|
|
||||||
rx_hfn_for_count = pdcp_p->rx_hfn;
|
|
||||||
pdcp_sn_for_count = sequence_number;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdcp_p->security_activated == 1) {
|
if (pdcp_p->security_activated == 1) {
|
||||||
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
||||||
start_meas(&eNB_pdcp_stats[ctxt_pP->module_id].validate_security);
|
start_meas(&eNB_pdcp_stats[ctxt_pP->module_id].validate_security);
|
||||||
} else {
|
} else {
|
||||||
start_meas(&UE_pdcp_stats[ctxt_pP->module_id].validate_security);
|
start_meas(&UE_pdcp_stats[ctxt_pP->module_id].validate_security);
|
||||||
}
|
}
|
||||||
|
|
||||||
security_ok = pdcp_validate_security(ctxt_pP,
|
security_ok = pdcp_validate_security(ctxt_pP,
|
||||||
pdcp_p,
|
pdcp_p,
|
||||||
srb_flagP,
|
srb_flagP,
|
||||||
rb_idP,
|
rb_idP,
|
||||||
pdcp_header_len,
|
pdcp_header_len,
|
||||||
rx_hfn_for_count,
|
rx_hfn_for_count,
|
||||||
pdcp_sn_for_count,
|
pdcp_sn_for_count,
|
||||||
sdu_buffer_pP->data,
|
sdu_buffer_pP->data,
|
||||||
sdu_buffer_sizeP - pdcp_tailer_len) == 0;
|
sdu_buffer_sizeP - pdcp_tailer_len) == 0;
|
||||||
|
|
||||||
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
||||||
stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].validate_security);
|
stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].validate_security);
|
||||||
} else {
|
} else {
|
||||||
stop_meas(&UE_pdcp_stats[ctxt_pP->module_id].validate_security);
|
stop_meas(&UE_pdcp_stats[ctxt_pP->module_id].validate_security);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
security_ok = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (security_ok == 0) {
|
|
||||||
LOG_W(PDCP,
|
|
||||||
PROTOCOL_PDCP_CTXT_FMT"security not validated for incoming PDPC DRB RLC/AM PDU\n",
|
|
||||||
PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p));
|
|
||||||
LOG_W(PDCP, "Ignoring PDU...\n");
|
|
||||||
free_mem_block(sdu_buffer_pP, __func__);
|
|
||||||
/* TODO: indicate integrity verification failure to upper layer */
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: specs say we have to store this PDU in a list and then deliver
|
|
||||||
* stored packets to upper layers according to a well defined
|
|
||||||
* procedure. The code below that deals with delivery is today
|
|
||||||
* too complex to do this properly, so we only send the current
|
|
||||||
* received packet. This is not correct and has to be fixed
|
|
||||||
* some day.
|
|
||||||
* In the meantime, let's pretend the last submitted PDCP SDU
|
|
||||||
* is the current one.
|
|
||||||
* TODO: we also have to deal with re-establishment PDU (control PDUs)
|
|
||||||
* that contain no SDU.
|
|
||||||
*/
|
|
||||||
pdcp_p->last_submitted_pdcp_rx_sn = sequence_number;
|
|
||||||
break;
|
|
||||||
} /* case RLC_MODE_AM */
|
|
||||||
|
|
||||||
case RLC_MODE_UM:
|
|
||||||
|
|
||||||
/* process as described in 36.323 5.1.2.1.3 */
|
|
||||||
if (sequence_number < pdcp_p->next_pdcp_rx_sn) {
|
|
||||||
pdcp_p->rx_hfn++;
|
|
||||||
}
|
|
||||||
|
|
||||||
rx_hfn_for_count = pdcp_p->rx_hfn;
|
|
||||||
pdcp_sn_for_count = sequence_number;
|
|
||||||
pdcp_p->next_pdcp_rx_sn = sequence_number + 1;
|
|
||||||
|
|
||||||
if (pdcp_p->next_pdcp_rx_sn > pdcp_p->maximum_pdcp_rx_sn) {
|
|
||||||
pdcp_p->next_pdcp_rx_sn = 0;
|
|
||||||
pdcp_p->rx_hfn++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdcp_p->security_activated == 1) {
|
|
||||||
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
|
||||||
start_meas(&eNB_pdcp_stats[ctxt_pP->module_id].validate_security);
|
|
||||||
} else {
|
|
||||||
start_meas(&UE_pdcp_stats[ctxt_pP->module_id].validate_security);
|
|
||||||
}
|
|
||||||
|
|
||||||
security_ok = pdcp_validate_security(ctxt_pP,
|
|
||||||
pdcp_p,
|
|
||||||
srb_flagP,
|
|
||||||
rb_idP,
|
|
||||||
pdcp_header_len,
|
|
||||||
rx_hfn_for_count,
|
|
||||||
pdcp_sn_for_count,
|
|
||||||
sdu_buffer_pP->data,
|
|
||||||
sdu_buffer_sizeP - pdcp_tailer_len) == 0;
|
|
||||||
|
|
||||||
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
|
||||||
stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].validate_security);
|
|
||||||
} else {
|
} else {
|
||||||
stop_meas(&UE_pdcp_stats[ctxt_pP->module_id].validate_security);
|
security_ok = 1;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
security_ok = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (security_ok == 0) {
|
if (security_ok == 0) {
|
||||||
LOG_W(PDCP,
|
LOG_W(PDCP,
|
||||||
PROTOCOL_PDCP_CTXT_FMT"security not validated for incoming PDPC DRB RLC/UM PDU\n",
|
PROTOCOL_PDCP_CTXT_FMT"security not validated for incoming PDPC DRB RLC/UM PDU\n",
|
||||||
PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p));
|
PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p));
|
||||||
LOG_W(PDCP, "Ignoring PDU...\n");
|
LOG_W(PDCP, "Ignoring PDU...\n");
|
||||||
free_mem_block(sdu_buffer_pP, __func__);
|
free_mem_block(sdu_buffer_pP, __func__);
|
||||||
/* TODO: indicate integrity verification failure to upper layer */
|
/* TODO: indicate integrity verification failure to upper layer */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
LOG_E(PDCP, "bad RLC mode, cannot happen.\n");
|
LOG_E(PDCP, "bad RLC mode, cannot happen.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
} /* switch (pdcp_p->rlc_mode) */
|
} /* switch (pdcp_p->rlc_mode) */
|
||||||
} else { /* MBMS_flagP == 0 */
|
} else { /* MBMS_flagP == 0 */
|
||||||
payload_offset=0;
|
payload_offset=0;
|
||||||
@@ -966,37 +931,36 @@ pdcp_data_ind(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (LINK_ENB_PDCP_TO_GTPV1U) {
|
if (LINK_ENB_PDCP_TO_GTPV1U) {
|
||||||
if ((TRUE == ctxt_pP->enb_flag) && (FALSE == srb_flagP)) {
|
if ((TRUE == ctxt_pP->enb_flag) && (FALSE == srb_flagP)) {
|
||||||
LOG_D(PDCP, "Sending packet to GTP, Calling GTPV1U_ENB_TUNNEL_DATA_REQ ue %x rab %u len %u\n",
|
LOG_D(PDCP, "Sending packet to GTP, Calling GTPV1U_ENB_TUNNEL_DATA_REQ ue %x rab %u len %u\n",
|
||||||
ctxt_pP->rnti,
|
ctxt_pP->rnti,
|
||||||
rb_id + 4,
|
rb_id + 4,
|
||||||
sdu_buffer_sizeP - payload_offset );
|
sdu_buffer_sizeP - payload_offset );
|
||||||
|
MSC_LOG_TX_MESSAGE(
|
||||||
MSC_LOG_TX_MESSAGE(
|
MSC_PDCP_ENB,
|
||||||
MSC_PDCP_ENB,
|
MSC_GTPU_ENB,
|
||||||
MSC_GTPU_ENB,
|
NULL,0,
|
||||||
NULL,0,
|
"0 GTPV1U_ENB_TUNNEL_DATA_REQ ue %x rab %u len %u",
|
||||||
"0 GTPV1U_ENB_TUNNEL_DATA_REQ ue %x rab %u len %u",
|
ctxt_pP->rnti,
|
||||||
ctxt_pP->rnti,
|
rb_id + 4,
|
||||||
rb_id + 4,
|
sdu_buffer_sizeP - payload_offset);
|
||||||
sdu_buffer_sizeP - payload_offset);
|
//LOG_T(PDCP,"Sending to GTPV1U %d bytes\n", sdu_buffer_sizeP - payload_offset);
|
||||||
//LOG_T(PDCP,"Sending to GTPV1U %d bytes\n", sdu_buffer_sizeP - payload_offset);
|
gtpu_buffer_p = itti_malloc(TASK_PDCP_ENB, TASK_GTPV1_U,
|
||||||
gtpu_buffer_p = itti_malloc(TASK_PDCP_ENB, TASK_GTPV1_U,
|
sdu_buffer_sizeP - payload_offset + GTPU_HEADER_OVERHEAD_MAX);
|
||||||
sdu_buffer_sizeP - payload_offset + GTPU_HEADER_OVERHEAD_MAX);
|
AssertFatal(gtpu_buffer_p != NULL, "OUT OF MEMORY");
|
||||||
AssertFatal(gtpu_buffer_p != NULL, "OUT OF MEMORY");
|
memcpy(>pu_buffer_p[GTPU_HEADER_OVERHEAD_MAX], &sdu_buffer_pP->data[payload_offset], sdu_buffer_sizeP - payload_offset);
|
||||||
memcpy(>pu_buffer_p[GTPU_HEADER_OVERHEAD_MAX], &sdu_buffer_pP->data[payload_offset], sdu_buffer_sizeP - payload_offset);
|
message_p = itti_alloc_new_message(TASK_PDCP_ENB, GTPV1U_ENB_TUNNEL_DATA_REQ);
|
||||||
message_p = itti_alloc_new_message(TASK_PDCP_ENB, GTPV1U_ENB_TUNNEL_DATA_REQ);
|
AssertFatal(message_p != NULL, "OUT OF MEMORY");
|
||||||
AssertFatal(message_p != NULL, "OUT OF MEMORY");
|
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).buffer = gtpu_buffer_p;
|
||||||
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).buffer = gtpu_buffer_p;
|
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).length = sdu_buffer_sizeP - payload_offset;
|
||||||
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).length = sdu_buffer_sizeP - payload_offset;
|
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).offset = GTPU_HEADER_OVERHEAD_MAX;
|
||||||
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).offset = GTPU_HEADER_OVERHEAD_MAX;
|
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rnti = ctxt_pP->rnti;
|
||||||
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rnti = ctxt_pP->rnti;
|
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rab_id = rb_id + 4;
|
||||||
GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rab_id = rb_id + 4;
|
itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p);
|
||||||
itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p);
|
packet_forwarded = TRUE;
|
||||||
packet_forwarded = TRUE;
|
}
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
packet_forwarded = FALSE;
|
packet_forwarded = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MBMS_MULTICAST_OUT
|
#ifdef MBMS_MULTICAST_OUT
|
||||||
@@ -1035,28 +999,28 @@ pdcp_data_ind(
|
|||||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->rb_id = rb_id;
|
((pdcp_data_ind_header_t *) new_sdu_p->data)->rb_id = rb_id;
|
||||||
|
|
||||||
if (EPC_MODE_ENABLED) {
|
if (EPC_MODE_ENABLED) {
|
||||||
/* for the UE compiled in S1 mode, we need 1 here
|
/* for the UE compiled in S1 mode, we need 1 here
|
||||||
* for the UE compiled in noS1 mode, we need 0
|
* for the UE compiled in noS1 mode, we need 0
|
||||||
* TODO: be sure of this
|
* TODO: be sure of this
|
||||||
*/
|
*/
|
||||||
if (nfapi_mode == 3) {
|
if (NFAPI_MODE == NFAPI_UE_STUB_PNF ) {
|
||||||
#ifdef UESIM_EXPANSION
|
#ifdef UESIM_EXPANSION
|
||||||
|
|
||||||
if (UE_NAS_USE_TUN) {
|
if (UE_NAS_USE_TUN) {
|
||||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ctxt_pP->module_id;
|
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ctxt_pP->module_id;
|
||||||
} else {
|
} else {
|
||||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = 0;
|
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ctxt_pP->module_id;
|
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ctxt_pP->module_id;
|
||||||
#endif
|
#endif
|
||||||
} else { // nfapi_mode
|
} else { // nfapi_mode
|
||||||
if (UE_NAS_USE_TUN) {
|
if (UE_NAS_USE_TUN) {
|
||||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ctxt_pP->module_id;
|
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ctxt_pP->module_id;
|
||||||
} else {
|
} else {
|
||||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = 1;
|
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = 1;
|
||||||
}
|
}
|
||||||
} // nfapi_mode
|
} // nfapi_mode
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1065,9 +1029,9 @@ pdcp_data_ind(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( LOG_DEBUGFLAG(DEBUG_PDCP) ) {
|
if( LOG_DEBUGFLAG(DEBUG_PDCP) ) {
|
||||||
static uint32_t pdcp_inst = 0;
|
static uint32_t pdcp_inst = 0;
|
||||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = pdcp_inst++;
|
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = pdcp_inst++;
|
||||||
LOG_D(PDCP, "inst=%d size=%d\n", ((pdcp_data_ind_header_t *) new_sdu_p->data)->inst, ((pdcp_data_ind_header_t *) new_sdu_p->data)->data_size);
|
LOG_D(PDCP, "inst=%d size=%d\n", ((pdcp_data_ind_header_t *) new_sdu_p->data)->inst, ((pdcp_data_ind_header_t *) new_sdu_p->data)->data_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(&new_sdu_p->data[sizeof (pdcp_data_ind_header_t)],
|
memcpy(&new_sdu_p->data[sizeof (pdcp_data_ind_header_t)],
|
||||||
@@ -1082,35 +1046,23 @@ pdcp_data_ind(
|
|||||||
sdu_buffer_sizeP - payload_offset);
|
sdu_buffer_sizeP - payload_offset);
|
||||||
//util_print_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset);
|
//util_print_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset);
|
||||||
//util_flush_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset);
|
//util_flush_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset);
|
||||||
|
|
||||||
#if defined(STOP_ON_IP_TRAFFIC_OVERLOAD)
|
|
||||||
/* This was an "orphan else" in tag 2019.w07 and discovered during merge.
|
|
||||||
* Commenting so it could be reintegrated. */
|
|
||||||
//else {
|
|
||||||
// AssertFatal(0, PROTOCOL_PDCP_CTXT_FMT" PDCP_DATA_IND SDU DROPPED, OUT OF MEMORY \n",
|
|
||||||
// PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p));
|
|
||||||
//}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update PDCP statistics */
|
/* Update PDCP statistics */
|
||||||
for (pdcp_uid=0; pdcp_uid< MAX_MOBILES_PER_ENB;pdcp_uid++){
|
for (pdcp_uid=0; pdcp_uid< MAX_MOBILES_PER_ENB; pdcp_uid++) {
|
||||||
if (pdcp_enb[ctxt_pP->module_id].rnti[pdcp_uid] == ctxt_pP->rnti ){
|
if (pdcp_enb[ctxt_pP->module_id].rnti[pdcp_uid] == ctxt_pP->rnti ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Pdcp_stats_rx[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]++;
|
Pdcp_stats_rx[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]++;
|
||||||
Pdcp_stats_rx_tmp_w[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]++;
|
Pdcp_stats_rx_tmp_w[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]++;
|
||||||
Pdcp_stats_rx_bytes[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]+=(sdu_buffer_sizeP - payload_offset);
|
Pdcp_stats_rx_bytes[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]+=(sdu_buffer_sizeP - payload_offset);
|
||||||
Pdcp_stats_rx_bytes_tmp_w[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]+=(sdu_buffer_sizeP - payload_offset);
|
Pdcp_stats_rx_bytes_tmp_w[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]+=(sdu_buffer_sizeP - payload_offset);
|
||||||
|
|
||||||
Pdcp_stats_rx_sn[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]=sequence_number;
|
Pdcp_stats_rx_sn[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]=sequence_number;
|
||||||
Pdcp_stats_rx_aiat[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]+= (pdcp_enb[ctxt_pP->module_id].sfn - Pdcp_stats_rx_iat[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]);
|
Pdcp_stats_rx_aiat[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]+= (pdcp_enb[ctxt_pP->module_id].sfn - Pdcp_stats_rx_iat[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]);
|
||||||
Pdcp_stats_rx_aiat_tmp_w[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]+=(pdcp_enb[ctxt_pP->module_id].sfn - Pdcp_stats_rx_iat[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]);
|
Pdcp_stats_rx_aiat_tmp_w[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]+=(pdcp_enb[ctxt_pP->module_id].sfn - Pdcp_stats_rx_iat[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]);
|
||||||
Pdcp_stats_rx_iat[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]=pdcp_enb[ctxt_pP->module_id].sfn;
|
Pdcp_stats_rx_iat[ctxt_pP->module_id][pdcp_uid][rb_idP+rb_offset]=pdcp_enb[ctxt_pP->module_id].sfn;
|
||||||
|
|
||||||
free_mem_block(sdu_buffer_pP, __func__);
|
free_mem_block(sdu_buffer_pP, __func__);
|
||||||
|
|
||||||
if (ctxt_pP->enb_flag) {
|
if (ctxt_pP->enb_flag) {
|
||||||
@@ -1296,8 +1248,7 @@ pdcp_run (
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_RUN, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_RUN, VCD_FUNCTION_OUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pdcp_init_stats_UE(module_id_t mod, uint16_t uid)
|
void pdcp_init_stats_UE(module_id_t mod, uint16_t uid) {
|
||||||
{
|
|
||||||
Pdcp_stats_tx_window_ms[mod][uid] = 100;
|
Pdcp_stats_tx_window_ms[mod][uid] = 100;
|
||||||
Pdcp_stats_rx_window_ms[mod][uid] = 100;
|
Pdcp_stats_rx_window_ms[mod][uid] = 100;
|
||||||
|
|
||||||
@@ -1314,7 +1265,6 @@ void pdcp_init_stats_UE(module_id_t mod, uint16_t uid)
|
|||||||
Pdcp_stats_tx_aiat_w[mod][uid][i] = 0;
|
Pdcp_stats_tx_aiat_w[mod][uid][i] = 0;
|
||||||
Pdcp_stats_tx_aiat_tmp_w[mod][uid][i] = 0;
|
Pdcp_stats_tx_aiat_tmp_w[mod][uid][i] = 0;
|
||||||
Pdcp_stats_tx_iat[mod][uid][i] = 0;
|
Pdcp_stats_tx_iat[mod][uid][i] = 0;
|
||||||
|
|
||||||
Pdcp_stats_rx[mod][uid][i] = 0;
|
Pdcp_stats_rx[mod][uid][i] = 0;
|
||||||
Pdcp_stats_rx_w[mod][uid][i] = 0;
|
Pdcp_stats_rx_w[mod][uid][i] = 0;
|
||||||
Pdcp_stats_rx_tmp_w[mod][uid][i] = 0;
|
Pdcp_stats_rx_tmp_w[mod][uid][i] = 0;
|
||||||
@@ -2186,6 +2136,16 @@ rrc_pdcp_config_req (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pdcp_data_ind_func_t get_pdcp_data_ind_func() {
|
||||||
|
return pdcp_params.pdcp_data_ind_func;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pdcp_set_rlc_funcptr(send_rlc_data_req_func_t send_rlc_data_req,
|
||||||
|
pdcp_data_ind_func_t pdcp_data_ind) {
|
||||||
|
pdcp_params.send_rlc_data_req_func = send_rlc_data_req;
|
||||||
|
pdcp_params.pdcp_data_ind_func = pdcp_data_ind;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t pdcp_module_init( uint64_t pdcp_optmask ) {
|
uint64_t pdcp_module_init( uint64_t pdcp_optmask ) {
|
||||||
/* temporary enforce netlink when UE_NAS_USE_TUN is set,
|
/* temporary enforce netlink when UE_NAS_USE_TUN is set,
|
||||||
this is while switching from noS1 as build option
|
this is while switching from noS1 as build option
|
||||||
@@ -2203,10 +2163,11 @@ uint64_t pdcp_module_init( uint64_t pdcp_optmask ) {
|
|||||||
nas_getparams();
|
nas_getparams();
|
||||||
|
|
||||||
if(UE_NAS_USE_TUN) {
|
if(UE_NAS_USE_TUN) {
|
||||||
netlink_init_tun("ue");
|
int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )?MAX_NUMBER_NETIF:1;
|
||||||
|
netlink_init_tun("ue",num_if);
|
||||||
LOG_I(PDCP, "UE pdcp will use tun interface\n");
|
LOG_I(PDCP, "UE pdcp will use tun interface\n");
|
||||||
} else if(ENB_NAS_USE_TUN) {
|
} else if(ENB_NAS_USE_TUN) {
|
||||||
netlink_init_tun("enb");
|
netlink_init_tun("enb",1);
|
||||||
nas_config(1, 1, 1, "enb");
|
nas_config(1, 1, 1, "enb");
|
||||||
LOG_I(PDCP, "ENB pdcp will use tun interface\n");
|
LOG_I(PDCP, "ENB pdcp will use tun interface\n");
|
||||||
} else {
|
} else {
|
||||||
@@ -2215,6 +2176,8 @@ uint64_t pdcp_module_init( uint64_t pdcp_optmask ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* default interface with rlc (will be modified if CU) */
|
||||||
|
pdcp_set_rlc_funcptr((send_rlc_data_req_func_t)rlc_data_req, (pdcp_data_ind_func_t) pdcp_data_ind);
|
||||||
return pdcp_params.optmask ;
|
return pdcp_params.optmask ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2301,6 +2264,7 @@ void pdcp_layer_init(void)
|
|||||||
memset(pdcp_enb, 0, sizeof(pdcp_enb_t));
|
memset(pdcp_enb, 0, sizeof(pdcp_enb_t));
|
||||||
memset(Pdcp_stats_tx_window_ms, 0, sizeof(Pdcp_stats_tx_window_ms));
|
memset(Pdcp_stats_tx_window_ms, 0, sizeof(Pdcp_stats_tx_window_ms));
|
||||||
memset(Pdcp_stats_rx_window_ms, 0, sizeof(Pdcp_stats_rx_window_ms));
|
memset(Pdcp_stats_rx_window_ms, 0, sizeof(Pdcp_stats_rx_window_ms));
|
||||||
|
|
||||||
for (i = 0; i < MAX_eNB; i++) {
|
for (i = 0; i < MAX_eNB; i++) {
|
||||||
for (j = 0; j < MAX_MOBILES_PER_ENB; j++) {
|
for (j = 0; j < MAX_MOBILES_PER_ENB; j++) {
|
||||||
Pdcp_stats_tx_window_ms[i][j]=100;
|
Pdcp_stats_tx_window_ms[i][j]=100;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
* \version 1.0
|
* \version 1.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup _pdcp PDCP
|
/** @defgroup _pdcp PDCP
|
||||||
* @ingroup _oai2
|
* @ingroup _oai2
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
@@ -51,6 +51,17 @@
|
|||||||
#include "LTE_PMCH-InfoList-r9.h"
|
#include "LTE_PMCH-InfoList-r9.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef rlc_op_status_t (*send_rlc_data_req_func_t)(const protocol_ctxt_t *const,
|
||||||
|
const srb_flag_t, const MBMS_flag_t,
|
||||||
|
const rb_id_t, const mui_t,
|
||||||
|
confirm_t, sdu_size_t, mem_block_t *,const uint32_t *const, const uint32_t *const);
|
||||||
|
typedef boolean_t (*pdcp_data_ind_func_t)( const protocol_ctxt_t *, const srb_flag_t,
|
||||||
|
const MBMS_flag_t, const rb_id_t, const sdu_size_t,
|
||||||
|
mem_block_t *,const uint32_t *const, const uint32_t *const);
|
||||||
|
/* maximum number of tun interfaces that will be created to emulates UEs */
|
||||||
|
/* UEs beyond that will be multiplexed on the same tun */
|
||||||
|
#define MAX_NUMBER_NETIF 16
|
||||||
|
|
||||||
#define PDCP_USE_NETLINK_BIT (1<< 11)
|
#define PDCP_USE_NETLINK_BIT (1<< 11)
|
||||||
#define LINK_ENB_PDCP_TO_IP_DRIVER_BIT (1<< 13)
|
#define LINK_ENB_PDCP_TO_IP_DRIVER_BIT (1<< 13)
|
||||||
#define LINK_ENB_PDCP_TO_GTPV1U_BIT (1<< 14)
|
#define LINK_ENB_PDCP_TO_GTPV1U_BIT (1<< 14)
|
||||||
@@ -58,8 +69,12 @@
|
|||||||
#define ENB_NAS_USE_TUN_BIT (1<< 16)
|
#define ENB_NAS_USE_TUN_BIT (1<< 16)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint64_t optmask;
|
uint64_t optmask;
|
||||||
|
send_rlc_data_req_func_t send_rlc_data_req_func;
|
||||||
|
pdcp_data_ind_func_t pdcp_data_ind_func;
|
||||||
} pdcp_params_t;
|
} pdcp_params_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define PDCP_USE_NETLINK ( get_pdcp_optmask() & PDCP_USE_NETLINK_BIT)
|
#define PDCP_USE_NETLINK ( get_pdcp_optmask() & PDCP_USE_NETLINK_BIT)
|
||||||
#define LINK_ENB_PDCP_TO_IP_DRIVER ( get_pdcp_optmask() & LINK_ENB_PDCP_TO_IP_DRIVER_BIT)
|
#define LINK_ENB_PDCP_TO_IP_DRIVER ( get_pdcp_optmask() & LINK_ENB_PDCP_TO_IP_DRIVER_BIT)
|
||||||
#define LINK_ENB_PDCP_TO_GTPV1U ( get_pdcp_optmask() & LINK_ENB_PDCP_TO_GTPV1U_BIT)
|
#define LINK_ENB_PDCP_TO_GTPV1U ( get_pdcp_optmask() & LINK_ENB_PDCP_TO_GTPV1U_BIT)
|
||||||
@@ -76,8 +91,8 @@ extern int pdcp_instance_cnt;
|
|||||||
#define PROTOCOL_PDCP_CTXT_FMT PROTOCOL_CTXT_FMT"[%s %02u] "
|
#define PROTOCOL_PDCP_CTXT_FMT PROTOCOL_CTXT_FMT"[%s %02u] "
|
||||||
|
|
||||||
#define PROTOCOL_PDCP_CTXT_ARGS(CTXT_Pp, pDCP_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp),\
|
#define PROTOCOL_PDCP_CTXT_ARGS(CTXT_Pp, pDCP_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp),\
|
||||||
(pDCP_Pp->is_srb) ? "SRB" : "DRB",\
|
(pDCP_Pp->is_srb) ? "SRB" : "DRB",\
|
||||||
pDCP_Pp->rb_id
|
pDCP_Pp->rb_id
|
||||||
int init_pdcp_thread(void);
|
int init_pdcp_thread(void);
|
||||||
void cleanup_pdcp_thread(void);
|
void cleanup_pdcp_thread(void);
|
||||||
|
|
||||||
@@ -121,12 +136,12 @@ typedef struct pdcp_enb_s {
|
|||||||
uint16_t uid[MAX_MOBILES_PER_ENB];
|
uint16_t uid[MAX_MOBILES_PER_ENB];
|
||||||
rnti_t rnti[MAX_MOBILES_PER_ENB];
|
rnti_t rnti[MAX_MOBILES_PER_ENB];
|
||||||
uint16_t num_ues;
|
uint16_t num_ues;
|
||||||
|
|
||||||
uint64_t sfn;
|
uint64_t sfn;
|
||||||
frame_t frame;
|
frame_t frame;
|
||||||
sub_frame_t subframe;
|
sub_frame_t subframe;
|
||||||
|
|
||||||
} pdcp_enb_t;
|
} pdcp_enb_t;
|
||||||
|
|
||||||
pdcp_enb_t pdcp_enb[MAX_NUM_CCs];
|
pdcp_enb_t pdcp_enb[MAX_NUM_CCs];
|
||||||
|
|
||||||
@@ -151,7 +166,7 @@ typedef struct pdcp_s {
|
|||||||
boolean_t is_ue;
|
boolean_t is_ue;
|
||||||
boolean_t is_srb;
|
boolean_t is_srb;
|
||||||
|
|
||||||
/* Configured security algorithms */
|
/* Configured security algorithms */
|
||||||
uint8_t cipheringAlgorithm;
|
uint8_t cipheringAlgorithm;
|
||||||
uint8_t integrityProtAlgorithm;
|
uint8_t integrityProtAlgorithm;
|
||||||
|
|
||||||
@@ -202,10 +217,6 @@ typedef struct pdcp_s {
|
|||||||
* which is not also a valid sequence number
|
* which is not also a valid sequence number
|
||||||
*/
|
*/
|
||||||
short int first_missing_pdu;
|
short int first_missing_pdu;
|
||||||
/*
|
|
||||||
* decipher using a different rx_hfn
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
} pdcp_t;
|
} pdcp_t;
|
||||||
|
|
||||||
@@ -239,13 +250,13 @@ typedef struct pdcp_mbms_s {
|
|||||||
*/
|
*/
|
||||||
boolean_t pdcp_data_req(
|
boolean_t pdcp_data_req(
|
||||||
protocol_ctxt_t *ctxt_pP,
|
protocol_ctxt_t *ctxt_pP,
|
||||||
const srb_flag_t srb_flagP,
|
const srb_flag_t srb_flagP,
|
||||||
const rb_id_t rb_id,
|
const rb_id_t rb_id,
|
||||||
const mui_t muiP,
|
const mui_t muiP,
|
||||||
const confirm_t confirmP, \
|
const confirm_t confirmP, \
|
||||||
const sdu_size_t sdu_buffer_size,
|
const sdu_size_t sdu_buffer_size,
|
||||||
unsigned char *const sdu_buffer,
|
unsigned char *const sdu_buffer,
|
||||||
const pdcp_transmission_mode_t mode
|
const pdcp_transmission_mode_t mode
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
,const uint32_t *const sourceL2Id
|
,const uint32_t *const sourceL2Id
|
||||||
,const uint32_t *const destinationL2Id
|
,const uint32_t *const destinationL2Id
|
||||||
@@ -267,10 +278,10 @@ boolean_t pdcp_data_req(
|
|||||||
*/
|
*/
|
||||||
boolean_t pdcp_data_ind(
|
boolean_t pdcp_data_ind(
|
||||||
const protocol_ctxt_t *const ctxt_pP,
|
const protocol_ctxt_t *const ctxt_pP,
|
||||||
const srb_flag_t srb_flagP,
|
const srb_flag_t srb_flagP,
|
||||||
const MBMS_flag_t MBMS_flagP,
|
const MBMS_flag_t MBMS_flagP,
|
||||||
const rb_id_t rb_id,
|
const rb_id_t rb_id,
|
||||||
const sdu_size_t sdu_buffer_size,
|
const sdu_size_t sdu_buffer_size,
|
||||||
mem_block_t *const sdu_buffer);
|
mem_block_t *const sdu_buffer);
|
||||||
|
|
||||||
/*! \fn void rrc_pdcp_config_req(const protocol_ctxt_t* const ,uint32_t,rb_id_t,uint8_t)
|
/*! \fn void rrc_pdcp_config_req(const protocol_ctxt_t* const ,uint32_t,rb_id_t,uint8_t)
|
||||||
@@ -285,10 +296,10 @@ boolean_t pdcp_data_ind(
|
|||||||
*/
|
*/
|
||||||
void rrc_pdcp_config_req (
|
void rrc_pdcp_config_req (
|
||||||
const protocol_ctxt_t *const ctxt_pP,
|
const protocol_ctxt_t *const ctxt_pP,
|
||||||
const srb_flag_t srb_flagP,
|
const srb_flag_t srb_flagP,
|
||||||
const uint32_t actionP,
|
const uint32_t actionP,
|
||||||
const rb_id_t rb_idP,
|
const rb_id_t rb_idP,
|
||||||
const uint8_t security_modeP);
|
const uint8_t security_modeP);
|
||||||
|
|
||||||
/*! \fn bool rrc_pdcp_config_asn1_req (const protocol_ctxt_t* const , SRB_ToAddModList_t* srb2add_list, DRB_ToAddModList_t* drb2add_list, DRB_ToReleaseList_t* drb2release_list)
|
/*! \fn bool rrc_pdcp_config_asn1_req (const protocol_ctxt_t* const , SRB_ToAddModList_t* srb2add_list, DRB_ToAddModList_t* drb2add_list, DRB_ToReleaseList_t* drb2release_list)
|
||||||
* \brief Function for RRC to configure a Radio Bearer.
|
* \brief Function for RRC to configure a Radio Bearer.
|
||||||
@@ -306,17 +317,17 @@ void rrc_pdcp_config_req (
|
|||||||
*/
|
*/
|
||||||
boolean_t rrc_pdcp_config_asn1_req (
|
boolean_t rrc_pdcp_config_asn1_req (
|
||||||
const protocol_ctxt_t *const ctxt_pP,
|
const protocol_ctxt_t *const ctxt_pP,
|
||||||
LTE_SRB_ToAddModList_t *const srb2add_list,
|
LTE_SRB_ToAddModList_t *const srb2add_list,
|
||||||
LTE_DRB_ToAddModList_t *const drb2add_list,
|
LTE_DRB_ToAddModList_t *const drb2add_list,
|
||||||
LTE_DRB_ToReleaseList_t *const drb2release_list,
|
LTE_DRB_ToReleaseList_t *const drb2release_list,
|
||||||
const uint8_t security_modeP,
|
const uint8_t security_modeP,
|
||||||
uint8_t *const kRRCenc,
|
uint8_t *const kRRCenc,
|
||||||
uint8_t *const kRRCint,
|
uint8_t *const kRRCint,
|
||||||
uint8_t *const kUPenc
|
uint8_t *const kUPenc
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||||
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
|
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
|
||||||
#endif
|
#endif
|
||||||
,rb_id_t *const defaultDRB
|
,rb_id_t *const defaultDRB
|
||||||
);
|
);
|
||||||
|
|
||||||
/*! \fn boolean_t pdcp_config_req_asn1 (const protocol_ctxt_t* const ctxt_pP, srb_flag_t srb_flagP, uint32_t action, rb_id_t rb_id, uint8_t rb_sn, uint8_t rb_report, uint16_t header_compression_profile, uint8_t security_mode)
|
/*! \fn boolean_t pdcp_config_req_asn1 (const protocol_ctxt_t* const ctxt_pP, srb_flag_t srb_flagP, uint32_t action, rb_id_t rb_id, uint8_t rb_sn, uint8_t rb_report, uint16_t header_compression_profile, uint8_t security_mode)
|
||||||
@@ -341,20 +352,20 @@ boolean_t rrc_pdcp_config_asn1_req (
|
|||||||
*/
|
*/
|
||||||
boolean_t pdcp_config_req_asn1 (
|
boolean_t pdcp_config_req_asn1 (
|
||||||
const protocol_ctxt_t *const ctxt_pP,
|
const protocol_ctxt_t *const ctxt_pP,
|
||||||
pdcp_t *const pdcp_pP,
|
pdcp_t *const pdcp_pP,
|
||||||
const srb_flag_t srb_flagP,
|
const srb_flag_t srb_flagP,
|
||||||
const rlc_mode_t rlc_mode,
|
const rlc_mode_t rlc_mode,
|
||||||
const uint32_t action,
|
const uint32_t action,
|
||||||
const uint16_t lc_id,
|
const uint16_t lc_id,
|
||||||
const uint16_t mch_id,
|
const uint16_t mch_id,
|
||||||
const rb_id_t rb_id,
|
const rb_id_t rb_id,
|
||||||
const uint8_t rb_sn,
|
const uint8_t rb_sn,
|
||||||
const uint8_t rb_report,
|
const uint8_t rb_report,
|
||||||
const uint16_t header_compression_profile,
|
const uint16_t header_compression_profile,
|
||||||
const uint8_t security_mode,
|
const uint8_t security_mode,
|
||||||
uint8_t *const kRRCenc,
|
uint8_t *const kRRCenc,
|
||||||
uint8_t *const kRRCint,
|
uint8_t *const kRRCint,
|
||||||
uint8_t *const kUPenc);
|
uint8_t *const kUPenc);
|
||||||
|
|
||||||
/*! \fn void pdcp_add_UE(const protocol_ctxt_t* const ctxt_pP)
|
/*! \fn void pdcp_add_UE(const protocol_ctxt_t* const ctxt_pP)
|
||||||
* \brief Function (for RRC) to add a new UE in PDCP module
|
* \brief Function (for RRC) to add a new UE in PDCP module
|
||||||
@@ -362,9 +373,9 @@ boolean_t pdcp_config_req_asn1 (
|
|||||||
* \return A status about the processing, OK or error code.
|
* \return A status about the processing, OK or error code.
|
||||||
*/
|
*/
|
||||||
void pdcp_add_UE(const protocol_ctxt_t *const ctxt_pP);
|
void pdcp_add_UE(const protocol_ctxt_t *const ctxt_pP);
|
||||||
|
|
||||||
/*! \fn boolean_t pdcp_remove_UE(const protocol_ctxt_t* const ctxt_pP)
|
/*! \fn boolean_t pdcp_remove_UE(const protocol_ctxt_t* const ctxt_pP)
|
||||||
* \brief Function for RRC to remove UE from PDCP module hashtable
|
* \brief Function for RRC to remove UE from PDCP module hashtable
|
||||||
* \param[in] ctxt_pP Running context.
|
* \param[in] ctxt_pP Running context.
|
||||||
* \return A status about the processing, OK or error code.
|
* \return A status about the processing, OK or error code.
|
||||||
*/
|
*/
|
||||||
@@ -401,7 +412,9 @@ int pdcp_fifo_flush_sdus ( const protocol_ctxt_t *const ct
|
|||||||
int pdcp_fifo_read_input_sdus_remaining_bytes ( const protocol_ctxt_t *const ctxt_pP);
|
int pdcp_fifo_read_input_sdus_remaining_bytes ( const protocol_ctxt_t *const ctxt_pP);
|
||||||
int pdcp_fifo_read_input_sdus ( const protocol_ctxt_t *const ctxt_pP);
|
int pdcp_fifo_read_input_sdus ( const protocol_ctxt_t *const ctxt_pP);
|
||||||
void pdcp_fifo_read_input_sdus_from_otg ( const protocol_ctxt_t *const ctxt_pP);
|
void pdcp_fifo_read_input_sdus_from_otg ( const protocol_ctxt_t *const ctxt_pP);
|
||||||
|
void pdcp_set_rlc_funcptr(send_rlc_data_req_func_t send_rlc_data_req,
|
||||||
|
pdcp_data_ind_func_t pdcp_data_ind);
|
||||||
|
pdcp_data_ind_func_t get_pdcp_data_ind_func(void);
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -449,26 +462,26 @@ struct sockaddr_in pdcp_sin;
|
|||||||
void pdcp_pc5_socket_init(void);
|
void pdcp_pc5_socket_init(void);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
rb_id_t rb_id;
|
rb_id_t rb_id;
|
||||||
sdu_size_t data_size;
|
sdu_size_t data_size;
|
||||||
signed int inst;
|
signed int inst;
|
||||||
ip_traffic_type_t traffic_type;
|
ip_traffic_type_t traffic_type;
|
||||||
uint32_t sourceL2Id;
|
uint32_t sourceL2Id;
|
||||||
uint32_t destinationL2Id;
|
uint32_t destinationL2Id;
|
||||||
} __attribute__((__packed__)) pc5s_header_t;
|
} __attribute__((__packed__)) pc5s_header_t;
|
||||||
|
|
||||||
//new PC5S-message
|
//new PC5S-message
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned char bytes[PC5_SIGNALLING_PAYLOAD_SIZE];
|
unsigned char bytes[PC5_SIGNALLING_PAYLOAD_SIZE];
|
||||||
} __attribute__((__packed__)) PC5SignallingMessage ;
|
} __attribute__((__packed__)) PC5SignallingMessage ;
|
||||||
|
|
||||||
//example of PC5-S messages
|
//example of PC5-S messages
|
||||||
typedef struct {
|
typedef struct {
|
||||||
pc5s_header_t pc5s_header;
|
pc5s_header_t pc5s_header;
|
||||||
union {
|
union {
|
||||||
uint8_t status;
|
uint8_t status;
|
||||||
PC5SignallingMessage pc5_signalling_message;
|
PC5SignallingMessage pc5_signalling_message;
|
||||||
} pc5sPrimitive;
|
} pc5sPrimitive;
|
||||||
} __attribute__((__packed__)) sidelink_pc5s_element;
|
} __attribute__((__packed__)) sidelink_pc5s_element;
|
||||||
|
|
||||||
|
|
||||||
@@ -513,33 +526,33 @@ sdu_size_t pdcp_input_sdu_size_read;
|
|||||||
sdu_size_t pdcp_input_sdu_remaining_size_to_read;
|
sdu_size_t pdcp_input_sdu_remaining_size_to_read;
|
||||||
|
|
||||||
#define PDCP_COLL_KEY_VALUE(mODULE_iD, rNTI, iS_eNB, rB_iD, iS_sRB) \
|
#define PDCP_COLL_KEY_VALUE(mODULE_iD, rNTI, iS_eNB, rB_iD, iS_sRB) \
|
||||||
((hash_key_t)mODULE_iD | \
|
((hash_key_t)mODULE_iD | \
|
||||||
(((hash_key_t)(rNTI)) << 8) | \
|
(((hash_key_t)(rNTI)) << 8) | \
|
||||||
(((hash_key_t)(iS_eNB)) << 24) | \
|
(((hash_key_t)(iS_eNB)) << 24) | \
|
||||||
(((hash_key_t)(rB_iD)) << 25) | \
|
(((hash_key_t)(rB_iD)) << 25) | \
|
||||||
(((hash_key_t)(iS_sRB)) << 33) | \
|
(((hash_key_t)(iS_sRB)) << 33) | \
|
||||||
(((hash_key_t)(0x55)) << 34))
|
(((hash_key_t)(0x55)) << 34))
|
||||||
|
|
||||||
// hash key to the same PDCP as indexed by PDCP_COLL_KEY_VALUE(... rB_iD, iS_sRB=0) where rB_iD
|
// hash key to the same PDCP as indexed by PDCP_COLL_KEY_VALUE(... rB_iD, iS_sRB=0) where rB_iD
|
||||||
// is the default DRB ID. The hidden code 0x55 indicates the key is indexed by (rB_iD,is_sRB)
|
// is the default DRB ID. The hidden code 0x55 indicates the key is indexed by (rB_iD,is_sRB)
|
||||||
// whereas the hidden code 0xaa indicates the key is for default DRB only
|
// whereas the hidden code 0xaa indicates the key is for default DRB only
|
||||||
#define PDCP_COLL_KEY_DEFAULT_DRB_VALUE(mODULE_iD, rNTI, iS_eNB) \
|
#define PDCP_COLL_KEY_DEFAULT_DRB_VALUE(mODULE_iD, rNTI, iS_eNB) \
|
||||||
((hash_key_t)mODULE_iD | \
|
((hash_key_t)mODULE_iD | \
|
||||||
(((hash_key_t)(rNTI)) << 8) | \
|
(((hash_key_t)(rNTI)) << 8) | \
|
||||||
(((hash_key_t)(iS_eNB)) << 24) | \
|
(((hash_key_t)(iS_eNB)) << 24) | \
|
||||||
(((hash_key_t)(0xff)) << 25) | \
|
(((hash_key_t)(0xff)) << 25) | \
|
||||||
(((hash_key_t)(0x00)) << 33) | \
|
(((hash_key_t)(0x00)) << 33) | \
|
||||||
(((hash_key_t)(0xaa)) << 34))
|
(((hash_key_t)(0xaa)) << 34))
|
||||||
|
|
||||||
// service id max val is maxServiceCount = 16 (asn1_constants.h)
|
// service id max val is maxServiceCount = 16 (asn1_constants.h)
|
||||||
|
|
||||||
#define PDCP_COLL_KEY_MBMS_VALUE(mODULE_iD, rNTI, iS_eNB, sERVICE_ID, sESSION_ID) \
|
#define PDCP_COLL_KEY_MBMS_VALUE(mODULE_iD, rNTI, iS_eNB, sERVICE_ID, sESSION_ID) \
|
||||||
((hash_key_t)mODULE_iD | \
|
((hash_key_t)mODULE_iD | \
|
||||||
(((hash_key_t)(rNTI)) << 8) | \
|
(((hash_key_t)(rNTI)) << 8) | \
|
||||||
(((hash_key_t)(iS_eNB)) << 24) | \
|
(((hash_key_t)(iS_eNB)) << 24) | \
|
||||||
(((hash_key_t)(sERVICE_ID)) << 32) | \
|
(((hash_key_t)(sERVICE_ID)) << 32) | \
|
||||||
(((hash_key_t)(sESSION_ID)) << 37) | \
|
(((hash_key_t)(sESSION_ID)) << 37) | \
|
||||||
(((hash_key_t)(0x0000000000000001)) << 63))
|
(((hash_key_t)(0x0000000000000001)) << 63))
|
||||||
|
|
||||||
extern hash_table_t *pdcp_coll_p;
|
extern hash_table_t *pdcp_coll_p;
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -39,7 +39,7 @@
|
|||||||
#include "proto_agent.h"
|
#include "proto_agent.h"
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "proto_agent_net_comm.h"
|
#include "proto_agent_net_comm.h"
|
||||||
#include "proto_agent_async.h"
|
#include "proto_agent_async.h"
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
@@ -49,58 +49,53 @@ proto_agent_instance_t proto_agent[MAX_DU];
|
|||||||
|
|
||||||
pthread_t new_thread(void *(*f)(void *), void *b);
|
pthread_t new_thread(void *(*f)(void *), void *b);
|
||||||
|
|
||||||
Protocol__FlexsplitMessage *proto_agent_timeout_fsp(void* args);
|
Protocol__FlexsplitMessage *proto_agent_timeout_fsp(void *args);
|
||||||
|
|
||||||
#define TEST_MOD 0
|
#define TEST_MOD 0
|
||||||
|
|
||||||
#define ECHO
|
#define ECHO
|
||||||
|
|
||||||
/* Server side function; upon a new connection
|
/* Server side function; upon a new connection
|
||||||
reception, sends the hello packets
|
reception, sends the hello packets
|
||||||
*/
|
*/
|
||||||
int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p)
|
int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p) {
|
||||||
{
|
|
||||||
int channel_id;
|
int channel_id;
|
||||||
|
|
||||||
// RS: CUDU does not work!
|
// RS: CUDU does not work!
|
||||||
//DevAssert(p->local_interface);
|
//DevAssert(p->local_interface);
|
||||||
//DevAssert(p->local_ipv4_address);
|
//DevAssert(p->local_ipv4_address);
|
||||||
//DevAssert(p->local_port > 1024); // "unprivileged" port
|
//DevAssert(p->local_port > 1024); // "unprivileged" port
|
||||||
//DevAssert(p->remote_ipv4_address);
|
//DevAssert(p->remote_ipv4_address);
|
||||||
//DevAssert(p->remote_port > 1024); // "unprivileged" port
|
//DevAssert(p->remote_port > 1024); // "unprivileged" port
|
||||||
|
|
||||||
proto_agent[mod_id].mod_id = mod_id;
|
proto_agent[mod_id].mod_id = mod_id;
|
||||||
proto_agent[mod_id].exit = 0;
|
proto_agent[mod_id].exit = 0;
|
||||||
|
|
||||||
/* Initialize the channel container */
|
/* Initialize the channel container */
|
||||||
|
|
||||||
/* TODO only initialize the first time */
|
/* TODO only initialize the first time */
|
||||||
proto_agent_init_channel_container();
|
proto_agent_init_channel_container();
|
||||||
|
|
||||||
/*Create the async channel info*/
|
/*Create the async channel info*/
|
||||||
proto_agent_async_channel_t *channel_info;
|
proto_agent_async_channel_t *channel_info;
|
||||||
channel_info = proto_agent_async_channel_info(mod_id, p->local_ipv4_address, p->local_port,
|
channel_info = proto_agent_async_channel_info(mod_id, p->local_ipv4_address, p->local_port,
|
||||||
p->remote_ipv4_address, p->remote_port);
|
p->remote_ipv4_address, p->remote_port);
|
||||||
|
|
||||||
if (!channel_info) goto error;
|
if (!channel_info) goto error;
|
||||||
|
|
||||||
/* Create a channel using the async channel info */
|
/* Create a channel using the async channel info */
|
||||||
channel_id = proto_agent_create_channel((void *) channel_info,
|
channel_id = proto_agent_create_channel((void *) channel_info,
|
||||||
proto_agent_async_msg_send,
|
proto_agent_async_msg_send,
|
||||||
proto_agent_async_msg_recv,
|
proto_agent_async_msg_recv,
|
||||||
proto_agent_async_release);
|
proto_agent_async_release);
|
||||||
|
|
||||||
if (channel_id <= 0) goto error;
|
if (channel_id <= 0) goto error;
|
||||||
|
|
||||||
proto_agent_channel_t *channel = proto_agent_get_channel(channel_id);
|
proto_agent_channel_t *channel = proto_agent_get_channel(channel_id);
|
||||||
if (!channel) goto error;
|
|
||||||
proto_agent[mod_id].channel = channel;
|
|
||||||
|
|
||||||
|
if (!channel) goto error;
|
||||||
|
|
||||||
|
proto_agent[mod_id].channel = channel;
|
||||||
/* Register the channel for all underlying agents (use ENB_AGENT_MAX) */
|
/* Register the channel for all underlying agents (use ENB_AGENT_MAX) */
|
||||||
proto_agent_register_channel(mod_id, channel, ENB_AGENT_MAX);
|
proto_agent_register_channel(mod_id, channel, ENB_AGENT_MAX);
|
||||||
|
|
||||||
// Code for sending the HELLO/ECHO_REQ message once a connection is established
|
// Code for sending the HELLO/ECHO_REQ message once a connection is established
|
||||||
//uint8_t *msg = NULL;
|
//uint8_t *msg = NULL;
|
||||||
//Protocol__FlexsplitMessage *init_msg=NULL;
|
//Protocol__FlexsplitMessage *init_msg=NULL;
|
||||||
|
|
||||||
//if (udp == 0)
|
//if (udp == 0)
|
||||||
//{
|
//{
|
||||||
// // If the comm is not UDP, allow the server to send the first packet over the channel
|
// // If the comm is not UDP, allow the server to send the first packet over the channel
|
||||||
@@ -112,7 +107,6 @@ int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p)
|
|||||||
// int msgsize = 0;
|
// int msgsize = 0;
|
||||||
// if (init_msg != NULL)
|
// if (init_msg != NULL)
|
||||||
// msg = proto_agent_pack_message(init_msg, &msgsize);
|
// msg = proto_agent_pack_message(init_msg, &msgsize);
|
||||||
|
|
||||||
// if (msg!= NULL)
|
// if (msg!= NULL)
|
||||||
// {
|
// {
|
||||||
// LOG_D(PROTO_AGENT, "Server sending the message over the async channel\n");
|
// LOG_D(PROTO_AGENT, "Server sending the message over the async channel\n");
|
||||||
@@ -122,23 +116,18 @@ int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p)
|
|||||||
// the server thread blocks until it reads any data
|
// the server thread blocks until it reads any data
|
||||||
// over the channel
|
// over the channel
|
||||||
// */
|
// */
|
||||||
|
|
||||||
//}
|
//}
|
||||||
|
|
||||||
proto_agent[mod_id].recv_thread = new_thread(proto_agent_receive, &proto_agent[mod_id]);
|
proto_agent[mod_id].recv_thread = new_thread(proto_agent_receive, &proto_agent[mod_id]);
|
||||||
|
|
||||||
fprintf(stderr, "[PROTO_AGENT] server started at port %s:%d\n", p->local_ipv4_address, p->local_port);
|
fprintf(stderr, "[PROTO_AGENT] server started at port %s:%d\n", p->local_ipv4_address, p->local_port);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
LOG_E(PROTO_AGENT, "there was an error\n");
|
LOG_E(PROTO_AGENT, "there was an error\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void proto_agent_stop(mod_id_t mod_id)
|
void proto_agent_stop(mod_id_t mod_id) {
|
||||||
{
|
|
||||||
if (!proto_agent[mod_id].channel) return;
|
if (!proto_agent[mod_id].channel) return;
|
||||||
|
|
||||||
/* unlock the independent read thread proto_agent_receive() */
|
/* unlock the independent read thread proto_agent_receive() */
|
||||||
proto_agent[mod_id].exit = 1;
|
proto_agent[mod_id].exit = 1;
|
||||||
proto_agent_async_msg_recv_unlock(proto_agent[mod_id].channel->channel_info);
|
proto_agent_async_msg_recv_unlock(proto_agent[mod_id].channel->channel_info);
|
||||||
@@ -171,22 +160,19 @@ void proto_agent_stop(mod_id_t mod_id)
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
proto_agent_send_rlc_data_req(const protocol_ctxt_t* const ctxt_pP,
|
rlc_op_status_t proto_agent_send_rlc_data_req(const protocol_ctxt_t *const ctxt_pP,
|
||||||
const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP,
|
const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP,
|
||||||
const rb_id_t rb_idP, const mui_t muiP,
|
const rb_id_t rb_idP, const mui_t muiP,
|
||||||
confirm_t confirmP, sdu_size_t sdu_sizeP, mem_block_t *sdu_pP)
|
confirm_t confirmP, sdu_size_t sdu_sizeP, mem_block_t *sdu_pP) {
|
||||||
{
|
|
||||||
uint8_t *msg = NULL;
|
uint8_t *msg = NULL;
|
||||||
Protocol__FlexsplitMessage *init_msg=NULL;
|
Protocol__FlexsplitMessage *init_msg=NULL;
|
||||||
int msg_flag = 0;
|
int msg_flag = 0;
|
||||||
int msgsize = 0;
|
int msgsize = 0;
|
||||||
mod_id_t mod_id = ctxt_pP->module_id;
|
mod_id_t mod_id = ctxt_pP->module_id;
|
||||||
data_req_args args;
|
data_req_args args;
|
||||||
|
|
||||||
DevAssert(proto_agent[mod_id].channel);
|
DevAssert(proto_agent[mod_id].channel);
|
||||||
DevAssert(proto_agent[mod_id].channel->channel_info);
|
DevAssert(proto_agent[mod_id].channel->channel_info);
|
||||||
|
|
||||||
args.ctxt = ctxt_pP;
|
args.ctxt = ctxt_pP;
|
||||||
args.srb_flag = srb_flagP;
|
args.srb_flag = srb_flagP;
|
||||||
args.MBMS_flag = MBMS_flagP;
|
args.MBMS_flag = MBMS_flagP;
|
||||||
@@ -195,112 +181,103 @@ proto_agent_send_rlc_data_req(const protocol_ctxt_t* const ctxt_pP,
|
|||||||
args.confirm = confirmP;
|
args.confirm = confirmP;
|
||||||
args.sdu_size = sdu_sizeP;
|
args.sdu_size = sdu_sizeP;
|
||||||
args.sdu_p = sdu_pP;
|
args.sdu_p = sdu_pP;
|
||||||
|
|
||||||
msg_flag = proto_agent_pdcp_data_req(mod_id, (void *) &args, &init_msg);
|
msg_flag = proto_agent_pdcp_data_req(mod_id, (void *) &args, &init_msg);
|
||||||
if (msg_flag != 0 || !init_msg) goto error;
|
|
||||||
|
|
||||||
msg = proto_agent_pack_message(init_msg, &msgsize);
|
|
||||||
if (!msg) goto error;
|
|
||||||
|
|
||||||
proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, proto_agent[mod_id].channel->channel_info);
|
|
||||||
|
|
||||||
|
if (msg_flag != 0 || !init_msg) goto error;
|
||||||
|
|
||||||
|
msg = proto_agent_pack_message(init_msg, &msgsize);
|
||||||
|
|
||||||
|
if (!msg) goto error;
|
||||||
|
|
||||||
|
proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, proto_agent[mod_id].channel->channel_info);
|
||||||
free_mem_block(sdu_pP, __func__);
|
free_mem_block(sdu_pP, __func__);
|
||||||
|
return 0;
|
||||||
return;
|
|
||||||
error:
|
error:
|
||||||
LOG_E(PROTO_AGENT, "PROTO_AGENT there was an error\n");
|
LOG_E(PROTO_AGENT, "PROTO_AGENT there was an error\n");
|
||||||
return;
|
return -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
proto_agent_send_pdcp_data_ind(const protocol_ctxt_t* const ctxt_pP, const srb_flag_t srb_flagP,
|
proto_agent_send_pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP, const srb_flag_t srb_flagP,
|
||||||
const MBMS_flag_t MBMS_flagP, const rb_id_t rb_idP, sdu_size_t sdu_sizeP, mem_block_t *sdu_pP)
|
const MBMS_flag_t MBMS_flagP, const rb_id_t rb_idP, sdu_size_t sdu_sizeP, mem_block_t *sdu_pP) {
|
||||||
{
|
|
||||||
uint8_t *msg = NULL;
|
uint8_t *msg = NULL;
|
||||||
Protocol__FlexsplitMessage *init_msg = NULL;
|
Protocol__FlexsplitMessage *init_msg = NULL;
|
||||||
int msg_flag = 0;
|
int msg_flag = 0;
|
||||||
int msgsize = 0;
|
int msgsize = 0;
|
||||||
mod_id_t mod_id = ctxt_pP->module_id;
|
mod_id_t mod_id = ctxt_pP->module_id;
|
||||||
data_req_args args;
|
data_req_args args;
|
||||||
|
|
||||||
DevAssert(proto_agent[mod_id].channel);
|
DevAssert(proto_agent[mod_id].channel);
|
||||||
DevAssert(proto_agent[mod_id].channel->channel_info);
|
DevAssert(proto_agent[mod_id].channel->channel_info);
|
||||||
|
|
||||||
args.ctxt = ctxt_pP;
|
args.ctxt = ctxt_pP;
|
||||||
args.srb_flag = srb_flagP;
|
args.srb_flag = srb_flagP;
|
||||||
args.MBMS_flag = MBMS_flagP;
|
args.MBMS_flag = MBMS_flagP;
|
||||||
args.rb_id = rb_idP;
|
args.rb_id = rb_idP;
|
||||||
args.sdu_size = sdu_sizeP;
|
args.sdu_size = sdu_sizeP;
|
||||||
args.sdu_p = sdu_pP;
|
args.sdu_p = sdu_pP;
|
||||||
|
|
||||||
msg_flag = proto_agent_pdcp_data_ind(mod_id, (void *) &args, &init_msg);
|
msg_flag = proto_agent_pdcp_data_ind(mod_id, (void *) &args, &init_msg);
|
||||||
|
|
||||||
if (msg_flag != 0 || !init_msg) goto error;
|
if (msg_flag != 0 || !init_msg) goto error;
|
||||||
|
|
||||||
msg = proto_agent_pack_message(init_msg, &msgsize);
|
msg = proto_agent_pack_message(init_msg, &msgsize);
|
||||||
|
|
||||||
if (!msg) goto error;
|
if (!msg) goto error;
|
||||||
|
|
||||||
proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, proto_agent[mod_id].channel->channel_info);
|
proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, proto_agent[mod_id].channel->channel_info);
|
||||||
|
|
||||||
free_mem_block(sdu_pP, __func__);
|
free_mem_block(sdu_pP, __func__);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
LOG_E(PROTO_AGENT, "there was an error in %s\n", __func__);
|
LOG_E(PROTO_AGENT, "there was an error in %s\n", __func__);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
proto_agent_receive(void *args)
|
proto_agent_receive(void *args) {
|
||||||
{
|
|
||||||
proto_agent_instance_t *inst = args;
|
proto_agent_instance_t *inst = args;
|
||||||
void *data = NULL;
|
void *data = NULL;
|
||||||
int size;
|
int size;
|
||||||
int priority;
|
int priority;
|
||||||
err_code_t err_code;
|
err_code_t err_code;
|
||||||
|
|
||||||
pthread_setname_np(pthread_self(), "proto_rx");
|
pthread_setname_np(pthread_self(), "proto_rx");
|
||||||
Protocol__FlexsplitMessage *msg;
|
Protocol__FlexsplitMessage *msg;
|
||||||
uint8_t *ser_msg;
|
uint8_t *ser_msg;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
||||||
msg = NULL;
|
msg = NULL;
|
||||||
ser_msg = NULL;
|
ser_msg = NULL;
|
||||||
|
|
||||||
if ((size = proto_agent_async_msg_recv(&data, &priority, inst->channel->channel_info)) < 0){
|
if ((size = proto_agent_async_msg_recv(&data, &priority, inst->channel->channel_info)) < 0) {
|
||||||
err_code = PROTOCOL__FLEXSPLIT_ERR__MSG_ENQUEUING;
|
err_code = PROTOCOL__FLEXSPLIT_ERR__MSG_ENQUEUING;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inst->exit) break;
|
if (inst->exit) break;
|
||||||
|
|
||||||
LOG_D(PROTO_AGENT, "Server side Received message with size %d and priority %d, calling message handle\n", size, priority);
|
LOG_D(PROTO_AGENT, "Server side Received message with size %d and priority %d, calling message handle\n", size, priority);
|
||||||
|
|
||||||
msg = proto_agent_handle_message(inst->mod_id, data, size);
|
msg = proto_agent_handle_message(inst->mod_id, data, size);
|
||||||
|
|
||||||
if (!msg) {
|
if (!msg) {
|
||||||
LOG_D(PROTO_AGENT, "msg to send back is NULL\n");
|
LOG_D(PROTO_AGENT, "msg to send back is NULL\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ser_msg = proto_agent_pack_message(msg, &size);
|
ser_msg = proto_agent_pack_message(msg, &size);
|
||||||
|
|
||||||
if (!ser_msg) {
|
if (!ser_msg) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(PROTO_AGENT, "Server sending the reply message over the async channel\n");
|
LOG_D(PROTO_AGENT, "Server sending the reply message over the async channel\n");
|
||||||
if (proto_agent_async_msg_send((void *)ser_msg, (int) size, 1, inst->channel->channel_info)){
|
|
||||||
|
if (proto_agent_async_msg_send((void *)ser_msg, (int) size, 1, inst->channel->channel_info)) {
|
||||||
err_code = PROTOCOL__FLEXSPLIT_ERR__MSG_ENQUEUING;
|
err_code = PROTOCOL__FLEXSPLIT_ERR__MSG_ENQUEUING;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(PROTO_AGENT, "sent message with size %d\n", size);
|
LOG_D(PROTO_AGENT, "sent message with size %d\n", size);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
|
return NULL;
|
||||||
error:
|
error:
|
||||||
LOG_E(PROTO_AGENT, "proto_agent_receive(): error %d occured\n",err_code);
|
LOG_E(PROTO_AGENT, "proto_agent_receive(): error %d occured\n",err_code);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
/*! \file proto_agent.h
|
/*! \file proto_agent.h
|
||||||
* \brief top level protocol agent
|
* \brief top level protocol agent
|
||||||
* \author Navid Nikaein and Xenofon Foukas
|
* \author Navid Nikaein and Xenofon Foukas
|
||||||
* \date 2016
|
* \date 2016
|
||||||
* \version 0.1
|
* \version 0.1
|
||||||
@@ -41,18 +41,18 @@
|
|||||||
#include "proto_agent_common.h"
|
#include "proto_agent_common.h"
|
||||||
|
|
||||||
|
|
||||||
void * proto_agent_receive(void *args);
|
void *proto_agent_receive(void *args);
|
||||||
|
|
||||||
int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p);
|
int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p);
|
||||||
void proto_agent_stop(mod_id_t mod_id);
|
void proto_agent_stop(mod_id_t mod_id);
|
||||||
|
|
||||||
void proto_agent_send_rlc_data_req( const protocol_ctxt_t* const ctxt_pP,
|
rlc_op_status_t proto_agent_send_rlc_data_req( const protocol_ctxt_t *const ctxt_pP,
|
||||||
const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP,
|
const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP,
|
||||||
const rb_id_t rb_idP, const mui_t muiP, confirm_t confirmP,
|
const rb_id_t rb_idP, const mui_t muiP, confirm_t confirmP,
|
||||||
sdu_size_t sdu_sizeP, mem_block_t *sdu_pP);
|
sdu_size_t sdu_sizeP, mem_block_t *sdu_pP);
|
||||||
|
|
||||||
void proto_agent_send_pdcp_data_ind(const protocol_ctxt_t* const ctxt_pP,
|
void proto_agent_send_pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
|
||||||
const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP,
|
const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP,
|
||||||
const rb_id_t rb_idP, sdu_size_t sdu_sizeP, mem_block_t *sdu_pP);
|
const rb_id_t rb_idP, sdu_size_t sdu_sizeP, mem_block_t *sdu_pP);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+19
-28
@@ -330,8 +330,6 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP,
|
|||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
mem_block_t *new_sdu_p = NULL;
|
mem_block_t *new_sdu_p = NULL;
|
||||||
rlc_mode_t rlc_mode = RLC_MODE_NONE;
|
rlc_mode_t rlc_mode = RLC_MODE_NONE;
|
||||||
rlc_union_t *rlc_union_p = NULL;
|
rlc_union_t *rlc_union_p = NULL;
|
||||||
@@ -599,34 +597,27 @@ void rlc_data_ind (
|
|||||||
rb_idP,
|
rb_idP,
|
||||||
sdu_sizeP);
|
sdu_sizeP);
|
||||||
rlc_util_print_hex_octets(RLC, (unsigned char *)sdu_pP->data, sdu_sizeP);
|
rlc_util_print_hex_octets(RLC, (unsigned char *)sdu_pP->data, sdu_sizeP);
|
||||||
|
|
||||||
|
if (ctxt_pP->enb_flag) {
|
||||||
#if T_TRACER
|
#if T_TRACER
|
||||||
|
|
||||||
if (ctxt_pP->enb_flag)
|
|
||||||
T(T_ENB_RLC_UL, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->rnti), T_INT(rb_idP), T_INT(sdu_sizeP));
|
T(T_ENB_RLC_UL, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->rnti), T_INT(rb_idP), T_INT(sdu_sizeP));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
const ngran_node_t type = RC.rrc[ctxt_pP->module_id]->node_type;
|
||||||
|
AssertFatal(type != ngran_eNB_CU && type != ngran_ng_eNB_CU && type != ngran_gNB_CU,
|
||||||
|
"Can't be CU, bad node type %d\n", type);
|
||||||
|
|
||||||
#ifndef UETARGET
|
if (NODE_IS_DU(type) && srb_flagP == 1) {
|
||||||
const ngran_node_t type = RC.rrc[ctxt_pP->module_id]->node_type;
|
MessageDef *msg = itti_alloc_new_message(TASK_RLC_ENB, F1AP_UL_RRC_MESSAGE);
|
||||||
AssertFatal(type != ngran_eNB_CU && type != ngran_ng_eNB_CU && type != ngran_gNB_CU,
|
F1AP_UL_RRC_MESSAGE(msg).rnti = ctxt_pP->rnti;
|
||||||
"Can't be CU, bad node type %d\n", type);
|
F1AP_UL_RRC_MESSAGE(msg).srb_id = rb_idP;
|
||||||
|
F1AP_UL_RRC_MESSAGE(msg).rrc_container = sdu_pP->data;
|
||||||
|
F1AP_UL_RRC_MESSAGE(msg).rrc_container_length = sdu_sizeP;
|
||||||
|
itti_send_msg_to_task(TASK_DU_F1, ENB_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} // case monolithic eNodeB or UE
|
||||||
|
|
||||||
if (NODE_IS_DU(type)) {
|
get_pdcp_data_ind_func()(ctxt_pP, srb_flagP, MBMS_flagP, rb_idP, sdu_sizeP, sdu_pP,NULL,NULL);
|
||||||
if (srb_flagP == 1) {
|
|
||||||
MessageDef *msg = itti_alloc_new_message(TASK_RLC_ENB, F1AP_UL_RRC_MESSAGE);
|
|
||||||
F1AP_UL_RRC_MESSAGE(msg).rnti = ctxt_pP->rnti;
|
|
||||||
F1AP_UL_RRC_MESSAGE(msg).srb_id = rb_idP;
|
|
||||||
F1AP_UL_RRC_MESSAGE(msg).rrc_container = sdu_pP->data;
|
|
||||||
F1AP_UL_RRC_MESSAGE(msg).rrc_container_length = sdu_sizeP;
|
|
||||||
itti_send_msg_to_task(TASK_DU_F1, ENB_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), msg);
|
|
||||||
} else {
|
|
||||||
proto_agent_send_pdcp_data_ind (ctxt_pP, srb_flagP, MBMS_flagP, rb_idP, sdu_sizeP, sdu_pP);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
{ // case monolithic eNodeB or UE
|
|
||||||
pdcp_data_ind(ctxt_pP, srb_flagP, MBMS_flagP, rb_idP, sdu_sizeP, sdu_pP);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void rlc_data_conf (const protocol_ctxt_t *const ctxt_pP,
|
void rlc_data_conf (const protocol_ctxt_t *const ctxt_pP,
|
||||||
@@ -671,12 +662,12 @@ rlc_module_init (void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (k=0; k < RLC_MAX_MBMS_LC; k++) {
|
for (k=0; k < RLC_MAX_MBMS_LC; k++) {
|
||||||
rlc_mbms_lcid2service_session_id_eNB[0][k].service_id = 0;
|
rlc_mbms_lcid2service_session_id_eNB[0][k].service_id = 0;
|
||||||
rlc_mbms_lcid2service_session_id_eNB[0][k].session_id = 0;
|
rlc_mbms_lcid2service_session_id_eNB[0][k].session_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (k=0; k < NB_RB_MBMS_MAX; k++) {
|
for (k=0; k < NB_RB_MBMS_MAX; k++) {
|
||||||
rlc_mbms_rbid2lcid_eNB[0][k] = RLC_LC_UNALLOCATED;
|
rlc_mbms_rbid2lcid_eNB[0][k] = RLC_LC_UNALLOCATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -51,13 +51,12 @@
|
|||||||
struct net_device *ue_ip_dev[UE_IP_NB_INSTANCES_MAX];
|
struct net_device *ue_ip_dev[UE_IP_NB_INSTANCES_MAX];
|
||||||
|
|
||||||
#ifdef OAI_NW_DRIVER_USE_NETLINK
|
#ifdef OAI_NW_DRIVER_USE_NETLINK
|
||||||
extern void ue_ip_netlink_release(void);
|
extern void ue_ip_netlink_release(void);
|
||||||
extern int ue_ip_netlink_init(void);
|
extern int ue_ip_netlink_init(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int ue_ip_find_inst(struct net_device *dev_pP)
|
int ue_ip_find_inst(struct net_device *dev_pP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -72,15 +71,12 @@ int ue_ip_find_inst(struct net_device *dev_pP)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
#ifndef OAI_NW_DRIVER_USE_NETLINK
|
#ifndef OAI_NW_DRIVER_USE_NETLINK
|
||||||
void *ue_ip_interrupt(void)
|
void *ue_ip_interrupt(void) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
uint8_t cxi;
|
uint8_t cxi;
|
||||||
|
|
||||||
// ue_ip_priv_t *priv_p=netdev_priv(dev_id);
|
// ue_ip_priv_t *priv_p=netdev_priv(dev_id);
|
||||||
// unsigned int flags;
|
// unsigned int flags;
|
||||||
// priv_p->lock = SPIN_LOCK_UNLOCKED;
|
// priv_p->lock = SPIN_LOCK_UNLOCKED;
|
||||||
|
|
||||||
#ifdef OAI_DRV_DEBUG_INTERRUPT
|
#ifdef OAI_DRV_DEBUG_INTERRUPT
|
||||||
printk("INTERRUPT - begin\n");
|
printk("INTERRUPT - begin\n");
|
||||||
#endif
|
#endif
|
||||||
@@ -100,9 +96,9 @@ void *ue_ip_interrupt(void)
|
|||||||
#endif //NETLINK
|
#endif //NETLINK
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0))
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0))
|
||||||
void ue_ip_timer(struct timer_list *t)
|
void ue_ip_timer(struct timer_list *t)
|
||||||
#else
|
#else
|
||||||
void ue_ip_timer(unsigned long dataP)
|
void ue_ip_timer(unsigned long dataP)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -111,7 +107,6 @@ void ue_ip_timer(unsigned long dataP)
|
|||||||
#else
|
#else
|
||||||
ue_ip_priv_t *priv_p = (ue_ip_priv_t *)dataP;
|
ue_ip_priv_t *priv_p = (ue_ip_priv_t *)dataP;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
spin_lock(&priv_p->lock);
|
spin_lock(&priv_p->lock);
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0))
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0))
|
||||||
mod_timer(&priv_p->timer, jiffies + UE_IP_TIMER_TICK);
|
mod_timer(&priv_p->timer, jiffies + UE_IP_TIMER_TICK);
|
||||||
@@ -121,7 +116,6 @@ void ue_ip_timer(unsigned long dataP)
|
|||||||
(priv_p->timer).data = dataP;
|
(priv_p->timer).data = dataP;
|
||||||
add_timer(&priv_p->timer);
|
add_timer(&priv_p->timer);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
spin_unlock(&priv_p->lock);
|
spin_unlock(&priv_p->lock);
|
||||||
return;
|
return;
|
||||||
// add_timer(&gpriv->timer);
|
// add_timer(&gpriv->timer);
|
||||||
@@ -130,11 +124,9 @@ void ue_ip_timer(unsigned long dataP)
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Called by ifconfig when the device is activated by ifconfig
|
// Called by ifconfig when the device is activated by ifconfig
|
||||||
int ue_ip_open(struct net_device *dev_pP)
|
int ue_ip_open(struct net_device *dev_pP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
ue_ip_priv_t *priv_p=netdev_priv(dev_pP);
|
ue_ip_priv_t *priv_p=netdev_priv(dev_pP);
|
||||||
|
|
||||||
// Address has already been set at init
|
// Address has already been set at init
|
||||||
#ifndef OAI_NW_DRIVER_USE_NETLINK
|
#ifndef OAI_NW_DRIVER_USE_NETLINK
|
||||||
|
|
||||||
@@ -161,18 +153,15 @@ int ue_ip_open(struct net_device *dev_pP)
|
|||||||
(priv_p->timer).function = ue_ip_timer;
|
(priv_p->timer).function = ue_ip_timer;
|
||||||
#endif
|
#endif
|
||||||
//add_timer(&priv_p->timer);
|
//add_timer(&priv_p->timer);
|
||||||
|
|
||||||
printk("[UE_IP_DRV][%s] name = %s\n", __FUNCTION__, dev_pP->name);
|
printk("[UE_IP_DRV][%s] name = %s\n", __FUNCTION__, dev_pP->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Called by ifconfig when the device is desactivated
|
// Called by ifconfig when the device is desactivated
|
||||||
int ue_ip_stop(struct net_device *dev_pP)
|
int ue_ip_stop(struct net_device *dev_pP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
ue_ip_priv_t *priv_p = netdev_priv(dev_pP);
|
ue_ip_priv_t *priv_p = netdev_priv(dev_pP);
|
||||||
|
|
||||||
printk("[UE_IP_DRV][%s] Begin\n", __FUNCTION__);
|
printk("[UE_IP_DRV][%s] Begin\n", __FUNCTION__);
|
||||||
del_timer(&(priv_p->timer));
|
del_timer(&(priv_p->timer));
|
||||||
netif_stop_queue(dev_pP);
|
netif_stop_queue(dev_pP);
|
||||||
@@ -182,12 +171,10 @@ int ue_ip_stop(struct net_device *dev_pP)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void ue_ip_teardown(struct net_device *dev_pP)
|
void ue_ip_teardown(struct net_device *dev_pP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
ue_ip_priv_t *priv_p;
|
ue_ip_priv_t *priv_p;
|
||||||
int inst;
|
int inst;
|
||||||
|
|
||||||
printk("[UE_IP_DRV][%s] Begin\n", __FUNCTION__);
|
printk("[UE_IP_DRV][%s] Begin\n", __FUNCTION__);
|
||||||
|
|
||||||
if (dev_pP) {
|
if (dev_pP) {
|
||||||
@@ -199,7 +186,6 @@ void ue_ip_teardown(struct net_device *dev_pP)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
printk("[UE_IP_DRV][%s] End\n", __FUNCTION__);
|
printk("[UE_IP_DRV][%s] End\n", __FUNCTION__);
|
||||||
} // check dev_pP
|
} // check dev_pP
|
||||||
else {
|
else {
|
||||||
@@ -207,8 +193,7 @@ void ue_ip_teardown(struct net_device *dev_pP)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int ue_ip_set_config(struct net_device *dev_pP, struct ifmap *map_pP)
|
int ue_ip_set_config(struct net_device *dev_pP, struct ifmap *map_pP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
printk("[UE_IP_DRV][%s] Begin\n", __FUNCTION__);
|
printk("[UE_IP_DRV][%s] Begin\n", __FUNCTION__);
|
||||||
|
|
||||||
@@ -231,8 +216,7 @@ int ue_ip_set_config(struct net_device *dev_pP, struct ifmap *map_pP)
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
int ue_ip_hard_start_xmit(struct sk_buff *skb_pP, struct net_device *dev_pP)
|
int ue_ip_hard_start_xmit(struct sk_buff *skb_pP, struct net_device *dev_pP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int inst;
|
int inst;
|
||||||
|
|
||||||
@@ -284,15 +268,13 @@ int ue_ip_hard_start_xmit(struct sk_buff *skb_pP, struct net_device *dev_pP)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
struct net_device_stats *ue_ip_get_stats(struct net_device *dev_pP)
|
struct net_device_stats *ue_ip_get_stats(struct net_device *dev_pP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
ue_ip_priv_t *priv_p = netdev_priv(dev_pP);
|
ue_ip_priv_t *priv_p = netdev_priv(dev_pP);
|
||||||
return &priv_p->stats;
|
return &priv_p->stats;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int ue_ip_set_mac_address(struct net_device *dev_pP, void *mac_pP)
|
int ue_ip_set_mac_address(struct net_device *dev_pP, void *mac_pP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//struct sockaddr *addr = mac_pP;
|
//struct sockaddr *addr = mac_pP;
|
||||||
printk("[UE_IP_DRV][%s] CHANGE MAC ADDRESS UNSUPPORTED\n", __FUNCTION__);
|
printk("[UE_IP_DRV][%s] CHANGE MAC ADDRESS UNSUPPORTED\n", __FUNCTION__);
|
||||||
@@ -300,8 +282,7 @@ int ue_ip_set_mac_address(struct net_device *dev_pP, void *mac_pP)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int ue_ip_change_mtu(struct net_device *dev_pP, int mtuP)
|
int ue_ip_change_mtu(struct net_device *dev_pP, int mtuP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
printk("[UE_IP_DRV][%s] CHANGE MTU %d bytes\n", __FUNCTION__, mtuP);
|
printk("[UE_IP_DRV][%s] CHANGE MTU %d bytes\n", __FUNCTION__, mtuP);
|
||||||
|
|
||||||
@@ -313,8 +294,7 @@ int ue_ip_change_mtu(struct net_device *dev_pP, int mtuP)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void ue_ip_change_rx_flags(struct net_device *dev_pP, int flagsP)
|
void ue_ip_change_rx_flags(struct net_device *dev_pP, int flagsP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
ue_ip_priv_t *priv_p = netdev_priv(dev_pP);
|
ue_ip_priv_t *priv_p = netdev_priv(dev_pP);
|
||||||
printk("[UE_IP_DRV][%s] CHANGE RX FLAGS %08X\n", __FUNCTION__, flagsP);
|
printk("[UE_IP_DRV][%s] CHANGE RX FLAGS %08X\n", __FUNCTION__, flagsP);
|
||||||
@@ -322,12 +302,10 @@ void ue_ip_change_rx_flags(struct net_device *dev_pP, int flagsP)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void ue_ip_tx_timeout(struct net_device *dev_pP)
|
void ue_ip_tx_timeout(struct net_device *dev_pP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Transmitter timeout, serious problems.
|
// Transmitter timeout, serious problems.
|
||||||
ue_ip_priv_t *priv_p = netdev_priv(dev_pP);
|
ue_ip_priv_t *priv_p = netdev_priv(dev_pP);
|
||||||
|
|
||||||
printk("[UE_IP_DRV][%s] begin\n", __FUNCTION__);
|
printk("[UE_IP_DRV][%s] begin\n", __FUNCTION__);
|
||||||
// (ue_ip_priv_t *)(dev_pP->priv_p)->stats.tx_errors++;
|
// (ue_ip_priv_t *)(dev_pP->priv_p)->stats.tx_errors++;
|
||||||
(priv_p->stats).tx_errors++;
|
(priv_p->stats).tx_errors++;
|
||||||
@@ -349,7 +327,7 @@ static const struct net_device_ops ue_ip_netdev_ops = {
|
|||||||
.ndo_set_mac_address = ue_ip_set_mac_address,
|
.ndo_set_mac_address = ue_ip_set_mac_address,
|
||||||
.ndo_set_config = ue_ip_set_config,
|
.ndo_set_config = ue_ip_set_config,
|
||||||
.ndo_do_ioctl = NULL,
|
.ndo_do_ioctl = NULL,
|
||||||
#if RHEL_RELEASE_CODE>=1797
|
#if (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1797)
|
||||||
.extended.ndo_change_mtu = ue_ip_change_mtu,
|
.extended.ndo_change_mtu = ue_ip_change_mtu,
|
||||||
#else
|
#else
|
||||||
.ndo_change_mtu = ue_ip_change_mtu,
|
.ndo_change_mtu = ue_ip_change_mtu,
|
||||||
@@ -361,8 +339,7 @@ static const struct net_device_ops ue_ip_netdev_ops = {
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Initialisation of the network device
|
// Initialisation of the network device
|
||||||
void ue_ip_init(struct net_device *dev_pP)
|
void ue_ip_init(struct net_device *dev_pP) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
ue_ip_priv_t *priv_p = NULL;
|
ue_ip_priv_t *priv_p = NULL;
|
||||||
|
|
||||||
@@ -382,13 +359,10 @@ void ue_ip_init(struct net_device *dev_pP)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int init_module (void)
|
int init_module (void) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int err,inst;
|
int err,inst;
|
||||||
char devicename[100];
|
char devicename[100];
|
||||||
|
|
||||||
|
|
||||||
// Initialize parameters shared with RRC
|
// Initialize parameters shared with RRC
|
||||||
printk("[UE_IP_DRV][%s] Starting OAI IP driver", __FUNCTION__);
|
printk("[UE_IP_DRV][%s] Starting OAI IP driver", __FUNCTION__);
|
||||||
|
|
||||||
@@ -423,15 +397,12 @@ int init_module (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void cleanup_module(void)
|
void cleanup_module(void) {
|
||||||
{
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int inst;
|
int inst;
|
||||||
|
|
||||||
printk("[UE_IP_DRV][CLEANUP] begin\n");
|
printk("[UE_IP_DRV][CLEANUP] begin\n");
|
||||||
|
|
||||||
for (inst=0; inst<UE_IP_NB_INSTANCES_MAX; inst++) {
|
for (inst=0; inst<UE_IP_NB_INSTANCES_MAX; inst++) {
|
||||||
|
|||||||
+393
-356
@@ -4,7 +4,7 @@
|
|||||||
#include "LAYER2/MAC/mac_extern.h"
|
#include "LAYER2/MAC/mac_extern.h"
|
||||||
#include "LAYER2/MAC/mac_proto.h"
|
#include "LAYER2/MAC/mac_proto.h"
|
||||||
#include "common/ran_context.h"
|
#include "common/ran_context.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#define MAX_IF_MODULES 100
|
#define MAX_IF_MODULES 100
|
||||||
|
|
||||||
IF_Module_t *if_inst[MAX_IF_MODULES];
|
IF_Module_t *if_inst[MAX_IF_MODULES];
|
||||||
@@ -15,216 +15,194 @@ extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind);
|
|||||||
extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind);
|
extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind);
|
||||||
extern int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind);
|
extern int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind);
|
||||||
extern int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind);
|
extern int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind);
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
extern uint16_t sf_ahead;
|
extern uint16_t sf_ahead;
|
||||||
uint16_t frame_cnt=0;
|
uint16_t frame_cnt=0;
|
||||||
void handle_rach(UL_IND_t *UL_info) {
|
void handle_rach(UL_IND_t *UL_info) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (UL_info->rach_ind.rach_indication_body.number_of_preambles>0) {
|
if (UL_info->rach_ind.rach_indication_body.number_of_preambles>0) {
|
||||||
|
|
||||||
AssertFatal(UL_info->rach_ind.rach_indication_body.number_of_preambles==1,"More than 1 preamble not supported\n");
|
AssertFatal(UL_info->rach_ind.rach_indication_body.number_of_preambles==1,"More than 1 preamble not supported\n");
|
||||||
UL_info->rach_ind.rach_indication_body.number_of_preambles=0;
|
UL_info->rach_ind.rach_indication_body.number_of_preambles=0;
|
||||||
LOG_D(MAC,"UL_info[Frame %d, Subframe %d] Calling initiate_ra_proc RACH:SFN/SF:%d\n",UL_info->frame,UL_info->subframe, NFAPI_SFNSF2DEC(UL_info->rach_ind.sfn_sf));
|
LOG_D(MAC,"UL_info[Frame %d, Subframe %d] Calling initiate_ra_proc RACH:SFN/SF:%d\n",UL_info->frame,UL_info->subframe, NFAPI_SFNSF2DEC(UL_info->rach_ind.sfn_sf));
|
||||||
initiate_ra_proc(UL_info->module_id,
|
initiate_ra_proc(UL_info->module_id,
|
||||||
UL_info->CC_id,
|
UL_info->CC_id,
|
||||||
NFAPI_SFNSF2SFN(UL_info->rach_ind.sfn_sf),
|
NFAPI_SFNSF2SFN(UL_info->rach_ind.sfn_sf),
|
||||||
NFAPI_SFNSF2SF(UL_info->rach_ind.sfn_sf),
|
NFAPI_SFNSF2SF(UL_info->rach_ind.sfn_sf),
|
||||||
UL_info->rach_ind.rach_indication_body.preamble_list[0].preamble_rel8.preamble,
|
UL_info->rach_ind.rach_indication_body.preamble_list[0].preamble_rel8.preamble,
|
||||||
UL_info->rach_ind.rach_indication_body.preamble_list[0].preamble_rel8.timing_advance,
|
UL_info->rach_ind.rach_indication_body.preamble_list[0].preamble_rel8.timing_advance,
|
||||||
UL_info->rach_ind.rach_indication_body.preamble_list[0].preamble_rel8.rnti
|
UL_info->rach_ind.rach_indication_body.preamble_list[0].preamble_rel8.rnti
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
,0
|
,0
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
|
|
||||||
if (UL_info->rach_ind_br.rach_indication_body.number_of_preambles>0) {
|
if (UL_info->rach_ind_br.rach_indication_body.number_of_preambles>0) {
|
||||||
|
|
||||||
AssertFatal(UL_info->rach_ind_br.rach_indication_body.number_of_preambles<5,"More than 4 preambles not supported\n");
|
AssertFatal(UL_info->rach_ind_br.rach_indication_body.number_of_preambles<5,"More than 4 preambles not supported\n");
|
||||||
for (i=0;i<UL_info->rach_ind_br.rach_indication_body.number_of_preambles;i++) {
|
|
||||||
|
for (i=0; i<UL_info->rach_ind_br.rach_indication_body.number_of_preambles; i++) {
|
||||||
AssertFatal(UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel13.rach_resource_type>0,
|
AssertFatal(UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel13.rach_resource_type>0,
|
||||||
"Got regular PRACH preamble, not BL/CE\n");
|
"Got regular PRACH preamble, not BL/CE\n");
|
||||||
LOG_D(MAC,"Frame %d, Subframe %d Calling initiate_ra_proc (CE_level %d)\n",UL_info->frame,UL_info->subframe,
|
LOG_D(MAC,"Frame %d, Subframe %d Calling initiate_ra_proc (CE_level %d)\n",UL_info->frame,UL_info->subframe,
|
||||||
|
UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel13.rach_resource_type-1);
|
||||||
UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel13.rach_resource_type-1);
|
|
||||||
UL_info->rach_ind_br.rach_indication_body.number_of_preambles=0;
|
UL_info->rach_ind_br.rach_indication_body.number_of_preambles=0;
|
||||||
|
|
||||||
initiate_ra_proc(UL_info->module_id,
|
initiate_ra_proc(UL_info->module_id,
|
||||||
UL_info->CC_id,
|
UL_info->CC_id,
|
||||||
UL_info->frame,
|
UL_info->frame,
|
||||||
UL_info->subframe,
|
UL_info->subframe,
|
||||||
UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel8.preamble,
|
UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel8.preamble,
|
||||||
UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel8.timing_advance,
|
UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel8.timing_advance,
|
||||||
UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel8.rnti,
|
UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel8.rnti,
|
||||||
UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel13.rach_resource_type);
|
UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel13.rach_resource_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
UL_info->rach_ind_br.rach_indication_body.number_of_preambles=0;
|
UL_info->rach_ind_br.rach_indication_body.number_of_preambles=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_sr(UL_IND_t *UL_info) {
|
void handle_sr(UL_IND_t *UL_info) {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (nfapi_mode == 1) // PNF
|
if (NFAPI_MODE == NFAPI_MODE_PNF) { // PNF
|
||||||
{
|
if (UL_info->sr_ind.sr_indication_body.number_of_srs>0) {
|
||||||
if (UL_info->sr_ind.sr_indication_body.number_of_srs>0)
|
|
||||||
{
|
|
||||||
oai_nfapi_sr_indication(&UL_info->sr_ind);
|
oai_nfapi_sr_indication(&UL_info->sr_ind);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
for (i=0; i<UL_info->sr_ind.sr_indication_body.number_of_srs; i++)
|
||||||
{
|
|
||||||
for (i=0;i<UL_info->sr_ind.sr_indication_body.number_of_srs;i++)
|
|
||||||
SR_indication(UL_info->module_id,
|
SR_indication(UL_info->module_id,
|
||||||
UL_info->CC_id,
|
UL_info->CC_id,
|
||||||
UL_info->frame,
|
UL_info->frame,
|
||||||
UL_info->subframe,
|
UL_info->subframe,
|
||||||
UL_info->sr_ind.sr_indication_body.sr_pdu_list[i].rx_ue_information.rnti,
|
UL_info->sr_ind.sr_indication_body.sr_pdu_list[i].rx_ue_information.rnti,
|
||||||
UL_info->sr_ind.sr_indication_body.sr_pdu_list[i].ul_cqi_information.ul_cqi);
|
UL_info->sr_ind.sr_indication_body.sr_pdu_list[i].ul_cqi_information.ul_cqi);
|
||||||
}
|
}
|
||||||
|
|
||||||
UL_info->sr_ind.sr_indication_body.number_of_srs=0;
|
UL_info->sr_ind.sr_indication_body.number_of_srs=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_cqi(UL_IND_t *UL_info) {
|
void handle_cqi(UL_IND_t *UL_info) {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (nfapi_mode == 1)
|
if (NFAPI_MODE==NFAPI_MODE_PNF) {
|
||||||
{
|
if (UL_info->cqi_ind.number_of_cqis>0) {
|
||||||
if (UL_info->cqi_ind.number_of_cqis>0)
|
|
||||||
{
|
|
||||||
LOG_D(PHY,"UL_info->cqi_ind.number_of_cqis:%d\n", UL_info->cqi_ind.number_of_cqis);
|
LOG_D(PHY,"UL_info->cqi_ind.number_of_cqis:%d\n", UL_info->cqi_ind.number_of_cqis);
|
||||||
nfapi_cqi_indication_t ind;
|
nfapi_cqi_indication_t ind;
|
||||||
|
|
||||||
ind.header.message_id = NFAPI_RX_CQI_INDICATION;
|
ind.header.message_id = NFAPI_RX_CQI_INDICATION;
|
||||||
ind.sfn_sf = UL_info->frame<<4 | UL_info->subframe;
|
ind.sfn_sf = UL_info->frame<<4 | UL_info->subframe;
|
||||||
ind.cqi_indication_body = UL_info->cqi_ind;
|
ind.cqi_indication_body = UL_info->cqi_ind;
|
||||||
|
|
||||||
oai_nfapi_cqi_indication(&ind);
|
oai_nfapi_cqi_indication(&ind);
|
||||||
|
|
||||||
UL_info->cqi_ind.number_of_cqis=0;
|
UL_info->cqi_ind.number_of_cqis=0;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
for (i=0; i<UL_info->cqi_ind.number_of_cqis; i++)
|
||||||
{
|
|
||||||
for (i=0;i<UL_info->cqi_ind.number_of_cqis;i++)
|
|
||||||
cqi_indication(UL_info->module_id,
|
cqi_indication(UL_info->module_id,
|
||||||
UL_info->CC_id,
|
UL_info->CC_id,
|
||||||
UL_info->frame,
|
UL_info->frame,
|
||||||
UL_info->subframe,
|
UL_info->subframe,
|
||||||
UL_info->cqi_ind.cqi_pdu_list[i].rx_ue_information.rnti,
|
UL_info->cqi_ind.cqi_pdu_list[i].rx_ue_information.rnti,
|
||||||
&UL_info->cqi_ind.cqi_pdu_list[i].cqi_indication_rel9,
|
&UL_info->cqi_ind.cqi_pdu_list[i].cqi_indication_rel9,
|
||||||
UL_info->cqi_ind.cqi_raw_pdu_list[i].pdu,
|
UL_info->cqi_ind.cqi_raw_pdu_list[i].pdu,
|
||||||
&UL_info->cqi_ind.cqi_pdu_list[i].ul_cqi_information);
|
&UL_info->cqi_ind.cqi_pdu_list[i].ul_cqi_information);
|
||||||
|
|
||||||
UL_info->cqi_ind.number_of_cqis=0;
|
UL_info->cqi_ind.number_of_cqis=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_harq(UL_IND_t *UL_info) {
|
void handle_harq(UL_IND_t *UL_info) {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (nfapi_mode == 1 && UL_info->harq_ind.harq_indication_body.number_of_harqs>0) // PNF
|
if (NFAPI_MODE == NFAPI_MODE_PNF && UL_info->harq_ind.harq_indication_body.number_of_harqs>0) { // PNF
|
||||||
{
|
|
||||||
//LOG_D(PHY, "UL_info->harq_ind.harq_indication_body.number_of_harqs:%d Send to VNF\n", UL_info->harq_ind.harq_indication_body.number_of_harqs);
|
//LOG_D(PHY, "UL_info->harq_ind.harq_indication_body.number_of_harqs:%d Send to VNF\n", UL_info->harq_ind.harq_indication_body.number_of_harqs);
|
||||||
|
|
||||||
int retval = oai_nfapi_harq_indication(&UL_info->harq_ind);
|
int retval = oai_nfapi_harq_indication(&UL_info->harq_ind);
|
||||||
|
|
||||||
if (retval!=0)
|
if (retval!=0) {
|
||||||
{
|
|
||||||
LOG_E(PHY, "Failed to encode NFAPI HARQ_IND retval:%d\n", retval);
|
LOG_E(PHY, "Failed to encode NFAPI HARQ_IND retval:%d\n", retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
UL_info->harq_ind.harq_indication_body.number_of_harqs = 0;
|
UL_info->harq_ind.harq_indication_body.number_of_harqs = 0;
|
||||||
}
|
} else {
|
||||||
else
|
for (i=0; i<UL_info->harq_ind.harq_indication_body.number_of_harqs; i++)
|
||||||
{
|
|
||||||
for (i=0;i<UL_info->harq_ind.harq_indication_body.number_of_harqs;i++)
|
|
||||||
harq_indication(UL_info->module_id,
|
harq_indication(UL_info->module_id,
|
||||||
UL_info->CC_id,
|
UL_info->CC_id,
|
||||||
NFAPI_SFNSF2SFN(UL_info->harq_ind.sfn_sf),
|
NFAPI_SFNSF2SFN(UL_info->harq_ind.sfn_sf),
|
||||||
NFAPI_SFNSF2SF(UL_info->harq_ind.sfn_sf),
|
NFAPI_SFNSF2SF(UL_info->harq_ind.sfn_sf),
|
||||||
&UL_info->harq_ind.harq_indication_body.harq_pdu_list[i]);
|
&UL_info->harq_ind.harq_indication_body.harq_pdu_list[i]);
|
||||||
|
|
||||||
UL_info->harq_ind.harq_indication_body.number_of_harqs=0;
|
UL_info->harq_ind.harq_indication_body.number_of_harqs=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_ulsch(UL_IND_t *UL_info) {
|
void handle_ulsch(UL_IND_t *UL_info) {
|
||||||
|
|
||||||
int i,j;
|
int i,j;
|
||||||
|
|
||||||
if(nfapi_mode == 1)
|
if(NFAPI_MODE == NFAPI_MODE_PNF) {
|
||||||
{
|
if (UL_info->crc_ind.crc_indication_body.number_of_crcs>0) {
|
||||||
if (UL_info->crc_ind.crc_indication_body.number_of_crcs>0)
|
|
||||||
{
|
|
||||||
//LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.number_of_crcs:%d CRC_IND:SFN/SF:%d\n", UL_info->crc_ind.crc_indication_body.number_of_crcs, NFAPI_SFNSF2DEC(UL_info->crc_ind.sfn_sf));
|
//LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.number_of_crcs:%d CRC_IND:SFN/SF:%d\n", UL_info->crc_ind.crc_indication_body.number_of_crcs, NFAPI_SFNSF2DEC(UL_info->crc_ind.sfn_sf));
|
||||||
|
|
||||||
oai_nfapi_crc_indication(&UL_info->crc_ind);
|
oai_nfapi_crc_indication(&UL_info->crc_ind);
|
||||||
|
|
||||||
UL_info->crc_ind.crc_indication_body.number_of_crcs = 0;
|
UL_info->crc_ind.crc_indication_body.number_of_crcs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UL_info->rx_ind.rx_indication_body.number_of_pdus>0)
|
if (UL_info->rx_ind.rx_indication_body.number_of_pdus>0) {
|
||||||
{
|
|
||||||
//LOG_D(PHY,"UL_info->rx_ind.number_of_pdus:%d RX_IND:SFN/SF:%d\n", UL_info->rx_ind.rx_indication_body.number_of_pdus, NFAPI_SFNSF2DEC(UL_info->rx_ind.sfn_sf));
|
//LOG_D(PHY,"UL_info->rx_ind.number_of_pdus:%d RX_IND:SFN/SF:%d\n", UL_info->rx_ind.rx_indication_body.number_of_pdus, NFAPI_SFNSF2DEC(UL_info->rx_ind.sfn_sf));
|
||||||
oai_nfapi_rx_ind(&UL_info->rx_ind);
|
oai_nfapi_rx_ind(&UL_info->rx_ind);
|
||||||
UL_info->rx_ind.rx_indication_body.number_of_pdus = 0;
|
UL_info->rx_ind.rx_indication_body.number_of_pdus = 0;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (UL_info->rx_ind.rx_indication_body.number_of_pdus>0 && UL_info->crc_ind.crc_indication_body.number_of_crcs>0) {
|
if (UL_info->rx_ind.rx_indication_body.number_of_pdus>0 && UL_info->crc_ind.crc_indication_body.number_of_crcs>0) {
|
||||||
for (i=0;i<UL_info->rx_ind.rx_indication_body.number_of_pdus;i++) {
|
for (i=0; i<UL_info->rx_ind.rx_indication_body.number_of_pdus; i++) {
|
||||||
for (j=0;j<UL_info->crc_ind.crc_indication_body.number_of_crcs;j++) {
|
for (j=0; j<UL_info->crc_ind.crc_indication_body.number_of_crcs; j++) {
|
||||||
// find crc_indication j corresponding rx_indication i
|
// find crc_indication j corresponding rx_indication i
|
||||||
LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].rx_ue_information.rnti:%04x UL_info->rx_ind.rx_indication_body.rx_pdu_list[%d].rx_ue_information.rnti:%04x\n", j, UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].rx_ue_information.rnti, i, UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti);
|
LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].rx_ue_information.rnti:%04x UL_info->rx_ind.rx_indication_body.rx_pdu_list[%d].rx_ue_information.rnti:%04x\n", j,
|
||||||
|
UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].rx_ue_information.rnti, i, UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti);
|
||||||
|
|
||||||
if (UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].rx_ue_information.rnti ==
|
if (UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].rx_ue_information.rnti ==
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti) {
|
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti) {
|
||||||
LOG_D(PHY, "UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].crc_indication_rel8.crc_flag:%d\n", j, UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].crc_indication_rel8.crc_flag);
|
LOG_D(PHY, "UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].crc_indication_rel8.crc_flag:%d\n", j, UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].crc_indication_rel8.crc_flag);
|
||||||
|
|
||||||
if (UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].crc_indication_rel8.crc_flag == 1) { // CRC error indication
|
if (UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].crc_indication_rel8.crc_flag == 1) { // CRC error indication
|
||||||
LOG_D(MAC,"Frame %d, Subframe %d Calling rx_sdu (CRC error) \n",UL_info->frame,UL_info->subframe);
|
LOG_D(MAC,"Frame %d, Subframe %d Calling rx_sdu (CRC error) \n",UL_info->frame,UL_info->subframe);
|
||||||
rx_sdu(UL_info->module_id,
|
rx_sdu(UL_info->module_id,
|
||||||
UL_info->CC_id,
|
UL_info->CC_id,
|
||||||
NFAPI_SFNSF2SFN(UL_info->rx_ind.sfn_sf), //UL_info->frame,
|
NFAPI_SFNSF2SFN(UL_info->rx_ind.sfn_sf), //UL_info->frame,
|
||||||
NFAPI_SFNSF2SF(UL_info->rx_ind.sfn_sf), //UL_info->subframe,
|
NFAPI_SFNSF2SF(UL_info->rx_ind.sfn_sf), //UL_info->subframe,
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti,
|
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti,
|
||||||
(uint8_t *)NULL,
|
(uint8_t *)NULL,
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.length,
|
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.length,
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance,
|
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance,
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.ul_cqi);
|
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.ul_cqi);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
LOG_D(MAC,"Frame %d, Subframe %d Calling rx_sdu (CRC ok) \n",UL_info->frame,UL_info->subframe);
|
LOG_D(MAC,"Frame %d, Subframe %d Calling rx_sdu (CRC ok) \n",UL_info->frame,UL_info->subframe);
|
||||||
rx_sdu(UL_info->module_id,
|
rx_sdu(UL_info->module_id,
|
||||||
UL_info->CC_id,
|
UL_info->CC_id,
|
||||||
NFAPI_SFNSF2SFN(UL_info->rx_ind.sfn_sf), //UL_info->frame,
|
NFAPI_SFNSF2SFN(UL_info->rx_ind.sfn_sf), //UL_info->frame,
|
||||||
NFAPI_SFNSF2SF(UL_info->rx_ind.sfn_sf), //UL_info->subframe,
|
NFAPI_SFNSF2SF(UL_info->rx_ind.sfn_sf), //UL_info->subframe,
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti,
|
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti,
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].data,
|
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].data,
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.length,
|
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.length,
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance,
|
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance,
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.ul_cqi);
|
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.ul_cqi);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
} //if (UL_info->crc_ind.crc_pdu_list[j].rx_ue_information.rnti ==
|
} //if (UL_info->crc_ind.crc_pdu_list[j].rx_ue_information.rnti ==
|
||||||
|
|
||||||
// UL_info->rx_ind.rx_pdu_list[i].rx_ue_information.rnti)
|
// UL_info->rx_ind.rx_pdu_list[i].rx_ue_information.rnti)
|
||||||
} // for (j=0;j<UL_info->crc_ind.crc_indication_body.number_of_crcs;j++)
|
} // for (j=0;j<UL_info->crc_ind.crc_indication_body.number_of_crcs;j++)
|
||||||
} // for (i=0;i<UL_info->rx_ind.number_of_pdus;i++)
|
} // for (i=0;i<UL_info->rx_ind.number_of_pdus;i++)
|
||||||
|
|
||||||
UL_info->crc_ind.crc_indication_body.number_of_crcs=0;
|
UL_info->crc_ind.crc_indication_body.number_of_crcs=0;
|
||||||
UL_info->rx_ind.rx_indication_body.number_of_pdus = 0;
|
UL_info->rx_ind.rx_indication_body.number_of_pdus = 0;
|
||||||
} // UL_info->rx_ind.rx_indication_body.number_of_pdus>0 && UL_info->subframe && UL_info->crc_ind.crc_indication_body.number_of_crcs>0
|
} // UL_info->rx_ind.rx_indication_body.number_of_pdus>0 && UL_info->subframe && UL_info->crc_ind.crc_indication_body.number_of_crcs>0
|
||||||
else if (UL_info->rx_ind.rx_indication_body.number_of_pdus!=0 || UL_info->crc_ind.crc_indication_body.number_of_crcs!=0) {
|
else if (UL_info->rx_ind.rx_indication_body.number_of_pdus!=0 || UL_info->crc_ind.crc_indication_body.number_of_crcs!=0) {
|
||||||
LOG_E(PHY,"hoping not to have mis-match between CRC ind and RX ind - hopefully the missing message is coming shortly rx_ind:%d(SFN/SF:%05d) crc_ind:%d(SFN/SF:%05d) UL_info(SFN/SF):%04d%d\n",
|
LOG_E(PHY,"hoping not to have mis-match between CRC ind and RX ind - hopefully the missing message is coming shortly rx_ind:%d(SFN/SF:%05d) crc_ind:%d(SFN/SF:%05d) UL_info(SFN/SF):%04d%d\n",
|
||||||
UL_info->rx_ind.rx_indication_body.number_of_pdus, NFAPI_SFNSF2DEC(UL_info->rx_ind.sfn_sf),
|
UL_info->rx_ind.rx_indication_body.number_of_pdus, NFAPI_SFNSF2DEC(UL_info->rx_ind.sfn_sf),
|
||||||
UL_info->crc_ind.crc_indication_body.number_of_crcs, NFAPI_SFNSF2DEC(UL_info->crc_ind.sfn_sf),
|
UL_info->crc_ind.crc_indication_body.number_of_crcs, NFAPI_SFNSF2DEC(UL_info->crc_ind.sfn_sf),
|
||||||
UL_info->frame, UL_info->subframe);
|
UL_info->frame, UL_info->subframe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -246,257 +224,334 @@ static char s[SMAX];
|
|||||||
static int size;
|
static int size;
|
||||||
static int maxsize = SMAX;
|
static int maxsize = SMAX;
|
||||||
|
|
||||||
static void put(char x)
|
static void put(char x) {
|
||||||
{
|
if (size == maxsize) {
|
||||||
if (size == maxsize) { printf("incrase SMAX\n"); exit(1); }
|
printf("incrase SMAX\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
s[size++] = x;
|
s[size++] = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void append_string(char *t)
|
static void append_string(char *t) {
|
||||||
{
|
|
||||||
size--;
|
size--;
|
||||||
|
|
||||||
while (*t) put(*t++);
|
while (*t) put(*t++);
|
||||||
|
|
||||||
put(0);
|
put(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_ul(UL_IND_t *u)
|
static void dump_ul(UL_IND_t *u) {
|
||||||
{
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
C;
|
C;
|
||||||
A("XXXX UL mod %d CC %d f.sf %d.%d\n",
|
A("XXXX UL mod %d CC %d f.sf %d.%d\n",
|
||||||
u->module_id, u->CC_id, u->frame, u->subframe);
|
u->module_id, u->CC_id, u->frame, u->subframe);
|
||||||
|
|
||||||
A("XXXX harq_ind %d\n", u->harq_ind.harq_indication_body.number_of_harqs);
|
A("XXXX harq_ind %d\n", u->harq_ind.harq_indication_body.number_of_harqs);
|
||||||
for (i = 0; i < u->harq_ind.harq_indication_body.number_of_harqs; i++) {
|
|
||||||
nfapi_harq_indication_pdu_t *v = &u->harq_ind.harq_indication_body.harq_pdu_list[i];
|
for (i = 0; i < u->harq_ind.harq_indication_body.number_of_harqs; i++) {
|
||||||
A("XXXX harq ind %d\n", i);
|
nfapi_harq_indication_pdu_t *v = &u->harq_ind.harq_indication_body.harq_pdu_list[i];
|
||||||
A("XXXX rnti %d\n", v->rx_ue_information.rnti);
|
A("XXXX harq ind %d\n", i);
|
||||||
A("XXXX tb1 %d tb2 %d\n", v->harq_indication_fdd_rel8.harq_tb1,
|
A("XXXX rnti %d\n", v->rx_ue_information.rnti);
|
||||||
v->harq_indication_fdd_rel8.harq_tb2);
|
A("XXXX tb1 %d tb2 %d\n", v->harq_indication_fdd_rel8.harq_tb1,
|
||||||
A("XXXX number_of_ack_nack %d\n",
|
v->harq_indication_fdd_rel8.harq_tb2);
|
||||||
v->harq_indication_fdd_rel9.number_of_ack_nack);
|
A("XXXX number_of_ack_nack %d\n",
|
||||||
A("XXXX harq[0] = %d\n",
|
v->harq_indication_fdd_rel9.number_of_ack_nack);
|
||||||
v->harq_indication_fdd_rel9.harq_tb_n[0]);
|
A("XXXX harq[0] = %d\n",
|
||||||
A("XXXX harq ul_cqi %d channel %d\n", v->ul_cqi_information.ul_cqi,
|
v->harq_indication_fdd_rel9.harq_tb_n[0]);
|
||||||
v->ul_cqi_information.channel);
|
A("XXXX harq ul_cqi %d channel %d\n", v->ul_cqi_information.ul_cqi,
|
||||||
}
|
v->ul_cqi_information.channel);
|
||||||
|
}
|
||||||
|
|
||||||
A("XXXX crc_ind %d\n", u->crc_ind.crc_indication_body.number_of_crcs);
|
A("XXXX crc_ind %d\n", u->crc_ind.crc_indication_body.number_of_crcs);
|
||||||
|
|
||||||
A("XXXX sr_ind %d\n", u->sr_ind.sr_indication_body.number_of_srs);
|
A("XXXX sr_ind %d\n", u->sr_ind.sr_indication_body.number_of_srs);
|
||||||
|
|
||||||
A("XXXX cqi_ind %d\n", u->cqi_ind.number_of_cqis);
|
A("XXXX cqi_ind %d\n", u->cqi_ind.number_of_cqis);
|
||||||
for (i = 0; i < u->cqi_ind.number_of_cqis; i++) {
|
|
||||||
nfapi_cqi_indication_pdu_t *v = &u->cqi_ind.cqi_pdu_list[i];
|
for (i = 0; i < u->cqi_ind.number_of_cqis; i++) {
|
||||||
A("XXXX cqi ind %d\n", i);
|
nfapi_cqi_indication_pdu_t *v = &u->cqi_ind.cqi_pdu_list[i];
|
||||||
A("XXXX cqi ul_cqi %d channel %d\n", v->ul_cqi_information.ul_cqi,
|
A("XXXX cqi ind %d\n", i);
|
||||||
v->ul_cqi_information.channel);
|
A("XXXX cqi ul_cqi %d channel %d\n", v->ul_cqi_information.ul_cqi,
|
||||||
}
|
v->ul_cqi_information.channel);
|
||||||
|
}
|
||||||
|
|
||||||
A("XXXX rach_ind %d\n", u->rach_ind.rach_indication_body.number_of_preambles);
|
A("XXXX rach_ind %d\n", u->rach_ind.rach_indication_body.number_of_preambles);
|
||||||
|
|
||||||
A("XXXX rx_ind %d\n", u->rx_ind.rx_indication_body.number_of_pdus);
|
A("XXXX rx_ind %d\n", u->rx_ind.rx_indication_body.number_of_pdus);
|
||||||
for (i = 0; i < u->rx_ind.rx_indication_body.number_of_pdus; i++) {
|
|
||||||
nfapi_rx_indication_pdu_t *v = &u->rx_ind.rx_indication_body.rx_pdu_list[i];
|
for (i = 0; i < u->rx_ind.rx_indication_body.number_of_pdus; i++) {
|
||||||
A("XXXX rx ind %d\n", i);
|
nfapi_rx_indication_pdu_t *v = &u->rx_ind.rx_indication_body.rx_pdu_list[i];
|
||||||
A("XXXX timing_advance %d\n",
|
A("XXXX rx ind %d\n", i);
|
||||||
v->rx_indication_rel8.timing_advance);
|
A("XXXX timing_advance %d\n",
|
||||||
A("XXXX rx ul_cqi %d\n", v->rx_indication_rel8.ul_cqi);
|
v->rx_indication_rel8.timing_advance);
|
||||||
}
|
A("XXXX rx ul_cqi %d\n", v->rx_indication_rel8.ul_cqi);
|
||||||
|
}
|
||||||
|
|
||||||
LOG_I(PHY, "XXXX UL\nXXXX UL\n%s", s);
|
LOG_I(PHY, "XXXX UL\nXXXX UL\n%s", s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *DL_PDU_TYPE(int x)
|
static char *DL_PDU_TYPE(int x) {
|
||||||
{
|
|
||||||
switch (x) {
|
switch (x) {
|
||||||
case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: return "NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE";
|
case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
|
||||||
case NFAPI_DL_CONFIG_BCH_PDU_TYPE: return "NFAPI_DL_CONFIG_BCH_PDU_TYPE";
|
return "NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE";
|
||||||
case NFAPI_DL_CONFIG_MCH_PDU_TYPE: return "NFAPI_DL_CONFIG_MCH_PDU_TYPE";
|
|
||||||
case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: return "NFAPI_DL_CONFIG_DLSCH_PDU_TYPE";
|
case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
|
||||||
case NFAPI_DL_CONFIG_PCH_PDU_TYPE: return "NFAPI_DL_CONFIG_PCH_PDU_TYPE";
|
return "NFAPI_DL_CONFIG_BCH_PDU_TYPE";
|
||||||
case NFAPI_DL_CONFIG_PRS_PDU_TYPE: return "NFAPI_DL_CONFIG_PRS_PDU_TYPE";
|
|
||||||
case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: return "NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE";
|
case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
|
||||||
case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: return "NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE";
|
return "NFAPI_DL_CONFIG_MCH_PDU_TYPE";
|
||||||
case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: return "NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE";
|
|
||||||
case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: return "NFAPI_DL_CONFIG_NBCH_PDU_TYPE";
|
case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
|
||||||
case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: return "NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE";
|
return "NFAPI_DL_CONFIG_DLSCH_PDU_TYPE";
|
||||||
case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: return "NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE";
|
|
||||||
|
case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
|
||||||
|
return "NFAPI_DL_CONFIG_PCH_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
|
||||||
|
return "NFAPI_DL_CONFIG_PRS_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
|
||||||
|
return "NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
|
||||||
|
return "NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
|
||||||
|
return "NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_DL_CONFIG_NBCH_PDU_TYPE:
|
||||||
|
return "NFAPI_DL_CONFIG_NBCH_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE:
|
||||||
|
return "NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE:
|
||||||
|
return "NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE";
|
||||||
}
|
}
|
||||||
|
|
||||||
return "UNKNOWN";
|
return "UNKNOWN";
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *UL_PDU_TYPE(int x)
|
static char *UL_PDU_TYPE(int x) {
|
||||||
{
|
|
||||||
switch (x) {
|
switch (x) {
|
||||||
case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_PDU_TYPE";
|
case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE:
|
||||||
case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE";
|
return "NFAPI_UL_CONFIG_ULSCH_PDU_TYPE";
|
||||||
case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE";
|
|
||||||
case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE";
|
case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE:
|
||||||
case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE";
|
return "NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE";
|
||||||
case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE";
|
|
||||||
case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE";
|
case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE:
|
||||||
case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE";
|
return "NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE";
|
||||||
case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE";
|
|
||||||
case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE";
|
case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE:
|
||||||
case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE";
|
return "NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE";
|
||||||
case NFAPI_UL_CONFIG_SRS_PDU_TYPE: return "NFAPI_UL_CONFIG_SRS_PDU_TYPE";
|
|
||||||
case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: return "NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE";
|
case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE:
|
||||||
case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE";
|
return "NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE";
|
||||||
case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE";
|
|
||||||
case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE";
|
case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE:
|
||||||
case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: return "NFAPI_UL_CONFIG_NULSCH_PDU_TYPE";
|
return "NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE";
|
||||||
case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: return "NFAPI_UL_CONFIG_NRACH_PDU_TYPE";
|
|
||||||
|
case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_SRS_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_SRS_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_NULSCH_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_UL_CONFIG_NRACH_PDU_TYPE:
|
||||||
|
return "NFAPI_UL_CONFIG_NRACH_PDU_TYPE";
|
||||||
}
|
}
|
||||||
|
|
||||||
return "UNKNOWN";
|
return "UNKNOWN";
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *HI_DCI0_PDU_TYPE(int x)
|
static char *HI_DCI0_PDU_TYPE(int x) {
|
||||||
{
|
|
||||||
switch (x) {
|
switch (x) {
|
||||||
case NFAPI_HI_DCI0_HI_PDU_TYPE: return "NFAPI_HI_DCI0_HI_PDU_TYPE";
|
case NFAPI_HI_DCI0_HI_PDU_TYPE:
|
||||||
case NFAPI_HI_DCI0_DCI_PDU_TYPE: return "NFAPI_HI_DCI0_DCI_PDU_TYPE";
|
return "NFAPI_HI_DCI0_HI_PDU_TYPE";
|
||||||
case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: return "NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE";
|
|
||||||
case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: return "NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE";
|
case NFAPI_HI_DCI0_DCI_PDU_TYPE:
|
||||||
case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: return "NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE";
|
return "NFAPI_HI_DCI0_DCI_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE:
|
||||||
|
return "NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE:
|
||||||
|
return "NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE";
|
||||||
|
|
||||||
|
case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE:
|
||||||
|
return "NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE";
|
||||||
}
|
}
|
||||||
|
|
||||||
return "UNKNOWN";
|
return "UNKNOWN";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_dl(Sched_Rsp_t *d)
|
static void dump_dl(Sched_Rsp_t *d) {
|
||||||
{
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
C;
|
C;
|
||||||
A("XXXX DL mod %d CC %d f.sf %d.%d\n",
|
A("XXXX DL mod %d CC %d f.sf %d.%d\n",
|
||||||
d->module_id, d->CC_id, d->frame, d->subframe);
|
d->module_id, d->CC_id, d->frame, d->subframe);
|
||||||
|
|
||||||
if (d->DL_req != NULL) {
|
if (d->DL_req != NULL) {
|
||||||
nfapi_dl_config_request_body_t *v=&d->DL_req->dl_config_request_body;
|
nfapi_dl_config_request_body_t *v=&d->DL_req->dl_config_request_body;
|
||||||
nfapi_dl_config_request_pdu_t *p = v->dl_config_pdu_list;
|
nfapi_dl_config_request_pdu_t *p = v->dl_config_pdu_list;
|
||||||
A("XXXX DL_req sfnsf %d\n", d->DL_req->sfn_sf);
|
A("XXXX DL_req sfnsf %d\n", d->DL_req->sfn_sf);
|
||||||
A("XXXX PDCCH size %d\n", v->number_pdcch_ofdm_symbols);
|
A("XXXX PDCCH size %d\n", v->number_pdcch_ofdm_symbols);
|
||||||
A("XXXX DCIs %d\n", v->number_dci);
|
A("XXXX DCIs %d\n", v->number_dci);
|
||||||
A("XXXX PDUs %d\n", v->number_pdu);
|
A("XXXX PDUs %d\n", v->number_pdu);
|
||||||
A("XXXX rntis %d\n", v->number_pdsch_rnti);
|
A("XXXX rntis %d\n", v->number_pdsch_rnti);
|
||||||
A("XXXX pcfich power %d\n", v->transmission_power_pcfich);
|
A("XXXX pcfich power %d\n", v->transmission_power_pcfich);
|
||||||
for (i = 0; i < v->number_pdu; i++) {
|
|
||||||
A("XXXX pdu %d\n", i);
|
for (i = 0; i < v->number_pdu; i++) {
|
||||||
A("XXXX type %d %s\n", p[i].pdu_type, DL_PDU_TYPE(p[i].pdu_type));
|
A("XXXX pdu %d\n", i);
|
||||||
switch (p[i].pdu_type) {
|
A("XXXX type %d %s\n", p[i].pdu_type, DL_PDU_TYPE(p[i].pdu_type));
|
||||||
case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: {
|
|
||||||
nfapi_dl_config_dci_dl_pdu_rel8_t *q =
|
switch (p[i].pdu_type) {
|
||||||
&p[i].dci_dl_pdu.dci_dl_pdu_rel8;
|
case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: {
|
||||||
A("XXXX dci format %d\n", q->dci_format);
|
nfapi_dl_config_dci_dl_pdu_rel8_t *q =
|
||||||
A("XXXX cce idx %d\n", q->cce_idx);
|
&p[i].dci_dl_pdu.dci_dl_pdu_rel8;
|
||||||
A("XXXX agg lvl %d\n", q->aggregation_level);
|
A("XXXX dci format %d\n", q->dci_format);
|
||||||
A("XXXX rnti %d\n", q->rnti);
|
A("XXXX cce idx %d\n", q->cce_idx);
|
||||||
A("XXXX rb coding %8.8x\n", q->resource_block_coding);
|
A("XXXX agg lvl %d\n", q->aggregation_level);
|
||||||
A("XXXX mcs_1 %d\n", q->mcs_1);
|
A("XXXX rnti %d\n", q->rnti);
|
||||||
A("XXXX rv_1 %d\n", q->redundancy_version_1);
|
A("XXXX rb coding %8.8x\n", q->resource_block_coding);
|
||||||
A("XXXX ndi_1 %d\n", q->new_data_indicator_1);
|
A("XXXX mcs_1 %d\n", q->mcs_1);
|
||||||
A("XXXX harq pid %d\n", q->harq_process);
|
A("XXXX rv_1 %d\n", q->redundancy_version_1);
|
||||||
A("XXXX tpc %d\n", q->tpc);
|
A("XXXX ndi_1 %d\n", q->new_data_indicator_1);
|
||||||
A("XXXX tbs idx %d\n", q->transport_block_size_index);
|
A("XXXX harq pid %d\n", q->harq_process);
|
||||||
A("XXXX dl pow off %d\n", q->downlink_power_offset);
|
A("XXXX tpc %d\n", q->tpc);
|
||||||
A("XXXX rnti type %d\n", q->rnti_type);
|
A("XXXX tbs idx %d\n", q->transport_block_size_index);
|
||||||
A("XXXX xmit pow %d\n", q->transmission_power);
|
A("XXXX dl pow off %d\n", q->downlink_power_offset);
|
||||||
break;
|
A("XXXX rnti type %d\n", q->rnti_type);
|
||||||
}
|
A("XXXX xmit pow %d\n", q->transmission_power);
|
||||||
case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
|
break;
|
||||||
nfapi_dl_config_dlsch_pdu_rel8_t *q =
|
|
||||||
&p[i].dlsch_pdu.dlsch_pdu_rel8;
|
|
||||||
A("XXXX pdu_index %d\n", q->pdu_index);
|
|
||||||
A("XXXX rnti %d\n", q->rnti);
|
|
||||||
A("XXXX rv %d\n", q->redundancy_version);
|
|
||||||
A("XXXX mcs %d\n", q->modulation);
|
|
||||||
A("XXXX pa %d\n", q->pa);
|
|
||||||
break;
|
|
||||||
}}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
|
||||||
|
nfapi_dl_config_dlsch_pdu_rel8_t *q =
|
||||||
|
&p[i].dlsch_pdu.dlsch_pdu_rel8;
|
||||||
|
A("XXXX pdu_index %d\n", q->pdu_index);
|
||||||
|
A("XXXX rnti %d\n", q->rnti);
|
||||||
|
A("XXXX rv %d\n", q->redundancy_version);
|
||||||
|
A("XXXX mcs %d\n", q->modulation);
|
||||||
|
A("XXXX pa %d\n", q->pa);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d->HI_DCI0_req != NULL) {
|
||||||
|
nfapi_hi_dci0_request_body_t *v=&d->HI_DCI0_req->hi_dci0_request_body;
|
||||||
|
A("XXXX up HI_DCI0_req sfnsf %d (%d.%d)\n", d->HI_DCI0_req->sfn_sf,
|
||||||
|
d->HI_DCI0_req->sfn_sf/16, d->HI_DCI0_req->sfn_sf%16);
|
||||||
|
A("XXXX up sfnsf %d\n", v->sfnsf);
|
||||||
|
A("XXXX up DCIs %d\n", v->number_of_dci);
|
||||||
|
A("XXXX up HIs %d\n", v->number_of_hi);
|
||||||
|
|
||||||
|
for (i = 0; i < v->number_of_dci + v->number_of_hi; i++) {
|
||||||
|
nfapi_hi_dci0_request_pdu_t *p = &v->hi_dci0_pdu_list[i];
|
||||||
|
A("XXXX up pdu %d\n", i);
|
||||||
|
A("XXXX up type %d %s\n",p->pdu_type,HI_DCI0_PDU_TYPE(p->pdu_type));
|
||||||
|
|
||||||
|
if (p->pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) {
|
||||||
|
nfapi_hi_dci0_dci_pdu_rel8_t *q = &p->dci_pdu.dci_pdu_rel8;
|
||||||
|
A("XXXX up dci_format %d\n", q->dci_format);
|
||||||
|
A("XXXX up cce_index %d\n", q->cce_index);
|
||||||
|
A("XXXX up aggregation_level %d\n", q->aggregation_level);
|
||||||
|
A("XXXX up rnti %d\n", q->rnti);
|
||||||
|
A("XXXX up rb start %d\n", q->resource_block_start);
|
||||||
|
A("XXXX up # rb %d\n", q->number_of_resource_block);
|
||||||
|
A("XXXX up mcs_1 %d\n", q->mcs_1);
|
||||||
|
A("XXXX up cshift_2_for_drms %d\n", q->cyclic_shift_2_for_drms);
|
||||||
|
A("XXXX up freq hop enabled %d\n", q->frequency_hopping_enabled_flag);
|
||||||
|
A("XXXX up fre hop bits %d\n", q->frequency_hopping_bits);
|
||||||
|
A("XXXX up NDI_1 %d\n", q->new_data_indication_1);
|
||||||
|
A("XXXX up tx_antenna_seleciton %d\n", q->ue_tx_antenna_seleciton);
|
||||||
|
A("XXXX up tpc %d\n", q->tpc);
|
||||||
|
A("XXXX up cqi_csi_request %d\n", q->cqi_csi_request);
|
||||||
|
A("XXXX up ul_index %d\n", q->ul_index);
|
||||||
|
A("XXXX up dl_assignment_index %d\n", q->dl_assignment_index);
|
||||||
|
A("XXXX up tpc_bitmap %d\n", q->tpc_bitmap);
|
||||||
|
A("XXXX up transmission_power %d\n", q->transmission_power);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->HI_DCI0_req != NULL) {
|
if (p->pdu_type == NFAPI_HI_DCI0_HI_PDU_TYPE) {
|
||||||
nfapi_hi_dci0_request_body_t *v=&d->HI_DCI0_req->hi_dci0_request_body;
|
nfapi_hi_dci0_hi_pdu_rel8_t *q = &p->hi_pdu.hi_pdu_rel8;
|
||||||
A("XXXX up HI_DCI0_req sfnsf %d (%d.%d)\n", d->HI_DCI0_req->sfn_sf,
|
A("XXXX up rb start %d\n", q->resource_block_start);
|
||||||
d->HI_DCI0_req->sfn_sf/16, d->HI_DCI0_req->sfn_sf%16);
|
A("XXXX up cs2_drms %d\n", q->cyclic_shift_2_for_drms);
|
||||||
A("XXXX up sfnsf %d\n", v->sfnsf);
|
A("XXXX up ack %d\n", q->hi_value);
|
||||||
A("XXXX up DCIs %d\n", v->number_of_dci);
|
A("XXXX up i_phich %d\n", q->i_phich);
|
||||||
A("XXXX up HIs %d\n", v->number_of_hi);
|
A("XXXX up power %d\n", q->transmission_power);
|
||||||
for (i = 0; i < v->number_of_dci + v->number_of_hi; i++) {
|
|
||||||
nfapi_hi_dci0_request_pdu_t *p = &v->hi_dci0_pdu_list[i];
|
|
||||||
A("XXXX up pdu %d\n", i);
|
|
||||||
A("XXXX up type %d %s\n",p->pdu_type,HI_DCI0_PDU_TYPE(p->pdu_type));
|
|
||||||
if (p->pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) {
|
|
||||||
nfapi_hi_dci0_dci_pdu_rel8_t *q = &p->dci_pdu.dci_pdu_rel8;
|
|
||||||
A("XXXX up dci_format %d\n", q->dci_format);
|
|
||||||
A("XXXX up cce_index %d\n", q->cce_index);
|
|
||||||
A("XXXX up aggregation_level %d\n", q->aggregation_level);
|
|
||||||
A("XXXX up rnti %d\n", q->rnti);
|
|
||||||
A("XXXX up rb start %d\n", q->resource_block_start);
|
|
||||||
A("XXXX up # rb %d\n", q->number_of_resource_block);
|
|
||||||
A("XXXX up mcs_1 %d\n", q->mcs_1);
|
|
||||||
A("XXXX up cshift_2_for_drms %d\n", q->cyclic_shift_2_for_drms);
|
|
||||||
A("XXXX up freq hop enabled %d\n", q->frequency_hopping_enabled_flag);
|
|
||||||
A("XXXX up fre hop bits %d\n", q->frequency_hopping_bits);
|
|
||||||
A("XXXX up NDI_1 %d\n", q->new_data_indication_1);
|
|
||||||
A("XXXX up tx_antenna_seleciton %d\n", q->ue_tx_antenna_seleciton);
|
|
||||||
A("XXXX up tpc %d\n", q->tpc);
|
|
||||||
A("XXXX up cqi_csi_request %d\n", q->cqi_csi_request);
|
|
||||||
A("XXXX up ul_index %d\n", q->ul_index);
|
|
||||||
A("XXXX up dl_assignment_index %d\n", q->dl_assignment_index);
|
|
||||||
A("XXXX up tpc_bitmap %d\n", q->tpc_bitmap);
|
|
||||||
A("XXXX up transmission_power %d\n", q->transmission_power);
|
|
||||||
}
|
|
||||||
if (p->pdu_type == NFAPI_HI_DCI0_HI_PDU_TYPE) {
|
|
||||||
nfapi_hi_dci0_hi_pdu_rel8_t *q = &p->hi_pdu.hi_pdu_rel8;
|
|
||||||
A("XXXX up rb start %d\n", q->resource_block_start);
|
|
||||||
A("XXXX up cs2_drms %d\n", q->cyclic_shift_2_for_drms);
|
|
||||||
A("XXXX up ack %d\n", q->hi_value);
|
|
||||||
A("XXXX up i_phich %d\n", q->i_phich);
|
|
||||||
A("XXXX up power %d\n", q->transmission_power);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (d->UL_req != NULL) {
|
if (d->UL_req != NULL) {
|
||||||
nfapi_ul_config_request_body_t *v=&d->UL_req->ul_config_request_body;
|
nfapi_ul_config_request_body_t *v=&d->UL_req->ul_config_request_body;
|
||||||
A("XXXX UL_req sfnsf %d (%d.%d)\n", d->UL_req->sfn_sf,
|
A("XXXX UL_req sfnsf %d (%d.%d)\n", d->UL_req->sfn_sf,
|
||||||
d->UL_req->sfn_sf/16, d->UL_req->sfn_sf%16);
|
d->UL_req->sfn_sf/16, d->UL_req->sfn_sf%16);
|
||||||
A("XXXX PDUs %d\n", v->number_of_pdus);
|
A("XXXX PDUs %d\n", v->number_of_pdus);
|
||||||
A("XXXX ra freq %d\n", v->rach_prach_frequency_resources);
|
A("XXXX ra freq %d\n", v->rach_prach_frequency_resources);
|
||||||
A("XXXX srs? %d\n", v->srs_present);
|
A("XXXX srs? %d\n", v->srs_present);
|
||||||
for (i = 0; i < v->number_of_pdus; i++) {
|
|
||||||
nfapi_ul_config_request_pdu_t *p = &v->ul_config_pdu_list[i];
|
for (i = 0; i < v->number_of_pdus; i++) {
|
||||||
A("XXXX pdu %d\n", i);
|
nfapi_ul_config_request_pdu_t *p = &v->ul_config_pdu_list[i];
|
||||||
A("XXXX type %d %s\n", p->pdu_type, UL_PDU_TYPE(p->pdu_type));
|
A("XXXX pdu %d\n", i);
|
||||||
switch(p->pdu_type) {
|
A("XXXX type %d %s\n", p->pdu_type, UL_PDU_TYPE(p->pdu_type));
|
||||||
case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
|
|
||||||
nfapi_ul_config_uci_harq_pdu *q = &p->uci_harq_pdu;
|
switch(p->pdu_type) {
|
||||||
nfapi_ul_config_harq_information_rel9_fdd_t *h =
|
case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
|
||||||
&q->harq_information.harq_information_rel9_fdd;
|
nfapi_ul_config_uci_harq_pdu *q = &p->uci_harq_pdu;
|
||||||
A("XXXX rnti %d\n",
|
nfapi_ul_config_harq_information_rel9_fdd_t *h =
|
||||||
q->ue_information.ue_information_rel8.rnti);
|
&q->harq_information.harq_information_rel9_fdd;
|
||||||
A("XXXX harq size %d\n", h->harq_size);
|
A("XXXX rnti %d\n",
|
||||||
A("XXXX ack_nack_mode %d\n", h->ack_nack_mode);
|
q->ue_information.ue_information_rel8.rnti);
|
||||||
A("XXXX # pucch res %d\n", h->number_of_pucch_resources);
|
A("XXXX harq size %d\n", h->harq_size);
|
||||||
A("XXXX n_pucch_1_0 %d\n", h->n_pucch_1_0);
|
A("XXXX ack_nack_mode %d\n", h->ack_nack_mode);
|
||||||
A("XXXX n_pucch_1_1 %d\n", h->n_pucch_1_1);
|
A("XXXX # pucch res %d\n", h->number_of_pucch_resources);
|
||||||
A("XXXX n_pucch_1_2 %d\n", h->n_pucch_1_2);
|
A("XXXX n_pucch_1_0 %d\n", h->n_pucch_1_0);
|
||||||
A("XXXX n_pucch_1_3 %d\n", h->n_pucch_1_3);
|
A("XXXX n_pucch_1_1 %d\n", h->n_pucch_1_1);
|
||||||
break;
|
A("XXXX n_pucch_1_2 %d\n", h->n_pucch_1_2);
|
||||||
}
|
A("XXXX n_pucch_1_3 %d\n", h->n_pucch_1_3);
|
||||||
case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
|
break;
|
||||||
nfapi_ul_config_uci_sr_pdu *q = &p->uci_sr_pdu;
|
}
|
||||||
nfapi_ul_config_sr_information_rel8_t *h =
|
|
||||||
&q->sr_information.sr_information_rel8;
|
case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
|
||||||
A("XXXX rnti %d\n",
|
nfapi_ul_config_uci_sr_pdu *q = &p->uci_sr_pdu;
|
||||||
q->ue_information.ue_information_rel8.rnti);
|
nfapi_ul_config_sr_information_rel8_t *h =
|
||||||
A("XXXX pucch_index %d\n", h->pucch_index);
|
&q->sr_information.sr_information_rel8;
|
||||||
}}
|
A("XXXX rnti %d\n",
|
||||||
|
q->ue_information.ue_information_rel8.rnti);
|
||||||
|
A("XXXX pucch_index %d\n", h->pucch_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LOG_I(PHY, "XXXX DL\nXXXX DL\n%s", s);
|
LOG_I(PHY, "XXXX DL\nXXXX DL\n%s", s);
|
||||||
}
|
}
|
||||||
@@ -510,81 +565,69 @@ static void dump_dl(Sched_Rsp_t *d)
|
|||||||
/* debug utility functions end */
|
/* debug utility functions end */
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void UL_indication(UL_IND_t *UL_info)
|
void UL_indication(UL_IND_t *UL_info) {
|
||||||
{
|
|
||||||
|
|
||||||
AssertFatal(UL_info!=NULL,"UL_INFO is null\n");
|
AssertFatal(UL_info!=NULL,"UL_INFO is null\n");
|
||||||
|
|
||||||
#ifdef DUMP_FAPI
|
#ifdef DUMP_FAPI
|
||||||
dump_ul(UL_info);
|
dump_ul(UL_info);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
module_id_t module_id = UL_info->module_id;
|
module_id_t module_id = UL_info->module_id;
|
||||||
int CC_id = UL_info->CC_id;
|
int CC_id = UL_info->CC_id;
|
||||||
Sched_Rsp_t *sched_info = &Sched_INFO[module_id][CC_id];
|
Sched_Rsp_t *sched_info = &Sched_INFO[module_id][CC_id];
|
||||||
IF_Module_t *ifi = if_inst[module_id];
|
IF_Module_t *ifi = if_inst[module_id];
|
||||||
eNB_MAC_INST *mac = RC.mac[module_id];
|
eNB_MAC_INST *mac = RC.mac[module_id];
|
||||||
|
|
||||||
LOG_D(PHY,"SFN/SF:%d%d module_id:%d CC_id:%d UL_info[rx_ind:%d harqs:%d crcs:%d cqis:%d preambles:%d sr_ind:%d]\n",
|
LOG_D(PHY,"SFN/SF:%d%d module_id:%d CC_id:%d UL_info[rx_ind:%d harqs:%d crcs:%d cqis:%d preambles:%d sr_ind:%d]\n",
|
||||||
UL_info->frame,UL_info->subframe,
|
UL_info->frame,UL_info->subframe,
|
||||||
module_id,CC_id,
|
module_id,CC_id,
|
||||||
UL_info->rx_ind.rx_indication_body.number_of_pdus, UL_info->harq_ind.harq_indication_body.number_of_harqs, UL_info->crc_ind.crc_indication_body.number_of_crcs, UL_info->cqi_ind.number_of_cqis, UL_info->rach_ind.rach_indication_body.number_of_preambles, UL_info->sr_ind.sr_indication_body.number_of_srs);
|
UL_info->rx_ind.rx_indication_body.number_of_pdus, UL_info->harq_ind.harq_indication_body.number_of_harqs, UL_info->crc_ind.crc_indication_body.number_of_crcs, UL_info->cqi_ind.number_of_cqis,
|
||||||
if(UL_info->frame==1023&&UL_info->subframe==6){ // dl scheduling (0,0)
|
UL_info->rach_ind.rach_indication_body.number_of_preambles, UL_info->sr_ind.sr_indication_body.number_of_srs);
|
||||||
frame_cnt= (frame_cnt + 1)%7; // to prevent frame_cnt get too big
|
|
||||||
LOG_D(MAC,"current (%d,%d) frame count dl is %d\n",UL_info->frame,UL_info->subframe,frame_cnt);
|
if(UL_info->frame==1023&&UL_info->subframe==6) { // dl scheduling (0,0)
|
||||||
|
frame_cnt= (frame_cnt + 1)%7; // to prevent frame_cnt get too big
|
||||||
|
LOG_D(MAC,"current (%d,%d) frame count dl is %d\n",UL_info->frame,UL_info->subframe,frame_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nfapi_mode != 1)
|
if (NFAPI_MODE != NFAPI_MODE_PNF) {
|
||||||
{
|
|
||||||
if (ifi->CC_mask==0) {
|
if (ifi->CC_mask==0) {
|
||||||
ifi->current_frame = UL_info->frame;
|
ifi->current_frame = UL_info->frame;
|
||||||
ifi->current_subframe = UL_info->subframe;
|
ifi->current_subframe = UL_info->subframe;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
AssertFatal(UL_info->frame != ifi->current_frame,"CC_mask %x is not full and frame has changed\n",ifi->CC_mask);
|
AssertFatal(UL_info->frame != ifi->current_frame,"CC_mask %x is not full and frame has changed\n",ifi->CC_mask);
|
||||||
AssertFatal(UL_info->subframe != ifi->current_subframe,"CC_mask %x is not full and subframe has changed\n",ifi->CC_mask);
|
AssertFatal(UL_info->subframe != ifi->current_subframe,"CC_mask %x is not full and subframe has changed\n",ifi->CC_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
ifi->CC_mask |= (1<<CC_id);
|
ifi->CC_mask |= (1<<CC_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// clear DL/UL info for new scheduling round
|
// clear DL/UL info for new scheduling round
|
||||||
clear_nfapi_information(RC.mac[module_id],CC_id,
|
clear_nfapi_information(RC.mac[module_id],CC_id,
|
||||||
UL_info->frame,UL_info->subframe);
|
UL_info->frame,UL_info->subframe);
|
||||||
|
|
||||||
handle_rach(UL_info);
|
handle_rach(UL_info);
|
||||||
|
|
||||||
handle_sr(UL_info);
|
handle_sr(UL_info);
|
||||||
|
|
||||||
handle_cqi(UL_info);
|
handle_cqi(UL_info);
|
||||||
|
|
||||||
handle_harq(UL_info);
|
handle_harq(UL_info);
|
||||||
|
|
||||||
// clear HI prior to handling ULSCH
|
// clear HI prior to handling ULSCH
|
||||||
uint8_t sf_ahead_dl = ul_subframe2_k_phich(&mac->common_channels[CC_id] , UL_info->subframe);
|
uint8_t sf_ahead_dl = ul_subframe2_k_phich(&mac->common_channels[CC_id], UL_info->subframe);
|
||||||
if(sf_ahead_dl!=255){
|
|
||||||
mac->HI_DCI0_req[CC_id][(UL_info->subframe+sf_ahead_dl)%10].hi_dci0_request_body.number_of_hi = 0;
|
if(sf_ahead_dl!=255) {
|
||||||
LOG_D(MAC,"current (%d,%d) clear HI_DCI0_req[0][%d]\n",UL_info->frame,UL_info->subframe,(UL_info->subframe+sf_ahead_dl)%10);
|
mac->HI_DCI0_req[CC_id][(UL_info->subframe+sf_ahead_dl)%10].hi_dci0_request_body.number_of_hi = 0;
|
||||||
|
LOG_D(MAC,"current (%d,%d) clear HI_DCI0_req[0][%d]\n",UL_info->frame,UL_info->subframe,(UL_info->subframe+sf_ahead_dl)%10);
|
||||||
}
|
}
|
||||||
|
|
||||||
handle_ulsch(UL_info);
|
handle_ulsch(UL_info);
|
||||||
|
|
||||||
if (nfapi_mode != 1)
|
if (NFAPI_MODE != NFAPI_MODE_PNF) {
|
||||||
{
|
|
||||||
if (ifi->CC_mask == ((1<<MAX_NUM_CCs)-1)) {
|
if (ifi->CC_mask == ((1<<MAX_NUM_CCs)-1)) {
|
||||||
|
|
||||||
eNB_dlsch_ulsch_scheduler(module_id,
|
eNB_dlsch_ulsch_scheduler(module_id,
|
||||||
(UL_info->frame+((UL_info->subframe>(9-sf_ahead))?1:0)) % 1024,
|
(UL_info->frame+((UL_info->subframe>(9-sf_ahead))?1:0)) % 1024,
|
||||||
(UL_info->subframe+sf_ahead)%10);
|
(UL_info->subframe+sf_ahead)%10);
|
||||||
|
|
||||||
ifi->CC_mask = 0;
|
ifi->CC_mask = 0;
|
||||||
|
|
||||||
sched_info->module_id = module_id;
|
sched_info->module_id = module_id;
|
||||||
sched_info->CC_id = CC_id;
|
sched_info->CC_id = CC_id;
|
||||||
sched_info->frame = (UL_info->frame + ((UL_info->subframe>(9-sf_ahead)) ? 1 : 0)) % 1024;
|
sched_info->frame = (UL_info->frame + ((UL_info->subframe>(9-sf_ahead)) ? 1 : 0)) % 1024;
|
||||||
sched_info->subframe = (UL_info->subframe+sf_ahead)%10;
|
sched_info->subframe = (UL_info->subframe+sf_ahead)%10;
|
||||||
sched_info->DL_req = &mac->DL_req[CC_id];
|
sched_info->DL_req = &mac->DL_req[CC_id];
|
||||||
sched_info->HI_DCI0_req = &mac->HI_DCI0_req[CC_id][sched_info->subframe];
|
sched_info->HI_DCI0_req = &mac->HI_DCI0_req[CC_id][sched_info->subframe];
|
||||||
|
|
||||||
if ((mac->common_channels[CC_id].tdd_Config==NULL) ||
|
if ((mac->common_channels[CC_id].tdd_Config==NULL) ||
|
||||||
(is_UL_sf(&mac->common_channels[CC_id],sched_info->subframe)>0))
|
(is_UL_sf(&mac->common_channels[CC_id],sched_info->subframe)>0))
|
||||||
sched_info->UL_req = &mac->UL_req[CC_id];
|
sched_info->UL_req = &mac->UL_req[CC_id];
|
||||||
@@ -592,17 +635,15 @@ void UL_indication(UL_IND_t *UL_info)
|
|||||||
sched_info->UL_req = NULL;
|
sched_info->UL_req = NULL;
|
||||||
|
|
||||||
sched_info->TX_req = &mac->TX_req[CC_id];
|
sched_info->TX_req = &mac->TX_req[CC_id];
|
||||||
|
|
||||||
#ifdef DUMP_FAPI
|
#ifdef DUMP_FAPI
|
||||||
dump_dl(sched_info);
|
dump_dl(sched_info);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ifi->schedule_response)
|
if (ifi->schedule_response) {
|
||||||
{
|
|
||||||
AssertFatal(ifi->schedule_response!=NULL,
|
AssertFatal(ifi->schedule_response!=NULL,
|
||||||
"schedule_response is null (mod %d, cc %d)\n",
|
"schedule_response is null (mod %d, cc %d)\n",
|
||||||
module_id,
|
module_id,
|
||||||
CC_id);
|
CC_id);
|
||||||
ifi->schedule_response(sched_info);
|
ifi->schedule_response(sched_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -611,28 +652,24 @@ void UL_indication(UL_IND_t *UL_info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IF_Module_t *IF_Module_init(int Mod_id){
|
IF_Module_t *IF_Module_init(int Mod_id) {
|
||||||
|
|
||||||
AssertFatal(Mod_id<MAX_MODULES,"Asking for Module %d > %d\n",Mod_id,MAX_IF_MODULES);
|
AssertFatal(Mod_id<MAX_MODULES,"Asking for Module %d > %d\n",Mod_id,MAX_IF_MODULES);
|
||||||
|
|
||||||
LOG_D(PHY,"Installing callbacks for IF_Module - UL_indication\n");
|
LOG_D(PHY,"Installing callbacks for IF_Module - UL_indication\n");
|
||||||
|
|
||||||
if (if_inst[Mod_id]==NULL) {
|
if (if_inst[Mod_id]==NULL) {
|
||||||
if_inst[Mod_id] = (IF_Module_t*)malloc(sizeof(IF_Module_t));
|
if_inst[Mod_id] = (IF_Module_t *)malloc(sizeof(IF_Module_t));
|
||||||
memset((void*)if_inst[Mod_id],0,sizeof(IF_Module_t));
|
memset((void *)if_inst[Mod_id],0,sizeof(IF_Module_t));
|
||||||
|
|
||||||
if_inst[Mod_id]->CC_mask=0;
|
if_inst[Mod_id]->CC_mask=0;
|
||||||
if_inst[Mod_id]->UL_indication = UL_indication;
|
if_inst[Mod_id]->UL_indication = UL_indication;
|
||||||
|
|
||||||
AssertFatal(pthread_mutex_init(&if_inst[Mod_id]->if_mutex,NULL)==0,
|
AssertFatal(pthread_mutex_init(&if_inst[Mod_id]->if_mutex,NULL)==0,
|
||||||
"allocation of if_inst[%d]->if_mutex fails\n",Mod_id);
|
"allocation of if_inst[%d]->if_mutex fails\n",Mod_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return if_inst[Mod_id];
|
return if_inst[Mod_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
void IF_Module_kill(int Mod_id) {
|
void IF_Module_kill(int Mod_id) {
|
||||||
|
|
||||||
AssertFatal(Mod_id>MAX_MODULES,"Asking for Module %d > %d\n",Mod_id,MAX_IF_MODULES);
|
AssertFatal(Mod_id>MAX_MODULES,"Asking for Module %d > %d\n",Mod_id,MAX_IF_MODULES);
|
||||||
if (if_inst[Mod_id]!=NULL) free(if_inst[Mod_id]);
|
|
||||||
|
|
||||||
|
if (if_inst[Mod_id]!=NULL) free(if_inst[Mod_id]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
#include "common/ran_context.h"
|
#include "common/ran_context.h"
|
||||||
|
|
||||||
#if defined(ENABLE_ITTI)
|
#if defined(ENABLE_ITTI)
|
||||||
# include "intertask_interface.h"
|
#include "intertask_interface.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define RRC_DATA_REQ_DEBUG
|
//#define RRC_DATA_REQ_DEBUG
|
||||||
@@ -49,21 +49,21 @@ extern RAN_CONTEXT_t RC;
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
uint8_t
|
uint8_t
|
||||||
rrc_data_req(
|
rrc_data_req(
|
||||||
const protocol_ctxt_t* const ctxt_pP,
|
const protocol_ctxt_t *const ctxt_pP,
|
||||||
const rb_id_t rb_idP,
|
const rb_id_t rb_idP,
|
||||||
const mui_t muiP,
|
const mui_t muiP,
|
||||||
const confirm_t confirmP,
|
const confirm_t confirmP,
|
||||||
const sdu_size_t sdu_sizeP,
|
const sdu_size_t sdu_sizeP,
|
||||||
uint8_t* const buffer_pP,
|
uint8_t *const buffer_pP,
|
||||||
const pdcp_transmission_mode_t modeP
|
const pdcp_transmission_mode_t modeP
|
||||||
)
|
)
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
if(sdu_sizeP == 255)
|
if(sdu_sizeP == 255) {
|
||||||
{
|
|
||||||
LOG_I(RRC,"sdu_sizeP == 255");
|
LOG_I(RRC,"sdu_sizeP == 255");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
MSC_LOG_TX_MESSAGE(
|
MSC_LOG_TX_MESSAGE(
|
||||||
ctxt_pP->enb_flag ? MSC_RRC_ENB : MSC_RRC_UE,
|
ctxt_pP->enb_flag ? MSC_RRC_ENB : MSC_RRC_UE,
|
||||||
ctxt_pP->enb_flag ? MSC_PDCP_ENB : MSC_PDCP_UE,
|
ctxt_pP->enb_flag ? MSC_PDCP_ENB : MSC_PDCP_UE,
|
||||||
@@ -74,71 +74,49 @@ rrc_data_req(
|
|||||||
ctxt_pP->rnti,
|
ctxt_pP->rnti,
|
||||||
muiP,
|
muiP,
|
||||||
sdu_sizeP);
|
sdu_sizeP);
|
||||||
|
MessageDef *message_p;
|
||||||
|
// Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
|
||||||
|
uint8_t *message_buffer;
|
||||||
|
message_buffer = itti_malloc (
|
||||||
|
ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE,
|
||||||
|
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
|
||||||
|
sdu_sizeP);
|
||||||
|
memcpy (message_buffer, buffer_pP, sdu_sizeP);
|
||||||
|
message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ);
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag;
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).muip = muiP;
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP;
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP;
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer;
|
||||||
|
//memcpy (RRC_DCCH_DATA_REQ (message_p).sdu_p, buffer_pP, sdu_sizeP);
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).mode = modeP;
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id;
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rnti;
|
||||||
|
RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index;
|
||||||
|
itti_send_msg_to_task (
|
||||||
|
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
|
||||||
|
ctxt_pP->instance,
|
||||||
|
message_p);
|
||||||
|
LOG_I(RRC,"sent RRC_DCCH_DATA_REQ to TASK_PDCP_ENB\n");
|
||||||
|
|
||||||
#if defined(ENABLE_ITTI)
|
/* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads
|
||||||
{
|
* Ideally, PDCP would not neet to be triggered like this but react to ITTI
|
||||||
MessageDef *message_p;
|
* messages automatically */
|
||||||
// Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
|
if (ctxt_pP->enb_flag && NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type))
|
||||||
uint8_t *message_buffer;
|
pdcp_run(ctxt_pP);
|
||||||
|
|
||||||
message_buffer = itti_malloc (
|
return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
|
||||||
ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE,
|
|
||||||
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
|
|
||||||
sdu_sizeP);
|
|
||||||
|
|
||||||
memcpy (message_buffer, buffer_pP, sdu_sizeP);
|
|
||||||
|
|
||||||
message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ);
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag;
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).muip = muiP;
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP;
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP;
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer;
|
|
||||||
//memcpy (RRC_DCCH_DATA_REQ (message_p).sdu_p, buffer_pP, sdu_sizeP);
|
|
||||||
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).mode = modeP;
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id;
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rnti;
|
|
||||||
RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index;
|
|
||||||
|
|
||||||
itti_send_msg_to_task (
|
|
||||||
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
|
|
||||||
ctxt_pP->instance,
|
|
||||||
message_p);
|
|
||||||
LOG_I(RRC,"sent RRC_DCCH_DATA_REQ to TASK_PDCP_ENB\n");
|
|
||||||
#ifndef UETARGET
|
|
||||||
/* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads
|
|
||||||
* Ideally, PDCP would not neet to be triggered like this but react to ITTI
|
|
||||||
* messages automatically */
|
|
||||||
if (NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type))
|
|
||||||
pdcp_run(ctxt_pP);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
|
|
||||||
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return pdcp_data_req (
|
|
||||||
ctxt_pP,
|
|
||||||
SRB_FLAG_YES,
|
|
||||||
rb_idP,
|
|
||||||
muiP,
|
|
||||||
confirmP,
|
|
||||||
sdu_sizeP,
|
|
||||||
buffer_pP,
|
|
||||||
modeP);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
void
|
void
|
||||||
rrc_data_ind(
|
rrc_data_ind(
|
||||||
const protocol_ctxt_t* const ctxt_pP,
|
const protocol_ctxt_t *const ctxt_pP,
|
||||||
const rb_id_t Srb_id,
|
const rb_id_t Srb_id,
|
||||||
const sdu_size_t sdu_sizeP,
|
const sdu_size_t sdu_sizeP,
|
||||||
const uint8_t* const buffer_pP
|
const uint8_t *const buffer_pP
|
||||||
)
|
)
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
@@ -162,10 +140,8 @@ rrc_data_ind(
|
|||||||
MessageDef *message_p;
|
MessageDef *message_p;
|
||||||
// Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
|
// Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
|
||||||
uint8_t *message_buffer;
|
uint8_t *message_buffer;
|
||||||
|
|
||||||
message_buffer = itti_malloc (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, sdu_sizeP);
|
message_buffer = itti_malloc (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, sdu_sizeP);
|
||||||
memcpy (message_buffer, buffer_pP, sdu_sizeP);
|
memcpy (message_buffer, buffer_pP, sdu_sizeP);
|
||||||
|
|
||||||
message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, RRC_DCCH_DATA_IND);
|
message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, RRC_DCCH_DATA_IND);
|
||||||
RRC_DCCH_DATA_IND (message_p).frame = ctxt_pP->frame;
|
RRC_DCCH_DATA_IND (message_p).frame = ctxt_pP->frame;
|
||||||
RRC_DCCH_DATA_IND (message_p).dcch_index = DCCH_index;
|
RRC_DCCH_DATA_IND (message_p).dcch_index = DCCH_index;
|
||||||
@@ -174,16 +150,13 @@ rrc_data_ind(
|
|||||||
RRC_DCCH_DATA_IND (message_p).rnti = ctxt_pP->rnti;
|
RRC_DCCH_DATA_IND (message_p).rnti = ctxt_pP->rnti;
|
||||||
RRC_DCCH_DATA_IND (message_p).module_id = ctxt_pP->module_id;
|
RRC_DCCH_DATA_IND (message_p).module_id = ctxt_pP->module_id;
|
||||||
RRC_DCCH_DATA_IND (message_p).eNB_index = ctxt_pP->eNB_index;
|
RRC_DCCH_DATA_IND (message_p).eNB_index = ctxt_pP->eNB_index;
|
||||||
|
|
||||||
itti_send_msg_to_task (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, ctxt_pP->instance, message_p);
|
itti_send_msg_to_task (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, ctxt_pP->instance, message_p);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
rrc_eNB_decode_dcch(
|
||||||
rrc_eNB_decode_dcch(
|
ctxt_pP,
|
||||||
ctxt_pP,
|
DCCH_index,
|
||||||
DCCH_index,
|
buffer_pP,
|
||||||
buffer_pP,
|
sdu_sizeP);
|
||||||
sdu_sizeP);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-38
@@ -801,42 +801,33 @@ rrc_ue_establish_drb(
|
|||||||
(void)ip_addr_offset4;
|
(void)ip_addr_offset4;
|
||||||
LOG_I(RRC,"[UE %d] Frame %d: processing RRCConnectionReconfiguration: reconfiguring DRB %ld/LCID %d\n",
|
LOG_I(RRC,"[UE %d] Frame %d: processing RRCConnectionReconfiguration: reconfiguring DRB %ld/LCID %d\n",
|
||||||
ue_mod_idP, frameP, DRB_config->drb_Identity, (int)*DRB_config->logicalChannelIdentity);
|
ue_mod_idP, frameP, DRB_config->drb_Identity, (int)*DRB_config->logicalChannelIdentity);
|
||||||
/*
|
|
||||||
rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD,
|
|
||||||
(eNB_index * NB_RB_MAX) + *DRB_config->logicalChannelIdentity, UNDEF_SECURITY_MODE);
|
|
||||||
|
|
||||||
rrc_rlc_config_req(ue_mod_idP+NB_eNB_INST,frameP,0,CONFIG_ACTION_ADD,
|
if(!EPC_MODE_ENABLED) {
|
||||||
(eNB_index * NB_RB_MAX) + *DRB_config->logicalChannelIdentity,
|
ip_addr_offset3 = 0;
|
||||||
RADIO_ACCESS_BEARER,Rlc_info_um);
|
ip_addr_offset4 = 1;
|
||||||
*/
|
LOG_I(OIP,"[UE %d] trying to bring up the OAI interface %d, IP X.Y.%d.%d\n", ue_mod_idP, ip_addr_offset3+ue_mod_idP,
|
||||||
// if(!EPC_MODE_ENABLED) {
|
ip_addr_offset3+ue_mod_idP+1,ip_addr_offset4+ue_mod_idP+1);
|
||||||
//# if !defined(OAI_NW_DRIVER_TYPE_ETHERNET) && !defined(EXMIMO) && !defined(OAI_USRP) && !defined(OAI_BLADERF) && !defined(ETHERNET) && !defined(LINK_ENB_PDCP_TO_GTPV1U)
|
oip_ifup=nas_config(ip_addr_offset3+ue_mod_idP+1, // interface_id
|
||||||
ip_addr_offset3 = 0;
|
UE_NAS_USE_TUN?1:(ip_addr_offset3+ue_mod_idP+1), // third_octet
|
||||||
ip_addr_offset4 = 1;
|
ip_addr_offset4+ue_mod_idP+1, // fourth_octet
|
||||||
LOG_I(OIP,"[UE %d] trying to bring up the OAI interface oip%d, IP 10.0.%d.%d\n", ue_mod_idP, ip_addr_offset3+ue_mod_idP,
|
"oip"); // interface suffix (when using kernel module)
|
||||||
ip_addr_offset3+ue_mod_idP+1,ip_addr_offset4+ue_mod_idP+1);
|
|
||||||
oip_ifup=nas_config(ip_addr_offset3+ue_mod_idP+1, // interface_id
|
|
||||||
ip_addr_offset3+ue_mod_idP+1, // third_octet
|
|
||||||
ip_addr_offset4+ue_mod_idP+1, // fourth_octet
|
|
||||||
"oip"); // interface suffix
|
|
||||||
|
|
||||||
if (oip_ifup == 0 && (!UE_NAS_USE_TUN)) { // interface is up --> send a config the DRB
|
if (oip_ifup == 0 && (!UE_NAS_USE_TUN)) { // interface is up --> send a config the DRB
|
||||||
LOG_I(OIP,"[UE %d] Config the ue net interface %d to send/receive pkt on DRB %ld to/from the protocol stack\n",
|
LOG_I(OIP,"[UE %d] Config the ue net interface %d to send/receive pkt on DRB %ld to/from the protocol stack\n",
|
||||||
ue_mod_idP,
|
ue_mod_idP,
|
||||||
ip_addr_offset3+ue_mod_idP,
|
ip_addr_offset3+ue_mod_idP,
|
||||||
(long int)((eNB_index * LTE_maxDRB) + DRB_config->drb_Identity));
|
(long int)((eNB_index * LTE_maxDRB) + DRB_config->drb_Identity));
|
||||||
rb_conf_ipv4(0,//add
|
rb_conf_ipv4(0,//add
|
||||||
ue_mod_idP,//cx align with the UE index
|
ue_mod_idP,//cx align with the UE index
|
||||||
ip_addr_offset3+ue_mod_idP,//inst num_enb+ue_index
|
ip_addr_offset3+ue_mod_idP,//inst num_enb+ue_index
|
||||||
(eNB_index * LTE_maxDRB) + DRB_config->drb_Identity,//rb
|
(eNB_index * LTE_maxDRB) + DRB_config->drb_Identity,//rb
|
||||||
0,//dscp
|
0,//dscp
|
||||||
ipv4_address(ip_addr_offset3+ue_mod_idP+1,ip_addr_offset4+ue_mod_idP+1),//saddr
|
ipv4_address(ip_addr_offset3+ue_mod_idP+1,ip_addr_offset4+ue_mod_idP+1),//saddr
|
||||||
ipv4_address(ip_addr_offset3+ue_mod_idP+1,eNB_index+1));//daddr
|
ipv4_address(ip_addr_offset3+ue_mod_idP+1,eNB_index+1));//daddr
|
||||||
LOG_D(RRC,"[UE %d] State = Attached (eNB %d)\n",ue_mod_idP,eNB_index);
|
LOG_D(RRC,"[UE %d] State = Attached (eNB %d)\n",ue_mod_idP,eNB_index);
|
||||||
}
|
}
|
||||||
|
} // !EPC_MODE_ENABLED
|
||||||
|
|
||||||
//# endif
|
|
||||||
// }
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2656,11 +2647,6 @@ int decode_BCCH_DLSCH_Message(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if ((rrc_get_sub_state(ctxt_pP->module_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE)
|
|
||||||
//#if defined(ENABLE_USE_MME)
|
|
||||||
// && (UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data != NULL)
|
|
||||||
//#endif
|
|
||||||
// ) {
|
|
||||||
if (rrc_get_sub_state(ctxt_pP->module_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE) {
|
if (rrc_get_sub_state(ctxt_pP->module_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE) {
|
||||||
if ( (UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data != NULL) || (!EPC_MODE_ENABLED)) {
|
if ( (UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data != NULL) || (!EPC_MODE_ENABLED)) {
|
||||||
rrc_ue_generate_RRCConnectionRequest(ctxt_pP, 0);
|
rrc_ue_generate_RRCConnectionRequest(ctxt_pP, 0);
|
||||||
|
|||||||
@@ -168,7 +168,6 @@ int setInterfaceParameter(char *interfaceName, char *settingAddress, int operati
|
|||||||
}
|
}
|
||||||
|
|
||||||
close(sock_fd);
|
close(sock_fd);
|
||||||
// printf("Set OK!\n");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,7 +224,9 @@ int NAS_config(char *interfaceName, char *ipAddress, char *networkMask, char *br
|
|||||||
|
|
||||||
// if(!returnValue)
|
// if(!returnValue)
|
||||||
// returnValue=set_gateway(interfaceName, broadcastAddress);
|
// returnValue=set_gateway(interfaceName, broadcastAddress);
|
||||||
bringInterfaceUp(interfaceName, 1);
|
if(!returnValue)
|
||||||
|
returnValue = bringInterfaceUp(interfaceName, 1);
|
||||||
|
|
||||||
return returnValue;
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,8 +237,8 @@ int nas_config(int interface_id, int thirdOctet, int fourthOctet, char *ifname)
|
|||||||
char broadcastAddress[20];
|
char broadcastAddress[20];
|
||||||
char interfaceName[20];
|
char interfaceName[20];
|
||||||
int returnValue;
|
int returnValue;
|
||||||
sprintf(ipAddress, "10.0.%d.%d", thirdOctet,fourthOctet);
|
sprintf(ipAddress, "%s.%d.%d", baseNetAddress,thirdOctet,fourthOctet);
|
||||||
sprintf(broadcastAddress, "10.0.%d.255", thirdOctet);
|
sprintf(broadcastAddress, "%s.%d.255",baseNetAddress, thirdOctet);
|
||||||
sprintf(interfaceName, "%s%s%d", (UE_NAS_USE_TUN || ENB_NAS_USE_TUN)?"oaitun_":ifname,
|
sprintf(interfaceName, "%s%s%d", (UE_NAS_USE_TUN || ENB_NAS_USE_TUN)?"oaitun_":ifname,
|
||||||
UE_NAS_USE_TUN?"ue": (ENB_NAS_USE_TUN?"enb":""),interface_id);
|
UE_NAS_USE_TUN?"ue": (ENB_NAS_USE_TUN?"enb":""),interface_id);
|
||||||
bringInterfaceUp(interfaceName, 0);
|
bringInterfaceUp(interfaceName, 0);
|
||||||
@@ -252,7 +253,16 @@ int nas_config(int interface_id, int thirdOctet, int fourthOctet, char *ifname)
|
|||||||
if(!returnValue)
|
if(!returnValue)
|
||||||
returnValue= setInterfaceParameter(interfaceName, broadcastAddress,SIOCSIFBRDADDR);
|
returnValue= setInterfaceParameter(interfaceName, broadcastAddress,SIOCSIFBRDADDR);
|
||||||
|
|
||||||
bringInterfaceUp(interfaceName, 1);
|
if(!returnValue)
|
||||||
|
bringInterfaceUp(interfaceName, 1);
|
||||||
|
|
||||||
|
if(!returnValue)
|
||||||
|
LOG_I(OIP,"Interface %s successfuly configured, ip address %s, mask %s broadcast address %s\n",
|
||||||
|
interfaceName, ipAddress, netMask, broadcastAddress);
|
||||||
|
else
|
||||||
|
LOG_E(OIP,"Interface %s couldn't be configured (ip address %s, mask %s broadcast address %s)\n",
|
||||||
|
interfaceName, ipAddress, netMask, broadcastAddress);
|
||||||
|
|
||||||
return returnValue;
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ Description Defines functions used to handle EPS bearer contexts.
|
|||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "pdcp.h"
|
#include "pdcp.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
@@ -59,7 +59,6 @@ Description Defines functions used to handle EPS bearer contexts.
|
|||||||
#include "openairinterface5g_limits.h"
|
#include "openairinterface5g_limits.h"
|
||||||
extern uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
|
extern uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
|
||||||
#endif
|
#endif
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
||||||
@@ -268,7 +267,7 @@ int esm_ebr_context_create(
|
|||||||
strcpy(broadcast, ipv4_addr);
|
strcpy(broadcast, ipv4_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nfapi_mode ==3) {
|
if(NFAPI_MODE==NFAPI_UE_STUB_PNF) {
|
||||||
// this is for L2 FAPI simulator.
|
// this is for L2 FAPI simulator.
|
||||||
// change for multiple UE's like 256UEs.
|
// change for multiple UE's like 256UEs.
|
||||||
// if it's made too many tables , OS may crush so we use one table.
|
// if it's made too many tables , OS may crush so we use one table.
|
||||||
|
|||||||
+72
-31
@@ -60,7 +60,7 @@
|
|||||||
#include "PHY/defs_eNB.h"
|
#include "PHY/defs_eNB.h"
|
||||||
#include "SCHED/sched_eNB.h"
|
#include "SCHED/sched_eNB.h"
|
||||||
#include "PHY/LTE_TRANSPORT/transport_proto.h"
|
#include "PHY/LTE_TRANSPORT/transport_proto.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
|
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||||
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
|
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||||
|
|
||||||
@@ -145,13 +145,13 @@ void init_eNB(int,int);
|
|||||||
void stop_eNB(int nb_inst);
|
void stop_eNB(int nb_inst);
|
||||||
|
|
||||||
int wakeup_tx(PHY_VARS_eNB *eNB);
|
int wakeup_tx(PHY_VARS_eNB *eNB);
|
||||||
int wakeup_txfh(L1_rxtx_proc_t *proc,PHY_VARS_eNB *eNB);
|
int wakeup_txfh(L1_rxtx_proc_t *proc,int frame_tx,int subframe_tx,uint64_t timestamp_tx,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);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
extern void oai_subframe_ind(uint16_t sfn, uint16_t sf);
|
extern void oai_subframe_ind(uint16_t sfn, uint16_t sf);
|
||||||
extern void add_subframe(uint16_t *frameP, uint16_t *subframeP, int offset);
|
extern void add_subframe(uint16_t *frameP, uint16_t *subframeP, int offset);
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, char *thread_name
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nfapi_mode == 1) {
|
if (NFAPI_MODE==NFAPI_MODE_PNF) {
|
||||||
// I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
|
// I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
|
||||||
uint16_t frame = proc->frame_rx;
|
uint16_t frame = proc->frame_rx;
|
||||||
uint16_t subframe = proc->subframe_rx;
|
uint16_t subframe = proc->subframe_rx;
|
||||||
@@ -201,7 +201,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, char *thread_name
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nfapi_mode == 1 && eNB->pdcch_vars[proc->subframe_tx&1].num_pdcch_symbols == 0) {
|
if (NFAPI_MODE==NFAPI_MODE_PNF && eNB->pdcch_vars[proc->subframe_tx&1].num_pdcch_symbols == 0) {
|
||||||
LOG_E(PHY, "eNB->pdcch_vars[proc->subframe_tx&1].num_pdcch_symbols == 0");
|
LOG_E(PHY, "eNB->pdcch_vars[proc->subframe_tx&1].num_pdcch_symbols == 0");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -221,14 +221,14 @@ static inline int rxtx(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, char *thread_name
|
|||||||
release_UE_in_freeList(eNB->Mod_id);
|
release_UE_in_freeList(eNB->Mod_id);
|
||||||
|
|
||||||
// UE-specific RX processing for subframe n
|
// UE-specific RX processing for subframe n
|
||||||
if (nfapi_mode == 0 || nfapi_mode == 1) {
|
if (NFAPI_MODE==NFAPI_MONOLITHIC || NFAPI_MODE==NFAPI_MODE_PNF) {
|
||||||
phy_procedures_eNB_uespec_RX(eNB, proc);
|
phy_procedures_eNB_uespec_RX(eNB, proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
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 defined(PRE_SCD_THREAD)
|
#if defined(PRE_SCD_THREAD)
|
||||||
|
|
||||||
if (nfapi_mode == 2) {
|
if (NFAPI_MODE==NFAPI_MODE_VNF) {
|
||||||
new_dlsch_ue_select_tbl_in_use = dlsch_ue_select_tbl_in_use;
|
new_dlsch_ue_select_tbl_in_use = dlsch_ue_select_tbl_in_use;
|
||||||
dlsch_ue_select_tbl_in_use = !dlsch_ue_select_tbl_in_use;
|
dlsch_ue_select_tbl_in_use = !dlsch_ue_select_tbl_in_use;
|
||||||
// L2-emulator can work only one eNB.
|
// L2-emulator can work only one eNB.
|
||||||
@@ -340,7 +340,7 @@ static void *L1_thread_tx(void *param) {
|
|||||||
//wait_sync("tx_thread");
|
//wait_sync("tx_thread");
|
||||||
|
|
||||||
while (!oai_exit) {
|
while (!oai_exit) {
|
||||||
LOG_D(PHY,"L1_thread_tx: Waiting for signal (IC %d)\n",proc->instance_cnt);
|
LOG_D(PHY,"Waiting for TX (IC %d)\n",proc->instance_cnt);
|
||||||
if (wait_on_condition(&proc->mutex,&proc->cond,&proc->instance_cnt,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;
|
||||||
@@ -355,10 +355,18 @@ static void *L1_thread_tx(void *param) {
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX1_ENB,proc->subframe_rx);
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX1_ENB,proc->subframe_rx);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_ENB,proc->frame_tx);
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_ENB,proc->frame_tx);
|
||||||
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);
|
||||||
|
LOG_D(PHY,"L1 TX processing %d.%d\n",proc->frame_tx,proc->subframe_tx);
|
||||||
phy_procedures_eNB_TX(eNB, proc, 1);
|
phy_procedures_eNB_TX(eNB, proc, 1);
|
||||||
pthread_mutex_lock( &proc->mutex );
|
pthread_mutex_lock( &proc->mutex );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC,proc->instance_cnt);
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC,proc->instance_cnt);
|
||||||
|
|
||||||
|
int subframe_tx = proc->subframe_tx;
|
||||||
|
int frame_tx = proc->frame_tx;
|
||||||
|
uint64_t timestamp_tx = proc->timestamp_tx;
|
||||||
|
|
||||||
proc->instance_cnt = -1;
|
proc->instance_cnt = -1;
|
||||||
|
|
||||||
|
LOG_D(PHY,"L1 TX signaling done for %d.%d\n",proc->frame_tx,proc->subframe_tx);
|
||||||
// the thread can now be woken up
|
// the thread can now be woken up
|
||||||
LOG_D(PHY,"L1_thread_tx: signaling completion in %d.%d\n",proc->frame_tx,proc->subframe_tx);
|
LOG_D(PHY,"L1_thread_tx: signaling completion in %d.%d\n",proc->frame_tx,proc->subframe_tx);
|
||||||
if (pthread_cond_signal(&proc->cond) != 0) {
|
if (pthread_cond_signal(&proc->cond) != 0) {
|
||||||
@@ -367,7 +375,7 @@ static void *L1_thread_tx(void *param) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock( &proc->mutex );
|
pthread_mutex_unlock( &proc->mutex );
|
||||||
wakeup_txfh(proc,eNB);
|
wakeup_txfh(proc,frame_tx,subframe_tx,timestamp_tx,eNB);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -383,7 +391,7 @@ static void *L1_thread( void *param ) {
|
|||||||
static int eNB_thread_rxtx_status;
|
static int eNB_thread_rxtx_status;
|
||||||
L1_rxtx_proc_t *proc;
|
L1_rxtx_proc_t *proc;
|
||||||
// Working
|
// Working
|
||||||
if(nfapi_mode ==2) {
|
if(NFAPI_MODE==NFAPI_MODE_VNF) {
|
||||||
proc = (L1_rxtx_proc_t *)param;
|
proc = (L1_rxtx_proc_t *)param;
|
||||||
} else {
|
} else {
|
||||||
L1_proc_t *eNB_proc = (L1_proc_t *)param;
|
L1_proc_t *eNB_proc = (L1_proc_t *)param;
|
||||||
@@ -405,9 +413,10 @@ static void *L1_thread( 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));
|
||||||
|
|
||||||
|
LOG_D(PHY,"L1RX waiting for RU RX\n");
|
||||||
if (wait_on_condition(&proc->mutex,&proc->cond,&proc->instance_cnt,thread_name)<0) break;
|
if (wait_on_condition(&proc->mutex,&proc->cond,&proc->instance_cnt,thread_name)<0) break;
|
||||||
|
|
||||||
LOG_D(PHY,"L1_thread wakeup %d.%d\n",proc->frame_rx,proc->subframe_rx);
|
LOG_D(PHY,"L1RX starting in %d.%d\n",proc->frame_rx,proc->subframe_rx);
|
||||||
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 );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB,proc->subframe_tx);
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB,proc->subframe_tx);
|
||||||
@@ -421,15 +430,19 @@ static void *L1_thread( void *param ) {
|
|||||||
if (rxtx(eNB,proc,thread_name) < 0) break;
|
if (rxtx(eNB,proc,thread_name) < 0) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(PHY,"L1_thread: RX done in %d.%d\n",proc->frame_rx,proc->subframe_rx);
|
LOG_D(PHY,"L1 RX %d.%d done\n",proc->frame_rx,proc->subframe_rx);
|
||||||
|
|
||||||
if(get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT) phy_procedures_eNB_TX(eNB, proc, 1);
|
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;
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_IC,proc->instance_cnt);
|
if (NFAPI_MODE!=NFAPI_MODE_VNF) {
|
||||||
if (nfapi_mode!=2) {
|
|
||||||
if(get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) wakeup_tx(eNB);
|
if(get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) wakeup_tx(eNB);
|
||||||
else if(get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT) wakeup_txfh(proc,eNB);
|
else if(get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT) wakeup_txfh(proc,proc->frame_tx,proc->subframe_tx,proc->timestamp_tx,eNB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (release_thread(&proc->mutex,&proc->instance_cnt,thread_name)<0) break;
|
||||||
|
|
||||||
|
|
||||||
} // while !oai_exit
|
} // while !oai_exit
|
||||||
|
|
||||||
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 );
|
||||||
@@ -462,7 +475,7 @@ void eNB_top(PHY_VARS_eNB *eNB, int frame_rx, int subframe_rx, char *string,RU_t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int wakeup_txfh(L1_rxtx_proc_t *proc,PHY_VARS_eNB *eNB) {
|
int wakeup_txfh(L1_rxtx_proc_t *proc,int frame_tx,int subframe_tx,uint64_t timestamp_tx,PHY_VARS_eNB *eNB) {
|
||||||
RU_t *ru;
|
RU_t *ru;
|
||||||
RU_proc_t *ru_proc;
|
RU_proc_t *ru_proc;
|
||||||
LTE_DL_FRAME_PARMS *fp;
|
LTE_DL_FRAME_PARMS *fp;
|
||||||
@@ -472,9 +485,12 @@ int wakeup_txfh(L1_rxtx_proc_t *proc,PHY_VARS_eNB *eNB) {
|
|||||||
wait.tv_sec=0;
|
wait.tv_sec=0;
|
||||||
wait.tv_nsec=5000000L;
|
wait.tv_nsec=5000000L;
|
||||||
|
|
||||||
LOG_D(PHY,"wakeup_txfh %d.%d IC_RU = %d\n", proc->frame_tx, proc->subframe_tx, proc->instance_cnt_RUs);
|
LOG_D(PHY,"L1 TX Waking up TX FH %d.%d (IC RU TX %d)\n",frame_tx,subframe_tx,proc->instance_cnt_RUs);
|
||||||
|
|
||||||
|
// grab the information for the RU due to the following wait
|
||||||
|
|
||||||
if(wait_on_condition(&proc->mutex_RUs,&proc->cond_RUs,&proc->instance_cnt_RUs,"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", proc->frame_tx, proc->subframe_tx);
|
LOG_E(PHY,"Frame %d, subframe %d: TX FH not ready\n", frame_tx, subframe_tx);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -503,11 +519,11 @@ int wakeup_txfh(L1_rxtx_proc_t *proc,PHY_VARS_eNB *eNB) {
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
ru_proc->instance_cnt_eNBs = 0;
|
ru_proc->instance_cnt_eNBs = 0;
|
||||||
//VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_IC_ENB+ru_id,ru_proc->instance_cnt_eNBs);
|
ru_proc->timestamp_tx = timestamp_tx;
|
||||||
ru_proc->timestamp_tx = proc->timestamp_tx;
|
ru_proc->subframe_tx = subframe_tx;
|
||||||
ru_proc->subframe_tx = proc->subframe_tx;
|
ru_proc->frame_tx = frame_tx;
|
||||||
ru_proc->frame_tx = proc->frame_tx;
|
|
||||||
|
|
||||||
|
LOG_D(PHY,"L1 TX Waking up TX FH (2) %d.%d\n",frame_tx,subframe_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");
|
||||||
@@ -535,13 +551,16 @@ int wakeup_tx(PHY_VARS_eNB *eNB) {
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(L1_proc_tx->instance_cnt == 0){ //check if the previous has finished
|
LOG_D(PHY,"L1 RX %d.%d Waiting to wake up L1 TX %d.%d (IC L1TX %d)\n",L1_proc->frame_rx,L1_proc->subframe_rx,L1_proc->frame_tx,L1_proc->subframe_tx,L1_proc_tx->instance_cnt);
|
||||||
|
|
||||||
|
while(L1_proc_tx->instance_cnt == 0) {
|
||||||
pthread_cond_wait(&L1_proc_tx->cond,&L1_proc_tx->mutex);
|
pthread_cond_wait(&L1_proc_tx->cond,&L1_proc_tx->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_D(PHY,"L1 RX Got signal that TX %d.%d is done\n",L1_proc_tx->frame_tx,L1_proc_tx->subframe_tx);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC,L1_proc_tx->instance_cnt);
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC,L1_proc_tx->instance_cnt);
|
||||||
L1_proc_tx->instance_cnt = 0; // set go for the current one
|
L1_proc_tx->instance_cnt = 0;
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC,L1_proc_tx->instance_cnt);
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC,L1_proc_tx->instance_cnt);
|
||||||
|
|
||||||
L1_proc_tx->subframe_rx = L1_proc->subframe_rx;
|
L1_proc_tx->subframe_rx = L1_proc->subframe_rx;
|
||||||
L1_proc_tx->frame_rx = L1_proc->frame_rx;
|
L1_proc_tx->frame_rx = L1_proc->frame_rx;
|
||||||
L1_proc_tx->subframe_tx = L1_proc->subframe_tx;
|
L1_proc_tx->subframe_tx = L1_proc->subframe_tx;
|
||||||
@@ -549,7 +568,7 @@ int wakeup_tx(PHY_VARS_eNB *eNB) {
|
|||||||
L1_proc_tx->timestamp_tx = L1_proc->timestamp_tx;
|
L1_proc_tx->timestamp_tx = L1_proc->timestamp_tx;
|
||||||
|
|
||||||
// the thread can now be woken up
|
// the thread can now be woken up
|
||||||
LOG_D(PHY,"Waking up TX thread in %d.%d\n",L1_proc->frame_tx,L1_proc->subframe_tx);
|
LOG_D(PHY,"L1 RX Waking up L1 TX %d.%d\n",L1_proc->frame_tx,L1_proc->subframe_tx);
|
||||||
if (pthread_cond_signal(&L1_proc_tx->cond) != 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" );
|
||||||
@@ -570,6 +589,7 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
|
|||||||
|
|
||||||
int i;
|
int i;
|
||||||
struct timespec wait;
|
struct timespec wait;
|
||||||
|
int sleep_cnt=0;
|
||||||
|
|
||||||
wait.tv_sec=0;
|
wait.tv_sec=0;
|
||||||
wait.tv_nsec=5000000L;
|
wait.tv_nsec=5000000L;
|
||||||
@@ -599,6 +619,27 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
|
|||||||
// 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
|
||||||
|
|
||||||
|
|
||||||
|
LOG_D(PHY,"RU RX Waking up rxtx %d.%d (IC L1RX %d)\n",ru_proc->frame_rx,ru_proc->subframe_rx,L1_proc->instance_cnt);
|
||||||
|
|
||||||
|
while (L1_proc->instance_cnt == 0) {
|
||||||
|
pthread_mutex_unlock( &L1_proc->mutex);
|
||||||
|
if (++sleep_cnt == ru->wakeup_L1_sleep_cnt_max) {
|
||||||
|
LOG_E(PHY,"Frame %d, subframe %d: RXTX0 thread busy, dropping\n",L1_proc->frame_rx,L1_proc->subframe_rx);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
usleep(ru->wakeup_L1_sleeptime);
|
||||||
|
|
||||||
|
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", L1_proc->subframe_rx&1,L1_proc->instance_cnt );
|
||||||
|
exit_fun( "error locking mutex_rxtx" );
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
++L1_proc->instance_cnt;
|
||||||
|
// 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
|
||||||
// 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,
|
||||||
@@ -938,10 +979,10 @@ 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!=NFAPI_MODE_VNF) {
|
||||||
pthread_create( &L1_proc->pthread, attr0, L1_thread, proc );
|
pthread_create( &L1_proc->pthread, attr0, L1_thread, proc );
|
||||||
pthread_create( &L1_proc_tx->pthread, attr1, L1_thread_tx, proc);
|
pthread_create( &L1_proc_tx->pthread, attr1, L1_thread_tx, proc);
|
||||||
} else if (nfapi_mode == 2) { // this is neccesary in VNF or L2 FAPI simulator.
|
} else if (NFAPI_MODE==NFAPI_MODE_VNF) { // this is neccesary in VNF or L2 FAPI simulator.
|
||||||
// Original Code from Fujitsu w/ old structure/field name
|
// Original Code from Fujitsu w/ old structure/field name
|
||||||
//pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, &proc_rxtx[0] );
|
//pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, &proc_rxtx[0] );
|
||||||
//pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, eNB_thread_rxtx, &proc_rxtx[1] );
|
//pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, eNB_thread_rxtx, &proc_rxtx[1] );
|
||||||
@@ -1004,7 +1045,7 @@ 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 );
|
||||||
|
|
||||||
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!=NFAPI_MODE_VNF) {
|
||||||
pthread_mutex_lock(&L1_proc->mutex);
|
pthread_mutex_lock(&L1_proc->mutex);
|
||||||
L1_proc->instance_cnt = 0;
|
L1_proc->instance_cnt = 0;
|
||||||
pthread_cond_signal(&L1_proc->cond);
|
pthread_cond_signal(&L1_proc->cond);
|
||||||
@@ -1036,7 +1077,7 @@ 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);
|
||||||
|
|
||||||
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!=NFAPI_MODE_VNF) {
|
||||||
LOG_I(PHY, "Joining L1_proc mutex/cond\n");
|
LOG_I(PHY, "Joining L1_proc mutex/cond\n");
|
||||||
pthread_join( L1_proc->pthread, (void **)&status );
|
pthread_join( L1_proc->pthread, (void **)&status );
|
||||||
LOG_I(PHY, "Joining L1_proc_tx mutex/cond\n");
|
LOG_I(PHY, "Joining L1_proc_tx mutex/cond\n");
|
||||||
|
|||||||
+55
-35
@@ -76,6 +76,7 @@
|
|||||||
#include "PHY_INTERFACE/phy_interface.h"
|
#include "PHY_INTERFACE/phy_interface.h"
|
||||||
|
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "UTIL/OTG/otg_tx.h"
|
#include "UTIL/OTG/otg_tx.h"
|
||||||
#include "UTIL/OTG/otg_externs.h"
|
#include "UTIL/OTG/otg_externs.h"
|
||||||
#include "UTIL/MATH/oml.h"
|
#include "UTIL/MATH/oml.h"
|
||||||
@@ -110,7 +111,7 @@ extern int emulate_rf;
|
|||||||
extern int numerology;
|
extern int numerology;
|
||||||
extern clock_source_t clock_source;
|
extern clock_source_t clock_source;
|
||||||
extern uint8_t dlsch_ue_select_tbl_in_use;
|
extern uint8_t dlsch_ue_select_tbl_in_use;
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
|
|
||||||
extern PARALLEL_CONF_t get_thread_parallel_conf(void);
|
extern PARALLEL_CONF_t get_thread_parallel_conf(void);
|
||||||
extern WORKER_CONF_t get_thread_worker_conf(void);
|
extern WORKER_CONF_t get_thread_worker_conf(void);
|
||||||
@@ -623,15 +624,15 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
|
|||||||
|
|
||||||
if (ru->fh_north_asynch_in == NULL) {
|
if (ru->fh_north_asynch_in == NULL) {
|
||||||
#ifdef PHY_TX_THREAD
|
#ifdef PHY_TX_THREAD
|
||||||
proc->timestamp_phy_tx = proc->timestamp_rx+((sf_ahead-1)*fp->samples_per_tti);
|
proc->timestamp_phy_tx = proc->timestamp_rx+((sf_ahead-1)*fp->samples_per_tti);
|
||||||
proc->subframe_phy_tx = (proc->subframe_rx+(sf_ahead-1))%10;
|
proc->subframe_phy_tx = (proc->subframe_rx+(sf_ahead-1))%10;
|
||||||
proc->frame_phy_tx = (proc->subframe_rx>(9-(sf_ahead-1))) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
proc->frame_phy_tx = (proc->subframe_rx>(9-(sf_ahead-1))) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
||||||
#else
|
|
||||||
proc->timestamp_tx = proc->timestamp_rx+(sf_ahead*fp->samples_per_tti);
|
|
||||||
proc->subframe_tx = (proc->subframe_rx+sf_ahead)%10;
|
|
||||||
proc->frame_tx = (proc->subframe_rx>(9-sf_ahead)) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
LOG_D(PHY,"RU %d/%d TS %llu (off %d), frame %d, subframe %d\n",
|
||||||
|
ru->idx,
|
||||||
|
0,
|
||||||
|
(unsigned long long int)proc->timestamp_rx,
|
||||||
|
(int)ru->ts_offset,proc->frame_rx,proc->subframe_rx);
|
||||||
|
|
||||||
LOG_D(PHY,"south_in/rx_rf: RU %d/%d TS %llu (off %d), frame %d, subframe %d\n",
|
LOG_D(PHY,"south_in/rx_rf: RU %d/%d TS %llu (off %d), frame %d, subframe %d\n",
|
||||||
ru->idx,
|
ru->idx,
|
||||||
@@ -1080,6 +1081,7 @@ int check_sync(RU_t *ru, RU_t *ru_master, int subframe){
|
|||||||
void wakeup_L1s(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_L1s (num %d) for RU %d (%d.%d)\n",ru->num_eNB,ru->idx, ru->proc.frame_rx,ru->proc.subframe_rx);
|
||||||
|
|
||||||
PHY_VARS_eNB *eNB=eNB_list[0];
|
PHY_VARS_eNB *eNB=eNB_list[0];
|
||||||
L1_proc_t *proc = &eNB->proc;
|
L1_proc_t *proc = &eNB->proc;
|
||||||
@@ -1451,7 +1453,6 @@ void *ru_thread_tx( void *param ) {
|
|||||||
//pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
|
//pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
|
||||||
//wait_sync("ru_thread_tx");
|
//wait_sync("ru_thread_tx");
|
||||||
wait_on_condition(&proc->mutex_FH1,&proc->cond_FH1,&proc->instance_cnt_FH1,"ru_thread_tx");
|
wait_on_condition(&proc->mutex_FH1,&proc->cond_FH1,&proc->instance_cnt_FH1,"ru_thread_tx");
|
||||||
printf( "ru_thread_tx ready\n");
|
|
||||||
|
|
||||||
while (!oai_exit) {
|
while (!oai_exit) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_CPUID_RU_THREAD_TX,sched_getcpu());
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_CPUID_RU_THREAD_TX,sched_getcpu());
|
||||||
@@ -1462,6 +1463,8 @@ void *ru_thread_tx( void *param ) {
|
|||||||
// wait until eNBs are finished subframe RX n and TX n+4
|
// wait until eNBs are finished subframe RX n and TX n+4
|
||||||
wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,"ru_thread_tx");
|
wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,"ru_thread_tx");
|
||||||
|
|
||||||
|
LOG_D(PHY,"ru_thread_tx: TX in %d.%d\n",ru->proc.frame_tx,ru->proc.subframe_tx);
|
||||||
|
|
||||||
if (oai_exit) break;
|
if (oai_exit) break;
|
||||||
|
|
||||||
// do TX front-end processing if needed (precoding and/or IDFTs)
|
// do TX front-end processing if needed (precoding and/or IDFTs)
|
||||||
@@ -1474,7 +1477,7 @@ void *ru_thread_tx( void *param ) {
|
|||||||
// do outgoing fronthaul (south) if needed
|
// do outgoing fronthaul (south) if needed
|
||||||
if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru);
|
if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru);
|
||||||
}
|
}
|
||||||
|
LOG_D(PHY,"ru_thread_tx: releasing RU TX in %d.%d\n",proc->frame_tx,proc->subframe_tx);
|
||||||
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++) {
|
for(int i = 0; i<ru->num_eNB; i++) {
|
||||||
@@ -1505,6 +1508,8 @@ void *ru_thread_tx( void *param ) {
|
|||||||
pthread_mutex_unlock(&eNB_proc->mutex_RU_tx);
|
pthread_mutex_unlock(&eNB_proc->mutex_RU_tx);
|
||||||
pthread_mutex_lock( &L1_proc->mutex_RUs);
|
pthread_mutex_lock( &L1_proc->mutex_RUs);
|
||||||
L1_proc->instance_cnt_RUs = 0;
|
L1_proc->instance_cnt_RUs = 0;
|
||||||
|
|
||||||
|
LOG_D(PHY,"ru_thread_tx: Signaling RU TX done in %d.%d\n",proc->frame_tx,proc->subframe_tx);
|
||||||
// the thread can now be woken up
|
// the thread can now be woken up
|
||||||
LOG_D(PHY,"ru_thread_tx: clearing mask and Waking up L1 thread\n");
|
LOG_D(PHY,"ru_thread_tx: clearing mask and Waking up L1 thread\n");
|
||||||
if (pthread_cond_signal(&L1_proc->cond_RUs) != 0) {
|
if (pthread_cond_signal(&L1_proc->cond_RUs) != 0) {
|
||||||
@@ -1896,7 +1901,7 @@ void *pre_scd_thread( void *param ) {
|
|||||||
RU_t *ru = (RU_t *)param;
|
RU_t *ru = (RU_t *)param;
|
||||||
|
|
||||||
// L2-emulator can work only one eNB
|
// L2-emulator can work only one eNB
|
||||||
if( nfapi_mode == 2)
|
if( NFAPI_MODE==NFAPI_MODE_VNF)
|
||||||
Mod_id = 0;
|
Mod_id = 0;
|
||||||
else
|
else
|
||||||
Mod_id = ru->eNB_list[0]->Mod_id;
|
Mod_id = ru->eNB_list[0]->Mod_id;
|
||||||
@@ -1969,32 +1974,31 @@ 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) {
|
AssertFatal(ru->num_eNB == 1, "handle multiple L1 case\n");
|
||||||
L1_proc.subframe_tx = proc->subframe_phy_tx;
|
L1_proc.subframe_tx = proc->subframe_phy_tx;
|
||||||
L1_proc.frame_tx = proc->frame_phy_tx;
|
L1_proc.frame_tx = proc->frame_phy_tx;
|
||||||
phy_procedures_eNB_TX(eNB_list[0], &L1_proc, 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);
|
||||||
exit_fun( "error locking mutex_rf_tx" );
|
exit_fun( "error locking mutex_rf_tx" );
|
||||||
}
|
|
||||||
|
|
||||||
if (ru->proc.instance_cnt_rf_tx==-1) {
|
|
||||||
++ru->proc.instance_cnt_rf_tx;
|
|
||||||
ru->proc.frame_tx = proc->frame_phy_tx;
|
|
||||||
ru->proc.subframe_tx = proc->subframe_phy_tx;
|
|
||||||
ru->proc.timestamp_tx = proc->timestamp_phy_tx;
|
|
||||||
// the thread can now be woken up
|
|
||||||
AssertFatal(pthread_cond_signal(&ru->proc.cond_rf_tx) == 0, "ERROR pthread_cond_signal for rf_tx thread\n");
|
|
||||||
} else {
|
|
||||||
LOG_E(PHY,"rf tx thread busy, skipping\n");
|
|
||||||
late_control=STATE_BURST_TERMINATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock( &ru->proc.mutex_rf_tx );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ru->proc.instance_cnt_rf_tx==-1) {
|
||||||
|
++ru->proc.instance_cnt_rf_tx;
|
||||||
|
ru->proc.frame_tx = proc->frame_phy_tx;
|
||||||
|
ru->proc.subframe_tx = proc->subframe_phy_tx;
|
||||||
|
ru->proc.timestamp_tx = proc->timestamp_phy_tx;
|
||||||
|
// the thread can now be woken up
|
||||||
|
AssertFatal(pthread_cond_signal(&ru->proc.cond_rf_tx) == 0, "ERROR pthread_cond_signal for rf_tx thread\n");
|
||||||
|
} else {
|
||||||
|
LOG_E(PHY,"rf tx thread busy, skipping\n");
|
||||||
|
late_control=STATE_BURST_TERMINATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock( &ru->proc.mutex_rf_tx );
|
||||||
|
|
||||||
if (release_thread(&proc->mutex_phy_tx,&proc->instance_cnt_phy_tx,"eNB_thread_phy_tx") < 0) break;
|
if (release_thread(&proc->mutex_phy_tx,&proc->instance_cnt_phy_tx,"eNB_thread_phy_tx") < 0) break;
|
||||||
|
|
||||||
phy_tx_end = 1;
|
phy_tx_end = 1;
|
||||||
@@ -2616,6 +2620,22 @@ void init_RU(char *rf_config_file, clock_source_t clock_source,clock_source_t ti
|
|||||||
generate_ul_ref_sigs();
|
generate_ul_ref_sigs();
|
||||||
ru->dmrssync = (int16_t*)malloc16_clear(ru->frame_parms.ofdm_symbol_size*2*sizeof(int16_t));
|
ru->dmrssync = (int16_t*)malloc16_clear(ru->frame_parms.ofdm_symbol_size*2*sizeof(int16_t));
|
||||||
}
|
}
|
||||||
|
ru->wakeup_L1_sleeptime = 2000;
|
||||||
|
ru->wakeup_L1_sleep_cnt_max = 3;
|
||||||
|
if (ru->num_eNB > 0) {
|
||||||
|
LOG_D(PHY, "%s() RC.ru[%d].num_eNB:%d ru->eNB_list[0]:%p RC.eNB[0][0]:%p rf_config_file:%s\n", __FUNCTION__, ru_id, ru->num_eNB, ru->eNB_list[0], RC.eNB[0][0], ru->rf_config_file);
|
||||||
|
|
||||||
|
if (ru->eNB_list[0] == 0) {
|
||||||
|
LOG_E(PHY,"%s() DJP - ru->eNB_list ru->num_eNB are not initialized - so do it manually\n", __FUNCTION__);
|
||||||
|
ru->eNB_list[0] = RC.eNB[0][0];
|
||||||
|
ru->num_eNB=1;
|
||||||
|
//
|
||||||
|
// DJP - feptx_prec() / feptx_ofdm() parses the eNB_list (based on num_eNB) and copies the txdata_F to txdata in RU
|
||||||
|
//
|
||||||
|
} else {
|
||||||
|
LOG_E(PHY,"DJP - delete code above this %s:%d\n", __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
eNB0 = ru->eNB_list[0];
|
eNB0 = ru->eNB_list[0];
|
||||||
LOG_D(PHY, "RU FUnction:%d ru->if_south:%d\n", ru->function, ru->if_south);
|
LOG_D(PHY, "RU FUnction:%d ru->if_south:%d\n", ru->function, ru->if_south);
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
#include "LAYER2/MAC/mac_proto.h"
|
#include "LAYER2/MAC/mac_proto.h"
|
||||||
#include "RRC/LTE/rrc_vars.h"
|
#include "RRC/LTE/rrc_vars.h"
|
||||||
#include "PHY_INTERFACE/phy_interface_vars.h"
|
#include "PHY_INTERFACE/phy_interface_vars.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#ifdef SMBV
|
#ifdef SMBV
|
||||||
#include "PHY/TOOLS/smbv.h"
|
#include "PHY/TOOLS/smbv.h"
|
||||||
unsigned short config_frames[4] = {2,9,11,13};
|
unsigned short config_frames[4] = {2,9,11,13};
|
||||||
@@ -112,7 +112,6 @@ pthread_cond_t nfapi_sync_cond;
|
|||||||
pthread_mutex_t nfapi_sync_mutex;
|
pthread_mutex_t nfapi_sync_mutex;
|
||||||
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
|
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
|
||||||
|
|
||||||
uint8_t nfapi_mode = 0; // Default to monolithic mode
|
|
||||||
|
|
||||||
uint16_t sf_ahead=4;
|
uint16_t sf_ahead=4;
|
||||||
|
|
||||||
@@ -133,7 +132,7 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
|||||||
int UE_scan = 1;
|
int UE_scan = 1;
|
||||||
int UE_scan_carrier = 0;
|
int UE_scan_carrier = 0;
|
||||||
runmode_t mode = normal_txrx;
|
runmode_t mode = normal_txrx;
|
||||||
int simL1flag;
|
|
||||||
FILE *input_fd=NULL;
|
FILE *input_fd=NULL;
|
||||||
|
|
||||||
|
|
||||||
@@ -657,21 +656,22 @@ int main( int argc, char **argv ) {
|
|||||||
/* Read configuration */
|
/* Read configuration */
|
||||||
if (RC.nb_inst > 0)
|
if (RC.nb_inst > 0)
|
||||||
read_config_and_init();
|
read_config_and_init();
|
||||||
|
|
||||||
/* Start the agent. If it is turned off in the configuration, it won't start */
|
/* Start the agent. If it is turned off in the configuration, it won't start */
|
||||||
RCconfig_flexran();
|
RCconfig_flexran();
|
||||||
|
|
||||||
for (i = 0; i < RC.nb_inst; i++) {
|
for (i = 0; i < RC.nb_inst; i++) {
|
||||||
flexran_agent_start(i);
|
flexran_agent_start(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t pdcp_initmask = ( IS_SOFTMODEM_NOS1 )? ( PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT;
|
uint32_t pdcp_initmask = ( IS_SOFTMODEM_NOS1 )? ( PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT;
|
||||||
|
|
||||||
if ( IS_SOFTMODEM_NOS1)
|
if ( IS_SOFTMODEM_NOS1)
|
||||||
pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ;
|
pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ;
|
||||||
|
|
||||||
pdcp_module_init(pdcp_initmask);
|
pdcp_module_init(pdcp_initmask);
|
||||||
|
|
||||||
if (RC.nb_inst > 0) {
|
if (RC.nb_inst > 0) {
|
||||||
|
|
||||||
if (create_tasks(1) < 0) {
|
if (create_tasks(1) < 0) {
|
||||||
printf("cannot create ITTI tasks\n");
|
printf("cannot create ITTI tasks\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
@@ -682,8 +682,7 @@ int main( int argc, char **argv ) {
|
|||||||
RRC_CONFIGURATION_REQ(msg_p) = RC.rrc[enb_id]->configuration;
|
RRC_CONFIGURATION_REQ(msg_p) = RC.rrc[enb_id]->configuration;
|
||||||
itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p);
|
itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
printf("No ITTI, Initializing L1\n");
|
printf("No ITTI, Initializing L1\n");
|
||||||
RCconfig_L1();
|
RCconfig_L1();
|
||||||
}
|
}
|
||||||
@@ -705,7 +704,6 @@ int main( int argc, char **argv ) {
|
|||||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||||
pthread_cond_init(&sync_cond,NULL);
|
pthread_cond_init(&sync_cond,NULL);
|
||||||
pthread_mutex_init(&sync_mutex, NULL);
|
pthread_mutex_init(&sync_mutex, NULL);
|
||||||
|
|
||||||
#ifdef XFORMS
|
#ifdef XFORMS
|
||||||
int UE_id;
|
int UE_id;
|
||||||
printf("XFORMS\n");
|
printf("XFORMS\n");
|
||||||
@@ -740,39 +738,17 @@ int main( int argc, char **argv ) {
|
|||||||
|
|
||||||
printf("Scope thread created, ret=%d\n",ret);
|
printf("Scope thread created, ret=%d\n",ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rt_sleep_ns(10*100000000ULL);
|
rt_sleep_ns(10*100000000ULL);
|
||||||
|
|
||||||
if (nfapi_mode) {
|
if (NFAPI_MODE!=NFAPI_MONOLITHIC) {
|
||||||
LOG_I(ENB_APP,"NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n");
|
LOG_I(ENB_APP,"NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n");
|
||||||
pthread_cond_init(&sync_cond,NULL);
|
pthread_cond_init(&sync_cond,NULL);
|
||||||
pthread_mutex_init(&sync_mutex, NULL);
|
pthread_mutex_init(&sync_mutex, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *nfapi_mode_str = "<UNKNOWN>";
|
if (NFAPI_MODE==NFAPI_MODE_VNF) {// VNF
|
||||||
|
|
||||||
switch(nfapi_mode) {
|
|
||||||
case 0:
|
|
||||||
nfapi_mode_str = "MONOLITHIC";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
nfapi_mode_str = "PNF";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
nfapi_mode_str = "VNF";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
nfapi_mode_str = "<UNKNOWN NFAPI MODE>";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_I(ENB_APP,"NFAPI MODE:%s\n", nfapi_mode_str);
|
|
||||||
|
|
||||||
if (nfapi_mode==2) {// VNF
|
|
||||||
#if defined(PRE_SCD_THREAD)
|
#if defined(PRE_SCD_THREAD)
|
||||||
init_ru_vnf(); // ru pointer is necessary for pre_scd.
|
init_ru_vnf(); // ru pointer is necessary for pre_scd.
|
||||||
#endif
|
#endif
|
||||||
@@ -798,7 +774,7 @@ int main( int argc, char **argv ) {
|
|||||||
// RU thread and some L1 procedure aren't necessary in VNF or L2 FAPI simulator.
|
// RU thread and some L1 procedure aren't necessary in VNF or L2 FAPI simulator.
|
||||||
// but RU thread deals with pre_scd and this is necessary in VNF and simulator.
|
// but RU thread deals with pre_scd and this is necessary in VNF and simulator.
|
||||||
// some initialization is necessary and init_ru_vnf do this.
|
// some initialization is necessary and init_ru_vnf do this.
|
||||||
if (RC.nb_RU >0 && nfapi_mode != 2) {
|
if (RC.nb_RU >0 && NFAPI_MODE!=NFAPI_MODE_VNF) {
|
||||||
printf("Initializing RU threads\n");
|
printf("Initializing RU threads\n");
|
||||||
init_RU(get_softmodem_params()->rf_config_file,get_softmodem_params()->clock_source,get_softmodem_params()->timing_source,get_softmodem_params()->send_dmrs_sync);
|
init_RU(get_softmodem_params()->rf_config_file,get_softmodem_params()->clock_source,get_softmodem_params()->timing_source,get_softmodem_params()->send_dmrs_sync);
|
||||||
|
|
||||||
@@ -809,35 +785,34 @@ int main( int argc, char **argv ) {
|
|||||||
|
|
||||||
config_sync_var=0;
|
config_sync_var=0;
|
||||||
|
|
||||||
if (nfapi_mode==1) { // PNF
|
if (NFAPI_MODE==NFAPI_MODE_PNF) { // PNF
|
||||||
wait_nfapi_init("main?");
|
wait_nfapi_init("main?");
|
||||||
}
|
|
||||||
|
|
||||||
printf("wait RUs\n");
|
|
||||||
fflush(stdout);
|
|
||||||
fflush(stderr);
|
|
||||||
wait_RUs();
|
|
||||||
LOG_I(PHY,"RC.nb_RU:%d\n", RC.nb_RU);
|
|
||||||
// once all RUs are ready intiailize the rest of the eNBs ((dependence on final RU parameters after configuration)
|
|
||||||
LOG_I(PHY,"ALL RUs ready - init eNBs\n");
|
|
||||||
|
|
||||||
if (nfapi_mode != 1 && nfapi_mode != 2) {
|
|
||||||
LOG_I(PHY,"Not NFAPI mode - call init_eNB_afterRU()\n");
|
|
||||||
init_eNB_afterRU();
|
|
||||||
} else {
|
|
||||||
LOG_I(PHY,"NFAPI mode - DO NOT call init_eNB_afterRU()\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_UI(PHY,"ALL RUs ready - ALL eNBs ready\n");
|
|
||||||
// connect the TX/RX buffers
|
|
||||||
sleep(1); /* wait for thread activation */
|
|
||||||
LOG_I(PHY,"Sending sync to all threads\n");
|
|
||||||
pthread_mutex_lock(&sync_mutex);
|
|
||||||
sync_var=0;
|
|
||||||
pthread_cond_broadcast(&sync_cond);
|
|
||||||
pthread_mutex_unlock(&sync_mutex);
|
|
||||||
config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("wait RUs\n");
|
||||||
|
fflush(stdout);
|
||||||
|
fflush(stderr);
|
||||||
|
wait_RUs();
|
||||||
|
LOG_I(ENB_APP,"RC.nb_RU:%d\n", RC.nb_RU);
|
||||||
|
// once all RUs are ready intiailize the rest of the eNBs ((dependence on final RU parameters after configuration)
|
||||||
|
printf("ALL RUs ready - init eNBs\n");
|
||||||
|
|
||||||
|
if (NFAPI_MODE!=NFAPI_MODE_PNF && NFAPI_MODE!=NFAPI_MODE_VNF) {
|
||||||
|
LOG_I(ENB_APP,"Not NFAPI mode - call init_eNB_afterRU()\n");
|
||||||
|
init_eNB_afterRU();
|
||||||
|
} else {
|
||||||
|
LOG_I(ENB_APP,"NFAPI mode - DO NOT call init_eNB_afterRU()\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_UI(ENB_APP,"ALL RUs ready - ALL eNBs ready\n");
|
||||||
|
// connect the TX/RX buffers
|
||||||
|
sleep(1); /* wait for thread activation */
|
||||||
|
LOG_I(ENB_APP,"Sending sync to all threads\n");
|
||||||
|
pthread_mutex_lock(&sync_mutex);
|
||||||
|
sync_var=0;
|
||||||
|
pthread_cond_broadcast(&sync_cond);
|
||||||
|
pthread_mutex_unlock(&sync_mutex);
|
||||||
|
config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS);
|
||||||
}
|
}
|
||||||
// wait for end of program
|
// wait for end of program
|
||||||
LOG_UI(ENB_APP,"TYPE <CTRL-C> TO TERMINATE\n");
|
LOG_UI(ENB_APP,"TYPE <CTRL-C> TO TERMINATE\n");
|
||||||
@@ -846,8 +821,7 @@ int main( int argc, char **argv ) {
|
|||||||
oai_exit=1;
|
oai_exit=1;
|
||||||
LOG_I(ENB_APP,"oai_exit=%d\n",oai_exit);
|
LOG_I(ENB_APP,"oai_exit=%d\n",oai_exit);
|
||||||
// stop threads
|
// stop threads
|
||||||
|
|
||||||
|
|
||||||
if (RC.nb_inst == 0 || !NODE_IS_CU(RC.rrc[0]->node_type)) {
|
if (RC.nb_inst == 0 || !NODE_IS_CU(RC.rrc[0]->node_type)) {
|
||||||
int UE_id;
|
int UE_id;
|
||||||
#ifdef XFORMS
|
#ifdef XFORMS
|
||||||
@@ -868,10 +842,10 @@ int main( int argc, char **argv ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LOG_I(ENB_APP,"stopping MODEM threads\n");
|
LOG_I(ENB_APP,"stopping MODEM threads\n");
|
||||||
stop_eNB(NB_eNB_INST);
|
stop_eNB(NB_eNB_INST);
|
||||||
stop_RU(RC.nb_RU);
|
stop_RU(RC.nb_RU);
|
||||||
|
|
||||||
/* release memory used by the RU/eNB threads (incomplete), after all
|
/* release memory used by the RU/eNB threads (incomplete), after all
|
||||||
* threads have been stopped (they partially use the same memory) */
|
* threads have been stopped (they partially use the same memory) */
|
||||||
for (int inst = 0; inst < NB_eNB_INST; inst++) {
|
for (int inst = 0; inst < NB_eNB_INST; inst++) {
|
||||||
@@ -880,9 +854,11 @@ int main( int argc, char **argv ) {
|
|||||||
phy_free_lte_eNB(RC.eNB[inst][cc_id]);
|
phy_free_lte_eNB(RC.eNB[inst][cc_id]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int inst = 0; inst < RC.nb_RU; inst++) {
|
for (int inst = 0; inst < RC.nb_RU; inst++) {
|
||||||
phy_free_RU(RC.ru[inst]);
|
phy_free_RU(RC.ru[inst]);
|
||||||
}
|
}
|
||||||
|
|
||||||
free_lte_top();
|
free_lte_top();
|
||||||
end_configmodule();
|
end_configmodule();
|
||||||
pthread_cond_destroy(&sync_cond);
|
pthread_cond_destroy(&sync_cond);
|
||||||
@@ -890,12 +866,13 @@ int main( int argc, char **argv ) {
|
|||||||
pthread_cond_destroy(&nfapi_sync_cond);
|
pthread_cond_destroy(&nfapi_sync_cond);
|
||||||
pthread_mutex_destroy(&nfapi_sync_mutex);
|
pthread_mutex_destroy(&nfapi_sync_mutex);
|
||||||
pthread_mutex_destroy(&ue_pf_po_mutex);
|
pthread_mutex_destroy(&ue_pf_po_mutex);
|
||||||
|
|
||||||
for(ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
for(ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
||||||
if (RC.ru[ru_id]->rfdevice.trx_end_func) {
|
if (RC.ru[ru_id]->rfdevice.trx_end_func) {
|
||||||
RC.ru[ru_id]->rfdevice.trx_end_func(&RC.ru[ru_id]->rfdevice);
|
RC.ru[ru_id]->rfdevice.trx_end_func(&RC.ru[ru_id]->rfdevice);
|
||||||
RC.ru[ru_id]->rfdevice.trx_end_func = NULL;
|
RC.ru[ru_id]->rfdevice.trx_end_func = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RC.ru[ru_id]->ifdevice.trx_end_func) {
|
if (RC.ru[ru_id]->ifdevice.trx_end_func) {
|
||||||
RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice);
|
RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice);
|
||||||
RC.ru[ru_id]->ifdevice.trx_end_func = NULL;
|
RC.ru[ru_id]->ifdevice.trx_end_func = NULL;
|
||||||
|
|||||||
@@ -247,6 +247,7 @@
|
|||||||
#define SOFTMODEM_NONBIOT_BIT (1<<2)
|
#define SOFTMODEM_NONBIOT_BIT (1<<2)
|
||||||
#define SOFTMODEM_RFSIM_BIT (1<<10)
|
#define SOFTMODEM_RFSIM_BIT (1<<10)
|
||||||
#define SOFTMODEM_BASICSIM_BIT (1<<11)
|
#define SOFTMODEM_BASICSIM_BIT (1<<11)
|
||||||
|
#define SOFTMODEM_SIML1_BIT (1<<12)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint64_t optmask;
|
uint64_t optmask;
|
||||||
THREAD_STRUCT thread_struct;
|
THREAD_STRUCT thread_struct;
|
||||||
@@ -271,6 +272,7 @@ typedef struct {
|
|||||||
#define IS_SOFTMODEM_NONBIOT ( get_softmodem_optmask() & SOFTMODEM_NONBIOT_BIT)
|
#define IS_SOFTMODEM_NONBIOT ( get_softmodem_optmask() & SOFTMODEM_NONBIOT_BIT)
|
||||||
#define IS_SOFTMODEM_RFSIM ( get_softmodem_optmask() & SOFTMODEM_RFSIM_BIT)
|
#define IS_SOFTMODEM_RFSIM ( get_softmodem_optmask() & SOFTMODEM_RFSIM_BIT)
|
||||||
#define IS_SOFTMODEM_BASICSIM ( get_softmodem_optmask() & SOFTMODEM_BASICSIM_BIT)
|
#define IS_SOFTMODEM_BASICSIM ( get_softmodem_optmask() & SOFTMODEM_BASICSIM_BIT)
|
||||||
|
#define IS_SOFTMODEM_SIML1 ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT)
|
||||||
extern uint64_t get_softmodem_optmask(void);
|
extern uint64_t get_softmodem_optmask(void);
|
||||||
extern uint64_t set_softmodem_optmask(uint64_t bitmask);
|
extern uint64_t set_softmodem_optmask(uint64_t bitmask);
|
||||||
extern void get_common_options(void);
|
extern void get_common_options(void);
|
||||||
|
|||||||
+17
-15
@@ -53,6 +53,7 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "UTIL/OTG/otg_tx.h"
|
#include "UTIL/OTG/otg_tx.h"
|
||||||
#include "UTIL/OTG/otg_externs.h"
|
#include "UTIL/OTG/otg_externs.h"
|
||||||
#include "UTIL/MATH/oml.h"
|
#include "UTIL/MATH/oml.h"
|
||||||
@@ -63,7 +64,7 @@
|
|||||||
#include "T.h"
|
#include "T.h"
|
||||||
|
|
||||||
extern double cpuf;
|
extern double cpuf;
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
|
|
||||||
#define FRAME_PERIOD 100000000ULL
|
#define FRAME_PERIOD 100000000ULL
|
||||||
#define DAQ_PERIOD 66667ULL
|
#define DAQ_PERIOD 66667ULL
|
||||||
@@ -93,7 +94,7 @@ extern int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind);
|
|||||||
extern int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind);
|
extern int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind);
|
||||||
extern int multicast_link_write_sock(int groupP, char *dataP, uint32_t sizeP);
|
extern int multicast_link_write_sock(int groupP, char *dataP, uint32_t sizeP);
|
||||||
|
|
||||||
extern int simL1flag;
|
|
||||||
extern uint16_t sf_ahead;
|
extern uint16_t sf_ahead;
|
||||||
//extern int tx_req_UE_MAC1();
|
//extern int tx_req_UE_MAC1();
|
||||||
|
|
||||||
@@ -192,7 +193,7 @@ PHY_VARS_UE *init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
ue->mac_enabled = 1;
|
ue->mac_enabled = 1;
|
||||||
|
|
||||||
// In phy_stub_UE (MAC-to-MAC) mode these init functions don't need to get called. Is this correct?
|
// In phy_stub_UE (MAC-to-MAC) mode these init functions don't need to get called. Is this correct?
|
||||||
if (nfapi_mode!=3) {
|
if (NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
|
||||||
// initialize all signal buffers
|
// initialize all signal buffers
|
||||||
init_lte_ue_signal(ue,1,abstraction_flag);
|
init_lte_ue_signal(ue,1,abstraction_flag);
|
||||||
// intialize transport
|
// intialize transport
|
||||||
@@ -266,7 +267,7 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti
|
|||||||
|
|
||||||
LOG_I(PHY,"Allocating UE context %d\n",inst);
|
LOG_I(PHY,"Allocating UE context %d\n",inst);
|
||||||
|
|
||||||
if (simL1flag == 0) PHY_vars_UE_g[inst][0] = init_ue_vars(fp0,inst,0);
|
if ( !IS_SOFTMODEM_SIML1 ) PHY_vars_UE_g[inst][0] = init_ue_vars(fp0,inst,0);
|
||||||
else {
|
else {
|
||||||
// needed for memcopy below. these are not used in the RU, but needed for UE
|
// needed for memcopy below. these are not used in the RU, but needed for UE
|
||||||
RC.ru[0]->frame_parms.nb_antennas_rx = fp0->nb_antennas_rx;
|
RC.ru[0]->frame_parms.nb_antennas_rx = fp0->nb_antennas_rx;
|
||||||
@@ -354,12 +355,12 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti
|
|||||||
*/
|
*/
|
||||||
UE->N_TA_offset = 0;
|
UE->N_TA_offset = 0;
|
||||||
|
|
||||||
if (simL1flag == 1) init_ue_devices(UE);
|
if (IS_SOFTMODEM_SIML1 ) init_ue_devices(UE);
|
||||||
|
|
||||||
LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
|
LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
|
||||||
init_UE_threads(inst);
|
init_UE_threads(inst);
|
||||||
|
|
||||||
if (simL1flag == 0) {
|
if (!IS_SOFTMODEM_SIML1 ) {
|
||||||
ret = openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]);
|
ret = openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]);
|
||||||
|
|
||||||
if (ret !=0) {
|
if (ret !=0) {
|
||||||
@@ -397,7 +398,7 @@ void init_UE_stub_single_thread(int nb_inst,int eMBMS_active, int uecap_xer_in,
|
|||||||
printf("UE threads created \n");
|
printf("UE threads created \n");
|
||||||
LOG_I(PHY,"Starting multicast link on %s\n",emul_iface);
|
LOG_I(PHY,"Starting multicast link on %s\n",emul_iface);
|
||||||
|
|
||||||
if(nfapi_mode!=3)
|
if(NFAPI_MODE!=NFAPI_UE_STUB_PNF)
|
||||||
multicast_link_start(ue_stub_rx_handler,0,emul_iface);
|
multicast_link_start(ue_stub_rx_handler,0,emul_iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -427,7 +428,7 @@ void init_UE_stub(int nb_inst,int eMBMS_active, int uecap_xer_in, char *emul_ifa
|
|||||||
printf("UE threads created \n");
|
printf("UE threads created \n");
|
||||||
LOG_I(PHY,"Starting multicast link on %s\n",emul_iface);
|
LOG_I(PHY,"Starting multicast link on %s\n",emul_iface);
|
||||||
|
|
||||||
if(nfapi_mode !=3)
|
if(NFAPI_MODE!=NFAPI_UE_STUB_PNF)
|
||||||
multicast_link_start(ue_stub_rx_handler,0,emul_iface);
|
multicast_link_start(ue_stub_rx_handler,0,emul_iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -889,7 +890,7 @@ void ue_stub_rx_handler(unsigned int num_bytes, char *rx_buffer) {
|
|||||||
switch (((UE_tport_header_t *)rx_buffer)->packet_type) {
|
switch (((UE_tport_header_t *)rx_buffer)->packet_type) {
|
||||||
case TTI_SYNC:
|
case TTI_SYNC:
|
||||||
emulator_absSF = ((UE_tport_header_t *)rx_buffer)->absSF;
|
emulator_absSF = ((UE_tport_header_t *)rx_buffer)->absSF;
|
||||||
wakeup_thread(&UE->timer_mutex,&UE->timer_cond,&UE->instance_cnt_timer,"timer_thread");
|
wakeup_thread(&UE->timer_mutex,&UE->timer_cond,&UE->instance_cnt_timer,"timer_thread",100,1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLSCH:
|
case SLSCH:
|
||||||
@@ -1123,7 +1124,7 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg) {
|
|||||||
hi_dci0_req_UE_MAC(hi_dci0_req, ue_Mod_id);
|
hi_dci0_req_UE_MAC(hi_dci0_req, ue_Mod_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nfapi_mode!=3)
|
if(NFAPI_MODE!=NFAPI_UE_STUB_PNF)
|
||||||
phy_procedures_UE_SL_TX(UE,proc);
|
phy_procedures_UE_SL_TX(UE,proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1405,7 +1406,7 @@ static void *UE_phy_stub_thread_rxn_txnp4(void *arg) {
|
|||||||
hi_dci0_req = NULL;
|
hi_dci0_req = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nfapi_mode != 3)
|
if (NFAPI_MODE!=NFAPI_UE_STUB_PNF)
|
||||||
phy_procedures_UE_SL_TX(UE,proc);
|
phy_procedures_UE_SL_TX(UE,proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1735,7 +1736,7 @@ void *UE_thread(void *arg) {
|
|||||||
LOG_E(PHY,"Missed real time\n");
|
LOG_E(PHY,"Missed real time\n");
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
LOG_E(PHY,"System error\n");
|
LOG_E(PHY,"System error %s\n",strerror(errno));
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1763,6 +1764,7 @@ void *UE_thread(void *arg) {
|
|||||||
UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0;
|
UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0;
|
||||||
proc->instance_cnt_rxtx++;
|
proc->instance_cnt_rxtx++;
|
||||||
LOG_D( PHY, "[SCHED][UE %d] UE RX instance_cnt_rxtx %d subframe %d !!\n", UE->Mod_id, proc->instance_cnt_rxtx,proc->subframe_rx);
|
LOG_D( PHY, "[SCHED][UE %d] UE RX instance_cnt_rxtx %d subframe %d !!\n", UE->Mod_id, proc->instance_cnt_rxtx,proc->subframe_rx);
|
||||||
|
T(T_UE_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx%1024), T_INT(proc->subframe_rx));
|
||||||
AssertFatal (pthread_cond_signal(&proc->cond_rxtx) ==0,"");
|
AssertFatal (pthread_cond_signal(&proc->cond_rxtx) ==0,"");
|
||||||
AssertFatal(pthread_mutex_unlock(&proc->mutex_rxtx) ==0,"");
|
AssertFatal(pthread_mutex_unlock(&proc->mutex_rxtx) ==0,"");
|
||||||
initRefTimes(t1);
|
initRefTimes(t1);
|
||||||
@@ -1858,7 +1860,7 @@ void init_UE_single_thread_stub(int nb_inst) {
|
|||||||
AssertFatal(PHY_vars_UE_g[i]!=NULL,"PHY_vars_UE_g[inst] is NULL\n");
|
AssertFatal(PHY_vars_UE_g[i]!=NULL,"PHY_vars_UE_g[inst] is NULL\n");
|
||||||
AssertFatal(PHY_vars_UE_g[i][0]!=NULL,"PHY_vars_UE_g[inst][0] is NULL\n");
|
AssertFatal(PHY_vars_UE_g[i][0]!=NULL,"PHY_vars_UE_g[inst][0] is NULL\n");
|
||||||
|
|
||||||
if(nfapi_mode == 3) {
|
if(NFAPI_MODE==NFAPI_UE_STUB_PNF) {
|
||||||
#ifdef NAS_UE
|
#ifdef NAS_UE
|
||||||
MessageDef *message_p;
|
MessageDef *message_p;
|
||||||
message_p = itti_alloc_new_message(TASK_NAS_UE, INITIALIZE_MESSAGE);
|
message_p = itti_alloc_new_message(TASK_NAS_UE, INITIALIZE_MESSAGE);
|
||||||
@@ -2040,7 +2042,7 @@ static void *timer_thread( void *param ) {
|
|||||||
opp_enabled = 1;
|
opp_enabled = 1;
|
||||||
|
|
||||||
// first check if we are receiving timing indications
|
// first check if we are receiving timing indications
|
||||||
if(nfapi_mode==4) {
|
if(NFAPI_MODE==NFAPI_UE_STUB_OFFNET) {
|
||||||
usleep(10000);
|
usleep(10000);
|
||||||
|
|
||||||
if (UE->instance_cnt_timer > 0) {
|
if (UE->instance_cnt_timer > 0) {
|
||||||
@@ -2128,7 +2130,7 @@ static void *timer_thread( void *param ) {
|
|||||||
pdu.header.packet_type = TTI_SYNC;
|
pdu.header.packet_type = TTI_SYNC;
|
||||||
pdu.header.absSF = (timer_frame*10)+timer_subframe;
|
pdu.header.absSF = (timer_frame*10)+timer_subframe;
|
||||||
|
|
||||||
if (nfapi_mode!=3) {
|
if (NFAPI_MODE != NFAPI_UE_STUB_PNF) {
|
||||||
multicast_link_write_sock(0,
|
multicast_link_write_sock(0,
|
||||||
(char *)&pdu,
|
(char *)&pdu,
|
||||||
sizeof(UE_tport_header_t));
|
sizeof(UE_tport_header_t));
|
||||||
|
|||||||
@@ -68,6 +68,7 @@
|
|||||||
#include "PHY_INTERFACE/phy_interface_vars.h"
|
#include "PHY_INTERFACE/phy_interface_vars.h"
|
||||||
|
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "UTIL/OTG/otg_tx.h"
|
#include "UTIL/OTG/otg_tx.h"
|
||||||
#include "UTIL/OTG/otg_externs.h"
|
#include "UTIL/OTG/otg_externs.h"
|
||||||
#include "UTIL/MATH/oml.h"
|
#include "UTIL/MATH/oml.h"
|
||||||
@@ -109,7 +110,7 @@ pthread_cond_t nfapi_sync_cond;
|
|||||||
pthread_mutex_t nfapi_sync_mutex;
|
pthread_mutex_t nfapi_sync_mutex;
|
||||||
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
|
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
|
||||||
|
|
||||||
uint8_t nfapi_mode = 0;
|
|
||||||
#ifdef UESIM_EXPANSION
|
#ifdef UESIM_EXPANSION
|
||||||
uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
|
uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
|
||||||
#endif
|
#endif
|
||||||
@@ -143,7 +144,7 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
|||||||
|
|
||||||
int UE_scan = 1;
|
int UE_scan = 1;
|
||||||
int UE_scan_carrier = 0;
|
int UE_scan_carrier = 0;
|
||||||
int simL1flag = 0;
|
|
||||||
int snr_dB=25;
|
int snr_dB=25;
|
||||||
|
|
||||||
runmode_t mode = normal_txrx;
|
runmode_t mode = normal_txrx;
|
||||||
@@ -323,12 +324,10 @@ void exit_function(const char *file, const char *function, const int line, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
sleep(1); //allow lte-softmodem threads to exit first
|
sleep(1); //allow lte-softmodem threads to exit first
|
||||||
#if defined(ENABLE_ITTI)
|
|
||||||
|
|
||||||
if(PHY_vars_UE_g != NULL )
|
if(PHY_vars_UE_g != NULL )
|
||||||
itti_terminate_tasks (TASK_UNKNOWN);
|
itti_terminate_tasks (TASK_UNKNOWN);
|
||||||
|
|
||||||
#endif
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -417,6 +416,10 @@ static void get_options(void) {
|
|||||||
paramdef_t cmdline_ueparams[] =CMDLINE_UEPARAMS_DESC;
|
paramdef_t cmdline_ueparams[] =CMDLINE_UEPARAMS_DESC;
|
||||||
config_process_cmdline( cmdline_uemodeparams,sizeof(cmdline_uemodeparams)/sizeof(paramdef_t),NULL);
|
config_process_cmdline( cmdline_uemodeparams,sizeof(cmdline_uemodeparams)/sizeof(paramdef_t),NULL);
|
||||||
config_process_cmdline( cmdline_ueparams,sizeof(cmdline_ueparams)/sizeof(paramdef_t),NULL);
|
config_process_cmdline( cmdline_ueparams,sizeof(cmdline_ueparams)/sizeof(paramdef_t),NULL);
|
||||||
|
nfapi_setmode(nfapi_mode);
|
||||||
|
|
||||||
|
if (simL1flag)
|
||||||
|
set_softmodem_optmask(SOFTMODEM_SIML1_BIT);
|
||||||
|
|
||||||
if (loopfile != NULL) {
|
if (loopfile != NULL) {
|
||||||
printf("Input file for hardware emulation: %s",loopfile);
|
printf("Input file for hardware emulation: %s",loopfile);
|
||||||
@@ -449,7 +452,7 @@ static void get_options(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
UE_scan=0;
|
UE_scan=0;
|
||||||
|
|
||||||
if (tddflag > 0) {
|
if (tddflag > 0) {
|
||||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
frame_parms[CC_id]->frame_type = TDD;
|
frame_parms[CC_id]->frame_type = TDD;
|
||||||
@@ -491,16 +494,6 @@ static void get_options(void) {
|
|||||||
rx_gain[0][CC_id] = rx_gain[0][0];
|
rx_gain[0][CC_id] = rx_gain[0][0];
|
||||||
tx_gain[0][CC_id] = tx_gain[0][0];
|
tx_gain[0][CC_id] = tx_gain[0][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) && (!(CONFIG_ISFLAGSET(CONFIG_NOOOPT))) ) {
|
|
||||||
// Here the configuration file is the XER encoded UE capabilities
|
|
||||||
// Read it in and store in asn1c data structures
|
|
||||||
sprintf(uecap_xer,"%stargets/PROJECTS/GENERIC-LTE-EPC/CONF/UE_config.xml",getenv("OPENAIR_HOME"));
|
|
||||||
printf("%s\n",uecap_xer);
|
|
||||||
if(nfapi_mode!=3)
|
|
||||||
uecap_xer_in=1;
|
|
||||||
} *//* UE with config file */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -638,10 +631,7 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* helper function to terminate a certain ITTI task
|
||||||
#if defined(ENABLE_ITTI)
|
|
||||||
/*
|
|
||||||
* helper function to terminate a certain ITTI task
|
|
||||||
*/
|
*/
|
||||||
void terminate_task(task_id_t task_id, module_id_t mod_id) {
|
void terminate_task(task_id_t task_id, module_id_t mod_id) {
|
||||||
LOG_I(ENB_APP, "sending TERMINATE_MESSAGE to task %s (%d)\n", itti_get_task_name(task_id), task_id);
|
LOG_I(ENB_APP, "sending TERMINATE_MESSAGE to task %s (%d)\n", itti_get_task_name(task_id), task_id);
|
||||||
@@ -651,11 +641,6 @@ void terminate_task(task_id_t task_id, module_id_t mod_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static inline void wait_nfapi_init(char *thread_name) {
|
static inline void wait_nfapi_init(char *thread_name) {
|
||||||
printf( "waiting for NFAPI PNF connection and population of global structure (%s)\n",thread_name);
|
printf( "waiting for NFAPI PNF connection and population of global structure (%s)\n",thread_name);
|
||||||
pthread_mutex_lock( &nfapi_sync_mutex );
|
pthread_mutex_lock( &nfapi_sync_mutex );
|
||||||
@@ -716,13 +701,11 @@ int main( int argc, char **argv ) {
|
|||||||
EPC_MODE_ENABLED = !IS_SOFTMODEM_NOS1;
|
EPC_MODE_ENABLED = !IS_SOFTMODEM_NOS1;
|
||||||
printf("Running with %d UE instances\n",NB_UE_INST);
|
printf("Running with %d UE instances\n",NB_UE_INST);
|
||||||
|
|
||||||
if (NB_UE_INST > 1 && simL1flag != 1 && nfapi_mode != 3) {
|
if (NB_UE_INST > 1 && (!IS_SOFTMODEM_SIML1) && NFAPI_MODE!=NFAPI_UE_STUB_PNF) {
|
||||||
printf("Running with more than 1 UE instance and simL1 is not active, this will result in undefined behaviour for now, exiting.\n");
|
printf("Running with more than 1 UE instance and simL1 is not active, this will result in undefined behaviour for now, exiting.\n");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("NFAPI_MODE value: %d \n", nfapi_mode);
|
|
||||||
|
|
||||||
// Checking option of nums_ue_thread.
|
// Checking option of nums_ue_thread.
|
||||||
if(NB_THREAD_INST < 1) {
|
if(NB_THREAD_INST < 1) {
|
||||||
printf("Running with 0 UE rxtx thread, exiting.\n");
|
printf("Running with 0 UE rxtx thread, exiting.\n");
|
||||||
@@ -735,17 +718,6 @@ int main( int argc, char **argv ) {
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not sure if the following is needed here
|
|
||||||
/*if (CONFIG_ISFLAGSET(CONFIG_ABORT)) {
|
|
||||||
if (UE_flag == 0) {
|
|
||||||
fprintf(stderr,"Getting configuration failed\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
printf("Setting nfapi mode to UE_STUB_OFFNET\n");
|
|
||||||
nfapi_mode = 4;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
#if T_TRACER
|
#if T_TRACER
|
||||||
T_Config_Init();
|
T_Config_Init();
|
||||||
#endif
|
#endif
|
||||||
@@ -766,7 +738,7 @@ int main( int argc, char **argv ) {
|
|||||||
init_opt();
|
init_opt();
|
||||||
uint32_t pdcp_initmask = (!IS_SOFTMODEM_NOS1 )? LINK_ENB_PDCP_TO_GTPV1U_BIT : (LINK_ENB_PDCP_TO_GTPV1U_BIT | PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT);
|
uint32_t pdcp_initmask = (!IS_SOFTMODEM_NOS1 )? LINK_ENB_PDCP_TO_GTPV1U_BIT : (LINK_ENB_PDCP_TO_GTPV1U_BIT | PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT);
|
||||||
|
|
||||||
if ( IS_SOFTMODEM_BASICSIM || IS_SOFTMODEM_RFSIM || (nfapi_mode == 3) ) {
|
if ( IS_SOFTMODEM_BASICSIM || IS_SOFTMODEM_RFSIM || (nfapi_getmode()==NFAPI_UE_STUB_PNF) ) {
|
||||||
pdcp_initmask = pdcp_initmask | UE_NAS_USE_TUN_BIT;
|
pdcp_initmask = pdcp_initmask | UE_NAS_USE_TUN_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -799,7 +771,7 @@ int main( int argc, char **argv ) {
|
|||||||
|
|
||||||
NB_INST=1;
|
NB_INST=1;
|
||||||
|
|
||||||
if(nfapi_mode == 3) {
|
if(NFAPI_MODE==NFAPI_UE_STUB_PNF) {
|
||||||
PHY_vars_UE_g = malloc(sizeof(PHY_VARS_UE **)*NB_UE_INST);
|
PHY_vars_UE_g = malloc(sizeof(PHY_VARS_UE **)*NB_UE_INST);
|
||||||
|
|
||||||
for (int i=0; i<NB_UE_INST; i++) {
|
for (int i=0; i<NB_UE_INST; i++) {
|
||||||
@@ -815,7 +787,7 @@ int main( int argc, char **argv ) {
|
|||||||
}
|
}
|
||||||
} else init_openair0(frame_parms[0],(int)rx_gain[0][0]);
|
} else init_openair0(frame_parms[0],(int)rx_gain[0][0]);
|
||||||
|
|
||||||
if (simL1flag==1) {
|
if (IS_SOFTMODEM_SIML1 ) {
|
||||||
RCConfig_sim();
|
RCConfig_sim();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -862,62 +834,30 @@ int main( int argc, char **argv ) {
|
|||||||
|
|
||||||
LOG_I(HW, "CPU Affinity of main() function is... %s\n", cpu_affinity);
|
LOG_I(HW, "CPU Affinity of main() function is... %s\n", cpu_affinity);
|
||||||
#endif
|
#endif
|
||||||
#if defined(ENABLE_ITTI)
|
|
||||||
|
|
||||||
if (create_tasks_ue(NB_UE_INST) < 0) {
|
if (create_tasks_ue(NB_UE_INST) < 0) {
|
||||||
printf("cannot create ITTI tasks\n");
|
printf("cannot create ITTI tasks\n");
|
||||||
exit(-1); // need a softer mode
|
exit(-1); // need a softer mode
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nfapi_mode==3) { // Here we should add another nfapi_mode for the case of Supervised LTE-D2D
|
if (NFAPI_MODE==NFAPI_UE_STUB_PNF) { // UE-STUB-PNF
|
||||||
UE_config_stub_pnf();
|
UE_config_stub_pnf();
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("ITTI tasks created\n");
|
printf("ITTI tasks created\n");
|
||||||
#endif
|
|
||||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||||
rt_sleep_ns(10*100000000ULL);
|
rt_sleep_ns(10*100000000ULL);
|
||||||
const char *nfapi_mode_str = "<UNKNOWN>";
|
|
||||||
// start the main UE threads
|
|
||||||
int eMBMS_active = 0;
|
int eMBMS_active = 0;
|
||||||
|
|
||||||
switch(nfapi_mode) {
|
if (NFAPI_MODE==NFAPI_UE_STUB_PNF) { // UE-STUB-PNF
|
||||||
case 0:
|
config_sync_var=0;
|
||||||
nfapi_mode_str = "MONOLITHIC";
|
wait_nfapi_init("main?");
|
||||||
break;
|
//Panos: Temporarily we will be using single set of threads for multiple UEs.
|
||||||
|
//init_UE_stub(1,eMBMS_active,uecap_xer_in,emul_iface);
|
||||||
case 1:
|
init_UE_stub_single_thread(NB_UE_INST,eMBMS_active,uecap_xer_in,emul_iface);
|
||||||
nfapi_mode_str = "PNF";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
nfapi_mode_str = "VNF";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
nfapi_mode_str = "UE_STUB_PNF";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
nfapi_mode_str = "UE_STUB_OFFNET";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
nfapi_mode_str = "<UNKNOWN NFAPI MODE>";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("NFAPI MODE:%s\n", nfapi_mode_str);
|
|
||||||
|
|
||||||
if (nfapi_mode==3) { // UE-STUB-PNF
|
|
||||||
config_sync_var=0;
|
|
||||||
wait_nfapi_init("main?");
|
|
||||||
//Panos: Temporarily we will be using single set of threads for multiple UEs.
|
|
||||||
//init_UE_stub(1,eMBMS_active,uecap_xer_in,emul_iface);
|
|
||||||
init_UE_stub_single_thread(NB_UE_INST,eMBMS_active,uecap_xer_in,emul_iface);
|
|
||||||
} else {
|
} else {
|
||||||
init_UE(NB_UE_INST,eMBMS_active,uecap_xer_in,0,get_softmodem_params()->phy_test,UE_scan,UE_scan_carrier,mode,(int)rx_gain[0][0],tx_max_power[0],
|
init_UE(NB_UE_INST,eMBMS_active,uecap_xer_in,0,get_softmodem_params()->phy_test,UE_scan,UE_scan_carrier,mode,(int)rx_gain[0][0],tx_max_power[0],
|
||||||
frame_parms[0]);
|
frame_parms[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_softmodem_params()->phy_test==0) {
|
if (get_softmodem_params()->phy_test==0) {
|
||||||
@@ -926,25 +866,14 @@ int main( int argc, char **argv ) {
|
|||||||
dl_phy_sync_success (0, 0, 0, 1);
|
dl_phy_sync_success (0, 0, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nfapi_mode!=3) {
|
if (NFAPI_MODE != NFAPI_UE_STUB_PNF) {
|
||||||
number_of_cards = 1;
|
number_of_cards = 1;
|
||||||
|
|
||||||
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
PHY_vars_UE_g[0][CC_id]->rf_map.card=0;
|
PHY_vars_UE_g[0][CC_id]->rf_map.card=0;
|
||||||
PHY_vars_UE_g[0][CC_id]->rf_map.chain=CC_id+(get_softmodem_params()->chain_offset);
|
PHY_vars_UE_g[0][CC_id]->rf_map.chain=CC_id+(get_softmodem_params()->chain_offset);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// connect the TX/RX buffers
|
|
||||||
|
|
||||||
/*
|
|
||||||
if(nfapi_mode!=3) {
|
|
||||||
if (setup_ue_buffers(PHY_vars_UE_g[0],&openair0_cfg[0])!=0) {
|
|
||||||
printf("Error setting up eNB buffer\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
if (input_fd) {
|
if (input_fd) {
|
||||||
printf("Reading in from file to antenna buffer %d\n",0);
|
printf("Reading in from file to antenna buffer %d\n",0);
|
||||||
@@ -958,7 +887,7 @@ int main( int argc, char **argv ) {
|
|||||||
|
|
||||||
//p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
|
//p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
|
||||||
|
|
||||||
if (simL1flag==1) {
|
if (IS_SOFTMODEM_SIML1 ) {
|
||||||
init_ocm((double)snr_dB,0);
|
init_ocm((double)snr_dB,0);
|
||||||
PHY_vars_UE_g[0][0]->no_timing_correction = 1;
|
PHY_vars_UE_g[0][0]->no_timing_correction = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user