Merge branch 'integration_2023_w42' into 'develop'
Integration Branch 2023.w42 See merge request oai/openairinterface5g!2403 * !2368 NR UE SRB0 * !2399 build_oai: Auto-detect if terminal supports colors * !2398 Correctly load channel models * !2365 Change PDU_Length and tlv length calculation to be inline with SCF 222.10.02 * !2402 chore(ci): enabling the ARM cross-compilation pipeline * !2397 fix(ci): improve for parallelism issue in Groovy * !2405 Clean IDE files and remove old documentation
@@ -9,8 +9,11 @@ cmake_targets/nas_sim_tools/build/
|
||||
log/
|
||||
lte_build_oai/
|
||||
|
||||
# vscode
|
||||
# IDE files
|
||||
.vscode
|
||||
.cproject
|
||||
.project
|
||||
.settings
|
||||
|
||||
# Tags for vim/global
|
||||
GPATH
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "(gdb) Launch",
|
||||
"type": "cppdbg",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/cmake_targets/ran_build/build/lte-softmodem",
|
||||
"args": [
|
||||
"-O", "../ci-scripts/conf_files/rcc.band7.tm1.nfapi.conf",
|
||||
"--noS1"
|
||||
],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}/cmake_targets",
|
||||
"environment": [],
|
||||
"externalConsole": false,
|
||||
"MIMode": "gdb",
|
||||
"miDebuggerPath": "${workspaceFolder}/cmake_targets/sudo-gdb",
|
||||
"setupCommands": [
|
||||
{
|
||||
"description": "Enable pretty-printing for gdb",
|
||||
"text": "-enable-pretty-printing",
|
||||
"ignoreFailures": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -33,6 +33,7 @@ def gitCommitAuthorEmailAddr
|
||||
|
||||
// list of failing stages
|
||||
def failingStages = ""
|
||||
def lockForMessage = 'Parent-Lock'
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
@@ -120,46 +121,49 @@ pipeline {
|
||||
}
|
||||
}
|
||||
// Build Stages are Mandatory
|
||||
// Later we will add a Ubuntu20 build
|
||||
stage ("Image Building Processes") {
|
||||
when { expression {doBuild} }
|
||||
parallel {
|
||||
stage ("Ubuntu18-Image-Builder") {
|
||||
stage ("Ubuntu-Image-Builder") {
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-Ubuntu18-Image-Builder', 'Ubuntu18-Image-Builder')
|
||||
triggerSlaveJob ('RAN-Ubuntu18-Image-Builder', 'Ubuntu-Image-Builder')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-Ubuntu18-Image-Builder')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
ubuntuBuildStatus = finalizeSlaveJob('RAN-Ubuntu18-Image-Builder')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += ubuntuBuildStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("RHEL8-Cluster-Image-Builder") {
|
||||
stage ("RHEL-Cluster-Image-Builder") {
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-RHEL8-Cluster-Image-Builder', 'RHEL8-Cluster-Image-Builder')
|
||||
triggerSlaveJob ('RAN-RHEL8-Cluster-Image-Builder', 'RHEL-Cluster-Image-Builder')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-RHEL8-Cluster-Image-Builder')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
rhelBuildStatus = finalizeSlaveJob('RAN-RHEL8-Cluster-Image-Builder')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += rhelBuildStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -173,13 +177,37 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-cppcheck')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
cppcheckStatus = finalizeSlaveJob('RAN-cppcheck')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += cppcheckStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("ARM-Cross-Compile") {
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-ARM-Cross-Compile-Builder', 'ARM-Cross-Compilation')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
armBuildStatus = finalizeSlaveJob('RAN-ARM-Cross-Compile-Builder')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += armBuildStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -199,13 +227,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-PhySim-Cluster')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
physimStatus = finalizeSlaveJob('RAN-PhySim-Cluster')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += physimStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -220,13 +250,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-RF-Sim-Test-4G')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
rfSim4GStatus = finalizeSlaveJob('RAN-RF-Sim-Test-4G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += rfSim4GStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -241,13 +273,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-RF-Sim-Test-5G')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
rfSim5GStatus = finalizeSlaveJob('RAN-RF-Sim-Test-5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += rfSim5GStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -262,13 +296,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-L2-Sim-Test-4G')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
l2Sim4GStatus = finalizeSlaveJob('RAN-L2-Sim-Test-4G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += l2Sim4GStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -283,13 +319,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-L2-Sim-Test-5G')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
l2Sim5GStatus = finalizeSlaveJob('RAN-L2-Sim-Test-5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += l2Sim5GStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -304,13 +342,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-LTE-FDD-LTEBOX-Container')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
lteTDDB200Status = finalizeSlaveJob('RAN-LTE-FDD-LTEBOX-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += lteTDDB200Status
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -326,13 +366,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-LTE-FDD-OAIUE-OAICN4G-Container')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
lteFDDB200OAIUEStatus = finalizeSlaveJob('RAN-LTE-FDD-OAIUE-OAICN4G-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += lteFDDB200OAIUEStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -347,13 +389,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-LTE-TDD-LTEBOX-Container')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
lteFDDB200Status = finalizeSlaveJob('RAN-LTE-TDD-LTEBOX-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += lteFDDB200Status
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -368,13 +412,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-NSA-B200-Module-LTEBOX-Container')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
nsaTDDB200Status = finalizeSlaveJob('RAN-NSA-B200-Module-LTEBOX-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += nsaTDDB200Status
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -389,13 +435,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
saTDDB200Status = finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += saTDDB200Status
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -410,13 +458,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-gNB-N300-Timing-Phytest-LDPC')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
phytestLDPCoffloadStatus = finalizeSlaveJob('RAN-gNB-N300-Timing-Phytest-LDPC')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += phytestLDPCoffloadStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -431,13 +481,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-LTE-TDD-2x2-Container')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
lteTDD2x2N3xxStatus = finalizeSlaveJob('RAN-LTE-TDD-2x2-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += lteTDD2x2N3xxStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -452,13 +504,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-SA-AW2S-CN5G')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
saAW2SStatus = finalizeSlaveJob('RAN-SA-AW2S-CN5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += saAW2SStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -473,13 +527,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-Interop-F1')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
f1InteropStatus = finalizeSlaveJob('RAN-Interop-F1')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += f1InteropStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -494,13 +550,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('OAI-CN5G-COTS-UE-Test')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
cn5gCOTSUESanityCheck = finalizeSlaveJob('OAI-CN5G-COTS-UE-Test')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += cn5gCOTSUESanityCheck
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -515,13 +573,15 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
testBullet = finalizeSlaveJob('RAN-SA-OAIUE-CN5G')
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
saOAIUEStatus = finalizeSlaveJob('RAN-SA-OAIUE-CN5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
failingStages += saOAIUEStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -668,28 +728,30 @@ def triggerSlaveJobNoGitLab (jobName) {
|
||||
}
|
||||
|
||||
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
|
||||
if (jobName == 'OAI-CN5G-COTS-UE-Test') {
|
||||
fileName = "test_results_oai_cn5g_cots_ue.html"
|
||||
} else {
|
||||
fileName = "test_results-${jobName}.html"
|
||||
}
|
||||
artifactUrl = BUILD_URL
|
||||
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
|
||||
// BUILD_URL is like http://server:port/jenkins/job/foo/15/
|
||||
// no need to add a prefixed '/'
|
||||
artifactUrl += 'artifact/' + fileName
|
||||
lock (lockForMessage) {
|
||||
// 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
|
||||
if (jobName == 'OAI-CN5G-COTS-UE-Test') {
|
||||
fileName = "test_results_oai_cn5g_cots_ue.html"
|
||||
} else {
|
||||
fileName = "test_results-${jobName}.html"
|
||||
}
|
||||
artifactUrl = BUILD_URL
|
||||
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
|
||||
// BUILD_URL is like http://server:port/jenkins/job/foo/15/
|
||||
// no need to add a prefixed '/'
|
||||
artifactUrl += 'artifact/' + fileName
|
||||
}
|
||||
}
|
||||
artifactUrl = "\n * [${jobName}](${artifactUrl})"
|
||||
return artifactUrl
|
||||
}
|
||||
artifactUrl = "\n * [${jobName}](${artifactUrl})"
|
||||
return artifactUrl
|
||||
}
|
||||
|
||||
// Abstraction function to send social media messages:
|
||||
|
||||
@@ -54,16 +54,17 @@ fi
|
||||
###############################
|
||||
## echo and family
|
||||
###############################
|
||||
black='\E[30m'
|
||||
red='\E[31m'
|
||||
green='\E[32m'
|
||||
yellow='\E[33m'
|
||||
blue='\E[1;34m'
|
||||
magenta='\E[35m'
|
||||
cyan='\E[36m'
|
||||
white='\E[37m'
|
||||
reset_color='\E[00m'
|
||||
COLORIZE=1
|
||||
# only emit color if connected to a terminal, and if it supports colors
|
||||
if [ -t 1 ]; then
|
||||
num_colors=$(tput colors)
|
||||
if [ -n "$num_colors" ] && [ "$num_colors" -ge 8 ]; then
|
||||
red='\E[31m'
|
||||
green='\E[32m'
|
||||
yellow='\E[33m'
|
||||
blue='\E[1;34m'
|
||||
reset_color='\E[00m'
|
||||
fi
|
||||
fi
|
||||
|
||||
cecho() {
|
||||
# Color-echo
|
||||
@@ -72,8 +73,7 @@ cecho() {
|
||||
local default_msg="No Message."
|
||||
message=${1:-$default_msg}
|
||||
color=${2:-$green}
|
||||
[ "$COLORIZE" = "1" ] && message="$color$message$reset_color"
|
||||
echo -e "$message"
|
||||
echo -e "$color$message$reset_color"
|
||||
return
|
||||
}
|
||||
|
||||
@@ -685,6 +685,15 @@ install_simde_from_source(){
|
||||
$SUDO rm -rf /tmp/simde
|
||||
git clone https://github.com/simd-everywhere/simde-no-tests.git /tmp/simde
|
||||
cd /tmp/simde
|
||||
# we can specify a given version of SIMDE (sha-one or tag)
|
||||
if [[ -v SIMDE_VERSION ]]; then
|
||||
git checkout -f $SIMDE_VERSION
|
||||
else
|
||||
# At time of writing, last working commit for OAI
|
||||
git checkout 389f360a66d4a3bec62b7d71ad8be877487809ba
|
||||
fi
|
||||
# Showing which version is used
|
||||
git log -n1
|
||||
# brute force copy into /usr/include
|
||||
$SUDO \cp -rv ../simde /usr/include
|
||||
}
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
FROM ubuntu:focal AS ran-base
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV TZ=Europe/Paris
|
||||
# Specifying a working version of SIMDE for ARM:
|
||||
ENV SIMDE_VERSION=389f360a66d4a3bec62b7d71ad8be877487809ba
|
||||
|
||||
#install developers pkg/repo
|
||||
RUN apt-get update && \
|
||||
|
||||
@@ -43,5 +43,10 @@ RUN /bin/sh oaienv && \
|
||||
cd ../build-cross/ && \
|
||||
cmake ../../.. -GNinja -DCMAKE_TOOLCHAIN_FILE=../../../cmake_targets/cross-arm.cmake -DNATIVE_DIR=../build && \
|
||||
echo "====== Start of log for cross-build executables ======" && \
|
||||
ninja dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim lte-softmodem nr-softmodem nr-cuup oairu lte-uesoftmodem nr-uesoftmodem params_libconfig coding rfsimulator > ../../log/all.txt 2>&1 && \
|
||||
# making always passing so we can analyze the all.txt file
|
||||
ninja dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim lte-softmodem nr-softmodem nr-cuup oairu lte-uesoftmodem nr-uesoftmodem params_libconfig coding rfsimulator > ../../log/all.txt 2>&1; \
|
||||
# displaying errors and warnings
|
||||
egrep -A3 "warning:|error:" ../../log/all.txt || true && \
|
||||
# will fail only for errors
|
||||
egrep -L "error:" ../../log/all.txt && \
|
||||
echo "====== End of log for cross-build executables ======"
|
||||
|
||||
@@ -1466,12 +1466,14 @@ typedef enum {
|
||||
|
||||
//table 3-58
|
||||
#define NFAPI_NR_MAX_TX_REQUEST_TLV 2
|
||||
typedef struct
|
||||
{
|
||||
uint16_t PDU_length;
|
||||
typedef struct {
|
||||
uint16_t PDU_length; // SCF 222.10.02 The total length (in bytes) of the PDU description and PDU data, without the padding bytes.
|
||||
// (2 bytes PDU_Length + 2 bytes PDU_Index + 4 bytes num_TLV + TLV size ( 2 bytes tag + 2 bytes length +
|
||||
// value size without padding))
|
||||
// TBS + 12
|
||||
uint16_t PDU_index;
|
||||
uint32_t num_TLV;
|
||||
nfapi_nr_tx_data_request_tlv_t TLVs[NFAPI_NR_MAX_TX_REQUEST_TLV];
|
||||
nfapi_nr_tx_data_request_tlv_t TLVs[NFAPI_NR_MAX_TX_REQUEST_TLV];
|
||||
|
||||
} nfapi_nr_pdu_t;
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <immintrin.h>
|
||||
#include "PHY/sse_intrin.h"
|
||||
#include "nrLDPCdecoder_defs.h"
|
||||
#include "nrLDPC_types.h"
|
||||
#include "nrLDPC_init.h"
|
||||
|
||||
@@ -108,16 +108,6 @@ void nr_rrc_ue_generate_RRCSetupRequest(module_id_t module_id, const uint8_t gNB
|
||||
return;
|
||||
}
|
||||
|
||||
int8_t nr_mac_rrc_data_req_ue(const module_id_t Mod_idP,
|
||||
const int CC_id,
|
||||
const uint8_t gNB_id,
|
||||
const frame_t frameP,
|
||||
const rb_id_t Srb_id,
|
||||
uint8_t *buffer_pP)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t nr_rrc_RA_succeeded(const module_id_t mod_id, const uint8_t gNB_index) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,8 @@ void nr_mac_rrc_sync_ind(const module_id_t module_id,
|
||||
const frame_t frame,
|
||||
const bool in_sync) {}
|
||||
|
||||
void nr_mac_rrc_msg3_ind(const module_id_t mod_id, int rnti) {}
|
||||
|
||||
void nr_mac_rrc_ra_ind(const module_id_t mod_id, int frame, bool success) {}
|
||||
|
||||
void rrc_data_ind(const protocol_ctxt_t *const ctxt_pP,
|
||||
|
||||
@@ -108,16 +108,6 @@ void nr_rrc_ue_generate_RRCSetupRequest(module_id_t module_id, const uint8_t gNB
|
||||
return;
|
||||
}
|
||||
|
||||
int8_t nr_mac_rrc_data_req_ue(const module_id_t Mod_idP,
|
||||
const int CC_id,
|
||||
const uint8_t gNB_id,
|
||||
const frame_t frameP,
|
||||
const rb_id_t Srb_id,
|
||||
uint8_t *buffer_pP)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t nr_rrc_RA_succeeded(const module_id_t mod_id, const uint8_t gNB_index) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -104,16 +104,6 @@ void nr_rrc_ue_generate_RRCSetupRequest(module_id_t module_id, const uint8_t gNB
|
||||
return;
|
||||
}
|
||||
|
||||
int8_t nr_mac_rrc_data_req_ue(const module_id_t Mod_idP,
|
||||
const int CC_id,
|
||||
const uint8_t gNB_id,
|
||||
const frame_t frameP,
|
||||
const rb_id_t Srb_id,
|
||||
uint8_t *buffer_pP)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t nr_rrc_RA_succeeded(const module_id_t mod_id, const uint8_t gNB_index) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -48,7 +48,8 @@ MESSAGE_DEF(RRC_MAC_MCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, RrcMacMcchDat
|
||||
|
||||
MESSAGE_DEF(RRC_MAC_PCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcMacPcchDataReq, rrc_mac_pcch_data_req)
|
||||
|
||||
MESSAGE_DEF(NR_RRC_MAC_RA_IND, MESSAGE_PRIORITY_MED_PLUS, NRRrcMacRaInd, nr_rrc_mac_ra_ind)
|
||||
MESSAGE_DEF(NR_RRC_MAC_RA_IND, MESSAGE_PRIORITY_MED_PLUS, NRRrcMacRaInd, nr_rrc_mac_ra_ind)
|
||||
MESSAGE_DEF(NR_RRC_MAC_MSG3_IND, MESSAGE_PRIORITY_MED_PLUS, NRRrcMacMsg3Ind, nr_rrc_mac_msg3_ind)
|
||||
|
||||
/* RRC configures DRX context (MAC timers) of a UE */
|
||||
MESSAGE_DEF(RRC_MAC_DRX_CONFIG_REQ, MESSAGE_PRIORITY_MED, rrc_mac_drx_config_req_t, rrc_mac_drx_config_req)
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
#define RRC_MAC_PCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_pcch_data_req
|
||||
|
||||
#define NR_RRC_MAC_RA_IND(mSGpTR) (mSGpTR)->ittiMsg.nr_rrc_mac_ra_ind
|
||||
#define NR_RRC_MAC_MSG3_IND(mSGpTR) (mSGpTR)->ittiMsg.nr_rrc_mac_msg3_ind
|
||||
|
||||
#define RRC_MAC_DRX_CONFIG_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_drx_config_req
|
||||
|
||||
@@ -73,6 +74,10 @@ typedef struct NRRrcMacRaInd_s {
|
||||
bool RA_succeeded;
|
||||
} NRRrcMacRaInd;
|
||||
|
||||
typedef struct NRRrcMacMsg3Ind_s {
|
||||
uint16_t rnti;
|
||||
} NRRrcMacMsg3Ind;
|
||||
|
||||
typedef struct RrcMacInSyncInd_s {
|
||||
uint32_t frame;
|
||||
uint8_t sub_frame;
|
||||
@@ -154,15 +159,9 @@ typedef struct RrcMacCcchDataInd_s {
|
||||
} RrcMacCcchDataInd;
|
||||
|
||||
typedef struct NRRrcMacCcchDataInd_s {
|
||||
uint32_t frame;
|
||||
uint8_t slot;
|
||||
uint16_t rnti;
|
||||
uint32_t sdu_size;
|
||||
uint8_t sdu[CCCH_SDU_SIZE];
|
||||
OCTET_STRING_t *du_to_cu_rrc_container;
|
||||
uint8_t gnb_index;
|
||||
int CC_id;
|
||||
uint64_t nr_cellid;
|
||||
} NRRrcMacCcchDataInd;
|
||||
|
||||
typedef struct RrcMacMcchDataReq_s {
|
||||
|
||||
@@ -1,220 +0,0 @@
|
||||
# Doxyfile 1.3.8
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
PROJECT_NAME = OPENAIR2
|
||||
PROJECT_NUMBER =
|
||||
OUTPUT_DIRECTORY =
|
||||
CREATE_SUBDIRS = NO
|
||||
OUTPUT_LANGUAGE = English
|
||||
USE_WINDOWS_ENCODING = YES
|
||||
BRIEF_MEMBER_DESC = YES
|
||||
REPEAT_BRIEF = YES
|
||||
ABBREVIATE_BRIEF =
|
||||
ALWAYS_DETAILED_SEC = NO
|
||||
INLINE_INHERITED_MEMB = NO
|
||||
FULL_PATH_NAMES = NO
|
||||
STRIP_FROM_PATH =
|
||||
STRIP_FROM_INC_PATH =
|
||||
SHORT_NAMES = NO
|
||||
JAVADOC_AUTOBRIEF = YES
|
||||
MULTILINE_CPP_IS_BRIEF = YES
|
||||
DETAILS_AT_TOP = YES
|
||||
INHERIT_DOCS = NO
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
TAB_SIZE = 8
|
||||
ALIASES =
|
||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
SUBGROUPING = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
EXTRACT_ALL = YES
|
||||
EXTRACT_PRIVATE = NO
|
||||
EXTRACT_STATIC = NO
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
EXTRACT_LOCAL_METHODS = YES
|
||||
HIDE_UNDOC_MEMBERS = YES
|
||||
HIDE_UNDOC_CLASSES = YES
|
||||
HIDE_FRIEND_COMPOUNDS = NO
|
||||
HIDE_IN_BODY_DOCS = NO
|
||||
INTERNAL_DOCS = NO
|
||||
CASE_SENSE_NAMES = YES
|
||||
HIDE_SCOPE_NAMES = NO
|
||||
SHOW_INCLUDE_FILES = NO
|
||||
INLINE_INFO = YES
|
||||
SORT_MEMBER_DOCS = NO
|
||||
SORT_BRIEF_DOCS = NO
|
||||
SORT_BY_SCOPE_NAME = NO
|
||||
GENERATE_TODOLIST = YES
|
||||
GENERATE_TESTLIST = NO
|
||||
GENERATE_BUGLIST = YES
|
||||
GENERATE_DEPRECATEDLIST= NO
|
||||
ENABLED_SECTIONS =
|
||||
MAX_INITIALIZER_LINES = 30
|
||||
SHOW_USED_FILES = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to warning and progress messages
|
||||
#---------------------------------------------------------------------------
|
||||
QUIET = NO
|
||||
WARNINGS = YES
|
||||
WARN_IF_UNDOCUMENTED = YES
|
||||
WARN_IF_DOC_ERROR = YES
|
||||
WARN_FORMAT = "$file:$line: $text"
|
||||
WARN_LOGFILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
INPUT = $(OPENAIR2_DIR)/LAYER2/MAC/defs.h \
|
||||
$(OPENAIR2_DIR)/COMMON/mac_rrc_primitives.h \
|
||||
$(OPENAIR2_DIR)/COMMON/mac_rlc_primitives.h \
|
||||
$(OPENAIR2_DIR)/LAYER2/MAC/lchan_interface.h \
|
||||
$(OPENAIR2_DIR)/PHY_INTERFACE/defs.h \
|
||||
$(OPENAIR2_DIR)/NAS/DRIVER/MESH/proto_extern.h \
|
||||
|
||||
|
||||
FILE_PATTERNS = *.h
|
||||
RECURSIVE = NO
|
||||
EXCLUDE =
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
EXCLUDE_PATTERNS =
|
||||
EXAMPLE_PATH =
|
||||
EXAMPLE_PATTERNS =
|
||||
EXAMPLE_RECURSIVE = NO
|
||||
IMAGE_PATH = images
|
||||
INPUT_FILTER =
|
||||
FILTER_PATTERNS =
|
||||
FILTER_SOURCE_FILES = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
SOURCE_BROWSER = NO
|
||||
INLINE_SOURCES = NO
|
||||
STRIP_CODE_COMMENTS = YES
|
||||
REFERENCED_BY_RELATION = NO
|
||||
REFERENCES_RELATION = NO
|
||||
VERBATIM_HEADERS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
ALPHABETICAL_INDEX = NO
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
IGNORE_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
IGNORE_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
ALPHABETICAL_INDEX = NO
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
IGNORE_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the HTML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_HTML = YES
|
||||
HTML_OUTPUT = html
|
||||
HTML_FILE_EXTENSION = .html
|
||||
HTML_HEADER =
|
||||
HTML_FOOTER =
|
||||
HTML_STYLESHEET =
|
||||
HTML_ALIGN_MEMBERS = YES
|
||||
GENERATE_HTMLHELP = YES
|
||||
CHM_FILE = irs_openair.chm
|
||||
HHC_LOCATION =
|
||||
GENERATE_CHI = NO
|
||||
BINARY_TOC = NO
|
||||
TOC_EXPAND = NO
|
||||
DISABLE_INDEX = NO
|
||||
ENUM_VALUES_PER_LINE = 4
|
||||
GENERATE_TREEVIEW = YES
|
||||
TREEVIEW_WIDTH = 250
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the LaTeX output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_LATEX = NO
|
||||
LATEX_OUTPUT = latex
|
||||
LATEX_CMD_NAME = latex
|
||||
MAKEINDEX_CMD_NAME = makeindex
|
||||
COMPACT_LATEX = NO
|
||||
PAPER_TYPE = a4wide
|
||||
EXTRA_PACKAGES = amsmath amssymb
|
||||
LATEX_HEADER =
|
||||
PDF_HYPERLINKS = YES
|
||||
USE_PDFLATEX = YES
|
||||
LATEX_BATCHMODE = NO
|
||||
LATEX_HIDE_INDICES = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the RTF output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_RTF = NO
|
||||
RTF_OUTPUT = rtf
|
||||
COMPACT_RTF = YES
|
||||
RTF_HYPERLINKS = YES
|
||||
RTF_STYLESHEET_FILE =
|
||||
RTF_EXTENSIONS_FILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the man page output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_MAN = NO
|
||||
MAN_OUTPUT = man
|
||||
MAN_EXTENSION = .3
|
||||
MAN_LINKS = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the XML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_XML = NO
|
||||
XML_OUTPUT = xml
|
||||
XML_SCHEMA =
|
||||
XML_DTD =
|
||||
XML_PROGRAMLISTING = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options for the AutoGen Definitions output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the Perl module output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_PERLMOD = NO
|
||||
PERLMOD_LATEX = NO
|
||||
PERLMOD_PRETTY = YES
|
||||
PERLMOD_MAKEVAR_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
ENABLE_PREPROCESSING = YES
|
||||
MACRO_EXPANSION = YES
|
||||
EXPAND_ONLY_PREDEF = YES
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH =
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED = __attribute__(x)=
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::additions related to external references
|
||||
#---------------------------------------------------------------------------
|
||||
TAGFILES =
|
||||
GENERATE_TAGFILE =
|
||||
ALLEXTERNALS = NO
|
||||
EXTERNAL_GROUPS = YES
|
||||
PERL_PATH = /usr/bin/perl
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
CLASS_DIAGRAMS = NO
|
||||
HIDE_UNDOC_RELATIONS = NO
|
||||
HAVE_DOT = NO
|
||||
CLASS_GRAPH = NO
|
||||
COLLABORATION_GRAPH = NO
|
||||
UML_LOOK = NO
|
||||
TEMPLATE_RELATIONS = NO
|
||||
INCLUDE_GRAPH = NO
|
||||
INCLUDED_BY_GRAPH = NO
|
||||
CALL_GRAPH = NO
|
||||
GRAPHICAL_HIERARCHY = NO
|
||||
DOT_IMAGE_FORMAT = jpg
|
||||
DOT_PATH =
|
||||
DOTFILE_DIRS = ../docs/dotfiles
|
||||
|
Before Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
@@ -1,568 +0,0 @@
|
||||
%!PS-Adobe-3.0
|
||||
%%Pages: (atend)
|
||||
%%BoundingBox: 32 0 559 609
|
||||
%%HiResBoundingBox: 32.385937 0.800000 558.200000 608.900000
|
||||
%.......................................
|
||||
%%Creator: GPL Ghostscript 850 (pswrite)
|
||||
%%CreationDate: 2006/04/24 11:54:23
|
||||
%%DocumentData: Clean7Bit
|
||||
%%LanguageLevel: 2
|
||||
%%EndComments
|
||||
%%BeginProlog
|
||||
% This copyright applies to everything between here and the %%EndProlog:
|
||||
% Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved.
|
||||
%%BeginResource: procset GS_pswrite_2_0_1001
|
||||
/GS_pswrite_2_0_1001 80 dict dup begin
|
||||
/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch
|
||||
4 index eq and{ pop pop pop}{ PageSize dup 1
|
||||
5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec}
|
||||
{ pop/setpagedevice where
|
||||
{ pop 1 dict dup /PageSize PageSize put setpagedevice}
|
||||
{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat
|
||||
setpage}if}ifelse}ifelse}ifelse} bind def
|
||||
/!{bind def}bind def/#{load def}!/N/counttomark #
|
||||
/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}!
|
||||
/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}!
|
||||
/w/setlinewidth #/J/setlinecap #
|
||||
/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat #
|
||||
/m/moveto #/l/lineto #/c/rcurveto #
|
||||
/p{N 2 idiv{N -2 roll rlineto}repeat}!
|
||||
/P{N 0 gt{N -2 roll moveto p}if}!
|
||||
/h{p closepath}!/H{P closepath}!
|
||||
/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}!
|
||||
/re{4 -2 roll m exch dup lx exch ly neg lx h}!
|
||||
/^{3 index neg 3 index neg}!
|
||||
/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}!
|
||||
/q/gsave #/Q/grestore #/rf{re fill}!
|
||||
/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}!
|
||||
/|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}!
|
||||
/|{exch string readstring |=}!
|
||||
/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}!
|
||||
/@/currentfile #/${+ @ |}!
|
||||
/B{{2 copy string{readstring pop}aload pop 4 array astore cvx
|
||||
3 1 roll}repeat pop pop true}!
|
||||
/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}!
|
||||
/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
|
||||
/Ic{exch Ix false 3 colorimage}!
|
||||
/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>>
|
||||
/CCITTFaxDecode filter}!/FX{<</EndOfBlock false F}!
|
||||
/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
|
||||
/@F{@ &2<<F}!/@C{@X &2 FX}!
|
||||
/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
|
||||
/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
|
||||
/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
|
||||
currentdict end image}!
|
||||
/~{@ read {pop} if}!
|
||||
end readonly def
|
||||
%%EndResource
|
||||
/pagesave null def
|
||||
%%EndProlog
|
||||
%%Page: 1 1
|
||||
%%BeginPageSetup
|
||||
GS_pswrite_2_0_1001 begin
|
||||
595 842 /a4 setpagesize
|
||||
/pagesave save store 197 dict begin
|
||||
0.1 0.1 scale
|
||||
%%EndPageSetup
|
||||
gsave mark
|
||||
Q q
|
||||
321.859 6 5262.14 6082.19 re
|
||||
Y
|
||||
4 w
|
||||
1 j
|
||||
K
|
||||
325.859 3430 2074.14 640 re
|
||||
S
|
||||
1016 3853 60 72 /1D
|
||||
$C
|
||||
+@.;U&Hj't(4j=H<#d$5F:`=&%F@htDNf13V=s.:/$%t$pSIan^K:=op&G'ls53/ZrV^YagL#*:
|
||||
p=6SEe[9=4=CDja)aQOp/24q9)%/jkLfc@$JHTo~>
|
||||
,
|
||||
1080 3855 55 70 /4D
|
||||
$C
|
||||
3!p,tJ+A,D3*9iJ^]4?6s8W-!s8W-!s8W-!rVulqed.>?DtdPFlnl4\KY%f*0O0,-s8W-!s7Me8
|
||||
K)[&0~>
|
||||
,
|
||||
1135 3854 51 46 /1H
|
||||
$C
|
||||
22H?7$l;4H,%Cm>#TJr>+Ibs:hpQ?gl&SpGs*t('rser#qgH39$pGLl)%2i:)<ARYM3%Huo_O(;
|
||||
df-jM@&hp]d]h0(@0I'+K*;~>
|
||||
,
|
||||
1185 3855 55 44 /4H
|
||||
$C
|
||||
3!p,tJ+A,D3(R^?s8W-!s8W-!s8W-!s8W,ts8N&VM"Pt!I9T<U'o,Ud)I,$V>VQRaUSR~>
|
||||
,
|
||||
1241 3855 4H ,
|
||||
1296 3854 44 46 /1L
|
||||
$C
|
||||
+U!pYLdZ\3+G#;6#3e'<\kUW<hO_0B^)H=hs8GAjf9'$\s8/k#n*[?el`Ib,Q*d6lX;FPHKcn<a~>
|
||||
,
|
||||
1340 3855 27 70 /4L
|
||||
$C
|
||||
3">eY,W5W%s8W-!s8W-!s8W-!s8W-!s8W-!XNWdCq&#b~>
|
||||
,
|
||||
1409 3853 1D ,
|
||||
1473 3854 49 46 /1P
|
||||
$C
|
||||
+MpDHKM#[i#VbHbh'VAF8\3_)l[!m7l["'[\,ZL.rq6<jg0_OBg0_:RlIo:e[ZiJ_$GhChLf+dT~>
|
||||
,
|
||||
1526 3854 55 71 /4P
|
||||
$C
|
||||
+N-)V&31.;KL`lB+E%N.gkj-3<1']"\kcDZ?hO*lp&G'ls8VQfJ+*BoqtAUpg[1bs[MQB(iI_GU
|
||||
`%DHN5QCc`s8W,uZ7$b%r.:j~>
|
||||
,
|
||||
1581 3855 27 67 /1T
|
||||
$C
|
||||
3">eY,W5W%s8W-!s8W-!s8VC@%h&;o;?-2Qe#-"Am96m~>
|
||||
,
|
||||
1609 3855 4H ,
|
||||
1664 3834 50 66 /4T
|
||||
$C
|
||||
-,[tnZ4Rf/i=`4O5m%UKDNf13Uu-K"huE^\InJU7/[1Hnb&HjjWX>%!L`"]6::7;*\aaneG/>QA
|
||||
iXg$%3_e/tFhL$*J,fQKhS3oU>tk-;K5Ge\fO5DCnAHXmK*3$iL7e~>
|
||||
,
|
||||
1281 3734 1H ,
|
||||
1330 3735 4H ,
|
||||
1386 3734 4P ,
|
||||
1018 3616 67 68 /1X
|
||||
$C
|
||||
4:7J\5iL">8T=BUG76YSmJHA,s)7o2s8W,Is/s)IqWW+5$\T<%/4.E8%$=!]iIg*E_gT8:pYXkH
|
||||
rVccrs8UOIY.ZJo/sSb&_?tN*0NeV-!!~>
|
||||
,
|
||||
1089 3616 1T ,
|
||||
1117 3615 35 62 /4X
|
||||
$C
|
||||
--$-/'#t:_o\D.%s'8k/s8W,s5QCc`s8W-!k/0-q_2spFmsFs3J,fN;~>
|
||||
,
|
||||
1155 3635 29 6 /2B
|
||||
$C
|
||||
0H"6m~>
|
||||
,
|
||||
1188 3616 35 68 /5B
|
||||
$C
|
||||
3"6or"LW%Fs8W-!s8W-!s8W-!s8W-!s8W-!e#,/7*W~>
|
||||
,
|
||||
1224 3616 4H ,
|
||||
1277 3615 4X ,
|
||||
1316 3615 1L ,
|
||||
1360 3616 38 44 /2F
|
||||
$C
|
||||
3!K>H"LYH5s8W-!s8W,frVfQ:7"%:t\#ni2[tS7ufJ;oM.T<(%~>
|
||||
,
|
||||
1399 3616 4L ,
|
||||
1427 3615 1L ,
|
||||
1471 3615 1H ,
|
||||
1518 3615 53 44 /5F
|
||||
$C
|
||||
.5+KGqlcY\Hi:N_H<9sPYIuIb>M%_sriPMT9)hrbpSEA?H<T496%f_a2?XQg~>
|
||||
,
|
||||
1571 3616 1T ,
|
||||
1598 3616 4H ,
|
||||
1654 3595 4T ,
|
||||
1920 1510 2074.14 640 re
|
||||
S
|
||||
2716 1881 90 68 /2J
|
||||
$C
|
||||
4:2S/e2)7EaoN3/%h't'(gC9m=7uOk#`nq6mJal&s*pmFDtX'YmJS^:rh&NVDtX'Io`&:qJ$82<
|
||||
Ds;c+rI82OInTfkVu$GJrI82Hhq.kblh^Y9qHrsr?e>;7lh^XYrkJ1,?UO7_>juEgfPA0.~>
|
||||
,
|
||||
2808 1880 1P ,
|
||||
2860 1880 4P ,
|
||||
2915 1880 55 45 /5J
|
||||
$C
|
||||
+TsVAN!r6;W[%$&Jdq>kOYJ3JXk(7lfC/b6s8W-!s8W-!s8W-!s8W,&en,oe#mC_:aM^t)~>
|
||||
,
|
||||
2971 1881 4L ,
|
||||
2998 1880 1H ,
|
||||
3048 1880 4X ,
|
||||
3087 1881 1T ,
|
||||
3115 1880 1P ,
|
||||
3164 1881 4H ,
|
||||
2888 1760 1H ,
|
||||
2938 1761 4H ,
|
||||
2993 1760 4P ,
|
||||
2743 1642 70 67 /2N
|
||||
$C
|
||||
,6M0G!t7O(fDkmNs8W-!s8W-!s8W,^]J'<brTa?2s8VE"s1NpN?0d9"Y\A\kO8&~>
|
||||
,
|
||||
2807 1642 2F ,
|
||||
2846 1641 1H ,
|
||||
2896 1642 4H ,
|
||||
2951 1641 38 46 /5N
|
||||
$C
|
||||
3Ko-K5kYdMLTl=3Gc(,iS(6d'X8fA1erkhk=U#BoJIkpU&6,SX"[k(MKe@pb')n6os80"eYO/HH
|
||||
(;gEFpgOo]69G~>
|
||||
,
|
||||
2990 1642 38 70 /2R
|
||||
$C
|
||||
3!K>H"bsGbs8W-!s8W-!s8W,si+7B]QiI*cs6nj0+&:O=hYV.oHOca,K*;~>
|
||||
,
|
||||
3021 1641 1P ,
|
||||
3071 1642 2F ,
|
||||
3110 1642 83 44 /5R
|
||||
$C
|
||||
3!p,tF26]5aoW:9$?2*RBncTes8W-!s8W-!s8W-!s8W-!s8W-!GQ7]Ts58_*&K\+>C[Z2BBfAsE
|
||||
X?Eq`X>H;YE6-fWaZAC:6&8F0&E9jC~>
|
||||
,
|
||||
1915 860 330 320 re
|
||||
S
|
||||
2425 860 330 320 re
|
||||
S
|
||||
2895 860 330 320 re
|
||||
S
|
||||
3685 860 330 320 re
|
||||
S
|
||||
2080 1490 0 -300 S
|
||||
2080 1190 23.33 70 -46.66 0 f*
|
||||
2080 1190 23.33 70 -46.66 0 H
|
||||
S
|
||||
3060 1490 0 -300 S
|
||||
3060 1190 23.33 70 -46.66 0 f*
|
||||
3060 1190 23.33 70 -46.66 0 H
|
||||
S
|
||||
2080 1490 0 -300 S
|
||||
2080 1190 23.33 70 -46.66 0 f*
|
||||
2080 1190 23.33 70 -46.66 0 H
|
||||
S
|
||||
2590 1490 0 -300 S
|
||||
2590 1190 23.33 70 -46.66 0 f*
|
||||
2590 1190 23.33 70 -46.66 0 H
|
||||
S
|
||||
3060 1490 0 -300 S
|
||||
3060 1190 23.33 70 -46.66 0 f*
|
||||
3060 1190 23.33 70 -46.66 0 H
|
||||
S
|
||||
3850 1490 0 -300 S
|
||||
3850 1190 23.33 70 -46.66 0 f*
|
||||
3850 1190 23.33 70 -46.66 0 H
|
||||
S
|
||||
2010 998 1L ,
|
||||
2054 999 53 43 /2V
|
||||
$C
|
||||
0E`!j8,;Z5OSfPAU$D;n[[$.3<mnSIXefkbCV%)X.f,u6T'20i0!4BL:"$UK<qP2uV00AeT[5]L
|
||||
fSD6]p]~>
|
||||
,
|
||||
2107 998 4X ,
|
||||
2520 998 1L ,
|
||||
2564 999 2V ,
|
||||
2617 998 4X ,
|
||||
2990 998 1L ,
|
||||
3034 999 2V ,
|
||||
3087 998 4X ,
|
||||
3780 998 1L ,
|
||||
3824 999 2V ,
|
||||
3877 998 4X ,
|
||||
3505.86 3460 2074.14 640 re
|
||||
S
|
||||
4196 3873 1D ,
|
||||
4260 3875 4D ,
|
||||
4315 3874 1H ,
|
||||
4365 3875 4H ,
|
||||
4421 3875 4H ,
|
||||
4476 3874 1L ,
|
||||
4520 3875 4L ,
|
||||
4589 3873 1D ,
|
||||
4653 3874 1P ,
|
||||
4706 3874 4P ,
|
||||
4761 3875 1T ,
|
||||
4789 3875 4H ,
|
||||
4844 3854 4T ,
|
||||
4461 3754 1H ,
|
||||
4510 3755 4H ,
|
||||
4566 3754 4P ,
|
||||
4198 3636 1X ,
|
||||
4269 3636 1T ,
|
||||
4297 3635 4X ,
|
||||
4335 3655 2B ,
|
||||
4368 3636 5B ,
|
||||
4404 3636 4H ,
|
||||
4457 3635 4X ,
|
||||
4496 3635 1L ,
|
||||
4540 3636 2F ,
|
||||
4579 3636 4L ,
|
||||
4607 3635 1L ,
|
||||
4651 3635 1H ,
|
||||
4698 3635 5F ,
|
||||
4751 3636 1T ,
|
||||
4778 3636 4H ,
|
||||
4834 3615 4T ,
|
||||
1043 6006 2J ,
|
||||
1134 6006 73 71 /5V
|
||||
$C
|
||||
3"<sEbPsC(-3Fff"r4#;GOCglh(S6.?eo";DS#i'A+m52n%El$HL&<<[JfE,qpsBLrN5Cgqq#-J
|
||||
Y.O..GM]V%?eYM2p:L~>
|
||||
,
|
||||
1214 6004 1D ,
|
||||
1311 6006 64 68 /2Z
|
||||
$C
|
||||
3"6tTJ<grMs8W-!s8W-!r^!5?L6dpH&7aY9iP+2f\*pg+IK/d9s8T:qp&:;\QV4/OPqYL!!koF9
|
||||
[5\~>
|
||||
,
|
||||
1379 6006 72 68 /5Z
|
||||
$C
|
||||
3#c!(@drPGjZ$I4+I<Q2*t@r@ID4V9ID>[Jn,:$$hu!H2s8W-!s8QHls'Pf/^\-419DpK0Y.ZHS
|
||||
#VMB..U[ju##$S&d]`~>
|
||||
,
|
||||
1455 6004 73 70 /3D
|
||||
$C
|
||||
,(Ukf_$:7!QuiTQKFhS?DNJb"dVi2fks)aTqR?EQX+10Ls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
|
||||
:\;L6QpK""6.?TuJ,~>
|
||||
,
|
||||
1563 6004 48 68 /6D
|
||||
$C
|
||||
+U*H@JANVK_?`(d#3e'<]%n_+e\BPHotUP"]g)PnhuE`Vs8W-!s8VuJs8W)k[JfFk[[6Ge>Lg*_
|
||||
V/7_s6O!fE@MBY-~>
|
||||
,
|
||||
4147 6020 2J ,
|
||||
4238 6020 5V ,
|
||||
4318 6018 1D ,
|
||||
4415 6020 2Z ,
|
||||
4483 6020 5Z ,
|
||||
4559 6018 3D ,
|
||||
4673 6020 84 68 /3J
|
||||
$C
|
||||
-D7#krI6pM3+6dShtM9n>Me!2#`me[J(">j9)&>!YC?23s.nKNFnPaideEaTXl&i=s.nKNFnPai
|
||||
deE\nmG>O[s.nKNBn-(?FnbhfmG>O[qo)jiU_#Pb1_jEU=5X~>
|
||||
,
|
||||
4787 6043 64 4 /6L
|
||||
$C
|
||||
2?e3rTE~>
|
||||
,
|
||||
4888 6020 36 66 /3P
|
||||
$C
|
||||
0F`Iu"GRYps8W-!s8W-!s8W-!s8W-!s8W#5GmaIj5^<b`*Zk'+~>
|
||||
,
|
||||
325.859 4393.18 2074.14 640 re
|
||||
S
|
||||
988 4746 1D ,
|
||||
1052 4746 75 70 /6P
|
||||
$C
|
||||
-:5l%4Q&%!7E<hpV":6'[qRJCs)7jb^Baf=rI=kIrI=coHL'#DFLhj3=G"H3Q&!2.iP$.W^O<iR
|
||||
^O?.Ns8W-!?%%4!l_W%g.YJNmW*-o9_.5EX^]~>
|
||||
,
|
||||
1130 4746 1D ,
|
||||
1227 4748 5V ,
|
||||
1299 4747 4X ,
|
||||
1338 4747 4X ,
|
||||
1377 4747 1H ,
|
||||
1427 4747 43 46 /3T
|
||||
$C
|
||||
+U!B,#`IZg+N&kbFIT)uY>*R3?`VbOs&K+!s7cC7%dEWcDuIE=Cc1)':teqg<Z!+e+[L^1~>
|
||||
,
|
||||
1468 4748 4D ,
|
||||
1523 4748 5R ,
|
||||
1606 4747 1L ,
|
||||
1651 4748 4H ,
|
||||
1703 4747 4X ,
|
||||
1017 4603 27 100 /6U
|
||||
$C
|
||||
$DAqKWG8f>=&c6#lFrU]r@_N]?a!i:qQKr!s8W-!^Yf(Kn)*R5g]$*En%8#]pNq)P]6<SZD?~>
|
||||
,
|
||||
1048 4626 48 68 /3Y
|
||||
$C
|
||||
+Mp`i@M!L7P7E-G%M1q;6+RB92cnPXIs(D_p&Fnjp!U:\$ZrM)[M$$6Ya)ShL(^p-L*9`nTdmnh
|
||||
LbB7"D[D1j]I)hidrZ>hp$'/>fDGU4>P_CtV/7^k-"3WX_$(66OFf^~>
|
||||
,
|
||||
1106 4609 14 30 /6Y
|
||||
$X
|
||||
$igb;#64jV!Pe]N!8mib!,qol!&srq!#P\Q!"8i9!"8i9!"9+V&,[OI+8d5Y+8?rQ+8?rI&)[].~>
|
||||
,
|
||||
1133 4628 3P ,
|
||||
1175 4626 48 68 /4C
|
||||
$C
|
||||
+U!B%#WP4Y%Y=oL2bC\A9'Z8a\$!KWs7a+ts8T:rQiI(irH6q(M#(Dgp6TVH[[1EU(CWXhK&^eL
|
||||
IG`hH4f<Dhs0pbNp=cqc@AOF0@)46G$4J<~>
|
||||
,
|
||||
1233 4609 6Y ,
|
||||
1253 4628 47 66 /7C
|
||||
$C
|
||||
4rV1[^$g;/8%5t^mCg6iYkIe,[r6HWgT^)"\%?hNmbbLcIc'k@h@P17s8@@J97m+H?.IP@>=ue*
|
||||
g/,V;<Zsg6"pt~>
|
||||
,
|
||||
1302 4628 49 67 /4G
|
||||
$C
|
||||
+N#kR&9qtts8W,E!iO88N:$YShqr@e^>FEg^Ae"XrV$-cn([Tohf$9Dhg^'grqlEeGJCiin*^~>
|
||||
,
|
||||
1360 4609 6Y ,
|
||||
1380 4626 47 68 /7G
|
||||
$C
|
||||
-,NAa`$""NAfUp]3XNA(\kUV!=,,QR:A=MWrmoZO5@1qtV<LfUWBpq]"6rI7#2t>UG4#0VIRn=m
|
||||
&,e`mrk$_ofIG]]9#F9=8f076L*9)AO8~>
|
||||
,
|
||||
1430 4628 7C ,
|
||||
1488 4603 23 100 /4K
|
||||
$C
|
||||
-GJm%[r6HWg\1Aig\1T\Du5%Ps*juts6m`&s8W)!s8Q+!?Fp-&oXuoXlBQKbd\TT9WD]Rk~>
|
||||
,
|
||||
1552 4627 54 71 /7K
|
||||
$C
|
||||
.0PeVJaeNk4eRFS5mAE&]qjL6^>>@RYIFO]n,In;s8W%IrI'1I?.V_b]"o!>]4`h7$#m_6(CWXh
|
||||
K&cn2s8W-!s/c!??fa>!~>
|
||||
,
|
||||
1607 4628 1T ,
|
||||
1635 4627 4X ,
|
||||
1673 4627 5N ,
|
||||
3505.86 4400 2074.14 640 re
|
||||
S
|
||||
4168 4756 1D ,
|
||||
4232 4756 6P ,
|
||||
4310 4756 1D ,
|
||||
4407 4758 5V ,
|
||||
4479 4757 4X ,
|
||||
4518 4757 4X ,
|
||||
4557 4757 1H ,
|
||||
4607 4757 3T ,
|
||||
4648 4758 4D ,
|
||||
4703 4758 5R ,
|
||||
4786 4757 1L ,
|
||||
4831 4758 4H ,
|
||||
4883 4757 4X ,
|
||||
4197 4613 6U ,
|
||||
4228 4636 3Y ,
|
||||
4286 4619 6Y ,
|
||||
4313 4638 3P ,
|
||||
4355 4636 4C ,
|
||||
4413 4619 6Y ,
|
||||
4433 4638 7C ,
|
||||
4482 4638 4G ,
|
||||
4540 4619 6Y ,
|
||||
4560 4636 7G ,
|
||||
4610 4638 7C ,
|
||||
4668 4613 4K ,
|
||||
4732 4637 7K ,
|
||||
4787 4638 1T ,
|
||||
4815 4637 4X ,
|
||||
4853 4637 5N ,
|
||||
1350 3430 0 -920 970 0 0 -340 S
|
||||
2320 2170 23.33 70 -46.66 0 f*
|
||||
2320 2170 23.33 70 -46.66 0 H
|
||||
S
|
||||
4550 3470 0 -980 -1060 0 0 -330 S
|
||||
3490 2160 23.33 70 -46.66 0 f*
|
||||
3490 2160 23.33 70 -46.66 0 H
|
||||
S
|
||||
1360 4380 0 -290 S
|
||||
1360 4090 23.33 70 -46.66 0 f*
|
||||
1360 4090 23.33 70 -46.66 0 H
|
||||
S
|
||||
4570 4410 0 -290 S
|
||||
4570 4120 23.33 70 -46.66 0 f*
|
||||
4570 4120 23.33 70 -46.66 0 H
|
||||
S
|
||||
[ 10 30 ] 0 d
|
||||
20 w
|
||||
2530 4140 710 0 S
|
||||
4 w
|
||||
2640 2470 0 -300 S
|
||||
2640 2170 23.33 70 -46.66 0 f*
|
||||
[ ] 0 d
|
||||
2640 2170 23.33 70 -46.66 0 H
|
||||
S
|
||||
[ 10 30 ] 0 d
|
||||
2960 2470 0 -300 S
|
||||
2960 2170 23.33 70 -46.66 0 f*
|
||||
[ ] 0 d
|
||||
2960 2170 23.33 70 -46.66 0 H
|
||||
S
|
||||
325.859 5235.6 2074.14 434.008 re
|
||||
S
|
||||
1360 5226.66 0 -196.66 S
|
||||
1360 5030 23.33 70 -46.66 0 f*
|
||||
1360 5030 23.33 70 -46.66 0 H
|
||||
S
|
||||
993 5435 2Z ,
|
||||
1061 5435 5Z ,
|
||||
1137 5433 3D ,
|
||||
1253 5433 44 72 /4O
|
||||
$C
|
||||
-Fp3)aT0>t%tmBEHO(0AZjFI.D\/DiVY,7bl+cQYp&F@WdY_A<Tj_>nK*!C(;$<PV,sajs((,k6
|
||||
(l0l>&9AC^Yd?[G;qJ5OFoVDYp&2;s[Hh[HU;u"]Yej1EJkleAiIp].Sc~>
|
||||
,
|
||||
1300 5434 3T ,
|
||||
1344 5435 2F ,
|
||||
1383 5434 1H ,
|
||||
1433 5435 5R ,
|
||||
1513 5434 7K ,
|
||||
1569 5435 4L ,
|
||||
1596 5435 1T ,
|
||||
1624 5435 4H ,
|
||||
1679 5414 4T ,
|
||||
3505.86 5255.6 2074.14 434.02 re
|
||||
S
|
||||
4540 5246.66 0 -196.66 S
|
||||
4540 5050 23.33 70 -46.66 0 f*
|
||||
4540 5050 23.33 70 -46.66 0 H
|
||||
S
|
||||
4173 5455 2Z ,
|
||||
4241 5455 5Z ,
|
||||
4317 5453 3D ,
|
||||
4433 5453 4O ,
|
||||
4480 5454 3T ,
|
||||
4524 5455 2F ,
|
||||
4563 5454 1H ,
|
||||
4613 5455 5R ,
|
||||
4693 5454 7K ,
|
||||
4749 5455 4L ,
|
||||
4776 5455 1T ,
|
||||
4804 5455 4H ,
|
||||
4859 5434 4T ,
|
||||
1360 5980 0 -300 S
|
||||
1360 5680 23.33 70 -46.66 0 f*
|
||||
1360 5680 23.33 70 -46.66 0 H
|
||||
S
|
||||
4540 5990 0 -300 S
|
||||
4540 5690 23.33 70 -46.66 0 f*
|
||||
4540 5690 23.33 70 -46.66 0 H
|
||||
S
|
||||
1922.93 10 2074.14 640 re
|
||||
S
|
||||
2070 856.66 0 -196.66 S
|
||||
2070 660 23.33 70 -46.66 0 f*
|
||||
2070 660 23.33 70 -46.66 0 H
|
||||
S
|
||||
2590 856.66 0 -196.66 S
|
||||
2590 660 23.33 70 -46.66 0 f*
|
||||
2590 660 23.33 70 -46.66 0 H
|
||||
S
|
||||
3050 856.66 0 -196.66 S
|
||||
3050 660 23.33 70 -46.66 0 f*
|
||||
3050 660 23.33 70 -46.66 0 H
|
||||
S
|
||||
3840 856.66 0 -196.66 S
|
||||
3840 660 23.33 70 -46.66 0 f*
|
||||
3840 660 23.33 70 -46.66 0 H
|
||||
S
|
||||
2697 293 4O ,
|
||||
2745 294 1L ,
|
||||
2789 295 2F ,
|
||||
2828 295 1T ,
|
||||
2856 294 1H ,
|
||||
2906 295 4L ,
|
||||
2933 295 1T ,
|
||||
2961 295 42 43 /7O
|
||||
$C
|
||||
3#[8j<ph$]HZ-C.D=.5gpANb5mJ"6$)h-VVhV@b\]>&9nrO:PKn*TMT42JWa~>
|
||||
,
|
||||
3005 294 1H ,
|
||||
3055 294 4X ,
|
||||
3094 295 1T ,
|
||||
3121 294 1P ,
|
||||
3171 295 4H ,
|
||||
20 w
|
||||
4000 325 630 0 S
|
||||
4630 325 -70 23.33 0 -46.66 f*
|
||||
4630 325 -70 23.33 0 -46.66 H
|
||||
S
|
||||
4788 360 2N ,
|
||||
4852 359 1P ,
|
||||
4935 360 5Z ,
|
||||
5011 335 46 100 /4S
|
||||
$C
|
||||
1[4kqmeacTrpT7QhsUMgpAXOTJ%PT-GPf/2rP,uChsUL$h>Zm;IrFcTGPf.apOBgRhfnsGVu~>
|
||||
,
|
||||
5061 360 5V ,
|
||||
cleartomark end end pagesave restore showpage
|
||||
%%PageTrailer
|
||||
%%Trailer
|
||||
%%Pages: 1
|
||||
%%EOF
|
||||
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 3.4 MiB |
|
Before Width: | Height: | Size: 625 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,15 +0,0 @@
|
||||
Entry point openair2/SIMULATION/USER_TOOLS/LAYER2_SIM/mac_sim.c
|
||||
|
||||
1. endless loop calling each frame/TTI
|
||||
|
||||
a) macphy_scheduler (invokes MAC/RRC/PDCP/RLC protocols and generates TX/RX commands for PHY/Emul) :
|
||||
[ see openair2/LAYER2/MAC/layer2_scheduler.c for how these are all scheduled]
|
||||
|
||||
b) emul_rx_tx() (emulates PHY and stimulates PDU transport mechanisms (ethernet or memory transfer)
|
||||
contains abstraction layer, channel simulation, etc.
|
||||
[ openair2/LAYER2/SIMULATION/PHY_EMULATION/CONTROL/phy_emulation.c ]
|
||||
b1) rx local chbch processing (i.e. from CH on the same physical machine)
|
||||
b2) rx local sach ul/dl processing
|
||||
b3) rx ethernet data (both chbch and sach ul/dl)
|
||||
b4) measurement-related stuff
|
||||
]
|
||||
@@ -1,231 +0,0 @@
|
||||
# Doxyfile 1.5.3
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = OpenAirInterface
|
||||
PROJECT_NUMBER = V1.0
|
||||
OUTPUT_DIRECTORY =
|
||||
CREATE_SUBDIRS = NO
|
||||
OUTPUT_LANGUAGE = English
|
||||
BRIEF_MEMBER_DESC = YES
|
||||
REPEAT_BRIEF = YES
|
||||
ABBREVIATE_BRIEF =
|
||||
ALWAYS_DETAILED_SEC = NO
|
||||
INLINE_INHERITED_MEMB = NO
|
||||
FULL_PATH_NAMES = YES
|
||||
STRIP_FROM_PATH =
|
||||
STRIP_FROM_INC_PATH =
|
||||
SHORT_NAMES = NO
|
||||
JAVADOC_AUTOBRIEF = NO
|
||||
QT_AUTOBRIEF = NO
|
||||
MULTILINE_CPP_IS_BRIEF = NO
|
||||
DETAILS_AT_TOP = NO
|
||||
INHERIT_DOCS = YES
|
||||
SEPARATE_MEMBER_PAGES = NO
|
||||
TAB_SIZE = 8
|
||||
ALIASES =
|
||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
BUILTIN_STL_SUPPORT = NO
|
||||
CPP_CLI_SUPPORT = NO
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
SUBGROUPING = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
EXTRACT_ALL = NO
|
||||
EXTRACT_PRIVATE = NO
|
||||
EXTRACT_STATIC = NO
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
EXTRACT_LOCAL_METHODS = NO
|
||||
EXTRACT_ANON_NSPACES = NO
|
||||
HIDE_UNDOC_MEMBERS = NO
|
||||
HIDE_UNDOC_CLASSES = NO
|
||||
HIDE_FRIEND_COMPOUNDS = NO
|
||||
HIDE_IN_BODY_DOCS = NO
|
||||
INTERNAL_DOCS = NO
|
||||
CASE_SENSE_NAMES = YES
|
||||
HIDE_SCOPE_NAMES = NO
|
||||
SHOW_INCLUDE_FILES = YES
|
||||
INLINE_INFO = YES
|
||||
SORT_MEMBER_DOCS = YES
|
||||
SORT_BRIEF_DOCS = NO
|
||||
SORT_BY_SCOPE_NAME = NO
|
||||
GENERATE_TODOLIST = YES
|
||||
GENERATE_TESTLIST = YES
|
||||
GENERATE_BUGLIST = YES
|
||||
GENERATE_DEPRECATEDLIST= YES
|
||||
ENABLED_SECTIONS =
|
||||
MAX_INITIALIZER_LINES = 30
|
||||
SHOW_USED_FILES = YES
|
||||
SHOW_DIRECTORIES = NO
|
||||
FILE_VERSION_FILTER =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to warning and progress messages
|
||||
#---------------------------------------------------------------------------
|
||||
QUIET = NO
|
||||
WARNINGS = YES
|
||||
WARN_IF_UNDOCUMENTED = YES
|
||||
WARN_IF_DOC_ERROR = YES
|
||||
WARN_NO_PARAMDOC = NO
|
||||
WARN_FORMAT = "$file:$line: $text"
|
||||
WARN_LOGFILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
INPUT = example_doxy.h
|
||||
INPUT_ENCODING = UTF-8
|
||||
FILE_PATTERNS =
|
||||
RECURSIVE = NO
|
||||
EXCLUDE =
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
EXCLUDE_PATTERNS =
|
||||
EXCLUDE_SYMBOLS =
|
||||
EXAMPLE_PATH =
|
||||
EXAMPLE_PATTERNS =
|
||||
EXAMPLE_RECURSIVE = NO
|
||||
IMAGE_PATH = images/
|
||||
INPUT_FILTER =
|
||||
FILTER_PATTERNS =
|
||||
FILTER_SOURCE_FILES = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
SOURCE_BROWSER = NO
|
||||
INLINE_SOURCES = NO
|
||||
STRIP_CODE_COMMENTS = YES
|
||||
REFERENCED_BY_RELATION = YES
|
||||
REFERENCES_RELATION = YES
|
||||
REFERENCES_LINK_SOURCE = YES
|
||||
USE_HTAGS = NO
|
||||
VERBATIM_HEADERS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
ALPHABETICAL_INDEX = NO
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
IGNORE_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the HTML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_HTML = YES
|
||||
HTML_OUTPUT = html
|
||||
HTML_FILE_EXTENSION = .html
|
||||
HTML_HEADER =
|
||||
HTML_FOOTER =
|
||||
HTML_STYLESHEET =
|
||||
HTML_ALIGN_MEMBERS = YES
|
||||
GENERATE_HTMLHELP = NO
|
||||
HTML_DYNAMIC_SECTIONS = NO
|
||||
CHM_FILE =
|
||||
HHC_LOCATION =
|
||||
GENERATE_CHI = NO
|
||||
BINARY_TOC = NO
|
||||
TOC_EXPAND = NO
|
||||
DISABLE_INDEX = NO
|
||||
ENUM_VALUES_PER_LINE = 4
|
||||
GENERATE_TREEVIEW = YES
|
||||
TREEVIEW_WIDTH = 250
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the LaTeX output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_LATEX = YES
|
||||
LATEX_OUTPUT = latex
|
||||
LATEX_CMD_NAME = latex
|
||||
MAKEINDEX_CMD_NAME = makeindex
|
||||
COMPACT_LATEX = NO
|
||||
PAPER_TYPE = a4wide
|
||||
EXTRA_PACKAGES =
|
||||
LATEX_HEADER =
|
||||
PDF_HYPERLINKS = NO
|
||||
USE_PDFLATEX = NO
|
||||
LATEX_BATCHMODE = NO
|
||||
LATEX_HIDE_INDICES = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the RTF output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_RTF = NO
|
||||
RTF_OUTPUT = rtf
|
||||
COMPACT_RTF = NO
|
||||
RTF_HYPERLINKS = NO
|
||||
RTF_STYLESHEET_FILE =
|
||||
RTF_EXTENSIONS_FILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the man page output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_MAN = NO
|
||||
MAN_OUTPUT = man
|
||||
MAN_EXTENSION = .3
|
||||
MAN_LINKS = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the XML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_XML = NO
|
||||
XML_OUTPUT = xml
|
||||
XML_SCHEMA =
|
||||
XML_DTD =
|
||||
XML_PROGRAMLISTING = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options for the AutoGen Definitions output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the Perl module output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_PERLMOD = NO
|
||||
PERLMOD_LATEX = NO
|
||||
PERLMOD_PRETTY = YES
|
||||
PERLMOD_MAKEVAR_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
ENABLE_PREPROCESSING = YES
|
||||
MACRO_EXPANSION = NO
|
||||
EXPAND_ONLY_PREDEF = NO
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH =
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED =
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::additions related to external references
|
||||
#---------------------------------------------------------------------------
|
||||
TAGFILES =
|
||||
GENERATE_TAGFILE =
|
||||
ALLEXTERNALS = NO
|
||||
EXTERNAL_GROUPS = YES
|
||||
PERL_PATH = /usr/bin/perl
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
CLASS_DIAGRAMS = YES
|
||||
MSCGEN_PATH =
|
||||
HIDE_UNDOC_RELATIONS = YES
|
||||
HAVE_DOT = NO
|
||||
CLASS_GRAPH = YES
|
||||
COLLABORATION_GRAPH = YES
|
||||
GROUP_GRAPHS = YES
|
||||
UML_LOOK = NO
|
||||
TEMPLATE_RELATIONS = NO
|
||||
INCLUDE_GRAPH = YES
|
||||
INCLUDED_BY_GRAPH = YES
|
||||
CALL_GRAPH = NO
|
||||
CALLER_GRAPH = NO
|
||||
GRAPHICAL_HIERARCHY = YES
|
||||
DIRECTORY_GRAPH = YES
|
||||
DOT_IMAGE_FORMAT = png
|
||||
DOT_PATH = /usr/bin/dot
|
||||
DOTFILE_DIRS =
|
||||
DOT_GRAPH_MAX_NODES = 50
|
||||
MAX_DOT_GRAPH_DEPTH = 0
|
||||
DOT_TRANSPARENT = NO
|
||||
DOT_MULTI_TARGETS = NO
|
||||
GENERATE_LEGEND = YES
|
||||
DOT_CLEANUP = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::additions related to the search engine
|
||||
#---------------------------------------------------------------------------
|
||||
SEARCHENGINE = NO
|
||||
@@ -1,144 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file doxy_template.h
|
||||
* \brief explain how this block is organized, and how it works
|
||||
* \author Navid Nikaein
|
||||
* \date 2006-2010
|
||||
* \version 4.0
|
||||
* \company Eurecom
|
||||
* \email: navid.nikaein@eurecom.fr
|
||||
* \note this a note
|
||||
* \bug this is a bug
|
||||
* \warning this is a warning
|
||||
*/
|
||||
|
||||
#ifndef __DOCS_TEMPLATES_CODE_EXAMPLE_DOXY__H__
|
||||
#define __DOCS_TEMPLATES_CODE_EXAMPLE_DOXY__H__
|
||||
|
||||
//-----------------------------------begin group-----------------------------
|
||||
|
||||
|
||||
/** @defgroup _oai System definitions
|
||||
|
||||
|
||||
|
||||
There is different modules:
|
||||
- OAI Address
|
||||
- OAI Components
|
||||
- \ref _frame
|
||||
|
||||
The following diagram is based on graphviz (http://www.graphviz.org/), you need to install the package to view the diagram.
|
||||
|
||||
* \dot
|
||||
* digraph group_frame {
|
||||
* node [shape=rect, fontname=Helvetica, fontsize=8,style=filled,fillcolor=lightgrey];
|
||||
* a [ label = " address"];
|
||||
* b [ label = " component"];
|
||||
* c [ label = " frame",URL="\ref _frame"];
|
||||
* a->b;
|
||||
* a->c;
|
||||
* b->d;
|
||||
* label="Architecture"
|
||||
*
|
||||
* }
|
||||
* \enddot
|
||||
|
||||
\section _doxy Doxygen Help
|
||||
You can use the provided Doxyfile as the configuration file or alternatively run "doxygen -g Doxyfile" to generat the file.
|
||||
You need at least to set the some variables in the Doxyfile including "PROJECT_NAME","PROJECT_NUMBER","INPUT","IMAGE_PATH".
|
||||
Doxygen help and commands can be found at http://www.stack.nl/~dimitri/doxygen/commands.html#cmdprotocol
|
||||
|
||||
\section _arch Architecture
|
||||
|
||||
You need to set the IMAGE_PATH in your Doxyfile
|
||||
|
||||
\image html arch.png "Architecture"
|
||||
\image latex arch.eps "Architecture"
|
||||
|
||||
\subsection _mac MAC
|
||||
thisis the mac
|
||||
\subsection _rlc RLC
|
||||
this is the rlc
|
||||
\subsection _impl Implementation
|
||||
what about the implementation
|
||||
|
||||
|
||||
*@{*/
|
||||
|
||||
/*!\brief OAI protocol verion */
|
||||
#define OAI_PROTOCOL_Version 0x00
|
||||
/*!\brief Length in bytes of the OAI address */
|
||||
#define OAI_ADDR_LEN 6
|
||||
|
||||
/*!\brief OAI snode type */
|
||||
enum NodeType {
|
||||
/*!\brief mesh routers are */
|
||||
meshrouter = 1,
|
||||
/*!\brief relay nodes are */
|
||||
relaynode = 2,
|
||||
/*!\brief clusterheads are */
|
||||
clusterhead = 3
|
||||
};
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
||||
// --------------------------end group ------------------------------
|
||||
|
||||
|
||||
//---------------------------begin group------------------------------
|
||||
/** @defgroup _frame Frame Structure
|
||||
* @ingroup _oai
|
||||
The Frame is composed of ....
|
||||
|
||||
|
||||
*@{*/
|
||||
/*! \brief the frame structure is ... */
|
||||
struct frame {
|
||||
u_short duration; /*!< \brief Duration in us (2 bytes) */
|
||||
u_char da[OAI_ADDR_LEN];/*!< \brief Destination MAC@ (OAI_ADDR_LEN bytes) */
|
||||
u_char sa[OAI_ADDR_LEN];/*!< \brief Source MAC@ (OAI_ADDR_LEN bytes)*/
|
||||
u_char body[0]; /*!< \brief Body of the frame */
|
||||
};
|
||||
/*! \brief Broadcast ID is ... */
|
||||
#define BROADCAST_ID 15
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
||||
//--------------------------end group-----------------------
|
||||
|
||||
|
||||
//-----------------------begin func proto-------------------
|
||||
|
||||
/*! \fn int init(int,int)
|
||||
* \brief this function initializes and allocates memories and etc.
|
||||
* \param[in] src the memory area to copy frrm
|
||||
* \param[out] dst the memory area to copy to
|
||||
* \return 0 on success, otherwise -1
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
int init(int src, int dst);
|
||||
|
||||
//-----------------------end func proto-------------------
|
||||
#endif
|
||||
@@ -1,785 +0,0 @@
|
||||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: /homes/nikaeinn/templates/dev/arch.dia
|
||||
%%Creator: Dia v0.95
|
||||
%%CreationDate: Fri Dec 11 12:31:01 2009
|
||||
%%For: nikaeinn
|
||||
%%Orientation: Portrait
|
||||
%%Magnification: 1.0000
|
||||
%%BoundingBox: 0 0 355 138
|
||||
%%BeginSetup
|
||||
%%EndSetup
|
||||
%%EndComments
|
||||
%%BeginProlog
|
||||
[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
|
||||
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
|
||||
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
|
||||
/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
|
||||
/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
|
||||
/two /three /four /five /six /seven /eight /nine /colon /semicolon
|
||||
/less /equal /greater /question /at /A /B /C /D /E
|
||||
/F /G /H /I /J /K /L /M /N /O
|
||||
/P /Q /R /S /T /U /V /W /X /Y
|
||||
/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
|
||||
/d /e /f /g /h /i /j /k /l /m
|
||||
/n /o /p /q /r /s /t /u /v /w
|
||||
/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
|
||||
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
|
||||
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
|
||||
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
|
||||
/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
|
||||
/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
|
||||
/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
|
||||
/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
|
||||
/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
|
||||
/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
|
||||
/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
|
||||
/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
|
||||
/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
|
||||
/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
|
||||
/cp {closepath} bind def
|
||||
/c {curveto} bind def
|
||||
/f {fill} bind def
|
||||
/a {arc} bind def
|
||||
/ef {eofill} bind def
|
||||
/ex {exch} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth pop} bind def
|
||||
/tr {translate} bind def
|
||||
|
||||
/ellipsedict 8 dict def
|
||||
ellipsedict /mtrx matrix put
|
||||
/ellipse
|
||||
{ ellipsedict begin
|
||||
/endangle exch def
|
||||
/startangle exch def
|
||||
/yrad exch def
|
||||
/xrad exch def
|
||||
/y exch def
|
||||
/x exch def /savematrix mtrx currentmatrix def
|
||||
x y tr xrad yrad sc
|
||||
0 0 1 startangle endangle arc
|
||||
savematrix setmatrix
|
||||
end
|
||||
} def
|
||||
|
||||
/mergeprocs {
|
||||
dup length
|
||||
3 -1 roll
|
||||
dup
|
||||
length
|
||||
dup
|
||||
5 1 roll
|
||||
3 -1 roll
|
||||
add
|
||||
array cvx
|
||||
dup
|
||||
3 -1 roll
|
||||
0 exch
|
||||
putinterval
|
||||
dup
|
||||
4 2 roll
|
||||
putinterval
|
||||
} bind def
|
||||
/dpi_x 300 def
|
||||
/dpi_y 300 def
|
||||
/conicto {
|
||||
/to_y exch def
|
||||
/to_x exch def
|
||||
/conic_cntrl_y exch def
|
||||
/conic_cntrl_x exch def
|
||||
currentpoint
|
||||
/p0_y exch def
|
||||
/p0_x exch def
|
||||
/p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def
|
||||
/p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def
|
||||
/p2_x p1_x to_x p0_x sub 1 3 div mul add def
|
||||
/p2_y p1_y to_y p0_y sub 1 3 div mul add def
|
||||
p1_x p1_y p2_x p2_y to_x to_y curveto
|
||||
} bind def
|
||||
/start_ol { gsave 1.1 dpi_x div dup scale} bind def
|
||||
/end_ol { closepath fill grestore } bind def
|
||||
28.346000 -28.346000 scale
|
||||
-4.400000 -8.150000 translate
|
||||
%%EndProlog
|
||||
|
||||
|
||||
1.000000 1.000000 1.000000 srgb
|
||||
n 4.450000 3.350000 m 4.450000 8.100000 l 16.850000 8.100000 l 16.850000 3.350000 l f
|
||||
0.100000 slw
|
||||
[] 0 sd
|
||||
[] 0 sd
|
||||
0 slj
|
||||
0.000000 0.000000 0.000000 srgb
|
||||
n 4.450000 3.350000 m 4.450000 8.100000 l 16.850000 8.100000 l 16.850000 3.350000 l cp s
|
||||
gsave 8.875000 4.300000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
1762 3044 moveto
|
||||
1276 3044 990 2673 conicto
|
||||
704 2303 704 1663 conicto
|
||||
704 1025 990 654 conicto
|
||||
1276 284 1762 284 conicto
|
||||
2248 284 2532 654 conicto
|
||||
2816 1025 2816 1663 conicto
|
||||
2816 2303 2532 2673 conicto
|
||||
2248 3044 1762 3044 conicto
|
||||
1762 3392 moveto
|
||||
2446 3392 2855 2922 conicto
|
||||
3264 2453 3264 1664 conicto
|
||||
3264 876 2855 406 conicto
|
||||
2446 -64 1762 -64 conicto
|
||||
1077 -64 666 405 conicto
|
||||
256 874 256 1664 conicto
|
||||
256 2453 666 2922 conicto
|
||||
1077 3392 1762 3392 conicto
|
||||
end_ol grestore
|
||||
gsave 9.330083 4.300000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
1536 2838 moveto
|
||||
935 1180 lineto
|
||||
2140 1180 lineto
|
||||
1536 2838 lineto
|
||||
1286 3282 moveto
|
||||
1789 3282 lineto
|
||||
3038 0 lineto
|
||||
2577 0 lineto
|
||||
2278 832 lineto
|
||||
801 832 lineto
|
||||
503 0 lineto
|
||||
35 0 lineto
|
||||
1286 3282 lineto
|
||||
end_ol grestore
|
||||
gsave 9.736483 4.300000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
448 3328 moveto
|
||||
874 3328 lineto
|
||||
874 0 lineto
|
||||
448 0 lineto
|
||||
448 3328 lineto
|
||||
end_ol grestore
|
||||
gsave 9.914283 4.300000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
end_ol grestore
|
||||
gsave 10.100550 4.300000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
1536 2838 moveto
|
||||
935 1180 lineto
|
||||
2140 1180 lineto
|
||||
1536 2838 lineto
|
||||
1286 3282 moveto
|
||||
1789 3282 lineto
|
||||
3038 0 lineto
|
||||
2577 0 lineto
|
||||
2278 832 lineto
|
||||
801 832 lineto
|
||||
503 0 lineto
|
||||
35 0 lineto
|
||||
1286 3282 lineto
|
||||
end_ol grestore
|
||||
gsave 10.506950 4.300000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
1842 2133 moveto
|
||||
1776 2174 1696 2193 conicto
|
||||
1616 2212 1519 2212 conicto
|
||||
1177 2212 993 1983 conicto
|
||||
810 1755 810 1328 conicto
|
||||
810 0 lineto
|
||||
384 0 lineto
|
||||
384 2496 lineto
|
||||
810 2496 lineto
|
||||
810 2129 lineto
|
||||
937 2347 1141 2453 conicto
|
||||
1345 2560 1638 2560 conicto
|
||||
1680 2560 1730 2554 conicto
|
||||
1781 2548 1842 2536 conicto
|
||||
1842 2133 lineto
|
||||
end_ol grestore
|
||||
gsave 10.752483 4.300000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2176 2404 moveto
|
||||
2176 2020 lineto
|
||||
2008 2116 1838 2164 conicto
|
||||
1669 2212 1496 2212 conicto
|
||||
1109 2212 895 1958 conicto
|
||||
682 1705 682 1248 conicto
|
||||
682 791 895 537 conicto
|
||||
1109 284 1496 284 conicto
|
||||
1669 284 1838 332 conicto
|
||||
2008 380 2176 476 conicto
|
||||
2176 97 lineto
|
||||
2009 17 1830 -23 conicto
|
||||
1652 -64 1449 -64 conicto
|
||||
902 -64 579 291 conicto
|
||||
256 646 256 1248 conicto
|
||||
256 1859 582 2209 conicto
|
||||
909 2560 1476 2560 conicto
|
||||
1660 2560 1835 2521 conicto
|
||||
2011 2482 2176 2404 conicto
|
||||
end_ol grestore
|
||||
gsave 11.074217 4.300000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2474 1509 moveto
|
||||
2474 0 lineto
|
||||
2048 0 lineto
|
||||
2048 1502 lineto
|
||||
2048 1858 1913 2035 conicto
|
||||
1778 2212 1509 2212 conicto
|
||||
1185 2212 997 1999 conicto
|
||||
810 1786 810 1419 conicto
|
||||
810 0 lineto
|
||||
384 0 lineto
|
||||
384 3456 lineto
|
||||
810 3456 lineto
|
||||
810 2120 lineto
|
||||
954 2343 1152 2451 conicto
|
||||
1350 2560 1609 2560 conicto
|
||||
2037 2560 2255 2293 conicto
|
||||
2474 2027 2474 1509 conicto
|
||||
end_ol grestore
|
||||
1.000000 1.000000 1.000000 srgb
|
||||
n 4.900000 6.250000 m 4.900000 7.500000 l 8.250000 7.500000 l 8.250000 6.250000 l f
|
||||
0.100000 slw
|
||||
[] 0 sd
|
||||
[] 0 sd
|
||||
0 slj
|
||||
0.000000 0.000000 0.000000 srgb
|
||||
n 4.900000 6.250000 m 4.900000 7.500000 l 8.250000 7.500000 l 8.250000 6.250000 l cp s
|
||||
1.000000 1.000000 1.000000 srgb
|
||||
n 8.900000 6.200000 m 8.900000 7.495000 l 12.500000 7.495000 l 12.500000 6.200000 l f
|
||||
0.100000 slw
|
||||
[] 0 sd
|
||||
[] 0 sd
|
||||
0 slj
|
||||
0.000000 0.000000 0.000000 srgb
|
||||
n 8.900000 6.200000 m 8.900000 7.495000 l 12.500000 7.495000 l 12.500000 6.200000 l cp s
|
||||
1.000000 1.000000 1.000000 srgb
|
||||
n 13.090000 6.195000 m 13.090000 7.495000 l 16.400000 7.495000 l 16.400000 6.195000 l f
|
||||
0.100000 slw
|
||||
[] 0 sd
|
||||
[] 0 sd
|
||||
0 slj
|
||||
0.000000 0.000000 0.000000 srgb
|
||||
n 13.090000 6.195000 m 13.090000 7.495000 l 16.400000 7.495000 l 16.400000 6.195000 l cp s
|
||||
gsave 5.400000 7.100000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
1536 2838 moveto
|
||||
935 1180 lineto
|
||||
2140 1180 lineto
|
||||
1536 2838 lineto
|
||||
1286 3282 moveto
|
||||
1789 3282 lineto
|
||||
3038 0 lineto
|
||||
2577 0 lineto
|
||||
2278 832 lineto
|
||||
801 832 lineto
|
||||
503 0 lineto
|
||||
35 0 lineto
|
||||
1286 3282 lineto
|
||||
end_ol grestore
|
||||
gsave 5.795817 7.100000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2048 2116 moveto
|
||||
2048 3456 lineto
|
||||
2474 3456 lineto
|
||||
2474 0 lineto
|
||||
2048 0 lineto
|
||||
2048 380 lineto
|
||||
1922 154 1727 45 conicto
|
||||
1533 -64 1261 -64 conicto
|
||||
816 -64 536 297 conicto
|
||||
256 659 256 1248 conicto
|
||||
256 1837 536 2198 conicto
|
||||
816 2560 1260 2560 conicto
|
||||
1532 2560 1726 2450 conicto
|
||||
1921 2341 2048 2116 conicto
|
||||
682 1248 moveto
|
||||
682 798 864 541 conicto
|
||||
1046 284 1364 284 conicto
|
||||
1683 284 1865 541 conicto
|
||||
2048 798 2048 1248 conicto
|
||||
2048 1699 1865 1955 conicto
|
||||
1683 2212 1364 2212 conicto
|
||||
1046 2212 864 1955 conicto
|
||||
682 1699 682 1248 conicto
|
||||
end_ol grestore
|
||||
gsave 6.176817 7.100000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2048 2116 moveto
|
||||
2048 3456 lineto
|
||||
2474 3456 lineto
|
||||
2474 0 lineto
|
||||
2048 0 lineto
|
||||
2048 380 lineto
|
||||
1922 154 1727 45 conicto
|
||||
1533 -64 1261 -64 conicto
|
||||
816 -64 536 297 conicto
|
||||
256 659 256 1248 conicto
|
||||
256 1837 536 2198 conicto
|
||||
816 2560 1260 2560 conicto
|
||||
1532 2560 1726 2450 conicto
|
||||
1921 2341 2048 2116 conicto
|
||||
682 1248 moveto
|
||||
682 798 864 541 conicto
|
||||
1046 284 1364 284 conicto
|
||||
1683 284 1865 541 conicto
|
||||
2048 798 2048 1248 conicto
|
||||
2048 1699 1865 1955 conicto
|
||||
1683 2212 1364 2212 conicto
|
||||
1046 2212 864 1955 conicto
|
||||
682 1699 682 1248 conicto
|
||||
end_ol grestore
|
||||
gsave 6.557817 7.100000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
1842 2133 moveto
|
||||
1776 2174 1696 2193 conicto
|
||||
1616 2212 1519 2212 conicto
|
||||
1177 2212 993 1983 conicto
|
||||
810 1755 810 1328 conicto
|
||||
810 0 lineto
|
||||
384 0 lineto
|
||||
384 2496 lineto
|
||||
810 2496 lineto
|
||||
810 2129 lineto
|
||||
937 2347 1141 2453 conicto
|
||||
1345 2560 1638 2560 conicto
|
||||
1680 2560 1730 2554 conicto
|
||||
1781 2548 1842 2536 conicto
|
||||
1842 2133 lineto
|
||||
end_ol grestore
|
||||
gsave 6.790121 7.100000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2538 1329 moveto
|
||||
2538 1124 lineto
|
||||
682 1124 lineto
|
||||
682 714 908 499 conicto
|
||||
1134 284 1537 284 conicto
|
||||
1772 284 1991 340 conicto
|
||||
2211 396 2432 509 conicto
|
||||
2432 128 lineto
|
||||
2216 34 1988 -15 conicto
|
||||
1760 -64 1526 -64 conicto
|
||||
940 -64 598 284 conicto
|
||||
256 633 256 1226 conicto
|
||||
256 1839 582 2199 conicto
|
||||
909 2560 1463 2560 conicto
|
||||
1960 2560 2249 2229 conicto
|
||||
2538 1898 2538 1329 conicto
|
||||
2112 1472 moveto
|
||||
2112 1809 1931 2010 conicto
|
||||
1751 2212 1453 2212 conicto
|
||||
1116 2212 914 2018 conicto
|
||||
712 1824 682 1472 conicto
|
||||
2112 1472 lineto
|
||||
end_ol grestore
|
||||
gsave 7.154187 7.100000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2021 2424 moveto
|
||||
2021 2034 lineto
|
||||
1818 2123 1638 2167 conicto
|
||||
1459 2212 1267 2212 conicto
|
||||
975 2212 828 2119 conicto
|
||||
682 2026 682 1838 conicto
|
||||
682 1696 784 1615 conicto
|
||||
887 1535 1196 1461 conicto
|
||||
1327 1430 lineto
|
||||
1748 1337 1930 1166 conicto
|
||||
2112 995 2112 690 conicto
|
||||
2112 342 1839 139 conicto
|
||||
1566 -64 1089 -64 conicto
|
||||
891 -64 675 -25 conicto
|
||||
460 14 222 94 conicto
|
||||
222 519 lineto
|
||||
481 402 692 343 conicto
|
||||
903 284 1110 284 conicto
|
||||
1387 284 1536 383 conicto
|
||||
1686 482 1686 661 conicto
|
||||
1686 829 1580 917 conicto
|
||||
1475 1006 1118 1088 conicto
|
||||
985 1121 lineto
|
||||
620 1201 438 1367 conicto
|
||||
256 1533 256 1823 conicto
|
||||
256 2176 507 2368 conicto
|
||||
758 2560 1219 2560 conicto
|
||||
1448 2560 1649 2526 conicto
|
||||
1851 2492 2021 2424 conicto
|
||||
end_ol grestore
|
||||
gsave 7.458988 7.100000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2021 2424 moveto
|
||||
2021 2034 lineto
|
||||
1818 2123 1638 2167 conicto
|
||||
1459 2212 1267 2212 conicto
|
||||
975 2212 828 2119 conicto
|
||||
682 2026 682 1838 conicto
|
||||
682 1696 784 1615 conicto
|
||||
887 1535 1196 1461 conicto
|
||||
1327 1430 lineto
|
||||
1748 1337 1930 1166 conicto
|
||||
2112 995 2112 690 conicto
|
||||
2112 342 1839 139 conicto
|
||||
1566 -64 1089 -64 conicto
|
||||
891 -64 675 -25 conicto
|
||||
460 14 222 94 conicto
|
||||
222 519 lineto
|
||||
481 402 692 343 conicto
|
||||
903 284 1110 284 conicto
|
||||
1387 284 1536 383 conicto
|
||||
1686 482 1686 661 conicto
|
||||
1686 829 1580 917 conicto
|
||||
1475 1006 1118 1088 conicto
|
||||
985 1121 lineto
|
||||
620 1201 438 1367 conicto
|
||||
256 1533 256 1823 conicto
|
||||
256 2176 507 2368 conicto
|
||||
758 2560 1219 2560 conicto
|
||||
1448 2560 1649 2526 conicto
|
||||
1851 2492 2021 2424 conicto
|
||||
end_ol grestore
|
||||
gsave 9.020000 7.095000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2880 3094 moveto
|
||||
2880 2615 lineto
|
||||
2656 2831 2402 2937 conicto
|
||||
2149 3044 1864 3044 conicto
|
||||
1301 3044 1002 2689 conicto
|
||||
704 2334 704 1663 conicto
|
||||
704 993 1002 638 conicto
|
||||
1301 284 1864 284 conicto
|
||||
2149 284 2402 390 conicto
|
||||
2656 497 2880 713 conicto
|
||||
2880 238 lineto
|
||||
2649 87 2390 11 conicto
|
||||
2132 -64 1845 -64 conicto
|
||||
1106 -64 681 399 conicto
|
||||
256 863 256 1664 conicto
|
||||
256 2466 681 2929 conicto
|
||||
1106 3392 1845 3392 conicto
|
||||
2137 3392 2395 3317 conicto
|
||||
2654 3243 2880 3094 conicto
|
||||
end_ol grestore
|
||||
gsave 9.434867 7.095000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
1377 2212 moveto
|
||||
1055 2212 868 1954 conicto
|
||||
682 1696 682 1248 conicto
|
||||
682 800 867 542 conicto
|
||||
1053 284 1377 284 conicto
|
||||
1697 284 1883 543 conicto
|
||||
2070 802 2070 1248 conicto
|
||||
2070 1692 1883 1952 conicto
|
||||
1697 2212 1377 2212 conicto
|
||||
1376 2560 moveto
|
||||
1899 2560 2197 2212 conicto
|
||||
2496 1864 2496 1248 conicto
|
||||
2496 635 2197 285 conicto
|
||||
1899 -64 1376 -64 conicto
|
||||
851 -64 553 285 conicto
|
||||
256 635 256 1248 conicto
|
||||
256 1864 553 2212 conicto
|
||||
851 2560 1376 2560 conicto
|
||||
end_ol grestore
|
||||
gsave 9.798933 7.095000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2339 2028 moveto
|
||||
2493 2302 2705 2431 conicto
|
||||
2918 2560 3204 2560 conicto
|
||||
3591 2560 3800 2286 conicto
|
||||
4010 2013 4010 1509 conicto
|
||||
4010 0 lineto
|
||||
3584 0 lineto
|
||||
3584 1502 lineto
|
||||
3584 1862 3460 2037 conicto
|
||||
3336 2212 3082 2212 conicto
|
||||
2771 2212 2590 1999 conicto
|
||||
2410 1786 2410 1419 conicto
|
||||
2410 0 lineto
|
||||
1984 0 lineto
|
||||
1984 1502 lineto
|
||||
1984 1865 1860 2038 conicto
|
||||
1736 2212 1477 2212 conicto
|
||||
1171 2212 990 1998 conicto
|
||||
810 1784 810 1419 conicto
|
||||
810 0 lineto
|
||||
384 0 lineto
|
||||
384 2496 lineto
|
||||
810 2496 lineto
|
||||
810 2120 lineto
|
||||
947 2344 1141 2452 conicto
|
||||
1335 2560 1602 2560 conicto
|
||||
1871 2560 2060 2423 conicto
|
||||
2249 2287 2339 2028 conicto
|
||||
end_ol grestore
|
||||
gsave 10.383133 7.095000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
810 380 moveto
|
||||
810 -960 lineto
|
||||
384 -960 lineto
|
||||
384 2496 lineto
|
||||
810 2496 lineto
|
||||
810 2116 lineto
|
||||
937 2339 1131 2449 conicto
|
||||
1325 2560 1595 2560 conicto
|
||||
2042 2560 2322 2198 conicto
|
||||
2602 1837 2602 1248 conicto
|
||||
2602 659 2322 297 conicto
|
||||
2043 -64 1595 -64 conicto
|
||||
1325 -64 1131 45 conicto
|
||||
938 155 810 380 conicto
|
||||
2176 1248 moveto
|
||||
2176 1699 1994 1955 conicto
|
||||
1812 2212 1493 2212 conicto
|
||||
1175 2212 992 1955 conicto
|
||||
810 1699 810 1248 conicto
|
||||
810 798 992 541 conicto
|
||||
1175 284 1493 284 conicto
|
||||
1812 284 1994 541 conicto
|
||||
2176 798 2176 1248 conicto
|
||||
end_ol grestore
|
||||
gsave 10.755667 7.095000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
1377 2212 moveto
|
||||
1055 2212 868 1954 conicto
|
||||
682 1696 682 1248 conicto
|
||||
682 800 867 542 conicto
|
||||
1053 284 1377 284 conicto
|
||||
1697 284 1883 543 conicto
|
||||
2070 802 2070 1248 conicto
|
||||
2070 1692 1883 1952 conicto
|
||||
1697 2212 1377 2212 conicto
|
||||
1376 2560 moveto
|
||||
1899 2560 2197 2212 conicto
|
||||
2496 1864 2496 1248 conicto
|
||||
2496 635 2197 285 conicto
|
||||
1899 -64 1376 -64 conicto
|
||||
851 -64 553 285 conicto
|
||||
256 635 256 1248 conicto
|
||||
256 1864 553 2212 conicto
|
||||
851 2560 1376 2560 conicto
|
||||
end_ol grestore
|
||||
gsave 11.119733 7.095000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2474 1509 moveto
|
||||
2474 0 lineto
|
||||
2048 0 lineto
|
||||
2048 1502 lineto
|
||||
2048 1858 1913 2035 conicto
|
||||
1778 2212 1509 2212 conicto
|
||||
1185 2212 997 1999 conicto
|
||||
810 1786 810 1419 conicto
|
||||
810 0 lineto
|
||||
384 0 lineto
|
||||
384 2496 lineto
|
||||
810 2496 lineto
|
||||
810 2120 lineto
|
||||
954 2340 1152 2450 conicto
|
||||
1350 2560 1609 2560 conicto
|
||||
2037 2560 2255 2293 conicto
|
||||
2474 2027 2474 1509 conicto
|
||||
end_ol grestore
|
||||
gsave 11.500733 7.095000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2538 1329 moveto
|
||||
2538 1124 lineto
|
||||
682 1124 lineto
|
||||
682 714 908 499 conicto
|
||||
1134 284 1537 284 conicto
|
||||
1772 284 1991 340 conicto
|
||||
2211 396 2432 509 conicto
|
||||
2432 128 lineto
|
||||
2216 34 1988 -15 conicto
|
||||
1760 -64 1526 -64 conicto
|
||||
940 -64 598 284 conicto
|
||||
256 633 256 1226 conicto
|
||||
256 1839 582 2199 conicto
|
||||
909 2560 1463 2560 conicto
|
||||
1960 2560 2249 2229 conicto
|
||||
2538 1898 2538 1329 conicto
|
||||
2112 1472 moveto
|
||||
2112 1809 1931 2010 conicto
|
||||
1751 2212 1453 2212 conicto
|
||||
1116 2212 914 2018 conicto
|
||||
712 1824 682 1472 conicto
|
||||
2112 1472 lineto
|
||||
end_ol grestore
|
||||
gsave 11.864800 7.095000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2474 1509 moveto
|
||||
2474 0 lineto
|
||||
2048 0 lineto
|
||||
2048 1502 lineto
|
||||
2048 1858 1913 2035 conicto
|
||||
1778 2212 1509 2212 conicto
|
||||
1185 2212 997 1999 conicto
|
||||
810 1786 810 1419 conicto
|
||||
810 0 lineto
|
||||
384 0 lineto
|
||||
384 2496 lineto
|
||||
810 2496 lineto
|
||||
810 2120 lineto
|
||||
954 2340 1152 2450 conicto
|
||||
1350 2560 1609 2560 conicto
|
||||
2037 2560 2255 2293 conicto
|
||||
2474 2027 2474 1509 conicto
|
||||
end_ol grestore
|
||||
gsave 12.245800 7.095000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
832 3213 moveto
|
||||
832 2524 lineto
|
||||
1664 2524 lineto
|
||||
1664 2176 lineto
|
||||
832 2176 lineto
|
||||
832 826 lineto
|
||||
832 521 914 434 conicto
|
||||
997 348 1249 348 conicto
|
||||
1664 348 lineto
|
||||
1664 0 lineto
|
||||
1242 0 lineto
|
||||
768 0 587 179 conicto
|
||||
406 359 406 826 conicto
|
||||
406 2176 lineto
|
||||
128 2176 lineto
|
||||
128 2524 lineto
|
||||
406 2524 lineto
|
||||
406 3213 lineto
|
||||
832 3213 lineto
|
||||
end_ol grestore
|
||||
gsave 13.945000 6.995000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
448 3328 moveto
|
||||
2313 3328 lineto
|
||||
2313 2980 lineto
|
||||
874 2980 lineto
|
||||
874 1948 lineto
|
||||
2173 1948 lineto
|
||||
2173 1600 lineto
|
||||
874 1600 lineto
|
||||
874 27 lineto
|
||||
448 27 lineto
|
||||
448 3328 lineto
|
||||
end_ol grestore
|
||||
gsave 14.239614 6.995000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
1842 2133 moveto
|
||||
1776 2174 1696 2193 conicto
|
||||
1616 2212 1519 2212 conicto
|
||||
1177 2212 993 1983 conicto
|
||||
810 1755 810 1328 conicto
|
||||
810 0 lineto
|
||||
384 0 lineto
|
||||
384 2496 lineto
|
||||
810 2496 lineto
|
||||
810 2129 lineto
|
||||
937 2347 1141 2453 conicto
|
||||
1345 2560 1638 2560 conicto
|
||||
1680 2560 1730 2554 conicto
|
||||
1781 2548 1842 2536 conicto
|
||||
1842 2133 lineto
|
||||
end_ol grestore
|
||||
gsave 14.485147 6.995000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
1528 1252 moveto
|
||||
1050 1252 866 1139 conicto
|
||||
682 1026 682 754 conicto
|
||||
682 538 820 411 conicto
|
||||
958 284 1196 284 conicto
|
||||
1523 284 1721 523 conicto
|
||||
1920 763 1920 1161 conicto
|
||||
1920 1252 lineto
|
||||
1528 1252 lineto
|
||||
2346 1426 moveto
|
||||
2346 0 lineto
|
||||
1920 0 lineto
|
||||
1920 383 lineto
|
||||
1785 154 1579 45 conicto
|
||||
1374 -64 1076 -64 conicto
|
||||
701 -64 478 154 conicto
|
||||
256 373 256 739 conicto
|
||||
256 1166 543 1383 conicto
|
||||
830 1600 1367 1600 conicto
|
||||
1920 1600 lineto
|
||||
1920 1639 lineto
|
||||
1920 1913 1740 2062 conicto
|
||||
1561 2212 1238 2212 conicto
|
||||
1032 2212 836 2162 conicto
|
||||
641 2113 448 2014 conicto
|
||||
448 2386 lineto
|
||||
670 2473 879 2516 conicto
|
||||
1088 2560 1285 2560 conicto
|
||||
1819 2560 2082 2279 conicto
|
||||
2346 1998 2346 1426 conicto
|
||||
end_ol grestore
|
||||
gsave 14.849214 6.995000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2339 2028 moveto
|
||||
2493 2302 2705 2431 conicto
|
||||
2918 2560 3204 2560 conicto
|
||||
3591 2560 3800 2286 conicto
|
||||
4010 2013 4010 1509 conicto
|
||||
4010 0 lineto
|
||||
3584 0 lineto
|
||||
3584 1502 lineto
|
||||
3584 1862 3460 2037 conicto
|
||||
3336 2212 3082 2212 conicto
|
||||
2771 2212 2590 1999 conicto
|
||||
2410 1786 2410 1419 conicto
|
||||
2410 0 lineto
|
||||
1984 0 lineto
|
||||
1984 1502 lineto
|
||||
1984 1865 1860 2038 conicto
|
||||
1736 2212 1477 2212 conicto
|
||||
1171 2212 990 1998 conicto
|
||||
810 1784 810 1419 conicto
|
||||
810 0 lineto
|
||||
384 0 lineto
|
||||
384 2496 lineto
|
||||
810 2496 lineto
|
||||
810 2120 lineto
|
||||
947 2344 1141 2452 conicto
|
||||
1335 2560 1602 2560 conicto
|
||||
1871 2560 2060 2423 conicto
|
||||
2249 2287 2339 2028 conicto
|
||||
end_ol grestore
|
||||
gsave 15.433414 6.995000 translate 0.035278 -0.035278 scale
|
||||
start_ol
|
||||
2538 1329 moveto
|
||||
2538 1124 lineto
|
||||
682 1124 lineto
|
||||
682 714 908 499 conicto
|
||||
1134 284 1537 284 conicto
|
||||
1772 284 1991 340 conicto
|
||||
2211 396 2432 509 conicto
|
||||
2432 128 lineto
|
||||
2216 34 1988 -15 conicto
|
||||
1760 -64 1526 -64 conicto
|
||||
940 -64 598 284 conicto
|
||||
256 633 256 1226 conicto
|
||||
256 1839 582 2199 conicto
|
||||
909 2560 1463 2560 conicto
|
||||
1960 2560 2249 2229 conicto
|
||||
2538 1898 2538 1329 conicto
|
||||
2112 1472 moveto
|
||||
2112 1809 1931 2010 conicto
|
||||
1751 2212 1453 2212 conicto
|
||||
1116 2212 914 2018 conicto
|
||||
712 1824 682 1472 conicto
|
||||
2112 1472 lineto
|
||||
end_ol grestore
|
||||
showpage
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
@@ -1,103 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file Readme.doxy
|
||||
* \brief explain how this block is organized, and how it works
|
||||
* \author Navid Nikaein
|
||||
* \date 2009
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: navid.nikaein@eurecom.fr
|
||||
* \warning
|
||||
*/
|
||||
|
||||
/*! \mainpage Table of contents
|
||||
|
||||
The content of this readme is the following:
|
||||
|
||||
-# What is this block about in OpenAirInterface
|
||||
-# Folders and files description
|
||||
-# Organization of the folders and their dependancies
|
||||
-# Makefile targets and how to build
|
||||
-# How to use through a tutorial: run a simple experimentation
|
||||
|
||||
|
||||
\section _block What is this block about in OpenAirInterface ?
|
||||
|
||||
|
||||
It essentially means "the hardware part" located at openair0.
|
||||
|
||||
Explain through the figures:
|
||||
\image html image.png "caption" width=3cm
|
||||
\image latex image.pdf "caption"
|
||||
|
||||
More information about ??? can be found on the Twiki:
|
||||
https://twiki.eurecom.fr/twiki/bin/view/OpenAirInterface/WebHome
|
||||
|
||||
|
||||
\section _folders Folders and files description
|
||||
|
||||
The structure is the following:
|
||||
<table>
|
||||
<tr><td>File/Folder</td> <td> Description </td> </tr>
|
||||
</table>
|
||||
|
||||
- Folder1: Contains this and that
|
||||
- Folder2: Contains this and that
|
||||
- init.bash: A simple script file, that any user SHOULD source from its environment personal set-up script (this is typically ~/.bashrc) by adding the following lines to it:
|
||||
This is my ~/.bashrc file or equivalent export OPENAIRX=path/to/my/openairX/folder source $OPENAIRX/init.bash. The file includes variable definitions & path settings to access softwares, sources & Makefiles, software distribution in openair, and so on.
|
||||
|
||||
|
||||
YOU DEFINETELY NEED TO SOURCE THIS FILE. Description
|
||||
|
||||
\section _organization Organization of the folders and their dependancies
|
||||
|
||||
|
||||
The 3 folders have the following structures
|
||||
|
||||
- Folder1/subfolder1/: contains any ressource related to the design
|
||||
|
||||
- Folder2/subfolder2/: contains
|
||||
|
||||
- Folder2/src/
|
||||
|
||||
- Folder2/lib/
|
||||
|
||||
- Folder2/bin/
|
||||
|
||||
Explain where are the source files.
|
||||
Explain the relationship with other Blocks.
|
||||
|
||||
|
||||
\section _makefile Makefile targets and how to build
|
||||
|
||||
Explain whether you are using symbolic links or not,
|
||||
how to backup/archive
|
||||
how to generate the tags
|
||||
how to print the vars
|
||||
how to create the documentation
|
||||
|
||||
\section _howto How to use through a tutorial: run a simple experimentation
|
||||
...
|
||||
|
||||
|
||||
*/
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*________________________OEPNAIR/OPENAIR0/________________________
|
||||
|
||||
File : Readme.txt
|
||||
Authors : navid nikaein
|
||||
Company : EURECOM
|
||||
Emails : navid.nikaein@eurecom.fr
|
||||
________________________________________________________________*/
|
||||
|
||||
|
||||
-------------------------
|
||||
Table of contents
|
||||
-------------------------
|
||||
|
||||
The content of this readme is the following:
|
||||
|
||||
1) What is this block about in OpenAirInterface
|
||||
2) Folders and files description
|
||||
3) Organization of the folders and their dependancies
|
||||
4) Makefile targets and how to build
|
||||
5) How to use through a tutorial: run a simple experimentation
|
||||
|
||||
------------------------------------------------
|
||||
1) What is this block about in OpenAirInterface ?
|
||||
-----------------------------------------------
|
||||
|
||||
|
||||
It essentially means "the hardware part" located at openair0.
|
||||
|
||||
More information about ??? can be found on the Twiki:
|
||||
https://twiki.eurecom.fr/twiki/bin/view/OpenAirInterface/WebHome
|
||||
|
||||
-----------------------------------------
|
||||
2) Folders and files description
|
||||
-----------------------------------------
|
||||
|
||||
File/Folder Description
|
||||
----------- -----------
|
||||
|
||||
- Folder1/ contains
|
||||
|
||||
- Folder2/ contains
|
||||
|
||||
- init.bash A simple script file, that any user SHOULD source from
|
||||
its environment personal set-up script (this is typically ~/.bashrc)
|
||||
by adding the following lines to it:
|
||||
|
||||
# This is my ~/.bashrc file or equivalent
|
||||
export OPENAIRX=path/to/my/openairX/folder
|
||||
source $OPENAIRX/init.bash
|
||||
|
||||
The file includes variable definitions & path settings to
|
||||
access softwares, sources & Makefiles, software
|
||||
distribution in openair, and so on.
|
||||
|
||||
YOU DEFINETELY NEED TO SOURCE THIS FILE.
|
||||
|
||||
----------------------------------------------------
|
||||
3) Organization of the folders and their dependancies
|
||||
----------------------------------------------------
|
||||
|
||||
The 3 folders have the following structures
|
||||
|
||||
- Folder1/subfolder1/ contains any ressource related to the design
|
||||
|
||||
- Folder2/subfolder2/ contains
|
||||
|
||||
- Folder2/src/
|
||||
|
||||
- Folder2/lib/
|
||||
|
||||
- Folder2/bin/
|
||||
|
||||
Explain where are the source files.
|
||||
Explain the relationship with other Blocks.
|
||||
|
||||
|
||||
-----------------------------------------
|
||||
4) Makefile targets and how to build
|
||||
-----------------------------------------
|
||||
|
||||
Explain whether you are using symbolic links or not,
|
||||
how to backup/archive
|
||||
how to generate the tags
|
||||
how to print the vars
|
||||
how to create the documentation
|
||||
|
||||
----------------------------------------------------------------
|
||||
6) How to use through a tutorial: run a simple experimentation
|
||||
----------------------------------------------------------------
|
||||
|
||||
...
|
||||
|
||||
@@ -5364,3 +5364,11 @@ uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report_template, uint8_t csi_rep
|
||||
|
||||
return csi_bitlen;
|
||||
}
|
||||
|
||||
uint16_t compute_PDU_length(uint32_t num_TLV, uint16_t total_length)
|
||||
{
|
||||
uint8_t pdu_length = 8; // 2 bytes PDU_Length + 2 bytes PDU_Index + 4 bytes num_TLV
|
||||
// For each TLV, add 2 bytes tag + 2 bytes length + value size without padding
|
||||
pdu_length += (num_TLV * 4) + total_length;
|
||||
return pdu_length;
|
||||
}
|
||||
|
||||
@@ -307,4 +307,6 @@ void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report_t *cs
|
||||
|
||||
uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report_template, uint8_t csi_report_id);
|
||||
|
||||
uint16_t compute_PDU_length(uint32_t num_TLV, uint16_t total_length);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -469,7 +469,6 @@ typedef struct {
|
||||
/* PDUs */
|
||||
/// Outgoing CCCH pdu for PHY
|
||||
CCCH_PDU CCCH_pdu;
|
||||
ULSCH_PDU ulsch_pdu;
|
||||
|
||||
/* Random Access */
|
||||
/// CRNTI
|
||||
|
||||
@@ -376,6 +376,8 @@ void set_ra_rnti(NR_UE_MAC_INST_t *mac, fapi_nr_ul_config_prach_pdu *prach_pdu);
|
||||
void nr_Msg1_transmitted(module_id_t mod_id);
|
||||
|
||||
void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id);
|
||||
void nr_get_msg3_payload(module_id_t mod_id);
|
||||
void send_msg3_rrc_request(module_id_t mod_id, int rnti);
|
||||
|
||||
void nr_ue_msg2_scheduler(module_id_t mod_id, uint16_t rach_frame, uint16_t rach_slot, uint16_t *msg2_frame, uint16_t *msg2_slot);
|
||||
|
||||
|
||||
@@ -40,10 +40,29 @@
|
||||
#include "openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
|
||||
#include "nr_rlc/nr_rlc_oai_api.h"
|
||||
#include "RRC/NR/MESSAGES/asn1_msg.h"
|
||||
#include "RRC/NR_UE/rrc_proto.h"
|
||||
#include <pthread.h>
|
||||
|
||||
static NR_UE_MAC_INST_t *nr_ue_mac_inst;
|
||||
|
||||
static void send_srb0_rrc(int rnti, const uint8_t *sdu, sdu_size_t sdu_len, void *data)
|
||||
{
|
||||
AssertFatal(sdu_len > 0 && sdu_len < CCCH_SDU_SIZE, "invalid CCCH SDU size %d\n", sdu_len);
|
||||
|
||||
MessageDef *message_p = itti_alloc_new_message(TASK_MAC_UE, 0, NR_RRC_MAC_CCCH_DATA_IND);
|
||||
memset(NR_RRC_MAC_CCCH_DATA_IND(message_p).sdu, 0, sdu_len);
|
||||
memcpy(NR_RRC_MAC_CCCH_DATA_IND(message_p).sdu, sdu, sdu_len);
|
||||
NR_RRC_MAC_CCCH_DATA_IND(message_p).sdu_size = sdu_len;
|
||||
NR_RRC_MAC_CCCH_DATA_IND(message_p).rnti = rnti;
|
||||
itti_send_msg_to_task(TASK_RRC_NRUE, 0, message_p);
|
||||
}
|
||||
|
||||
void send_msg3_rrc_request(module_id_t mod_id, int rnti)
|
||||
{
|
||||
nr_rlc_activate_srb0(rnti, NULL, send_srb0_rrc);
|
||||
nr_mac_rrc_msg3_ind(mod_id, rnti);
|
||||
}
|
||||
|
||||
NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst) {
|
||||
|
||||
//LOG_I(MAC, "[MAIN] MAC_INIT_GLOBAL_PARAM IN...\n");
|
||||
@@ -67,7 +86,9 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst) {
|
||||
if (rrc_inst && rrc_inst->scell_group_config) {
|
||||
|
||||
nr_rrc_mac_config_req_scg(0, 0, rrc_inst->scell_group_config);
|
||||
AssertFatal(rlc_module_init(0) == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__);
|
||||
int rc = rlc_module_init(0);
|
||||
AssertFatal(rc == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__);
|
||||
nr_rlc_activate_srb0(nr_ue_mac_inst->crnti, NULL, send_srb0_rrc);
|
||||
if (IS_SOFTMODEM_NOS1){
|
||||
// get default noS1 configuration
|
||||
NR_RadioBearerConfig_t *rbconfig = NULL;
|
||||
@@ -91,7 +112,8 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst) {
|
||||
else {
|
||||
LOG_I(MAC,"Running without CellGroupConfig\n");
|
||||
if(get_softmodem_params()->sa == 1) {
|
||||
AssertFatal(rlc_module_init(0) == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__);
|
||||
int rc = rlc_module_init(0);
|
||||
AssertFatal(rc == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -605,7 +605,52 @@ void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot
|
||||
|
||||
ra->RA_contention_resolution_timer_active = 1;
|
||||
ra->ra_state = WAIT_CONTENTION_RESOLUTION;
|
||||
}
|
||||
|
||||
void nr_get_msg3_payload(module_id_t mod_id)
|
||||
{
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
||||
RA_config_t *ra = &mac->ra;
|
||||
uint8_t *pdu = mac->CCCH_pdu.payload;
|
||||
const uint8_t sh_size = sizeof(NR_MAC_SUBHEADER_FIXED);
|
||||
NR_MAC_SUBHEADER_FIXED *header = (NR_MAC_SUBHEADER_FIXED *) pdu;
|
||||
pdu += sh_size;
|
||||
int lcid = 0; // SRB0 for messages sent in MSG3
|
||||
tbs_size_t len = mac_rlc_data_req(mod_id,
|
||||
ra->t_crnti,
|
||||
0,
|
||||
0,
|
||||
ENB_FLAG_NO,
|
||||
MBMS_FLAG_NO,
|
||||
lcid,
|
||||
16, /* size of mac_ce above */
|
||||
(char *)pdu,
|
||||
0,
|
||||
0);
|
||||
AssertFatal(len > 0, "no data for Msg.3\n");
|
||||
// UE Contention Resolution Identity
|
||||
// Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to determine whether or not the
|
||||
// Random Access Procedure has been successful after reception of Msg4
|
||||
memcpy(ra->cont_res_id, pdu, sizeof(uint8_t) * 6);
|
||||
pdu += len;
|
||||
int Msg3_size = len + sh_size;
|
||||
// Build header
|
||||
header->R = 0;
|
||||
header->LCID = UL_SCH_LCID_CCCH;
|
||||
const uint8_t TBS_max = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); // Note: unclear the reason behind the selection of such TBS_max
|
||||
// Padding: fill remainder with 0
|
||||
if (TBS_max - Msg3_size > 0) {
|
||||
AssertFatal(TBS_max > Msg3_size, "Allocated resources are not enough for Msg3!\n");
|
||||
LOG_D(NR_MAC, "Remaining %d bytes, filling with padding\n",TBS_max - Msg3_size);
|
||||
((NR_MAC_SUBHEADER_FIXED *) pdu)->R = 0;
|
||||
((NR_MAC_SUBHEADER_FIXED *) pdu)->LCID = UL_SCH_LCID_PADDING;
|
||||
pdu += sizeof(NR_MAC_SUBHEADER_FIXED);
|
||||
memset(pdu, 0, TBS_max - Msg3_size - sizeof(NR_MAC_SUBHEADER_FIXED));
|
||||
}
|
||||
// Dumping ULSCH payload
|
||||
LOG_D(NR_MAC, "Dumping UL Msg3 MAC PDU with length %d: \n", TBS_max);
|
||||
for(int k = 0; k < TBS_max; k++)
|
||||
LOG_D(NR_MAC,"(%i): %i\n", k, pdu[k]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -660,47 +705,15 @@ uint8_t nr_ue_get_rach(module_id_t mod_id,
|
||||
|
||||
LOG_D(NR_MAC, "In %s: RA not active. Checking for data to transmit from upper layers...\n", __FUNCTION__);
|
||||
|
||||
const uint8_t lcid = UL_SCH_LCID_CCCH;
|
||||
const uint8_t sh_size = sizeof(NR_MAC_SUBHEADER_FIXED);
|
||||
const uint8_t TBS_max = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); // Note: unclear the reason behind the selection of such TBS_max
|
||||
int8_t size_sdu = 0;
|
||||
int size_sdu = 0;
|
||||
uint8_t mac_ce[16] = {0};
|
||||
uint8_t *pdu = get_softmodem_params()->sa ? mac->CCCH_pdu.payload : mac_ce;
|
||||
uint8_t *payload = pdu;
|
||||
|
||||
// Concerning the C-RNTI MAC CE, it has to be included if the UL transmission (Msg3) is not being made for the CCCH logical channel.
|
||||
// Therefore it has been assumed that this event only occurs only when RA is done and it is not SA mode.
|
||||
if (get_softmodem_params()->sa) {
|
||||
|
||||
NR_MAC_SUBHEADER_FIXED *header = (NR_MAC_SUBHEADER_FIXED *) pdu;
|
||||
pdu += sh_size;
|
||||
|
||||
// initialisation by RRC
|
||||
nr_rrc_ue_generate_RRCSetupRequest(mod_id,gNB_id);
|
||||
|
||||
// CCCH PDU
|
||||
size_sdu = nr_mac_rrc_data_req_ue(mod_id, CC_id, gNB_id, frame, CCCH, pdu);
|
||||
LOG_D(NR_MAC, "In %s: [UE %d][%d.%d]: Requested RRCConnectionRequest, got %d bytes for LCID 0x%02x \n", __FUNCTION__, mod_id, frame, nr_slot_tx, size_sdu, lcid);
|
||||
|
||||
if (size_sdu > 0) {
|
||||
|
||||
// UE Contention Resolution Identity
|
||||
// Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to determine whether or not the
|
||||
// Random Access Procedure has been successful after reception of Msg4
|
||||
memcpy(ra->cont_res_id, pdu, sizeof(uint8_t) * 6);
|
||||
|
||||
pdu += size_sdu;
|
||||
ra->Msg3_size = size_sdu + sh_size;
|
||||
|
||||
// Build header
|
||||
header->R = 0;
|
||||
header->LCID = lcid;
|
||||
|
||||
} else {
|
||||
pdu -= sh_size;
|
||||
}
|
||||
|
||||
} else if (get_softmodem_params()->nsa) {
|
||||
if (get_softmodem_params()->nsa) {
|
||||
|
||||
uint8_t mac_sdus[34*1056];
|
||||
uint16_t sdu_lengths[NB_RB_MAX] = {0};
|
||||
@@ -722,7 +735,7 @@ uint8_t nr_ue_get_rach(module_id_t mod_id,
|
||||
ra->Msg3_size = size_sdu + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT);
|
||||
}
|
||||
|
||||
} else {
|
||||
} else if (!get_softmodem_params()->sa) {
|
||||
|
||||
size_sdu = nr_write_ce_ulsch_pdu(pdu, mac, 0, &(mac->crnti), NULL, NULL, NULL);
|
||||
pdu += size_sdu;
|
||||
@@ -732,12 +745,12 @@ uint8_t nr_ue_get_rach(module_id_t mod_id,
|
||||
|
||||
if (size_sdu > 0 && (ra->ra_state == GENERATE_PREAMBLE || get_softmodem_params()->nsa)) {
|
||||
|
||||
LOG_D(NR_MAC, "In %s: [UE %d][%d.%d]: starting initialisation Random Access Procedure...\n", __FUNCTION__, mod_id, frame, nr_slot_tx);
|
||||
LOG_D(NR_MAC, "[UE %d][%d.%d]: starting initialisation Random Access Procedure...\n", mod_id, frame, nr_slot_tx);
|
||||
|
||||
// Padding: fill remainder with 0
|
||||
if (TBS_max - ra->Msg3_size > 0) {
|
||||
AssertFatal(TBS_max > ra->Msg3_size, "In %s: allocated resources are not enough for Msg3!\n", __FUNCTION__);
|
||||
LOG_D(NR_MAC, "In %s: remaining %d bytes, filling with padding\n", __FUNCTION__, TBS_max - ra->Msg3_size);
|
||||
LOG_D(NR_MAC, "Remaining %d bytes, filling with padding\n",TBS_max - ra->Msg3_size);
|
||||
((NR_MAC_SUBHEADER_FIXED *) pdu)->R = 0;
|
||||
((NR_MAC_SUBHEADER_FIXED *) pdu)->LCID = UL_SCH_LCID_PADDING;
|
||||
pdu += sizeof(NR_MAC_SUBHEADER_FIXED);
|
||||
@@ -745,25 +758,17 @@ uint8_t nr_ue_get_rach(module_id_t mod_id,
|
||||
}
|
||||
|
||||
// Dumping ULSCH payload
|
||||
LOG_D(NR_MAC, "In %s: dumping UL Msg3 MAC PDU with length %d: \n", __FUNCTION__, TBS_max);
|
||||
LOG_D(NR_MAC, "Dumping UL Msg3 MAC PDU with length %d: \n", TBS_max);
|
||||
for(int k = 0; k < TBS_max; k++) {
|
||||
LOG_D(NR_MAC,"(%i): %i\n", k, payload[k]);
|
||||
}
|
||||
|
||||
// Msg3 was initialized with TBS_max bytes because the RA_Msg3_size will only be known after
|
||||
// receiving Msg2 (which contains the Msg3 resource reserve).
|
||||
// Msg3 will be transmitted with RA_Msg3_size bytes, removing unnecessary 0s.
|
||||
if (!get_softmodem_params()->nsa) {
|
||||
mac->ulsch_pdu.Pdu_size = TBS_max;
|
||||
memcpy(mac->ulsch_pdu.payload, payload, TBS_max);
|
||||
}
|
||||
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else if (ra->RA_window_cnt != -1) { // RACH is active
|
||||
|
||||
LOG_D(MAC, "In %s [%d.%d] RA is active: RA window count %d, RA backoff count %d\n", __FUNCTION__, frame, nr_slot_tx, ra->RA_window_cnt, ra->RA_backoff_cnt);
|
||||
LOG_D(MAC, "[%d.%d] RA is active: RA window count %d, RA backoff count %d\n", frame, nr_slot_tx, ra->RA_window_cnt, ra->RA_backoff_cnt);
|
||||
|
||||
if (ra->RA_BI_found){
|
||||
prach_resources->RA_PREAMBLE_BACKOFF = prach_resources->RA_SCALING_FACTOR_BI * ra->RA_backoff_indicator;
|
||||
@@ -806,7 +811,7 @@ uint8_t nr_ue_get_rach(module_id_t mod_id,
|
||||
}
|
||||
}
|
||||
|
||||
if (ra->RA_contention_resolution_timer_active){
|
||||
if (ra->RA_contention_resolution_timer_active) {
|
||||
nr_ue_contention_resolution(mod_id, CC_id, frame, nr_slot_tx, prach_resources);
|
||||
}
|
||||
|
||||
|
||||
@@ -3598,7 +3598,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
|
||||
break;
|
||||
}
|
||||
|
||||
if ( mac_len > 0 ) {
|
||||
if (mac_len > 0) {
|
||||
LOG_D(NR_MAC,"DL_SCH_LCID_CCCH (e.g. RRCSetup) with payload len %d\n", mac_len);
|
||||
for (int i = 0; i < mac_subheader_len; i++) {
|
||||
LOG_D(NR_MAC, "MAC header %d: 0x%x\n", i, pduP[i]);
|
||||
@@ -3606,7 +3606,18 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
|
||||
for (int i = 0; i < mac_len; i++) {
|
||||
LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[mac_subheader_len + i]);
|
||||
}
|
||||
nr_mac_rrc_data_ind_ue(module_idP, CC_id, gNB_index, frameP, 0, mac->crnti, CCCH, pduP+mac_subheader_len, mac_len);
|
||||
|
||||
mac_rlc_data_ind(module_idP,
|
||||
mac->crnti,
|
||||
module_idP,
|
||||
frameP,
|
||||
ENB_FLAG_NO,
|
||||
MBMS_FLAG_NO,
|
||||
0,
|
||||
(char *)(pduP + mac_subheader_len),
|
||||
mac_len,
|
||||
1,
|
||||
NULL);
|
||||
}
|
||||
break;
|
||||
case DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH:
|
||||
@@ -4112,7 +4123,7 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, int pdu_id)
|
||||
LOG_I(NR_MAC, "rar->TCRNTI_1 = 0x%x\n", rar->TCRNTI_1);
|
||||
LOG_I(NR_MAC, "rar->TCRNTI_2 = 0x%x\n", rar->TCRNTI_2);
|
||||
|
||||
LOG_I(NR_MAC, "In %s:[%d.%d]: [UE %d] Received RAR with t_alloc %d f_alloc %d ta_command %d mcs %d freq_hopping %d tpc_command %d t_crnti %x \n",
|
||||
LOG_I(NR_MAC, "In %s:[%d.%d]: [UE %d] Received RAR with t_alloc %d f_alloc %d ta_command %d mcs %d freq_hopping %d tpc_command %d\n",
|
||||
__FUNCTION__,
|
||||
frame,
|
||||
slot,
|
||||
@@ -4122,8 +4133,7 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, int pdu_id)
|
||||
ta_command,
|
||||
rar_grant.mcs,
|
||||
rar_grant.freq_hopping,
|
||||
tpc_command,
|
||||
ra->t_crnti);
|
||||
tpc_command);
|
||||
#endif
|
||||
|
||||
// Schedule Msg3
|
||||
@@ -4135,7 +4145,7 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, int pdu_id)
|
||||
}
|
||||
ret = nr_ue_pusch_scheduler(mac, is_Msg3, frame, slot, &frame_tx, &slot_tx, tda_info.k2);
|
||||
|
||||
if (ret != -1){
|
||||
if (ret != -1) {
|
||||
|
||||
fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slot_tx, tda_info.k2);
|
||||
uint16_t rnti = mac->crnti;
|
||||
@@ -4151,6 +4161,7 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, int pdu_id)
|
||||
if (!ra->cfra) {
|
||||
ra->t_crnti = rar->TCRNTI_2 + (rar->TCRNTI_1 << 8);
|
||||
rnti = ra->t_crnti;
|
||||
send_msg3_rrc_request(mod_id, rnti);
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&ul_config->mutex_ul_config);
|
||||
|
||||
@@ -1037,13 +1037,13 @@ void nr_ue_ul_scheduler(nr_uplink_indication_t *ul_info)
|
||||
mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id],
|
||||
ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator,
|
||||
TBS_bytes,ra->ra_state);
|
||||
if (ra->ra_state == WAIT_RAR && !ra->cfra){
|
||||
memcpy(ulsch_input_buffer, mac->ulsch_pdu.payload, TBS_bytes);
|
||||
LOG_D(NR_MAC,"[RAPROC] Msg3 to be transmitted:\n");
|
||||
if (ra->ra_state == WAIT_RAR && !ra->cfra) {
|
||||
nr_get_msg3_payload(mod_id);
|
||||
memcpy(ulsch_input_buffer, mac->CCCH_pdu.payload, TBS_bytes);
|
||||
for (int k = 0; k < TBS_bytes; k++) {
|
||||
LOG_D(NR_MAC,"(%i): 0x%x\n",k,mac->ulsch_pdu.payload[k]);
|
||||
LOG_D(NR_MAC,"(%i): 0x%x\n", k, ulsch_input_buffer[k]);
|
||||
}
|
||||
LOG_D(NR_MAC,"Flipping NDI for harq_id %d (Msg3)\n",ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator);
|
||||
LOG_D(NR_MAC,"Flipping NDI for harq_id %d (Msg3)\n", ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator);
|
||||
mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator;
|
||||
mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = 0;
|
||||
mac_pdu_exist = 1;
|
||||
|
||||
@@ -1399,10 +1399,10 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
||||
T(T_GNB_MAC_DL_RAR_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(ra->RA_rnti), T_INT(frameP),
|
||||
T_INT(slotP), T_INT(0), T_BUFFER(&tx_req->TLVs[0].value.direct[0], tx_req->TLVs[0].length));
|
||||
|
||||
tx_req->PDU_length = pdsch_pdu_rel15->TBSize[0];
|
||||
tx_req->PDU_index = pduindex;
|
||||
tx_req->num_TLV = 1;
|
||||
tx_req->TLVs[0].length = tx_req->PDU_length + 2;
|
||||
tx_req->TLVs[0].length = pdsch_pdu_rel15->TBSize[0];
|
||||
tx_req->PDU_length = compute_PDU_length(tx_req->num_TLV, pdsch_pdu_rel15->TBSize[0]);
|
||||
TX_req->SFN = frameP;
|
||||
TX_req->Number_of_PDUs++;
|
||||
TX_req->Slot = slotP;
|
||||
@@ -1845,10 +1845,10 @@ static void nr_generate_Msg4(module_id_t module_idP,
|
||||
// DL TX request
|
||||
nfapi_nr_pdu_t *tx_req = &TX_req->pdu_list[TX_req->Number_of_PDUs];
|
||||
memcpy(tx_req->TLVs[0].value.direct, harq->transportBlock, sizeof(uint8_t) * harq->tb_size);
|
||||
tx_req->PDU_length = harq->tb_size;
|
||||
tx_req->PDU_index = pduindex;
|
||||
tx_req->num_TLV = 1;
|
||||
tx_req->TLVs[0].length = harq->tb_size + 2;
|
||||
tx_req->TLVs[0].length = harq->tb_size;
|
||||
tx_req->PDU_length = compute_PDU_length(tx_req->num_TLV, tx_req->TLVs[0].length);
|
||||
TX_req->SFN = frameP;
|
||||
TX_req->Number_of_PDUs++;
|
||||
TX_req->Slot = slotP;
|
||||
|
||||
@@ -601,10 +601,10 @@ void schedule_nr_sib1(module_id_t module_idP,
|
||||
// Data to be transmitted
|
||||
memcpy(tx_req->TLVs[0].value.direct, cc->sib1_bcch_pdu, TBS);
|
||||
|
||||
tx_req->PDU_length = TBS;
|
||||
tx_req->PDU_index = pdu_index;
|
||||
tx_req->num_TLV = 1;
|
||||
tx_req->TLVs[0].length = TBS + 2;
|
||||
tx_req->TLVs[0].length = TBS;
|
||||
tx_req->PDU_length = compute_PDU_length(tx_req->num_TLV, tx_req->TLVs[0].length);
|
||||
TX_req->Number_of_PDUs++;
|
||||
TX_req->SFN = frameP;
|
||||
TX_req->Slot = slotP;
|
||||
|
||||
@@ -1367,10 +1367,10 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
||||
|
||||
const int ntx_req = TX_req->Number_of_PDUs;
|
||||
nfapi_nr_pdu_t *tx_req = &TX_req->pdu_list[ntx_req];
|
||||
tx_req->PDU_length = TBS;
|
||||
tx_req->PDU_index = pduindex;
|
||||
tx_req->num_TLV = 1;
|
||||
tx_req->TLVs[0].length = TBS + 2;
|
||||
tx_req->TLVs[0].length = TBS;
|
||||
tx_req->PDU_length = compute_PDU_length(tx_req->num_TLV, tx_req->TLVs[0].length);
|
||||
memcpy(tx_req->TLVs[0].value.direct, harq->transportBlock, TBS);
|
||||
TX_req->Number_of_PDUs++;
|
||||
TX_req->SFN = frame;
|
||||
|
||||
@@ -2908,10 +2908,10 @@ void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCom
|
||||
}
|
||||
}
|
||||
|
||||
void send_initial_ul_rrc_message(gNB_MAC_INST *mac, int rnti, const uint8_t *sdu, sdu_size_t sdu_len, void *rawUE)
|
||||
void send_initial_ul_rrc_message(int rnti, const uint8_t *sdu, sdu_size_t sdu_len, void *data)
|
||||
{
|
||||
|
||||
NR_UE_info_t *UE = (NR_UE_info_t *)rawUE;
|
||||
gNB_MAC_INST *mac = RC.nrmac[0];
|
||||
NR_UE_info_t *UE = (NR_UE_info_t *)data;
|
||||
NR_SCHED_ENSURE_LOCKED(&mac->sched_lock);
|
||||
|
||||
uint8_t du2cu[1024];
|
||||
@@ -2945,7 +2945,7 @@ void prepare_initial_ul_rrc_message(gNB_MAC_INST *mac, NR_UE_info_t *UE)
|
||||
process_CellGroup(cellGroupConfig, UE);
|
||||
|
||||
/* activate SRB0 */
|
||||
nr_rlc_activate_srb0(UE->rnti, mac, UE, send_initial_ul_rrc_message);
|
||||
nr_rlc_activate_srb0(UE->rnti, UE, send_initial_ul_rrc_message);
|
||||
|
||||
/* the cellGroup sent to CU specifies there is SRB1, so create it */
|
||||
DevAssert(cellGroupConfig->rlc_BearerToAddModList->list.count == 1);
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <immintrin.h>
|
||||
#include "PHY/sse_intrin.h"
|
||||
|
||||
//#define SRS_DEBUG
|
||||
|
||||
|
||||
@@ -435,7 +435,7 @@ size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset
|
||||
void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_info_t *UE);
|
||||
|
||||
void prepare_initial_ul_rrc_message(gNB_MAC_INST *mac, NR_UE_info_t *UE);
|
||||
void send_initial_ul_rrc_message(gNB_MAC_INST *mac, int rnti, const uint8_t *sdu, sdu_size_t sdu_len, void *rawUE);
|
||||
void send_initial_ul_rrc_message(int rnti, const uint8_t *sdu, sdu_size_t sdu_len, void *data);
|
||||
|
||||
void abort_nr_dl_harq(NR_UE_info_t* UE, int8_t harq_pid);
|
||||
|
||||
|
||||
@@ -151,8 +151,8 @@ void mac_rlc_data_ind(const module_id_t module_idP,
|
||||
rb->set_time(rb, nr_rlc_current_time);
|
||||
rb->recv_pdu(rb, buffer_pP, tb_sizeP);
|
||||
} else {
|
||||
LOG_E(RLC, "%s:%d:%s: fatal: no RB found (channel ID %d)\n",
|
||||
__FILE__, __LINE__, __FUNCTION__, channel_idP);
|
||||
LOG_E(RLC, "Fatal: no RB found (channel ID %d RNTI %d)\n",
|
||||
channel_idP, rntiP);
|
||||
// exit(1);
|
||||
}
|
||||
|
||||
@@ -729,7 +729,7 @@ void nr_rlc_add_srb(int rnti, int srb_id, const NR_RLC_BearerConfig_t *rlc_Beare
|
||||
int t_reassembly;
|
||||
int sn_field_length;
|
||||
|
||||
LOG_D(RLC,"Trying to add SRB %d\n",srb_id);
|
||||
LOG_D(RLC, "Trying to add SRB %d\n", srb_id);
|
||||
AssertFatal(srb_id > 0 && srb_id < 4,
|
||||
"Invalid srb id %d\n", srb_id);
|
||||
|
||||
@@ -792,7 +792,7 @@ void nr_rlc_add_srb(int rnti, int srb_id, const NR_RLC_BearerConfig_t *rlc_Beare
|
||||
sn_field_length);
|
||||
nr_rlc_ue_add_srb_rlc_entity(ue, srb_id, nr_rlc_am);
|
||||
|
||||
LOG_I(RLC, "%s:%d:%s: added srb %d to UE with RNTI 0x%x\n", __FILE__, __LINE__, __FUNCTION__, srb_id, rnti);
|
||||
LOG_I(RLC, "Added srb %d to UE with RNTI 0x%x\n", srb_id, rnti);
|
||||
}
|
||||
nr_rlc_manager_unlock(nr_rlc_ue_manager);
|
||||
}
|
||||
@@ -963,31 +963,27 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP
|
||||
}
|
||||
|
||||
struct srb0_data {
|
||||
struct gNB_MAC_INST_s *mac;
|
||||
int rnti;
|
||||
void *rawUE;
|
||||
void (*send_initial_ul_rrc_message)(struct gNB_MAC_INST_s *mac,
|
||||
int rnti,
|
||||
void *data;
|
||||
void (*send_initial_ul_rrc_message)(int rnti,
|
||||
const uint8_t *sdu,
|
||||
sdu_size_t sdu_len,
|
||||
void *rawUE);
|
||||
void *data);
|
||||
};
|
||||
|
||||
void deliver_sdu_srb0(void *deliver_sdu_data, struct nr_rlc_entity_t *entity,
|
||||
char *buf, int size)
|
||||
{
|
||||
struct srb0_data *s0 = (struct srb0_data *)deliver_sdu_data;
|
||||
s0->send_initial_ul_rrc_message(s0->mac, s0->rnti, (unsigned char *)buf,
|
||||
size, s0->rawUE);
|
||||
s0->send_initial_ul_rrc_message(s0->rnti, (unsigned char *)buf, size, s0->data);
|
||||
}
|
||||
|
||||
void nr_rlc_activate_srb0(int rnti, struct gNB_MAC_INST_s *mac, void *rawUE,
|
||||
void nr_rlc_activate_srb0(int rnti, void *data,
|
||||
void (*send_initial_ul_rrc_message)(
|
||||
struct gNB_MAC_INST_s *mac,
|
||||
int rnti,
|
||||
const uint8_t *sdu,
|
||||
sdu_size_t sdu_len,
|
||||
void *rawUE))
|
||||
void *data))
|
||||
{
|
||||
nr_rlc_entity_t *nr_rlc_tm;
|
||||
nr_rlc_ue_t *ue;
|
||||
@@ -996,9 +992,8 @@ void nr_rlc_activate_srb0(int rnti, struct gNB_MAC_INST_s *mac, void *rawUE,
|
||||
srb0_data = calloc(1, sizeof(struct srb0_data));
|
||||
AssertFatal(srb0_data != NULL, "out of memory\n");
|
||||
|
||||
srb0_data->mac = mac;
|
||||
srb0_data->rnti = rnti;
|
||||
srb0_data->rawUE = rawUE;
|
||||
srb0_data->data = data;
|
||||
srb0_data->send_initial_ul_rrc_message = send_initial_ul_rrc_message;
|
||||
|
||||
nr_rlc_manager_lock(nr_rlc_ue_manager);
|
||||
|
||||
@@ -66,13 +66,11 @@ void nr_rlc_activate_avg_time_to_tx(
|
||||
|
||||
void nr_rlc_srb_recv_sdu(const int rnti, const logical_chan_id_t channel_id, unsigned char *buf, int size);
|
||||
|
||||
struct gNB_MAC_INST_s;
|
||||
void nr_rlc_activate_srb0(int rnti, struct gNB_MAC_INST_s *mac, void *rawUE,
|
||||
void nr_rlc_activate_srb0(int rnti, void *data,
|
||||
void (*send_initial_ul_rrc_message)(
|
||||
struct gNB_MAC_INST_s *mac,
|
||||
int rnti,
|
||||
const uint8_t *sdu,
|
||||
sdu_size_t sdu_len,
|
||||
void *rawUE));
|
||||
void *data));
|
||||
|
||||
bool nr_rlc_get_statistics(int rnti, int srb_flag, int rb_id, nr_rlc_statistics_t *out);
|
||||
|
||||
@@ -772,7 +772,8 @@ int16_t do_RRCReconfiguration(const gNB_RRC_UE_t *UE,
|
||||
}
|
||||
|
||||
|
||||
uint8_t do_RRCSetupRequest(uint8_t Mod_id, uint8_t *buffer, size_t buffer_size, uint8_t *rv) {
|
||||
int do_RRCSetupRequest(uint8_t Mod_id, uint8_t *buffer, size_t buffer_size, uint8_t *rv)
|
||||
{
|
||||
asn_enc_rval_t enc_rval;
|
||||
uint8_t buf[5],buf2=0;
|
||||
NR_UL_CCCH_Message_t ul_ccch_msg;
|
||||
|
||||
@@ -117,7 +117,7 @@ uint8_t do_RRCSetupComplete(uint8_t Mod_id,
|
||||
const int dedicatedInfoNASLength,
|
||||
const char *dedicatedInfoNAS);
|
||||
|
||||
uint8_t do_RRCSetupRequest(uint8_t Mod_id, uint8_t *buffer, size_t buffer_size, uint8_t *rv);
|
||||
int do_RRCSetupRequest(uint8_t Mod_id, uint8_t *buffer, size_t buffer_size, uint8_t *rv);
|
||||
|
||||
uint8_t do_NR_RRCReconfigurationComplete_for_nsa(uint8_t *buffer, size_t buffer_size, NR_RRC_TransactionIdentifier_t Transaction_id);
|
||||
|
||||
|
||||
@@ -61,13 +61,7 @@ typedef struct RB_INFO_NR_s {
|
||||
//MAC_MEAS_REQ_ENTRY *Meas_entry; //may not needed for NB-IoT
|
||||
} NR_RB_INFO;
|
||||
|
||||
typedef struct NR_SRB_INFO_s {
|
||||
NR_RRC_BUFFER Rx_buffer;
|
||||
NR_RRC_BUFFER Tx_buffer;
|
||||
} NR_SRB_INFO;
|
||||
|
||||
typedef struct SRB_INFO_TABLE_ENTRY_NR_s {
|
||||
NR_SRB_INFO Srb_info;
|
||||
uint8_t Active;
|
||||
uint8_t status;
|
||||
} NR_SRB_INFO_TABLE_ENTRY;
|
||||
|
||||
@@ -91,29 +91,7 @@ int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id,
|
||||
break;
|
||||
|
||||
case CCCH:
|
||||
if (pdu_len>0) {
|
||||
LOG_T(NR_RRC,"[UE %d] Received SDU for CCCH on SRB %u from gNB %d\n",module_id,channel & RAB_OFFSET,gNB_index);
|
||||
|
||||
MessageDef *message_p;
|
||||
int msg_sdu_size = CCCH_SDU_SIZE;
|
||||
|
||||
if (pdu_len > msg_sdu_size) {
|
||||
LOG_E(NR_RRC, "SDU larger than CCCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size);
|
||||
sdu_size = msg_sdu_size;
|
||||
} else {
|
||||
sdu_size = pdu_len;
|
||||
}
|
||||
|
||||
message_p = itti_alloc_new_message (TASK_MAC_UE, 0, NR_RRC_MAC_CCCH_DATA_IND);
|
||||
memset (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
|
||||
memcpy (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, pduP, sdu_size);
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).frame = frame; //frameP
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).slot = slot;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = sdu_size;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).gnb_index = gNB_index;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).rnti = rnti; //rntiP
|
||||
itti_send_msg_to_task (TASK_RRC_NRUE, GNB_MODULE_ID_TO_INSTANCE( module_id ), message_p);
|
||||
}
|
||||
AssertFatal(false, "use RLC instead\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -123,36 +101,11 @@ int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id,
|
||||
return(0);
|
||||
}
|
||||
|
||||
int8_t nr_mac_rrc_data_req_ue(const module_id_t Mod_idP,
|
||||
const int CC_id,
|
||||
const uint8_t gNB_id,
|
||||
const frame_t frameP,
|
||||
const rb_id_t Srb_id,
|
||||
uint8_t *buffer_pP)
|
||||
void nr_mac_rrc_msg3_ind(const module_id_t mod_id, int rnti)
|
||||
{
|
||||
switch(Srb_id) {
|
||||
|
||||
case CCCH:
|
||||
LOG_D(NR_RRC,
|
||||
"nr_mac_rrc_data_req_ue: Payload size = %i\n",
|
||||
NR_UE_rrc_inst[Mod_idP].Srb[gNB_id][0].srb_buffers.Tx_buffer.payload_size);
|
||||
NR_UE_RRC_SRB_INFO_t *Srb0 = &NR_UE_rrc_inst[Mod_idP].Srb[gNB_id][0];
|
||||
memcpy(buffer_pP, (uint8_t *)Srb0->srb_buffers.Tx_buffer.Payload, Srb0->srb_buffers.Tx_buffer.payload_size);
|
||||
for (int i = 0; i < Srb0->srb_buffers.Tx_buffer.payload_size; i++) {
|
||||
LOG_D(NR_RRC,"(%i): %i\n", i, buffer_pP[i]);
|
||||
}
|
||||
|
||||
return Srb0->srb_buffers.Tx_buffer.payload_size;
|
||||
|
||||
case DCCH:
|
||||
AssertFatal(1==0, "SRB1 not implemented yet!\n");
|
||||
case DCCH1:
|
||||
AssertFatal(1==0, "SRB2 not implemented yet!\n");
|
||||
default:
|
||||
AssertFatal(1==0, "Invalid SRB id!\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
MessageDef *message_p = itti_alloc_new_message(TASK_MAC_UE, 0, NR_RRC_MAC_MSG3_IND);
|
||||
NR_RRC_MAC_MSG3_IND (message_p).rnti = rnti;
|
||||
itti_send_msg_to_task(TASK_RRC_NRUE, GNB_MODULE_ID_TO_INSTANCE(mod_id), message_p);
|
||||
}
|
||||
|
||||
void nr_mac_rrc_ra_ind(const module_id_t mod_id, int frame, bool success)
|
||||
|
||||
@@ -616,12 +616,12 @@ int nr_decode_SI(const module_id_t module_id, const uint8_t gNB_index, NR_System
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t nr_rrc_ue_generate_ra_msg(module_id_t module_id, uint8_t gNB_index) {
|
||||
|
||||
switch(NR_UE_rrc_inst[module_id].ra_trigger){
|
||||
void nr_rrc_ue_generate_ra_msg(module_id_t module_id, int rnti)
|
||||
{
|
||||
switch(NR_UE_rrc_inst[module_id].ra_trigger) {
|
||||
case INITIAL_ACCESS_FROM_RRC_IDLE:
|
||||
// After SIB1 is received, prepare RRCConnectionRequest
|
||||
nr_rrc_ue_generate_RRCSetupRequest(module_id,gNB_index);
|
||||
nr_rrc_ue_generate_RRCSetupRequest(module_id, rnti);
|
||||
break;
|
||||
case RRC_CONNECTION_REESTABLISHMENT:
|
||||
AssertFatal(1==0, "ra_trigger not implemented yet!\n");
|
||||
@@ -648,8 +648,27 @@ int8_t nr_rrc_ue_generate_ra_msg(module_id_t module_id, uint8_t gNB_index) {
|
||||
AssertFatal(1==0, "Invalid ra_trigger value!\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
void nr_rrc_ue_generate_RRCSetupRequest(module_id_t module_id, int rnti)
|
||||
{
|
||||
uint8_t rv[6];
|
||||
// Get RRCConnectionRequest, fill random for now
|
||||
// Generate random byte stream for contention resolution
|
||||
for (int i = 0; i < 6; i++) {
|
||||
#ifdef SMBV
|
||||
// if SMBV is configured the contention resolution needs to be fix for the connection procedure to succeed
|
||||
rv[i] = i;
|
||||
#else
|
||||
rv[i] = taus() & 0xff;
|
||||
#endif
|
||||
}
|
||||
|
||||
uint8_t buf[1024];
|
||||
int len = do_RRCSetupRequest(module_id, buf, sizeof(buf), rv);
|
||||
|
||||
/* convention: RNTI for SRB0 is zero, as it changes all the time */
|
||||
nr_rlc_srb_recv_sdu(rnti, 0, buf, len);
|
||||
}
|
||||
|
||||
void nr_rrc_configure_default_SI(NR_UE_RRC_SI_INFO *SI_info,
|
||||
@@ -732,7 +751,6 @@ static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(module_id_t module_id,
|
||||
// take ServingCellConfigCommon and configure L1/L2
|
||||
rrc->servingCellConfigCommonSIB = sib1->servingCellConfigCommon;
|
||||
nr_rrc_mac_config_req_sib1(module_id, 0, sib1->si_SchedulingInfo, sib1->servingCellConfigCommon);
|
||||
nr_rrc_ue_generate_ra_msg(module_id, gNB_index);
|
||||
break;
|
||||
case NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformation:
|
||||
LOG_I(NR_RRC, "[UE %"PRIu8"] Decoding SI\n", module_id);
|
||||
@@ -966,7 +984,7 @@ static void rrc_ue_generate_RRCSetupComplete(const protocol_ctxt_t *const ctxt_p
|
||||
nr_pdcp_data_req_srb(ctxt_pP->rntiMaybeUEid, srb_id, nr_rrc_mui++, size, buffer, deliver_pdu_srb_rlc, NULL);
|
||||
}
|
||||
|
||||
int8_t nr_rrc_ue_decode_ccch(const protocol_ctxt_t *const ctxt_pP, const NR_UE_RRC_SRB_INFO_t *Srb_info, const uint8_t gNB_index)
|
||||
static int8_t nr_rrc_ue_decode_ccch(const protocol_ctxt_t *const ctxt_pP, const uint8_t *buf, int len, const uint8_t gNB_index)
|
||||
{
|
||||
NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[ctxt_pP->module_id];
|
||||
NR_DL_CCCH_Message_t *dl_ccch_msg=NULL;
|
||||
@@ -976,21 +994,15 @@ int8_t nr_rrc_ue_decode_ccch(const protocol_ctxt_t *const ctxt_pP, const NR_UE_R
|
||||
LOG_D(RRC,
|
||||
"[NR UE%d] Decoding DL-CCCH message (%d bytes), State %d\n",
|
||||
ctxt_pP->module_id,
|
||||
Srb_info->srb_buffers.Rx_buffer.payload_size,
|
||||
len,
|
||||
rrc->nrRrcState);
|
||||
dec_rval = uper_decode(NULL,
|
||||
&asn_DEF_NR_DL_CCCH_Message,
|
||||
(void **)&dl_ccch_msg,
|
||||
(uint8_t *)Srb_info->srb_buffers.Rx_buffer.Payload,
|
||||
Srb_info->srb_buffers.Rx_buffer.payload_size,
|
||||
0,
|
||||
0);
|
||||
|
||||
// if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)dl_ccch_msg);
|
||||
// }
|
||||
dec_rval = uper_decode(NULL, &asn_DEF_NR_DL_CCCH_Message, (void **)&dl_ccch_msg, buf, len, 0, 0);
|
||||
|
||||
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
|
||||
if (LOG_DEBUGFLAG(DEBUG_ASN1))
|
||||
xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)dl_ccch_msg);
|
||||
|
||||
if (dec_rval.code != RC_OK && dec_rval.consumed == 0) {
|
||||
LOG_E(RRC,
|
||||
"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%zu bytes)\n",
|
||||
ctxt_pP->module_id,
|
||||
@@ -1292,41 +1304,6 @@ void nr_rrc_ue_process_securityModeCommand(const protocol_ctxt_t *const ctxt_pP,
|
||||
securityModeCommand->criticalExtensions.present);
|
||||
}
|
||||
|
||||
void nr_rrc_ue_generate_RRCSetupRequest(module_id_t module_id, const uint8_t gNB_index)
|
||||
{
|
||||
uint8_t rv[6];
|
||||
NR_UE_RRC_SRB_INFO_t *Srb0 = &NR_UE_rrc_inst[module_id].Srb[gNB_index][0];
|
||||
if (Srb0->srb_buffers.Tx_buffer.payload_size == 0) {
|
||||
// Get RRCConnectionRequest, fill random for now
|
||||
// Generate random byte stream for contention resolution
|
||||
for (int i = 0; i < 6; i++) {
|
||||
#ifdef SMBV
|
||||
// if SMBV is configured the contention resolution needs to be fix for the connection procedure to succeed
|
||||
rv[i] = i;
|
||||
#else
|
||||
rv[i] = taus() & 0xff;
|
||||
#endif
|
||||
LOG_T(NR_RRC, "%x.", rv[i]);
|
||||
}
|
||||
|
||||
LOG_T(NR_RRC, "\n");
|
||||
Srb0->srb_buffers.Tx_buffer.payload_size = do_RRCSetupRequest(module_id,
|
||||
(uint8_t *)Srb0->srb_buffers.Tx_buffer.Payload,
|
||||
sizeof(Srb0->srb_buffers.Tx_buffer.Payload),
|
||||
rv);
|
||||
LOG_I(NR_RRC,
|
||||
"[UE %d] : Logical Channel UL-CCCH (SRB0), Generating RRCSetupRequest (bytes %d, gNB %d)\n",
|
||||
module_id,
|
||||
Srb0->srb_buffers.Tx_buffer.payload_size,
|
||||
gNB_index);
|
||||
|
||||
for (int i = 0; i < Srb0->srb_buffers.Tx_buffer.payload_size; i++)
|
||||
LOG_T(NR_RRC, "%x.", Srb0->srb_buffers.Tx_buffer.Payload[i]);
|
||||
|
||||
LOG_T(NR_RRC, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void
|
||||
nr_rrc_ue_process_measConfig(
|
||||
@@ -1799,8 +1776,17 @@ void *rrc_nrue_task(void *args_p)
|
||||
nr_rrc_SI_timers(SInfo);
|
||||
break;
|
||||
|
||||
case NR_RRC_MAC_MSG3_IND:
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_NO, NR_RRC_MAC_MSG3_IND (msg_p).rnti, 0, 0);
|
||||
LOG_D(NR_RRC, "[UE %d] Received %s for RNTI %d\n",
|
||||
ue_mod_id,
|
||||
ITTI_MSG_NAME (msg_p),
|
||||
NR_RRC_MAC_MSG3_IND (msg_p).rnti);
|
||||
nr_rrc_ue_generate_ra_msg(ue_mod_id, NR_RRC_MAC_MSG3_IND (msg_p).rnti);
|
||||
break;
|
||||
|
||||
case NR_RRC_MAC_RA_IND:
|
||||
LOG_D(NR_RRC, "[UE %d] Received %s: frame %d\n RA %s",
|
||||
LOG_D(NR_RRC, "[UE %d] Received %s: frame %d RA %s\n",
|
||||
ue_mod_id,
|
||||
ITTI_MSG_NAME (msg_p),
|
||||
NR_RRC_MAC_RA_IND (msg_p).frame,
|
||||
@@ -1828,18 +1814,11 @@ void *rrc_nrue_task(void *args_p)
|
||||
break;
|
||||
|
||||
case NR_RRC_MAC_CCCH_DATA_IND:
|
||||
LOG_D(NR_RRC, "[UE %d] RNTI %x Received %s: frameP %d, gNB %d\n",
|
||||
ue_mod_id,
|
||||
NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti,
|
||||
ITTI_MSG_NAME (msg_p),
|
||||
NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame,
|
||||
NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
||||
NR_UE_RRC_SRB_INFO_t *srb0 = &NR_UE_rrc_inst[ue_mod_id].Srb[NR_RRC_MAC_CCCH_DATA_IND(msg_p).gnb_index][0];
|
||||
memcpy(srb0->srb_buffers.Rx_buffer.Payload, NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu, NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size);
|
||||
srb0->srb_buffers.Rx_buffer.payload_size = NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size;
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti, NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0);
|
||||
// PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti, NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0, NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
||||
nr_rrc_ue_decode_ccch(&ctxt, srb0, NR_RRC_MAC_CCCH_DATA_IND(msg_p).gnb_index);
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti, 0, 0);
|
||||
nr_rrc_ue_decode_ccch(&ctxt,
|
||||
NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu,
|
||||
NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size,
|
||||
/* gNB_index = */ 0);
|
||||
break;
|
||||
|
||||
/* PDCP messages */
|
||||
|
||||
@@ -182,7 +182,6 @@ typedef enum { RB_NOT_PRESENT, RB_ESTABLISHED, RB_SUSPENDED } NR_RB_status_t;
|
||||
|
||||
typedef struct NR_UE_RRC_SRB_INFO_s {
|
||||
NR_RB_status_t status;
|
||||
NR_SRB_INFO srb_buffers;
|
||||
} NR_UE_RRC_SRB_INFO_t;
|
||||
|
||||
typedef struct NR_UE_RRC_INST_s {
|
||||
|
||||
@@ -107,20 +107,7 @@ void nr_mac_rrc_sync_ind(const module_id_t module_id,
|
||||
const frame_t frame,
|
||||
const bool in_sync);
|
||||
void nr_mac_rrc_ra_ind(const module_id_t mod_id, int frame, bool success);
|
||||
|
||||
/**\brief
|
||||
\param module_id module id
|
||||
\param CC_id component carrier id
|
||||
\param gNB_index gNB index
|
||||
\param frame_t frameP
|
||||
\param rb_id_t SRB id
|
||||
\param buffer_pP pointer to buffer*/
|
||||
int8_t nr_mac_rrc_data_req_ue(const module_id_t Mod_idP,
|
||||
const int CC_id,
|
||||
const uint8_t gNB_id,
|
||||
const frame_t frameP,
|
||||
const rb_id_t Srb_id,
|
||||
uint8_t *buffer_pP);
|
||||
void nr_mac_rrc_msg3_ind(const module_id_t mod_id, int rnti);
|
||||
|
||||
int8_t nr_rrc_RA_succeeded(const module_id_t mod_id, const uint8_t gNB_index);
|
||||
|
||||
@@ -140,10 +127,8 @@ void nsa_sendmsg_to_lte_ue(const void *message, size_t msg_len, Rrc_Msg_Type_t m
|
||||
|
||||
void start_oai_nrue_threads(void);
|
||||
|
||||
/**\brief RRC UE generate RRCSetupRequest message.
|
||||
\param module_id module id
|
||||
\param gNB_index gNB index */
|
||||
void nr_rrc_ue_generate_RRCSetupRequest(module_id_t module_id, const uint8_t gNB_index);
|
||||
/**\brief RRC UE generate RRCSetupRequest message. */
|
||||
void nr_rrc_ue_generate_RRCSetupRequest(module_id_t module_id, int rnti);
|
||||
|
||||
void process_lte_nsa_msg(nsa_msg_t *msg, int msg_len);
|
||||
|
||||
|
||||
@@ -233,7 +233,7 @@ static int allocCirBuf(rfsimulator_state_t *bridge, int sock)
|
||||
}
|
||||
char *modelname = (bridge->role == SIMU_ROLE_SERVER) ? "rfsimu_channel_ue0" : "rfsimu_channel_enB0";
|
||||
ptr->channel_model = find_channel_desc_fromname(modelname); // path_loss in dB
|
||||
if (ptr->channel_model != NULL) {
|
||||
if (!ptr->channel_model) {
|
||||
LOG_E(HW, "Channel model %s not found, check config file\n", modelname);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1,729 +0,0 @@
|
||||
#/*
|
||||
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
# * contributor license agreements. See the NOTICE file distributed with
|
||||
# * this work for additional information regarding copyright ownership.
|
||||
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
# * except in compliance with the License.
|
||||
# * You may obtain a copy of the License at
|
||||
# *
|
||||
# * http://www.openairinterface.org/?page_id=698
|
||||
# *
|
||||
# * Unless required by applicable law or agreed to in writing, software
|
||||
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# * See the License for the specific language governing permissions and
|
||||
# * limitations under the License.
|
||||
# *-------------------------------------------------------------------------------
|
||||
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
# * contact@openairinterface.org
|
||||
# */
|
||||
################################################################################
|
||||
# file build_oai.bash
|
||||
# brief apply a traffic generator, send traffic and measure the performance of OAI
|
||||
# OTG is mainly used for OASIM and D-ITG (or iperf) for LTE-SOFTMODEM
|
||||
# author Navid Nikaein
|
||||
# company Eurecom
|
||||
# email: navid.nikaein@eurecom.fr
|
||||
# date 2015
|
||||
|
||||
#!/bin/bash
|
||||
################################
|
||||
# include helper functions
|
||||
################################
|
||||
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
|
||||
. $THIS_SCRIPT_PATH/build_helper.bash
|
||||
|
||||
check_for_root_rights
|
||||
|
||||
|
||||
#######################################
|
||||
# Default PARAMETERS
|
||||
######################################
|
||||
#general
|
||||
|
||||
declare PERF_APP="PING" # ITG, ITG_DECODE, PING, OTG,
|
||||
declare TEST_MODE=0
|
||||
declare KEEP_LOG_FILESNUM_PKTS=0
|
||||
declare OWD="rttm"
|
||||
declare DURATION=60000 # ms
|
||||
declare NUM_PKTS=10000
|
||||
declare KBYTES=1000 # KBYTES
|
||||
declare START=0
|
||||
declare DST="127.0.0.1"
|
||||
declare DPORT="8999"
|
||||
declare TP="UDP"
|
||||
declare IDT_DIST="CONSTANT"
|
||||
declare PS_DIST="CONSTANT"
|
||||
|
||||
#IDT
|
||||
declare RATE=1000 # pkt / s
|
||||
declare MIN_RATE=100
|
||||
declare MAX_RATE=1000
|
||||
|
||||
|
||||
############## script params #####################
|
||||
|
||||
until [ -z "$1" ]
|
||||
do
|
||||
case "$1" in
|
||||
-c | --test)
|
||||
TEST_MODE=1;
|
||||
echo_info "enabling the test mode"
|
||||
shift;
|
||||
;;
|
||||
-l | --perf-app)
|
||||
PERF_APP=$2
|
||||
echo_info "Setting the performance evaluation APP to $PERF_APP"
|
||||
if [ $PERF_APP = "DITG" ]; then
|
||||
echo_info "you need to run "
|
||||
fi
|
||||
shift 2;
|
||||
;;
|
||||
-m | --owd)
|
||||
OWD="owdm"
|
||||
echo_info "setting D-ITG one-way-delay meter"
|
||||
shift;
|
||||
;;
|
||||
-e | --duration)
|
||||
DURATION=$2
|
||||
echo_info "Setting the traffic duration to $DURATION"
|
||||
shift 2;
|
||||
;;
|
||||
-n | --num-pkts)
|
||||
NUM_PKTS=$2
|
||||
echo_info "Setting number of packets to $NUM_PKTS"
|
||||
shift 2;
|
||||
;;
|
||||
-k | --keep-log-file)
|
||||
KEEP_LOG_FILESNUM_PKTS=1
|
||||
echo_info "Keep the log files"
|
||||
shift;
|
||||
;;
|
||||
-i | --idt-dist)
|
||||
IDT_DIST=$2
|
||||
echo_info "setting IDT distribution to $IDT_DIST"
|
||||
shift 2;
|
||||
;;
|
||||
-s | --ps-dist)
|
||||
PS_DIST=$2
|
||||
echo_info "setting PS distribution to $PS_DIST"
|
||||
shift 2;
|
||||
;;
|
||||
-d | --dst)
|
||||
DST=$2
|
||||
echo_info "setting the destination address to $DST"
|
||||
shift 2;
|
||||
;;
|
||||
-p | --dst-port)
|
||||
DPORT=$2
|
||||
echo_info "setting the destination port to $DPORT"
|
||||
shift 2;
|
||||
;;
|
||||
-h | --help)
|
||||
print_help_perf
|
||||
exit -1
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option $1"
|
||||
break ;
|
||||
# unknown option
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
#####################
|
||||
# create a bin dir
|
||||
#####################
|
||||
echo_info "1. Creating the results dir ..."
|
||||
#rm -rf results
|
||||
mkdir -m 777 -p results
|
||||
|
||||
exp_date=`date +%Y_%m_%d`
|
||||
exp_time=`date +%H_%M_%S`
|
||||
oai_exp_date="exp_date_${exp_date}"
|
||||
touch results/${oai_exp_date}
|
||||
|
||||
touch results/perf_log.txt
|
||||
chmod -f 777 results/perf_log.txt
|
||||
|
||||
echo "start experiment at date $exp_date time $exp_time " >> results/${oai_exp_date}
|
||||
|
||||
############################################
|
||||
# setting and printing OAI envs, we should check here
|
||||
############################################
|
||||
|
||||
echo_info "2. Setting the OAI PATHS ..."
|
||||
|
||||
set_openair_env
|
||||
cecho "OPENAIR_HOME = $OPENAIR_HOME" $green
|
||||
cecho "OPENAIR1_DIR = $OPENAIR1_DIR" $green
|
||||
cecho "OPENAIR2_DIR = $OPENAIR2_DIR" $green
|
||||
cecho "OPENAIR3_DIR = $OPENAIR3_DIR" $green
|
||||
cecho "OPENAIR3_DIR = $OPENAIR3_DIR" $green
|
||||
cecho "OPENAIR_TARGETS = $OPENAIR_TARGETS" $green
|
||||
|
||||
|
||||
echo "OPENAIR_HOME = $OPENAIR_HOME" >> results/${oai_exp_date}
|
||||
echo "OPENAIR1_DIR = $OPENAIR1_DIR" >> results/${oai_exp_date}
|
||||
echo "OPENAIR2_DIR = $OPENAIR2_DIR" >> results/${oai_exp_date}
|
||||
echo "OPENAIR3_DIR = $OPENAIR3_DIR" >> results/${oai_exp_date}
|
||||
echo "OPENAIR3_DIR = $OPENAIR3_DIR" >> results/${oai_exp_date}
|
||||
echo "OPENAIR_TARGETS = $OPENAIR_TARGETS" >> results/${oai_exp_date}
|
||||
|
||||
################################
|
||||
# run ITGSEND
|
||||
################################
|
||||
|
||||
itg_send(){
|
||||
|
||||
test_install_package d-itg
|
||||
|
||||
LOG_FILE="itg_log_template.txt"
|
||||
touch results/${LOG_FILE}
|
||||
|
||||
if [ $TEST_MODE = 0 ] ; then
|
||||
declare -a PS=(32 64 128 256 512 1024 1408)
|
||||
declare -a IDT=(1 5 10 50 100 1000)
|
||||
else
|
||||
declare -a PS=(32 64)
|
||||
declare -a IDT=(1)
|
||||
fi
|
||||
|
||||
declare PS_LEN=${#PS[@]}
|
||||
declare IDT_LEN=${#IDT[@]}
|
||||
#echo_info "PS_LEN is $PS_LEN, IDT_LEN is $IDT_LEN"
|
||||
|
||||
declare i=0
|
||||
declare j=0
|
||||
declare e=0
|
||||
# send traffic
|
||||
for idt in ${IDT[@]}; do
|
||||
# echo_info "IDT is set to $idt i is $i"
|
||||
if [ $i -lt $IDT_LEN ]; then
|
||||
let i++;
|
||||
fi
|
||||
|
||||
if [ $IDT_DIST = "CONSTANT" ]; then
|
||||
IDT_OPT="-C $idt "
|
||||
fi
|
||||
if [ $IDT_DIST = "UNIFORM" ]; then
|
||||
IDT_OPT="-U $idt ${IDT[i]} "
|
||||
fi
|
||||
if [ $IDT_DIST = "EXPONENTIAL" ]; then
|
||||
IDT_OPT="-E $idt "
|
||||
fi
|
||||
|
||||
for ps in ${PS[@]}; do
|
||||
# echo_info "PS is $ps j is $j"
|
||||
if [ $j -lt $PS_LEN ]; then
|
||||
let j++;
|
||||
fi
|
||||
if [ $PS_DIST = "CONSTANT" ]; then
|
||||
PS_OPT="-c $ps "
|
||||
fi
|
||||
if [ $PS_DIST = "UNIFORM" ]; then
|
||||
PS_OPT="-u $ps ${PS[j]} "
|
||||
fi
|
||||
if [ $PS_DIST = "EXPONENTIAL" ]; then
|
||||
PS_OPT="-e $ps "
|
||||
fi
|
||||
start=$(date +%s)
|
||||
RECV_FILE="recv_log_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}"
|
||||
echo_info "Start test_$i.$j:: ITGSend -a $DST $IDT_OPT $PS_OPT -m $OWD -d $START -T $TP -t $DURATION -x $RECV_FILE -l "
|
||||
echo "Start test_$i.$j:: ITGSend -a $DST $IDT_OPT $PS_OPT -m $OWD -d $START -T $TP -t $DURATION -x $RECV_FILE -l " >> results/${oai_exp_date}
|
||||
#sleep 1
|
||||
ITGSend -a $DST $IDT_OPT $PS_OPT -m $OWD -d $START -T $TP -t $DURATION -x $RECV_FILE -l
|
||||
itg_status=$?
|
||||
end=$(date +%s)
|
||||
diff=$(( $end - $start ))
|
||||
|
||||
if [ $itg_status = 0 ] ; then
|
||||
echo_success "[$end] test_$i.$j passed"
|
||||
echo "[$end] test_$i.$j passed" >> ./results/$LOG_FILE
|
||||
STATUS="PASSED"
|
||||
else
|
||||
let e++;
|
||||
echo_error "[$end] test_$i.$j failed :: D-ITG return exit code $itg_status"
|
||||
echo "[$end]test_$i.$j failed :: ITG return exit code $itg_status" >> ./results/$LOG_FILE
|
||||
STATUS="FAILED"
|
||||
fi
|
||||
|
||||
echo_info "End test_$i.$j:: runtime: $diff"
|
||||
echo "End test_$i.$j:: runtime: $diff" >> results/${oai_exp_date}
|
||||
|
||||
done
|
||||
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
itg_decode(){
|
||||
|
||||
declare i=0
|
||||
declare j=0
|
||||
if [ $TEST_MODE = 0 ] ; then
|
||||
declare -a PS=(32 64 128 256 512 1024 1408)
|
||||
declare -a IDT=(1 5 10 50 100 1000)
|
||||
else
|
||||
declare -a PS=(32 64)
|
||||
declare -a IDT=(1)
|
||||
fi
|
||||
|
||||
for idt in ${IDT[@]}; do
|
||||
|
||||
for ps in ${PS[@]}; do
|
||||
RECV_FILE="recv_log_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}"
|
||||
OUTPUT_FILE="results_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}.txt"
|
||||
OCTAVE_FILE="results_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}.."
|
||||
|
||||
echo_info "decode test_$i.$j: ITGDec $RECV_FILE -v -t -l $OUTPUT_FILE -o $OCTAVE_FILE"
|
||||
ITGDec $RECV_FILE -v -t -l $OUTPUT_FILE
|
||||
|
||||
done
|
||||
|
||||
done
|
||||
|
||||
|
||||
}
|
||||
|
||||
ping_stats(){
|
||||
|
||||
status="failed"
|
||||
failedhosts=""
|
||||
|
||||
# add ip / hostname separated by white space
|
||||
|
||||
if [ $TEST_MODE = 0 ]; then
|
||||
declare COUNT=100
|
||||
declare -a HOSTS=($DST)
|
||||
declare -a PS=(64 768 2048 4096 8192)
|
||||
declare -a IDT=(1 .8 .4 .2)
|
||||
else
|
||||
declare COUNT=10
|
||||
declare -a HOSTS=(localhost)
|
||||
declare -a PS=(64 2048)
|
||||
declare -a IDT=(.5)
|
||||
fi
|
||||
|
||||
|
||||
declare i=0
|
||||
declare j=0
|
||||
declare k=0
|
||||
|
||||
start_exp=$(date +%s)
|
||||
|
||||
for host in ${HOSTS[@]}; do
|
||||
let i++;
|
||||
let j=0;
|
||||
OUTPUT_FILE="rtt_host${host}.csv"
|
||||
touch results/${OUTPUT_FILE}
|
||||
for idt in ${IDT[@]}; do
|
||||
let j++;
|
||||
let k=0;
|
||||
for ps in ${PS[@]}; do
|
||||
let k++;
|
||||
# | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
|
||||
start=$(date +%s)
|
||||
LOG_FILE="recv_log_host${host}_idt${idt}_ps${ps}.txt"
|
||||
touch results/${LOG_FILE}
|
||||
echo_info "Start test_$i.$j.$k:: ping -c $COUNT -q -U $host -s $ps -i $idt"
|
||||
echo "Start test_$i.$j.$k:: ping -c $COUNT -q -U $host -s $ps -i $idt" >> results/${oai_exp_date}
|
||||
$(ping -c $COUNT -q -U $host -s $ps -i $idt 1>&2 >> ./results/$LOG_FILE )
|
||||
end=$(date +%s)
|
||||
diff=$(( $end - $start ))
|
||||
|
||||
count=$(cat ./results/$LOG_FILE | awk -F, '/received/{print $2*1}')
|
||||
latency=$(cat ./results/$LOG_FILE | tail -1 |cut -f2- -d=)
|
||||
|
||||
MIN=$(cut -f1 -d/ <<< $latency)
|
||||
AVG=$(cut -f2 -d/ <<< $latency)
|
||||
MAX=$(cut -f3 -d/ <<< $latency)
|
||||
MDEV=$(cut -f4 -d/ <<< $latency | cut -f1 -d" ")
|
||||
UNIT=$(cut -f2 -d" " <<< $latency)
|
||||
|
||||
echo_success "Latency:: count $count min $MIN avg $AVG max $MAX mdev $MDEV ($UNIT)"
|
||||
echo "$idt;$ps;$COUNT;$count;$MIN;$AVG;$MAX;$MDEV;" >> ./results/$OUTPUT_FILE
|
||||
if [ $count -eq 0 ]; then
|
||||
failedhosts="$failedhosts $host"
|
||||
status="failed"
|
||||
else
|
||||
status="passed"
|
||||
fi
|
||||
echo_info "End test_$i.$j.$k:: runtime: $diff :: status $status "
|
||||
echo "End test_$i.$j.$k:: runtime: $diff :; status $status" >> results/${oai_exp_date}
|
||||
|
||||
done
|
||||
done
|
||||
done
|
||||
end_exp=$(date +%s)
|
||||
diff_exp=$(( $end_exp - $start_exp ))
|
||||
|
||||
let total_tests=i*j*k;
|
||||
echo_info "total tests: $total_tests for a duration $diff_exp (s)"
|
||||
|
||||
}
|
||||
|
||||
oaisim_otg_stats(){
|
||||
|
||||
# install the required packages
|
||||
|
||||
test_install_package octave >> results/perf_log.txt 2>&1
|
||||
|
||||
# set paths to the required binaries and check if the required binaries are available
|
||||
OAISIM="bin/oaisim"
|
||||
OTGPLOT="$OPENAIR2_DIR/UTIL/OTG/OTGplot"
|
||||
PS2PDF="ps2pdf"
|
||||
|
||||
if [ ! -f $OAISIM ]; then
|
||||
echo_info "3.1 compiling OAISIM ($OPENAIR_TARGETS/build_oai.bash -t OAISIM -b -D -c)"
|
||||
($OPENAIR_TARGETS/build_oai.bash -t OAISIM -b -D -c >> results/perf_log.txt 2>&1 )
|
||||
build_stats=$?
|
||||
if [ $build_stats != 0 ] ; then
|
||||
echo_error "$OAISIM cannot be built, check results/perf_log.txt file"
|
||||
exit $?
|
||||
fi
|
||||
else
|
||||
echo_info "ensure that OAISIM is not built with the S1 interface"
|
||||
fi
|
||||
|
||||
(install_nasmesh >> results/perf_log.txt 2>&1 )
|
||||
|
||||
if [ ! -f $OTGPLOT ]; then
|
||||
echo_error "$OTGPLOT not found"
|
||||
exit $?
|
||||
fi
|
||||
|
||||
# Set the default Parameters
|
||||
ABSTRACTION=1
|
||||
#FRAME_TYPE=0 # FDD=0, TDD =1, 2,3,4,5,6
|
||||
AGGR_RESULT=1
|
||||
STATUS="PASSED"
|
||||
EXTRA_STATS=0
|
||||
declare NUM_UES=7
|
||||
|
||||
if [ $TEST_MODE = 0 ]; then
|
||||
declare -a TEMPLATES=(120 121 122 123 124 125 126 127 128 129 130)
|
||||
declare -a FRAME_TYPE=(0 3)
|
||||
declare -a METRICS=(latency jitter goodput)
|
||||
declare -a RB=(25 50 100)
|
||||
else
|
||||
declare -a TEMPLATES=(125)
|
||||
declare -a FRAME_TYPE=(3)
|
||||
declare -a METRICS=(latency)
|
||||
declare -a RB=(25)
|
||||
fi
|
||||
|
||||
if [ $ABSTRACTION = 1 ]; then
|
||||
OPT="-a "
|
||||
fi
|
||||
|
||||
declare num_cols=0
|
||||
let num_cols=NUM_UES+1
|
||||
if [ $AGGR_RESULT = 1 ]; then
|
||||
COLUMN="[$num_cols:$num_cols]"
|
||||
else
|
||||
COLUMN="[1:$num_cols]"
|
||||
fi
|
||||
|
||||
declare i=0
|
||||
declare j=0
|
||||
declare k=0
|
||||
declare e=0
|
||||
|
||||
start_exp=$(date +%s)
|
||||
|
||||
for template in ${TEMPLATES[@]}; do
|
||||
let i++;
|
||||
let j=0;
|
||||
for frame in ${FRAME_TYPE[@]}; do
|
||||
let j++;
|
||||
let k=0;
|
||||
|
||||
if [ $frame = 0 ]; then
|
||||
OPT="$OPT -F "
|
||||
else
|
||||
OPT="$OPT -C $frame "
|
||||
fi
|
||||
|
||||
for rb in ${RB[@]}; do
|
||||
let k++;
|
||||
start=$(date +%s)
|
||||
LOG_FILE="oaisim_log_template${template}_frame${frame}_rb${rb}.txt"
|
||||
touch results/${LOG_FILE}
|
||||
echo_info "[$start] Start test_$i.$j.$k:: $OAISIM $OPT -R $RB -c $template"
|
||||
echo "Start test_$i.$j.$k:: $OAISIM $OPT -R $RB -c $template" >> results/${oai_exp_date}
|
||||
#sleep 1
|
||||
$OAISIM $OPT -R $RB -c $template 1>&2 >> ./results/$LOG_FILE
|
||||
# store exit status
|
||||
oai_status=$?
|
||||
end=$(date +%s)
|
||||
diff=$(( $end - $start ))
|
||||
|
||||
#check the oaisim exit status
|
||||
if [ $oai_status = 0 ] ; then
|
||||
echo_success "[$end] test_$i.$j.$k passed"
|
||||
echo "[$end] test_$i.$j.$k passed" >> ./results/$LOG_FILE
|
||||
STATUS="PASSED"
|
||||
else
|
||||
let e++;
|
||||
echo_error "[$end] test_$i.$j.$k failed :: OAISIM return exit code $oai_status (remove bin/oaisim)"
|
||||
echo "[$end]test_$i.$j.$k failed :: OAISIM return exit code $oai_status" >> ./results/$LOG_FILE
|
||||
STATUS="FAILED"
|
||||
fi
|
||||
|
||||
# create the curves
|
||||
for metric in ${METRICS[@]}; do
|
||||
if [ $metric = "goodput" ]; then
|
||||
unit="(kB/s)"
|
||||
else
|
||||
unit="(ms)"
|
||||
fi
|
||||
if [ -f /tmp/otg_${metric}.dat ]; then
|
||||
export TITLE="Application $metric $unit"
|
||||
cp /tmp/otg_${metric}.dat ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat
|
||||
echo_info "$OTGPLOT ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat $COLUMN"
|
||||
echo "$OTGPLOT ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat $COLUMN" >> results/${oai_exp_date}
|
||||
$($OTGPLOT ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat $COLUMN 1>&2 >> ./results/$LOG_FILE )
|
||||
$($PS2PDF -dOptimize=true -dEmbedAllFonts=true ./otg-${metric}-template${template}-frame${frame}-rb${rb}.eps )
|
||||
# remove the first line of the file
|
||||
echo "$(tail -n+2 ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat)" > ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat
|
||||
else
|
||||
echo_error "file /tmp/otg_${metric}.dat does not exists"
|
||||
fi
|
||||
done
|
||||
if [ $KEEP_LOG_FILESNUM_PKTS = 0 ]; then
|
||||
rm -f ./results/$LOG_FILE
|
||||
fi
|
||||
mv *.eps ./results/
|
||||
mv *.pdf ./results/
|
||||
mv /tmp/otg.log ./results/otg-template${template}-frame${frame}-rb${rb}.log
|
||||
echo_info "End test_$i.$j.$k:: runtime: $diff :: status $STATUS"
|
||||
echo "End test_$i.$j.$k:: runtime: $diff :: status $STATUS" >> results/${oai_exp_date}
|
||||
|
||||
|
||||
done
|
||||
done
|
||||
done
|
||||
|
||||
end_exp=$(date +%s)
|
||||
diff_exp=$(( $end_exp - $start_exp ))
|
||||
|
||||
let total_tests=i*j*k;
|
||||
echo_info "total tests: $total_tests for a duration $diff_exp (s) error ($e)"
|
||||
echo "total tests: $total_tests for a duration $diff_exp (s) error ($e)" >> results/${oai_exp_date}
|
||||
|
||||
}
|
||||
|
||||
|
||||
cba_otg_stats(){
|
||||
|
||||
test_install_package octave
|
||||
|
||||
ABSTRACTION=1
|
||||
FRAME_TYPE=0 # FDD=0, TDD =1
|
||||
AGGR_RESULT=1
|
||||
#OAISIM="$OPENAIR_TARGETS/bin/oaisim"
|
||||
OAISIM="bin/oaisim.cba" # to compile: make cleanall; make Rel10=1 CBA=1 in targets/SIMU/USER
|
||||
OTGPLOT="$OPENAIR2_DIR/UTIL/OTG/OTGplot"
|
||||
PS2PDF="ps2pdf"
|
||||
STATUS="PASSED"
|
||||
EXTRA_STATS=0
|
||||
declare NUM_UES=7
|
||||
|
||||
if [ $TEST_MODE = 0 ]; then
|
||||
declare -a TEMPLATES=(120 121 122 123 124 125 126 127 128 129 130)
|
||||
declare -a CBA=(0 1 2 3 4)
|
||||
declare -a BACKOFF=(0 15 30 60 120)
|
||||
declare -a METRICS=(latency jitter goodput)
|
||||
declare -a RB=(25)
|
||||
else
|
||||
declare -a TEMPLATES=(125)
|
||||
declare -a CBA=(1)
|
||||
declare -a BACKOFF=(0 15 30 60 120)
|
||||
declare -a METRICS=(latency)
|
||||
declare -a RB=(25)
|
||||
fi
|
||||
|
||||
if [ ! -f $OAISIM ]; then
|
||||
echo_error "$OAISIM not found"
|
||||
exit $?
|
||||
fi
|
||||
if [ ! -f $OTGPLOT ]; then
|
||||
echo_error "$OTGPLOT not found"
|
||||
exit $?
|
||||
fi
|
||||
|
||||
if [ $ABSTRACTION = 1 ]; then
|
||||
OPT="-a "
|
||||
fi
|
||||
if [ $FRAME_TYPE = 0 ]; then
|
||||
OPT="$OPT -F "
|
||||
fi
|
||||
|
||||
declare num_cols=0
|
||||
let num_cols=NUM_UES+1
|
||||
if [ $AGGR_RESULT = 1 ]; then
|
||||
COLUMN="[$num_cols:$num_cols]"
|
||||
else
|
||||
COLUMN="[1:$num_cols]"
|
||||
fi
|
||||
|
||||
declare collision=0
|
||||
declare enb_cba_access=0
|
||||
declare ue_cba_access=0
|
||||
declare missed=0
|
||||
declare unused=0
|
||||
|
||||
declare i=0
|
||||
declare j=0
|
||||
declare k=0
|
||||
declare e=0
|
||||
|
||||
start_exp=$(date +%s)
|
||||
|
||||
STATS1="cba_stats1.txt"
|
||||
touch results/${STATS1}
|
||||
|
||||
for template in ${TEMPLATES[@]}; do
|
||||
let i++;
|
||||
let j=0;
|
||||
for group in ${CBA[@]}; do
|
||||
let j++;
|
||||
let k=0;
|
||||
for backoff in ${BACKOFF[@]}; do
|
||||
let k++;
|
||||
start=$(date +%s)
|
||||
LOG_FILE="oaisim_log_template${template}_group${group}_backoff${backoff}.txt"
|
||||
touch results/${LOG_FILE}
|
||||
echo_info "[$start] Start test_$i.$j.$k:: $OAISIM $OPT -w $group -R $RB --cba-backoff $backoff -c $template"
|
||||
echo "Start test_$i.$j.$k:: $OAISIM $OPT -w $group -R $RB --cba-backoff $backoff -c $template" >> results/${oai_exp_date}
|
||||
#sleep 1
|
||||
$OAISIM $OPT -w $group -R $RB --cba-backoff $backoff -c $template 1>&2 >> ./results/$LOG_FILE
|
||||
# store exit status
|
||||
oai_status=$?
|
||||
end=$(date +%s)
|
||||
diff=$(( $end - $start ))
|
||||
|
||||
#check the oaisim exit status
|
||||
if [ $oai_status = 0 ] ; then
|
||||
echo_success "[$end] test_$i.$j.$k passed"
|
||||
echo "[$end] test_$i.$j.$k passed" >> ./results/$LOG_FILE
|
||||
STATUS="PASSED"
|
||||
else
|
||||
let e++;
|
||||
echo_error "[$end] test_$i.$j.$k failed :: OAISIM return exit code $oai_status"
|
||||
echo "[$end]test_$i.$j.$k failed :: OAISIM return exit code $oai_status" >> ./results/$LOG_FILE
|
||||
STATUS="FAILED"
|
||||
fi
|
||||
|
||||
if [ $group -gt 0 ]; then
|
||||
|
||||
let ue_cba_access=$(cat ./results/$LOG_FILE | grep -c "CBA transmission oppurtunity" )
|
||||
let enb_cba_access=$(cat ./results/$LOG_FILE | grep -c "schedule CBA access" )
|
||||
let missed=$(cat ./results/$LOG_FILE | grep -c "wait for backoff to expire" )
|
||||
let unused=enb_cba_access-ue_cba_access;
|
||||
let collision=$(cat ./results/$LOG_FILE | grep -c "first CBA collision detected" )
|
||||
|
||||
#frame, subframe, ue, group
|
||||
#collision_stats=$(cat ./results/$LOG_FILE | grep "collision" | cut -d " " -f3,5,12,15 )
|
||||
if [ $EXTRA_STATS = 1 ]; then
|
||||
STATS2="cba_template_${template}_stats2.txt"
|
||||
touch results/${STATS2}
|
||||
while read -r line
|
||||
do
|
||||
SFN=$(cut -f1 -d " " <<< $line)
|
||||
SSFN=$(cut -f2 -d " " <<< $line)
|
||||
UEID=$(cut -f3 -d " " <<< $line)
|
||||
GPID=$(cut -f4 -d " " <<< $line)
|
||||
#echo_success "$SFN;$SSFN;$UEID;$GPID;"
|
||||
echo "$SFN;$SSFN;$UEID;$GPID;" >> ./results/$STATS2
|
||||
done < <(cat ./results/$LOG_FILE | grep "CBA collision set SR for UE" | cut -d " " -f3,5,13,16 )
|
||||
fi
|
||||
|
||||
echo_success "CBA stats:: template $template;group $group; backoff $backoff; enb cba allocation $enb_cba_access; ue cba access $ue_cba_access; collision $collision; missed $missed; unused $unused;"
|
||||
echo "$template;$group;$backoff;$enb_cba_access;$ue_cba_access;$collision;$missed;$unused;" >> ./results/$STATS1
|
||||
fi
|
||||
|
||||
# create the curves
|
||||
for metric in ${METRICS[@]}; do
|
||||
if [ $metric = "goodput" ]; then
|
||||
unit="(kB/s)"
|
||||
else
|
||||
unit="(ms)"
|
||||
fi
|
||||
if [ -f /tmp/otg_${metric}.dat ]; then
|
||||
export TITLE="Application $metric $unit"
|
||||
cp /tmp/otg_${metric}.dat ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat
|
||||
echo_info "$OTGPLOT ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat $COLUMN"
|
||||
echo "$OTGPLOT ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat $COLUMN" >> results/${oai_exp_date}
|
||||
$($OTGPLOT ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat $COLUMN 1>&2 >> ./results/$LOG_FILE )
|
||||
$($PS2PDF -dOptimize=true -dEmbedAllFonts=true ./otg-${metric}-template${template}-group${group}-backoff${backoff}.eps )
|
||||
# remove the first line of the file
|
||||
echo "$(tail -n+2 ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat)" > ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat
|
||||
else
|
||||
echo_error "file /tmp/otg_${metric}.dat does not exists"
|
||||
fi
|
||||
done
|
||||
if [ $KEEP_LOG_FILESNUM_PKTS = 0 ]; then
|
||||
rm -f ./results/$LOG_FILE
|
||||
fi
|
||||
mv *.eps ./results/
|
||||
mv *.pdf ./results/
|
||||
mv /tmp/otg.log ./results/otg-template${template}-group${group}-backoff${backoff}.log
|
||||
echo_info "End test_$i.$j.$k:: runtime: $diff :: status $STATUS"
|
||||
echo "End test_$i.$j.$k:: runtime: $diff :: status $STATUS" >> results/${oai_exp_date}
|
||||
|
||||
# backoff not required when CBA is not used
|
||||
if [ $group -eq 0 ]; then
|
||||
break;
|
||||
fi
|
||||
|
||||
done
|
||||
done
|
||||
done
|
||||
|
||||
end_exp=$(date +%s)
|
||||
diff_exp=$(( $end_exp - $start_exp ))
|
||||
|
||||
let total_tests=i*j*k;
|
||||
echo_info "total tests: $total_tests for a duration $diff_exp (s) error ($e)"
|
||||
echo "total tests: $total_tests for a duration $diff_exp (s) error ($e)" >> results/${oai_exp_date}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
case "$PERF_APP" in
|
||||
'ITGS')
|
||||
echo_info "3. running ITGSend"
|
||||
itg_send
|
||||
;;
|
||||
'ITGD')
|
||||
echo_info "running ITGDECODE (ensure that the results are in the current directory)"
|
||||
itg_decode
|
||||
;;
|
||||
'PING')
|
||||
echo_info "3. running ping"
|
||||
ping_stats
|
||||
;;
|
||||
'OTG-OAISIM')
|
||||
echo_info "3. running OTG on oaisim"
|
||||
oaisim_otg_stats
|
||||
;;
|
||||
'OTG-CBA')
|
||||
echo_info "3. running OTG on oaisim with cba"
|
||||
cba_otg_stats
|
||||
;;
|
||||
|
||||
'IPERF')
|
||||
echo_warning "iperf not supported"
|
||||
;;
|
||||
'NONE')
|
||||
;;
|
||||
*)
|
||||
echo_error "Unknown option $RUN_ITG"
|
||||
;;
|
||||
esac
|
||||
|
||||