mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-16 06:00:28 +00:00
Compare commits
253 Commits
cuda-docke
...
multipath-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2378f34fa4 | ||
|
|
e0c204f7e1 | ||
|
|
5f344876c8 | ||
|
|
ddccad3391 | ||
|
|
7162d95980 | ||
|
|
ed8a81cd4b | ||
|
|
bd4ef0ffa2 | ||
|
|
18f8b468e3 | ||
|
|
a1eb9fe84e | ||
|
|
5b23a6976a | ||
|
|
b2fb94979f | ||
|
|
f9616a0048 | ||
|
|
1a127818ef | ||
|
|
e13e3c06dd | ||
|
|
32c81b7b06 | ||
|
|
84c51802da | ||
|
|
870b25e95d | ||
|
|
7227cfb320 | ||
|
|
f9f6e96d6b | ||
|
|
ef5191b610 | ||
|
|
8927032fd2 | ||
|
|
85f586c76d | ||
|
|
4facb4d635 | ||
|
|
a82353f42a | ||
|
|
badb0c561a | ||
|
|
44e4ebc4e2 | ||
|
|
fc5e3ce61d | ||
|
|
e96d7f9576 | ||
|
|
e527b99de1 | ||
|
|
bc9c59f186 | ||
|
|
1015c1f5f0 | ||
|
|
5227becf89 | ||
|
|
cb68d817f0 | ||
|
|
984c0bff0f | ||
|
|
28f926607e | ||
|
|
e611d092e9 | ||
|
|
f66524879d | ||
|
|
6fd02ee7e8 | ||
|
|
fa75484e13 | ||
|
|
461cfb7911 | ||
|
|
92abefb815 | ||
|
|
6e4f1b7b31 | ||
|
|
20e534d483 | ||
|
|
cfb654e77f | ||
|
|
ff5b2bc8b2 | ||
|
|
2f4f177050 | ||
|
|
26698d4f07 | ||
|
|
25380e8075 | ||
|
|
98462c20ba | ||
|
|
7a02456883 | ||
|
|
8c78ef5b94 | ||
|
|
a1175f7f61 | ||
|
|
95dfb67e51 | ||
|
|
44729d5765 | ||
|
|
8045dc71e0 | ||
|
|
1ea90fc987 | ||
|
|
f691b7f9e4 | ||
|
|
e5413dcb2d | ||
|
|
44fa1c2244 | ||
|
|
2aa496bae7 | ||
|
|
a9a554508d | ||
|
|
2a8b89a451 | ||
|
|
2c369a8299 | ||
|
|
3e65d75f83 | ||
|
|
8d6bb6bf20 | ||
|
|
a76f7a8c62 | ||
|
|
e99cf956e7 | ||
|
|
fd791568ff | ||
|
|
b8683dd351 | ||
|
|
93f5f65806 | ||
|
|
524aa84e96 | ||
|
|
6ff098e0bd | ||
|
|
0a796ebb6c | ||
|
|
956d30f4e1 | ||
|
|
9f97320cbe | ||
|
|
206c7667e6 | ||
|
|
166589c2ef | ||
|
|
40fd22e26a | ||
|
|
e486557f63 | ||
|
|
230a969be4 | ||
|
|
8ca1d0d38d | ||
|
|
31aaa4ed3f | ||
|
|
998018db50 | ||
|
|
5beb8bf314 | ||
|
|
eb9e4ef9ba | ||
|
|
e5139b6f0f | ||
|
|
15befb41e6 | ||
|
|
e824a6373d | ||
|
|
b00dd803d1 | ||
|
|
42dbaaf75c | ||
|
|
adabb6a967 | ||
|
|
da644bc91d | ||
|
|
9528ccceb9 | ||
|
|
a7f0a1a20c | ||
|
|
55cebe6edf | ||
|
|
48be94a8c1 | ||
|
|
b7cb74699d | ||
|
|
4809ffc92a | ||
|
|
e6a0a1cac4 | ||
|
|
89321fe824 | ||
|
|
1cfca6ce47 | ||
|
|
91069fffd1 | ||
|
|
b60572d1fc | ||
|
|
99962b551c | ||
|
|
743d342ad6 | ||
|
|
e2b3c1546e | ||
|
|
13e9910e4e | ||
|
|
bb378620e9 | ||
|
|
b283960637 | ||
|
|
7c9a7ab374 | ||
|
|
443e59a318 | ||
|
|
1e991bb8fe | ||
|
|
89ebbb4192 | ||
|
|
c54b69e635 | ||
|
|
fbaf38959c | ||
|
|
197492ae89 | ||
|
|
20a2ff1e49 | ||
|
|
bb383359e2 | ||
|
|
1dac64fa42 | ||
|
|
7e6826ec03 | ||
|
|
1120d41dd6 | ||
|
|
709d583950 | ||
|
|
67ec7b7029 | ||
|
|
c4a0c3b05e | ||
|
|
0ff85ff2c0 | ||
|
|
deadd5414d | ||
|
|
876d2b1b69 | ||
|
|
dd3ecbcf38 | ||
|
|
582aeac496 | ||
|
|
cfe9bfecce | ||
|
|
66f0d960d3 | ||
|
|
a9da4dba35 | ||
|
|
f977b6affd | ||
|
|
9ba2e7ca5b | ||
|
|
67cb3f026d | ||
|
|
bd6180e362 | ||
|
|
c833aee524 | ||
|
|
af125c39df | ||
|
|
10f304d9da | ||
|
|
bc238f9b2f | ||
|
|
3190ad47b1 | ||
|
|
5d118cf170 | ||
|
|
82931c8f01 | ||
|
|
278d2cbca1 | ||
|
|
5a7d275546 | ||
|
|
39bbadf3d1 | ||
|
|
eb62fa3a1d | ||
|
|
6c7e692bd5 | ||
|
|
6b80fbf072 | ||
|
|
b3242490f1 | ||
|
|
2944775952 | ||
|
|
4e87ac46a1 | ||
|
|
1c63d44afd | ||
|
|
e70bb45ebd | ||
|
|
9346b50eb3 | ||
|
|
a9a9dfe297 | ||
|
|
7bb9f60068 | ||
|
|
2b2e9563ff | ||
|
|
afc13c264c | ||
|
|
4d96f40023 | ||
|
|
3a734bc5d4 | ||
|
|
fd4de3c720 | ||
|
|
11a561cb7b | ||
|
|
454f690272 | ||
|
|
4e4f27c79d | ||
|
|
18041e3c41 | ||
|
|
8d872f2f7d | ||
|
|
ce1ddb260b | ||
|
|
45792da029 | ||
|
|
7300a7daf3 | ||
|
|
22cd4e9312 | ||
|
|
db93bc022f | ||
|
|
3ea02249d6 | ||
|
|
9ab0715a5a | ||
|
|
e8f53fd5ac | ||
|
|
a73dd19381 | ||
|
|
d372aa1b50 | ||
|
|
8bae60c938 | ||
|
|
79c1133736 | ||
|
|
6647af4116 | ||
|
|
705f04f58e | ||
|
|
8e32225711 | ||
|
|
206e44ae54 | ||
|
|
38ed261638 | ||
|
|
515eb988ab | ||
|
|
1271d91676 | ||
|
|
225e640ca4 | ||
|
|
774c390bbe | ||
|
|
9d2960eab8 | ||
|
|
e69ef1d8cc | ||
|
|
69de8cbc24 | ||
|
|
0e09c7c347 | ||
|
|
48d19e8a91 | ||
|
|
5e3e8a70ff | ||
|
|
53813f522c | ||
|
|
741e9ffae9 | ||
|
|
2e15430731 | ||
|
|
15bb046f9c | ||
|
|
169de8cdca | ||
|
|
f155ad7202 | ||
|
|
2b75e09151 | ||
|
|
47d2ba1793 | ||
|
|
fbb78ad825 | ||
|
|
0942927308 | ||
|
|
69cb71eddc | ||
|
|
c2eadcbddb | ||
|
|
b11354126f | ||
|
|
c8aea1b970 | ||
|
|
fcd0013981 | ||
|
|
08a3f98ef0 | ||
|
|
78b14302be | ||
|
|
433d5c1099 | ||
|
|
cd67c33ba2 | ||
|
|
acb2ae93bd | ||
|
|
d72ee11b32 | ||
|
|
86937cd8b1 | ||
|
|
62bcd822c5 | ||
|
|
318d901ef6 | ||
|
|
995cccc760 | ||
|
|
0367881ba9 | ||
|
|
625b4b0cde | ||
|
|
e7db367c9d | ||
|
|
5291afe165 | ||
|
|
eee7d976ec | ||
|
|
2e9101f833 | ||
|
|
9bb15f15b8 | ||
|
|
8bd6e16ad1 | ||
|
|
0b0e804f73 | ||
|
|
10d60f71ce | ||
|
|
4e9e2b39e9 | ||
|
|
89603f0649 | ||
|
|
417913dfaa | ||
|
|
0ebb97c4ae | ||
|
|
e5b68fb6ee | ||
|
|
f1fbf4aa29 | ||
|
|
0d651bf3a9 | ||
|
|
014be5326e | ||
|
|
c957e11682 | ||
|
|
32f8f258fa | ||
|
|
e58c52829d | ||
|
|
ba585cd96d | ||
|
|
598fbb5a24 | ||
|
|
792a7faf09 | ||
|
|
2de3d1f525 | ||
|
|
c4562df2e7 | ||
|
|
cc87c72ac3 | ||
|
|
c4acec706d | ||
|
|
138886ad5e | ||
|
|
595e650f9f | ||
|
|
645393f464 | ||
|
|
ee2668b7c3 | ||
|
|
c8d64f0dd1 | ||
|
|
0f61fac4a6 |
@@ -23,15 +23,14 @@
|
||||
|
||||
cmake_minimum_required (VERSION 3.16)
|
||||
project (OpenAirInterface LANGUAGES C CXX)
|
||||
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
|
||||
option(CUDA_ENABLE "Enable CUDA accelerated channel simulation" OFF)
|
||||
find_package(CUDA)
|
||||
if(CUDA_ENABLE)
|
||||
find_package(CUDA REQUIRED)
|
||||
find_package(CUDAToolkit REQUIRED)
|
||||
message(STATUS "CUDA explicitly enabled, building with GPU acceleration support.")
|
||||
|
||||
|
||||
enable_language(CUDA)
|
||||
|
||||
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
|
||||
@@ -56,20 +55,8 @@ if(CUDA_ENABLE)
|
||||
endif()
|
||||
|
||||
add_compile_definitions(ENABLE_CUDA)
|
||||
|
||||
add_library(oai_cuda_lib STATIC
|
||||
${CMAKE_SOURCE_DIR}/openair1/SIMULATION/TOOLS/multipath_channel.cu
|
||||
${CMAKE_SOURCE_DIR}/openair1/SIMULATION/TOOLS/phase_noise.cu
|
||||
${CMAKE_SOURCE_DIR}/openair1/SIMULATION/TOOLS/channel_pipeline.cu
|
||||
)
|
||||
|
||||
target_include_directories(oai_cuda_lib PUBLIC
|
||||
${CMAKE_SOURCE_DIR}/openair1/SIMULATION/TOOLS
|
||||
)
|
||||
endif()
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
|
||||
#########################################################
|
||||
# Base directories, compatible with legacy OAI building #
|
||||
#########################################################
|
||||
@@ -137,7 +124,7 @@ set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
||||
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
||||
set (OPENAIR_CMAKE ${OPENAIR_DIR}/cmake_targets)
|
||||
|
||||
# project (OpenAirInterface)
|
||||
project (OpenAirInterface)
|
||||
|
||||
####################################################
|
||||
# compilation flags
|
||||
@@ -215,7 +202,7 @@ endif()
|
||||
if (NOT CROSS_COMPILE)
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native")
|
||||
else ()
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=armv8-a")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=armv8.2-a")
|
||||
endif()
|
||||
|
||||
# add autotools definitions that were maybe used!
|
||||
@@ -424,6 +411,7 @@ add_library(ngap
|
||||
${NGAP_DIR}/ngap_gNB.c
|
||||
${NGAP_DIR}/ngap_common.c
|
||||
${NGAP_DIR}/ngap_gNB_context_management_procedures.c
|
||||
${NGAP_DIR}/ngap_gNB_mobility_management.c
|
||||
${NGAP_DIR}/ngap_gNB_decoder.c
|
||||
${NGAP_DIR}/ngap_gNB_encoder.c
|
||||
${NGAP_DIR}/ngap_gNB_handlers.c
|
||||
@@ -1764,7 +1752,6 @@ set (SIMUSRC
|
||||
${OPENAIR1_DIR}/SIMULATION/RF/dac.c
|
||||
${OPENAIR1_DIR}/SIMULATION/RF/adc.c
|
||||
)
|
||||
|
||||
add_library(SIMU STATIC ${SIMUSRC} )
|
||||
target_include_directories(SIMU PUBLIC ${OPENAIR1_DIR}/SIMULATION/TOOLS ${OPENAIR1_DIR}/SIMULATION/RF)
|
||||
|
||||
@@ -2149,12 +2136,14 @@ target_link_libraries(nr_ulsim PRIVATE
|
||||
)
|
||||
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
if (TARGET oai_cuda_lib)
|
||||
target_link_libraries(nr_dlsim PRIVATE oai_cuda_lib ${CUDAToolkit_LIBRARIES})
|
||||
target_link_libraries(nr_ulsim PRIVATE oai_cuda_lib ${CUDAToolkit_LIBRARIES})
|
||||
if(CUDA_ENABLE)
|
||||
if (TARGET oai_cuda_lib)
|
||||
target_link_libraries(nr_dlsim PRIVATE oai_cuda_lib)
|
||||
target_link_libraries(nr_ulsim PRIVATE oai_cuda_lib)
|
||||
|
||||
target_compile_definitions(nr_dlsim PRIVATE ENABLE_CUDA)
|
||||
target_compile_definitions(nr_ulsim PRIVATE ENABLE_CUDA)
|
||||
target_compile_definitions(nr_dlsim PRIVATE ENABLE_CUDA)
|
||||
target_compile_definitions(nr_ulsim PRIVATE ENABLE_CUDA)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
|
||||
@@ -2271,11 +2260,6 @@ add_subdirectory(tests)
|
||||
|
||||
if(TARGET oai_cuda_lib)
|
||||
message(STATUS "CUDA library 'oai_cuda_lib' found, linking to targets...")
|
||||
|
||||
target_link_libraries(nr_dlsim PRIVATE oai_cuda_lib ${CUDAToolkit_LIBRARIES})
|
||||
target_link_libraries(nr_ulsim PRIVATE oai_cuda_lib ${CUDAToolkit_LIBRARIES})
|
||||
|
||||
# target_link_libraries(test_multipath PRIVATE oai_cuda_lib ${CUDAToolkit_LIBRARIES})
|
||||
# target_link_libraries(test_noise PRIVATE oai_cuda_lib ${CUDAToolkit_LIBRARIES})
|
||||
# target_link_libraries(test_channel_simulation PRIVATE oai_cuda_lib ${CUDAToolkit_LIBRARIES})
|
||||
target_link_libraries(nr_dlsim PRIVATE oai_cuda_lib)
|
||||
target_link_libraries(nr_ulsim PRIVATE oai_cuda_lib)
|
||||
endif()
|
||||
|
||||
@@ -175,6 +175,28 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("Ubuntu-Jetson-Image-Builder") {
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-Ubuntu-Jetson-Image-Builder', 'Ubuntu-Jetson-Image-Builder')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
ubuntuJetsonBuildStatus = finalizeSlaveJob('RAN-Ubuntu-Jetson-Image-Builder')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += ubuntuJetsonBuildStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("RHEL-Cluster-Image-Builder") {
|
||||
steps {
|
||||
script {
|
||||
@@ -269,6 +291,29 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("PhySim-GraceHopper-5G") {
|
||||
when { expression {do5Gtest || do5GUeTest} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-PhySim-GraceHopper-5G', 'PhySim-GraceHopper-5G')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
physimGH5GStatus = finalizeSlaveJob('RAN-PhySim-GraceHopper-5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += physimGH5GStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("PhySim-Cluster-4G") {
|
||||
when { expression {do4Gtest} }
|
||||
steps {
|
||||
@@ -661,6 +706,29 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("SA-Handover-CN5G") {
|
||||
when { expression {do5Gtest} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-SA-Handover-CN5G', 'SA-Handover-CN5G')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
saHandoverStatus = finalizeSlaveJob('RAN-SA-Handover-CN5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += saHandoverStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("SA-OAIUE-CN5G") {
|
||||
when { expression {do5Gtest || do5GUeTest} }
|
||||
steps {
|
||||
|
||||
@@ -12,6 +12,14 @@ idefix:
|
||||
IF: wwan0
|
||||
MTU: 1500
|
||||
|
||||
raspix:
|
||||
Host: raspix
|
||||
AttachScript: sudo /opt/mbim_scripts/start_quectel_mbim.sh
|
||||
DetachScript: sudo /opt/mbim_scripts/stop_quectel_mbim.sh
|
||||
NetworkScript: ip a show dev wwan0
|
||||
IF: wwan0
|
||||
MTU: 1500
|
||||
|
||||
up2:
|
||||
Host: up2
|
||||
AttachScript: sudo /opt/mbim/start_quectel_mbim.sh
|
||||
@@ -77,6 +85,14 @@ oc-cn5g-20897:
|
||||
Undeploy: "! scripts/oc-cn5g-undeploy.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-fhi72"
|
||||
LogCollect: "! scripts/oc-cn5g-logcollect.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-fhi72 %%log_dir%%"
|
||||
|
||||
oc-cn5g-00102-ho:
|
||||
Host: groot
|
||||
NetworkScript: echo "inet 172.21.6.111"
|
||||
RunIperf3Server: False
|
||||
Deploy: "! scripts/oc-cn5g-deploy.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-ho"
|
||||
Undeploy: "! scripts/oc-cn5g-undeploy.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-ho"
|
||||
LogCollect: "! scripts/oc-cn5g-logcollect.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-ho %%log_dir%%"
|
||||
|
||||
oc-cn5g-20897-aerial:
|
||||
Host: gracehopper1-oai
|
||||
NetworkScript: echo "inet 172.21.6.105"
|
||||
@@ -455,3 +471,93 @@ l2sim4g_ext_dn:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec l2sim4g-trf-gen ip a show dev eth0
|
||||
CmdPrefix: docker exec l2sim4g-trf-gen
|
||||
|
||||
rfsim5g_multiue1:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec rfsim5g-oai-nr-ue ip a show dev oaitun_ue1
|
||||
CmdPrefix: docker exec rfsim5g-oai-nr-ue
|
||||
IF: oaitun_ue1
|
||||
AttachScript: docker start rfsim5g-oai-nr-ue
|
||||
DetachScript: docker stop rfsim5g-oai-nr-ue
|
||||
MTU: 1500
|
||||
|
||||
rfsim5g_multiue2:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec rfsim5g-oai-nr-ue ip a show dev oaitun_ue2
|
||||
CmdPrefix: docker exec rfsim5g-oai-nr-ue
|
||||
IF: oaitun_ue2
|
||||
AttachScript: true
|
||||
DetachScript: true
|
||||
MTU: 1500
|
||||
|
||||
rfsim5g_multiue3:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec rfsim5g-oai-nr-ue ip a show dev oaitun_ue3
|
||||
CmdPrefix: docker exec rfsim5g-oai-nr-ue
|
||||
IF: oaitun_ue3
|
||||
AttachScript: "true"
|
||||
DetachScript: "true"
|
||||
MTU: 1500
|
||||
|
||||
rfsim5g_multiue4:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec rfsim5g-oai-nr-ue ip a show dev oaitun_ue4
|
||||
CmdPrefix: docker exec rfsim5g-oai-nr-ue
|
||||
IF: oaitun_ue4
|
||||
AttachScript: "true"
|
||||
DetachScript: "true"
|
||||
MTU: 1500
|
||||
|
||||
rfsim5g_multiue5:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec rfsim5g-oai-nr-ue ip a show dev oaitun_ue5
|
||||
CmdPrefix: docker exec rfsim5g-oai-nr-ue
|
||||
IF: oaitun_ue5
|
||||
AttachScript: "true"
|
||||
DetachScript: "true"
|
||||
MTU: 1500
|
||||
|
||||
rfsim5g_multiue6:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec rfsim5g-oai-nr-ue ip a show dev oaitun_ue6
|
||||
CmdPrefix: docker exec rfsim5g-oai-nr-ue
|
||||
IF: oaitun_ue6
|
||||
AttachScript: "true"
|
||||
DetachScript: "true"
|
||||
MTU: 1500
|
||||
|
||||
rfsim5g_multiue7:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec rfsim5g-oai-nr-ue ip a show dev oaitun_ue7
|
||||
CmdPrefix: docker exec rfsim5g-oai-nr-ue
|
||||
IF: oaitun_ue7
|
||||
AttachScript: "true"
|
||||
DetachScript: "true"
|
||||
MTU: 1500
|
||||
|
||||
rfsim5g_multiue8:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec rfsim5g-oai-nr-ue ip a show dev oaitun_ue8
|
||||
CmdPrefix: docker exec rfsim5g-oai-nr-ue
|
||||
IF: oaitun_ue8
|
||||
AttachScript: "true"
|
||||
DetachScript: "true"
|
||||
MTU: 1500
|
||||
|
||||
rfsim5g_multiue9:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec rfsim5g-oai-nr-ue ip a show dev oaitun_ue9
|
||||
CmdPrefix: docker exec rfsim5g-oai-nr-ue
|
||||
IF: oaitun_ue9
|
||||
AttachScript: "true"
|
||||
DetachScript: "true"
|
||||
MTU: 1500
|
||||
|
||||
rfsim5g_multiue10:
|
||||
Host: "%%current_host%%"
|
||||
NetworkScript: docker exec rfsim5g-oai-nr-ue ip a show dev oaitun_ue10
|
||||
CmdPrefix: docker exec rfsim5g-oai-nr-ue
|
||||
IF: oaitun_ue10
|
||||
AttachScript: "true"
|
||||
DetachScript: "true"
|
||||
MTU: 1500
|
||||
|
||||
@@ -26,65 +26,26 @@ import os
|
||||
import xml.etree.ElementTree as ET
|
||||
import json
|
||||
|
||||
# Define the mapping of physim_test values to search patterns
|
||||
PHYSIM_PATTERN_MAPPING = {
|
||||
'nr_ulsim': [
|
||||
r'(Total PHY proc rx)\s+(\d+\.\d+)\s+us', # Pattern for RX PHY processing time
|
||||
r'(ULSCH total decoding time)\s+(\d+\.\d+)\s+us', # Pattern for ULSCH decoding time
|
||||
],
|
||||
'nr_dlsim': [
|
||||
r'(PHY proc tx)\s+(\d+\.\d+)\s+us', # Pattern for TX PHY processing time
|
||||
r'(DLSCH encoding time)\s+(\d+\.\d+)\s+us', # Pattern for DLSCH encoding time
|
||||
],
|
||||
'ldpctest': [
|
||||
r'(Encoding time mean):\s+(\d+\.\d+)\s+us', # Pattern for encoding time mean
|
||||
r'(Decoding time mean):\s+(\d+\.\d+)\s+us', # Pattern for decoding time mean
|
||||
],
|
||||
}
|
||||
# Define test conditions based on the simulation type
|
||||
PHYSIM_TEST_CONDITION = {
|
||||
'nr_ulsim': 'test OK', # For nr_ulsim, check if 'test OK' is present
|
||||
'nr_dlsim': 'test OK', # For nr_dlsim, check if 'test OK' is present
|
||||
'ldpctest': None, # No condition for ldpctest, just process the patterns
|
||||
}
|
||||
|
||||
class Analysis():
|
||||
|
||||
def analyze_physim(log, physim_test, options, threshold):
|
||||
search_patterns = PHYSIM_PATTERN_MAPPING.get(physim_test)
|
||||
test_condition = PHYSIM_TEST_CONDITION.get(physim_test)
|
||||
success = False
|
||||
msg = ''
|
||||
def _get_test_description(properties):
|
||||
env_vars = None
|
||||
for p in properties:
|
||||
if p["name"] == "ENVIRONMENT":
|
||||
env_vars = p["value"] # save for later if no custom property
|
||||
if p["name"] == "TEST_DESCRIPTION":
|
||||
return p["value"]
|
||||
# if we came till here, it means there is no custom test property
|
||||
# saved in JSON. See if we have a description in environment variables
|
||||
if not env_vars:
|
||||
return "<none>"
|
||||
for ev in env_vars:
|
||||
name, value = ev.split("=", 1)
|
||||
if name == "TEST_DESCRIPTION":
|
||||
return value
|
||||
return "<none>"
|
||||
|
||||
try:
|
||||
with open(log, 'r') as f:
|
||||
log_content = f.read()
|
||||
except FileNotFoundError as e:
|
||||
msg = f'{log} file not found, exception: {e}'
|
||||
return False, msg
|
||||
except Exception as e:
|
||||
msg = f'Error while parsing log file {log}: exception: {e}'
|
||||
return False, msg
|
||||
|
||||
if test_condition and test_condition not in log_content:
|
||||
msg = f"Test did not succeed, '{test_condition}' not found in log file {log}."
|
||||
return False, msg
|
||||
|
||||
time1_match = re.search(search_patterns[0], log_content)
|
||||
time2_match = re.search(search_patterns[1], log_content)
|
||||
if not(time1_match and time2_match):
|
||||
msg = f"Processing time not found in log file {log}."
|
||||
return False, msg
|
||||
|
||||
success = float(time2_match.group(2)) < float(threshold)
|
||||
if success:
|
||||
msg = f'{time1_match.group(1)}: {time1_match.group(2)} us\n{time2_match.group(1)}: {time2_match.group(2)} us'
|
||||
else:
|
||||
msg = f'{time1_match.group(1)}: {time1_match.group(2)} us\n{time2_match.group(1)}: {time2_match.group(2)} us exceeds a limit of {threshold} us'
|
||||
|
||||
return success,msg
|
||||
|
||||
def analyze_oc_physim(result_junit, details_json, logPath):
|
||||
def analyze_physim(result_junit, details_json, logPath):
|
||||
try:
|
||||
tree = ET.parse(result_junit)
|
||||
root = tree.getroot()
|
||||
@@ -116,7 +77,7 @@ class Analysis():
|
||||
for test in root: # for each test
|
||||
test_name = test.attrib["name"]
|
||||
test_exec = json_test_desc[test_name]["properties"][1]["value"][0]
|
||||
desc = json_test_desc[test_name]["properties"][1]["value"][1]
|
||||
desc = Analysis._get_test_description(json_test_desc[test_name]["properties"])
|
||||
# get runtime and checks
|
||||
test_check = test.attrib["status"] == "run"
|
||||
time = round(float(test.attrib["time"]), 1)
|
||||
@@ -129,13 +90,16 @@ class Analysis():
|
||||
with open(f'{log_dir}/{test_name}.log', 'w') as f:
|
||||
f.write(output)
|
||||
# prepare result and info
|
||||
info = f"Runtime: {f'{time:.3f}'[:5]} s"
|
||||
resultstr = 'PASS' if (test_check and time_check and output_check) else 'FAIL'
|
||||
info = f"{test_name}.log: test {resultstr}"
|
||||
for l in output.splitlines():
|
||||
if l.startswith("CHECK "):
|
||||
info += f"\n{l}"
|
||||
if test_check:
|
||||
if not output_check:
|
||||
info += " Test log exceeds maximal allowed length 100 kB"
|
||||
info += "\nTest log exceeds maximal allowed length 100 kB"
|
||||
if not time_check:
|
||||
info += " Test exceeds 150s"
|
||||
info += "\nTest exceeds 150s"
|
||||
if not (time_check and output_check):
|
||||
nb_failed += 1 # time threshold/output length error, not counted for by ctest as of now
|
||||
test_result[test_name] = [desc, info, resultstr]
|
||||
|
||||
@@ -34,7 +34,6 @@ import time
|
||||
import os
|
||||
|
||||
import cls_oai_html
|
||||
import cls_analysis
|
||||
import constants as CONST
|
||||
import helpreadme as HELP
|
||||
import cls_containerize
|
||||
@@ -417,34 +416,3 @@ class Cluster:
|
||||
c.run(f'cp -r {ctx.logPath} {os.getcwd()}/test_log_{ctx.test_id}/')
|
||||
|
||||
return status
|
||||
|
||||
def deploy_oc_physim(self, ctx, HTML, oc_release, node):
|
||||
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||
HELP.GenericHelp(CONST.Version)
|
||||
raise ValueError(f'Insufficient Parameter: ranRepository {self.ranRepository} ranBranch {self.ranBranch} ranCommitID {self.ranCommitID}')
|
||||
image_tag = cls_containerize.CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
logging.debug(f'Running physims from server: {node}')
|
||||
script = "scripts/oc-deploy-physims.sh"
|
||||
options = f"oaicicd-core-for-ci-ran {oc_release} {image_tag} {self.eNBSourceCodePath}"
|
||||
ret = cls_cmd.runScript(node, script, 600, options)
|
||||
logging.debug(f'"{script}" finished with code {ret.returncode}, output:\n{ret.stdout}')
|
||||
with cls_cmd.getConnection(node) as ssh:
|
||||
details_json = archiveArtifact(ssh, ctx, f'{self.eNBSourceCodePath}/ci-scripts/{oc_release}-tests.json')
|
||||
result_junit = archiveArtifact(ssh, ctx, f'{self.eNBSourceCodePath}/ci-scripts/{oc_release}-run.xml')
|
||||
archiveArtifact(ssh, ctx, f'{self.eNBSourceCodePath}/ci-scripts/physim_log.txt')
|
||||
archiveArtifact(ssh, ctx, f'{self.eNBSourceCodePath}/ci-scripts/physim_pods_summary.txt')
|
||||
archiveArtifact(ssh, ctx, f'{self.eNBSourceCodePath}/ci-scripts/LastTestsFailed.log')
|
||||
test_status, test_summary, test_result = cls_analysis.Analysis.analyze_oc_physim(result_junit, details_json, ctx.logPath)
|
||||
if test_summary:
|
||||
if test_status:
|
||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
HTML.CreateHtmlTestRowPhySimTestResult(test_summary, test_result)
|
||||
logging.info('\u001B[1m Physical Simulator Pass\u001B[0m')
|
||||
else:
|
||||
HTML.CreateHtmlTestRowQueue('At least one physical simulator test failed!', 'KO', ["See below for details"])
|
||||
HTML.CreateHtmlTestRowPhySimTestResult(test_summary, test_result)
|
||||
logging.error('\u001B[1m Physical Simulator Fail\u001B[0m')
|
||||
else:
|
||||
HTML.CreateHtmlTestRowQueue('Physical simulator failed', 'KO', [test_result])
|
||||
logging.error('\u001B[1m Physical Simulator Fail\u001B[0m')
|
||||
return test_status
|
||||
|
||||
@@ -45,12 +45,6 @@ def getConnection(host, d=None):
|
||||
else:
|
||||
return RemoteCmd(host, d=d)
|
||||
|
||||
def runScript(host, path, timeout, parameters=None, redirect=None, silent=False):
|
||||
if is_local(host):
|
||||
return LocalCmd.exec_script(path, timeout, parameters, redirect, silent)
|
||||
else:
|
||||
return RemoteCmd.exec_script(host, path, timeout, parameters, redirect, silent)
|
||||
|
||||
# provides a partial interface for the legacy SSHconnection class (getBefore(), command())
|
||||
class Cmd(metaclass=abc.ABCMeta):
|
||||
def cd(self, d, silent=False):
|
||||
@@ -111,12 +105,12 @@ class LocalCmd(Cmd):
|
||||
logging.debug(f'Working dir is {self.cwd}')
|
||||
self.cp = sp.CompletedProcess(args='', returncode=0, stdout='')
|
||||
|
||||
def exec_script(path, timeout, parameters=None, redirect=None, silent=False):
|
||||
def exec_script(self, path, timeout, parameters=None, redirect=None, silent=False):
|
||||
if redirect and not redirect.startswith("/"):
|
||||
raise ValueError(f"redirect must be absolute, but is {redirect}")
|
||||
c = f"{path} {parameters}" if parameters else path
|
||||
if not redirect:
|
||||
ret = sp.run(c, shell=True, timeout=timeout, stdout=sp.PIPE, stderr=sp.STDOUT)
|
||||
ret = sp.run(c, shell=True, cwd=self.cwd, timeout=timeout, stdout=sp.PIPE, stderr=sp.STDOUT)
|
||||
ret.stdout = ret.stdout.decode('utf-8').strip()
|
||||
else:
|
||||
with open(redirect, "w") as f:
|
||||
@@ -238,18 +232,15 @@ class RemoteCmd(Cmd):
|
||||
cfg['sock'] = paramiko.ProxyCommand(ucfg['proxycommand'])
|
||||
return cfg
|
||||
|
||||
def exec_script(host, path, timeout, parameters=None, redirect=None, silent=False):
|
||||
def exec_script(self, path, timeout, parameters=None, redirect=None, silent=False):
|
||||
if redirect and not redirect.startswith("/"):
|
||||
raise ValueError(f"redirect must be absolute, but is {redirect}")
|
||||
p = parameters if parameters else ""
|
||||
r = f"> {redirect}" if redirect else ""
|
||||
if not silent:
|
||||
logging.debug(f"local> ssh {host} bash -s {p} < {path} {r} # {path} from localhost")
|
||||
client = RemoteCmd._ssh_init()
|
||||
cfg = RemoteCmd._lookup_ssh_config(host)
|
||||
client.connect(**cfg)
|
||||
logging.debug(f"local> ssh {self.hostname} bash -s {p} < {path} {r}")
|
||||
bash_opt = 'BASH_XTRACEFD=1' # write bash set -x output to stdout, see bash(1)
|
||||
stdin, stdout, stderr = client.exec_command(f"{bash_opt} bash -s {p} {r}", timeout=timeout)
|
||||
stdin, stdout, stderr = self.client.exec_command(f"{bash_opt} bash -s {p} {r}", timeout=timeout)
|
||||
# open() the file f at path, read() it and write() it into the stdin of the bash -s cmd
|
||||
with open(path) as f:
|
||||
stdin.write(f.read())
|
||||
@@ -259,7 +250,6 @@ class RemoteCmd(Cmd):
|
||||
if redirect: cmd += f" &> {redirect}"
|
||||
ret = sp.CompletedProcess(args=cmd, returncode=stdout.channel.recv_exit_status(), stdout=stdout.read(size=None) + stderr.read(size=None))
|
||||
ret.stdout = ret.stdout.decode('utf-8').strip()
|
||||
client.close()
|
||||
return ret
|
||||
|
||||
def run(self, line, timeout=300, silent=False, reportNonZero=True):
|
||||
|
||||
@@ -66,7 +66,8 @@ def CreateWorkspace(host, sourcePath, ranRepository, ranCommitID, ranTargetBranc
|
||||
ranTargetBranch = 'develop'
|
||||
options += f" {ranTargetBranch}"
|
||||
logging.info(f'execute "{script}" with options "{options}" on node {host}')
|
||||
ret = cls_cmd.runScript(host, script, 90, options)
|
||||
with cls_cmd.getConnection(host) as c:
|
||||
ret = c.exec_script(script, 90, options)
|
||||
logging.debug(f'"{script}" finished with code {ret.returncode}, output:\n{ret.stdout}')
|
||||
return ret.returncode == 0
|
||||
|
||||
@@ -303,13 +304,18 @@ class Containerize():
|
||||
result = re.search('build_cross_arm64', self.imageKind)
|
||||
if result is not None:
|
||||
self.dockerfileprefix = '.ubuntu.cross-arm64'
|
||||
result = re.search('native_arm', self.imageKind)
|
||||
result = re.search('native_armv9', self.imageKind)
|
||||
if result is not None:
|
||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
||||
imageNames.append(('ran-build-fhi72', 'build.fhi72.native_arm', 'ran-build-fhi72', ''))
|
||||
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup', ''))
|
||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
||||
imageNames.append(('oai-gnb-aerial', 'gNB.aerial', 'oai-gnb-aerial', ''))
|
||||
result = re.search('native_armv8', self.imageKind)
|
||||
if result is not None:
|
||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
||||
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup', ''))
|
||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
||||
|
||||
cmd.cd(lSourcePath)
|
||||
# if asterix, copy the entitlement and subscription manager configurations
|
||||
@@ -362,7 +368,6 @@ class Containerize():
|
||||
cmd.close()
|
||||
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
||||
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
||||
HTML.CreateHtmlTabFooter(False)
|
||||
return False
|
||||
else:
|
||||
result = re.search(r'Size *= *(?P<size>[0-9\-]+) *bytes', cmd.getBefore())
|
||||
@@ -389,13 +394,13 @@ class Containerize():
|
||||
elif image != 'ran-build':
|
||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||
if image == 'oai-gnb-aerial':
|
||||
cmd.run('cp -f /opt/nvidia-ipc/nvipc.src.2025.05.20.tar.gz .')
|
||||
cmd.run('cp -f /opt/nvidia-ipc/nvipc_src.2025.08.27.tar.gz .')
|
||||
logfile = f'{lSourcePath}/cmake_targets/log/{name}.docker.log'
|
||||
ret = cmd.run(f'{self.cli} build {self.cliBuildOptions} --target {image} --tag {name}:{imageTag} --file docker/Dockerfile.{pattern}{self.dockerfileprefix} {option} . > {logfile} 2>&1', timeout=1200)
|
||||
t = (name, archiveArtifact(cmd, ctx, logfile))
|
||||
log_files.append(t)
|
||||
if image == 'oai-gnb-aerial':
|
||||
cmd.run('rm -f nvipc.src.2025.05.20.tar.gz')
|
||||
cmd.run('rm -f nvipc_src.2025.08.27.tar.gz')
|
||||
# check the status of the build
|
||||
ret = cmd.run(f"{self.cli} image inspect --format=\'Size = {{{{.Size}}}} bytes\' {name}:{imageTag}")
|
||||
if ret.returncode != 0:
|
||||
@@ -486,7 +491,6 @@ class Containerize():
|
||||
logging.error('\u001B[1m Build of L2sim proxy failed\u001B[0m')
|
||||
ssh.close()
|
||||
HTML.CreateHtmlTestRow('commit ' + tag, 'KO', CONST.ALL_PROCESSES_OK)
|
||||
HTML.CreateHtmlTabFooter(False)
|
||||
return False
|
||||
else:
|
||||
logging.debug('L2sim proxy image for tag ' + tag + ' already exists, skipping build')
|
||||
@@ -555,7 +559,6 @@ class Containerize():
|
||||
if ret.returncode != 0:
|
||||
logging.error(f'No {baseImage} image present, cannot build tests')
|
||||
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
||||
HTML.CreateHtmlTabFooter(False)
|
||||
return False
|
||||
|
||||
# build ran-unittests image
|
||||
@@ -566,7 +569,6 @@ class Containerize():
|
||||
if ret.returncode != 0:
|
||||
logging.error(f'Cannot build unit tests')
|
||||
HTML.CreateHtmlTestRow("Unit test build failed", 'KO', [dockerfile])
|
||||
HTML.CreateHtmlTabFooter(False)
|
||||
return False
|
||||
|
||||
HTML.CreateHtmlTestRowQueue("Build unit tests", 'OK', [dockerfile])
|
||||
@@ -585,11 +587,9 @@ class Containerize():
|
||||
|
||||
if ret.returncode == 0:
|
||||
HTML.CreateHtmlTestRowQueue('Unit tests succeeded', 'OK', [ret.stdout])
|
||||
HTML.CreateHtmlTabFooter(True)
|
||||
return True
|
||||
else:
|
||||
HTML.CreateHtmlTestRowQueue('Unit tests failed (see also doc/UnitTests.md)', 'KO', [ret.stdout])
|
||||
HTML.CreateHtmlTabFooter(False)
|
||||
return False
|
||||
|
||||
def Push_Image_to_Local_Registry(self, node, HTML, tag_prefix=""):
|
||||
|
||||
@@ -77,7 +77,8 @@ class CoreNetwork:
|
||||
words = line[1:].strip().split(" ")
|
||||
script_name = words[0]
|
||||
options = " ".join(words[1:])
|
||||
ret = cls_cmd.runScript(host, script_name, 300, parameters=options, silent=silent)
|
||||
with cls_cmd.getConnection(host) as c:
|
||||
ret = c.exec_script(script_name, 300, parameters=options, silent=silent)
|
||||
return ret
|
||||
|
||||
def _command(self, cmd_list, must_succeed=False, silent=False):
|
||||
|
||||
@@ -64,18 +64,3 @@ class Native():
|
||||
logging.error('\u001B[1m Building OAI Failed\u001B[0m')
|
||||
HTML.CreateHtmlTestRow(options, 'KO', CONST.ALL_PROCESSES_OK)
|
||||
return success
|
||||
|
||||
def Run_Physim(ctx, HTML, host, directory, options, physim_test, threshold):
|
||||
logging.debug(f'Runnin {physim_test} on server: {host}')
|
||||
workSpacePath = f'{directory}/cmake_targets'
|
||||
runLogFile=f'{workSpacePath}/physim.log'
|
||||
with cls_cmd.getConnection(host) as cmd:
|
||||
cmd.run(f'sudo LD_LIBRARY_PATH=.:{DPDK_PATH}/lib64/ {workSpacePath}/ran_build/build/{physim_test} {options} > {runLogFile} 2>&1')
|
||||
physim_file = archiveArtifact(cmd, ctx, runLogFile)
|
||||
success, msg = cls_analysis.Analysis.analyze_physim(physim_file, physim_test, options, threshold)
|
||||
if success:
|
||||
HTML.CreateHtmlTestRowQueue(options, 'OK', [msg])
|
||||
else:
|
||||
logging.error(msg)
|
||||
HTML.CreateHtmlTestRowQueue(options, 'KO', [msg])
|
||||
return success
|
||||
|
||||
@@ -247,7 +247,7 @@ class HTMLManagement():
|
||||
self.htmlFile.write(' </tr>\n')
|
||||
self.htmlFile.write(' </table>\n')
|
||||
self.htmlFile.write(' <p></p>\n')
|
||||
self.htmlFile.write(' <div class="well well-lg">End of Test Report -- Copyright <span class="glyphicon glyphicon-copyright-mark"></span> 2018 <a href="http://www.openairinterface.org/">OpenAirInterface</a>. All Rights Reserved.</div>\n')
|
||||
self.htmlFile.write(' <div class="well well-lg">End of Test Report -- Copyright <span class="glyphicon glyphicon-copyright-mark"></span> 2025 <a href="http://www.openairinterface.org/">OpenAirInterface</a>. All Rights Reserved.</div>\n')
|
||||
self.htmlFile.write('</div></body>\n')
|
||||
self.htmlFile.write('</html>\n')
|
||||
self.htmlFile.close()
|
||||
@@ -533,6 +533,6 @@ class HTMLManagement():
|
||||
self.htmlFile.write(' <td bgcolor = "green" ><font color="white"><b>' + value[2] + '</b></font></td>\n')
|
||||
else:
|
||||
self.htmlFile.write(' <td bgcolor = "red" ><font color="white"><b>' + value[2] + '</b></font></td>\n')
|
||||
self.htmlFile.write(' <td bgcolor = "lightcyan">' + value[1] + '</td>\n')
|
||||
self.htmlFile.write(f' <td colspan="2" bgcolor = "lightcyan"><pre style="display: inline flow-root list-item; margin: 0 3px 0 3px; min-width: 24em;">{value[1]}</pre></td>\n')
|
||||
|
||||
self.htmlFile.close()
|
||||
|
||||
@@ -46,6 +46,7 @@ import constants as CONST
|
||||
|
||||
import cls_module
|
||||
import cls_corenetwork
|
||||
import cls_analysis
|
||||
import cls_cmd
|
||||
from cls_ci_helper import archiveArtifact
|
||||
|
||||
@@ -234,7 +235,8 @@ def Custom_Command(HTML, node, command):
|
||||
|
||||
def Custom_Script(HTML, node, script):
|
||||
logging.info(f"Executing custom script on {node}")
|
||||
ret = cls_cmd.runScript(node, script, 90)
|
||||
with cls_cmd.getConnection(node) as c:
|
||||
ret = c.exec_script(script, 90)
|
||||
logging.debug(f"Custom_Script: {script} on node: {node} - return code {ret.returncode}, output:\n{ret.stdout}")
|
||||
status = 'OK'
|
||||
message = [ret.stdout]
|
||||
@@ -249,6 +251,34 @@ def IdleSleep(HTML, idle_sleep_time):
|
||||
HTML.CreateHtmlTestRow(f"{idle_sleep_time} sec", 'OK', CONST.ALL_PROCESSES_OK)
|
||||
return True
|
||||
|
||||
def Deploy_Physim(ctx, HTML, node, workdir, script, options):
|
||||
logging.debug(f'Running physims on server {node} workdir {workdir}')
|
||||
with cls_cmd.getConnection(node) as c:
|
||||
sys_info = c.exec_script("scripts/sys-info.sh", 5)
|
||||
ret = c.exec_script(script, 600, options)
|
||||
logging.debug(f'"{script}" finished with code {ret.returncode}, output:\n{ret.stdout}')
|
||||
HTML.CreateHtmlTestRowQueue('Query system info', 'OK', [sys_info.stdout])
|
||||
with cls_cmd.getConnection(node) as ssh:
|
||||
details_json = archiveArtifact(ssh, ctx, f'{workdir}/desc-tests.json')
|
||||
result_junit = archiveArtifact(ssh, ctx, f'{workdir}/results-run.xml')
|
||||
archiveArtifact(ssh, ctx, f'{workdir}/physim_log.txt')
|
||||
archiveArtifact(ssh, ctx, f'{workdir}/LastTestsFailed.log')
|
||||
archiveArtifact(ssh, ctx, f'{workdir}/LastTest.log')
|
||||
test_status, test_summary, test_result = cls_analysis.Analysis.analyze_physim(result_junit, details_json, ctx.logPath)
|
||||
if test_summary:
|
||||
if test_status:
|
||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
HTML.CreateHtmlTestRowPhySimTestResult(test_summary, test_result)
|
||||
logging.info('\u001B[1m Physical Simulator Pass\u001B[0m')
|
||||
else:
|
||||
HTML.CreateHtmlTestRowQueue('At least one physical simulator test failed!', 'KO', ["See below for details"])
|
||||
HTML.CreateHtmlTestRowPhySimTestResult(test_summary, test_result)
|
||||
logging.error('\u001B[1m Physical Simulator Fail\u001B[0m')
|
||||
else:
|
||||
HTML.CreateHtmlTestRowQueue('Physical simulator failed', 'KO', [test_result])
|
||||
logging.error('\u001B[1m Physical Simulator Fail\u001B[0m')
|
||||
return test_status
|
||||
|
||||
#-----------------------------------------------------------
|
||||
# OaiCiTest Class Definition
|
||||
#-----------------------------------------------------------
|
||||
|
||||
@@ -15,7 +15,7 @@ gNBs =
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
||||
|
||||
@include "neighbour-config.conf"
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
|
||||
76
ci-scripts/conf_files/gnb-cu.sa.f1.ho.conf
Normal file
76
ci-scripts/conf_files/gnb-cu.sa.f1.ho.conf
Normal file
@@ -0,0 +1,76 @@
|
||||
Active_gNBs = ( "oai-cu");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe88;
|
||||
|
||||
# cell_type = "CELL_MACRO_GNB";
|
||||
|
||||
gNB_name = "oai-cu";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 03; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||
|
||||
@include "neighbour-config-ho.conf"
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
tr_s_preference = "f1";
|
||||
|
||||
local_s_address = "172.21.19.98";
|
||||
remote_s_address = "0.0.0.0";
|
||||
local_s_portd = 2153;
|
||||
remote_s_portd = 2154;
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ({ ipv4 = "172.21.6.109"; });
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.19.98/22";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.19.98/22";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
f1ap_log_level ="info";
|
||||
ngap_log_level ="info";
|
||||
};
|
||||
82
ci-scripts/conf_files/gnb-cucp.sa.e1-ho-n2.conf
Normal file
82
ci-scripts/conf_files/gnb-cucp.sa.e1-ho-n2.conf
Normal file
@@ -0,0 +1,82 @@
|
||||
Active_gNBs = ( "cu-cp-0");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe00;
|
||||
|
||||
# cell_type = "CELL_MACRO_GNB";
|
||||
|
||||
gNB_name = "cu-cp-0";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
||||
@include "neighbour-config.conf"
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
tr_s_preference = "f1";
|
||||
|
||||
local_s_address = "192.168.71.150";
|
||||
remote_s_address = "192.168.71.171";
|
||||
local_s_portd = 2153;
|
||||
remote_s_portd = 2153;
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ({ ipv4 = "192.168.71.132"; });
|
||||
|
||||
E1_INTERFACE =
|
||||
(
|
||||
{
|
||||
type = "cp";
|
||||
ipv4_cucp = "192.168.71.150";
|
||||
port_cucp = 38462;
|
||||
ipv4_cuup = "0.0.0.0"; # multiple CU-UPs
|
||||
port_cuup = 38462;
|
||||
}
|
||||
)
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.71.150";
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config : {
|
||||
global_log_level = "info";
|
||||
pdcp_log_level = "info";
|
||||
rrc_log_level = "info";
|
||||
f1ap_log_level = "info";
|
||||
ngap_log_level = "info";
|
||||
};
|
||||
@@ -146,18 +146,8 @@ gNBs =
|
||||
|
||||
);
|
||||
|
||||
servingCellConfigDedicated = ({
|
||||
dl_bwp-Id_1 = 1;
|
||||
dl_bwp1_locationAndBandwidth = 28875; # RBstart=0, L=106 (275*(L-1))+RBstart
|
||||
dl_bwp1_subcarrierSpacing = 1;
|
||||
firstActiveDownlinkBWP-Id = 1;
|
||||
defaultDownlinkBWP-Id = 1;
|
||||
ul_bwp-Id_1 = 1;
|
||||
ul_bwp1_locationAndBandwidth = 28875; # RBstart=0, L=106 (275*(L-1))+RBstart
|
||||
ul_bwp1_subcarrierSpacing = 1;
|
||||
firstActiveUplinkBWP-Id = 1;
|
||||
});
|
||||
|
||||
first_active_bwp = 1;
|
||||
bwp_list = ({ scs = 1; bwpStart = 0; bwpSize = 106;});
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
Active_gNBs = ( "oai-du0");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe88;
|
||||
gNB_DU_ID = 0xe00;
|
||||
gNB_name = "oai-du0";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1 ;
|
||||
plmn_list = ({ mcc = 001; mnc = 03; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
do_CSIRS = 0;
|
||||
do_SRS = 0;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# 4.01 GHz
|
||||
absoluteFrequencySSB = 629376;
|
||||
dl_frequencyBand = 78;
|
||||
# 4 GHz
|
||||
dl_absoluteFrequencyPointA = 628720;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 51;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 13750;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 51;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 13750;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "f1";
|
||||
local_n_address = "172.21.19.98";
|
||||
remote_n_address = "172.21.19.98";
|
||||
local_n_portc = 500;
|
||||
local_n_portd = 2154;
|
||||
remote_n_portc = 501;
|
||||
remote_n_portd = 2153;
|
||||
pusch_TargetSNRx10 = 200;
|
||||
pucch_TargetSNRx10 = 230;
|
||||
# ul_prbblack_SNR_threshold = 10;
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 100;
|
||||
pucch0_dtx_threshold = 10;
|
||||
max_ldpc_iterations = 20;
|
||||
sl_ahead = 3;
|
||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "yes"
|
||||
nb_tx = 1
|
||||
nb_rx = 1
|
||||
att_tx = 0;
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 114;
|
||||
eNB_instances = [0];
|
||||
# USRP is connected to an Octoclock in order to establish synchroniation with other USRPs
|
||||
clock_src = "external";
|
||||
time_src = "external";
|
||||
}
|
||||
);
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="info";
|
||||
mac_log_level ="info";
|
||||
rlc_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
ngap_log_level ="debug";
|
||||
f1ap_log_level ="info";
|
||||
};
|
||||
@@ -0,0 +1,217 @@
|
||||
Active_gNBs = ( "oai-du1");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe88;
|
||||
gNB_DU_ID = 0xe01;
|
||||
gNB_name = "oai-du1";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1 ;
|
||||
plmn_list = ({ mcc = 001; mnc = 03; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||
|
||||
nr_cellid = 11111111L;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
do_CSIRS = 0;
|
||||
do_SRS = 0;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 1;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# 4.01 GHz
|
||||
absoluteFrequencySSB = 629376;
|
||||
dl_frequencyBand = 78;
|
||||
# 4 GHz
|
||||
dl_absoluteFrequencyPointA = 628720;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 51;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 13750;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 51;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 13750;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "f1";
|
||||
local_n_address = "172.21.19.99";
|
||||
remote_n_address = "172.21.19.98";
|
||||
local_n_portc = 500;
|
||||
local_n_portd = 2154;
|
||||
remote_n_portc = 501;
|
||||
remote_n_portd = 2153;
|
||||
pusch_TargetSNRx10 = 200;
|
||||
pucch_TargetSNRx10 = 230;
|
||||
# ul_prbblack_SNR_threshold = 10;
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 100;
|
||||
pucch0_dtx_threshold = 10;
|
||||
max_ldpc_iterations = 20;
|
||||
sl_ahead = 3;
|
||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "yes"
|
||||
nb_tx = 1
|
||||
nb_rx = 1
|
||||
att_tx = 0;
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 114;
|
||||
eNB_instances = [0];
|
||||
# USRP is connected to an Octoclock in order to establish synchroniation with other USRPs
|
||||
clock_src = "external";
|
||||
time_src = "external";
|
||||
}
|
||||
);
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="info";
|
||||
mac_log_level ="info";
|
||||
rlc_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
ngap_log_level ="debug";
|
||||
f1ap_log_level ="info";
|
||||
};
|
||||
@@ -197,7 +197,6 @@ MACRLCs = (
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 200; # 150;
|
||||
pucch_TargetSNRx10 = 200; #200;
|
||||
ulsch_max_frame_inactivity = 10;
|
||||
dl_max_mcs = 28;
|
||||
ul_max_mcs = 28;
|
||||
}
|
||||
|
||||
@@ -198,7 +198,6 @@ MACRLCs = (
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
# ulsch_max_frame_inactivity = 0;
|
||||
pusch_TargetSNRx10 = 150;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
dl_max_mcs = 9;
|
||||
|
||||
@@ -16,6 +16,7 @@ gNBs =
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
do_SINR = 1;
|
||||
min_rxtxtime = 6;
|
||||
disable_harq = 1;
|
||||
cu_sibs = [2];
|
||||
@@ -205,7 +206,6 @@ MACRLCs = (
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
# ulsch_max_frame_inactivity = 0;
|
||||
pusch_TargetSNRx10 = 150;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
dl_max_mcs = 9;
|
||||
|
||||
@@ -24,6 +24,7 @@ gNBs =
|
||||
pusch_AntennaPorts = 2;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1;
|
||||
uess_agg_levels = [4,2,0,0,0];
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
@@ -139,9 +140,9 @@ gNBs =
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 5;
|
||||
nrofDownlinkSlots = 2;
|
||||
nrofDownlinkSlots = 1;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSlots = 3;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -20;
|
||||
@@ -178,11 +179,12 @@ MACRLCs = (
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 300;
|
||||
pucch_TargetSNRx10 = 300;
|
||||
ulsch_max_frame_inactivity = 0;
|
||||
pusch_TargetSNRx10 = 320;
|
||||
pucch_TargetSNRx10 = 320;
|
||||
pusch_FailureThres = 100;
|
||||
ul_max_mcs = 28;
|
||||
ul_max_mcs = 28;
|
||||
ul_bler_target_upper = 0.20;
|
||||
ul_bler_target_lower = 0.10;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -175,7 +175,6 @@ MACRLCs = (
|
||||
pusch_TargetSNRx10 = 270;
|
||||
pucch_TargetSNRx10 = 270;
|
||||
pusch_FailureThres = 1000;
|
||||
ulsch_max_frame_inactivity = 0;
|
||||
ul_max_mcs = 25;
|
||||
}
|
||||
);
|
||||
|
||||
@@ -112,7 +112,7 @@ gNBs =
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -70;
|
||||
p0_nominal = -80;
|
||||
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
@@ -175,7 +175,7 @@ MACRLCs = (
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 180;
|
||||
pusch_TargetSNRx10 = 150;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
}
|
||||
);
|
||||
@@ -184,7 +184,7 @@ L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 120;
|
||||
prach_dtx_threshold = 130;
|
||||
#pucch0_dtx_threshold = 150;
|
||||
}
|
||||
);
|
||||
@@ -198,7 +198,7 @@ RUs = (
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 65;
|
||||
max_rxgain = 70;
|
||||
eNB_instances = [0];
|
||||
sf_extension = 0
|
||||
sdr_addrs = "addr=192.168.80.52,clock_source=internal,time_source=internal"
|
||||
|
||||
@@ -145,64 +145,10 @@ gNBs =
|
||||
|
||||
);
|
||||
|
||||
# Dedicated Serving Cell Configuration
|
||||
servingCellConfigDedicated = ({
|
||||
# BWP-Downlink
|
||||
# BWP 1 Configuration
|
||||
dl_bwp-Id_1 = 1;
|
||||
dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_bwp1_subcarrierSpacing = 1;
|
||||
|
||||
# BWP 2 Configuration
|
||||
dl_bwp-Id_2 = 2;
|
||||
dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_bwp2_subcarrierSpacing = 1;
|
||||
|
||||
# BWP 3 Configuration
|
||||
dl_bwp-Id_3 = 3;
|
||||
dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_bwp3_subcarrierSpacing = 1;
|
||||
|
||||
firstActiveDownlinkBWP-Id = 1; #BWP-Id
|
||||
defaultDownlinkBWP-Id = 1; #BWP-Id
|
||||
|
||||
# bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
|
||||
# ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
|
||||
# ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
|
||||
# spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
|
||||
|
||||
# UplinkConfig
|
||||
# BWP-Uplink
|
||||
# BWP 1 Configuration
|
||||
ul_bwp-Id_1 = 1;
|
||||
ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_bwp1_subcarrierSpacing = 1;
|
||||
|
||||
# BWP 2 Configuration
|
||||
ul_bwp-Id_2 = 2;
|
||||
ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_bwp2_subcarrierSpacing = 1;
|
||||
|
||||
# BWP 3 Configuration
|
||||
ul_bwp-Id_3 = 3;
|
||||
ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_bwp3_subcarrierSpacing = 1;
|
||||
|
||||
firstActiveUplinkBWP-Id = 1; #BWP-Id
|
||||
}
|
||||
);
|
||||
first_active_bwp = 1;
|
||||
bwp_list = ({ scs = 1; bwpStart = 0; bwpSize = 106;},
|
||||
{ scs = 1; bwpStart = 0; bwpSize = 51;},
|
||||
{ scs = 1; bwpStart = 0; bwpSize = 24;});
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
@@ -233,7 +179,6 @@ MACRLCs = (
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 250;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
ulsch_max_frame_inactivity = 0;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
54
ci-scripts/conf_files/neighbour-config-ho.conf
Normal file
54
ci-scripts/conf_files/neighbour-config-ho.conf
Normal file
@@ -0,0 +1,54 @@
|
||||
neighbour_list = (
|
||||
{
|
||||
nr_cellid = 12345678;
|
||||
neighbour_cell_configuration = (
|
||||
{
|
||||
gNB_ID = 0xe01;
|
||||
nr_cellid = 11111111;
|
||||
physical_cellId = 1;
|
||||
absoluteFrequencySSB = 629376;
|
||||
subcarrierSpacing = 1; #30 KHz
|
||||
band = 78;
|
||||
plmn = { mcc = 001; mnc = 03; mnc_length = 2};
|
||||
tracking_area_code = 1;
|
||||
}
|
||||
)
|
||||
},
|
||||
{
|
||||
nr_cellid = 11111111;
|
||||
neighbour_cell_configuration = (
|
||||
{
|
||||
gNB_ID = 0xe00;
|
||||
nr_cellid = 12345678;
|
||||
physical_cellId = 0;
|
||||
absoluteFrequencySSB = 629376;
|
||||
subcarrierSpacing = 1; #30 KHz
|
||||
band = 78;
|
||||
plmn = { mcc = 001; mnc = 03; mnc_length = 2};
|
||||
tracking_area_code = 1;
|
||||
}
|
||||
)
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
nr_measurement_configuration = {
|
||||
Periodical = {
|
||||
enable = 1;
|
||||
includeBeamMeasurements = 1;
|
||||
maxNrofRS_IndexesToReport = 4;
|
||||
};
|
||||
|
||||
A2 = {
|
||||
enable = 1;
|
||||
threshold = 110;
|
||||
timeToTrigger = 1;
|
||||
};
|
||||
|
||||
A3 = ({
|
||||
cell_id = -1; #Default
|
||||
offset = 10;
|
||||
hysteresis = 0;
|
||||
timeToTrigger = 1
|
||||
})
|
||||
};
|
||||
@@ -1,52 +1,51 @@
|
||||
neighbour_list = (
|
||||
{
|
||||
nr_cellid = 1;
|
||||
neighbour_cell_configuration = (
|
||||
{
|
||||
gNB_ID = 0xb00;
|
||||
nr_cellid = 2;
|
||||
physical_cellId = 0x002;
|
||||
absoluteFrequencySSB = 641280 ;
|
||||
subcarrierSpacing = 1; #30 KHz
|
||||
plmn = { mcc = 216; mnc = 03; mnc_length = 2};
|
||||
tracking_area_code = 2;
|
||||
},
|
||||
{
|
||||
gNB_ID = 0xa00;
|
||||
nr_cellid = 3;
|
||||
physical_cellId = 0x003;
|
||||
absoluteFrequencySSB = 641280 ;
|
||||
subcarrierSpacing = 1; #30 KHz
|
||||
plmn = { mcc = 999; mnc = 99; mnc_length = 2};
|
||||
tracking_area_code = 3;
|
||||
},
|
||||
{
|
||||
gNB_ID = 0xc00;
|
||||
nr_cellid = 4;
|
||||
physical_cellId = 0x004;
|
||||
absoluteFrequencySSB = 641280 ;
|
||||
subcarrierSpacing = 1; #30 KHz
|
||||
plmn = { mcc = 999; mnc = 99; mnc_length = 2};
|
||||
tracking_area_code = 4;
|
||||
}
|
||||
)
|
||||
},
|
||||
{
|
||||
nr_cellid = 2;
|
||||
neighbour_cell_configuration = (
|
||||
{
|
||||
gNB_ID = 0xe00;
|
||||
nr_cellid = 1;
|
||||
physical_cellId = 0x000;
|
||||
absoluteFrequencySSB = 641280 ;
|
||||
subcarrierSpacing = 1; #30 KHz
|
||||
plmn = { mcc = 001; mnc = 01; mnc_length = 2};
|
||||
tracking_area_code = 1;
|
||||
}
|
||||
)
|
||||
}
|
||||
);
|
||||
############################################################
|
||||
# gNB-to-gNB neighbour list + measurement configuration #
|
||||
# for the 2-cell rfsim setup (gNB_ID 0xe00 & 0xb00) #
|
||||
############################################################
|
||||
|
||||
neighbour_list = (
|
||||
##########################################################
|
||||
# Entry USED BY gNB_ID = 0xe00 (nr_cellid = 1) #
|
||||
##########################################################
|
||||
{
|
||||
nr_cellid = 0; # Serving cell of gNB 0xe00
|
||||
neighbour_cell_configuration = (
|
||||
{
|
||||
gNB_ID = 0xb00;
|
||||
nr_cellid = 1; # Cell served by gNB 0xb00
|
||||
physical_cellId = 1;
|
||||
absoluteFrequencySSB= 621312;
|
||||
subcarrierSpacing = 1; # 30 kHz
|
||||
band = 78;
|
||||
plmn = { mcc = 208; mnc = 99; mnc_length = 2 };
|
||||
tracking_area_code = 1;
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
##########################################################
|
||||
# Entry USED BY gNB_ID = 0xb00 (nr_cellid = 2) #
|
||||
##########################################################
|
||||
{
|
||||
nr_cellid = 1; # Serving cell of gNB 0xb00
|
||||
neighbour_cell_configuration = (
|
||||
{
|
||||
gNB_ID = 0xe00;
|
||||
nr_cellid = 0; # Cell served by gNB 0xe00
|
||||
physical_cellId = 0;
|
||||
absoluteFrequencySSB= 641280;
|
||||
subcarrierSpacing = 1; # 30 kHz
|
||||
band = 78;
|
||||
plmn = { mcc = 208; mnc = 99; mnc_length = 2 };
|
||||
tracking_area_code = 1;
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
############################################################
|
||||
# Common NR measurement-event configuration #
|
||||
############################################################
|
||||
|
||||
nr_measurement_configuration = {
|
||||
Periodical = {
|
||||
|
||||
@@ -24,27 +24,23 @@
|
||||
# Valid for Ubuntu 24.04
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
FROM nvidia/cuda:13.0.0-cudnn-devel-ubuntu24.04 AS cuda-image
|
||||
|
||||
FROM ran-base:develop AS ran-tests
|
||||
|
||||
RUN apt-get update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||
libgtest-dev \
|
||||
libyaml-cpp-dev
|
||||
#RUN apt-get update && \
|
||||
# DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
||||
# DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||
# libgtest-dev \
|
||||
# libyaml-cpp-dev
|
||||
|
||||
RUN rm -Rf /oai-ran
|
||||
|
||||
|
||||
COPY --from=cuda-image /usr/local/cuda/ /usr/local/cuda/
|
||||
|
||||
# Set the LD_LIBRARY_PATH to ensure the system can find the copied libraries.
|
||||
# This is crucial for applications that use CUDA.
|
||||
ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/targets/x86_64-linux/lib
|
||||
ENV PATH=/usr/local/cuda/bin:$PATH
|
||||
ENV C_INCLUDE_PATH=/usr/local/cuda/include
|
||||
|
||||
WORKDIR /oai-ran
|
||||
COPY . .
|
||||
|
||||
WORKDIR /oai-ran/build
|
||||
RUN cmake -GNinja -DENABLE_TESTS=ON -DCMAKE_CUDA_ARCHITECTURES=75 -DCUDA_ENABLE=ON -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . --target test_channel_scalability
|
||||
# TODO should SANITIZE be ON? it makes it compile much longer
|
||||
RUN cmake -GNinja -DENABLE_PHYSIM_TESTS=ON \
|
||||
-DSANITIZE_UNDEFINED=OFF -DSANITIZE_ADDRESS=OFF \
|
||||
-DCMAKE_C_FLAGS=-Werror -DCMAKE_CXX_FLAGS=-Werror \
|
||||
.. && \
|
||||
ninja ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim nr_psbchsim
|
||||
@@ -242,10 +242,22 @@ def ExecuteActionWithParam(action, ctx):
|
||||
st = test.findtext('idle_sleep_time_in_sec') or "5"
|
||||
success = cls_oaicitest.IdleSleep(HTML, int(st))
|
||||
|
||||
elif action == 'Deploy_Run_PhySim':
|
||||
elif action == 'Deploy_Run_OC_PhySim':
|
||||
oc_release = test.findtext('oc_release')
|
||||
node = test.findtext('node') or None
|
||||
success = CLUSTER.deploy_oc_physim(ctx, HTML, oc_release, node)
|
||||
script = "scripts/oc-deploy-physims.sh"
|
||||
image_tag = cls_containerize.CreateTag(CLUSTER.ranCommitID, CLUSTER.ranBranch, CLUSTER.ranAllowMerge)
|
||||
options = f"oaicicd-core-for-ci-ran {oc_release} {image_tag} {CLUSTER.eNBSourceCodePath}"
|
||||
workdir = CLUSTER.eNBSourceCodePath
|
||||
success = cls_oaicitest.Deploy_Physim(ctx, HTML, node, workdir, script, options)
|
||||
|
||||
elif action == 'Build_Deploy_Docker_PhySim' or action == 'Build_Deploy_Source_PhySim':
|
||||
node = test.findtext('node') or None
|
||||
ctest_opt = test.findtext('ctest-opt') or ''
|
||||
script = "scripts/docker-build-and-deploy-physims.sh" if action == 'Build_Deploy_Docker_PhySim' else 'scripts/source-deploy-physims.sh'
|
||||
options = f"{CONTAINERS.eNBSourceCodePath} {ctest_opt}"
|
||||
workdir = CONTAINERS.eNBSourceCodePath
|
||||
success = cls_oaicitest.Deploy_Physim(ctx, HTML, node, workdir, script, options)
|
||||
|
||||
elif action == 'DeployCoreNetwork' or action == 'UndeployCoreNetwork':
|
||||
cn_id = test.findtext('cn_id')
|
||||
@@ -274,13 +286,6 @@ def ExecuteActionWithParam(action, ctx):
|
||||
return True
|
||||
success = CONTAINERS.Create_Workspace(node, HTML)
|
||||
|
||||
elif action == 'Run_Physim':
|
||||
physim_options = test.findtext('physim_run_args')
|
||||
physim_test = test.findtext('physim_test')
|
||||
physim_threshold = test.findtext('physim_time_threshold') or 'inf'
|
||||
node = test.findtext('node')
|
||||
success = cls_native.Native.Run_Physim(ctx, HTML, node, RAN.eNBSourceCodePath, physim_options, physim_test, physim_threshold)
|
||||
|
||||
elif action == 'LicenceAndFormattingCheck':
|
||||
node = test.findtext('node')
|
||||
success = SCA.LicenceAndFormattingCheck(ctx, node, HTML)
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
set -x
|
||||
|
||||
sudo mbimcli -p -d /dev/cdc-wdm0 --set-radio-state=off
|
||||
|
||||
IF=wwan0
|
||||
sudo ip link set ${IF} down
|
||||
sudo ip addr flush dev ${IF}
|
||||
|
||||
@@ -15,16 +15,18 @@ fi
|
||||
|
||||
# The script assumes you've build the following images:
|
||||
#
|
||||
# docker build . -f docker/Dockerfile.gNB.ubuntu22 -t oai-gnb
|
||||
# docker build . -f docker/Dockerfile.nrUE.ubuntu22 -t oai-nr-ue
|
||||
# docker build . -f docker/Dockerfile.gNB.ubuntu -t oai-gnb
|
||||
# docker build . -f docker/Dockerfile.nr-cuup.ubuntu -t oai-nr-cuup
|
||||
# docker build . -f docker/Dockerfile.nrUE.ubuntu -t oai-nr-ue
|
||||
#
|
||||
# The images above depend on the following images:
|
||||
#
|
||||
# docker build . -f docker/Dockerfile.build.ubuntu22 -t ran-build
|
||||
# dokcer build . -f docker/Dockerfile.base.ubuntu22 -t ran-base
|
||||
# docker build . -f docker/Dockerfile.build.ubuntu -t ran-build
|
||||
# docker build . -f docker/Dockerfile.base.ubuntu -t ran-base
|
||||
|
||||
docker tag oai-nr-ue oai-ci/oai-nr-ue:develop-${SHORT_COMMIT_SHA}
|
||||
docker tag oai-gnb oai-ci/oai-gnb:develop-${SHORT_COMMIT_SHA}
|
||||
docker tag oai-nr-cuup oai-ci/oai-nr-cuup:develop-${SHORT_COMMIT_SHA}
|
||||
|
||||
python3 main.py --mode=InitiateHtml --ranRepository=NONE --ranBranch=${CURRENT_BRANCH} \
|
||||
--ranCommitID=${COMMIT_SHA} --ranAllowMerge=false \
|
||||
|
||||
46
ci-scripts/scripts/docker-build-and-deploy-physims.sh
Executable file
46
ci-scripts/scripts/docker-build-and-deploy-physims.sh
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/bin/bash
|
||||
|
||||
function die() { echo $@; exit 1; }
|
||||
[ $# -ge 1 ] || die "usage: $0 <directory> [ctest-options]"
|
||||
|
||||
IMAGE=ran-physimtests:ci-temp
|
||||
CONTAINER=ran-physimtests
|
||||
function cleanup-docker() {
|
||||
docker stop ${CONTAINER}
|
||||
docker rm ${CONTAINER}
|
||||
docker rmi ${IMAGE}
|
||||
docker volume prune --force
|
||||
}
|
||||
trap cleanup-docker EXIT
|
||||
|
||||
set -x
|
||||
DIR=$1
|
||||
RESULT_DIR=${DIR}/
|
||||
shift
|
||||
CTEST_OPT=$@
|
||||
|
||||
# build physims
|
||||
docker build --progress=plain --tag ${IMAGE} --file ${DIR}/ci-scripts/docker/Dockerfile.physim.ubuntu ${DIR} &>> ${RESULT_DIR}/physim_log.txt
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "build of physims failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# get a JSON description of all tests to run
|
||||
docker run -a STDOUT --workdir /oai-ran/build/ --env LD_LIBRARY_PATH=/oai-ran/build/ --rm --name ${CONTAINER} ${IMAGE} ctest ${CTEST_OPT} --show-only=json-v1 &> ${RESULT_DIR}/desc-tests.json
|
||||
JSON_RES=$?
|
||||
|
||||
# run the actual tests: we don't suppy --rm as we have to copy the files
|
||||
# similar to unit tests, we can't mount the file where we write physims-5g-run.xml to
|
||||
# as it would write a file as root, but this script is run as a normal user
|
||||
docker run -a STDOUT --workdir /oai-ran/build/ --env LD_LIBRARY_PATH=/oai-ran/build/ --name ${CONTAINER} ${IMAGE} ctest ${CTEST_OPT} --output-junit results-run.xml --test-output-size-passed 100000 --test-output-size-failed 100000 &>> ${RESULT_DIR}/physim_log.txt
|
||||
RUN_RES=$?
|
||||
docker cp ${CONTAINER}:/oai-ran/build/results-run.xml ${RESULT_DIR}/
|
||||
docker cp ${CONTAINER}:/oai-ran/build/Testing/Temporary/LastTestsFailed.log ${RESULT_DIR}/
|
||||
docker cp ${CONTAINER}:/oai-ran/build/Testing/Temporary/LastTest.log ${RESULT_DIR}/
|
||||
|
||||
# if both were successful, return 0
|
||||
# TODO not sure
|
||||
#[[ $JSON_RES -eq 0 && $RUN_RES -eq 0 ]] && exit 0
|
||||
|
||||
exit 0
|
||||
@@ -13,21 +13,22 @@ OAI_DIR=${4}
|
||||
cat /opt/oc-password | oc login -u oaicicd --server https://api.oai.cs.eurecom.fr:6443 > /dev/null
|
||||
oc project ${OC_NS} > /dev/null
|
||||
oc tag oaicicd-ran/oai-physim:${IMG_TAG} ${OC_NS}/oai-physim:${IMG_TAG}
|
||||
helm install ${OC_RELEASE} ${OAI_DIR}/charts/${OC_RELEASE} --set global.image.version=${IMG_TAG} --wait
|
||||
helm install ${OC_RELEASE} ${OAI_DIR}/charts/${OC_RELEASE} --set global.image.version=${IMG_TAG} --wait --timeout 120s
|
||||
POD_ID=$(oc get pods | grep oai-${OC_RELEASE} | awk '{print $1}')
|
||||
sleep 10
|
||||
echo "Monitoring logs for 'FINISHED' in pod '$POD_ID'"
|
||||
oc logs -f -n ${OC_NS} "$POD_ID" | while read -r line; do
|
||||
if [[ "$line" == *"FINISHED"* ]]; then
|
||||
echo "'FINISHED' detected in logs. Copying logs..."
|
||||
oc logs -n ${OC_NS} "$POD_ID" >> ${OAI_DIR}/ci-scripts/physim_log.txt
|
||||
oc describe pod $POD_ID >> ${OAI_DIR}/ci-scripts/physim_pods_summary.txt
|
||||
oc cp "$POD_ID":/opt/oai-physim/Testing/Temporary/LastTestsFailed.log ${OAI_DIR}/ci-scripts/LastTestsFailed.log
|
||||
oc cp "$POD_ID":/opt/oai-physim/${OC_RELEASE}-tests.json ${OAI_DIR}/ci-scripts/${OC_RELEASE}-tests.json
|
||||
oc cp "$POD_ID":/opt/oai-physim/${OC_RELEASE}-run.xml ${OAI_DIR}/ci-scripts/${OC_RELEASE}-run.xml
|
||||
oc cp "$POD_ID":/opt/oai-physim/Testing/Temporary/LastTestsFailed.log ${OAI_DIR}/LastTestsFailed.log
|
||||
oc cp "$POD_ID":/opt/oai-physim/Testing/Temporary/LastTest.log ${OAI_DIR}/LastTest.log
|
||||
oc cp "$POD_ID":/opt/oai-physim/${OC_RELEASE}-tests.json ${OAI_DIR}/desc-tests.json
|
||||
oc cp "$POD_ID":/opt/oai-physim/${OC_RELEASE}-run.xml ${OAI_DIR}/results-run.xml
|
||||
break
|
||||
fi
|
||||
done
|
||||
oc logs -n ${OC_NS} "$POD_ID" >> ${OAI_DIR}/physim_log.txt
|
||||
oc describe pod $POD_ID >> ${OAI_DIR}/physim_log.txt
|
||||
helm uninstall ${OC_RELEASE} --wait
|
||||
oc delete istag oai-physim:${IMG_TAG} -n ${OC_NS}
|
||||
oc logout > /dev/null
|
||||
|
||||
30
ci-scripts/scripts/source-deploy-physims.sh
Normal file
30
ci-scripts/scripts/source-deploy-physims.sh
Normal file
@@ -0,0 +1,30 @@
|
||||
|
||||
function die() { echo $@; exit 1; }
|
||||
[ $# -ge 1 ] || die "usage: $0 <directory> [ctest-options]"
|
||||
|
||||
set -x
|
||||
DIR=$1
|
||||
shift
|
||||
CTEST_OPT=$@
|
||||
|
||||
cd ${DIR}/cmake_targets/ran_build/build
|
||||
ninja ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim nr_psbchsim
|
||||
|
||||
# get a JSON description of all tests to run
|
||||
ctest ${CTEST_OPT} --show-only=json-v1 &> ${DIR}/desc-tests.json
|
||||
JSON_RES=$?
|
||||
|
||||
# we run the T2 offload tests, so provide some additional permissions
|
||||
# to be able to initialize DPDK
|
||||
sudo setcap cap_dac_override,cap_sys_admin+ep nr_ulsim
|
||||
sudo setcap cap_dac_override,cap_sys_admin+ep nr_dlsim
|
||||
ctest ${CTEST_OPT} --output-junit ${DIR}/results-run.xml --test-output-size-passed 100000 --test-output-size-failed 100000 &>> ${DIR}/physim_log.txt
|
||||
RUN_RES=$?
|
||||
cp Testing/Temporary/LastTestsFailed.log ${DIR}/
|
||||
cp Testing/Temporary/LastTest.log ${DIR}/
|
||||
|
||||
# if both were successful, return 0
|
||||
# TODO not sure
|
||||
#[[ $JSON_RES -eq 0 && $RUN_RES -eq 0 ]] && exit 0
|
||||
|
||||
exit 0
|
||||
17
ci-scripts/scripts/sys-info.sh
Executable file
17
ci-scripts/scripts/sys-info.sh
Executable file
@@ -0,0 +1,17 @@
|
||||
CORES=$(nproc)
|
||||
MODEL=$(lscpu | awk -F: '/Model name/ {print $2; exit}' | xargs)
|
||||
MAX_FREQ=$(lscpu | awk -F: '/CPU max MHz/ {printf "%.2f MHz", $2; exit}')
|
||||
CURRENT_FREQ=$(awk -F: '/cpu MHz/ {printf " %.2f MHz", $2; exit}' /proc/cpuinfo)
|
||||
RAM=$(free -h --si | awk '/Mem:/ {print $2}')
|
||||
# sudo -n: non-interactive, will silently fail in case we don't have privileges
|
||||
DMID=$(sudo -n dmidecode -t memory 2>/dev/null)
|
||||
if [ $? -eq 0 ]; then
|
||||
RAM_TYPE=$(echo "$DMID" | awk -F: '/Type:/ {print $2}' | grep -Ev 'Unknown|Other|None' | head -1 | xargs)
|
||||
else
|
||||
RAM_TYPE="can't query"
|
||||
fi
|
||||
|
||||
|
||||
echo "CPU: model ${MODEL}"
|
||||
echo "${CORES} cores, max CPU freq ${MAX_FREQ}, current ${CURRENT_FREQ}"
|
||||
echo "RAM ${RAM} type ${RAM_TYPE}"
|
||||
@@ -36,17 +36,20 @@ class TestCmd(unittest.TestCase):
|
||||
self.assertEqual(ret.stdout, "test")
|
||||
|
||||
def test_local_script(self):
|
||||
ret = cls_cmd.runScript("localhost", "tests/scripts/hello-world.sh", 1)
|
||||
with cls_cmd.getConnection("localhost") as ssh:
|
||||
ret = ssh.exec_script("tests/scripts/hello-world.sh", 1)
|
||||
self.assertEqual(ret.args, "tests/scripts/hello-world.sh")
|
||||
self.assertEqual(ret.returncode, 0)
|
||||
self.assertEqual(ret.stdout, "+ echo hello, world\nhello, world")
|
||||
|
||||
ret = cls_cmd.runScript("localhost", "tests/scripts/hello-fail.sh", 1, "TESTFAIL")
|
||||
with cls_cmd.getConnection("localhost") as ssh:
|
||||
ret = ssh.exec_script("tests/scripts/hello-fail.sh", 1, "TESTFAIL")
|
||||
self.assertEqual(ret.args, "tests/scripts/hello-fail.sh TESTFAIL")
|
||||
self.assertEqual(ret.returncode, 1)
|
||||
self.assertEqual(ret.stdout, "TESTFAIL")
|
||||
|
||||
ret = cls_cmd.runScript("localhost", "tests/scripts/hello-fail.sh", 1, "TESTFAIL2", "/tmp/result")
|
||||
with cls_cmd.getConnection("localhost") as ssh:
|
||||
ret = ssh.exec_script("tests/scripts/hello-fail.sh", 1, "TESTFAIL2", "/tmp/result")
|
||||
self.assertEqual(ret.args, "tests/scripts/hello-fail.sh TESTFAIL2 &> /tmp/result")
|
||||
self.assertEqual(ret.returncode, 1)
|
||||
self.assertEqual(ret.stdout, "")
|
||||
@@ -75,17 +78,20 @@ class TestCmd(unittest.TestCase):
|
||||
|
||||
@unittest.skip("need to be able to passwordlessly SSH to localhost, also disable stty -ixon")
|
||||
def test_remote_script(self):
|
||||
ret = cls_cmd.runScript("127.0.0.1", "tests/scripts/hello-world.sh", 1)
|
||||
with cls_cmd.getConnection("127.0.0.1") as ssh:
|
||||
ret = ssh.exec_script("tests/scripts/hello-world.sh", 1)
|
||||
self.assertEqual(ret.args, "tests/scripts/hello-world.sh")
|
||||
self.assertEqual(ret.returncode, 0)
|
||||
self.assertEqual(ret.stdout, "+ echo hello, world\nhello, world")
|
||||
|
||||
ret = cls_cmd.runScript("127.0.0.1", "tests/scripts/hello-fail.sh", 1, "TESTFAIL")
|
||||
with cls_cmd.getConnection("127.0.0.1") as ssh:
|
||||
ret = ssh.exec_script("tests/scripts/hello-fail.sh", 1, "TESTFAIL")
|
||||
self.assertEqual(ret.args, "tests/scripts/hello-fail.sh TESTFAIL")
|
||||
self.assertEqual(ret.returncode, 1)
|
||||
self.assertEqual(ret.stdout, "TESTFAIL")
|
||||
|
||||
ret = cls_cmd.runScript("127.0.0.1", "tests/scripts/hello-fail.sh", 1, "TESTFAIL2", "/tmp/result")
|
||||
with cls_cmd.getConnection("127.0.0.1") as ssh:
|
||||
ret = ssh.exec_script("tests/scripts/hello-fail.sh", 1, "TESTFAIL2", "/tmp/result")
|
||||
self.assertEqual(ret.args, "tests/scripts/hello-fail.sh TESTFAIL2 &> /tmp/result")
|
||||
self.assertEqual(ret.returncode, 1)
|
||||
self.assertEqual(ret.stdout, "")
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
# --- Test Suite 1: Scalability vs. Channel Count ---
|
||||
Channels_16_Batch:
|
||||
'Total GPU Time (us)': 5265.72
|
||||
'Avg Time per Channel - GPU (us)': 329.11
|
||||
'Threshold': 100.00
|
||||
|
||||
Channels_16_Stream:
|
||||
'Total GPU Time (us)': 5265.72
|
||||
'Avg Time per Channel - GPU (us)': 329.11
|
||||
'Threshold': 100.00
|
||||
|
||||
Channels_16_Serial:
|
||||
'Total GPU Time (us)': 5265.72
|
||||
'Avg Time per Channel - GPU (us)': 329.11
|
||||
'Threshold': 100.00
|
||||
|
||||
Channels_256_Batch:
|
||||
'Total GPU Time (us)': 85696.71
|
||||
'Avg Time per Channel - GPU (us)': 334.75
|
||||
'Threshold': 100.00
|
||||
|
||||
Channels_256_Stream:
|
||||
'Total GPU Time (us)': 85696.71
|
||||
'Avg Time per Channel - GPU (us)': 334.75
|
||||
'Threshold': 100.00
|
||||
|
||||
Channels_256_Serial:
|
||||
'Total GPU Time (us)': 85696.71
|
||||
'Avg Time per Channel - GPU (us)': 334.75
|
||||
'Threshold': 100.00
|
||||
|
||||
Channels_1024_Batch:
|
||||
'Total GPU Time (us)': 337217.10
|
||||
'Avg Time per Channel - GPU (us)': 329.31
|
||||
'Threshold': 100.00
|
||||
|
||||
Channels_1024_Stream:
|
||||
'Total GPU Time (us)': 337217.10
|
||||
'Avg Time per Channel - GPU (us)': 329.31
|
||||
'Threshold': 100.00
|
||||
|
||||
Channels_1024_Serial:
|
||||
'Total GPU Time (us)': 337217.10
|
||||
'Avg Time per Channel - GPU (us)': 329.31
|
||||
'Threshold': 100.00
|
||||
|
||||
# --- Test Suite 2: Performance vs. Channel Complexity ---
|
||||
Length_16_Batch:
|
||||
'Total GPU Time (us)': 319082.56
|
||||
'Avg Time per Channel - GPU (us)': 311.60
|
||||
'Threshold': 100.00
|
||||
|
||||
Length_16_Stream:
|
||||
'Total GPU Time (us)': 319082.56
|
||||
'Avg Time per Channel - GPU (us)': 311.60
|
||||
'Threshold': 100.00
|
||||
|
||||
Length_16_Serial:
|
||||
'Total GPU Time (us)': 319082.56
|
||||
'Avg Time per Channel - GPU (us)': 311.60
|
||||
'Threshold': 100.00
|
||||
|
||||
Length_64_Batch:
|
||||
'Total GPU Time (us)': 366564.52
|
||||
'Avg Time per Channel - GPU (us)': 357.97
|
||||
'Threshold': 100.00
|
||||
|
||||
Length_64_Stream:
|
||||
'Total GPU Time (us)': 366564.52
|
||||
'Avg Time per Channel - GPU (us)': 357.97
|
||||
'Threshold': 100.00
|
||||
|
||||
Length_64_Serial:
|
||||
'Total GPU Time (us)': 366564.52
|
||||
'Avg Time per Channel - GPU (us)': 357.97
|
||||
'Threshold': 100.00
|
||||
|
||||
Length_128_Batch:
|
||||
'Total GPU Time (us)': 425883.51
|
||||
'Avg Time per Channel - GPU (us)': 415.90
|
||||
'Threshold': 100.00
|
||||
|
||||
Length_128_Stream:
|
||||
'Total GPU Time (us)': 425883.51
|
||||
'Avg Time per Channel - GPU (us)': 415.90
|
||||
'Threshold': 100.00
|
||||
|
||||
Length_128_Serial:
|
||||
'Total GPU Time (us)': 425883.51
|
||||
'Avg Time per Channel - GPU (us)': 415.90
|
||||
'Threshold': 100.00
|
||||
|
||||
# --- Test Suite 3: Performance vs. MIMO Configuration ---
|
||||
MIMO_2x2_Batch:
|
||||
'Total GPU Time (us)': 158999.06
|
||||
'Avg Time per Channel - GPU (us)': 155.27
|
||||
'Threshold': 100.00
|
||||
|
||||
MIMO_2x2_Stream:
|
||||
'Total GPU Time (us)': 158999.06
|
||||
'Avg Time per Channel - GPU (us)': 155.27
|
||||
'Threshold': 100.00
|
||||
|
||||
MIMO_2x2_Serial:
|
||||
'Total GPU Time (us)': 158999.06
|
||||
'Avg Time per Channel - GPU (us)': 155.27
|
||||
'Threshold': 100.00
|
||||
|
||||
MIMO_4x4_Batch:
|
||||
'Total GPU Time (us)': 336377.55
|
||||
'Avg Time per Channel - GPU (us)': 328.49
|
||||
'Threshold': 100.00
|
||||
|
||||
MIMO_4x4_Stream:
|
||||
'Total GPU Time (us)': 336377.55
|
||||
'Avg Time per Channel - GPU (us)': 328.49
|
||||
'Threshold': 100.00
|
||||
|
||||
MIMO_4x4_Serial:
|
||||
'Total GPU Time (us)': 336377.55
|
||||
'Avg Time per Channel - GPU (us)': 328.49
|
||||
'Threshold': 100.00
|
||||
|
||||
MIMO_8x8_Batch:
|
||||
'Total GPU Time (us)': 718312.46
|
||||
'Avg Time per Channel - GPU (us)': 701.48
|
||||
'Threshold': 100.00
|
||||
|
||||
MIMO_8x8_Stream:
|
||||
'Total GPU Time (us)': 718312.46
|
||||
'Avg Time per Channel - GPU (us)': 701.48
|
||||
'Threshold': 100.00
|
||||
|
||||
MIMO_8x8_Serial:
|
||||
'Total GPU Time (us)': 718312.46
|
||||
'Avg Time per Channel - GPU (us)': 701.48
|
||||
'Threshold': 100.00
|
||||
|
||||
# --- Test Suite 4: Performance vs. Signal Samples ---
|
||||
Samples_30720_Batch:
|
||||
'Total GPU Time (us)': 84702.49
|
||||
'Avg Time per Channel - GPU (us)': 82.72
|
||||
'Threshold': 100.00
|
||||
|
||||
Samples_30720_Stream:
|
||||
'Total GPU Time (us)': 84702.49
|
||||
'Avg Time per Channel - GPU (us)': 82.72
|
||||
'Threshold': 100.00
|
||||
|
||||
Samples_30720_Serial:
|
||||
'Total GPU Time (us)': 84702.49
|
||||
'Avg Time per Channel - GPU (us)': 82.72
|
||||
'Threshold': 100.00
|
||||
|
||||
Samples_61440_Batch:
|
||||
'Total GPU Time (us)': 168761.94
|
||||
'Avg Time per Channel - GPU (us)': 164.81
|
||||
'Threshold': 100.00
|
||||
|
||||
Samples_61440_Stream:
|
||||
'Total GPU Time (us)': 168761.94
|
||||
'Avg Time per Channel - GPU (us)': 164.81
|
||||
'Threshold': 100.00
|
||||
|
||||
Samples_61440_Serial:
|
||||
'Total GPU Time (us)': 168761.94
|
||||
'Avg Time per Channel - GPU (us)': 164.81
|
||||
'Threshold': 100.00
|
||||
|
||||
Samples_122880_Batch:
|
||||
'Total GPU Time (us)': 336500.40
|
||||
'Avg Time per Channel - GPU (us)': 328.61
|
||||
'Threshold': 100.00
|
||||
|
||||
Samples_122880_Stream:
|
||||
'Total GPU Time (us)': 336500.40
|
||||
'Avg Time per Channel - GPU (us)': 328.61
|
||||
'Threshold': 100.00
|
||||
|
||||
Samples_122880_Serial:
|
||||
'Total GPU Time (us)': 336500.40
|
||||
'Avg Time per Channel - GPU (us)': 328.61
|
||||
'Threshold': 100.00
|
||||
65
ci-scripts/tests/nr_physim_gpu_benchmark/gpu_test_driver.py
Normal file
65
ci-scripts/tests/nr_physim_gpu_benchmark/gpu_test_driver.py
Normal file
@@ -0,0 +1,65 @@
|
||||
import argparse
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import yaml
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Test driver for the GPU benchmark suite.")
|
||||
parser.add_argument("--executable", required=True, help="Path to the test_channel_scalability executable")
|
||||
cli_args = parser.parse_args()
|
||||
|
||||
script_dir = os.path.dirname(os.path.realpath(__file__))
|
||||
matrix_file_path = os.path.join(script_dir, "gpu_test_matrix.yaml")
|
||||
|
||||
try:
|
||||
with open(matrix_file_path) as f:
|
||||
test_matrix = yaml.safe_load(f)
|
||||
except FileNotFoundError:
|
||||
print(f"ERROR: Test matrix file not found at {matrix_file_path}")
|
||||
sys.exit(1)
|
||||
|
||||
failed_tests = []
|
||||
|
||||
for test_case in test_matrix["tests"]:
|
||||
name = test_case["name"]
|
||||
args = test_case["args"]
|
||||
|
||||
print(f"\n{'='*80}")
|
||||
print(f"--- Running Test Case: {name} ---")
|
||||
print(f"{'='*80}\n")
|
||||
|
||||
command = [
|
||||
"python3",
|
||||
os.path.join(script_dir, "run_gpu_benchmark.py"),
|
||||
"--executable",
|
||||
cli_args.executable,
|
||||
"--args",
|
||||
args,
|
||||
"--test-case-name",
|
||||
name,
|
||||
]
|
||||
|
||||
result = subprocess.run(command)
|
||||
|
||||
if result.returncode != 0:
|
||||
print(f"\n--- !!! Test Case FAILED: {name} !!! ---\n")
|
||||
failed_tests.append(name)
|
||||
else:
|
||||
print(f"\n--- Test Case PASSED: {name} ---\n")
|
||||
|
||||
print(f"\n{'='*80}")
|
||||
print("--- Test Suite Summary ---")
|
||||
if not failed_tests:
|
||||
print("\033[92mAll test cases PASSED.\033[0m")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print(f"\033[91mThe following {len(failed_tests)} test case(s) FAILED:\033[0m")
|
||||
for test_name in failed_tests:
|
||||
print(f" - {test_name}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,76 @@
|
||||
tests:
|
||||
# --- Test Suite 1: Scalability vs. Channel Count ---
|
||||
- name: "Channels_16_Batch"
|
||||
args: "-c 16 -t 4 -r 4 -s 122880 -l 32 -m batch -n 25"
|
||||
- name: "Channels_16_Stream"
|
||||
args: "-c 16 -t 4 -r 4 -s 122880 -l 32 -m stream -n 25"
|
||||
- name: "Channels_16_Serial"
|
||||
args: "-c 16 -t 4 -r 4 -s 122880 -l 32 -m serial -n 25"
|
||||
- name: "Channels_256_Batch"
|
||||
args: "-c 256 -t 4 -r 4 -s 122880 -l 32 -m batch -n 25"
|
||||
- name: "Channels_256_Stream"
|
||||
args: "-c 256 -t 4 -r 4 -s 122880 -l 32 -m stream -n 25"
|
||||
- name: "Channels_256_Serial"
|
||||
args: "-c 256 -t 4 -r 4 -s 122880 -l 32 -m serial -n 25"
|
||||
- name: "Channels_1024_Batch"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 32 -m batch -n 25"
|
||||
- name: "Channels_1024_Stream"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 32 -m stream -n 25"
|
||||
- name: "Channels_1024_Serial"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 32 -m serial -n 25"
|
||||
|
||||
# --- Test Suite 2: Performance vs. Channel Complexity ---
|
||||
- name: "Length_16_Batch"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 16 -m batch -n 25"
|
||||
- name: "Length_64_Batch"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 64 -m batch -n 25"
|
||||
- name: "Length_64_Stream"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 64 -m stream -n 25"
|
||||
- name: "Length_64_Serial"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 64 -m serial -n 25"
|
||||
- name: "Length_128_Batch"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 128 -m batch -n 25"
|
||||
- name: "Length_128_Stream"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 128 -m stream -n 25"
|
||||
- name: "Length_128_Serial"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 128 -m serial -n 25"
|
||||
|
||||
# --- Test Suite 3: Performance vs. MIMO Configuration ---
|
||||
- name: "MIMO_2x2_Batch"
|
||||
args: "-c 1024 -t 2 -r 2 -s 122880 -l 32 -m batch -n 25"
|
||||
- name: "MIMO_2x2_Stream"
|
||||
args: "-c 1024 -t 2 -r 2 -s 122880 -l 32 -m stream -n 25"
|
||||
- name: "MIMO_2x2_Serial"
|
||||
args: "-c 1024 -t 2 -r 2 -s 122880 -l 32 -m serial -n 25"
|
||||
- name: "MIMO_4x4_Batch"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 32 -m batch -n 25"
|
||||
- name: "MIMO_4x4_Stream"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 32 -m stream -n 25"
|
||||
- name: "MIMO_4x4_Serial"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 32 -m serial -n 25"
|
||||
- name: "MIMO_8x8_Batch"
|
||||
args: "-c 1024 -t 8 -r 8 -s 122880 -l 32 -m batch -n 25"
|
||||
- name: "MIMO_8x8_Stream"
|
||||
args: "-c 1024 -t 8 -r 8 -s 122880 -l 32 -m stream -n 25"
|
||||
- name: "MIMO_8x8_Serial"
|
||||
args: "-c 1024 -t 8 -r 8 -s 122880 -l 32 -m serial -n 25"
|
||||
|
||||
# --- Test Suite 4: Performance vs. Signal Samples ---
|
||||
- name: "Samples_30720_Batch"
|
||||
args: "-c 1024 -t 4 -r 4 -s 30720 -l 32 -m batch -n 25"
|
||||
- name: "Samples_30720_Stream"
|
||||
args: "-c 1024 -t 4 -r 4 -s 30720 -l 32 -m stream -n 25"
|
||||
- name: "Samples_30720_Serial"
|
||||
args: "-c 1024 -t 4 -r 4 -s 30720 -l 32 -m serial -n 25"
|
||||
- name: "Samples_61440_Batch"
|
||||
args: "-c 1024 -t 4 -r 4 -s 61440 -l 32 -m batch -n 25"
|
||||
- name: "Samples_61440_Stream"
|
||||
args: "-c 1024 -t 4 -r 4 -s 61440 -l 32 -m stream -n 25"
|
||||
- name: "Samples_61440_Serial"
|
||||
args: "-c 1024 -t 4 -r 4 -s 61440 -l 32 -m serial -n 25"
|
||||
- name: "Samples_122880_Batch"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 32 -m batch -n 25"
|
||||
- name: "Samples_122880_Stream"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 32 -m stream -n 25"
|
||||
- name: "Samples_122880_Serial"
|
||||
args: "-c 1024 -t 4 -r 4 -s 122880 -l 32 -m serial -n 25"
|
||||
130
ci-scripts/tests/nr_physim_gpu_benchmark/run_gpu_benchmark.py
Normal file
130
ci-scripts/tests/nr_physim_gpu_benchmark/run_gpu_benchmark.py
Normal file
@@ -0,0 +1,130 @@
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
import yaml
|
||||
|
||||
|
||||
def parse_benchmark_output(log_text):
|
||||
metrics = {}
|
||||
pattern = re.compile(r"\|\s*(?P<key>[\w\s\(\)\-]+?)\s*\|\s*(?P<value>[\d\.]+)x?\s*\|")
|
||||
for line in log_text.splitlines():
|
||||
match = pattern.search(line)
|
||||
if match:
|
||||
key = match.group("key").strip()
|
||||
value = float(match.group("value"))
|
||||
metrics[key] = value
|
||||
return metrics
|
||||
|
||||
|
||||
def analyze_gpu_log(log_file):
|
||||
util_vals, power_vals = [], []
|
||||
try:
|
||||
with open(log_file, "r") as f:
|
||||
for line in f:
|
||||
if "utilization.gpu" in line:
|
||||
continue
|
||||
parts = line.strip().split(",")
|
||||
if len(parts) >= 2:
|
||||
try:
|
||||
util_vals.append(float(parts[0].strip()))
|
||||
power_vals.append(float(parts[1].strip()))
|
||||
except (ValueError, IndexError):
|
||||
continue
|
||||
except FileNotFoundError:
|
||||
return "N/A", "N/A"
|
||||
if not util_vals or not power_vals:
|
||||
return "N/A", "N/A"
|
||||
avg_util = sum(util_vals) / len(util_vals)
|
||||
max_util = max(util_vals)
|
||||
avg_power = sum(power_vals) / len(power_vals)
|
||||
max_power = max(power_vals)
|
||||
return (f"Avg: {avg_util:.1f}%, Max: {max_util:.1f}%", f"Avg: {avg_power:.1f}W, Max: {max_power:.1f}W")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Run a single GPU benchmark and compare against a baseline.")
|
||||
parser.add_argument("--executable", required=True, help="Path to the test_channel_scalability executable")
|
||||
parser.add_argument("--args", required=True, help="Arguments to pass to the executable, in quotes")
|
||||
parser.add_argument("--test-case-name", required=True, help="The name of the test case to look up in the baseline file")
|
||||
cli_args = parser.parse_args()
|
||||
|
||||
gpu_log_file = "nvidia-smi.log"
|
||||
monitor_command = f"nvidia-smi --query-gpu=utilization.gpu,power.draw --format=csv,noheader,nounits -l 1 > {gpu_log_file}"
|
||||
monitor_process = subprocess.Popen(monitor_command, shell=True)
|
||||
command = [cli_args.executable] + cli_args.args.split()
|
||||
print(f"Running command: {' '.join(command)}")
|
||||
result = subprocess.run(command, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||
monitor_process.terminate()
|
||||
time.sleep(1)
|
||||
|
||||
if result.returncode != 0:
|
||||
print("--- Benchmark FAILED to run ---")
|
||||
print(result.stdout)
|
||||
print(result.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
print("--- Benchmark Ran Successfully ---")
|
||||
print(result.stdout)
|
||||
|
||||
gpu_util_summary, gpu_power_summary = analyze_gpu_log(gpu_log_file)
|
||||
print("\n--- GPU Monitoring Summary ---")
|
||||
print(f"GPU Utilization: {gpu_util_summary}")
|
||||
print(f"GPU Power Draw: {gpu_power_summary}")
|
||||
|
||||
measured_metrics = parse_benchmark_output(result.stdout)
|
||||
if not measured_metrics:
|
||||
print("ERROR: Could not parse any metrics from the benchmark's text output.")
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
script_dir = os.path.dirname(os.path.realpath(__file__))
|
||||
baseline_file_path = os.path.join(script_dir, "gpu_performance_baselines.yaml")
|
||||
with open(baseline_file_path) as f:
|
||||
all_baselines = yaml.safe_load(f)
|
||||
except FileNotFoundError:
|
||||
print(f"ERROR: Master baseline file not found at {baseline_file_path}")
|
||||
sys.exit(1)
|
||||
|
||||
baseline_metrics = all_baselines.get(cli_args.test_case_name)
|
||||
if not baseline_metrics:
|
||||
print(f"ERROR: Could not find baseline entry for '{cli_args.test_case_name}' in {baseline_file_path}")
|
||||
sys.exit(1)
|
||||
|
||||
all_metrics_ok = True
|
||||
print("\n--- Performance Validation ---")
|
||||
for key, baseline_value in baseline_metrics.items():
|
||||
if key == "Threshold":
|
||||
continue
|
||||
|
||||
if key in measured_metrics:
|
||||
measured_value = measured_metrics[key]
|
||||
threshold = baseline_metrics.get("Threshold", 0.25)
|
||||
upper_bound = baseline_value * (1 + threshold)
|
||||
|
||||
print(f"Metric: '{key}'")
|
||||
print(f" - Measured: {measured_value:.2f}")
|
||||
print(f" - Baseline: {baseline_value:.2f}")
|
||||
print(f" - Allowed Upper Bound: {upper_bound:.2f}")
|
||||
|
||||
if measured_value > upper_bound:
|
||||
print(" - STATUS: \033[91mFAILED (Exceeded threshold)\033[0m")
|
||||
all_metrics_ok = False
|
||||
else:
|
||||
print(" - STATUS: \033[92mPASSED\033[0m")
|
||||
else:
|
||||
print(f"Metric '{key}' from baseline not found in run output. SKIPPING.")
|
||||
|
||||
if all_metrics_ok:
|
||||
print("\nOverall Performance: PASSED")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print("\nOverall Performance: FAILED due to regression.")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,7 +1,6 @@
|
||||
- Build_Proxy
|
||||
- Build_Cluster_Image
|
||||
- Pull_Cluster_Image
|
||||
- Run_Physim
|
||||
- Build_eNB
|
||||
- Initialize_eNB
|
||||
- Terminate_eNB
|
||||
@@ -23,7 +22,9 @@
|
||||
- Deploy_Object
|
||||
- Undeploy_Object
|
||||
- Cppcheck_Analysis
|
||||
- Deploy_Run_PhySim
|
||||
- Deploy_Run_OC_PhySim
|
||||
- Build_Deploy_Docker_PhySim
|
||||
- Build_Deploy_Source_PhySim
|
||||
- LicenceAndFormattingCheck
|
||||
- Push_Local_Registry
|
||||
- Pull_Local_Registry
|
||||
|
||||
210
ci-scripts/xml_files/container_5g_rfsim_multiue.xml
Normal file
210
ci-scripts/xml_files/container_5g_rfsim_multiue.xml
Normal file
@@ -0,0 +1,210 @@
|
||||
<!--
|
||||
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-tdd-multiue</htmlTabRef>
|
||||
<htmlTabName>Monolithic SA TDD gNB multiue</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
111111
|
||||
800813
|
||||
000001
|
||||
000002
|
||||
000003
|
||||
000008
|
||||
020001
|
||||
020002
|
||||
020003
|
||||
020004
|
||||
020105
|
||||
444445
|
||||
030001
|
||||
030002
|
||||
444444
|
||||
100001
|
||||
222222
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
<desc>Create new Workspace</desc>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
<testCase id="000001">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G CoreNetwork</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_multiue</yaml_path>
|
||||
<services>mysql oai-amf oai-smf oai-upf oai-ext-dn</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000002">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G gNB RF sim SA</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_multiue</yaml_path>
|
||||
<services>oai-gnb</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000003">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G NR-UE RF sim SA</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_multiue</yaml_path>
|
||||
<services>oai-nr-ue</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000008">
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_multiue1 rfsim5g_multiue2 rfsim5g_multiue3 rfsim5g_multiue4 rfsim5g_multiue5 rfsim5g_multiue6 rfsim5g_multiue7 rfsim5g_multiue8 rfsim5g_multiue9 rfsim5g_multiue10</id>
|
||||
<nodes>acamas acamas acamas acamas acamas acamas acamas acamas acamas acamas</nodes>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_multiue1</id>
|
||||
<nodes>acamas</nodes>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020002">
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>acamas</nodes>
|
||||
<svr_id>rfsim5g_multiue1</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020003">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from Second NR-UE</desc>
|
||||
<id>rfsim5g_multiue2</id>
|
||||
<nodes>acamas</nodes>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020004">
|
||||
<class>Ping</class>
|
||||
<desc>Ping Second NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>acamas</nodes>
|
||||
<svr_id>rfsim5g_multiue2</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020005">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from both UEs</desc>
|
||||
<id>rfsim5g_multiue1 rfsim5g_multiue2</id>
|
||||
<nodes>acamas acamas</nodes>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020105">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from all UEs</desc>
|
||||
<id>rfsim5g_multiue1 rfsim5g_multiue2 rfsim5g_multiue3 rfsim5g_multiue4 rfsim5g_multiue5 rfsim5g_multiue6 rfsim5g_multiue7 rfsim5g_multiue8 rfsim5g_multiue9 rfsim5g_multiue10</id>
|
||||
<nodes>acamas acamas acamas acamas acamas acamas acamas acamas acamas acamas</nodes>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<ping_args>-c 20 -i 0.25 -s 1016</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="030001">
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf (DL/3Mbps/UDP)(30 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
|
||||
<id>rfsim5g_multiue1</id>
|
||||
<nodes>acamas</nodes>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
<iperf_bitrate_threshold>90</iperf_bitrate_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="030002">
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf (UL/1Mbps/UDP)(30 sec)</desc>
|
||||
<iperf_args>-u -b 1M -t 20</iperf_args>
|
||||
<id>rfsim5g_multiue1</id>
|
||||
<nodes>acamas</nodes>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
<iperf_bitrate_threshold>90</iperf_bitrate_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="444444">
|
||||
<class>Detach_UE</class>
|
||||
<desc>Detach OAI UEs</desc>
|
||||
<id>rfsim5g_multiue1</id>
|
||||
<nodes>acamas</nodes>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100001">
|
||||
<class>Undeploy_Object</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Undeploy all OAI 5G stack</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_multiue</yaml_path>
|
||||
<d_retx_th>1,0,0,0</d_retx_th>
|
||||
<u_retx_th>1,0,0,0</u_retx_th>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="222222">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-ue</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
207
ci-scripts/xml_files/container_5g_rfsim_n2_ho.xml
Normal file
207
ci-scripts/xml_files/container_5g_rfsim_n2_ho.xml
Normal file
@@ -0,0 +1,207 @@
|
||||
<!--
|
||||
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-f1-n2-ho</htmlTabRef>
|
||||
<htmlTabName>F1 SA TDD N2 Handover</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
111111
|
||||
800813
|
||||
000001
|
||||
000002
|
||||
000003
|
||||
020001
|
||||
020002
|
||||
030001
|
||||
030002
|
||||
000004
|
||||
040001
|
||||
050001
|
||||
020001
|
||||
020002
|
||||
050002
|
||||
030001
|
||||
030002
|
||||
050003
|
||||
020001
|
||||
020002
|
||||
050004
|
||||
050001
|
||||
020001
|
||||
020002
|
||||
050002
|
||||
100001
|
||||
222222
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-cuup-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
<desc>Create new Workspace</desc>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000001">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G CoreNetwork</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_n2_ho</yaml_path>
|
||||
<services>mysql oai-amf oai-smf oai-upf oai-ext-dn</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000002">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G CU-CP/CU-UP/DU 0 + UE RFsim SA</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_n2_ho</yaml_path>
|
||||
<services>oai-cucp-0 oai-cuup-0 oai-du-0 oai-nr-ue</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000003">
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>acamas</nodes>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000004">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G CU-CP/CU-UP/DU 1 RFsim SA</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_n2_ho</yaml_path>
|
||||
<services>oai-cucp-1 oai-cuup-1 oai-du-1</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>acamas</nodes>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<ping_args>-c 100 -i 0.25</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020002">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>acamas</nodes>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<ping_args>-c 100 -i 0.25</ping_args>
|
||||
<ping_packetloss_threshold>10</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="030001">
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf (DL/10Mbps/UDP)(30 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>acamas</nodes>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
<iperf_bitrate_threshold>90</iperf_bitrate_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="030002">
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf (UL/4Mbps/UDP)(30 sec)</desc>
|
||||
<iperf_args>-u -b 1M -t 20</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>acamas</nodes>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>acamas</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
<iperf_bitrate_threshold>90</iperf_bitrate_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="040001">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="050001">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Trigger N2 Handover</desc>
|
||||
<node>acamas</node>
|
||||
<command>echo ci trigger_n2_ho 1,1 | ncat 192.168.71.150 9090</command>
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
|
||||
<testCase id="050002">
|
||||
<class>Custom_Command</class>
|
||||
<desc>UE (1) connected to DU-PCI 1?</desc>
|
||||
<node>acamas</node>
|
||||
<command>echo ci fetch_du_by_ue_id 1 | ncat 192.168.71.180 9090 | grep "1234"</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="050003">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Trigger N2 Handover</desc>
|
||||
<node>acamas</node>
|
||||
<command>echo ci trigger_n2_ho 0,1 | ncat 192.168.71.180 9090</command>
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
|
||||
<testCase id="050004">
|
||||
<class>Custom_Command</class>
|
||||
<desc>UE (1) connected to DU-PCI 0?</desc>
|
||||
<node>acamas</node>
|
||||
<command>echo ci fetch_du_by_ue_id 1 | ncat 192.168.71.150 9090 | grep "3584"</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100001">
|
||||
<class>Undeploy_Object</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Undeploy all OAI 5G stack</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_n2_ho</yaml_path>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
<d_retx_th>10,100,100,100</d_retx_th>
|
||||
<u_retx_th>10,100,100,100</u_retx_th>
|
||||
</testCase>
|
||||
|
||||
<testCase id="222222">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-asan oai-nr-cuup-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -40,7 +40,7 @@
|
||||
<class>Build_Image</class>
|
||||
<desc>Build all Images</desc>
|
||||
<node>gracehopper3-oai</node>
|
||||
<kind>native_arm</kind>
|
||||
<kind>native_armv9</kind>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000010">
|
||||
|
||||
53
ci-scripts/xml_files/container_image_build_jetson.xml
Normal file
53
ci-scripts/xml_files/container_image_build_jetson.xml
Normal file
@@ -0,0 +1,53 @@
|
||||
<!--
|
||||
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>build-tab</htmlTabRef>
|
||||
<htmlTabName>Build Container Images for ARM</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
800813
|
||||
000001
|
||||
000010
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
<desc>Create new Workspace for server 0</desc>
|
||||
<node>jetson3-oai</node>
|
||||
</testCase>
|
||||
<testCase id="000001">
|
||||
<class>Build_Image</class>
|
||||
<desc>Build all Images</desc>
|
||||
<node>jetson3-oai</node>
|
||||
<kind>native_armv8</kind>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000010">
|
||||
<class>Push_Local_Registry</class>
|
||||
<desc>Push Images to Local Registry</desc>
|
||||
<node>jetson3-oai</node>
|
||||
<tag_prefix>armv8_</tag_prefix>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
251
ci-scripts/xml_files/container_sa_f1_ho_b210_quectel.xml
Normal file
251
ci-scripts/xml_files/container_sa_f1_ho_b210_quectel.xml
Normal file
@@ -0,0 +1,251 @@
|
||||
<!--
|
||||
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>TEST-F1-HO-B210</htmlTabRef>
|
||||
<htmlTabName>F1 Handover 20 MHz TDD SA</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
000001
|
||||
000002
|
||||
000003
|
||||
000004
|
||||
000005
|
||||
000006
|
||||
000007
|
||||
000008
|
||||
000009
|
||||
000010
|
||||
000011
|
||||
000012
|
||||
000013
|
||||
000014
|
||||
000015
|
||||
000016
|
||||
000017
|
||||
000018
|
||||
000019
|
||||
000020
|
||||
000021
|
||||
000022
|
||||
000023
|
||||
000024
|
||||
000025
|
||||
000026
|
||||
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="000001">
|
||||
<class>DeployCoreNetwork</class>
|
||||
<desc>Initialize 5G Core</desc>
|
||||
<cn_id>oc-cn5g-00102-ho</cn_id>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000002">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<images>oai-gnb</images>
|
||||
<node>groot</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000003">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<images>oai-gnb</images>
|
||||
<node>rocket</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000004">
|
||||
<class>Create_Workspace</class>
|
||||
<desc>Create new Workspace for groot</desc>
|
||||
<node>groot</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000005">
|
||||
<class>Create_Workspace</class>
|
||||
<desc>Create new Workspace on rocket</desc>
|
||||
<node>rocket</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000006">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy gNB-CU in a container</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_sa_f1_b210_ho</yaml_path>
|
||||
<node>groot</node>
|
||||
<services>oai_cu</services>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000007">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy gNB-DU0 (TDD/Band77/20MHz/B210) in a container</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_sa_f1_b210_ho</yaml_path>
|
||||
<services>oai_du0</services>
|
||||
<node>groot</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000008">
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach Quectel</desc>
|
||||
<id>raspix</id>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000009">
|
||||
<class>Ping</class>
|
||||
<desc>Ping: 100pings in 20sec</desc>
|
||||
<id>raspix</id>
|
||||
<svr_id>oc-cn5g-00102-ho</svr_id>
|
||||
<ping_args>-c 100 -i 0.2</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000010">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy gNB-DU1 (TDD/Band77/20MHz/B210) in a container</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_sa_f1_b210_ho</yaml_path>
|
||||
<node>rocket</node>
|
||||
<services>oai_du1</services>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000011">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000012">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Trigger Handover</desc>
|
||||
<node>groot</node>
|
||||
<command>echo ci trigger_f1_ho | ncat 127.0.0.1 9090</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000013">
|
||||
<class>Ping</class>
|
||||
<desc>Ping: 50pings in 10sec</desc>
|
||||
<id>raspix</id>
|
||||
<svr_id>oc-cn5g-00102-ho</svr_id>
|
||||
<ping_args>-c 50 -i 0.2</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000014">
|
||||
<class>Custom_Command</class>
|
||||
<desc>UE connected to DU1?</desc>
|
||||
<node>groot</node>
|
||||
<command>echo ci fetch_du_by_ue_id 1 | ncat 127.0.0.1 9090 | grep "3585"</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000015">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Trigger Handover</desc>
|
||||
<node>groot</node>
|
||||
<command>echo ci trigger_f1_ho | ncat 127.0.0.1 9090</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000016">
|
||||
<class>Ping</class>
|
||||
<desc>Ping: 50pings in 10sec</desc>
|
||||
<id>raspix</id>
|
||||
<svr_id>oc-cn5g-00102-ho</svr_id>
|
||||
<ping_args>-c 50 -i 0.2</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000017">
|
||||
<class>Custom_Command</class>
|
||||
<desc>UE connected to DU0?</desc>
|
||||
<node>groot</node>
|
||||
<command>echo ci fetch_du_by_ue_id 1 | ncat 127.0.0.1 9090 | grep "3584"</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000018">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Trigger Handover</desc>
|
||||
<node>groot</node>
|
||||
<command>echo ci trigger_f1_ho | ncat 127.0.0.1 9090</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000019">
|
||||
<class>Ping</class>
|
||||
<desc>Ping: 50pings in 10sec</desc>
|
||||
<id>raspix</id>
|
||||
<svr_id>oc-cn5g-00102-ho</svr_id>
|
||||
<ping_args>-c 50 -i 0.2</ping_args>
|
||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000020">
|
||||
<class>Custom_Command</class>
|
||||
<desc>UE connected to DU1?</desc>
|
||||
<node>groot</node>
|
||||
<command>echo ci fetch_du_by_ue_id 1 | ncat 127.0.0.1 9090 | grep "3585"</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000021">
|
||||
<class>Detach_UE</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Detach Quectel</desc>
|
||||
<id>raspix</id>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000022">
|
||||
<class>Undeploy_Object</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Undeploy CU-DU0</desc>
|
||||
<node>groot</node>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_sa_f1_b210_ho</yaml_path>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000023">
|
||||
<class>Undeploy_Object</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Undeploy DU1 </desc>
|
||||
<node>rocket</node>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_sa_f1_b210_ho</yaml_path>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000024">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<node>groot</node>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000025">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<node>rocket</node>
|
||||
<images>oai-gnb</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000026">
|
||||
<class>UndeployCoreNetwork</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Terminate 5G Core</desc>
|
||||
<cn_id>oc-cn5g-00102-ho</cn_id>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>TEST-SA-FR1-N310-2x2-60MHz</htmlTabRef>
|
||||
<htmlTabName>60 MHz 2x2 TDD SA</htmlTabName>
|
||||
<htmlTabName>60 MHz 2x2 TDD SA DSUUU</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
100000
|
||||
@@ -114,8 +114,8 @@
|
||||
|
||||
<testCase id="071000">
|
||||
<class>Iperf</class>
|
||||
<desc>iperf (DL/200Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||
<iperf_args>-u -b 200M -t 30 -R</iperf_args>
|
||||
<desc>iperf (DL/150Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||
<iperf_args>-u -b 150M -t 30 -R</iperf_args>
|
||||
<svr_id>matix-cn5g</svr_id>
|
||||
<id>up2</id>
|
||||
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
|
||||
@@ -124,8 +124,8 @@
|
||||
|
||||
<testCase id="071001">
|
||||
<class>Iperf</class>
|
||||
<desc>iperf (UL/180Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||
<iperf_args>-u -b 180M -t 30</iperf_args>
|
||||
<desc>iperf (UL/250Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||
<iperf_args>-u -b 250M -t 30</iperf_args>
|
||||
<svr_id>matix-cn5g</svr_id>
|
||||
<id>up2</id>
|
||||
<iperf_packetloss_threshold>10</iperf_packetloss_threshold>
|
||||
@@ -147,8 +147,8 @@
|
||||
<node>matix</node>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_sa_n310_2x2_60MHz</yaml_path>
|
||||
<services>oai-gnb</services>
|
||||
<d_retx_th>10,100,100,100</d_retx_th>
|
||||
<u_retx_th>10,100,100,100</u_retx_th>
|
||||
<d_retx_th>15,100,100,100</d_retx_th>
|
||||
<u_retx_th>20,100,100,100</u_retx_th>
|
||||
</testCase>
|
||||
|
||||
<testCase id="333333">
|
||||
|
||||
@@ -109,8 +109,8 @@
|
||||
|
||||
<testCase id="000100">
|
||||
<class>Iperf</class>
|
||||
<desc>iperf (DL/30Mbps/UDP)(30 sec)</desc>
|
||||
<iperf_args>-u -b 30M -t 30 -i 1 -R</iperf_args>
|
||||
<desc>iperf (DL/60Mbps/UDP)(30 sec)</desc>
|
||||
<iperf_args>-u -b 60M -t 30 -i 1 -R</iperf_args>
|
||||
<id>oai_ue_caracal</id>
|
||||
<svr_id>oc-cn5g</svr_id>
|
||||
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
|
||||
|
||||
@@ -1,396 +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
|
||||
|
||||
030105 040301 040502 040606 040601 040603 040608 040605 040646 040641 040643 040648 040645 040401 040201 030201
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>test-ldpc-gpu</htmlTabRef>
|
||||
<htmlTabName>Test-ldpc-GPU</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021
|
||||
000022 000023 000024 000025 000026 000027 000028 000029 000030 000031 000032 000033 000034 000035 000036 000037 000038 000039 000040 000041
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="000002">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 3872 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000003">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 3872 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000004">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 4224 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000005">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 4224 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000006">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 4576 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000007">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 4576 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000008">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 4928 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000009">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 4928 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000010">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 5280 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000011">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 5280 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000012">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 5632 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000013">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 5632 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000014">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 6336 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000015">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 6336 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000016">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 7040 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000017">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 7040 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000018">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 7744 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000019">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 7744 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000020">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 8448 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000021">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 8448 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000022">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 1 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000023">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 1 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000024">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 100 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000025">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 100 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000026">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 193 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000027">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 193 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000028">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 500 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000029">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 500 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000030">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 561 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000031">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 561 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000032">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 600 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000033">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 600 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000034">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 641 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000035">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 641 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000036">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 2000 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000037">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 2000 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000038">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 3000 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000039">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 3000 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000040">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 3840 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000041">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 3840 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
|
||||
|
||||
</testCaseList>
|
||||
@@ -37,7 +37,7 @@
|
||||
</testCase>
|
||||
|
||||
<testCase id="010201">
|
||||
<class>Deploy_Run_PhySim</class>
|
||||
<class>Deploy_Run_OC_PhySim</class>
|
||||
<desc>Deploy and run physical simulator on openshift</desc>
|
||||
<oc_release>physims-4g</oc_release>
|
||||
<node>avra</node>
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
</testCase>
|
||||
|
||||
<testCase id="010201">
|
||||
<class>Deploy_Run_PhySim</class>
|
||||
<class>Deploy_Run_OC_PhySim</class>
|
||||
<desc>Deploy and run physical simulator on openshift</desc>
|
||||
<oc_release>physims-5g</oc_release>
|
||||
<node>avra</node>
|
||||
|
||||
46
ci-scripts/xml_files/physim_gracehopper.xml
Normal file
46
ci-scripts/xml_files/physim_gracehopper.xml
Normal file
@@ -0,0 +1,46 @@
|
||||
<!--
|
||||
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>build-tab</htmlTabRef>
|
||||
<htmlTabName>PhySim</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
800813
|
||||
010201
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
<desc>Create new Workspace</desc>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010201">
|
||||
<class>Build_Deploy_Docker_PhySim</class>
|
||||
<desc>Deploy and Deploy PhySim</desc>
|
||||
<node>localhost</node>
|
||||
<ctest-opt>-R 5g -E physim.5g.nr_dlsim.mcs.mimo.test9 -j16</ctest-opt> <!-- one nr_dlsim test fails on ARM -->
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -1,230 +0,0 @@
|
||||
<!--
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
-->
|
||||
|
||||
<testCaseList>
|
||||
<htmlTabRef>test-t2-offload-dec</htmlTabRef>
|
||||
<htmlTabName>Test T2 Offload Decoder</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
010204
|
||||
010111 010112 010121 010122 010131 010132
|
||||
010211 010212 010221 010222 010231 010232
|
||||
010311 010312 010321 010322 010331 010332
|
||||
402010
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="010204">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Disable Sleep States</desc>
|
||||
<node>caracal</node>
|
||||
<command>sudo cpupower idle-set -D 0</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="402010">
|
||||
<class>Custom_Command</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Enable Sleep States</desc>
|
||||
<node>caracal</node>
|
||||
<command>sudo cpupower idle-set -E</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010111">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with CPU: SNR = 30, MCS = 5, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>300</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m5 -r106 -R106 -C10 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010112">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>100</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m5 -r106 -R106 -C10 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010121">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with CPU: SNR = 30, MCS = 15, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>300</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m15 -r106 -R106 -C10 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010122">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>150</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m15 -r106 -R106 -C10 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010131">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with CPU: SNR = 30, MCS = 25, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>250</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m25 -r106 -R106 -C10 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010132">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>250</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m25 -r106 -R106 -C10 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010211">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with CPU: SNR = 30, MCS = 5, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>300</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m5 -r273 -R273 -C10 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010212">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>150</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m5 -r273 -R273 -C10 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010221">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with CPU: SNR = 30, MCS = 15, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>400</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m15 -r273 -R273 -C10 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010222">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>350</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m15 -r273 -R273 -C10 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010231">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with CPU: SNR = 30, MCS = 25, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>400</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m25 -r273 -R273 -C10 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010232">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>550</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m25 -r273 -R273 -C10 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010311">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with CPU: SNR = 30, MCS = 5, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>300</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m5 -r273 -R273 -C10 -W2 -z2 -y2 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010312">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>250</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m5 -r273 -R273 -C10 -W2 -z2 -y2 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010321">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with CPU: SNR = 30, MCS = 15, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>600</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m15 -r273 -R273 -C10 -W2 -z2 -y2 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010322">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>650</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m15 -r273 -R273 -C10 -W2 -z2 -y2 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010331">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with CPU: SNR = 30, MCS = 25, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>650</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m25 -r273 -R273 -C10 -W2 -z2 -y2 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="010332">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_ulsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_ulsim</physim_test>
|
||||
<physim_time_threshold>1100</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -m25 -r273 -R273 -C10 -W2 -z2 -y2 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -1,290 +0,0 @@
|
||||
<!--
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
-->
|
||||
|
||||
<testCaseList>
|
||||
<htmlTabRef>test-t2-offload-enc</htmlTabRef>
|
||||
<htmlTabName>Test T2 Offload Encoder</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
102040
|
||||
000111 000112 000121 000122 000131 000132
|
||||
000211 000212 000221 000222 000231 000232
|
||||
000311 000312 000321 000322 000331 000332
|
||||
000411 000412 000421 000422 000431 000432
|
||||
040201
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="102040">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Disable Sleep States</desc>
|
||||
<node>caracal</node>
|
||||
<command>sudo cpupower idle-set -D 0</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="040201">
|
||||
<class>Custom_Command</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Enable Sleep States</desc>
|
||||
<node>caracal</node>
|
||||
<command>sudo cpupower idle-set -E</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000111">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 5, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>230</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e5 -b106 -R106 -X 8,9,10,11,12 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000112">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>100</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e5 -b106 -R106 -X4,5,6,7,8,9 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000121">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 15, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>300</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e15 -b106 -R106 -X 8,9,10,11,12 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000122">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>100</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e15 -b106 -R106 -X4,5,6,7,8,9 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000131">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 25, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>350</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e25 -b106 -R106 -X 8,9,10,11,12 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000132">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 106 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>200</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e25 -b106 -R106 -X4,5,6,7,8,9 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000211">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 5, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>300</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e5 -b273 -R273 -X 8,9,10,11,12 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000212">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>150</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e5 -b273 -R273 -X4,5,6,7,8,9 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000221">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 15, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>350</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e15 -b273 -R273 -X 8,9,10,11,12 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000222">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>250</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e15 -b273 -R273 -X4,5,6,7,8,9 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000231">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 25, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>400</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e25 -b273 -R273 -X 8,9,10,11,12 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000232">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 1 layer</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>400</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e25 -b273 -R273 -X4,5,6,7,8,9 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000311">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 5, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>400</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e5 -b273 -R273 -X 8,9,10,11,12 -x2 -z2 -y2 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000312">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>200</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e5 -b273 -R273 -X4,5,6,7,8,9 -x2 -z2 -y2 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000321">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 15, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>450</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e15 -b273 -R273 -X 8,9,10,11,12 -x2 -z2 -y2 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000322">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 15, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>500</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e15 -b273 -R273 -X4,5,6,7,8,9 -x2 -z2 -y2 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000331">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 25, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>500</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e25 -b273 -R273 -X 8,9,10,11,12 -x2 -z2 -y2 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000332">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 25, 273 PRBs, 2 layers</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>500</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e25 -b273 -R273 -X4,5,6,7,8,9 -x2 -z2 -y2 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000411">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 5, 273 PRBs, 2 layers, 4 antennas</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>400</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e5 -b273 -R273 -X8,9,10,11,12 -x2 -z4 -y4 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000412">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 5, 273 PRBs, 2 layers, 4 antennas</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>200</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e5 -b273 -R273 -X4,5,6,7,8,9 -x2 -z4 -y4 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000421">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 20, 273 PRBs, 2 layers, 4 antennas</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>400</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e15 -b273 -R273 -X8,9,10,11,12 -x2 -z4 -y4 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000422">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 20, 273 PRBs, 2 layers, 4 antennas</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>300</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e15 -b273 -R273 -X4,5,6,7,8,9 -x2 -z4 -y4 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000431">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with CPU: SNR = 30, MCS = 27, 273 PRBs, 2 layers, 4 antennas</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>450</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e25 -b273 -R273 -X8,9,10,11,12 -x2 -z4 -y4 -P</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000432">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run nr_dlsim with T2 LDPC offload: SNR = 30, MCS = 27, 273 PRBs, 2 layers, 4 antennas</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<node>caracal</node>
|
||||
<physim_test>nr_dlsim</physim_test>
|
||||
<physim_time_threshold>450</physim_time_threshold>
|
||||
<physim_run_args>-n1000 -s30 -S30.2 -e25 -b273 -R273 -X4,5,6,7,8,9 -x2 -z4 -y4 -P --loader.ldpc.shlibversion _aal --nrLDPC_coding_aal.dpdk_dev af:00.0 --nrLDPC_coding_aal.dpdk_core_list 11-12 --nrLDPC_coding_aal.is_t2 1</physim_run_args>
|
||||
</testCase>
|
||||
</testCaseList>
|
||||
54
ci-scripts/xml_files/t2_offload_physim_enc_dec.xml
Normal file
54
ci-scripts/xml_files/t2_offload_physim_enc_dec.xml
Normal file
@@ -0,0 +1,54 @@
|
||||
<!--
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
-->
|
||||
|
||||
<testCaseList>
|
||||
<htmlTabRef>test-t2-offload-enc-dec</htmlTabRef>
|
||||
<htmlTabName>Test T2 Offload</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
010204
|
||||
111111
|
||||
402010
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="010204">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Disable Sleep States</desc>
|
||||
<node>caracal</node>
|
||||
<command>sudo cpupower idle-set -D 0</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="402010">
|
||||
<class>Custom_Command</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Enable Sleep States</desc>
|
||||
<node>caracal</node>
|
||||
<command>sudo cpupower idle-set -E</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="111111">
|
||||
<class>Build_Deploy_Source_PhySim</class>
|
||||
<desc>Build and Deploy PhySim T2 Offload tests</desc>
|
||||
<node>caracal</node>
|
||||
<ctest-opt>-R 5g-offload -j1</ctest-opt>
|
||||
</testCase>
|
||||
</testCaseList>
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
@@ -100,7 +100,6 @@ services:
|
||||
- SYS_NICE
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time
|
||||
--rfsimulator.options chanmod
|
||||
--gNBs.[0].remote_s_address 0.0.0.0
|
||||
--telnetsrv --telnetsrv.listenaddr 192.168.71.150
|
||||
--telnetsrv.shrmod ci
|
||||
@@ -111,6 +110,7 @@ services:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.150
|
||||
volumes:
|
||||
- ../../conf_files/neighbour-config.conf:/opt/oai-gnb/etc/neighbour-config.conf
|
||||
- ../../conf_files/gnb-cu.sa.band78.106prb.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
@@ -37,9 +37,9 @@ Now pull images.
|
||||
|
||||
```bash
|
||||
$ docker pull mysql:8.0
|
||||
$ docker pull oaisoftwarealliance/oai-amf:v2.1.9
|
||||
$ docker pull oaisoftwarealliance/oai-smf:v2.1.9
|
||||
$ docker pull oaisoftwarealliance/oai-upf:v2.1.9
|
||||
$ docker pull oaisoftwarealliance/oai-amf:v2.1.10
|
||||
$ docker pull oaisoftwarealliance/oai-smf:v2.1.10
|
||||
$ docker pull oaisoftwarealliance/oai-upf:v2.1.10
|
||||
$ docker pull oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
|
||||
$ docker pull oaisoftwarealliance/oai-gnb:develop
|
||||
@@ -52,7 +52,7 @@ $ docker logout
|
||||
|
||||
**CAUTION: 2023/01/27 with the release `v1.5.0` of the `CN5G`, the previous version was not compatible any-more.**
|
||||
|
||||
**This new version is working only with the `v2.1.9` of the `CN5G`.**
|
||||
**This new version is working only with `v2.1.9` or later of the `CN5G`.**
|
||||
|
||||
# 2. Deploy containers #
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
146
ci-scripts/yaml_files/5g_rfsimulator_multiue/docker-compose.yaml
Normal file
146
ci-scripts/yaml_files/5g_rfsimulator_multiue/docker-compose.yaml
Normal file
@@ -0,0 +1,146 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:8.0
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- MYSQL_DATABASE=oai_db
|
||||
- MYSQL_USER=test
|
||||
- MYSQL_PASSWORD=test
|
||||
- MYSQL_ROOT_PASSWORD=linux
|
||||
healthcheck:
|
||||
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 30
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
- ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-amf/etc/config.yaml
|
||||
depends_on:
|
||||
- mysql
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
- ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-smf/etc/config.yaml
|
||||
depends_on:
|
||||
- oai-amf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
- ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-upf/etc/config.yaml
|
||||
depends_on:
|
||||
- oai-smf
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_ADMIN
|
||||
cap_drop:
|
||||
- ALL
|
||||
privileged: true
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.134
|
||||
interface_name: eth0
|
||||
traffic_net:
|
||||
ipv4_address: 192.168.72.134
|
||||
interface_name: eth1
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
||||
depends_on:
|
||||
- oai-upf
|
||||
networks:
|
||||
traffic_net:
|
||||
ipv4_address: 192.168.72.135
|
||||
healthcheck:
|
||||
test: /bin/bash -c "ping -c 2 192.168.72.134"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
oai-gnb:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-gnb
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: -E --rfsim --log_config.global_log_options level,nocolor,time
|
||||
ASAN_OPTIONS: detect_leaks=0
|
||||
depends_on:
|
||||
- oai-ext-dn
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.140
|
||||
volumes:
|
||||
- ../../conf_files/gnb.sa.band78.106prb.rfsim.yaml:/opt/oai-gnb/etc/gnb.yaml
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
oai-nr-ue:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
cap_drop:
|
||||
- ALL
|
||||
cap_add:
|
||||
- NET_ADMIN # for interface bringup
|
||||
- NET_RAW # for ping
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: -E --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 -C 3319680000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time --num-ues 10
|
||||
depends_on:
|
||||
- oai-gnb
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.150
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
volumes:
|
||||
- ./nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-uesoftmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
networks:
|
||||
public_net:
|
||||
driver: bridge
|
||||
name: rfsim5g-oai-public-net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.71.128/26
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "rfsim5g-public"
|
||||
traffic_net:
|
||||
driver: bridge
|
||||
name: rfsim5g-oai-traffic-net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.72.128/26
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "rfsim5g-traffic"
|
||||
75
ci-scripts/yaml_files/5g_rfsimulator_multiue/nrue.uicc.conf
Normal file
75
ci-scripts/yaml_files/5g_rfsimulator_multiue/nrue.uicc.conf
Normal file
@@ -0,0 +1,75 @@
|
||||
uicc0 = {
|
||||
imsi = "208990100001100";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
uicc1 = {
|
||||
imsi = "208990100001101";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
uicc2 = {
|
||||
imsi = "208990100001102";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
uicc3 = {
|
||||
imsi = "208990100001103";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
uicc4 = {
|
||||
imsi = "208990100001104";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
uicc5 = {
|
||||
imsi = "208990100001105";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
uicc6 = {
|
||||
imsi = "208990100001106";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
uicc7 = {
|
||||
imsi = "208990100001107";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
uicc8 = {
|
||||
imsi = "208990100001108";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
uicc9 = {
|
||||
imsi = "208990100001109";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
thread-pool: "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1"
|
||||
|
||||
306
ci-scripts/yaml_files/5g_rfsimulator_n2_ho/docker-compose.yaml
Normal file
306
ci-scripts/yaml_files/5g_rfsimulator_n2_ho/docker-compose.yaml
Normal file
@@ -0,0 +1,306 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:8.0
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- MYSQL_DATABASE=oai_db
|
||||
- MYSQL_USER=test
|
||||
- MYSQL_PASSWORD=test
|
||||
- MYSQL_ROOT_PASSWORD=linux
|
||||
healthcheck:
|
||||
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 30
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:ci-tmp-pr-372-26c14bcd
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
- ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-amf/etc/config.yaml
|
||||
depends_on:
|
||||
- mysql
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
- ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-smf/etc/config.yaml
|
||||
depends_on:
|
||||
- oai-amf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
- ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-upf/etc/config.yaml
|
||||
depends_on:
|
||||
- oai-smf
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_ADMIN
|
||||
cap_drop:
|
||||
- ALL
|
||||
privileged: true
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.134
|
||||
interface_name: eth0
|
||||
traffic_net:
|
||||
ipv4_address: 192.168.72.134
|
||||
interface_name: eth1
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
||||
depends_on:
|
||||
- oai-upf
|
||||
networks:
|
||||
traffic_net:
|
||||
ipv4_address: 192.168.72.135
|
||||
healthcheck:
|
||||
test: /bin/bash -c "ping -c 2 192.168.72.134"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-cucp-0:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-cucp-0
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --telnetsrv --telnetsrv.shrmod ci
|
||||
--telnetsrv.listenaddr 192.168.71.150
|
||||
--gNBs.[0].nr_cellid 0
|
||||
--log_config.global_log_options level,nocolor,time
|
||||
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||
depends_on:
|
||||
- oai-amf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.150
|
||||
volumes:
|
||||
- ../../conf_files/neighbour-config.conf:/opt/oai-gnb/etc/neighbour-config.conf
|
||||
- ../../conf_files/gnb-cucp.sa.e1-ho-n2.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
start_period: 10s
|
||||
start_interval: 500ms
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-cuup-0:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${NRCUUP_IMG:-oai-nr-cuup}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-cuup-0
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time
|
||||
--gNBs.[0].E1_INTERFACE.[0].ipv4_cucp 192.168.71.150
|
||||
--gNBs.[0].E1_INTERFACE.[0].ipv4_cuup 192.168.71.151
|
||||
--gNBs.[0].NETWORK_INTERFACES.GNB_IPV4_ADDRESS_FOR_NGU 192.168.71.151
|
||||
--gNBs.[0].local_s_address 192.168.71.151
|
||||
ASAN_OPTIONS: detect_leaks=0
|
||||
depends_on:
|
||||
- oai-cucp-0
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.151
|
||||
volumes:
|
||||
- ../../conf_files/gnb-cuup.sa.f1.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-cuup"
|
||||
start_period: 10s
|
||||
start_interval: 500ms
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
|
||||
oai-du-0:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-du-0
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --rfsim
|
||||
--log_config.global_log_options level,nocolor,time
|
||||
--gNBs.[0].nr_cellid 0
|
||||
--telnetsrv --telnetsrv.listenaddr 192.168.71.171
|
||||
--telnetsrv.shrmod ci
|
||||
--rfsimulator.serveraddr 192.168.71.190
|
||||
--gNBs.[0].servingCellConfigCommon.[0].ra_ResponseWindow 5
|
||||
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||
depends_on:
|
||||
- oai-cucp-0
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.171
|
||||
volumes:
|
||||
- ../../conf_files/neighbour-config.conf:/opt/oai-gnb/etc/neighbour-config.conf
|
||||
- ../../conf_files/gnb-du.sa.band78.106prb.rfsim.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
start_period: 10s
|
||||
start_interval: 500ms
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-nr-ue:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
cap_drop:
|
||||
- ALL
|
||||
cap_add:
|
||||
- NET_ADMIN # for interface bringup
|
||||
- NET_RAW # for ping
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --rfsim --rfsimulator.serveraddr server
|
||||
--band 78 -C 3619200000 -r 106 --numerology 1 --ssb 516
|
||||
--uicc0.imsi 208990100001100
|
||||
--log_config.global_log_options level,nocolor,time
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.190
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
volumes:
|
||||
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-uesoftmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-cucp-1:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-cucp-1
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --telnetsrv --telnetsrv.shrmod ci
|
||||
--telnetsrv.listenaddr 192.168.71.180
|
||||
--gNBs.[0].E1_INTERFACE.[0].ipv4_cucp 192.168.71.180
|
||||
--gNBs.[0].E1_INTERFACE.[0].ipv4_cuup 192.168.71.181
|
||||
--gNBs.[0].local_s_address 192.168.71.180
|
||||
--gNBs.[0].remote_s_address 192.168.71.181
|
||||
--gNBs.[0].gNB_ID 0xb00
|
||||
--gNBs.[0].nr_cellid 1
|
||||
--gNBs.[0].NETWORK_INTERFACES.GNB_IPV4_ADDRESS_FOR_NG_AMF 192.168.71.180
|
||||
--gNBs.[0].NETWORK_INTERFACES.GNB_IPV4_ADDRESS_FOR_NGU 192.168.71.180
|
||||
--log_config.global_log_options level,nocolor,time
|
||||
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.180
|
||||
volumes:
|
||||
- ../../conf_files/neighbour-config.conf:/opt/oai-gnb/etc/neighbour-config.conf
|
||||
- ../../conf_files/gnb-cucp.sa.e1-ho-n2.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
start_period: 10s
|
||||
start_interval: 500ms
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-cuup-1:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${NRCUUP_IMG:-oai-nr-cuup}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-cuup-1
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time
|
||||
--gNBs.[0].E1_INTERFACE.[0].ipv4_cucp 192.168.71.180
|
||||
--gNBs.[0].E1_INTERFACE.[0].ipv4_cuup 192.168.71.181
|
||||
--gNBs.[0].NETWORK_INTERFACES.GNB_IPV4_ADDRESS_FOR_NGU 192.168.71.181
|
||||
--gNBs.[0].local_s_address 192.168.71.181
|
||||
ASAN_OPTIONS: detect_leaks=0
|
||||
depends_on:
|
||||
- oai-cucp-0
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.181
|
||||
volumes:
|
||||
- ../../conf_files/gnb-cuup.sa.f1.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-cuup"
|
||||
start_period: 10s
|
||||
start_interval: 500ms
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-du-1:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-du-1
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --rfsim
|
||||
--rfsimulator.serveraddr 192.168.71.190
|
||||
--log_config.global_log_options level,nocolor,time
|
||||
--gNBs.[0].gNB_DU_ID 1234
|
||||
--gNBs.[0].gNB_ID 0xb00
|
||||
--gNBs.[0].nr_cellid 1
|
||||
--gNBs.[0].servingCellConfigCommon.[0].physCellId 1
|
||||
--gNBs.[0].servingCellConfigCommon.[0].absoluteFrequencySSB 621312
|
||||
--gNBs.[0].servingCellConfigCommon.[0].dl_absoluteFrequencyPointA 620040
|
||||
--MACRLCs.[0].local_n_address 192.168.71.182
|
||||
--MACRLCs.[0].remote_n_address 192.168.71.180
|
||||
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||
depends_on:
|
||||
- oai-cucp-1
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.182
|
||||
volumes:
|
||||
- ../../conf_files/neighbour-config.conf:/opt/oai-gnb/etc/neighbour-config.conf
|
||||
- ../../conf_files/gnb-du.sa.band78.106prb.rfsim.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
start_period: 10s
|
||||
start_interval: 500ms
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
networks:
|
||||
public_net:
|
||||
driver: bridge
|
||||
name: rfsim5g-oai-public-net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.71.128/26
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "rfsim5g-public"
|
||||
traffic_net:
|
||||
driver: bridge
|
||||
name: rfsim5g-oai-traffic-net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.72.128/26
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "rfsim5g-traffic"
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
@@ -23,7 +23,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -35,7 +35,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -47,7 +47,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
90
ci-scripts/yaml_files/5g_sa_f1_b210_ho/docker-compose.yml
Normal file
90
ci-scripts/yaml_files/5g_sa_f1_b210_ho/docker-compose.yml
Normal file
@@ -0,0 +1,90 @@
|
||||
services:
|
||||
oai_cu:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: oai-cu
|
||||
cap_drop:
|
||||
- ALL
|
||||
ulimits:
|
||||
core: -1 # for core dumps
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --telnetsrv --telnetsrv.listenport 9090 --telnetsrv.shrmod ci
|
||||
--log_config.global_log_options level,nocolor,utc_time,line_num,function
|
||||
volumes:
|
||||
- ../../conf_files/gnb-cu.sa.f1.ho.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- ../../conf_files/neighbour-config-ho.conf:/opt/oai-gnb/etc/neighbour-config-ho.conf
|
||||
# for performance reasons, we use host mode: in bridge mode, we have
|
||||
# unacceptable DL TCP performance. However, the whole point of
|
||||
# containerization is to not be in host mode, so update this to macvlan
|
||||
# later.
|
||||
network_mode: "host"
|
||||
#entrypoint: /bin/bash -c "sleep infinity"
|
||||
healthcheck:
|
||||
# pgrep does NOT work
|
||||
test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai_du0:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: oai-du0
|
||||
cap_drop:
|
||||
- ALL
|
||||
cap_add:
|
||||
- SYS_NICE
|
||||
- IPC_LOCK
|
||||
ulimits:
|
||||
core: -1 # for core dumps
|
||||
environment:
|
||||
USE_B2XX: 'yes'
|
||||
USE_ADDITIONAL_OPTIONS: --RUs.[0].sdr_addrs serial=30AD30F
|
||||
--telnetsrv --telnetsrv.listenport 9091 --telnetsrv.shrmod ci
|
||||
--log_config.global_log_options level,nocolor,utc_time,line_num,function
|
||||
devices:
|
||||
- /dev/bus/usb/:/dev/bus/usb/
|
||||
volumes:
|
||||
- ../../conf_files/gnb-du.sa.band78.51prb.usrpb210.ho-pci0.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
# for performance reasons, we use host mode: in bridge mode, we have
|
||||
# unacceptable DL TCP performance. However, the whole point of
|
||||
# containerization is to not be in host mode, so update this to macvlan
|
||||
# later.
|
||||
network_mode: "host"
|
||||
#entrypoint: /bin/bash -c "sleep infinity"
|
||||
healthcheck:
|
||||
# pgrep does NOT work
|
||||
test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai_du1:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: oai-du1
|
||||
cap_drop:
|
||||
- ALL
|
||||
cap_add:
|
||||
- SYS_NICE
|
||||
- IPC_LOCK
|
||||
ulimits:
|
||||
core: -1 # for core dumps
|
||||
environment:
|
||||
USE_B2XX: 'yes'
|
||||
USE_ADDITIONAL_OPTIONS: --RUs.[0].sdr_addrs serial=31F8010
|
||||
--telnetsrv --telnetsrv.listenport 9091 --telnetsrv.shrmod ci
|
||||
--log_config.global_log_options level,nocolor,utc_time,line_num,function
|
||||
devices:
|
||||
- /dev/bus/usb/:/dev/bus/usb/
|
||||
volumes:
|
||||
- ../../conf_files/gnb-du.sa.band78.51prb.usrpb210.ho-pci1.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
# for performance reasons, we use host mode: in bridge mode, we have
|
||||
# unacceptable DL TCP performance. However, the whole point of
|
||||
# containerization is to not be in host mode, so update this to macvlan
|
||||
# later.
|
||||
network_mode: "host"
|
||||
#entrypoint: /bin/bash -c "sleep infinity"
|
||||
healthcheck:
|
||||
# pgrep does NOT work
|
||||
test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
@@ -9,7 +9,7 @@ services:
|
||||
container_name: oai-gnb
|
||||
environment:
|
||||
TZ: Europe/Paris
|
||||
USE_ADDITIONAL_OPTIONS: --sa --thread-pool 7,8,9,10,11,12
|
||||
USE_ADDITIONAL_OPTIONS: --thread-pool 7,8,9,10,11,12
|
||||
devices:
|
||||
- /dev/vfio:/dev/vfio/
|
||||
volumes:
|
||||
|
||||
@@ -23,7 +23,7 @@ services:
|
||||
- ../../../cmake_targets/share:/opt/cuBB/share
|
||||
userns_mode: host
|
||||
ipc: "shareable"
|
||||
image: cubb-build:25-1
|
||||
image: cubb-build:25-2-srs
|
||||
environment:
|
||||
- cuBB_SDK=/opt/nvidia/cuBB
|
||||
command: bash -c "sudo rm -rf /tmp/phy.log && sudo chmod +x /opt/nvidia/cuBB/aerial_l1_entrypoint.sh && /opt/nvidia/cuBB/aerial_l1_entrypoint.sh"
|
||||
|
||||
@@ -300,12 +300,16 @@ configmodule_interface_t *load_configmodule(int argc,
|
||||
cfgmode = strdup(CONFIG_LIBCONFIGFILE);
|
||||
}
|
||||
}
|
||||
static configmodule_interface_t *cfgptr;
|
||||
static configmodule_interface_t *cfgptr = NULL;
|
||||
if (cfgptr)
|
||||
fprintf(stderr, "ERROR: Call load_configmodule more than one time\n");
|
||||
|
||||
// The macros are not thread safe print_params and similar
|
||||
cfgptr = calloc(sizeof(configmodule_interface_t), 1);
|
||||
if (!cfgptr) {
|
||||
fprintf(stderr, "ERROR: cannot allocate a memory for configuration\n");
|
||||
return NULL;
|
||||
}
|
||||
/* argv_info is used to memorize command line options which have been recognized */
|
||||
/* and to detect unrecognized command line options which might have been specified */
|
||||
cfgptr->argv_info = calloc(sizeof(int32_t), argc+10);
|
||||
|
||||
1
common/utils/T/.gitignore
vendored
1
common/utils/T/.gitignore
vendored
@@ -3,6 +3,7 @@
|
||||
genids
|
||||
tracer/enb
|
||||
tracer/gnb
|
||||
tracer/gnb_mac
|
||||
tracer/extract_config
|
||||
tracer/record
|
||||
tracer/replay
|
||||
|
||||
@@ -92,9 +92,13 @@ ID = UE_PHY_INITIATE_RA_PROCEDURE
|
||||
GROUP = ALL:PHY:UE:WIRESHARK
|
||||
FORMAT = int,frame : int,subframe_or_slot : int,preamble : int,power
|
||||
ID = GNB_PHY_DL_TICK
|
||||
DESC = gNodeB downlink tick - one tick per ms at start of downlink processing
|
||||
DESC = gNodeB downlink tick - one tick per slot at start of downlink processing
|
||||
GROUP = ALL:PHY:GRAPHIC:GNB
|
||||
FORMAT = int,gNB_ID : int,frame : int,subframe
|
||||
FORMAT = int,gNB_ID : int,frame : int,slot
|
||||
ID = GNB_PHY_UL_TICK
|
||||
DESC = gNodeB uplink tick - one tick per slot at start of uplink processing
|
||||
GROUP = ALL:PHY:GRAPHIC:GNB
|
||||
FORMAT = int,gNB_ID : int,frame : int,slot
|
||||
ID = ENB_PHY_MIB
|
||||
DESC = MIB data
|
||||
GROUP = ALL:PHY:ENB:WIRESHARK
|
||||
@@ -221,6 +225,22 @@ ID = NRUE_MAC_DL_RAR_PDU_WITH_DATA
|
||||
DESC = NR MAC downlink PDU for RAR
|
||||
GROUP = ALL:MAC:UE:WIRESHARK
|
||||
FORMAT = int,rnti : int,frame : int,slot : buffer,data
|
||||
ID = GNB_MAC_DL
|
||||
DESC = NR MAC downlink scheduler decision for an UE
|
||||
GROUP = ALL:MAC:GNB
|
||||
FORMAT = int,rnti : int,frame : int,slot : int,mcs : int,tbs
|
||||
ID = GNB_MAC_LCID_DL
|
||||
DESC = NR MAC downlink scheduler decision for an UE for a specific LCID
|
||||
GROUP = ALL:MAC:GNB
|
||||
FORMAT = int,rnti : int,frame : int,slot : int,lcid : int,data_size : int,tx_list_occupancy
|
||||
ID = GNB_MAC_UL
|
||||
DESC = NR MAC uplink scheduler decision for an UE
|
||||
GROUP = ALL:MAC:GNB
|
||||
FORMAT = int,rnti : int,frame : int,slot : int,mcs : int,tbs
|
||||
ID = GNB_MAC_LCID_UL
|
||||
DESC = NR MAC uplink traffic received for an UE for a specific LCID
|
||||
GROUP = ALL:MAC:GNB
|
||||
FORMAT = int,rnti : int,frame : int,slot : int,lcid : int,data_size
|
||||
|
||||
#RLC logs
|
||||
ID = ENB_RLC_DL
|
||||
|
||||
@@ -62,9 +62,13 @@ if(T_TRACER_GUI)
|
||||
tracer_logger tracer_view tracer_events)
|
||||
target_link_libraries(gnb PRIVATE png)
|
||||
|
||||
add_executable(ue ue.c)
|
||||
target_link_libraries(ue PRIVATE tracer_utils tracer_filter tracer_gui
|
||||
add_executable(gnb_mac gnb_mac.c)
|
||||
target_link_libraries(gnb_mac PRIVATE tracer_utils tracer_filter tracer_gui
|
||||
tracer_logger tracer_view tracer_events)
|
||||
|
||||
add_executable(ue ue.c)
|
||||
target_link_libraries(ue PRIVATE tracer_utils tracer_view tracer_gui
|
||||
tracer_logger tracer_filter tracer_events)
|
||||
target_link_libraries(ue PRIVATE png)
|
||||
|
||||
add_executable(vcd vcd.c)
|
||||
@@ -77,5 +81,5 @@ if(T_TRACER_GUI)
|
||||
|
||||
add_subdirectory(gui)
|
||||
|
||||
add_dependencies(T_tools enb gnb ue vcd to_vcd)
|
||||
add_dependencies(T_tools enb gnb gnb_mac ue vcd to_vcd)
|
||||
endif()
|
||||
|
||||
@@ -8,7 +8,7 @@ XLIBS=-lX11 -lpng -lXft
|
||||
|
||||
all: record replay extract_config textlog enb ue vcd macpdu2wireshark \
|
||||
extract_input_subframe extract_output_subframe to_vcd extract multi \
|
||||
gnb t_tracer_app_gnb t_tracer_app_ue
|
||||
gnb t_tracer_app_gnb t_tracer_app_ue gnb_mac
|
||||
|
||||
record: utils.o record.o database.o configuration.o
|
||||
$(CC) $(CFLAGS) -o record $^ $(LIBS)
|
||||
@@ -65,14 +65,18 @@ gnb: utils.o gnb.o database.o event.o handler.o configuration.o \
|
||||
filter/filter.a
|
||||
$(CC) $(CFLAGS) -o gnb $^ $(LIBS) $(XLIBS)
|
||||
|
||||
t_tracer_app_gnb: utils.o t_tracer_app_gnb.o database.o event.o handler.o configuration.o \
|
||||
logger/logger.a filter/filter.a
|
||||
t_tracer_app_gnb: utils.o t_tracer_app_gnb.o database.o event.o handler.o \
|
||||
configuration.o logger/logger.a filter/filter.a
|
||||
$(CC) $(CFLAGS) -o t_tracer_app_gnb $^ $(LIBS) $(XLIBS)
|
||||
|
||||
t_tracer_app_ue: utils.o t_tracer_app_ue.o database.o event.o handler.o configuration.o \
|
||||
logger/logger.a filter/filter.a
|
||||
t_tracer_app_ue: utils.o t_tracer_app_ue.o database.o event.o handler.o \
|
||||
configuration.o logger/logger.a filter/filter.a
|
||||
$(CC) $(CFLAGS) -o t_tracer_app_ue $^ $(LIBS) $(XLIBS)
|
||||
|
||||
gnb_mac: gnb_mac.o gui/gui.a view/view.a logger/logger.a filter/filter.a \
|
||||
utils.o database.o configuration.o handler.o event.o
|
||||
$(CC) $(CFLAGS) -o gnb_mac $^ $(LIBS) $(XLIBS)
|
||||
|
||||
multi.o: ../incgen/T_IDs.h
|
||||
|
||||
../incgen/T_IDs.h: ../T_messages.txt
|
||||
@@ -98,7 +102,8 @@ filter/filter.a:
|
||||
clean:
|
||||
rm -f *.o core tracer_remote textlog enb ue vcd record replay
|
||||
rm -f extract_config macpdu2wireshark extract_input_subframe
|
||||
rm -f extract_output_subframe to_vcd extract multi gnb t_tracer_app_gnb t_tracer_app_ue
|
||||
rm -f extract_output_subframe to_vcd extract multi gnb
|
||||
rm -f t_tracer_app_gnb t_tracer_app_ue gnb_mac
|
||||
cd gui && $(MAKE) clean
|
||||
cd view && $(MAKE) clean
|
||||
cd logger && $(MAKE) clean
|
||||
|
||||
@@ -340,12 +340,12 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
||||
l = new_ttilog(h, database,
|
||||
"ENB_PHY_PUCCH_1_ENERGY", "frame", "subframe", "threshold", 0);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pucch1_energy_ue_threshold_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"ENB_PHY_PUCCH_1_ENERGY", "frame", "subframe", "energy", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pucch1_energy_ue_energy_logger = l;
|
||||
|
||||
@@ -368,7 +368,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe",
|
||||
"ENB_PHY_DLSCH_UE_DCI", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->dl_mcs_logger = l;
|
||||
|
||||
@@ -379,7 +379,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe",
|
||||
"ENB_PHY_ULSCH_UE_DCI", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->ul_mcs_logger = l;
|
||||
|
||||
@@ -394,8 +394,8 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
|
||||
widget_add_child(g, col, w, -1);
|
||||
container_set_child_growable(g, col, w, 1);
|
||||
l = new_throughputlog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe",
|
||||
"ENB_PHY_DLSCH_UE_DCI", "TBS");
|
||||
v = new_view_scrolltti(10, g, w, new_color(g, "#0c0c72"), w2);
|
||||
"ENB_PHY_DLSCH_UE_DCI", "TBS", 10);
|
||||
v = new_view_scrolltti(10, g, w, new_color(g, "#0c0c72"), w2, 10);
|
||||
logger_add_view(l, v);
|
||||
|
||||
/* UE x UL PHY (truly: DCI) throughput */
|
||||
@@ -409,8 +409,8 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
|
||||
widget_add_child(g, col, w, -1);
|
||||
container_set_child_growable(g, col, w, 1);
|
||||
l = new_throughputlog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe",
|
||||
"ENB_PHY_ULSCH_UE_DCI", "TBS");
|
||||
v = new_view_scrolltti(10, g, w, new_color(g, "#0c0c72"), w2);
|
||||
"ENB_PHY_ULSCH_UE_DCI", "TBS", 10);
|
||||
v = new_view_scrolltti(10, g, w, new_color(g, "#0c0c72"), w2, 10);
|
||||
logger_add_view(l, v);
|
||||
|
||||
/* downlink/uplink UE DCIs */
|
||||
|
||||
332
common/utils/T/tracer/gnb_mac.c
Normal file
332
common/utils/T/tracer/gnb_mac.c
Normal file
@@ -0,0 +1,332 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "utils.h"
|
||||
#include "gui/gui.h"
|
||||
#include "view/view.h"
|
||||
#include "logger/logger.h"
|
||||
#include "filter/filter.h"
|
||||
#include "database.h"
|
||||
#include "configuration.h"
|
||||
#include "handler.h"
|
||||
|
||||
typedef struct {
|
||||
int used;
|
||||
} ue_list_item;
|
||||
|
||||
typedef struct {
|
||||
widget *container;
|
||||
} gnb_gui;
|
||||
|
||||
typedef struct {
|
||||
int socket;
|
||||
gui *g;
|
||||
gnb_gui *gg;
|
||||
event_handler *h;
|
||||
void *database;
|
||||
ue_list_item ues[65536];
|
||||
int rnti_arg;
|
||||
} gnb_data;
|
||||
|
||||
void *gui_thread(void *_g)
|
||||
{
|
||||
gui *g = _g;
|
||||
gui_loop(g);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void add_ue(gnb_data *gd, int rnti, int lcid)
|
||||
{
|
||||
event_handler *h = gd->h;
|
||||
void *database = gd->database;
|
||||
gnb_gui *gg = gd->gg;
|
||||
gui *g = gd->g;
|
||||
widget *line;
|
||||
widget *w, *w2, *col;
|
||||
view *v;
|
||||
logger *l;
|
||||
|
||||
gd->ues[rnti].used = 1;
|
||||
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, gg->container, line, -1);
|
||||
|
||||
/* label */
|
||||
char s[512];
|
||||
sprintf(s, "UE %d", rnti);
|
||||
widget *label = new_label(g, s);
|
||||
widget_add_child(g, line, label, -1);
|
||||
|
||||
/* DL MCS */
|
||||
w = new_xy_plot(g, 128, 55, "DL mcs", 20);
|
||||
xy_plot_set_range(g, w, 0, 1024*20, -2, 30);
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "GNB_PHY_DL_TICK", "frame", "slot",
|
||||
"GNB_MAC_DL", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 20);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "GNB_MAC_DL", "rnti"),
|
||||
filter_int(rnti)));
|
||||
|
||||
/* DL TBS */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
w = new_xy_plot(g, 70, 10, "DL tbs", 35);
|
||||
w2 = new_textarea(g, 70, 11, 64);
|
||||
xy_plot_set_range(g, w, 0, 1024*20, 0, 1000);
|
||||
xy_plot_set_tick_type(g, w, XY_PLOT_SCROLL_TICK);
|
||||
widget_add_child(g, col, w2, -1);
|
||||
widget_add_child(g, col, w, -1);
|
||||
container_set_child_growable(g, col, w, 1);
|
||||
l = new_ticked_ttilog(h, database, "GNB_PHY_DL_TICK", "frame", "slot",
|
||||
"GNB_MAC_DL", "tbs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 20);
|
||||
view_tti_enable_automax(v, w2);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "GNB_MAC_DL", "rnti"),
|
||||
filter_int(rnti)));
|
||||
|
||||
/* DL lcid throughput */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
sprintf(s, "DL lcid %d", lcid);
|
||||
w = new_xy_plot(g, 70, 10, s, 35);
|
||||
w2 = new_textarea(g, 70, 11, 64);
|
||||
xy_plot_set_range(g, w, 0, 1000, 0, 100000);
|
||||
xy_plot_set_tick_type(g, w, XY_PLOT_SCROLL_TICK);
|
||||
widget_add_child(g, col, w2, -1);
|
||||
widget_add_child(g, col, w, -1);
|
||||
container_set_child_growable(g, col, w, 1);
|
||||
l = new_throughputlog(h, database, "GNB_PHY_DL_TICK", "frame", "slot",
|
||||
"GNB_MAC_LCID_DL", "data_size", 20);
|
||||
v = new_view_scrolltti(10, g, w, new_color(g, "#0c0c72"), w2, 20);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_and(
|
||||
filter_eq(
|
||||
filter_evarg(database, "GNB_MAC_LCID_DL", "rnti"),
|
||||
filter_int(rnti)),
|
||||
filter_eq(
|
||||
filter_evarg(database, "GNB_MAC_LCID_DL", "lcid"),
|
||||
filter_int(lcid))));
|
||||
|
||||
/* UL MCS */
|
||||
w = new_xy_plot(g, 128, 55, "UL mcs", 20);
|
||||
xy_plot_set_range(g, w, 0, 1024*20, -2, 30);
|
||||
widget_add_child(g, line, w, -1);
|
||||
/* GNB_PHY_DL_TICK (and not UL) because GNB_MAC_UL is from DCI */
|
||||
l = new_ticked_ttilog(h, database, "GNB_PHY_DL_TICK", "frame", "slot",
|
||||
"GNB_MAC_UL", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 20);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "GNB_MAC_UL", "rnti"),
|
||||
filter_int(rnti)));
|
||||
|
||||
/* UL TBS */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
w = new_xy_plot(g, 70, 10, "UL tbs", 35);
|
||||
w2 = new_textarea(g, 70, 11, 64);
|
||||
xy_plot_set_range(g, w, 0, 1024*20, 0, 1000);
|
||||
xy_plot_set_tick_type(g, w, XY_PLOT_SCROLL_TICK);
|
||||
widget_add_child(g, col, w2, -1);
|
||||
widget_add_child(g, col, w, -1);
|
||||
container_set_child_growable(g, col, w, 1);
|
||||
/* GNB_PHY_DL_TICK (and not UL) because GNB_MAC_UL is from DCI */
|
||||
l = new_ticked_ttilog(h, database, "GNB_PHY_DL_TICK", "frame", "slot",
|
||||
"GNB_MAC_UL", "tbs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 20);
|
||||
view_tti_enable_automax(v, w2);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "GNB_MAC_UL", "rnti"),
|
||||
filter_int(rnti)));
|
||||
|
||||
/* UL lcid throughput */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
sprintf(s, "UL lcid %d", lcid);
|
||||
w = new_xy_plot(g, 70, 10, s, 35);
|
||||
w2 = new_textarea(g, 70, 11, 64);
|
||||
xy_plot_set_range(g, w, 0, 1000, 0, 100000);
|
||||
xy_plot_set_tick_type(g, w, XY_PLOT_SCROLL_TICK);
|
||||
widget_add_child(g, col, w2, -1);
|
||||
widget_add_child(g, col, w, -1);
|
||||
container_set_child_growable(g, col, w, 1);
|
||||
l = new_throughputlog(h, database, "GNB_PHY_UL_TICK", "frame", "slot",
|
||||
"GNB_MAC_LCID_UL", "data_size", 20);
|
||||
v = new_view_scrolltti(10, g, w, new_color(g, "#0c0c72"), w2, 20);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_and(
|
||||
filter_eq(
|
||||
filter_evarg(database, "GNB_MAC_LCID_UL", "rnti"),
|
||||
filter_int(rnti)),
|
||||
filter_eq(
|
||||
filter_evarg(database, "GNB_MAC_LCID_UL", "lcid"),
|
||||
filter_int(lcid))));
|
||||
|
||||
/* lcid RLC tx buffer occupancy */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
sprintf(s, "rlc tx %d", lcid);
|
||||
w = new_xy_plot(g, 70, 10, s, 35);
|
||||
w2 = new_textarea(g, 70, 11, 64);
|
||||
xy_plot_set_range(g, w, 0, 1024*20, 0, 1000);
|
||||
xy_plot_set_tick_type(g, w, XY_PLOT_SCROLL_TICK);
|
||||
widget_add_child(g, col, w2, -1);
|
||||
widget_add_child(g, col, w, -1);
|
||||
container_set_child_growable(g, col, w, 1);
|
||||
l = new_ticked_ttilog(h, database, "GNB_PHY_DL_TICK", "frame", "slot",
|
||||
"GNB_MAC_LCID_DL", "tx_list_occupancy", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 20);
|
||||
view_tti_enable_automax(v, w2);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_and(
|
||||
filter_eq(
|
||||
filter_evarg(database, "GNB_MAC_LCID_DL", "rnti"),
|
||||
filter_int(rnti)),
|
||||
filter_eq(
|
||||
filter_evarg(database, "GNB_MAC_LCID_DL", "lcid"),
|
||||
filter_int(lcid))));
|
||||
}
|
||||
|
||||
void build_gui(gnb_gui *gg, gui *g)
|
||||
{
|
||||
widget *main_window;
|
||||
|
||||
main_window = new_toplevel_window(g, 900, 1000, "gNB MAC tracer");
|
||||
gg->container = new_container(g, VERTICAL);
|
||||
widget_add_child(g, main_window, gg->container, -1);
|
||||
}
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
printf(
|
||||
"options:\n"
|
||||
" -d <database file> this option is mandatory\n"
|
||||
" -ip <host> connect to given IP address (default %s)\n"
|
||||
" -p <port> connect to given port (default %d)\n",
|
||||
DEFAULT_REMOTE_IP,
|
||||
DEFAULT_REMOTE_PORT
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void check_new_ue(void *_gd, event e)
|
||||
{
|
||||
gnb_data *gd = _gd;
|
||||
int rnti = e.e[gd->rnti_arg].i;
|
||||
if (!gd->ues[rnti].used)
|
||||
add_ue(gd, rnti, 4);
|
||||
}
|
||||
|
||||
int main(int n, char **v)
|
||||
{
|
||||
gui *g;
|
||||
gnb_gui gg;
|
||||
gnb_data *gd;
|
||||
char *database_filename = NULL;
|
||||
void *database;
|
||||
char *ip = DEFAULT_REMOTE_IP;
|
||||
int port = DEFAULT_REMOTE_PORT;
|
||||
event_handler *h;
|
||||
int *is_on;
|
||||
int number_of_events;
|
||||
int i;
|
||||
|
||||
for (i = 1; i < n; i++) {
|
||||
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
|
||||
if (!strcmp(v[i], "-d")) { if (i > n-2) usage(); database_filename = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-p")) { if (i > n-2) usage(); port = atoi(v[++i]); continue; }
|
||||
usage();
|
||||
}
|
||||
|
||||
if (database_filename == NULL) {
|
||||
printf("ERROR: provide a database file (-d)\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
database = parse_database(database_filename);
|
||||
|
||||
load_config_file(database_filename);
|
||||
|
||||
number_of_events = number_of_ids(database);
|
||||
is_on = calloc(number_of_events, sizeof(int));
|
||||
if (is_on == NULL) abort();
|
||||
|
||||
on_off(database, "GNB_PHY_DL_TICK", is_on, 1);
|
||||
on_off(database, "GNB_MAC_DL", is_on, 1);
|
||||
on_off(database, "GNB_MAC_LCID_DL", is_on, 1);
|
||||
on_off(database, "GNB_PHY_UL_TICK", is_on, 1);
|
||||
on_off(database, "GNB_MAC_UL", is_on, 1);
|
||||
on_off(database, "GNB_MAC_LCID_UL", is_on, 1);
|
||||
|
||||
gd = calloc(1, sizeof(*gd)); if (!gd) abort();
|
||||
|
||||
h = new_handler(database);
|
||||
|
||||
g = gui_init();
|
||||
new_thread(gui_thread, g);
|
||||
|
||||
build_gui(&gg, g);
|
||||
|
||||
gd->g = g;
|
||||
gd->gg = ≫
|
||||
gd->h = h;
|
||||
gd->database = database;
|
||||
|
||||
/* get rnti_arg from event GNB_MAC_DL */
|
||||
int event_id = event_id_from_name(database, "GNB_MAC_DL");
|
||||
database_event_format f = get_format(database, event_id);
|
||||
gd->rnti_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], "rnti")) gd->rnti_arg = i;
|
||||
}
|
||||
if (gd->rnti_arg == -1) {
|
||||
printf("fatal: event 'GNB_MAC_DL' does not have argument 'rnti'\n");
|
||||
exit(1);
|
||||
}
|
||||
if (strcmp(f.type[gd->rnti_arg], "int") != 0) {
|
||||
printf("fatal: argument 'rnti' of event 'GNB_MAC_DL' is not 'int'\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
register_handler_function(h, event_id, check_new_ue, gd);
|
||||
|
||||
OBUF ebuf = {.osize = 0, .omaxsize = 0, .obuf = NULL};
|
||||
|
||||
gd->socket = -1;
|
||||
|
||||
restart:
|
||||
clear_remote_config();
|
||||
if (gd->socket != -1) close(gd->socket);
|
||||
gd->socket = connect_to(ip, port);
|
||||
|
||||
/* send the first message - activate selected traces */
|
||||
int t = 1;
|
||||
if (socket_send(gd->socket, &t, 1) == -1 ||
|
||||
socket_send(gd->socket, &number_of_events, sizeof(int)) == -1 ||
|
||||
socket_send(gd->socket, is_on, number_of_events * sizeof(int)) == -1)
|
||||
goto restart;
|
||||
|
||||
while (1) {
|
||||
event e;
|
||||
e = get_event(gd->socket, &ebuf, database);
|
||||
if (e.type == -1) goto restart;
|
||||
handle_event(h, e);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -54,6 +54,8 @@ void container_set_child_growable(gui *_gui, widget *_this,
|
||||
int xy_plot_new_plot(gui *gui, widget *this, int color);
|
||||
void xy_plot_set_range(gui *gui, widget *this,
|
||||
float xmin, float xmax, float ymin, float ymax);
|
||||
void xy_plot_get_range(gui *gui, widget *this,
|
||||
float *xmin, float *xmax, float *ymin, float *ymax);
|
||||
void xy_plot_set_points(gui *gui, widget *this,
|
||||
int plot, int npoints, float *x, float *y);
|
||||
void xy_plot_get_dimensions(gui *gui, widget *this, int *width, int *height);
|
||||
|
||||
@@ -280,6 +280,22 @@ void xy_plot_set_range(gui *_gui, widget *_this,
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
void xy_plot_get_range(gui *_gui, widget *_this,
|
||||
float *xmin, float *xmax, float *ymin, float *ymax)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct xy_plot_widget *this = _this;
|
||||
|
||||
glock(g);
|
||||
|
||||
*xmin = this->xmin;
|
||||
*xmax = this->xmax;
|
||||
*ymin = this->ymin;
|
||||
*ymax = this->ymax;
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
void xy_plot_set_points(gui *_gui, widget *_this, int plot,
|
||||
int npoints, float *x, float *y)
|
||||
{
|
||||
|
||||
@@ -15,8 +15,8 @@ logger *new_ticked_ttilog(void *event_handler, void *database,
|
||||
char *event_name, char *data_varname,
|
||||
int convert_to_dB, float empty_value);
|
||||
logger *new_throughputlog(void *event_handler, void *database,
|
||||
char *tick_event_name, char *frame_varname, char *subframe_varname,
|
||||
char *event_name, char *data_varname);
|
||||
char *tick_event_name, char *frame_varname, char *tick_varname,
|
||||
char *event_name, char *data_varname, int ticks_per_frame);
|
||||
logger *new_timelog(void *event_handler, void *database, char *event_name);
|
||||
logger *new_ticklog(void *event_handler, void *database,
|
||||
char *event_name, char *frame_name, char *subframe_name);
|
||||
|
||||
@@ -13,13 +13,14 @@ struct throughputlog {
|
||||
struct logger common;
|
||||
void *database;
|
||||
int tick_frame_arg;
|
||||
int tick_subframe_arg;
|
||||
int tick_tick_arg;
|
||||
int data_frame_arg;
|
||||
int data_subframe_arg;
|
||||
int data_tick_arg;
|
||||
int data_arg;
|
||||
int last_tick_frame;
|
||||
int last_tick_subframe;
|
||||
unsigned long bits[1000];
|
||||
int last_tick_tick;
|
||||
int ticks_per_frame;
|
||||
unsigned long *bits;
|
||||
unsigned long total;
|
||||
int insert_point;
|
||||
char *tick_event_name;
|
||||
@@ -32,16 +33,16 @@ static void _event(void *p, event e)
|
||||
{
|
||||
struct throughputlog *l = p;
|
||||
int frame;
|
||||
int subframe;
|
||||
int tick;
|
||||
unsigned long value;
|
||||
|
||||
if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0)
|
||||
return;
|
||||
|
||||
frame = e.e[l->data_frame_arg].i;
|
||||
subframe = e.e[l->data_subframe_arg].i;
|
||||
tick = e.e[l->data_tick_arg].i;
|
||||
|
||||
if (frame != l->last_tick_frame || subframe != l->last_tick_subframe) {
|
||||
if (frame != l->last_tick_frame || tick != l->last_tick_tick) {
|
||||
printf("WARNING: %s:%d: data comes without previous tick!\n",
|
||||
__FILE__, __LINE__);
|
||||
return;
|
||||
@@ -62,28 +63,34 @@ static void _tick_event(void *p, event e)
|
||||
struct throughputlog *l = p;
|
||||
int i;
|
||||
int frame;
|
||||
int subframe;
|
||||
int tick;
|
||||
|
||||
if (l->tick_filter != NULL && filter_eval(l->tick_filter, e) == 0)
|
||||
return;
|
||||
|
||||
frame = e.e[l->tick_frame_arg].i;
|
||||
subframe = e.e[l->tick_subframe_arg].i;
|
||||
tick = e.e[l->tick_tick_arg].i;
|
||||
|
||||
for (i = 0; i < l->common.vsize; i++)
|
||||
l->common.v[i]->append(l->common.v[i], frame, subframe, (double)l->total);
|
||||
l->common.v[i]->append(l->common.v[i], frame, tick, (double)l->total);
|
||||
|
||||
l->insert_point = (l->insert_point + 1) % 1000;
|
||||
l->total -= l->bits[l->insert_point];
|
||||
l->bits[l->insert_point] = 0;
|
||||
while (l->last_tick_frame != frame || l->last_tick_tick != tick) {
|
||||
l->insert_point = (l->insert_point + 1) % (100 * l->ticks_per_frame);
|
||||
l->total -= l->bits[l->insert_point];
|
||||
l->bits[l->insert_point] = 0;
|
||||
l->last_tick_tick++;
|
||||
if (l->last_tick_tick == l->ticks_per_frame) {
|
||||
l->last_tick_tick = 0;
|
||||
l->last_tick_frame++;
|
||||
l->last_tick_frame %= 1024;
|
||||
}
|
||||
}
|
||||
|
||||
l->last_tick_frame = frame;
|
||||
l->last_tick_subframe = subframe;
|
||||
}
|
||||
|
||||
logger *new_throughputlog(event_handler *h, void *database,
|
||||
char *tick_event_name, char *frame_varname, char *subframe_varname,
|
||||
char *event_name, char *data_varname)
|
||||
char *tick_event_name, char *frame_varname, char *tick_varname,
|
||||
char *event_name, char *data_varname, int ticks_per_frame)
|
||||
{
|
||||
struct throughputlog *ret;
|
||||
int event_id;
|
||||
@@ -106,21 +113,21 @@ logger *new_throughputlog(event_handler *h, void *database,
|
||||
|
||||
f = get_format(database, event_id);
|
||||
|
||||
/* look for frame and subframe */
|
||||
/* look for frame and tick */
|
||||
ret->tick_frame_arg = -1;
|
||||
ret->tick_subframe_arg = -1;
|
||||
ret->tick_tick_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], frame_varname)) ret->tick_frame_arg = i;
|
||||
if (!strcmp(f.name[i], subframe_varname)) ret->tick_subframe_arg = i;
|
||||
if (!strcmp(f.name[i], tick_varname)) ret->tick_tick_arg = i;
|
||||
}
|
||||
if (ret->tick_frame_arg == -1) {
|
||||
printf("%s:%d: frame argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, frame_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->tick_subframe_arg == -1) {
|
||||
printf("%s:%d: subframe argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, subframe_varname, event_name);
|
||||
if (ret->tick_tick_arg == -1) {
|
||||
printf("%s:%d: tick argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, tick_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->tick_frame_arg], "int") != 0) {
|
||||
@@ -128,9 +135,9 @@ logger *new_throughputlog(event_handler *h, void *database,
|
||||
__FILE__, __LINE__, frame_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->tick_subframe_arg], "int") != 0) {
|
||||
if (strcmp(f.type[ret->tick_tick_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, subframe_varname);
|
||||
__FILE__, __LINE__, tick_varname);
|
||||
abort();
|
||||
}
|
||||
|
||||
@@ -141,13 +148,13 @@ logger *new_throughputlog(event_handler *h, void *database,
|
||||
|
||||
f = get_format(database, event_id);
|
||||
|
||||
/* look for frame, subframe and data args */
|
||||
/* look for frame, tick and data args */
|
||||
ret->data_frame_arg = -1;
|
||||
ret->data_subframe_arg = -1;
|
||||
ret->data_tick_arg = -1;
|
||||
ret->data_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], frame_varname)) ret->data_frame_arg = i;
|
||||
if (!strcmp(f.name[i], subframe_varname)) ret->data_subframe_arg = i;
|
||||
if (!strcmp(f.name[i], tick_varname)) ret->data_tick_arg = i;
|
||||
if (!strcmp(f.name[i], data_varname)) ret->data_arg = i;
|
||||
}
|
||||
if (ret->data_frame_arg == -1) {
|
||||
@@ -155,9 +162,9 @@ logger *new_throughputlog(event_handler *h, void *database,
|
||||
__FILE__, __LINE__, frame_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->data_subframe_arg == -1) {
|
||||
printf("%s:%d: subframe argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, subframe_varname, event_name);
|
||||
if (ret->data_tick_arg == -1) {
|
||||
printf("%s:%d: tick argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, tick_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->data_arg == -1) {
|
||||
@@ -170,9 +177,9 @@ logger *new_throughputlog(event_handler *h, void *database,
|
||||
__FILE__, __LINE__, frame_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_subframe_arg], "int") != 0) {
|
||||
if (strcmp(f.type[ret->data_tick_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, subframe_varname);
|
||||
__FILE__, __LINE__, tick_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_arg], "int") != 0 &&
|
||||
@@ -183,6 +190,10 @@ logger *new_throughputlog(event_handler *h, void *database,
|
||||
abort();
|
||||
}
|
||||
|
||||
ret->ticks_per_frame = ticks_per_frame;
|
||||
ret->bits = calloc(100 * ticks_per_frame, sizeof(unsigned long));
|
||||
if (ret->bits == NULL) abort();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -250,15 +250,15 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -130, 35);
|
||||
/*l = new_ticked_ttilog(h, database,"UE_PHY_DL_TICK", "frame", "subframe","UE_PHY_MEAS", "rssi", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->phy_meas_logger = l;*/
|
||||
l = new_ticked_ttilog(h, database,"UE_PHY_DL_TICK", "frame", "subframe","UE_PHY_MEAS", "rsrp", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->phy_meas_logger = l;
|
||||
l = new_ticked_ttilog(h, database,"UE_PHY_DL_TICK", "frame", "subframe","UE_PHY_MEAS", "snr", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c720c"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c720c"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->phy_meas_logger = l;
|
||||
|
||||
@@ -277,7 +277,7 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "UE_PHY_DL_TICK", "frame", "subframe",
|
||||
"UE_PHY_DLSCH_UE_DCI", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->dl_mcs_logger = l;
|
||||
|
||||
@@ -288,7 +288,7 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "UE_PHY_DL_TICK", "frame", "subframe",
|
||||
"UE_PHY_ULSCH_UE_DCI", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->ul_mcs_logger = l;
|
||||
|
||||
@@ -301,12 +301,12 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -30, 50);
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PUSCH_TX_POWER", "frame", "subframe", "p0_pusch", 0);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pusch_power_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PUSCH_TX_POWER", "frame", "subframe", "ampl", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pusch_ampl_logger = l;
|
||||
|
||||
@@ -319,12 +319,12 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -30, 50);
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PUCCH_TX_POWER", "frame", "subframe", "p0_pucch", 0);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pucch_power_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PUCCH_TX_POWER", "frame", "subframe", "ampl", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pucch_ampl_logger = l;
|
||||
|
||||
@@ -335,22 +335,22 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level00", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pdsch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level01", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#00ff00"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#00ff00"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pdsch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level10", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0f0f0f"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0f0f0f"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pdsch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level11", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0000ff"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0000ff"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pdsch_energy_logger = l;
|
||||
|
||||
@@ -361,22 +361,22 @@ static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level00", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pdcch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level01", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#00ff00"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#00ff00"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pdcch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level10", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0f0f0f"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0f0f0f"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pdcch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level11", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0000ff"));
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0000ff"), 10);
|
||||
logger_add_view(l, v);
|
||||
e->pdcch_energy_logger = l;
|
||||
|
||||
|
||||
@@ -15,11 +15,14 @@ struct scrolltti {
|
||||
int plot;
|
||||
float refresh_rate;
|
||||
pthread_mutex_t lock;
|
||||
unsigned long data[1000];
|
||||
unsigned long total; /* sum data[0..999] to have smoother value printed */
|
||||
float xout[1000];
|
||||
float yout[1000];
|
||||
int ticks_per_frame;
|
||||
unsigned long *data;
|
||||
unsigned long total; /* sum data[0..n] to have smoother value printed */
|
||||
float *xout;
|
||||
float *yout;
|
||||
int insert_point;
|
||||
int next_tick_frame;
|
||||
int next_tick_tick;
|
||||
};
|
||||
|
||||
/* this array is used to get Y range 1000, 2000, 5000, 10000, ... */
|
||||
@@ -38,21 +41,21 @@ static void *scrolltti_thread(void *_this)
|
||||
/* TODO: optimize */
|
||||
p = this->insert_point;
|
||||
max = 0;
|
||||
for (i = 0; i < 1000; i++) {
|
||||
for (i = 0; i < this->ticks_per_frame * 100; i++) {
|
||||
this->xout[i] = i;
|
||||
this->yout[i] = this->data[p];
|
||||
if (this->data[p] > max) max = this->data[p];
|
||||
p = (p + 1) % 1000;
|
||||
p = (p + 1) % (this->ticks_per_frame * 100);
|
||||
}
|
||||
bps(o, this->total/1000., "b/s");
|
||||
bps(o, this->total/(this->ticks_per_frame * 100.), "b/s");
|
||||
textarea_set_text(this->g, this->throughput_textarea, o);
|
||||
/* for Y range we want 1000, 2000, 5000, 10000, 20000, 50000, etc. */
|
||||
if (max < 1000) max = 1000;
|
||||
mlog = pow(10, floor(log10(max)));
|
||||
max = tolog[(int)ceil(max/mlog)] * mlog;
|
||||
xy_plot_set_range(this->g, this->w, 0, 1000, 0, max);
|
||||
xy_plot_set_range(this->g, this->w, 0, this->ticks_per_frame * 100, 0, max);
|
||||
xy_plot_set_points(this->g, this->w, this->plot,
|
||||
1000, this->xout, this->yout);
|
||||
this->ticks_per_frame * 100, this->xout, this->yout);
|
||||
if (pthread_mutex_unlock(&this->lock)) abort();
|
||||
sleepms(1000/this->refresh_rate);
|
||||
}
|
||||
@@ -65,20 +68,40 @@ static void clear(view *this)
|
||||
/* TODO */
|
||||
}
|
||||
|
||||
static void append(view *_this, int frame, int subframe, double value)
|
||||
static void insert(struct scrolltti *this, double value)
|
||||
{
|
||||
this->total -= this->data[this->insert_point];
|
||||
this->data[this->insert_point] = value;
|
||||
this->total += this->data[this->insert_point];
|
||||
this->insert_point = (this->insert_point + 1) % (this->ticks_per_frame * 100);
|
||||
}
|
||||
|
||||
static void next_tick(struct scrolltti *this)
|
||||
{
|
||||
this->next_tick_tick++;
|
||||
if (this->next_tick_tick == this->ticks_per_frame) {
|
||||
this->next_tick_tick = 0;
|
||||
this->next_tick_frame++;
|
||||
this->next_tick_frame %= 1024;
|
||||
}
|
||||
}
|
||||
|
||||
static void append(view *_this, int frame, int tick, double value)
|
||||
{
|
||||
struct scrolltti *this = (struct scrolltti *)_this;
|
||||
|
||||
if (pthread_mutex_lock(&this->lock)) abort();
|
||||
this->total -= this->data[this->insert_point];
|
||||
this->data[this->insert_point] = value;
|
||||
this->total += this->data[this->insert_point];
|
||||
this->insert_point = (this->insert_point + 1) % 1000;
|
||||
while (this->next_tick_frame != frame || this->next_tick_tick != tick) {
|
||||
insert(this, 0);
|
||||
next_tick(this);
|
||||
}
|
||||
insert(this, value);
|
||||
next_tick(this);
|
||||
if (pthread_mutex_unlock(&this->lock)) abort();
|
||||
}
|
||||
|
||||
view *new_view_scrolltti(float refresh_rate, gui *g, widget *w, int color,
|
||||
widget *throughput_textarea)
|
||||
widget *throughput_textarea, int ticks_per_frame)
|
||||
{
|
||||
struct scrolltti *ret = calloc(1, sizeof(struct scrolltti));
|
||||
if (ret == NULL) abort();
|
||||
@@ -92,6 +115,14 @@ view *new_view_scrolltti(float refresh_rate, gui *g, widget *w, int color,
|
||||
ret->throughput_textarea = throughput_textarea;
|
||||
ret->plot = xy_plot_new_plot(g, w, color);
|
||||
|
||||
ret->ticks_per_frame = ticks_per_frame;
|
||||
ret->data = calloc(ticks_per_frame * 100, sizeof(unsigned long));
|
||||
if (ret->data == NULL) abort();
|
||||
ret->xout = calloc(ticks_per_frame * 100, sizeof(float));
|
||||
if (ret->xout == NULL) abort();
|
||||
ret->yout = calloc(ticks_per_frame * 100, sizeof(float));
|
||||
if (ret->yout == NULL) abort();
|
||||
|
||||
if (pthread_mutex_init(&ret->lock, NULL)) abort();
|
||||
|
||||
new_thread(scrolltti_thread, ret);
|
||||
|
||||
@@ -5,31 +5,36 @@
|
||||
#include <pthread.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
struct tti {
|
||||
view common;
|
||||
gui *g;
|
||||
widget *w;
|
||||
int automax;
|
||||
widget *w2;
|
||||
int plot;
|
||||
float refresh_rate;
|
||||
pthread_mutex_t lock;
|
||||
float data[1024*10];
|
||||
int valid[1024*10];
|
||||
float xout[1024*10];
|
||||
float yout[1024*10];
|
||||
float *data;
|
||||
int *valid;
|
||||
float *xout;
|
||||
float *yout;
|
||||
int last_insert_point;
|
||||
int ticks_per_frame;
|
||||
};
|
||||
|
||||
static int far_enough(int i, int last_insert, int plot_width)
|
||||
static int far_enough(int i, int last_insert, int plot_width,
|
||||
int ticks_per_frame)
|
||||
{
|
||||
int p1;
|
||||
int p2;
|
||||
int hole_size_px;
|
||||
int hole_size_tti;
|
||||
hole_size_px = 10;
|
||||
hole_size_tti = 10240 * hole_size_px / plot_width;
|
||||
hole_size_tti = 1024 * ticks_per_frame * hole_size_px / plot_width;
|
||||
p1 = last_insert;
|
||||
p2 = (last_insert + hole_size_tti) % (1024*10);
|
||||
p2 = (last_insert + hole_size_tti) % (1024 * ticks_per_frame);
|
||||
if (p1 < p2) {
|
||||
return !(i > p1 && i < p2);
|
||||
}
|
||||
@@ -48,15 +53,31 @@ static void *tti_thread(void *_this)
|
||||
if (pthread_mutex_lock(&this->lock)) abort();
|
||||
xy_plot_get_dimensions(this->g, this->w, &plot_width, &plot_height);
|
||||
length = 0;
|
||||
double max = 0;
|
||||
/* TODO: optimize */
|
||||
for (i = 0; i < 1024*10; i++)
|
||||
for (i = 0; i < 1024 * this->ticks_per_frame; i++)
|
||||
/* do not take points too close after last insertion point */
|
||||
if (this->valid[i] &&
|
||||
far_enough(i, this->last_insert_point, plot_width)) {
|
||||
far_enough(i, this->last_insert_point, plot_width,
|
||||
this->ticks_per_frame)) {
|
||||
this->xout[length] = i;
|
||||
this->yout[length] = this->data[i];
|
||||
if (this->data[i] > max) max = this->data[i];
|
||||
length++;
|
||||
}
|
||||
if (this->automax) {
|
||||
char o[128];
|
||||
sprintf(o, "%d", (int)max);
|
||||
textarea_set_text(this->g, this->w2, o);
|
||||
/* for Y range we want 10, 20, 50, 100, 200, 500, etc. */
|
||||
if (max < 10) max = 10;
|
||||
double mlog = pow(10, floor(log10(max)));
|
||||
static int tolog[11] = { -1, 1, 2, 5, 5, 5, 10, 10, 10, 10, 10 };
|
||||
max = tolog[(int)ceil(max/mlog)] * mlog;
|
||||
float xmin, xmax, ymin, ymax;
|
||||
xy_plot_get_range(this->g, this->w, &xmin, &xmax, &ymin, &ymax);
|
||||
xy_plot_set_range(this->g, this->w, xmin, xmax, 0, max);
|
||||
}
|
||||
xy_plot_set_points(this->g, this->w, this->plot,
|
||||
length, this->xout, this->yout);
|
||||
if (pthread_mutex_unlock(&this->lock)) abort();
|
||||
@@ -71,11 +92,11 @@ static void clear(view *this)
|
||||
/* TODO */
|
||||
}
|
||||
|
||||
static void append(view *_this, int frame, int subframe, double value)
|
||||
static void append(view *_this, int frame, int tick, double value)
|
||||
{
|
||||
struct tti *this = (struct tti *)_this;
|
||||
int i;
|
||||
int index = frame * 10 + subframe;
|
||||
int index = frame * this->ticks_per_frame + tick;
|
||||
|
||||
if (pthread_mutex_lock(&this->lock)) abort();
|
||||
|
||||
@@ -84,10 +105,10 @@ static void append(view *_this, int frame, int subframe, double value)
|
||||
* this may be wrong if delay between two append is
|
||||
* greater than 1024 frames (something like that)
|
||||
*/
|
||||
i = (this->last_insert_point + 1) % (1024*10);
|
||||
i = (this->last_insert_point + 1) % (1024 * this->ticks_per_frame);
|
||||
while (i != index) {
|
||||
this->valid[i] = 0;
|
||||
i = (i + 1) % (1024*10);
|
||||
i = (i + 1) % (1024 * this->ticks_per_frame);
|
||||
}
|
||||
|
||||
this->data[index] = value;
|
||||
@@ -98,7 +119,8 @@ static void append(view *_this, int frame, int subframe, double value)
|
||||
if (pthread_mutex_unlock(&this->lock)) abort();
|
||||
}
|
||||
|
||||
view *new_view_tti(float refresh_rate, gui *g, widget *w, int color)
|
||||
view *new_view_tti(float refresh_rate, gui *g, widget *w, int color,
|
||||
int ticks_per_frame)
|
||||
{
|
||||
struct tti *ret = calloc(1, sizeof(struct tti));
|
||||
if (ret == NULL) abort();
|
||||
@@ -115,7 +137,24 @@ view *new_view_tti(float refresh_rate, gui *g, widget *w, int color)
|
||||
|
||||
if (pthread_mutex_init(&ret->lock, NULL)) abort();
|
||||
|
||||
ret->ticks_per_frame = ticks_per_frame;
|
||||
ret->data = calloc(ticks_per_frame * 1024, sizeof(float));
|
||||
if (ret->data == NULL) abort();
|
||||
ret->valid = calloc(ticks_per_frame * 1024, sizeof(int));
|
||||
if (ret->valid == NULL) abort();
|
||||
ret->xout = calloc(ticks_per_frame * 1024, sizeof(float));
|
||||
if (ret->xout == NULL) abort();
|
||||
ret->yout = calloc(ticks_per_frame * 1024, sizeof(float));
|
||||
if (ret->yout == NULL) abort();
|
||||
|
||||
new_thread(tti_thread, ret);
|
||||
|
||||
return (view *)ret;
|
||||
}
|
||||
|
||||
void view_tti_enable_automax(view *_tti, widget *w2)
|
||||
{
|
||||
struct tti *tti = (struct tti *)_tti;
|
||||
tti->automax = 1;
|
||||
tti->w2 = w2;
|
||||
}
|
||||
|
||||
@@ -17,15 +17,16 @@ view *new_view_stdout(void);
|
||||
view *new_view_textlist(int maxsize, float refresh_rate, gui *g, widget *w);
|
||||
view *new_view_xy(int length, float refresh_rate, gui *g, widget *w,
|
||||
int color, enum xy_mode mode);
|
||||
view *new_view_tti(float refresh_rate, gui *g, widget *w,
|
||||
int color);
|
||||
view *new_view_tti(float refresh_rate, gui *g, widget *w, int color,
|
||||
int ticks_per_frame);
|
||||
view *new_view_scrolltti(float refresh_rate, gui *g, widget *w,
|
||||
int color, widget *throughput_label);
|
||||
int color, widget *throughput_label, int ticks_per_frame);
|
||||
view *new_view_time(int number_of_seconds, float refresh_rate,
|
||||
gui *g, widget *w);
|
||||
view *new_subview_time(view *time, int line, int color, int size);
|
||||
view *new_view_ticktime(float refresh_rate, gui *g, widget *w);
|
||||
view *new_subview_ticktime(view *ticktime, int line, int color, int size);
|
||||
void ticktime_set_tick(view *ticktime, void *logger);
|
||||
void view_tti_enable_automax(view *tti, widget *w2);
|
||||
|
||||
#endif /* _VIEW_H_ */
|
||||
|
||||
@@ -1465,13 +1465,13 @@ frequency_range_t get_freq_range_from_band(uint16_t band)
|
||||
return band <= 256 ? FR1 : FR2;
|
||||
}
|
||||
|
||||
float get_beta_dmrs_pusch(int num_cdm_groups_no_data, pusch_dmrs_type_t dmrs_type)
|
||||
float get_beta_dmrs(int num_cdm_groups_no_data, bool is_type2)
|
||||
{
|
||||
float beta_dmrs_pusch = 1.0;
|
||||
if (num_cdm_groups_no_data == 2) {
|
||||
beta_dmrs_pusch = powf(10.0, 3.0 / 20.0);
|
||||
} else if (num_cdm_groups_no_data == 3) {
|
||||
if (dmrs_type == pusch_dmrs_type2)
|
||||
if (is_type2)
|
||||
beta_dmrs_pusch = powf(10.0, 4.77 / 20.0);
|
||||
}
|
||||
return beta_dmrs_pusch;
|
||||
|
||||
@@ -88,6 +88,8 @@ static inline const char *rnti_types(nr_rnti_type_t rr)
|
||||
#define NR_NUMBER_OF_SYMBOLS_PER_SLOT_EXTENDED_CP 12
|
||||
#define NR_MAX_NB_LAYERS 4 // 8
|
||||
|
||||
#define BOUNDED_EVAL(a, b, c) (min(c, max(a, b)))
|
||||
|
||||
// Since the IQ samples are represented by SQ15 R+I (see https://en.wikipedia.org/wiki/Q_(number_format)) we need to compensate when
|
||||
// calcualting signal energy. Instead of shifting each sample right by 15, we can normalize the result in dB scale once its
|
||||
// calcualted. Signal energy is calculated using RMS^2, where each sample is squared before taking the average of the sum, therefore
|
||||
@@ -175,6 +177,17 @@ typedef struct {
|
||||
uint32_t step;
|
||||
} NR_timer_t;
|
||||
|
||||
typedef struct val_init {
|
||||
int val;
|
||||
bool init;
|
||||
} val_init_t;
|
||||
|
||||
typedef struct meas_s {
|
||||
uint16_t Nid_cell;
|
||||
val_init_t ss_rsrp_dBm;
|
||||
val_init_t csi_rsrp_dBm;
|
||||
} meas_t;
|
||||
|
||||
/**
|
||||
* @brief To start a timer
|
||||
* @param timer Timer to be started
|
||||
@@ -320,15 +333,15 @@ frequency_range_t get_freq_range_from_arfcn(uint32_t arfcn);
|
||||
frequency_range_t get_freq_range_from_band(uint16_t band);
|
||||
|
||||
/**
|
||||
* @brief Calculates the scaling factor for the ratio of PUSCH EPRE to DMRS EPRE.
|
||||
* @brief Calculates the scaling factor for the ratio of PUSCH/PDSCH EPRE to DMRS EPRE.
|
||||
*
|
||||
* @param num_cdm_groups_no_data The number of CDM groups without data.
|
||||
* @param dmrs_type The DMRS type.
|
||||
* @return The calculated beta scaling factor for the ratio of PUSCH EPRE to DMRS EPRE.
|
||||
* @param is_type2 true if calculating for DMRS configuration type 2
|
||||
* @return The calculated beta scaling factor for the ratio of PUSCH/PDSCH EPRE to DMRS EPRE.
|
||||
*
|
||||
* @note The values are derived from TS 38.214 Table 6.2.2-1.
|
||||
* @note The values are the same for PUSCH and PDSCH and are derived from TS 38.214 Table 6.2.2-1./4.1-1
|
||||
*/
|
||||
float get_beta_dmrs_pusch(int num_cdm_groups_no_data, pusch_dmrs_type_t dmrs_type);
|
||||
float get_beta_dmrs(int num_cdm_groups_no_data, bool is_type2);
|
||||
|
||||
#define CEILIDIV(a,b) ((a+b-1)/b)
|
||||
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
|
||||
|
||||
@@ -62,7 +62,7 @@ add_dependencies(telnetsrv telnetsrv_ci)
|
||||
|
||||
message(STATUS "Add CI specific telnet functions for nrUE in telnetsrv_ciUE.so")
|
||||
add_library(telnetsrv_ciUE MODULE telnetsrv_ciUE.c)
|
||||
target_link_libraries(telnetsrv_ciUE PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
target_link_libraries(telnetsrv_ciUE PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs UTIL)
|
||||
add_dependencies(telnetsrv telnetsrv_ciUE)
|
||||
|
||||
message(STATUS "Add bearer specific telnet functions in libtelnetsrv_bearer.so")
|
||||
|
||||
@@ -375,32 +375,32 @@ char *telnet_getvarvalue(telnetshell_vardef_t *var, int varindex)
|
||||
char *val;
|
||||
switch (var[varindex].vartype) {
|
||||
case TELNET_VARTYPE_INT32:
|
||||
val = malloc(64);
|
||||
val = calloc_or_fail(1, 64);
|
||||
snprintf(val, 64, "%i", *(int32_t *)(var[varindex].varvalptr));
|
||||
break;
|
||||
|
||||
case TELNET_VARTYPE_INT64:
|
||||
val = malloc(128);
|
||||
val = calloc_or_fail(1, 128);
|
||||
snprintf(val, 128, "%lli", (long long)*(int64_t *)(var[varindex].varvalptr));
|
||||
break;
|
||||
|
||||
case TELNET_VARTYPE_INT16:
|
||||
val = malloc(16);
|
||||
val = calloc_or_fail(1, 16);
|
||||
snprintf(val, 16, "%hi", *(short *)(var[varindex].varvalptr));
|
||||
break;
|
||||
|
||||
case TELNET_VARTYPE_INT8:
|
||||
val = malloc(16);
|
||||
val = calloc_or_fail(1, 16);
|
||||
snprintf(val, 16, "%i", (int)(*(int8_t *)(var[varindex].varvalptr)));
|
||||
break;
|
||||
|
||||
case TELNET_VARTYPE_UINT:
|
||||
val = malloc(64);
|
||||
val = calloc_or_fail(1, 64);
|
||||
snprintf(val, 64, "%u", *(unsigned int *)(var[varindex].varvalptr));
|
||||
break;
|
||||
|
||||
case TELNET_VARTYPE_DOUBLE:
|
||||
val = malloc(32);
|
||||
val = calloc_or_fail(1, 32);
|
||||
snprintf(val, 32, "%g\n", *(double *)(var[varindex].varvalptr));
|
||||
break;
|
||||
|
||||
@@ -409,7 +409,7 @@ char *telnet_getvarvalue(telnetshell_vardef_t *var, int varindex)
|
||||
break;
|
||||
|
||||
default:
|
||||
val = malloc(64);
|
||||
val = calloc_or_fail(1, 64);
|
||||
snprintf(val, 64, "ERR:var %i unknown type", varindex);
|
||||
break;
|
||||
}
|
||||
@@ -927,7 +927,7 @@ int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmdde
|
||||
for (int j = 0; cmd[j].cmdfunc != NULL; j++) {
|
||||
if (cmd[j].cmdflags & TELNETSRV_CMDFLAG_PUSHINTPOOLQ) {
|
||||
if (afifo == NULL) {
|
||||
afifo = malloc(sizeof(notifiedFIFO_t));
|
||||
afifo = calloc_or_fail(1, sizeof(notifiedFIFO_t));
|
||||
initNotifiedFIFO(afifo);
|
||||
}
|
||||
cmd[j].qptr = afifo;
|
||||
@@ -956,8 +956,8 @@ int telnetsrv_checkbuildver(char *mainexec_buildversion, char **shlib_buildvers
|
||||
}
|
||||
|
||||
int telnetsrv_getfarray(loader_shlibfunc_t **farray) {
|
||||
int const num_func_tln_srv = 3;
|
||||
*farray = malloc(sizeof(loader_shlibfunc_t) * num_func_tln_srv);
|
||||
int const num_func_tln_srv = 3;
|
||||
*farray = calloc_or_fail(num_func_tln_srv, sizeof(loader_shlibfunc_t));
|
||||
(*farray)[0].fname=TELNET_ADDCMD_FNAME;
|
||||
(*farray)[0].fptr=(int (*)(void) )add_telnetcmd;
|
||||
(*farray)[1].fname=TELNET_POLLCMDQ_FNAME;
|
||||
|
||||
@@ -86,7 +86,7 @@ int get_measurgroups(telnet_measurgroupdef_t **measurgroups) {
|
||||
|
||||
void measurcmd_display_phycpu(telnet_printfunc_t prnt) {
|
||||
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[0][0];
|
||||
telnet_cpumeasurdef_t cpumeasur[MAX_CPU_STAT_TYPE];
|
||||
telnet_cpumeasurdef_t cpumeasur[MAX_CPU_STAT_TYPE] = {};
|
||||
for (int i = 0; i < MAX_CPU_STAT_TYPE; i++) {
|
||||
sprintf(cpumeasur[i].statname, "%s", UE->phy_cpu_stats.cpu_time_stats[i].meas_name);
|
||||
cpumeasur[i].astatptr = &UE->phy_cpu_stats.cpu_time_stats[i];
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h"
|
||||
#include "openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "openair2/RRC/NR/rrc_gNB_mobility.h"
|
||||
|
||||
#define TELNETSERVERCODE
|
||||
#include "telnetsrv.h"
|
||||
@@ -196,6 +197,53 @@ int rrc_gNB_trigger_f1_ho(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern void nr_HO_N2_trigger_telnet(gNB_RRC_INST *rrc, uint32_t neighbour_pci, uint32_t rrc_ue_id);
|
||||
|
||||
/** @brief Trigger N2 handover for UE
|
||||
* @param buf: Neighbour PCI, SCell PCI, RRC UE ID
|
||||
* @param debug: Debug flag
|
||||
* @param prnt: Print function
|
||||
* @return 0 on success, -1 on failure */
|
||||
int rrc_gNB_trigger_n2_ho(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
if (!RC.nrrrc)
|
||||
ERROR_MSG_RET("no RRC present, cannot list counts\n");
|
||||
|
||||
if (!buf) {
|
||||
ERROR_MSG_RET("Please provide neighbour cell id and ue id\n");
|
||||
} else {
|
||||
// Parse neighbour cell PCI
|
||||
char *token = strtok(buf, ",");
|
||||
if (!token) {
|
||||
ERROR_MSG_RET("Invalid input. Expected format: Neighbour PCI, ueId\n");
|
||||
}
|
||||
uint32_t neighbour_pci = strtol(token, NULL, 10);
|
||||
|
||||
// Parse ueId
|
||||
token = strtok(NULL, ",");
|
||||
if (!token) {
|
||||
ERROR_MSG_RET("Missing UE ID\n");
|
||||
}
|
||||
uint32_t ueId = strtol(token, NULL, 10);
|
||||
|
||||
// Retrieve UE context
|
||||
rrc_gNB_ue_context_t *ue_p = rrc_gNB_get_ue_context(RC.nrrrc[0], ueId);
|
||||
if (!ue_p) {
|
||||
ERROR_MSG_RET("UE with id %u not found\n", ueId);
|
||||
}
|
||||
gNB_RRC_UE_t *UE = &ue_p->ue_context;
|
||||
|
||||
// Trigger N2 handover
|
||||
nr_HO_N2_trigger_telnet(RC.nrrrc[0], neighbour_pci, UE->rrc_ue_id);
|
||||
|
||||
// Print success message
|
||||
prnt("RRC N2 handover triggered for UE %u with neighbour cell id %u\n",
|
||||
ueId,
|
||||
neighbour_pci);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int force_ul_failure(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
if (!RC.nrmac)
|
||||
@@ -245,6 +293,7 @@ static telnetshell_cmddef_t cicmds[] = {
|
||||
{"trigger_f1_ho", "[rrc_ue_id(int,opt)]", rrc_gNB_trigger_f1_ho},
|
||||
{"fetch_du_by_ue_id", "[rrc_ue_id(int,opt)]", fetch_du_by_ue_id},
|
||||
{"get_current_bwp", "[rnti(hex,opt)]", get_current_bwp},
|
||||
{"trigger_n2_ho", "[neighbour_pci(uint32_t),ueId(uint32_t)]", rrc_gNB_trigger_n2_ho},
|
||||
{"", "", NULL},
|
||||
};
|
||||
|
||||
|
||||
@@ -160,7 +160,7 @@ void measurcmd_display_rlcstats(telnet_printfunc_t prnt) {
|
||||
UE_info_t *UE_info = &(RC.mac[eNB_id]->UE_info);
|
||||
telnet_ltemeasurdef_t statsptr[]=LTE_RLCMEASURE;
|
||||
int num_rlcmeasure = sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t );
|
||||
unsigned int *rlcstats = malloc(num_rlcmeasure*sizeof(unsigned int));
|
||||
unsigned int *rlcstats = calloc_or_fail(num_rlcmeasure,sizeof(unsigned int));
|
||||
eNB_MAC_INST *eNB = RC.mac[eNB_id];
|
||||
|
||||
for(int i=0; i <num_rlcmeasure ; i++) {
|
||||
|
||||
@@ -66,6 +66,8 @@ The UEs that have been tested and confirmed working with Aerial are the followin
|
||||
To set up the L1 and install the components manually refer to this [instructions page](https://docs.nvidia.com/aerial/cuda-accelerated-ran/index.html).
|
||||
|
||||
**Note**:
|
||||
- As of wk36, the L1 must be compiled with the following CMake flag: `-DSCF_FAPI_10_04_SRS=ON` , this is due to the usage
|
||||
of the FAPI 10.04 version of the SRS PDU, and RX_Beamforming PDU.
|
||||
- To configure the Gigabyte server please refer to these [instructions](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/2025.w13/doc/Aerial_FAPI_Split_Tutorial.md)
|
||||
- The last release to support the Gigabyte server is **Aerial CUDA-Accelerated RAN 24-1**.
|
||||
|
||||
@@ -230,10 +232,10 @@ After preparing the L1 software, the container needs to be committed to create a
|
||||
In this file the RU MAC address needs to be specified before commiting the image.
|
||||
|
||||
```bash
|
||||
~$ docker commit nv-cubb cubb-build:25-1
|
||||
~$ docker commit nv-cubb cubb-build:25-2
|
||||
~$ docker image ls
|
||||
..
|
||||
cubb-build 25-1 824156e0334c 2 weeks ago 23.9GB
|
||||
cubb-build 25-2 824156e0334c 2 weeks ago 23.9GB
|
||||
-..
|
||||
```
|
||||
|
||||
|
||||
@@ -284,6 +284,10 @@ sudo ./nr_dlsim -n300 -s30 -R 106 -e 27 --loader.ldpc.shlibversion _aal --nrLDPC
|
||||
|
||||
### Running OAI gNB with USRP B210/FHI72
|
||||
|
||||
When running the gNB **with FHI 7.2**, it is not necessary to provide the `--nrLDPC_coding_aal.dpdk_core_list` argument
|
||||
since the core list specified for FHI 7.2 will be used for DPDK.
|
||||
If it is provided, the AAL core list wil be ignored.
|
||||
|
||||
Example command:
|
||||
```bash
|
||||
cd ~/openairinterface5g
|
||||
@@ -294,19 +298,15 @@ sudo ./nr-softmodem -O ~/gnb.conf --loader.ldpc.shlibversion _aal --nrLDPC_codin
|
||||
|
||||
# Known Issue(s)
|
||||
|
||||
## BBDEV CPU Usage
|
||||
|
||||
When running the E2E setup (this applies to both USRP and FHI72), BBDEV may not be using the list of CPU cores as specified by `nrLDPC_coding_aal.dpdk_core_list` accordingly.
|
||||
This is an issue under investigation, and subject for future fixes.
|
||||
In the meantime, we recommend allocating idle, and isolated CPU cores in the configuration for BBDEV.
|
||||
|
||||
## Potential Low Throughput
|
||||
|
||||
The current implementation has been tested to work in an end-to-end setup and is functional.
|
||||
However, there are still opportunities for optimization, particularly in LDPC decoding performance, which is an area of ongoing improvement.
|
||||
However, depending on the accelerator in use,
|
||||
there are still opportunities for optimization, particularly in LDPC decoding performance, which is an area of ongoing improvement.
|
||||
As such, downlink/uplink throughput may be suboptimal with the default configurations, but enhancements are actively being explored.
|
||||
|
||||
To achieve better E2E performance with the current implementation, we recommend the following adjustments:
|
||||
For example, to achieve better E2E performance with the current implementation with Intel ACC 100 and 200 (vRAN Boost),
|
||||
we recommend the following adjustments:
|
||||
1. Increasing the number of LDPC decoding iterations of the L1, e.g., `max_ldpc_iterations` to 200.
|
||||
2. Increasing the BLER targets of the MAC scheduler.
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ The actual scheduler implementation can be found in functions `pf_dl()` and
|
||||
[`gNB_scheduler_ulsch.c`](../../openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c)
|
||||
(for UL), respectively.
|
||||
|
||||
## PDDCH aggregation level
|
||||
## PDCCH aggregation level
|
||||
|
||||
PDCCH aggregation level is selected using closed loop controller, where DL HARQ
|
||||
feedback is the controller feedback signal. It is used to increment `pdcch_cl_adjust`
|
||||
@@ -60,7 +60,7 @@ in aggregation level 2 which translates to `uess_agg_levels` set to `[0, 2, 0,
|
||||
Say we have 90% PDCCH success rate at aggregation level 1, `pdcch_cl_adjust` will stay at 0
|
||||
for most of the time. 2 consecutive PDCCH failures will not result in increasing the aggregation
|
||||
level (because (0.05 + 0.05) * 4 = 0.4 which is closer to 0 than to 1). If PDCCH fails 3 times
|
||||
in a row the aggregation level will change to 2 and hopefully back to 1 once more PDDCH successes
|
||||
in a row the aggregation level will change to 2 and hopefully back to 1 once more PDCCH successes
|
||||
happen.
|
||||
|
||||
### Example 2
|
||||
@@ -78,7 +78,7 @@ available in the the file `nrMAC-stats.log` in the same directory in which
|
||||
Example:
|
||||
|
||||
```
|
||||
UE RNTI 2460 CU-UE-ID 2 in-sync PH 28 dB PCMAX 24 dBm, average RSRP -74 (8 meas)
|
||||
UE RNTI 2460 CU-UE-ID 2 in-sync PH 28 dB PCMAX 24 dBm, average RSRP -74 (8 meas), average SINR 40.0 (32 meas)
|
||||
UE 2460: CQI 15, RI 2, PMI (14,1)
|
||||
UE 2460: UL-RI 2 TPMI 0
|
||||
UE 2460: dlsch_rounds 32917/5113/1504/560, dlsch_errors 211, pucch0_DTX 1385, BLER 0.19557 MCS (1) 23 CCE fail 3
|
||||
@@ -103,6 +103,8 @@ In the first line,
|
||||
* `RSRP` (`-74`): measured power of the DL reference signals at the UE. >-80dBm
|
||||
you should have full DL throughput. <-95 dBm, you are very limited in terms
|
||||
of connectivity.
|
||||
* `SINR` (`40.0`): measured signal to interference and noise ratio of the SSB
|
||||
received at the UE. Maximum value that can be reported by the UE is 40.0 dB.
|
||||
|
||||
The second and third line reflect channel state information (CSI) as
|
||||
reported by the UE, and only appear if CSI-RS/SRS are enabled and _received_
|
||||
@@ -402,3 +404,13 @@ pattern2: {
|
||||
nrofUplinkSymbols2 = 0;
|
||||
};
|
||||
```
|
||||
|
||||
#### UL-heavy TDD patterns
|
||||
|
||||
"UL-heavy TDD patterns", i.e., TDD patterns that have many UL slots are
|
||||
supported. Examples for such patterns would be DSUUU or DDDSUUUUUU.
|
||||
|
||||
Note that you should increase the aggregation level candidates as described in
|
||||
[the corresponding section above](#pdcch-aggregation-level). This is because the
|
||||
scheduler has to schedule multiple DCIs in a single DL slots for multiple UL
|
||||
slots. As a suggestion, you could try `uess_agg_levels = [4, 2, 2, 0, 0]`.
|
||||
|
||||
@@ -1235,7 +1235,13 @@ You should be able to connect a UE now.
|
||||
|
||||
|
||||
# OAI Management Plane
|
||||
We support Configuration Management in OAI gNB, where gNB configures CU-planes, interfaces, TX/RX antennas, and TX/RX carriers for the RU.
|
||||
In OAI gNB, we support:
|
||||
* Configuration Management: interface(s) creation, configuration of RU CU-planes, Tx/Rx antennas, and Tx/Rx carriers.
|
||||
* Performance Management: activation/deactivation of available RU performance measurements and its notification reception with 10s periodicity:
|
||||
```bash
|
||||
[HW] [MPLANE] [PM: "192.168.80.9"][RX_ON_TIME 773428][RX_EARLY 0][RX_LATE 0][RX_TOTAL 878881][RX_ON_TIME_C 104744][RX_EARLY_C 0][RX_LATE_C 0][TX_TOTAL 435922]
|
||||
```
|
||||
|
||||
The reference specifications:
|
||||
* `O-RAN.WG4.MP.0-v05.00`
|
||||
* `O-RAN.WG4.MP-YANGs-v04.00`
|
||||
@@ -1375,7 +1381,7 @@ Once the mplane service is successfully enabled on the RU, two new users are bei
|
||||
oranbenetel:x:1000:1000::/home/oranbenetel:/bin/sh
|
||||
oranext:x:1001:1001::/home/oranext:/bin/sh
|
||||
```
|
||||
Create `oranbenetel` home directory:
|
||||
OAI gNB requires the `sudo` access group for NETCONF session. In the case of Benetel O-RUs, the corresponding user is `oranbenetel`. Therefore, please create its home directory:
|
||||
```bash
|
||||
mkdir /home/oranbenetel && chown oranbenetel:oranbenetel /home/oranbenetel
|
||||
```
|
||||
@@ -1393,7 +1399,7 @@ The reference gNB configuration file for one Benetel RAN550:
|
||||
The reference DU configuration file for two Benetel RAN650:
|
||||
[gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650-mplane.conf](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650-mplane.conf)
|
||||
|
||||
In order to run gNB/DU with M-plane, we need to modify the `fhi_72` section in the configuration file.
|
||||
In order to run gNB/DU with M-plane, we need to modify Tx gain `att_tx` in RU section, as well as the `fhi_72` section in the configuration file.
|
||||
Example for one RU:
|
||||
```bash
|
||||
fhi_72 = {
|
||||
@@ -1404,6 +1410,7 @@ fhi_72 = {
|
||||
du_key_pair = ("<path-to>/.ssh/id_rsa.pub", "<path-to>/.ssh/id_rsa");
|
||||
du_addr = ("00:11:22:33:44:66", "00:11:22:33:44:67"); # only one needed if one VF configured
|
||||
vlan_tag = (9, 9); # only one needed if one VF configured
|
||||
ru_username = ("oranbenetel");
|
||||
ru_ip_addr = ("192.168.80.9");
|
||||
fh_config = ({
|
||||
T1a_cp_dl = (419, 470);
|
||||
@@ -1423,6 +1430,7 @@ fhi_72 = {
|
||||
du_key_pair = ("/home/oaicicd/.ssh/id_rsa.pub", "/home/oaicicd/.ssh/id_rsa");
|
||||
du_addr = ("00:11:22:33:44:66", "00:11:22:33:44:67", "00:11:22:33:44:68", "00:11:22:33:44:69"); # only two needed if two VFs configured
|
||||
vlan_tag = (9, 9, 11, 11); # only two needed if two VFs configured
|
||||
ru_username = ("oranbenetel", "oranbenetel");
|
||||
ru_ip_addr = ("192.168.80.9", "192.168.80.10");
|
||||
fh_config = (
|
||||
# RAN550 #1
|
||||
@@ -1451,6 +1459,7 @@ fhi_72 = {
|
||||
* `du_key_pair`: ssh public and private keys to authenticate RU with NETCONF
|
||||
* `du_addr`: DU MAC address(es) to create CU-plane interface(s) in the RU
|
||||
* `vlan_tag`: VLAN U and C plane tags to create CU-plane interface(s) in the RU
|
||||
* `ru_username`: Username with `sudo` access to connect to the RU via M-plane
|
||||
* `ru_ip_addr`: RU IP address to connect to the RU via M-plane
|
||||
* `dpdk_mem_size`: [*]
|
||||
* `dpdk_iova_mode`: [*]
|
||||
@@ -1557,7 +1566,9 @@ sequenceDiagram
|
||||
|
||||
note over du: DU configures xran
|
||||
|
||||
du->ru: 12. DU and RU exchange packets
|
||||
du->ru: 12. DU activates Performance Measurements
|
||||
|
||||
du->ru: 13. DU and RU exchange packets
|
||||
```
|
||||
|
||||
|
||||
@@ -1596,7 +1607,9 @@ sequenceDiagram
|
||||
Band sector ID 0
|
||||
CC ID 0
|
||||
RU port ID 0
|
||||
max Tx gain 24.0
|
||||
[HW] [MPLANE] Successfully retrieved all the U-plane info - interface name, TX/RX carrier names, and TX/RX endpoint names.
|
||||
[HW] [MPLANE] Successfully retreived all performance measurement names.
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-yang-metadata".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "yang".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-inet-types".
|
||||
@@ -1636,6 +1649,59 @@ sequenceDiagram
|
||||
<vlan-id xmlns="urn:o-ran:interfaces:1.0">9</vlan-id>
|
||||
</interface>
|
||||
</interfaces>
|
||||
<performance-measurement-objects xmlns="urn:o-ran:performance-management:1.0">
|
||||
<rx-window-measurement-interval>10</rx-window-measurement-interval>
|
||||
<tx-measurement-interval>10</tx-measurement-interval>
|
||||
<notification-interval>10</notification-interval>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_ON_TIME</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_EARLY</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_LATE</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_TOTAL</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_ON_TIME_C</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_EARLY_C</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_LATE_C</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<tx-measurement-objects>
|
||||
<measurement-object>TX_TOTAL</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</tx-measurement-objects>
|
||||
</performance-measurement-objects>
|
||||
<processing-elements xmlns="urn:o-ran:processing-element:1.0">
|
||||
<transport-session-type>ETH-INTERFACE</transport-session-type>
|
||||
<ru-elements>
|
||||
@@ -1729,8 +1795,10 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
@@ -1746,8 +1814,10 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
@@ -1763,8 +1833,10 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
@@ -1780,8 +1852,10 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
@@ -1797,9 +1871,15 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
@@ -1807,6 +1887,7 @@ sequenceDiagram
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>0</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint0</name>
|
||||
@@ -1814,9 +1895,15 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
@@ -1824,6 +1911,7 @@ sequenceDiagram
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>4</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxEndpoint1</name>
|
||||
@@ -1831,9 +1919,15 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
@@ -1841,6 +1935,7 @@ sequenceDiagram
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>1</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint1</name>
|
||||
@@ -1848,9 +1943,15 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
@@ -1858,6 +1959,7 @@ sequenceDiagram
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>5</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxEndpoint2</name>
|
||||
@@ -1865,9 +1967,15 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
@@ -1875,6 +1983,7 @@ sequenceDiagram
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>2</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint2</name>
|
||||
@@ -1882,9 +1991,15 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
@@ -1892,6 +2007,7 @@ sequenceDiagram
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>6</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxEndpoint3</name>
|
||||
@@ -1899,9 +2015,15 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
@@ -1909,6 +2031,7 @@ sequenceDiagram
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>3</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint3</name>
|
||||
@@ -1916,9 +2039,15 @@ sequenceDiagram
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</cp-length-other>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
@@ -1926,6 +2055,7 @@ sequenceDiagram
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>7</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<tx-array-carriers>
|
||||
<name>TxArray0</name>
|
||||
@@ -1933,7 +2063,7 @@ sequenceDiagram
|
||||
<center-of-channel-bandwidth>3950400000</center-of-channel-bandwidth>
|
||||
<channel-bandwidth>100000000</channel-bandwidth>
|
||||
<active>ACTIVE</active>
|
||||
<gain>0.0</gain>
|
||||
<gain>24.0</gain>
|
||||
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
|
||||
<downlink-sfn-offset>0</downlink-sfn-offset>
|
||||
</tx-array-carriers>
|
||||
@@ -1957,7 +2087,7 @@ sequenceDiagram
|
||||
[HW] [MPLANE] Successfully validated candidate datastore for RU "192.168.80.9".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <commit> candidate datastore.
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully commited CU-planes configuration into running datastore for RU "192.168.80.9".
|
||||
[HW] [MPLANE] Successfully commited configuration into running datastore for RU "192.168.80.9".
|
||||
[HW] [MPLANE] Usage state = "idle" for RU "192.168.80.9".
|
||||
[HW] [MPLANE] Received notification from RU "192.168.80.9" at (2025-03-29T12:40:23.049085102+00:00)
|
||||
{
|
||||
@@ -2025,9 +2155,71 @@ sequenceDiagram
|
||||
"operation": "create"
|
||||
},
|
||||
...
|
||||
}
|
||||
|
||||
[HW] [MPLANE] RU "192.168.80.9" is now ready.
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <edit-config>:
|
||||
<performance-measurement-objects xmlns="urn:o-ran:performance-management:1.0">
|
||||
<rx-window-measurement-interval>10</rx-window-measurement-interval>
|
||||
<tx-measurement-interval>10</tx-measurement-interval>
|
||||
<notification-interval>10</notification-interval>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_ON_TIME</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_EARLY</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_LATE</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_TOTAL</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_ON_TIME_C</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_EARLY_C</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_LATE_C</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<tx-measurement-objects>
|
||||
<measurement-object>TX_TOTAL</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</tx-measurement-objects>
|
||||
</performance-measurement-objects>
|
||||
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully edited the candidate datastore for RU "192.168.80.9".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <validate> candidate datastore.
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully validated candidate datastore for RU "192.168.80.9".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <commit> candidate datastore.
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully commited configuration into running datastore for RU "192.168.80.9".
|
||||
[HW] [MPLANE] Sucessfully activated PM after start-up procedure for RU "192.168.80.9".
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
@@ -210,7 +210,7 @@ sequenceDiagram
|
||||
end
|
||||
```
|
||||
|
||||
## Handover
|
||||
## Inter-DU Handover (F1)
|
||||
|
||||
The basic handover (HO) structure is as follows. In order to support various
|
||||
handover "message passing implementation" (F1AP, NGAP, XnAP), RRC employs
|
||||
@@ -264,6 +264,94 @@ sequenceDiagram
|
||||
sdu->>cucp: F1AP UE Context Release Complete
|
||||
Note over ue,tdu: UE active on target DU
|
||||
```
|
||||
## Inter-gNB Handover (N2)
|
||||
|
||||
This is an inter-NG-RAN procedure. The N2 handover specification is defined in the following documents:
|
||||
|
||||
* 3GPP TS 23.502, 4.9.1.3 Inter NG-RAN node N2 based handover:
|
||||
- Outlines detailed handover signaling flows for N2-based handovers.
|
||||
- Covers both intra-system (between 5G gNBs) and inter-system (between 5G and LTE eNBs) handovers.
|
||||
* 3GPP TS 38.300, section 9 Mobility and State Transitions:
|
||||
- describes mobility procedures at the NG-RAN level, depending on the RRC state.
|
||||
* 3GPP TS 38.413 (NGAP), section 8.4 UE Mobility Management Procedures:
|
||||
- Specifies the signaling procedures over the N2 interface.
|
||||
- Includes messages like Handover Request, Handover Command, and Handover Preparation.
|
||||
* 3GPP TS 38.331 (RRC): details the UE-level RRC procedures involved during handovers
|
||||
|
||||
### End-to-end flow
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant ue as UE
|
||||
participant sdu as source DU
|
||||
participant scucp as source CU-CP
|
||||
participant scuup as source CU-UP
|
||||
participant tdu as target DU
|
||||
participant tcucp as target CU-CP
|
||||
participant tcuup as target CU-UP
|
||||
participant amf as AMF
|
||||
|
||||
Note over ue,sdu: UE active on source DU
|
||||
alt HO triggered through A3 event
|
||||
ue->>sdu: RRC Measurement Report
|
||||
sdu->>scucp: F1AP UL RRC Msg Transfer (RRC Measurement Report)
|
||||
Note over scucp: Handover decision (A3 event trigger)
|
||||
else Manual Trigger
|
||||
Note over scucp: Handover decision (e.g., telnet)
|
||||
end
|
||||
Note over scucp: nr_rrc_trigger_n2_ho() ("on source CU")
|
||||
scucp->>amf: HANDOVER REQUIRED
|
||||
amf->>tcucp: HANDOVER REQUEST
|
||||
Note over tcucp: rrc_gNB_process_Handover_Request
|
||||
Note over tcucp: trigger_bearer_setup
|
||||
tcucp->>tcuup: Bearer Context Setup Request
|
||||
tcuup->>tcucp: Bearer Context Setup Response
|
||||
Note over tcucp: rrc_gNB_process_e1_bearer_context_setup_resp
|
||||
Note over tcucp: nr_rrc_trigger_n2_ho_target() ("on target CU")
|
||||
Note over tcucp: nr_initiate_handover()
|
||||
tcucp->>tdu: F1AP UE Context Setup Req
|
||||
Note over tdu: Create UE context
|
||||
tdu->>tcucp: F1AP UE Context Setup Resp (incl. CellGroupConfig)
|
||||
Note over tcucp: rrc_CU_process_ue_context_setup_response() ("on target CU")
|
||||
Note over tcucp: e1_send_bearer_updates()
|
||||
tcucp->>tcuup: E1AP Bearer Context Modification Req
|
||||
tcuup->>tcucp: E1AP Bearer Context Modification Resp
|
||||
tcucp-->>tcucp: callback: ho_req_ack()
|
||||
Note over tcucp: nr_rrc_n2_ho_acknowledge() ("on target CU")
|
||||
tcucp->>amf: HANDOVER REQUEST ACKNOWLEDGE (data forwarding info)
|
||||
amf->>scucp: HANDOVER COMMAND
|
||||
scucp->>sdu: F1AP UE Context Modification Req (RRC Reconfiguration)
|
||||
sdu->>ue: RRC Reconfiguration
|
||||
sdu->>scucp: F1AP UE Context Modification Resp
|
||||
Note over sdu: Stop scheduling UE
|
||||
Note over scucp: rrc_CU_process_ue_context_modification_response()
|
||||
Note over scucp: e1_send_bearer_updates()
|
||||
scucp->>scuup: E1 Bearer Context Modification Req (PDCP Status Request)
|
||||
scuup->>scucp: E1 Bearer Context Modification Resp (PDCP Status Info)
|
||||
scucp->>amf: NG Uplink RAN Status Transfer
|
||||
amf->>tcucp: NG Downlink RAN Status Transfer
|
||||
tcucp->>tcuup: E1 Bearer Context Modification Req (PDCP Status Info)
|
||||
tcuup->>tcucp: E1 Bearer Context Modification Resp
|
||||
Note over ue: UE attachment to target DU
|
||||
Note over ue,tdu: RA (Msg1 + Msg2)
|
||||
ue->>tdu: RRC Reconfiguration Complete
|
||||
tdu->>tcucp: F1AP UL RRC Msg Transfer (RRC Reconfiguration Complete)
|
||||
tcucp-->>tcucp: callback: ho_success()
|
||||
Note over tcucp: nr_rrc_n2_ho_complete() ("on target CU")
|
||||
Note over tcucp: handle_rrcReconfigurationComplete() ("on target CU")
|
||||
tcucp->>amf: HANDOVER NOTIFY
|
||||
amf->>scucp: UE Context Release Command
|
||||
note over scucp: ngap_gNB_handle_ue_context_release_command
|
||||
note over scucp: rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_COMMAND
|
||||
scucp->>scuup: E1 Bearer Context Release Command
|
||||
scuup->>scucp: E1 Bearer Context Release Complete
|
||||
Note over scucp: rrc_gNB_generate_RRCRelease
|
||||
scucp->>sdu: F1 UE Context Release Command
|
||||
sdu->>scucp: F1 UE Context Release Complete
|
||||
note over scucp: rrc_CU_process_ue_context_release_complete
|
||||
note over scucp: rrc_remove_ue
|
||||
Note over ue,tdu: UE active on target DU
|
||||
```
|
||||
|
||||
# Structures
|
||||
|
||||
@@ -308,7 +396,8 @@ corresponding CU.
|
||||
|
||||
`nr_ho_source_cu_t` contains notably a function pointer `ho_cancel` for
|
||||
handover cancel. `nr_ho_target_cu_t` contains function pointers `ho_req_ack`
|
||||
for handover request acknowledge and `ho_success` for handover success. As can
|
||||
for handover request acknowledge, `ho_success` for handover success,
|
||||
`ho_failure` for handover failure (N2 only).
|
||||
be seen in the sequence diagram above, either the "target CU" or "source CU"
|
||||
needs to do an operation, and a "switch" from target to source CU is done using
|
||||
these function pointers. For instance, in F1, the handover request acknowledge
|
||||
|
||||
@@ -99,6 +99,26 @@ the [MAC configuration](../MAC/mac-usage.md) as well for SIB configuration.
|
||||
|
||||
### Neighbor-gNB configuration
|
||||
|
||||
TBD
|
||||
#### What is a gNB neighbor?
|
||||
|
||||
Network continuity is a key aspect of 5G. In the 5G architecture, gNB neighbors play a central role in maintaining service continuity through mechanisms such as handover and load balancing. By definition, a gNB neighbor is another gNB that can be measured and linked by the UE. If the current serving gNB is no longer optimal, the UE may connect to a neighbor gNB.
|
||||
|
||||
To support this behavior, the network configuration specifies additional frequencies and cells that the UE should measure. The UE reports these measurements to the network, which then decides whether or not to initiate a handover.
|
||||
|
||||
Neighbor types include:
|
||||
- **Intra-gNB neighbors** - cells belonging to the same gNB
|
||||
- **Inter-gNB neighbors** - cells belonging to different gNBs
|
||||
- **Inter-RAT neighbors** - cells belonging to another RAT (e.g., LTE)
|
||||
|
||||
#### Required configuration parameters
|
||||
|
||||
To define a neighbor cell in the configuration file, the following parameters are typically needed:
|
||||
- **gNB ID** - unique identifier of the gNB
|
||||
- **Cell ID** - identifier of the cell within the gNB
|
||||
- **Physical Cell ID** - identifier of the cell’s synchronization signal (PCI)
|
||||
- **Absolute Frequency** - frequency used by the SSB (absoluteFrequencySSB)
|
||||
- **Subcarrier Spacing** - numerology (e.g., 15 kHz, 30 kHz)
|
||||
- **PLMN configuration** - MCC, MNC, and MNC length
|
||||
- **Tracking Area Code (TAC)** - identifier of the tracking area
|
||||
|
||||
Refer to the [handover tutorial](../handover-tutorial.md) for more information.
|
||||
|
||||
@@ -85,10 +85,8 @@ The standalone mode is the default mode.
|
||||
|
||||
Before tag `2024.w45`, the default mode was NSA. Thus, in the past, to run
|
||||
either the gNB or the UE in standalone mode, it was necessary to provide the
|
||||
`--sa` flag in the command line. This is not necessary anymore; if in doubt,
|
||||
you can provide `--sa` on the command line. The gNB will ignore this option if
|
||||
not relevant; the UE might complain that it does not know this option, which
|
||||
means that standalone is already active.
|
||||
`--sa` flag in the command line. This is not the case anymore. If provided
|
||||
the softmodem exits reporting that it does not know this option.
|
||||
|
||||
The default (SA) mode does the following:
|
||||
- At the gNB:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user