Compare commits

..

17 Commits
fix_3870 ... rs

Author SHA1 Message Date
Robert Schmidt
578979121d Revert "needed or not?"
This reverts commit 1d39400c6c5de0e118ab68f425788b8ad052da48.
2026-05-29 17:49:47 +02:00
Robert Schmidt
0d1f7470ae needed or not? 2026-05-29 17:49:47 +02:00
Sagar Arora
f9f925cdb2 doc: nrue ldpc gpu offload
Signed-off-by: Sagar Arora <sagar.arora@openairinterface.org>
2026-05-29 17:49:47 +02:00
Jaroslava Fiedlerova
b5719c49a4 CI: Add confs for test with nrUE using CUDA 2026-05-29 17:49:47 +02:00
Jaroslava Fiedlerova
8f935bd32d CI: Enable build of nrUE on Jetson with CUDA support
Add new Dockerfiles to enable building nrUE and gNB with CUDA support on Jetson.
Compared to the standard build, these images use Ubuntu 22.04 instead of Ubuntu
24.04. This change is required because CUDA 12.2.0 runtime and development
images are only available for Ubuntu 22.04.

To build the nrUE and gNB image with CUDA support, run the following commands:

    docker build  --target ran-base-cuda --tag ran-base-cuda:latest --file docker/Dockerfile.base.cuda.ubuntu .
    docker build  --target ran-build-cuda --tag ran-build-cuda:latest --file docker/Dockerfile.build.cuda.ubuntu .
    docker build  --target oai-gnb --tag oai-gnb:test --file docker/Dockerfile.gNB.cuda.ubuntu .
    docker build  --target oai-nr-ue --tag oai-nr-ue:test --file docker/Dockerfile.nrUE.cuda.ubuntu .

A new XML file was added to build images on Jetson3 and push images with CUDA
support, using the prefix "armv8_cuda".
2026-05-29 17:49:47 +02:00
Raymond Knopp
e83df8ad0c Fixes E2E 2026-05-29 17:49:47 +02:00
Robert Schmidt
93ef3a0d60 Ask Raymond 2026-05-29 17:49:47 +02:00
Raymond Knopp
a51770341e use_gpu/ENABLE_CUDA/USE_CUDA + sims
Remove double nr_dlsim eval

Remove CUDA from normal LDPC coding, make standalone

nr_dlsim seems to work.
ldpctest: need to implement memcpy() in _cuda.c
nr_ulsim fails

fixup ldpctest: make it run

Initial version of ldpc_decoder_cuda done. Change configuration to GH200

modify -h option in dlsim and ulsim. First scratch for nrLDPC GPU decoder tutorial

Change code

add missing initialization on jetson for nr_ulsim. Bug fixed

add buffer memory management; remove an extra synchronization in cuda decoder

fix for ulsim via cuda encoder on jetson

fix for 256QAM

Move LDPC CUDA to separate subdirectory

Only functional change: remove USE_CUDA

Rename constant for clarity

ldpc_cuda: add tests to verify it works

Signed-off-by: Robert Schmidt <robert.schmidt@openairinterface.org>

Implement fallback CPU

Remove use_gpu

Signed-off-by: Robert Schmidt <robert.schmidt@openairinterface.org>
2026-05-29 17:49:42 +02:00
Robert Schmidt
9a6b332912 Set up CUDA infrastructure 2026-05-29 17:42:50 +02:00
Raymond Knopp
c574fa68c5 SIMD channel compensation 2026-05-29 16:06:16 +02:00
Raymond Knopp
ad85919ba7 ARM rate matching 2026-05-29 16:06:16 +02:00
Raymond Knopp
5cd9d6206e TODO: nr ulsch decoding: is this necessary?
Signed-off-by: Robert Schmidt <robert.schmidt@openairinterface.org>
2026-05-26 18:11:56 +02:00
Raymond Knopp
1c4c8d3e1b Rate matching through SIMD on ARM
Signed-off-by: Robert Schmidt <robert.schmidt@openairinterface.org>
2026-05-26 18:11:54 +02:00
Raymond Knopp
347dda4dc5 TODO: MM512 necessary? ARM-specific complex number operations
Signed-off-by: Robert Schmidt <robert.schmidt@openairinterface.org>
2026-05-26 18:10:59 +02:00
Raymond Knopp
a8cb7d807c Update base LDPC encoder for CUDA code generation
Signed-off-by: Robert Schmidt <robert.schmidt@openairinterface.org>
2026-05-26 18:10:58 +02:00
Raymond Knopp
18f2ff3608 limit log2_maxh \in [1, 14]
Signed-off-by: Robert Schmidt <robert.schmidt@openairinterface.org>
2026-05-26 18:10:47 +02:00
Jaroslava Fiedlerova
1dfb4fc4c3 CI: Ignore errors present in build logs
Report errors found in the build logs, but do not fail the job if some are
present. Based on observations, certain errors (for example):

    update-alternatives: error: alternative path /usr/share/man/man7/bash-builtins.7.gz doesn't exist

do not actually cause the build to fail. Instead of relying on log parsing, we should maybe
check the return code of the build process to determine whether the build truly failed?

Signed-off-by: Robert Schmidt <robert.schmidt@openairinterface.org>
2026-05-26 18:09:27 +02:00
441 changed files with 30191 additions and 17579 deletions

View File

@@ -3,7 +3,6 @@
cmake_minimum_required (VERSION 3.19)
project (OpenAirInterface LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(OAI_VERSION 2.4.0)
option(ENABLE_CHANNEL_SIM_CUDA "Enable CUDA accelerated channel simulation" OFF)
@@ -234,9 +233,16 @@ if(CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang
set(commonOpts "${commonOpts} -Wno-unused-command-line-argument -Wno-default-const-init-field-unsafe")
endif()
if (ENABLE_LDPC_CUDA)
# TODO only on specific targets!!
set(commonOpts "${commonOpts} -DLDPC_CUDA")
endif()
set(CMAKE_C_FLAGS
"${C_FLAGS_PROCESSOR} ${commonOpts} -std=gnu11 -funroll-loops ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${C_FLAGS_PROCESSOR} ${commonOpts} ${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS
"${C_FLAGS_PROCESSOR} ${commonOpts} -std=c++11 ${CMAKE_CXX_FLAGS}")
add_boolean_option(SANITIZE_ADDRESS OFF "enable the address sanitizer (ASan)" ON)
if (SANITIZE_ADDRESS)
@@ -623,6 +629,12 @@ include_directories("${OPENAIR2_DIR}/COMMON")
include_directories("${OPENAIR2_DIR}/UTIL")
include_directories("${OPENAIR3_DIR}/COMMON")
include_directories("${OPENAIR3_DIR}/UTILS")
include_directories("${NFAPI_DIR}/nfapi/public_inc")
include_directories("${NFAPI_DIR}/common/public_inc")
include_directories("${NFAPI_DIR}/pnf/public_inc")
include_directories("${NFAPI_DIR}/nfapi/inc")
include_directories("${NFAPI_DIR}/sim_common/inc")
include_directories("${NFAPI_DIR}/pnf_sim/inc")
include_directories("${OPENAIR1_DIR}")
include_directories("${OPENAIR2_DIR}")
include_directories("${OPENAIR3_DIR}/NAS/TOOLS")
@@ -719,7 +731,6 @@ set(SCHED_SRC
)
add_library(SCHED_LIB ${SCHED_SRC})
target_link_libraries(SCHED_LIB PRIVATE asn1_lte_rrc_hdrs)
target_link_libraries(SCHED_LIB PRIVATE nfapi_pnf_lib)
set(SCHED_NR_SRC
${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_gNB.c
@@ -729,14 +740,14 @@ set(SCHED_NR_SRC
)
add_library(SCHED_NR_LIB ${SCHED_NR_SRC})
target_link_libraries(SCHED_NR_LIB PRIVATE asn1_nr_rrc_hdrs UTIL)
target_link_libraries(SCHED_NR_LIB PRIVATE nfapi_nr_lib nfapi_user_lib) # some FAPI messages pack "subPDUs"
target_link_libraries(SCHED_NR_LIB PRIVATE NFAPI_LIB) # some FAPI messages pack "subPDUs"
set(SCHED_SRC_RU
${OPENAIR1_DIR}/SCHED/ru_procedures.c
${OPENAIR1_DIR}/SCHED/prach_procedures.c
)
add_library(SCHED_RU_LIB ${SCHED_SRC_RU})
target_link_libraries(SCHED_RU_LIB PRIVATE asn1_lte_rrc_hdrs nfapi_user_lib)
target_link_libraries(SCHED_RU_LIB PRIVATE asn1_lte_rrc_hdrs)
set(SCHED_SRC_UE
${OPENAIR1_DIR}/SCHED_UE/phy_procedures_lte_ue.c
@@ -758,6 +769,80 @@ set(SCHED_SRC_NR_UE
add_library(SCHED_NR_UE_LIB ${SCHED_SRC_NR_UE})
target_link_libraries(SCHED_NR_UE_LIB PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs UTIL)
# nFAPI
#################################
set(NFAPI_SRC
${NFAPI_DIR}/nfapi/src/nfapi_p4.c
${NFAPI_DIR}/nfapi/src/nfapi_p5.c
${NFAPI_DIR}/nfapi/src/nfapi_p7.c
)
add_library(NFAPI_LIB ${NFAPI_SRC})
target_link_libraries(NFAPI_LIB PUBLIC nfapi_common)
target_link_libraries(NFAPI_LIB PUBLIC nr_fapi_p5 nr_fapi_p7)
target_link_libraries(NFAPI_LIB PRIVATE z)
if(OAI_WLS)
target_compile_definitions(NFAPI_LIB PRIVATE ENABLE_WLS)
else()
target_compile_definitions(NFAPI_LIB PRIVATE ENABLE_SOCKET)
endif()
include_directories(${NFAPI_DIR}/nfapi/public_inc)
include_directories(${NFAPI_DIR}/nfapi/inc)
set(NFAPI_PNF_SRC
${NFAPI_DIR}/pnf/src/pnf.c
${NFAPI_DIR}/pnf/src/pnf_interface.c
${NFAPI_DIR}/pnf/src/pnf_p7.c
${NFAPI_DIR}/pnf/src/pnf_p7_interface.c
)
add_library(NFAPI_PNF_LIB ${NFAPI_PNF_SRC})
target_link_libraries(NFAPI_PNF_LIB PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
target_link_libraries(NFAPI_PNF_LIB PUBLIC nr_fapi_p7)
if(OAI_WLS)
target_compile_definitions(NFAPI_PNF_LIB PRIVATE ENABLE_WLS)
endif()
include_directories(${NFAPI_DIR}/pnf/public_inc)
include_directories(${NFAPI_DIR}/pnf/inc)
set(NFAPI_VNF_SRC
${NFAPI_DIR}/vnf/src/vnf.c
${NFAPI_DIR}/vnf/src/vnf_interface.c
${NFAPI_DIR}/vnf/src/vnf_p7.c
${NFAPI_DIR}/vnf/src/vnf_p7_interface.c
)
add_library(NFAPI_VNF_LIB ${NFAPI_VNF_SRC})
target_link_libraries(NFAPI_VNF_LIB PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
target_link_libraries(NFAPI_VNF_LIB PRIVATE nr_fapi_p5 nr_fapi_p7)
if(OAI_AERIAL)
target_compile_definitions(NFAPI_VNF_LIB PRIVATE ENABLE_AERIAL)
endif()
include_directories(${NFAPI_DIR}/vnf/public_inc)
include_directories(${NFAPI_DIR}/vnf/inc)
if(OAI_WLS)
target_compile_definitions(NFAPI_VNF_LIB PRIVATE ENABLE_WLS)
endif()
# nFAPI user defined code
#############################
set(NFAPI_USER_SRC
${NFAPI_USER_DIR}/nfapi.c
${NFAPI_USER_DIR}/nfapi_pnf.c
${NFAPI_USER_DIR}/nfapi_vnf.c
${NFAPI_USER_DIR}/gnb_ind_vars.c
)
add_library(NFAPI_USER_LIB ${NFAPI_USER_SRC})
if(OAI_WLS)
target_compile_definitions(NFAPI_USER_LIB PRIVATE ENABLE_WLS)
elseif (OAI_AERIAL)
target_compile_definitions(NFAPI_USER_LIB PRIVATE ENABLE_AERIAL)
else()
target_compile_definitions(NFAPI_USER_LIB PRIVATE ENABLE_SOCKET)
endif()
target_link_libraries(NFAPI_USER_LIB PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs UTIL)
target_link_libraries(NFAPI_USER_LIB PRIVATE nr_fapi_p7)
include_directories(${NFAPI_USER_DIR})
# Layer 1
#############################
set(PHY_TURBOIF
@@ -1014,15 +1099,30 @@ target_link_libraries(PHY_UE PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs UTIL)
add_library(PHY_NR_COMMON ${PHY_NR_SRC_COMMON})
target_link_libraries(PHY_NR_COMMON PUBLIC UTIL)
add_library(PHY_NR ${PHY_NR_SRC})
if (ENABLE_LDPC_CUDA)
find_package(CUDA REQUIRED)
if (NOT CUDA_FOUND)
message(FATAL_ERROR "no CUDA found")
endif()
#SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-arch=sm_80 -g -ggdb") # A100
#SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-arch=sm_90") # GH200
#SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-arch=sm_87") # Jetson
#SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-arch=sm_89") # L40S
SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-arch=sm_121") # GB10
set(CUDA_VERBOS_BUILD_ON)
cuda_add_library(PHY_NR ${PHY_NR_SRC} ${PHY_NR_SRC_CU})
cuda_add_library(PHY_NR_UE ${PHY_NR_UE_SRC} ${PHY_NR_UE_SRC_CU})
else()
add_library(PHY_NR ${PHY_NR_SRC})
add_library(PHY_NR_UE ${PHY_NR_UE_SRC})
endif()
target_link_libraries(PHY_NR nr_phy_common nr_common nr_fapi_p5 polar smallblock ds)
add_library(PHY_NR_NO_AVX_256 ${PHY_NR_SRC})
target_link_libraries(PHY_NR_NO_AVX_256 nr_phy_common nr_common)
target_compile_definitions(PHY_NR_NO_AVX_256 PUBLIC USE_128BIT)
add_library(PHY_NR_UE ${PHY_NR_UE_SRC})
target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc_hdrs nr_phy_common nr_common UTIL polar smallblock)
target_link_libraries(PHY_NR_UE asn1_nr_rrc_hdrs nr_phy_common nr_common UTIL polar smallblock)
add_library(PHY_RU ${PHY_SRC_RU})
target_link_libraries(PHY_RU PRIVATE asn1_lte_rrc_hdrs UTIL)
@@ -1264,7 +1364,6 @@ set (MISC_NFAPI_LTE
)
add_library(MISC_NFAPI_LTE_LIB ${MISC_NFAPI_LTE})
target_link_libraries(MISC_NFAPI_LTE_LIB PRIVATE nfapi_vnf_lib nfapi_pnf_lib)
add_library(L2
${L2_SRC}
@@ -1274,7 +1373,6 @@ add_library(L2
)
target_link_libraries(L2 PRIVATE x2ap s1ap lte_rrc m2ap)
target_link_libraries(L2 PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
target_link_libraries(L2 PRIVATE nfapi_vnf_lib nfapi_pnf_lib)
if(E2_AGENT)
target_compile_definitions(L2 PRIVATE ${E2AP_VERSION} ${KPM_VERSION} E2_AGENT)
endif()
@@ -1292,7 +1390,6 @@ add_library(L2_NR
)
target_link_libraries(L2_NR PRIVATE ds alg)
target_link_libraries(L2_NR PRIVATE f1ap_lib)
target_link_libraries(L2_NR PRIVATE nfapi_vnf_lib)
target_include_directories(L2_NR PRIVATE ${F1AP_DIR}/lib)
if(E2_AGENT)
target_compile_definitions(L2_NR PRIVATE ${E2AP_VERSION} ${KPM_VERSION} E2_AGENT)
@@ -1317,7 +1414,6 @@ add_library(L2_LTE_NR
)
target_link_libraries(L2_LTE_NR PRIVATE f1ap s1ap nr_rrc)
target_link_libraries(L2_LTE_NR PRIVATE nfapi_vnf_lib)
add_library(L2_UE
${L2_SRC_UE}
@@ -1325,7 +1421,6 @@ add_library(L2_UE
)
target_link_libraries(L2_UE PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
target_link_libraries(L2_UE PRIVATE GTPV1U)
target_link_libraries(L2_UE PRIVATE nfapi_pnf_lib)
target_link_libraries(L2_UE PRIVATE asn1_lte_rrc_hdrs)
@@ -1359,7 +1454,6 @@ set (MME_APP_SRC
add_library(MME_APP ${MME_APP_SRC})
target_link_libraries(MME_APP PRIVATE m2ap m3ap)
target_link_libraries(MME_APP PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
target_link_libraries(MME_APP PRIVATE nfapi_vnf_lib nfapi_user_lib)
find_package(sctp REQUIRED)
set(SCTP_SRC
@@ -1663,6 +1757,7 @@ endif()
include_directories("${NFAPI_DIR}/nfapi/public_inc")
include_directories("${NFAPI_DIR}/common/public_inc")
include_directories("${NFAPI_DIR}/pnf/public_inc")
include_directories("${NFAPI_DIR}/nfapi/inc")
include_directories("${NFAPI_DIR}/sim_common/inc")
include_directories("${NFAPI_DIR}/pnf_sim/inc")
@@ -1704,7 +1799,7 @@ add_dependencies(lte-softmodem oai_iqplayer)
target_link_libraries(lte-softmodem PRIVATE
-Wl,--start-group
lte_rrc nr_rrc s1ap m2ap x2ap m3ap GTPV1U SECURITY UTIL SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB
PHY_COMMON PHY PHY_RU L2 L2_LTE nfapi_vnf_lib nfapi_pnf_lib nfapi_user_lib MISC_NFAPI_LTE_LIB
PHY_COMMON PHY PHY_RU L2 L2_LTE NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
${NAS_UE_LIB} ITTI SIMU radio_common softmodem_common
-Wl,--end-group dl)
@@ -1758,7 +1853,7 @@ target_link_libraries(lte-uesoftmodem PRIVATE
-Wl,--start-group
lte_rrc nr_rrc s1ap x2ap m2ap m3ap
SECURITY UTIL SCTP_CLIENT MME_APP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
PHY_UE PHY_RU L2_UE L2_LTE SIMU nfapi_pnf_lib nfapi_user_lib MISC_NFAPI_LTE_LIB
PHY_UE PHY_RU L2_UE L2_LTE SIMU NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
${NAS_UE_LIB} ITTI radio_common softmodem_common
-Wl,--end-group dl)
@@ -1769,6 +1864,7 @@ target_link_libraries(lte-uesoftmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs
# force the generation of ASN.1 so that we don't need to wait during the build
target_link_libraries(lte-uesoftmodem PRIVATE
asn1_lte_rrc asn1_s1ap asn1_m2ap asn1_m3ap asn1_x2ap)
# nr RRU
add_executable(nr-oru
${OPENAIR_DIR}/executables/nr-ru.c
@@ -1781,9 +1877,9 @@ add_executable(nr-oru
)
target_link_libraries(nr-oru PRIVATE
UTIL NR_PHY_RU PHY_NR shlib_loader dl
radio_common softmodem_common nfapi_pnf_lib)
radio_common softmodem_common)
target_link_libraries(nr-oru PRIVATE pthread m CONFIG_LIB rt ${T_LIB} utils
barrier actor nfapi_user_lib)
barrier actor)
target_link_libraries(nr-oru PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs nr_phy_common time_management)
# nr-softmodem
@@ -1806,7 +1902,7 @@ target_link_libraries(nr-softmodem PRIVATE
-Wl,--start-group
UTIL SCTP_CLIENT SCHED_LIB SCHED_NR_LIB PHY_NR PHY PHY_NR_COMMON NR_PHY_RU GTPV1U SECURITY
ITTI ${NAS_UE_LIB} nr_rrc
ngap s1ap L2_LTE_NR L2_NR MAC_NR_COMMON nfapi_vnf_lib nfapi_pnf_lib nfapi_user_lib SIMU
ngap s1ap L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB SIMU
x2ap f1ap m2ap m3ap e1ap radio_common
time_management softmodem_common
-Wl,--end-group dl)
@@ -1816,15 +1912,16 @@ target_link_libraries(nr-softmodem PRIVATE ${T_LIB})
target_link_libraries(nr-softmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
target_link_libraries(nr-softmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
add_boolean_option(OAI_WLS OFF "Activate OAI's WLS driver" OFF)
add_boolean_option(OAI_AERIAL OFF "Activate OAI's AERIAL driver" OFF)
if (OAI_WLS)
target_link_libraries(nr-softmodem PUBLIC wls_integration_lib)
elseif (OAI_AERIAL)
target_compile_definitions(nr-softmodem PUBLIC ENABLE_AERIAL)
target_link_libraries(nr-softmodem PUBLIC aerial_lib)
else()
target_link_libraries(nr-softmodem PUBLIC nfapi_socket_lib)
endif()
add_boolean_option(OAI_AERIAL OFF "Activate OAI's AERIAL driver" OFF)
if (OAI_AERIAL)
target_compile_definitions(nr-softmodem PUBLIC ENABLE_AERIAL)
target_link_libraries(nr-softmodem PUBLIC aerial_lib)
endif()
if(E2_AGENT)
target_link_libraries(nr-softmodem PUBLIC e2_agent e2_agent_arg e2_ran_func_du_cucp_cuup)
target_compile_definitions(nr-softmodem PRIVATE ${E2AP_VERSION} ${KPM_VERSION} E2_AGENT)
@@ -1874,7 +1971,7 @@ add_executable(nr-uesoftmodem
target_link_libraries(nr-uesoftmodem PRIVATE
-Wl,--start-group
nr_rrc SECURITY UTIL SCHED_NR_UE_LIB
PHY_NR_COMMON PHY_NR_UE NR_L2_UE MAC_NR_COMMON nfapi_nr_lib
PHY_NR_COMMON PHY_NR_UE NR_L2_UE MAC_NR_COMMON NFAPI_LIB
ITTI SIMU radio_common
time_management softmodem_common
-Wl,--end-group dl)
@@ -1939,12 +2036,19 @@ add_executable(ldpctest
)
target_link_libraries(ldpctest PRIVATE
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON -Wl,--end-group
m pthread dl ${T_LIB}
m pthread dl ${T_LIB} ${CUDA_LIBRARIES}
# link 'check_crc' to make it resolved in the LDPC coding libraries
# 'check_crc' is not used in ldpctest so it is not linked in the executable by default
# --whole-archive links 'check_crc' in the executable even though it is note used, see 'man ld'
-Wl,--whole-archive crc_byte -Wl,--no-whole-archive
)
if (ENABLE_LDPC_CUDA)
# ldpctest.c uses cudaHostAlloc(), so include dir/link libr to make available
# TODO don't write it directly into ldpctest, but separate compilation unit?
find_package(CUDA REQUIRED)
target_link_libraries(ldpctest PRIVATE ${CUDA_LIBRARIES})
target_include_directories(ldpctest PRIVATE ${CUDA_INCLUDE_DIRS})
endif()
add_library(physim_common OBJECT ${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_unitary_common.c)
target_link_libraries(physim_common PRIVATE UTIL)
@@ -2094,7 +2198,7 @@ if (${T_TRACER})
params_libconfig
oai_eth_transpro UTIL
SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
nfapi_lte_lib nfapi_nr_lib nfapi_pnf_lib nfapi_vnf_lib nfapi_user_lib
NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
MISC_NFAPI_LTE_LIB
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU NR_PHY_RU
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE MAC_NR_COMMON MAC_UE_NR ngap
@@ -2139,7 +2243,7 @@ if(ENABLE_TESTS)
NAME benchmark
GITHUB_REPOSITORY google/benchmark
VERSION 1.9.0
OPTIONS "BENCHMARK_ENABLE_TESTING OFF" "BENCHMARK_ENABLE_WERROR OFF"
OPTIONS "BENCHMARK_ENABLE_TESTING OFF"
)
endif()
endif()
@@ -2154,11 +2258,6 @@ add_subdirectory(openair3)
add_subdirectory(radio)
add_subdirectory(tests)
add_boolean_option(OAI_RU_FRONTHAUL OFF "Whether to configure OAI fronthaul library" OFF)
if(OAI_RU_FRONTHAUL)
add_subdirectory(fronthaul)
endif()
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)

View File

@@ -20,11 +20,13 @@ if (params.LockResources != null && params.LockResources.trim().length() > 0)
// Global Parameters. Normally they should be populated when the master job
// triggers the slave job with parameters
def INTERNAL_REPO = "asterix:/home/git/openairinterface5g.git"
def sourceBranch = params.sourceBranch ?: env.GIT_BRANCH
def targetBranch = params.targetBranch ?: 'develop'
def testRepository = params.repository ?: 'git@asterix:/home/git/openairinterface5g.git'
def testBranch = params.branch ?: 'develop'
def commitID = params.sourceCommit ?: env.GIT_COMMIT
def testRepository = params.customRepository ?: INTERNAL_REPO
def testBranch = params.customBranch ?: "${sourceBranch}-${commitID}"
def mergeWithTarget = params.mergeWithTarget ?: false
def sourceBranch = params.sourceBranch ?: testBranch
def flexricOption = ""
def runWithOC = false
@@ -39,17 +41,11 @@ pipeline {
timestamps()
ansiColor('xterm')
lock(extra: lockResources)
skipDefaultCheckout()
}
stages {
stage("Build Init") {
steps {
checkout(
scmGit(branches: [[name: "${branch}"]],
userRemoteConfigs: [[url: "${repository}"]],
extensions: [cleanBeforeCheckout()])
)
script {
echo '\u2705 \u001B[94mBuild Init\u001B[0m'
JOB_TIMESTAMP = sh(returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"').trim()
@@ -117,7 +113,8 @@ pipeline {
}
sh """
python3 main.py --mode=InitiateHtml --repository=${testRepository} \
--branch=${testBranch} ${mainPythonAllXmlFiles}
--branch=${testBranch} --commitID=${commitID} \
${mainPythonAllXmlFiles}
"""
if (runWithOC) {
withCredentials([usernamePassword(credentialsId: "${params.OC_Credentials}", usernameVariable: 'OC_Username', passwordVariable: 'OC_Password')]) {

View File

@@ -115,7 +115,7 @@ pipeline {
stage ("Local-Repo-Push") {
steps {
script {
triggerDownstreamJob ('RAN-Local-Repo-Push', 'Local-Repo-Push')
triggerSlaveJob ('RAN-Local-Repo-Push', 'Local-Repo-Push')
}
}
post {
@@ -135,7 +135,7 @@ pipeline {
stage ("Ubuntu-Image-Builder") {
steps {
script {
triggerDownstreamJob ('RAN-Ubuntu18-Image-Builder', 'Ubuntu-Image-Builder')
triggerSlaveJob ('RAN-Ubuntu18-Image-Builder', 'Ubuntu-Image-Builder')
}
}
post {
@@ -143,7 +143,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
ubuntuBuildStatus = finalizeDownstreamJob('RAN-Ubuntu18-Image-Builder')
ubuntuBuildStatus = finalizeSlaveJob('RAN-Ubuntu18-Image-Builder')
}
}
failure {
@@ -157,7 +157,7 @@ pipeline {
stage ("Ubuntu-ARM-Image-Builder") {
steps {
script {
triggerDownstreamJob ('RAN-Ubuntu-ARM-Image-Builder', 'Ubuntu-ARM-Image-Builder')
triggerSlaveJob ('RAN-Ubuntu-ARM-Image-Builder', 'Ubuntu-ARM-Image-Builder')
}
}
post {
@@ -165,7 +165,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
ubuntuArmBuildStatus = finalizeDownstreamJob('RAN-Ubuntu-ARM-Image-Builder')
ubuntuArmBuildStatus = finalizeSlaveJob('RAN-Ubuntu-ARM-Image-Builder')
}
}
failure {
@@ -179,7 +179,7 @@ pipeline {
stage ("Ubuntu-Jetson-Image-Builder") {
steps {
script {
triggerDownstreamJob ('RAN-Ubuntu-Jetson-Image-Builder', 'Ubuntu-Jetson-Image-Builder')
triggerSlaveJob ('RAN-Ubuntu-Jetson-Image-Builder', 'Ubuntu-Jetson-Image-Builder')
}
}
post {
@@ -187,7 +187,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
ubuntuJetsonBuildStatus = finalizeDownstreamJob('RAN-Ubuntu-Jetson-Image-Builder')
ubuntuJetsonBuildStatus = finalizeSlaveJob('RAN-Ubuntu-Jetson-Image-Builder')
}
}
failure {
@@ -201,7 +201,7 @@ pipeline {
stage ("RHEL-Cluster-Image-Builder") {
steps {
script {
triggerDownstreamJob ('RAN-RHEL8-Cluster-Image-Builder', 'RHEL-Cluster-Image-Builder')
triggerSlaveJob ('RAN-RHEL8-Cluster-Image-Builder', 'RHEL-Cluster-Image-Builder')
}
}
post {
@@ -209,7 +209,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
rhelBuildStatus = finalizeDownstreamJob('RAN-RHEL8-Cluster-Image-Builder')
rhelBuildStatus = finalizeSlaveJob('RAN-RHEL8-Cluster-Image-Builder')
}
}
failure {
@@ -223,7 +223,7 @@ pipeline {
stage ("ARM-Cross-Compile") {
steps {
script {
triggerDownstreamJob ('RAN-ARM-Cross-Compile-Builder', 'ARM-Cross-Compilation')
triggerSlaveJob ('RAN-ARM-Cross-Compile-Builder', 'ARM-Cross-Compilation')
}
}
post {
@@ -231,7 +231,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
armBuildStatus = finalizeDownstreamJob('RAN-ARM-Cross-Compile-Builder')
armBuildStatus = finalizeSlaveJob('RAN-ARM-Cross-Compile-Builder')
}
}
failure {
@@ -249,7 +249,7 @@ pipeline {
steps {
script {
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
triggerDownstreamJob ('RAN-DockerHub-Push', 'DockerHub-Push')
triggerSlaveJob ('RAN-DockerHub-Push', 'DockerHub-Push')
}
}
}
@@ -269,7 +269,7 @@ pipeline {
when { expression {do5Gtest || do5GUeTest} }
steps {
script {
triggerDownstreamJob ('RAN-PhySim-Cluster-5G', 'PhySim-Cluster-5G')
triggerSlaveJob ('RAN-PhySim-Cluster-5G', 'PhySim-Cluster-5G')
}
}
post {
@@ -277,7 +277,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
physim5GStatus = finalizeDownstreamJob('RAN-PhySim-Cluster-5G')
physim5GStatus = finalizeSlaveJob('RAN-PhySim-Cluster-5G')
}
}
failure {
@@ -292,7 +292,7 @@ pipeline {
when { expression {do5Gtest || do5GUeTest} }
steps {
script {
triggerDownstreamJob ('RAN-PhySim-GraceHopper-5G', 'PhySim-GraceHopper-5G')
triggerSlaveJob ('RAN-PhySim-GraceHopper-5G', 'PhySim-GraceHopper-5G')
}
}
post {
@@ -300,7 +300,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
physimGH5GStatus = finalizeDownstreamJob('RAN-PhySim-GraceHopper-5G')
physimGH5GStatus = finalizeSlaveJob('RAN-PhySim-GraceHopper-5G')
}
}
failure {
@@ -315,7 +315,7 @@ pipeline {
when { expression {do5Gtest || do5GUeTest} }
steps {
script {
triggerDownstreamJob ('RAN-Channel-Simulation', 'Channel-Simulation')
triggerSlaveJob ('RAN-Channel-Simulation', 'Channel-Simulation')
}
}
post {
@@ -323,7 +323,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
channelSimStatus = finalizeDownstreamJob('RAN-Channel-Simulation')
channelSimStatus = finalizeSlaveJob('RAN-Channel-Simulation')
}
}
failure {
@@ -338,7 +338,7 @@ pipeline {
when { expression {do4Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-PhySim-Cluster-4G', 'PhySim-Cluster-4G')
triggerSlaveJob ('RAN-PhySim-Cluster-4G', 'PhySim-Cluster-4G')
}
}
post {
@@ -346,7 +346,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
physim4GStatus = finalizeDownstreamJob('RAN-PhySim-Cluster-4G')
physim4GStatus = finalizeSlaveJob('RAN-PhySim-Cluster-4G')
}
}
failure {
@@ -361,7 +361,7 @@ pipeline {
when { expression {do4Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-RF-Sim-Test-4G', 'RF-Sim-Test-4G')
triggerSlaveJob ('RAN-RF-Sim-Test-4G', 'RF-Sim-Test-4G')
}
}
post {
@@ -369,7 +369,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
rfSim4GStatus = finalizeDownstreamJob('RAN-RF-Sim-Test-4G')
rfSim4GStatus = finalizeSlaveJob('RAN-RF-Sim-Test-4G')
}
}
failure {
@@ -384,7 +384,7 @@ pipeline {
when { expression {do5Gtest || do5GUeTest} }
steps {
script {
triggerDownstreamJob ('RAN-VRT-Sim-Test-5G', 'VRT-Sim-Test-5G')
triggerSlaveJob ('RAN-VRT-Sim-Test-5G', 'VRT-Sim-Test-5G')
}
}
post {
@@ -392,7 +392,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
vrtSim5GStatus = finalizeDownstreamJob('RAN-VRT-Sim-Test-5G')
vrtSim5GStatus = finalizeSlaveJob('RAN-VRT-Sim-Test-5G')
}
}
failure {
@@ -407,7 +407,7 @@ pipeline {
when { expression {do5Gtest || do5GUeTest} }
steps {
script {
triggerDownstreamJob ('RAN-RF-Sim-Test-5G', 'RF-Sim-Test-5G')
triggerSlaveJob ('RAN-RF-Sim-Test-5G', 'RF-Sim-Test-5G')
}
}
post {
@@ -415,7 +415,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
rfSim5GStatus = finalizeDownstreamJob('RAN-RF-Sim-Test-5G')
rfSim5GStatus = finalizeSlaveJob('RAN-RF-Sim-Test-5G')
}
}
failure {
@@ -430,7 +430,7 @@ pipeline {
when { expression {do5Gtest || do5GUeTest} }
steps {
script {
triggerDownstreamJob ('OAI-FLEXRIC-RAN-Integration-Test', 'OAI-FLEXRIC-RAN-Integration-Test')
triggerSlaveJob ('OAI-FLEXRIC-RAN-Integration-Test', 'OAI-FLEXRIC-RAN-Integration-Test')
}
}
post {
@@ -438,7 +438,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
flexricRAN5GStatus = finalizeDownstreamJob('OAI-FLEXRIC-RAN-Integration-Test')
flexricRAN5GStatus = finalizeSlaveJob('OAI-FLEXRIC-RAN-Integration-Test')
}
}
failure {
@@ -453,7 +453,7 @@ pipeline {
when { expression {do4Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-L2-Sim-Test-4G', 'L2-Sim-Test-4G')
triggerSlaveJob ('RAN-L2-Sim-Test-4G', 'L2-Sim-Test-4G')
}
}
post {
@@ -461,7 +461,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
l2Sim4GStatus = finalizeDownstreamJob('RAN-L2-Sim-Test-4G')
l2Sim4GStatus = finalizeSlaveJob('RAN-L2-Sim-Test-4G')
}
}
failure {
@@ -476,7 +476,7 @@ pipeline {
when { expression {do4Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-LTE-FDD-LTEBOX-Container', 'LTE-FDD-LTEBOX-Container')
triggerSlaveJob ('RAN-LTE-FDD-LTEBOX-Container', 'LTE-FDD-LTEBOX-Container')
}
}
post {
@@ -484,7 +484,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
lteTDDB200Status = finalizeDownstreamJob('RAN-LTE-FDD-LTEBOX-Container')
lteTDDB200Status = finalizeSlaveJob('RAN-LTE-FDD-LTEBOX-Container')
}
}
failure {
@@ -500,7 +500,7 @@ pipeline {
when { expression {do4Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-LTE-FDD-OAIUE-OAICN4G-Container', 'LTE-FDD-OAIUE-OAICN4G-Container')
triggerSlaveJob ('RAN-LTE-FDD-OAIUE-OAICN4G-Container', 'LTE-FDD-OAIUE-OAICN4G-Container')
}
}
post {
@@ -508,7 +508,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
lteFDDB200OAIUEStatus = finalizeDownstreamJob('RAN-LTE-FDD-OAIUE-OAICN4G-Container')
lteFDDB200OAIUEStatus = finalizeSlaveJob('RAN-LTE-FDD-OAIUE-OAICN4G-Container')
}
}
failure {
@@ -523,7 +523,7 @@ pipeline {
when { expression {do4Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-LTE-TDD-LTEBOX-Container', 'LTE-TDD-LTEBOX-Container')
triggerSlaveJob ('RAN-LTE-TDD-LTEBOX-Container', 'LTE-TDD-LTEBOX-Container')
}
}
post {
@@ -531,7 +531,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
lteFDDB200Status = finalizeDownstreamJob('RAN-LTE-TDD-LTEBOX-Container')
lteFDDB200Status = finalizeSlaveJob('RAN-LTE-TDD-LTEBOX-Container')
}
}
failure {
@@ -546,7 +546,7 @@ pipeline {
when { expression {do4Gtest || do5Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-NSA-B200-Module-LTEBOX-Container', 'NSA-B200-Module-LTEBOX-Container')
triggerSlaveJob ('RAN-NSA-B200-Module-LTEBOX-Container', 'NSA-B200-Module-LTEBOX-Container')
}
}
post {
@@ -554,7 +554,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
nsaTDDB200Status = finalizeDownstreamJob('RAN-NSA-B200-Module-LTEBOX-Container')
nsaTDDB200Status = finalizeSlaveJob('RAN-NSA-B200-Module-LTEBOX-Container')
}
}
failure {
@@ -569,7 +569,7 @@ pipeline {
when { expression {do5Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-SA-B200-Module-SABOX-Container', 'SA-B200-Module-SABOX-Container')
triggerSlaveJob ('RAN-SA-B200-Module-SABOX-Container', 'SA-B200-Module-SABOX-Container')
}
}
post {
@@ -577,7 +577,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saTDDB200Status = finalizeDownstreamJob('RAN-SA-B200-Module-SABOX-Container')
saTDDB200Status = finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container')
}
}
failure {
@@ -592,7 +592,7 @@ pipeline {
when { expression {do5Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-gNB-N300-Timing-Phytest-LDPC', 'gNB-N300-Timing-Phytest-LDPC')
triggerSlaveJob ('RAN-gNB-N300-Timing-Phytest-LDPC', 'gNB-N300-Timing-Phytest-LDPC')
}
}
post {
@@ -600,7 +600,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
phytestLDPCoffloadStatus = finalizeDownstreamJob('RAN-gNB-N300-Timing-Phytest-LDPC')
phytestLDPCoffloadStatus = finalizeSlaveJob('RAN-gNB-N300-Timing-Phytest-LDPC')
}
}
failure {
@@ -615,7 +615,7 @@ pipeline {
when { expression {do4Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-LTE-TDD-2x2-Container', 'LTE-TDD-2x2-Container')
triggerSlaveJob ('RAN-LTE-TDD-2x2-Container', 'LTE-TDD-2x2-Container')
}
}
post {
@@ -623,7 +623,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
lteTDD2x2N3xxStatus = finalizeDownstreamJob('RAN-LTE-TDD-2x2-Container')
lteTDD2x2N3xxStatus = finalizeSlaveJob('RAN-LTE-TDD-2x2-Container')
}
}
failure {
@@ -638,7 +638,7 @@ pipeline {
when { expression {do5Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-SA-AW2S-CN5G', 'SA-AW2S-CN5G')
triggerSlaveJob ('RAN-SA-AW2S-CN5G', 'SA-AW2S-CN5G')
}
}
post {
@@ -646,7 +646,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saAW2SStatus = finalizeDownstreamJob('RAN-SA-AW2S-CN5G')
saAW2SStatus = finalizeSlaveJob('RAN-SA-AW2S-CN5G')
}
}
failure {
@@ -661,7 +661,7 @@ pipeline {
when { expression {do5Gtest} }
steps {
script {
triggerCN5GDownstreamJob ('OAI-CN5G-COTS-UE-Test', 'OAI-CN5G-COTS-UE-Test')
triggerCN5GSlaveJob ('OAI-CN5G-COTS-UE-Test', 'OAI-CN5G-COTS-UE-Test')
}
}
post {
@@ -669,7 +669,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
cn5gCOTSUESanityCheck = finalizeDownstreamJob('OAI-CN5G-COTS-UE-Test')
cn5gCOTSUESanityCheck = finalizeSlaveJob('OAI-CN5G-COTS-UE-Test')
}
}
failure {
@@ -684,7 +684,7 @@ pipeline {
when { expression {do5Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-SA-AERIAL-CN5G', 'SA-AERIAL-CN5G')
triggerSlaveJob ('RAN-SA-AERIAL-CN5G', 'SA-AERIAL-CN5G')
}
}
post {
@@ -692,7 +692,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saAERIALStatus = finalizeDownstreamJob('RAN-SA-AERIAL-CN5G')
saAERIALStatus = finalizeSlaveJob('RAN-SA-AERIAL-CN5G')
}
}
failure {
@@ -707,7 +707,7 @@ pipeline {
when { expression {do5Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-SA-Multi-Antenna-CN5G', 'SA-Multi-Antenna-CN5G')
triggerSlaveJob ('RAN-SA-Multi-Antenna-CN5G', 'SA-Multi-Antenna-CN5G')
}
}
post {
@@ -715,7 +715,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saMultiAntennaStatus = finalizeDownstreamJob('RAN-SA-Multi-Antenna-CN5G')
saMultiAntennaStatus = finalizeSlaveJob('RAN-SA-Multi-Antenna-CN5G')
}
}
failure {
@@ -730,7 +730,7 @@ pipeline {
when { expression {do5Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-SA-FHI72-CN5G', 'SA-FHI72-CN5G')
triggerSlaveJob ('RAN-SA-FHI72-CN5G', 'SA-FHI72-CN5G')
}
}
post {
@@ -738,7 +738,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saFHI72Status = finalizeDownstreamJob('RAN-SA-FHI72-CN5G')
saFHI72Status = finalizeSlaveJob('RAN-SA-FHI72-CN5G')
}
}
failure {
@@ -753,7 +753,7 @@ pipeline {
when { expression {do5Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-SA-FHI72-MPLANE-CN5G', 'SA-FHI72-MPLANE-CN5G')
triggerSlaveJob ('RAN-SA-FHI72-MPLANE-CN5G', 'SA-FHI72-MPLANE-CN5G')
}
}
post {
@@ -761,7 +761,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saFHI72MplaneStatus = finalizeDownstreamJob('RAN-SA-FHI72-MPLANE-CN5G')
saFHI72MplaneStatus = finalizeSlaveJob('RAN-SA-FHI72-MPLANE-CN5G')
}
}
failure {
@@ -776,7 +776,7 @@ pipeline {
when { expression {do5Gtest} }
steps {
script {
triggerDownstreamJob ('RAN-SA-Handover-CN5G', 'SA-Handover-CN5G')
triggerSlaveJob ('RAN-SA-Handover-CN5G', 'SA-Handover-CN5G')
}
}
post {
@@ -784,7 +784,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saHandoverStatus = finalizeDownstreamJob('RAN-SA-Handover-CN5G')
saHandoverStatus = finalizeSlaveJob('RAN-SA-Handover-CN5G')
}
}
failure {
@@ -799,7 +799,7 @@ pipeline {
when { expression {do5Gtest || do5GUeTest} }
steps {
script {
triggerDownstreamJob ('RAN-SA-AERIAL-OAIUE-CN5G', 'SA-AERIAL-OAIUE-CN5G')
triggerSlaveJob ('RAN-SA-AERIAL-OAIUE-CN5G', 'SA-AERIAL-OAIUE-CN5G')
}
}
post {
@@ -807,7 +807,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saAERIALOAIUEStatus = finalizeDownstreamJob('RAN-SA-AERIAL-OAIUE-CN5G')
saAERIALOAIUEStatus = finalizeSlaveJob('RAN-SA-AERIAL-OAIUE-CN5G')
}
}
failure {
@@ -822,7 +822,7 @@ pipeline {
when { expression {do5Gtest || do5GUeTest} }
steps {
script {
triggerDownstreamJob ('RAN-SA-OAIUE-CN5G', 'SA-OAIUE-CN5G')
triggerSlaveJob ('RAN-SA-OAIUE-CN5G', 'SA-OAIUE-CN5G')
}
}
post {
@@ -830,7 +830,7 @@ pipeline {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saOAIUEStatus = finalizeDownstreamJob('RAN-SA-OAIUE-CN5G')
saOAIUEStatus = finalizeSlaveJob('RAN-SA-OAIUE-CN5G')
}
}
failure {
@@ -871,23 +871,28 @@ pipeline {
// ---- Slave Job functions
def triggerDownstreamJob (jobName, gitlabStatusName) {
def triggerSlaveJob (jobName, gitlabStatusName) {
def MR_NUMBER = "MERGE".equals(env.gitlabActionType) ? env.gitlabMergeRequestIid : 'develop'
// Workaround for the "cancelled" GitLab pipeline notification
// The downstream job is triggered with the propagate false so the following commands are executed
// The slave job is triggered with the propagate false so the following commands are executed
// Its status is now PASS/SUCCESS from a stage pipeline point of view
// localStatus variable MUST be analyzed to properly assess the status
def localStatus = build job: jobName,
parameters: [
string(name: 'targetRepo', value: String.valueOf(env.gitlabTargetRepoHttpUrl)),
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
string(name: 'targetRepo', value: String.valueOf(GIT_URL)),
string(name: 'SourceRepo', value: String.valueOf(env.gitlabSourceRepoHttpUrl)),
string(name: 'sourceRepo', value: String.valueOf(env.gitlabSourceRepoHttpUrl)),
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
string(name: 'sourceBranch', value: String.valueOf(env.gitlabSourceBranch)),
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
string(name: 'sourceCommit', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
string(name: 'eNB_MR', value: String.valueOf(MR_NUMBER)),
string(name: 'requestNumber', value: String.valueOf(MR_NUMBER)),
booleanParam(name: 'eNB_mergeRequest', value: "MERGE".equals(env.gitlabActionType)),
booleanParam(name: 'mergeWithTarget', value: "MERGE".equals(env.gitlabActionType)),
string(name: 'targetBranch', value: String.valueOf(env.gitlabTargetBranch)),
string(name: 'repository', value: String.valueOf(params.ciRepositoryURL)),
string(name: 'branch', value: "${env.gitlabSourceBranch.replace('/', '-')}-${env.gitlabMergeRequestLastCommit}")
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch)),
string(name: 'targetBranch', value: String.valueOf(env.gitlabTargetBranch))
], propagate: false
def localResult = localStatus.getResult()
echo "${jobName} Slave Job status is ${localResult}"
@@ -900,14 +905,18 @@ def triggerDownstreamJob (jobName, gitlabStatusName) {
}
}
def triggerCN5GDownstreamJob (jobName, gitlabStatusName) {
def triggerCN5GSlaveJob (jobName, gitlabStatusName) {
if ("MERGE".equals(env.gitlabActionType)) {
fullRanTag = OAI_Registry + '/oai-gnb:' + "${env.gitlabSourceBranch.replace('/', '-')}-${env.gitlabMergeRequestLastCommit}"
shaOne = sh returnStdout: true, script: 'git log -1 --pretty=format:"%H" ' + env.gitlabMergeRequestLastCommit
shaOne = shaOne.trim()
fullRanTag = OAI_Registry + '/oai-gnb:' + env.gitlabSourceBranch + '-' + shaOne
} else {
fullRanTag = OAI_Registry + '/oai-gnb:develop-' + env.GIT_COMMIT
shaOne = sh returnStdout: true, script: 'git log -1 --pretty=format:"%H" ' + env.GIT_COMMIT
shaOne = shaOne.trim()
fullRanTag = OAI_Registry + '/oai-gnb:develop-' + shaOne
}
// Workaround for the "cancelled" GitLab pipeline notification
// The downstream job is triggered with the propagate false so the following commands are executed
// The slave job is triggered with the propagate false so the following commands are executed
// Its status is now PASS/SUCCESS from a stage pipeline point of view
// localStatus variable MUST be analyzed to properly assess the status
def localStatus = build job: jobName,
@@ -925,10 +934,10 @@ def triggerCN5GDownstreamJob (jobName, gitlabStatusName) {
}
}
def finalizeDownstreamJob(jobName) {
def finalizeSlaveJob(jobName) {
lock ('Parent-Lock') {
// In case of any non-success, we are retrieving the HTML report of the last completed
// downstream job. The only drop-back is that we may retrieve the HTML report of a previous build
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
if (jobName == 'OAI-CN5G-COTS-UE-Test') {
fileName = "test_results_oai_cn5g_cots_ue.html"
} else {
@@ -938,8 +947,7 @@ def finalizeDownstreamJob(jobName) {
if (!fileExists(fileName)) {
copyArtifacts(projectName: jobName,
filter: 'test_results*.html',
selector: lastCompleted(),
optional: true)
selector: lastCompleted())
if (fileExists(fileName)) {
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${env.JOB_TIMESTAMP}#' ${fileName}"
} else {

View File

@@ -77,11 +77,15 @@ pipeline {
}
}
}
stage('Create testing branch for CI') {
stage('Create temporary branch for CI') {
steps {
script {
env.NEW_BRANCH = "${params.sourceBranch}-${params.sourceCommit}"
echo "New branch: ${env.NEW_BRANCH}"
}
sh """
# Checkout source commit
git checkout -B ${params.branch} ${params.sourceCommit}
git checkout -B ${env.NEW_BRANCH} ${params.sourceCommit}
"""
}
}
@@ -89,7 +93,7 @@ pipeline {
when { expression { return params.mergeWithTarget } }
steps {
sh """
echo "Merging target branch ${params.targetBranch} into source branch ${params.branch}"
echo "Merging target branch ${params.targetBranch} into source branch ${env.NEW_BRANCH}"
if ! git merge --ff target/${params.targetBranch} \
-m "Merge ${params.targetBranch} into ${params.sourceBranch} for CI"; then
echo "Merge conflicts detected. Aborting."
@@ -102,9 +106,9 @@ pipeline {
stage('Push merged branch to internal repository') {
steps {
sh """
git remote add internal-repo ${params.repository} || true
echo "Pushing ${params.branch} to internal repo"
git push --force internal-repo ${params.branch}
git remote add internal-repo ${internalRepoURL} || true
echo "Pushing ${env.NEW_BRANCH} to internal repo"
git push --force internal-repo ${env.NEW_BRANCH}
"""
}
}

View File

@@ -82,6 +82,12 @@ pipeline {
}
sh "docker rmi ${DH_Account}/${item}:${WEEK_TAG} ${DH_Account}/${item}:develop ${OAI_Registry}/${item}:develop-${WEEK_SHA} || true"
}
// Proxy is not following the same pattern.
sh "docker image tag proxy:develop ${DH_Account}/proxy:develop"
sh "docker image tag proxy:develop ${DH_Account}/proxy:${WEEK_TAG}"
sh "docker push --quiet ${DH_Account}/proxy:develop"
sh "docker push --quiet ${DH_Account}/proxy:${WEEK_TAG}"
sh "docker rmi ${DH_Account}/proxy:develop ${DH_Account}/proxy:${WEEK_TAG}"
// Logging out on both registries
sh "docker logout ${OAI_Registry} > /dev/null 2>&1"
sh "docker logout > /dev/null 2>&1"

View File

@@ -1,210 +0,0 @@
#!/bin/groovy
/*
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
*/
def pythonExecutor = params.pythonExecutor
def testXMLFile = params.pythonTestXmlFile
def mainPythonAllXmlFiles = ""
def buildStageStatus = true
def JOB_TIMESTAMP
// Choose test stage name or fallback default
def testStageName = params.pipelineTestStageName != null ? params.pipelineTestStageName : 'Template Test Stage'
// Name of the resource
def lockResources = []
if (params.LockResources != null && params.LockResources.trim().length() > 0)
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
// Global Parameters. Normally they should be populated when the master job
// triggers the slave job with parameters
def targetBranch = params.targetBranch ?: 'develop'
def testRepository = params.repository ?: 'git@asterix:/home/git/openairinterface5g.git'
def testBranch = params.branch ?: "latest"
def mergeWithTarget = params.mergeWithTarget ?: false
def sourceBranch = params.sourceBranch ?: testBranch
def flexricOption = ""
def runWithOC = false
//-------------------------------------------------------------------------------
// Pipeline start
pipeline {
agent {
label pythonExecutor
}
options {
timestamps()
ansiColor('xterm')
lock(extra: lockResources)
}
stages {
stage("Build Init") {
steps {
script {
echo '\u2705 \u001B[94mBuild Init\u001B[0m'
JOB_TIMESTAMP = sh(returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"').trim()
}
// update the build name and description
buildName "${params.requestNumber}"
buildDescription "Branch : ${sourceBranch}"
}
}
stage ('Verify Parameters') {
steps {
script {
echo '\u2705 \u001B[94mVerify Parameters\u001B[0m'
def allParametersPresent = true
if (params.LockResources == null) {
echo "no LockResources given"
allParametersPresent = false
}
if (params.workspace == null) {
echo "no workspace given"
allParametersPresent = false
}
if (params.OC_Credentials != null) {
echo "This pipeline is configured to run with Openshift Cluster."
runWithOC = true
if (params.OC_ProjectName == null) {
echo "no OC_ProjectName given"
allParametersPresent = false
}
}
if (params.Flexric_Tag != null) {
echo "This pipeline is configured to run with a FlexRIC deployment."
echo "Appending FlexRicTag option to the list of options"
flexricOption = "--FlexRicTag=${params.Flexric_Tag}"
echo "Using new Flexric option: ${flexricOption}"
}
if (testBranch == 'latest') {
echo "Detecting latest commit and branch from repo"
def latest_integration = sh(script: "git for-each-ref --format='%(refname:short) %(committerdate:unix)' refs/remotes/origin/integration_* | sort -k2 -nr | head -n1 | cut -d' ' -f1", returnStdout: true).trim()
def latest_develop = sh(script: "git for-each-ref --format='%(refname:short) %(committerdate:unix)' refs/remotes/origin/develop* | sort -k2 -nr | head -n1 | cut -d' ' -f1", returnStdout: true).trim()
def dev_date = sh(script: "git log ${latest_develop} -1 --format=%ct", returnStdout: true).trim().toInteger()
def int_date = sh(script: "git log ${latest_integration} -1 --format=%ct", returnStdout: true).trim().toInteger()
def selected_ref = (dev_date > int_date) ? "origin/develop" : latest_integration
sourceBranch = selected_ref.replaceFirst("^origin/", "")
commitID = sh(script: "git rev-parse ${selected_ref}", returnStdout: true).trim()
echo "Found branch ${sourceBranch}, commit ${commitID}"
testBranch = "${sourceBranch}"
}
echo "CI executor node : ${pythonExecutor}"
echo "Testing Repository : ${testRepository}"
echo "Testing Branch : ${testBranch}"
if (allParametersPresent) {
echo '\u2705 \u001B[94m All parameters are present\u001B[0m'
} else {
echo "\u274C Some parameters are missing"
sh "./ci-scripts/fail.sh"
}
}
}
}
stage ("Deploy and Test") {
steps {
script {
dir ('ci-scripts') {
echo "\u2705 \u001B[94m Deploy and Test: ${testStageName}\u001B[0m"
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
for (xmlFile in myXmlTestSuite) {
if (fileExists(xmlFile)) {
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
echo "Test XML file : ${xmlFile}"
} else {
echo "Test XML file ${xmlFile}: no such file"
}
}
sh """
python3 main.py --mode=InitiateHtml --repository=${testRepository} \
--branch=${testBranch} ${mainPythonAllXmlFiles}
"""
if (runWithOC) {
withCredentials([usernamePassword(credentialsId: "${params.OC_Credentials}", usernameVariable: 'OC_Username', passwordVariable: 'OC_Password')]) {
for (xmlFile in myXmlTestSuite) {
if (fileExists(xmlFile)) {
try {
timeout (time: 150, unit: 'MINUTES') {
sh """
python3 main.py --mode=TesteNB --repository=${testRepository} \
--branch=${testBranch} \
--ranAllowMerge=${mergeWithTarget} --targetBranch=${targetBranch} \
--workspace=${params.workspace} --XMLTestFile=${xmlFile} \
--OCUserName=${OC_Username} --OCPassword=${OC_Password} --OCProjectName=${OC_ProjectName} \
${flexricOption}
"""
}
} catch (Exception e) {
currentBuild.result = 'FAILURE'
buildStageStatus = false
}
}
}
}
} else {
for (xmlFile in myXmlTestSuite) {
if (fileExists(xmlFile)) {
try {
timeout (time: 150, unit: 'MINUTES') {
sh """
python3 main.py --mode=TesteNB --repository=${testRepository} \
--branch=${testBranch} \
--ranAllowMerge=${mergeWithTarget} --targetBranch=${targetBranch} \
--workspace=${params.workspace} --XMLTestFile=${xmlFile} \
${flexricOption}
"""
}
} catch (Exception e) {
currentBuild.result = 'FAILURE'
buildStageStatus = false
}
}
}
}
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
}
}
}
}
stage ("Log Collection") {
steps {
script {
echo '\u2705 \u001B[94mLog Collection\u001B[0m'
dir ('ci-scripts') {
// Zipping all archived log files
sh "mkdir test_logs"
sh "mv *.log* test_logs || true"
// Zip all log files matching cmake_targets/{*.log*,log/*} into test_logs_XXXX.zip
if (fileExists('../cmake_targets/log')) {
sh "mv ../cmake_targets/log/* test_logs || true"
}
sh "zip -r -qq test_logs_${env.BUILD_ID}.zip *test_log*/"
sh "rm -rf *test_log*/"
if (fileExists("test_logs_${env.BUILD_ID}.zip")) {
archiveArtifacts artifacts: "test_logs_${env.BUILD_ID}.zip"
}
if (fileExists("test_results.html")) {
def reportName = "test_results-${env.JOB_NAME}.html"
sh "mv test_results.html ${reportName}"
sh """
sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' \
-e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' \
-e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' \
-e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' \
-e 's#TEMPLATE_STAGE_NAME#${testStageName}#' ${reportName}
"""
archiveArtifacts artifacts: "${reportName}"
}
}
}
}
}
}
}

View File

@@ -44,8 +44,11 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
elif re.match(r'^\-\-mode=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match(r'^\-\-mode=(.+)$', myArgv, re.IGNORECASE)
mode = matchReg.group(1)
elif re.match(r'^\-\-repository=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match(r'^\-\-repository=(.+)$', myArgv, re.IGNORECASE)
elif re.match(r'^\-\-repository=(.+)$|^\-\-ranRepository=(.+)$', myArgv, re.IGNORECASE):
if re.match(r'^\-\-repository=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match(r'^\-\-repository=(.+)$', myArgv, re.IGNORECASE)
else:
matchReg = re.match(r'^\-\-ranRepository=(.+)$', myArgv, re.IGNORECASE)
CiTestObj.repository = matchReg.group(1)
RAN.repository=matchReg.group(1)
HTML.repository=matchReg.group(1)
@@ -58,15 +61,27 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
RAN.merge=True
CONTAINERS.merge=True
CLUSTER.merge=True
elif re.match(r'^\-\-branch=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match(r'^\-\-branch=(.+)$', myArgv, re.IGNORECASE)
elif re.match(r'^\-\-branch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
if re.match(r'^\-\-branch=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match(r'^\-\-branch=(.+)$', myArgv, re.IGNORECASE)
else:
matchReg = re.match(r'^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE)
CiTestObj.branch = matchReg.group(1)
RAN.branch=matchReg.group(1)
HTML.branch=matchReg.group(1)
CONTAINERS.branch=matchReg.group(1)
CLUSTER.branch=matchReg.group(1)
elif re.match(r'^\-\-targetBranch=(.*)$', myArgv, re.IGNORECASE):
matchReg = re.match(r'^\-\-targetBranch=(.*)$', myArgv, re.IGNORECASE)
elif re.match(r'^\-\-commitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
if re.match(r'^\-\-commitID=(.*)$', myArgv, re.IGNORECASE):
matchReg = re.match(r'^\-\-commitID=(.*)$', myArgv, re.IGNORECASE)
else:
matchReg = re.match(r'^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE)
HTML.commitID=matchReg.group(1)
elif re.match(r'^\-\-targetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
if re.match(r'^\-\-targetBranch=(.*)$', myArgv, re.IGNORECASE):
matchReg = re.match(r'^\-\-targetBranch=(.*)$', myArgv, re.IGNORECASE)
else:
matchReg = re.match(r'^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE)
RAN.targetBranch=matchReg.group(1)
CONTAINERS.targetBranch=matchReg.group(1)
CLUSTER.targetBranch=matchReg.group(1)

View File

@@ -55,9 +55,8 @@ then
IS_OAI_LICENCE_PRESENT=`grep -E -c "SPDX-License-Identifier: LicenseRef-CSSL-1.0" $FILE || true`
IS_BSD_LICENCE_PRESENT=`grep -E -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause|License-Identifier: BSD-3-Clause" $FILE || true`
IS_MIT_LICENCE_PRESENT=`grep -E -c "SPDX-License-Identifier: MIT" $FILE || true`
IS_APACHE_LICENSE_PRESENT=`grep -E -c "SPDX-License-Identifier: Apache-2.0" $FILE || true`
IS_EXCEPTION=`echo $FILE | grep -E -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc.h|openair1/PHY/CODING/crcext.h|openair1/PHY/CODING/types.h" || true`
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] && [ $IS_MIT_LICENCE_PRESENT -eq 0 ] && [ $IS_APACHE_LICENSE_PRESENT -eq 0 ]
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] && [ $IS_MIT_LICENCE_PRESENT -eq 0 ]
then
if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ]
then
@@ -167,9 +166,8 @@ do
IS_OAI_LICENCE_PRESENT=`grep -E -c "SPDX-License-Identifier: LicenseRef-CSSL-1.0" $FULLFILE || true`
IS_BSD_LICENCE_PRESENT=`grep -E -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause|License-Identifier: BSD-3-Clause" $FULLFILE || true`
IS_MIT_LICENCE_PRESENT=`grep -E -c "SPDX-License-Identifier: MIT" $FULLFILE || true`
IS_APACHE_LICENSE_PRESENT=`grep -E -c "SPDX-License-Identifier: Apache-2.0" $FULLFILE || true`
IS_EXCEPTION=`echo $FULLFILE | grep -E -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc.h|openair1/PHY/CODING/crcext.h|openair1/PHY/CODING/types.h" || true`
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] && [ $IS_MIT_LICENCE_PRESENT -eq 0 ] && [ $IS_APACHE_LICENSE_PRESENT -eq 0 ]
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] && [ $IS_MIT_LICENCE_PRESENT -eq 0 ]
then
if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ]
then

View File

@@ -44,14 +44,6 @@ up2-aerial:
IF: wwan0
MTU: 1500
up3:
Host: up3
AttachScript: /opt/mbim/start_quectel_mbim.sh
DetachScript: /opt/mbim/stop_quectel_mbim.sh
NetworkScript: ip a show dev wwan0
IF: wwan0
MTU: 1500
adb_ue_1:
Host: nano
InitScript: /home/oaicicd/ci_ctl_adb.sh initialize R3CM40LZPHT
@@ -125,19 +117,6 @@ oc-cn5g-00104:
Undeploy: "! scripts/oc-cn5g-undeploy.sh /opt/oai-cn5g-fed-develop-00104 oaicicd-core-for-nvidia-aerial"
LogCollect: "! scripts/oc-cn5g-logcollect.sh /opt/oai-cn5g-fed-develop-00104 oaicicd-core-for-nvidia-aerial %%log_dir%%"
oc-cn5g-20897-stonechat:
Host: stonechat
NetworkScript: echo "inet 172.21.6.105"
RunIperf3Server: False
Deploy: "! scripts/oc-cn5g-deploy.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-fhi72"
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-20899-always-on:
Host: stonechat
NetworkScript: echo "inet 172.21.6.12"
RunIperf3Server: False
matix-cn5g:
Host: matix
NetworkScript: docker exec prod-trf-gen ip a show dev eth0

View File

@@ -29,7 +29,7 @@ from cls_ci_helper import archiveArtifact
# Helper functions used here and in other classes
# (e.g., cls_cluster.py)
#-----------------------------------------------------------
IMAGES = ['oai-enb', 'oai-lte-ru', 'oai-lte-ue', 'oai-gnb', 'oai-nr-cuup', 'oai-gnb-aw2s', 'oai-nr-ue', 'oai-enb-asan', 'oai-gnb-asan', 'oai-lte-ue-asan', 'oai-nr-ue-asan', 'oai-nr-cuup-asan', 'oai-gnb-aerial', 'oai-gnb-fhi72', 'oai-gnb-fhi72-t2']
IMAGES = ['oai-enb', 'oai-lte-ru', 'oai-lte-ue', 'oai-gnb', 'oai-nr-cuup', 'oai-gnb-aw2s', 'oai-nr-ue', 'oai-enb-asan', 'oai-gnb-asan', 'oai-lte-ue-asan', 'oai-nr-ue-asan', 'oai-nr-cuup-asan', 'oai-gnb-aerial', 'oai-gnb-fhi72']
DEFAULT_REGISTRY = "gracehopper3-oai.sboai.cs.eurecom.fr"
def CreateWorkspace(host, sourcePath, repository, branch):
@@ -55,7 +55,7 @@ def AnalyzeBuildLogs(image, lf):
committed = committed or lineHasCommit
if re.search(r'error:|Errors|ERROR', line):
errors.append(f"=> {line.strip()}")
status = (committed or tagged) and len(errors) == 0
status = (committed or tagged)
logging.info(f"Analyzing {image}, file {lf}: {status=}, {len(errors)} errors")
for e in errors:
logging.info(e)
@@ -178,9 +178,20 @@ class Containerize():
dockerfileprefix = '.ubuntu'
baseImage = 'ran-base'
baseTag = 'develop'
buildImage = 'ran-build'
forceBaseImageBuild = False
imageTag = 'develop'
result = re.search('native_cuda_armv8', self.imageKind)
if result is not None:
baseImage = 'ran-base-cuda'
buildImage = 'ran-build-cuda'
dockerfileprefix = '.cuda.ubuntu'
# we always build the ran-build image with all targets
# Creating a tupple with the imageName, the DockerFile prefix pattern, targetName and sanitized option
imageNames = [('ran-build', 'build', 'ran-build', '')]
imageNames = [(buildImage, 'build', f'{buildImage}', '')]
result = re.search('eNB', self.imageKind)
if result is not None:
imageNames.append(('oai-enb', 'eNB', 'oai-enb', ''))
@@ -220,17 +231,13 @@ class Containerize():
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', ''))
result = re.search('fhi72-t2', self.imageKind)
result = re.search('native_cuda_armv8', self.imageKind)
if result is not None:
imageNames.append(('ran-build-fhi72-t2', 'build.fhi72.t2', 'ran-build-fhi72-t2', ''))
imageNames.append(('oai-gnb', 'gNB.fhi72.t2', 'oai-gnb-fhi72-t2', ''))
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
cmd.cd(lSourcePath)
baseImage = 'ran-base'
baseTag = 'develop'
forceBaseImageBuild = False
imageTag = 'develop'
if (self.merge):
imageTag = 'ci-temp'
if self.targetBranch == 'develop':
@@ -258,17 +265,17 @@ class Containerize():
# On when the base image docker file is being modified.
if forceBaseImageBuild:
cmd.run(f"docker image rm {baseImage}:{baseTag}")
logfile = f'{lSourcePath}/cmake_targets/log/ran-base.docker.log'
logfile = f'{lSourcePath}/cmake_targets/log/{baseImage}.docker.log'
option = f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
cmd.run(f"docker build --target {baseImage} --tag {baseImage}:{baseTag} --file docker/Dockerfile.base{dockerfileprefix} {option} . &> {logfile}", timeout=1600)
t = ("ran-base", archiveArtifact(cmd, ctx, logfile))
t = (baseImage, archiveArtifact(cmd, ctx, logfile))
log_files.append(t)
# First verify if the base image was properly created.
ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}")
allImagesSize = {}
if ret.returncode != 0:
logging.error('\u001B[1m Could not build properly ran-base\u001B[0m')
logging.error(f'\u001B[1m Could not build properly {baseImage}\u001B[0m')
# Recover the name of the failed container?
cmd.run(f"docker ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty docker rm -f")
cmd.run(f"docker image prune --force")
@@ -281,10 +288,10 @@ class Containerize():
if result is not None:
size = float(result.group("size")) / 1000000
imageSizeStr = f'{size:.1f}'
logging.debug(f'\u001B[1m ran-base size is {imageSizeStr} Mbytes\u001B[0m')
allImagesSize['ran-base'] = f'{imageSizeStr} Mbytes'
logging.debug(f'\u001B[1m {baseImage} size is {imageSizeStr} Mbytes\u001B[0m')
allImagesSize[baseImage] = f'{imageSizeStr} Mbytes'
else:
logging.debug('ran-base size is unknown')
logging.debug(f'{baseImage} size is unknown')
# Build the target image(s)
status = True
@@ -295,17 +302,13 @@ class Containerize():
cmd.run(f'sed -i -e "s#{baseImage}:latest#{baseImage}:{baseTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
# target images should use the proper ran-build image
if image != 'ran-build' and "-asan" in name:
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build-asan:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
cmd.run(f'sed -i -e "s#{buildImage}:latest#{buildImage}-asan:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
elif "fhi72" in name or name == "oai-nr-oru":
cmd.run(f'sed -i -e "s#ran-build-fhi72:latest#ran-build-fhi72:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
elif image != 'ran-build':
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
cmd.run(f'sed -i -e "s#{buildImage}:latest#{buildImage}:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
if image == 'oai-gnb-aerial':
cmd.run('cp -f /opt/nvidia-ipc/nvipc_src.2026.01.07.tar.gz .')
if image == 'ran-build-fhi72-t2':
cmd.run('cp -f /opt/t2-patch/AMD-T2-SDFEC_25-03-1.patch .')
if name == 'oai-gnb-fhi72-t2':
cmd.run(f'sed -i -e "s#ran-build-fhi72-t2:latest#ran-build-fhi72-t2:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
logfile = f'{lSourcePath}/cmake_targets/log/{name}.docker.log'
option = option + f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
ret = cmd.run(f'docker build --target {image} --tag {name}:{imageTag} --file docker/Dockerfile.{pattern}{dockerfileprefix} {option} . > {logfile} 2>&1', timeout=1200)
@@ -313,8 +316,6 @@ class Containerize():
log_files.append(t)
if image == 'oai-gnb-aerial':
cmd.run('rm -f nvipc_src.2026.01.07.tar.gz')
if image == 'ran-build-fhi72-t2':
cmd.run('rm -f AMD-T2-SDFEC_25-03-1.patch')
# check the status of the build
ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {name}:{imageTag}")
if ret.returncode != 0:

View File

@@ -35,6 +35,7 @@ class HTMLManagement():
self.repository = ''
self.branch = ''
self.commitID = ''
self.nbTestXMLfiles = 0
self.htmlTabRefs = []
@@ -99,13 +100,7 @@ class HTMLManagement():
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-log-out"></span> Test Branch </td>\n')
self.htmlFile.write(' <td>' + self.branch + '</td>\n')
self.htmlFile.write(' </tr>\n')
commit_id = subprocess.check_output("git log -n1 --pretty=format:\"%H\" ", shell=True, universal_newlines=True)
commit_id = commit_id.strip()
self.htmlFile.write(' <tr>\n')
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-tag"></span> Commit ID </td>\n')
self.htmlFile.write(' <td>' + commit_id + '</td>\n')
self.htmlFile.write(' </tr>\n')
commit_message = subprocess.check_output("git log -n1 --pretty=format:\"%s\" ", shell=True, universal_newlines=True)
commit_message = subprocess.check_output("git log -n1 --pretty=format:\"%s\" " + self.commitID, shell=True, universal_newlines=True)
commit_message = commit_message.strip()
self.htmlFile.write(' <tr>\n')
self.htmlFile.write(' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-comment"></span> Commit Message </td>\n')

View File

@@ -276,38 +276,6 @@ def Deploy_Physim(ctx, HTML, node, workdir, script, options):
logging.error('\u001B[1m Physical Simulator Fail\u001B[0m')
return test_status
def DeployWithScript(HTML, node, script, options, tag):
logging.debug(f'Deploy with script {script} on node: {node}')
opt = options.replace('%%image_tag%%', tag)
with cls_cmd.getConnection(node) as c:
ret = c.exec_script(script, 600, opt)
logging.debug(f'"{script}" finished with code {ret.returncode}, output:\n{ret.stdout}')
HTML.CreateHtmlTestRowQueue(f'on node {node}', 'OK' if ret.returncode == 0 else 'KO', [f'{ret.stdout}'])
return ret.returncode == 0
def UndeployWithScript(HTML, ctx, node, script, options):
logging.debug(f'Undeploy with script {script} on node: {node}')
remote_dir = '/tmp/undeploy'
opt = options.replace('%%log_dir%%', remote_dir)
with cls_cmd.getConnection(node) as c:
# create a directory for log collection
c.run(f'rm -rf {remote_dir}')
ret = c.run(f'mkdir {remote_dir}')
if ret.returncode != 0:
logging.error("cannot create directory for log collection")
return False
ret = c.exec_script(script, 600, opt)
logging.debug(f'"{script}" finished with code {ret.returncode}, output:\n{ret.stdout}')
ret_ls = c.run(f'ls -1 {remote_dir}')
files = ret_ls.stdout.strip().splitlines()
log_files = []
for lf in files:
name = archiveArtifact(c, ctx, f'{remote_dir}/{lf}')
log_files.append(name)
msg = "Log files:\n" + "\n".join([os.path.basename(lf) for lf in log_files])
HTML.CreateHtmlTestRowQueue(f'on node {node}', 'OK' if ret.returncode == 0 else 'KO', [f'{ret.stdout}\n\n{msg}'])
return ret.returncode == 0
#-----------------------------------------------------------
# OaiCiTest Class Definition
#-----------------------------------------------------------

View File

@@ -1,240 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
Active_gNBs = ( "gNB-OAI-DU");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
gNBs =
(
{
////////// Identification parameters:
gNB_ID = 0xe00;
gNB_DU_ID = 0xe00;
gNB_name = "gNB-OAI-DU";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ( { sst = 1; }); });
nr_cellid = 1;
////////// Physical parameters:
pdsch_AntennaPorts_XP = 2;
pdsch_AntennaPorts_N1 = 2;
maxMIMO_layers = 4;
pusch_AntennaPorts = 4;
do_CSIRS = 1;
do_SRS = "periodic";
force_UL256qam_off = 1;
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# center frequency = 4049.76 MHz
# selected SSB frequency = 4049.76 MHz
absoluteFrequencySSB = 669984;
dl_frequencyBand = 77;
# frequency point A = 4000.62 MHz
dl_absoluteFrequencyPointA = 666708;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 273;
#initialDownlinkBWP
#genericParameters
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
#
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 77;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 273;
pMax = 23;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 1099;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex = 159;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 0;
preambleReceivedTargetPower = -100;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 7;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep = 2;
#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;
#one (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
#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,
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
msg3_DeltaPreamble = 2;
p0_NominalWithGrant = -100;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 0;
p0_nominal = -96;
ssb_PositionsInBurst_Bitmap = 0x1;
# 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 = 5;
nrofDownlinkSlots = 3;
nrofDownlinkSymbols = 8;
nrofUplinkSlots = 1;
nrofUplinkSymbols = 2;
ssPBCH_BlockPower = -11;
}
);
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
}
);
MACRLCs = (
{
tr_s_preference = "local_L1";
tr_n_preference = "f1";
local_n_address = "172.21.10.20";
remote_n_address = "172.21.6.112";
local_n_portd = 2153;
remote_n_portd = 2153;
pusch_TargetSNRx10 = 230;
pucch_TargetSNRx10 = 250;
pusch_FailureThres = 100;
dl_min_mcs = 20;
}
);
L1s = (
{
tr_n_preference = "local_mac";
prach_dtx_threshold = 130
pucch0_dtx_threshold = 80;
pusch_dtx_threshold = -100;
tx_amp_backoff_dB = 3;
L1_rx_thread_core = 11;
L1_tx_thread_core = 12;
phase_compensation = 0; # needs to match O-RU configuration
}
);
RUs = (
{
local_rf = "no";
nb_tx = 4;
nb_rx = 4;
att_tx = 0;
att_rx = 0;
bands = [77];
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
sf_extension = 0;
eNB_instances = [0];
ru_thread_core = 10;
sl_ahead = 8;
tr_preference = "raw_if4p5"; # important: activate FHI7.2
do_precoding = 0; # needs to match O-RU configuration
}
);
log_config :
{
global_log_level = "info";
};
fhi_72 = {
dpdk_devices = ("0000:41:11.0", "0000:41:11.1");
dpdk_iova_mode = "VA";
system_core = 7;
io_core = 8;
worker_cores = (9);
ru_addr = ("98:ae:71:04:83:e3", "98:ae:71:04:83:e3");
mtu = 9600;
fh_config = ({
T1a_cp_dl = (285, 470);
T1a_cp_ul = (285, 429);
T1a_up = (125, 350);
Ta4 = (110, 180);
ru_config = {
iq_width = 9;
iq_width_prach = 9;
};
});
};
nrLDPC_coding_aal : {
dpdk_dev : "0000:01:00.0";
dpdk_core_list : "18-19";
is_t2 : 1;
};

View File

@@ -25,7 +25,7 @@ gNBs =
////////// Physical parameters:
min_rxtxtime = 2;
do_SRS = "periodic";
do_SRS = 1;
servingCellConfigCommon = (
{

View File

@@ -1,247 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
Active_gNBs = ( "gNB-OAI-DU");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
gNBs =
(
{
////////// Identification parameters:
gNB_ID = 0xe00;
gNB_DU_ID = 0xe00;
gNB_name = "gNB-OAI-DU";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ( { sst = 1; }); });
nr_cellid = 1;
////////// Physical parameters:
pdsch_AntennaPorts_XP = 2;
pdsch_AntennaPorts_N1 = 2;
pusch_AntennaPorts = 4;
do_CSIRS = 1;
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 1;
# n_TimingAdvanceOffset = 0;
# downlinkConfigCommon
#frequencyInfoDL
absoluteFrequencySSB = 663360;
dl_frequencyBand = 77;
dl_absoluteFrequencyPointA = 660084;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 273;
#initialDownlinkBWP
#genericParameters
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
#
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 10;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 77;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 273;
pMax = 23;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 1099;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex = 159;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 0;
preambleReceivedTargetPower = -100;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 8;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep = 3;
#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 = 3;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
#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,
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
msg3_DeltaPreamble = 2;
p0_NominalWithGrant = -96;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 0;
p0_nominal = -96;
ssb_PositionsInBurst_Bitmap = 0x1;
# 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 = 5;
nrofDownlinkSlots = 3;
nrofDownlinkSymbols = 6;
nrofUplinkSlots = 1;
nrofUplinkSymbols = 4;
ssPBCH_BlockPower = -11;
}
);
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
}
);
MACRLCs = (
{
tr_s_preference = "local_L1";
tr_n_preference = "f1";
local_n_address = "172.21.10.20";
remote_n_address = "172.21.6.112";
local_n_portd = 2153;
remote_n_portd = 2153;
pusch_TargetSNRx10 = 250;
pucch_TargetSNRx10 = 220;
pusch_FailureThres = 100;
dl_min_mcs = 20;
}
);
L1s = (
{
tr_n_preference = "local_mac";
prach_dtx_threshold = 100;
pucch0_dtx_threshold = 10;
pusch_dtx_threshold = 10;
max_ldpc_iterations = 15;
tx_amp_backoff_dB = 12; # needs to match O-RU configuration
L1_rx_thread_core = 10;
L1_tx_thread_core = 11; # relevant after merge of l1_tx_thread
phase_compensation = 0; # needs to match O-RU configuration
}
);
RUs = (
{
local_rf = "no";
nb_tx = 4;
nb_rx = 4;
att_tx = 0
att_rx = 0;
bands = [77];
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
sf_extension = 0;
eNB_instances = [0];
ru_thread_core = 12;
sl_ahead = 5;
tr_preference = "raw_if4p5"; # important: activate FHI7.2
do_precoding = 0; # needs to match O-RU configuration
}
);
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 ="info";
f1ap_log_level ="info";
};
fhi_72 = {
dpdk_devices = ("0000:41:11.0", "0000:41:11.1");
system_core = 7;
io_core = 8;
worker_cores = (9);
dpdk_iova_mode = "VA";
ru_addr = ("8c:1f:64:d1:11:c0","8c:1f:64:d1:11:c0");
mtu = 9216; # check if xran uses this properly
file_prefix = "fhi_72";
fh_config = ({
T1a_cp_dl = (419, 470);
T1a_cp_ul = (285, 336);
T1a_up = (294, 345);
Ta4 = (0, 200);
ru_config = {
iq_width = 9;
iq_width_prach = 9;
};
});
};
nrLDPC_coding_aal : {
dpdk_dev : "0000:01:00.0";
dpdk_core_list : "18-19";
is_t2 : 1;
};

View File

@@ -1,228 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
Active_gNBs = ( "gNB-OAI-DU");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
gNBs =
(
{
////////// Identification parameters:
gNB_ID = 0xe00;
gNB_DU_ID = 0xe00;
gNB_name = "gNB-OAI-DU";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ( { sst = 1; }); });
nr_cellid = 1;
////////// Physical parameters:
pdsch_AntennaPorts_XP = 2;
pdsch_AntennaPorts_N1 = 2;
maxMIMO_layers = 4; #2;
pusch_AntennaPorts = 4;
do_CSIRS = 1;
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# n_TimingAdvanceOffset = 0;
# downlinkConfigCommon
#frequencyInfoDL
# center frequency = 3350.01 MHz
# selected SSB frequency = 3349.92 MHz
absoluteFrequencySSB = 623328;
dl_frequencyBand = 78;
# frequency point A = 3300.87 MHz
dl_absoluteFrequencyPointA = 620058;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 273;
#initialDownlinkBWP
#genericParameters
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
#
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
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 = 273;
pMax = 23;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 1099;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex = 159;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 22;
zeroCorrelationZoneConfig = 15;
preambleReceivedTargetPower = -104;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 7;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep = 2;
#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;
#one (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
#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,
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
msg3_DeltaPreamble = 2;
p0_NominalWithGrant = -96;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 0;
p0_nominal = -96;
ssb_PositionsInBurst_Bitmap = 0x1;
# 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 = 5;
nrofDownlinkSlots = 3;
nrofDownlinkSymbols = 8;
nrofUplinkSlots = 1;
nrofUplinkSymbols = 2;
ssPBCH_BlockPower = -11;
}
);
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
}
);
MACRLCs = (
{
tr_s_preference = "local_L1";
tr_n_preference = "f1";
local_n_address = "172.21.10.20";
remote_n_address = "172.21.6.112";
local_n_portd = 2153;
remote_n_portd = 2153;
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 250;
pusch_FailureThres = 100;
dl_min_mcs = 20;
}
);
L1s = (
{
tr_n_preference = "local_mac";
prach_dtx_threshold = 120
pucch0_dtx_threshold = 80;
pusch_dtx_threshold = 10;
max_ldpc_iterations = 15;
tx_amp_backoff_dB = 20; # needs to match O-RU configuration
L1_rx_thread_core = 11;
L1_tx_thread_core = 12;
phase_compensation = 1; # needs to match O-RU configuration
}
);
RUs = (
{
local_rf = "no";
nb_tx = 4;
nb_rx = 4;
att_tx = 0;
att_rx = 0;
bands = [78];
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
sf_extension = 0;
eNB_instances = [0];
ru_thread_core = 10;
sl_ahead = 8;
tr_preference = "raw_if4p5"; # important: activate FHI7.2
do_precoding = 0; # needs to match O-RU configuration
}
);
log_config :
{
global_log_level = "info";
};
fhi_72 = {
dpdk_devices = ("0000:41:11.0", "0000:41:11.1"); # one VF can be used as well
dpdk_iova_mode = "VA";
system_core = 7;
io_core = 8;
worker_cores = (9);
ru_addr = ("e8:c7:4f:25:81:b3", "e8:c7:4f:25:81:b3");
mtu = 9600;
fh_config = ({
T1a_cp_dl = (285, 429);
T1a_cp_ul = (285, 429);
T1a_up = (96, 196);
Ta4 = (110, 180);
ru_config = {
iq_width = 9;
iq_width_prach = 9;
};
prach_config = {
kbar = 0;
};
});
};
nrLDPC_coding_aal : {
dpdk_dev : "0000:01:00.0";
dpdk_core_list : "18-19";
is_t2 : 1;
};

View File

@@ -1,231 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
Active_gNBs = ( "gNB-OAI-DU");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
gNBs =
(
{
////////// Identification parameters:
gNB_ID = 0xe00;
gNB_DU_ID = 0xe00;
gNB_name = "gNB-OAI-DU";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ( { sst = 1; }); });
nr_cellid = 1;
////////// Physical parameters:
pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 4;
pdsch_AntennaPorts_N1 = 2;
maxMIMO_layers = 4;
do_CSIRS = 1;
do_SRS = "periodic";
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741)
absoluteFrequencySSB = 649920;
dl_frequencyBand = 78;
# this is 3300.24 MHz
dl_absoluteFrequencyPointA = 646724;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 273;
#initialDownlinkBWP
#genericParameters
# this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart))
initialDLBWPlocationAndBandwidth = 1099;
#
# 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 = 273;
pMax = 20;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 1099;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex = 148;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 12;
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;
#ra_ReponseWindow
#1,2,4,8,10,20,40,80
ra_ResponseWindow = 5;
#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;
#one (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
#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_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 = 5;
nrofDownlinkSlots = 3;
nrofDownlinkSymbols = 8;
nrofUplinkSlots = 1;
nrofUplinkSymbols = 2;
ssPBCH_BlockPower = -11;
}
);
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
}
);
MACRLCs = (
{
tr_s_preference = "local_L1";
tr_n_preference = "f1";
local_n_address = "172.21.10.20";
remote_n_address = "172.21.6.112";
local_n_portd = 2153;
remote_n_portd = 2153;
pusch_TargetSNRx10 = 220;
pucch_TargetSNRx10 = 220;
pusch_FailureThres = 100;
dl_min_mcs = 20;
}
);
L1s = (
{
tr_n_preference = "local_mac";
prach_dtx_threshold = 130;
pucch0_dtx_threshold = 80;
pusch_dtx_threshold = 10;
max_ldpc_iterations = 10;
tx_amp_backoff_dB = 10; #9; needs to match O-RU configuration # JF important to check
L1_rx_thread_core = 11;
L1_tx_thread_core = 12; # relevant after merge of l1_tx_thread
phase_compensation = 0; # needs to match O-RU configuration # JF to be tested
}
);
RUs = (
{
local_rf = "no";
nb_tx = 4;
nb_rx = 4;
att_tx = 0
att_rx = 0;
bands = [78];
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
sf_extension = 0;
eNB_instances = [0];
ru_thread_core = 10;
sl_ahead = 8;
tr_preference = "raw_if4p5"; # important: activate FHI7.2
do_precoding = 0; # needs to match O-RU configuration
}
);
log_config :
{
global_log_level ="info";
};
fhi_72 = {
dpdk_devices = ("0000:41:11.0", "0000:41:11.1");
dpdk_iova_mode = "VA";
system_core = 7;
io_core = 8;
worker_cores = (9);
ru_addr = ("00:E0:0C:00:AE:06", "00:E0:0C:00:AE:06");
mtu = 9000;
fh_config = ({
T1a_cp_dl = (285, 470);
T1a_cp_ul = (285, 429);
T1a_up = (125, 350);
Ta4 = (110, 180);
ru_config = {
iq_width = 9;
iq_width_prach = 9;
};
});
};
nrLDPC_coding_aal : {
dpdk_dev : "0000:01:00.0";
dpdk_core_list : "18-19";
is_t2 : 1;
};

View File

@@ -1,266 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
Active_gNBs = ( "gNB-OAI-DU");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
gNBs =
(
{
////////// Identification parameters:
gNB_ID = 0xe00;
gNB_DU_ID = 0xe00;
gNB_name = "gNB-OAI-DU";
// 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; }); });
nr_cellid = 1;
////////// Physical parameters:
pdsch_AntennaPorts_XP = 2;
pdsch_AntennaPorts_N1 = 4;
pusch_AntennaPorts = 8;
do_CSIRS = 1;
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# n_TimingAdvanceOffset = 0;
# downlinkConfigCommon
#frequencyInfoDL
# center frequency = 3950.4 MHz
# selected SSB frequency = 3950.4 MHz
absoluteFrequencySSB = 663360;
dl_frequencyBand = 77;
# frequency point A = 3901.26 MHz
dl_absoluteFrequencyPointA = 660084;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 273;
#initialDownlinkBWP
#genericParameters
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
#
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 77;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 273;
pMax = 23;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 1099;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex = 152;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 0;
preambleReceivedTargetPower = -100;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 8;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep = 3;
#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;
#one (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
#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,
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
msg3_DeltaPreamble = 2;
p0_NominalWithGrant = -96;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 0;
p0_nominal = -96;
ssb_PositionsInBurst_Bitmap = 0x1;
# 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 = 5;
nrofDownlinkSlots = 3;
nrofDownlinkSymbols = 6;
nrofUplinkSlots = 1;
nrofUplinkSymbols = 4;
ssPBCH_BlockPower = 0;
}
);
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
}
);
MACRLCs = (
{
tr_s_preference = "local_L1";
tr_n_preference = "f1";
local_n_address = "172.21.10.20";
remote_n_address = "172.21.6.92";
local_n_portd = 2153;
remote_n_portd = 2153;
pusch_TargetSNRx10 = 220;
pucch_TargetSNRx10 = 200;
dl_bler_target_upper = .35;
dl_bler_target_lower = .15;
ul_bler_target_upper = .35;
ul_bler_target_lower = .15;
pusch_FailureThres = 100;
}
);
L1s = (
{
tr_n_preference = "local_mac";
prach_dtx_threshold = 100;
pucch0_dtx_threshold = 80;
pusch_dtx_threshold = 10;
max_ldpc_iterations = 10;
tx_amp_backoff_dB = 12; # needs to match O-RU configuration
L1_rx_thread_core = 11;
L1_tx_thread_core = 12; # relevant after merge of l1_tx_thread
phase_compensation = 0; # needs to match O-RU configuration
}
);
RUs = (
{
local_rf = "no";
nb_tx = 8;
nb_rx = 8;
att_tx = 0;
att_rx = 0;
bands = [77];
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
sf_extension = 0;
eNB_instances = [0];
ru_thread_core = 10;
sl_ahead = 10;
tr_preference = "raw_if4p5"; # important: activate FHI7.2
do_precoding = 0; # needs to match O-RU configuration
}
);
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 = "info";
f1ap_log_level = "info";
};
fhi_72 = {
dpdk_devices = ("0000:41:11.0", "0000:41:11.1", "0000:41:11.2", "0000:41:11.3"); # two VFs can be used as well
dpdk_iova_mode = "VA";
system_core = 7;
io_core = 8;
worker_cores = (9);
ru_addr = ("8c:1f:64:d1:10:46","8c:1f:64:d1:10:46","8c:1f:64:d1:10:43","8c:1f:64:d1:10:43"); # if two VFs, set two RU MAC addresses (one per RU)
mtu = 9216;
fh_config = (
# RAN650 #1
{
T1a_cp_dl = (419, 470);
T1a_cp_ul = (285, 336);
T1a_up = (294, 345);
Ta4 = (0, 200);
ru_config = {
iq_width = 9;
iq_width_prach = 9;
};
},
# RAN650 #2
{
T1a_cp_dl = (419, 470);
T1a_cp_ul = (285, 336);
T1a_up = (294, 345);
Ta4 = (0, 200);
ru_config = {
iq_width = 9;
iq_width_prach = 9;
};
});
};
nrLDPC_coding_aal : {
dpdk_dev : "0000:01:00.0";
dpdk_core_list : "18-19";
is_t2 : 1;
};

View File

@@ -1,70 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
L1s = (
{
tr_n_preference = "nfapi";
remote_n_address = "127.0.0.1"; // vnf addr
local_n_address = "127.0.0.1"; // pnf addr
local_n_portc = 50000; // pnf p5 port [!]
remote_n_portc = 50001; // vnf p5 port
local_n_portd = 50010; // pnf p7 port
remote_n_portd = 50011; // vnf p7 port
prach_dtx_threshold = 130
pucch0_dtx_threshold = 80;
pusch_dtx_threshold = -100;
tx_amp_backoff_dB = 3;
L1_rx_thread_core = 11;
L1_tx_thread_core = 12;
phase_compensation = 0; # needs to match O-RU configuration
}
);
RUs = (
{
local_rf = "no";
nb_tx = 4;
nb_rx = 4;
att_tx = 0;
att_rx = 0;
bands = [77];
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
sf_extension = 0;
eNB_instances = [0];
ru_thread_core = 10;
sl_ahead = 6;
tr_preference = "raw_if4p5"; # important: activate FHI7.2
do_precoding = 0; # needs to match O-RU configuration
}
);
log_config :
{
global_log_level = "info";
};
fhi_72 = {
dpdk_devices = ("0000:41:11.0", "0000:41:11.1");
dpdk_iova_mode = "VA";
system_core = 7;
io_core = 8;
worker_cores = (9);
ru_addr = ("98:ae:71:04:83:e3", "98:ae:71:04:83:e3");
mtu = 9600;
fh_config = ({
T1a_cp_dl = (285, 470);
T1a_cp_ul = (285, 429);
T1a_up = (125, 350);
Ta4 = (110, 180);
ru_config = {
iq_width = 9;
iq_width_prach = 9;
};
});
};
nrLDPC_coding_aal : {
dpdk_dev : "0000:01:00.0";
dpdk_core_list : "18-19";
is_t2 : 1;
};

View File

@@ -24,7 +24,7 @@ gNBs =
pdsch_AntennaPorts_N1 = 2;
maxMIMO_layers = 4;
do_CSIRS = 1;
do_SRS = "periodic";
do_SRS = 1;
servingCellConfigCommon = (
{

View File

@@ -1,190 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
Active_gNBs = ( "gNB-OAI-DU");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
gNBs =
(
{
////////// Identification parameters:
gNB_ID = 0xe00;
gNB_DU_ID = 0xe00;
gNB_name = "gNB-OAI-DU";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ( { sst = 1; }); });
nr_cellid = 1;
////////// Physical parameters:
pdsch_AntennaPorts_XP = 2;
pdsch_AntennaPorts_N1 = 2;
maxMIMO_layers = 4;
pusch_AntennaPorts = 4;
do_CSIRS = 1;
do_SRS = "periodic";
force_UL256qam_off = 0;
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# center frequency = 4049.76 MHz
# selected SSB frequency = 4049.76 MHz
absoluteFrequencySSB = 669984;
dl_frequencyBand = 77;
# frequency point A = 4000.62 MHz
dl_absoluteFrequencyPointA = 666708;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 273;
#initialDownlinkBWP
#genericParameters
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
#
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 77;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 273;
pMax = 23;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 1099;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex = 159;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 0;
preambleReceivedTargetPower = -100;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 7;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep = 2;
#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;
#one (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
#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,
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
msg3_DeltaPreamble = 2;
p0_NominalWithGrant = -100;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 0;
p0_nominal = -96;
ssb_PositionsInBurst_Bitmap = 0x1;
# 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 = 5;
nrofDownlinkSlots = 3;
nrofDownlinkSymbols = 10;
nrofUplinkSlots = 1;
nrofUplinkSymbols = 2;
ssPBCH_BlockPower = -11;
}
);
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
}
);
MACRLCs = (
{
tr_s_preference = "nfapi";
remote_s_address = "127.0.0.1"; // pnf addr [!]
local_s_address = "127.0.0.1"; // vnf addr
local_s_portc = 50001; // vnf p5 port
remote_s_portc = 50000; // pnf p5 port [!]
local_s_portd = 50011; // vnf p7 port [!]
remote_s_portd = 50010; // pnf p7 port [!]
tr_n_preference = "f1";
local_n_address = "172.21.8.200";
remote_n_address = "172.21.6.112";
local_n_portd = 2153;
remote_n_portd = 2153;
pusch_TargetSNRx10 = 220;
pucch_TargetSNRx10 = 250;
ul_bler_target_upper = .35;
ul_bler_target_lower = .15;
pusch_FailureThres = 100;
dl_min_mcs = 20;
}
);
log_config :
{
global_log_level = "info";
};

View File

@@ -25,7 +25,7 @@ gNBs =
pdsch_AntennaPorts_N1 = 2;
pusch_AntennaPorts = 2;
do_CSIRS = 1;
do_SRS = "periodic";
do_SRS = 1;
min_rxtxtime = 2;
uess_agg_levels = [0, 4, 2, 1, 0];

View File

@@ -26,7 +26,7 @@ gNBs =
pdsch_AntennaPorts_N1 = 2;
pusch_AntennaPorts = 2;
do_CSIRS = 1;
do_SRS = "periodic";
do_SRS = 1;
min_rxtxtime = 2;
force_UL256qam_off = 1;
servingCellConfigCommon = (

View File

@@ -24,6 +24,8 @@ gNBs =
pdsch_AntennaPorts_XP = 2;
pdsch_AntennaPorts_N1 = 2;
pusch_AntennaPorts = 2;
do_CSIRS = 0;
do_SRS = 0;
min_rxtxtime = 6;
servingCellConfigCommon = (

View File

@@ -23,6 +23,8 @@ gNBs =
pdsch_AntennaPorts_N1 = 2;
maxMIMO_layers = 4;
pusch_AntennaPorts = 4;
do_CSIRS = 0;
do_SRS = 0;
servingCellConfigCommon = (
{

View File

@@ -44,7 +44,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=0,L=32 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth = 17875;
initialDLBWPlocationAndBandwidth = 6349;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 3;
@@ -64,7 +64,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 17875;
initialULBWPlocationAndBandwidth = 6349;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 3;
@@ -145,6 +145,11 @@ gNBs =
);
first_active_bwp = 1;
bwp_list = (
{ scs = 3; bwpStart = 0; bwpSize = 66;}
);
# ------- SCTP definitions
SCTP :
{

View File

@@ -25,7 +25,7 @@ gNBs =
pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
do_CSIRS = 1;
do_SRS = "periodic";
do_SRS = 1;
uess_agg_levels = [4,2,0,0,0];
servingCellConfigCommon = (

View File

@@ -1,268 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
Active_gNBs = ( "gNB-OAI");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
gNBs =
(
{
////////// Identification parameters:
gNB_ID = 0xe00;
gNB_name = "gNB-OAI";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ( { sst = 1; }); });
nr_cellid = 1;
////////// Physical parameters:
pdsch_AntennaPorts_XP = 2;
pdsch_AntennaPorts_N1 = 2;
maxMIMO_layers = 4;
pusch_AntennaPorts = 4;
do_CSIRS = 1;
do_SRS = "periodic";
force_UL256qam_off = 1;
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# center frequency = 4049.76 MHz
# selected SSB frequency = 4049.76 MHz
absoluteFrequencySSB = 669984;
dl_frequencyBand = 77;
# frequency point A = 4000.62 MHz
dl_absoluteFrequencyPointA = 666708;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 273;
#initialDownlinkBWP
#genericParameters
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
#
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 77;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 273;
pMax = 23;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 1099;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex = 159;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 0;
preambleReceivedTargetPower = -100;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 7;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep = 2;
#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;
#one (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
#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,
# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
msg3_DeltaPreamble = 2;
p0_NominalWithGrant = -100;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 0;
p0_nominal = -96;
ssb_PositionsInBurst_Bitmap = 0x1;
# 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 = 5;
nrofDownlinkSlots = 3;
nrofDownlinkSymbols = 8;
nrofUplinkSlots = 1;
nrofUplinkSymbols = 2;
ssPBCH_BlockPower = -10;
}
);
# ------- 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.103"; });
NETWORK_INTERFACES :
{
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.10.20";
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.10.20";
GNB_PORT_FOR_S1U = 2152; # Spec 2152
};
}
);
MACRLCs = (
{
tr_s_preference = "local_L1";
tr_n_preference = "local_RRC";
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 250;
pusch_FailureThres = 100;
}
);
L1s = (
{
tr_n_preference = "local_mac";
prach_dtx_threshold = 130
pucch0_dtx_threshold = 80;
pusch_dtx_threshold = -100;
tx_amp_backoff_dB = 3;
L1_rx_thread_core = 11;
L1_tx_thread_core = 12;
phase_compensation = 0; # needs to match O-RU configuration
}
);
RUs = (
{
local_rf = "no";
nb_tx = 4;
nb_rx = 4;
att_tx = 0;
att_rx = 0;
bands = [77];
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
sf_extension = 0;
eNB_instances = [0];
ru_thread_core = 10;
sl_ahead = 8;
tr_preference = "raw_if4p5"; # important: activate FHI7.2
do_precoding = 0; # needs to match O-RU configuration
}
);
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";
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 = "info";
f1ap_log_level = "info";
};
fhi_72 = {
dpdk_devices = ("0000:41:11.0", "0000:41:11.1");
dpdk_iova_mode = "VA";
system_core = 7;
io_core = 8;
worker_cores = (9);
ru_addr = ("98:ae:71:04:83:e3", "98:ae:71:04:83:e3");
mtu = 9600;
fh_config = ({
T1a_cp_dl = (285, 470);
T1a_cp_ul = (285, 429);
T1a_up = (125, 350);
Ta4 = (110, 180);
ru_config = {
iq_width = 9;
iq_width_prach = 9;
};
});
};
nrLDPC_coding_aal : {
dpdk_dev : "0000:01:00.0";
dpdk_core_list : "18-19";
is_t2 : 1;
};

View File

@@ -24,6 +24,7 @@ gNBs =
maxMIMO_layers = 2;
pusch_AntennaPorts = 4;
do_CSIRS = 1;
do_SRS = 0;
force_UL256qam_off = 1;
servingCellConfigCommon = (

View File

@@ -23,7 +23,7 @@ gNBs = (
pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
do_CSIRS = 1;
do_SRS = "periodic";
do_SRS = 1;
servingCellConfigCommon = (
{

View File

@@ -22,6 +22,7 @@ gNBs =
////////// Physical parameters:
min_rxtxtime = 5;
do_SRS = 0;
force_256qam_off = 1;
pdsch_AntennaPorts_N1 = 1;
pdsch_AntennaPorts_XP = 1;

View File

@@ -22,7 +22,7 @@ gNBs =
pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
do_CSIRS = 1;
do_SRS = "periodic";
do_SRS = 1;
min_rxtxtime = 5;
servingCellConfigCommon = (

View File

@@ -26,7 +26,7 @@ gNBs =
pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
do_CSIRS = 1;
do_SRS = "periodic";
do_SRS = 1;
servingCellConfigCommon = (
{

View File

@@ -29,7 +29,7 @@ gNBs =
#pucch_TargetSNRx10 = 200;
ul_prbblacklist = "51,52,53,54"
min_rxtxtime = 6;
do_SRS = "periodic";
do_SRS = 1;
servingCellConfigCommon = (
{

View File

@@ -20,7 +20,7 @@ Ref :
DL & UL scheduling timing : 8.0
UL Indication : 3.0
Slot Indication : 9.0
feprx : 50.0
feprx : 85.0
feptx_ofdm (per port, half_slot) : 31
feptx_total : 92
DeviationThreshold :

View File

@@ -1,37 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
FROM ran-base:latest AS optional-base
RUN DEBIAN_FRONTEND=noninteractive
RUN apt update && \
apt upgrade --yes && \
apt install --yes \
libglfw3-dev
WORKDIR /oai-src
COPY . .
FROM optional-base AS build-imscope
RUN \
# Mount CCache cache directory
--mount=type=cache,target=/root/.cache/ccache/,id=ccache_imscope \
# Mount CPM package cache
--mount=type=cache,target=/root/.cache/cpm/,id=cpmcache_imscope \
mkdir -p /build-imscope && \
cd /build-imscope && \
cmake /oai-src/ -DENABLE_IMSCOPE=ON -GNinja && \
ninja imscope nr-softmodem nr-uesoftmodem
FROM optional-base AS build-tracy
RUN \
# Mount CCache cache directory
--mount=type=cache,target=/root/.cache/ccache/,id=ccache_tracy \
# Mount CPM package cache
--mount=type=cache,target=/root/.cache/cpm/,id=cpmcache_tracy \
mkdir -p /build-tracy && \
cd /build-tracy && \
cmake /oai-src/ -DTRACY_ENABLE=ON -GNinja && \
ninja nr-softmodem nr-uesoftmodem

View File

@@ -14,20 +14,11 @@ RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
libgtest-dev \
libyaml-cpp-dev \
libzmq3-dev \
flatbuffers-compiler \
libnanomsg-dev \
dpdk-dev \
dpdk \
curl
libzmq3-dev
RUN rm -Rf /oai-ran
WORKDIR /oai-ran
COPY . .
WORKDIR /oai-ran/build
RUN cmake .. -GNinja \
-DENABLE_TESTS=ON -DOAI_ZMQ=ON -DCMAKE_BUILD_TYPE=Debug \
-DSANITIZE_ADDRESS=True -DOAI_VRTSIM_TAPS_CLIENT=ON -DOAI_RU_FRONTHAUL=ON \
&& \
ninja
RUN cmake -GNinja -DENABLE_TESTS=ON -DOAI_ZMQ=ON -DCMAKE_BUILD_TYPE=Debug -DSANITIZE_ADDRESS=True .. && ninja

View File

@@ -27,9 +27,10 @@ def GenericHelp(vers):
print(' --local Force local execution: rewrites the test xml script before running to always execute on localhost. Assumes')
print(' images are available locally, will not remove any images and will run inside the current repo directory')
def GitSrvHelp(repository,branch,mergeallow,targetbranch):
def GitSrvHelp(repository,branch,commit,mergeallow,targetbranch):
print(' --repository=[OAI RAN Repository URL] -- ' + repository)
print(' --branch=[OAI RAN Repository Branch] -- ' + branch)
print(' --commitID=[OAI RAN Repository Commit SHA-1] -- ' + commit)
print(' --ranAllowMerge=[Allow Merge Request (with target branch) (true or false)] -- ' + mergeallow)
print(' --targetBranch=[Target Branch in case of a Merge Request] -- ' + targetbranch)

View File

@@ -165,15 +165,6 @@ def ExecuteActionWithParam(action, ctx, node):
core_op = getattr(cls_oaicitest.OaiCiTest, action)
success = core_op(cn_id, ctx, HTML)
elif action == 'DeployWithScript' or action == 'UndeployWithScript':
script = test.findtext('script')
options = test.findtext('options')
if action == 'DeployWithScript':
deploymentTag = RAN.branch
success = cls_oaicitest.DeployWithScript(HTML, node, script, options, deploymentTag)
elif action == 'UndeployWithScript':
success = cls_oaicitest.UndeployWithScript(HTML, ctx, node, script, options)
elif action == 'Deploy_Object' or action == 'Undeploy_Object' or action == "Create_Workspace" or action == "Stop_Object":
CONTAINERS.yamlPath = test.findtext('yaml_path')
CONTAINERS.services = test.findtext('services')

View File

@@ -1,22 +0,0 @@
#!/bin/bash
# SPDX-License-Identifier: MIT
export PS4='[\D{%Y-%m-%d %H:%M:%S}] '
function die() { echo $@; exit 1; }
[ $# -eq 3 ] || die "usage: $0 <path-to-dir> <namespace> <image-tag>"
OC_NS=${2}
IMAGE_TAG=${3}
OC_DIR=${1}
OC_RELEASE=$(basename "${1}")
cat /opt/oc-password | oc login -u oaicicd --server https://api.oai.cs.eurecom.fr:6443 > /dev/null
oc project ${OC_NS} > /dev/null
set -x
helm install --wait --timeout 120s ${OC_RELEASE} --set nfimage.version=${IMAGE_TAG} --hide-notes ${OC_DIR}/.
status=$?
set +x
oc logout > /dev/null
[ $status -eq 0 ] || die "OC chart deployment failed"

View File

@@ -1,26 +0,0 @@
#!/bin/bash
# SPDX-License-Identifier: MIT
function die() { echo $@; exit 1; }
[ $# -eq 3 ] || die "usage: $0 <path-to-dir> <namespace> <log-dir>"
export PS4='[\D{%Y-%m-%d %H:%M:%S}] '
OC_DIR=${1}
OC_NS=${2}
LOG_DIR=${3}
OC_RELEASE=$(basename "${OC_DIR}")
cat ${OC_DIR}/oc-password | oc login -u oaicicd --server https://api.oai.cs.eurecom.fr:6443 > /dev/null
oc project ${OC_NS} > /dev/null
oc describe pod > ${LOG_DIR}/describe-pods-post-test.log
oc get pods.metrics.k8s &> ${LOG_DIR}/nf-resource-consumption.log
oc logs -l app.kubernetes.io/name=${OC_RELEASE} --tail=-1 > ${LOG_DIR}/${OC_RELEASE}.log
set -x
helm uninstall ${OC_RELEASE} --wait
status=$?
set +x
oc logout > /dev/null
[ $status -eq 0 ] || die "OC chart undeployment failed"

View File

@@ -21,7 +21,6 @@ To run individual unit tests, start them like so:
python tests/log-analysis.py -v
python tests/ping-iperf.py -v
python tests/pull-clean-int-registry.py -v
python tests/script-deployment.py -v
The logs will indicate if all tests passed. `tests/deployment.py` requires
these images to be present:

View File

@@ -1,65 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
import sys
import logging
logging.basicConfig(
level=logging.DEBUG,
stream=sys.stdout,
format="[%(asctime)s] %(levelname)8s: %(message)s"
)
import os
import tempfile
import unittest
sys.path.append('./') # to find OAI imports below
import cls_oaicitest
import cls_oai_html
import cls_cmd
from cls_ci_helper import TestCaseCtx
class TestScriptDeployment(unittest.TestCase):
def setUp(self):
self.tmpdir = tempfile.mkdtemp()
self.html = cls_oai_html.HTMLManagement()
self.node = 'localhost'
self.tag = 'develop-12345678'
self.ctx = TestCaseCtx.Default(self.tmpdir)
def tearDown(self):
with cls_cmd.LocalCmd() as c:
c.run(f'rm -rf {self.ctx.logPath}')
def test_simple_deployment(self):
script = 'tests/scripts/deploy-with-script.sh'
options = 'WILL PASS'
success = cls_oaicitest.DeployWithScript(self.html, self.node, script, options, self.tag)
self.assertTrue(success)
def test_simple_deployment_fail(self):
script = 'tests/scripts/deploy-with-script.sh'
options = 'WILLFAIL'
success = cls_oaicitest.DeployWithScript(self.html, self.node, script, options, self.tag)
self.assertFalse(success)
def test_simple_undeployment(self):
script = 'tests/scripts/undeploy-with-script.sh'
options = '%%log_dir%% WILL PASS'
success = cls_oaicitest.UndeployWithScript(self.html, self.ctx, self.node, script, options)
self.assertTrue(success)
# verify logs were created
files = os.listdir(self.tmpdir)
self.assertIn('112233-log1.txt', files)
self.assertIn('112233-log2.txt', files)
def test_simple_undeployment_fail(self):
script = 'tests/scripts/undeploy-with-script.sh'
options = '%%log_dir%% WILLFAILL'
success = cls_oaicitest.UndeployWithScript(self.html, self.ctx, self.node, script, options)
self.assertFalse(success)
# verify logs were created
files = os.listdir(self.tmpdir)
self.assertIn('112233-log1.txt', files)
self.assertIn('112233-log2.txt', files)
if __name__ == '__main__':
unittest.main()

View File

@@ -1,10 +0,0 @@
#!/bin/bash
# SPDX-License-Identifier: MIT
function die() { echo $@; exit 1; }
echo "Deploy script executed with options: $@"
[ $# -lt 2 ] && die "failing"
exit 0

View File

@@ -1,15 +0,0 @@
#!/bin/bash
# SPDX-License-Identifier: MIT
function die() { echo $@; exit 1; }
echo "Undeploy script executed with options: $@"
LOG_DIR="$1"
mkdir -p "$LOG_DIR"
echo "Undeployment started" > "$LOG_DIR/log1.txt"
echo "Undeployment finished successfully" > "$LOG_DIR/log2.txt"
[ $# -lt 3 ] && die "failing"
exit 0

View File

@@ -1,7 +1,8 @@
#!/bin/bash
#/bin/bash
# SPDX-License-Identifier: MIT
branch=$(git rev-parse --abbrev-ref HEAD)
commit=$(git rev-parse HEAD)
file=../../test_results.html
rm -f ${file}

View File

@@ -33,5 +33,3 @@
- Create_Workspace
- AnalyzeRTStats
- AnalyzeRTStats_Object
- DeployWithScript
- UndeployWithScript

View File

@@ -70,7 +70,7 @@
<class>Attach_UE</class>
<desc>Attach OAI UE 1 and 2</desc>
<id>rfsim5g_ue rfsim5g_ue2</id>
<node>localhost</node>
<node>carabe</node>
</testCase>
<testCase>
@@ -98,32 +98,21 @@
</testCase>
<testCase>
<class>Iperf</class>
<desc>Iperf (DL/TCP)(20 sec)</desc>
<iperf_args>-t 20 -R</iperf_args>
<class>Ping</class>
<desc>Ping ext-dn from both UEs</desc>
<id>rfsim5g_ue rfsim5g_ue2</id>
<node>localhost</node>
<node>carabe</node>
<svr_id>oai_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_tcp_rate_target>10</iperf_tcp_rate_target>
</testCase>
<testCase>
<class>Iperf</class>
<desc>Iperf (UL/TCP)(20 sec)</desc>
<iperf_args>-t 20</iperf_args>
<id>rfsim5g_ue rfsim5g_ue2</id>
<node>localhost</node>
<svr_id>oai_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_tcp_rate_target>5</iperf_tcp_rate_target>
<svr_node>carabe</svr_node>
<ping_args>-c 20</ping_args>
<ping_packetloss_threshold>5</ping_packetloss_threshold>
</testCase>
<testCase>
<class>Detach_UE</class>
<desc>Detach OAI UE 1 and 2</desc>
<id>rfsim5g_ue rfsim5g_ue2</id>
<node>localhost</node>
<node>carabe</node>
</testCase>
<testCase>
@@ -189,7 +178,7 @@
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<always_exec>true</always_exec>
<analysis>
<service>nearRT-RIC=LastLineContains=The nearRT-RIC run SUCCESSFULLY</service>
<service>nearRT-RIC=LastLineContains=Removing E2 Node</service>
<service>xapp-rc-moni=LastLineContains=Test xApp run SUCCESSFULLY</service>
<service>xapp-kpm-moni=LastLineContains=Test xApp run SUCCESSFULLY</service>
<service>xapp-kpm-rc=LastLineContains=Test xApp run SUCCESSFULLY</service>

View File

@@ -1,26 +1,28 @@
<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->
<testCaseList>
<htmlTabRef>build-tab</htmlTabRef>
<htmlTabName>Build Images with T2 support</htmlTabName>
<htmlTabRef>build-cuda-tab</htmlTabRef>
<htmlTabName>Build Container Images for ARM with CUDA</htmlTabName>
<htmlTabIcon>wrench</htmlTabIcon>
<testCase>
<class>Create_Workspace</class>
<desc>Create new Workspace for server 0</desc>
<node>stonechat</node>
<node>jetson3-oai</node>
</testCase>
<testCase>
<class>Build_Image</class>
<desc>Build Images with T2</desc>
<kind>fhi72-t2</kind>
<node>stonechat</node>
<desc>Build all Images</desc>
<node>jetson3-oai</node>
<kind>native_cuda_armv8</kind>
</testCase>
<testCase>
<class>Push_Local_Registry</class>
<desc>Push Images to Local Registry</desc>
<node>stonechat</node>
<node>jetson3-oai</node>
<tag_prefix>armv8_cuda_</tag_prefix>
</testCase>
</testCaseList>

View File

@@ -0,0 +1,192 @@
<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->
<testCaseList>
<htmlTabRef>JETSON-5G-NRUE-CUDA</htmlTabRef>
<htmlTabName>30 MHz TDD SA JETSON with CUDA</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<testCase>
<class>DeployCoreNetwork</class>
<desc>Initialize 5G Core</desc>
<cn_id>oc-cn5g-00104</cn_id>
</testCase>
<testCase>
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>jetson2-oai</node>
<images>oai-nr-ue</images>
<tag_prefix>armv8_cuda_</tag_prefix>
</testCase>
<testCase>
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>gracehopper1-oai</node>
<images>oai-gnb-aerial</images>
<tag_prefix>arm_</tag_prefix>
</testCase>
<testCase>
<class>Create_Workspace</class>
<desc>Create new Workspace</desc>
<node>jetson2-oai</node>
</testCase>
<testCase>
<class>Create_Workspace</class>
<desc>Create new Workspace</desc>
<node>gracehopper1-oai</node>
</testCase>
<testCase>
<class>Custom_Script</class>
<desc>Configure 30 MHz bandwidth on WNC RU</desc>
<node>gracehopper1-oai</node>
<script>scripts/set-wnc-bandwidth.sh</script>
<args>30</args>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy PNF/Nvidia CUBB in a container</desc>
<node>gracehopper1-oai</node>
<yaml_path>ci-scripts/yaml_files/sa_gnb_aerial_30MHz</yaml_path>
<services>nv-cubb</services>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy VNF in a container</desc>
<node>gracehopper1-oai</node>
<yaml_path>ci-scripts/yaml_files/sa_gnb_aerial_30MHz</yaml_path>
<services>oai-gnb-aerial</services>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy nrUE (TDD/Band78/40MHz/N310) in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_b200_jetson_cuda_nrue</yaml_path>
<node>jetson2-oai</node>
<num_attempts>3</num_attempts>
</testCase>
<testCase>
<class>Attach_UE</class>
<desc>Attach OAIUE</desc>
<id>oai_ue_jetson2</id>
</testCase>
<testCase>
<class>Custom_Command</class>
<desc>Configure IP route</desc>
<node>jetson2-oai</node>
<command>sudo ip route add 172.21.6.105 via 13.1.1.100 dev oaitun_ue1</command>
</testCase>
<testCase>
<class>Ping</class>
<desc>Ping: 20pings in 20sec</desc>
<id>oai_ue_jetson2</id>
<svr_id>oc-cn5g-00104</svr_id>
<ping_args>-c 20</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>25</ping_rttavg_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/10Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 10M -t 30 -i 1</iperf_args>
<id>oai_ue_jetson2</id>
<svr_id>oc-cn5g-00104</svr_id>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/10Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 10M -t 30 -i 1 -R</iperf_args>
<id>oai_ue_jetson2</id>
<svr_id>oc-cn5g-00104</svr_id>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/30Mbps/UDP)(30 sec)</desc>
<may_fail>true</may_fail>
<iperf_args>-u -b 30M -t 30 -i 1</iperf_args>
<id>oai_ue_jetson2</id>
<svr_id>oc-cn5g-00104</svr_id>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/30Mbps/UDP)(30 sec)</desc>
<may_fail>true</may_fail>
<iperf_args>-u -b 30M -t 30 -i 1 -R</iperf_args>
<id>oai_ue_jetson2</id>
<svr_id>oc-cn5g-00104</svr_id>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
</testCase>
<testCase>
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy nr UE</desc>
<node>jetson2-oai</node>
<yaml_path>ci-scripts/yaml_files/sa_b200_jetson_cuda_nrue</yaml_path>
<analysis>
<services>oai-nr-ue</services>
</analysis>
</testCase>
<testCase>
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy gNB</desc>
<node>gracehopper1-oai</node>
<yaml_path>ci-scripts/yaml_files/sa_gnb_aerial_30MHz</yaml_path>
<analysis>
<services>oai-gnb-aerial=RetxCheck=20,100,100,100 oai-gnb-aerial=EndsWithBye</services>
</analysis>
</testCase>
<testCase>
<class>Custom_Script</class>
<always_exec>true</always_exec>
<desc>Configure 100 MHz bandwidth on WNC RU</desc>
<node>gracehopper1-oai</node>
<script>scripts/set-wnc-bandwidth.sh</script>
<args>100</args>
</testCase>
<testCase>
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>gracehopper1-oai</node>
<images>oai-gnb-aerial</images>
</testCase>
<testCase>
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>jetson2-oai</node>
<images>oai-nr-ue</images>
</testCase>
<testCase>
<class>UndeployCoreNetwork</class>
<always_exec>true</always_exec>
<desc>Terminate 5G Core</desc>
<cn_id>oc-cn5g-00104</cn_id>
</testCase>
</testCaseList>

View File

@@ -1,171 +0,0 @@
<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->
<testCaseList>
<htmlTabRef>test-5g-fhi72-4x4-benetel</htmlTabRef>
<htmlTabName>100 MHz 4x4 TDD SA Benetel</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<testCase>
<class>DeployCoreNetwork</class>
<desc>Initialize 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
<testCase>
<class>DeployWithScript</class>
<desc>Deploy CU</desc>
<node>stonechat</node>
<script>scripts/oc-chart-deploy.sh</script>
<options>/opt/oai-cn5g-fed-develop-2025-jan/ci-scripts/charts/oai-cu/ oaicicd-core-for-fhi72 %%image_tag%%</options>
</testCase>
<testCase>
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>Create_Workspace</class>
<desc>Create new Workspace for server 0</desc>
<node>stonechat</node>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy DU (TDD/Band77/100MHz/Benetel) in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_benetel_4x4_du</yaml_path>
<services>oai-du</services>
<node>stonechat</node>
<num_attempts>2</num_attempts>
</testCase>
<testCase>
<class>Attach_UE</class>
<desc>Attach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>Ping</class>
<desc>Ping: 100 pings in 10 sec</desc>
<id>up2-fhi72</id>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
<ping_args>-c 100 -i 0.1</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>15</ping_rttavg_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/600Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 600M -t 60 -R -l1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/800Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 800M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>Optional iperf (DL/1000Mbps/UDP)(60 sec)</desc>
<may_fail>true</may_fail>
<iperf_args>-u -b 1000M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/60Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 60M -t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/TCP)(30 sec)</desc>
<iperf_args>-t 30 -R</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>40</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/TCP)(30 sec)</desc>
<iperf_args>-t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>10</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Detach_UE</class>
<always_exec>true</always_exec>
<desc>Detach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase>
<testCase>
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy DU</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_benetel_4x4_du</yaml_path>
<services>oai-du</services>
<node>stonechat</node>
<analysis>
<services>oai-du=EndsWithBye</services>
</analysis>
</testCase>
<testCase>
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>UndeployWithScript</class>
<always_exec>true</always_exec>
<desc>Undeploy CU on OC</desc>
<node>stonechat</node>
<script>scripts/oc-chart-undeploy.sh</script>
<options>/opt/oai-cn5g-fed-develop-2025-jan/ci-scripts/charts/oai-cu/ oaicicd-core-for-fhi72 %%log_dir%%</options>
</testCase>
<testCase>
<class>UndeployCoreNetwork</class>
<always_exec>true</always_exec>
<desc>Terminate 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
</testCaseList>

View File

@@ -1,108 +0,0 @@
<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->
<testCaseList>
<htmlTabRef>test-5g-fhi72-8x8-benetel</htmlTabRef>
<htmlTabName>100 MHz 8x8 TDD SA Benetel</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<testCase>
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>Create_Workspace</class>
<desc>Create new Workspace for server 0</desc>
<node>stonechat</node>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy DU (TDD/Band77/100MHz/Benetel/8x8) in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_benetel_8x8_du</yaml_path>
<services>oai-du</services>
<node>stonechat</node>
<num_attempts>2</num_attempts>
</testCase>
<testCase>
<class>Attach_UE</class>
<desc>Attach UE</desc>
<id>up3</id>
</testCase>
<testCase>
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
</testCase>
<testCase>
<class>Ping</class>
<desc>Ping: 100 pings in 10 sec</desc>
<id>up3</id>
<svr_id>oc-cn5g-20899-always-on</svr_id>
<ping_args>-c 100 -i 0.1</ping_args>
<ping_packetloss_threshold>20</ping_packetloss_threshold>
<ping_rttavg_threshold>15</ping_rttavg_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/200Mbps/UDP)(60 sec)</desc>
<may_fail>true</may_fail>
<iperf_args>-u -b 200M -t 60 -R -l1428 -p 5209</iperf_args>
<id>up3</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20899-always-on</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/400Mbps/UDP)(60 sec)</desc>
<may_fail>true</may_fail>
<iperf_args>-u -b 400M -t 60 -R -l 1428 -p 5209</iperf_args>
<id>up3</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<svr_id>oc-cn5g-20899-always-on</svr_id>
</testCase>
<testCase>
<class>Detach_UE</class>
<always_exec>true</always_exec>
<desc>Detach UE</desc>
<id>up3</id>
</testCase>
<testCase>
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase>
<testCase>
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy DU</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_benetel_8x8_du</yaml_path>
<services>oai-du</services>
<node>stonechat</node>
<analysis>
<services>oai-du=EndsWithBye</services>
</analysis>
</testCase>
<testCase>
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
</testCaseList>

View File

@@ -1,170 +0,0 @@
<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->
<testCaseList>
<htmlTabRef>test-5g-fhi72-4x4-liteon</htmlTabRef>
<htmlTabName>100 MHz 4x4 TDD SA LiteON</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<testCase>
<class>DeployCoreNetwork</class>
<desc>Initialize 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
<testCase>
<class>DeployWithScript</class>
<desc>Deploy CU</desc>
<node>stonechat</node>
<script>scripts/oc-chart-deploy.sh</script>
<options>/opt/oai-cn5g-fed-develop-2025-jan/ci-scripts/charts/oai-cu/ oaicicd-core-for-fhi72 %%image_tag%%</options>
</testCase>
<testCase>
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>Create_Workspace</class>
<desc>Create new Workspace for server 0</desc>
<node>stonechat</node>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy DU (TDD/Band78/100MHz/VVDN) in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_liteon_4x4_gnb</yaml_path>
<node>stonechat</node>
<num_attempts>2</num_attempts>
</testCase>
<testCase>
<class>Attach_UE</class>
<desc>Attach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>Ping</class>
<desc>Ping: 100 pings in 10 sec</desc>
<id>up2-fhi72</id>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
<ping_args>-c 100 -i 0.1</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>15</ping_rttavg_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/600Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 600M -t 60 -R -l1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/800Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 800M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>Optional iperf (DL/1000Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 1000M -t 60 -R -l 1428</iperf_args>
<may_fail>true</may_fail>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/60Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 60M -t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/TCP)(30 sec)</desc>
<iperf_args>-t 30 -R</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>40</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/TCP)(30 sec)</desc>
<iperf_args>-t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>10</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Detach_UE</class>
<always_exec>true</always_exec>
<desc>Detach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase>
<testCase>
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy DU</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_liteon_4x4_gnb</yaml_path>
<node>stonechat</node>
<analysis>
<services>oai-du=EndsWithBye</services>
</analysis>
</testCase>
<testCase>
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>UndeployWithScript</class>
<always_exec>true</always_exec>
<desc>Undeploy CU on OC</desc>
<node>stonechat</node>
<script>scripts/oc-chart-undeploy.sh</script>
<options>/opt/oai-cn5g-fed-develop-2025-jan/ci-scripts/charts/oai-cu/ oaicicd-core-for-fhi72 %%log_dir%%</options>
</testCase>
<testCase>
<class>UndeployCoreNetwork</class>
<always_exec>true</always_exec>
<desc>Terminate 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
</testCaseList>

View File

@@ -1,169 +0,0 @@
<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->
<testCaseList>
<htmlTabRef>test-5g-fhi72-4x4-metanoia</htmlTabRef>
<htmlTabName>100 MHz 4x4 TDD SA Metanoia</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<testCase>
<class>DeployCoreNetwork</class>
<desc>Initialize 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
<testCase>
<class>DeployWithScript</class>
<desc>Deploy CU</desc>
<node>stonechat</node>
<script>scripts/oc-chart-deploy.sh</script>
<options>/opt/oai-cn5g-fed-develop-2025-jan/ci-scripts/charts/oai-cu/ oaicicd-core-for-fhi72 %%image_tag%%</options>
</testCase>
<testCase>
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>Create_Workspace</class>
<desc>Create new Workspace for server 0</desc>
<node>stonechat</node>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy DU (TDD/Band78/100MHz/VVDN) in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_metanoia_4x4_gnb</yaml_path>
<node>stonechat</node>
<num_attempts>2</num_attempts>
</testCase>
<testCase>
<class>Attach_UE</class>
<desc>Attach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>Ping</class>
<desc>Ping: 100 pings in 10 sec</desc>
<id>up2-fhi72</id>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
<ping_args>-c 100 -i 0.1</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>15</ping_rttavg_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/600Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 600M -t 60 -R -l1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/800Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 800M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>Optional iperf (DL/1000Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 1000M -t 60 -R -l 1428</iperf_args>
<may_fail>true</may_fail>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/100Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 100M -t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/TCP)(30 sec)</desc>
<iperf_args>-t 30 -R</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>40</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/TCP)(30 sec)</desc>
<iperf_args>-t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>10</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Detach_UE</class>
<always_exec>true</always_exec>
<desc>Detach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase>
<testCase>
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy DU</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_metanoia_4x4_gnb</yaml_path>
<node>stonechat</node>
<analysis>
<services>oai-du=EndsWithBye</services>
</analysis>
</testCase>
<testCase>
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>UndeployWithScript</class>
<always_exec>true</always_exec>
<desc>Undeploy CU on OC</desc>
<node>stonechat</node>
<script>scripts/oc-chart-undeploy.sh</script>
<options>/opt/oai-cn5g-fed-develop-2025-jan/ci-scripts/charts/oai-cu/ oaicicd-core-for-fhi72 %%log_dir%%</options>
</testCase>
<testCase>
<class>UndeployCoreNetwork</class>
<always_exec>true</always_exec>
<desc>Terminate 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
</testCaseList>

View File

@@ -1,162 +0,0 @@
<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->
<testCaseList>
<htmlTabRef>test-5g-fhi72-4x4-vvdn-monolithic</htmlTabRef>
<htmlTabName>100 MHz 4x4 TDD SA VVDN Monolithic</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<testCase>
<class>DeployCoreNetwork</class>
<desc>Initialize 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
<testCase>
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>Create_Workspace</class>
<desc>Create new Workspace for server 0</desc>
<node>stonechat</node>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy gNB (TDD/Band77/100MHz/VVDN) in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_vvdn_4x4_monolithic_gnb</yaml_path>
<services>oai-gnb-monolithic</services>
<node>stonechat</node>
<num_attempts>2</num_attempts>
</testCase>
<testCase>
<class>Attach_UE</class>
<desc>Attach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>Ping</class>
<desc>Ping: 100 pings in 10 sec</desc>
<id>up2-fhi72</id>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
<ping_args>-c 100 -i 0.1</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>15</ping_rttavg_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/600Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 600M -t 60 -R -l1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/800Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 800M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/1000Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 1000M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>Optional iperf (DL/1200Mbps/UDP)(60 sec)</desc>
<may_fail>true</may_fail>
<iperf_args>-u -b 1200M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/100Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 100M -t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/TCP)(30 sec)</desc>
<iperf_args>-t 30 -R</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>40</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/TCP)(30 sec)</desc>
<iperf_args>-t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>10</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Detach_UE</class>
<always_exec>true</always_exec>
<desc>Detach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase>
<testCase>
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy gNB</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_vvdn_4x4_monolithic_gnb</yaml_path>
<services>oai-gnb-monolithic</services>
<node>stonechat</node>
</testCase>
<testCase>
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>UndeployCoreNetwork</class>
<always_exec>true</always_exec>
<desc>Terminate 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
</testCaseList>

View File

@@ -1,198 +0,0 @@
<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->
<testCaseList>
<htmlTabRef>test-5g-fhi72-4x4-vvdn</htmlTabRef>
<htmlTabName>100 MHz 4x4 TDD SA VVDN</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<testCase>
<class>DeployCoreNetwork</class>
<desc>Initialize 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
<testCase>
<class>Custom_Script</class>
<desc>Activate carriers on VVDN RU</desc>
<node>stonechat</node>
<script>scripts/vvdn-activate-carriers.sh</script>
</testCase>
<testCase>
<class>DeployWithScript</class>
<desc>Deploy CU</desc>
<node>stonechat</node>
<script>scripts/oc-chart-deploy.sh</script>
<options>/opt/oai-cn5g-fed-develop-2025-jan/ci-scripts/charts/oai-cu/ oaicicd-core-for-fhi72 %%image_tag%%</options>
</testCase>
<testCase>
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>Create_Workspace</class>
<desc>Create new Workspace for server 0</desc>
<node>stonechat</node>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy DU (TDD/Band77/100MHz/VVDN) in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_vvdn_4x4_du</yaml_path>
<services>oai-du</services>
<node>stonechat</node>
<num_attempts>2</num_attempts>
</testCase>
<testCase>
<class>Attach_UE</class>
<desc>Attach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>Ping</class>
<desc>Ping: 100 pings in 10 sec</desc>
<id>up2-fhi72</id>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
<ping_args>-c 100 -i 0.1</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>15</ping_rttavg_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/600Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 600M -t 60 -R -l1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/800Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 800M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/1000Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 1000M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>Optional iperf (DL/1200Mbps/UDP)(60 sec)</desc>
<may_fail>true</may_fail>
<iperf_args>-u -b 1100M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/100Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 100M -t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/TCP)(30 sec)</desc>
<iperf_args>-t 30 -R</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>40</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/TCP)(30 sec)</desc>
<iperf_args>-t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>10</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Detach_UE</class>
<always_exec>true</always_exec>
<desc>Detach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase>
<testCase>
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy DU</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_vvdn_4x4_du</yaml_path>
<services>oai-du</services>
<node>stonechat</node>
<analysis>
<services>oai-du=EndsWithBye</services>
</analysis>
</testCase>
<testCase>
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>UndeployWithScript</class>
<always_exec>true</always_exec>
<desc>Undeploy CU on OC</desc>
<node>stonechat</node>
<script>scripts/oc-chart-undeploy.sh</script>
<options>/opt/oai-cn5g-fed-develop-2025-jan/ci-scripts/charts/oai-cu/ oaicicd-core-for-fhi72 %%log_dir%%</options>
</testCase>
<testCase>
<class>UndeployCoreNetwork</class>
<always_exec>true</always_exec>
<desc>Terminate 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
<testCase>
<class>Custom_Script</class>
<always_exec>true</always_exec>
<desc>Inactivate carriers on VVDN RU</desc>
<node>stonechat</node>
<script>scripts/vvdn-inactivate-carriers.sh</script>
</testCase>
</testCaseList>

View File

@@ -1,190 +0,0 @@
<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->
<testCaseList>
<htmlTabRef>test-5g-fhi72-4x4-vvdn-nfapi</htmlTabRef>
<htmlTabName>100 MHz 4x4 TDD SA VVDN nFAPI</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon>
<testCase>
<class>DeployCoreNetwork</class>
<desc>Initialize 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
<testCase>
<class>Custom_Script</class>
<desc>Activate carriers on VVDN RU</desc>
<node>stonechat</node>
<script>scripts/vvdn-activate-carriers.sh</script>
</testCase>
<testCase>
<class>DeployWithScript</class>
<desc>Deploy CU</desc>
<node>stonechat</node>
<script>scripts/oc-chart-deploy.sh</script>
<options>/opt/oai-cn5g-fed-develop-2025-jan/ci-scripts/charts/oai-cu/ oaicicd-core-for-fhi72 %%image_tag%%</options>
</testCase>
<testCase>
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy DU-High (TDD/Band77/100MHz/VVDN) in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_vvdn_4x4_nfapi</yaml_path>
<services>oai-du-high</services>
<node>stonechat</node>
<num_attempts>2</num_attempts>
</testCase>
<testCase>
<class>Deploy_Object</class>
<desc>Deploy DU-Low (TDD/Band77/100MHz/VVDN) in a container</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_vvdn_4x4_nfapi</yaml_path>
<services>oai-du-low</services>
<node>stonechat</node>
<num_attempts>2</num_attempts>
</testCase>
<testCase>
<class>Attach_UE</class>
<desc>Attach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>Ping</class>
<desc>Ping: 100 pings in 10 sec</desc>
<id>up2-fhi72</id>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
<ping_args>-c 100 -i 0.1</ping_args>
<ping_packetloss_threshold>1</ping_packetloss_threshold>
<ping_rttavg_threshold>15</ping_rttavg_threshold>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/800Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 800M -t 60 -R -l1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/1200Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 1200M -t 60 -R -l 1428</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/1400Mbps/UDP)(60 sec)</desc>
<iperf_args>-u -b 1400M -t 60 -R -l 1428</iperf_args>
<may_fail>true</may_fail>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/100Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 100M -t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<iperf_profile>balanced</iperf_profile>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (DL/TCP)(30 sec)</desc>
<iperf_args>-t 30 -R</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>40</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Iperf</class>
<desc>iperf (UL/TCP)(30 sec)</desc>
<iperf_args>-t 30</iperf_args>
<id>up2-fhi72</id>
<iperf_tcp_rate_target>10</iperf_tcp_rate_target>
<svr_id>oc-cn5g-20897-stonechat</svr_id>
</testCase>
<testCase>
<class>Detach_UE</class>
<always_exec>true</always_exec>
<desc>Detach UE</desc>
<id>up2-fhi72</id>
</testCase>
<testCase>
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase>
<testCase>
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy DU</desc>
<yaml_path>ci-scripts/yaml_files/sa_fhi_7.2_vvdn_4x4_nfapi</yaml_path>
<services>oai-du-low oai-du-high</services>
<node>stonechat</node>
<analysis>
<services>oai-du-high=EndsWithBye</services>
</analysis>
</testCase>
<testCase>
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>stonechat</node>
<images>oai-gnb-fhi72-t2</images>
</testCase>
<testCase>
<class>UndeployWithScript</class>
<always_exec>true</always_exec>
<desc>Undeploy CU on OC</desc>
<node>stonechat</node>
<script>scripts/oc-chart-undeploy.sh</script>
<options>/opt/oai-cn5g-fed-develop-2025-jan/ci-scripts/charts/oai-cu/ oaicicd-core-for-fhi72 %%log_dir%%</options>
</testCase>
<testCase>
<class>UndeployCoreNetwork</class>
<always_exec>true</always_exec>
<desc>Terminate 5G Core</desc>
<cn_id>oc-cn5g-20897-stonechat</cn_id>
</testCase>
<testCase>
<class>Custom_Script</class>
<always_exec>true</always_exec>
<desc>Inactivate carriers on VVDN RU</desc>
<node>stonechat</node>
<script>scripts/vvdn-inactivate-carriers.sh</script>
</testCase>
</testCaseList>

View File

@@ -0,0 +1,40 @@
# SPDX-License-Identifier: MIT
services:
oai-nr-ue:
image: ${REGISTRY-oaisoftwarealliance/}${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
network_mode: host
runtime: nvidia
container_name: oai-nr-ue
cap_drop:
- ALL
cap_add:
- NET_ADMIN # for interface bringup
- NET_RAW # for ping
- SYS_NICE # for performance
- IPC_LOCK # for memory locking
devices:
- /dev/net/tun:/dev/net/tun
- /dev/bus/usb/:/dev/bus/usb/
ulimits:
core: -1 # for core dumps
environment:
TZ: Europe/Paris
USE_B2XX: 'yes'
USE_ADDITIONAL_OPTIONS: --usrp-args type=b200 -C 3350010000 -r 78 --numerology 1 --band 78 --ssb 345 --ue-fo-compensation --uicc0.imsi 001040000000001 --uicc0.pdu_sessions.[0].dnn oai.ipv4 --thread-pool 5,6,7,8,9 --ue-txgain 15 --ue-rxgain 90 --loader.ldpc.shlibversion _cuda -A 60
cpuset: "3-11"
volumes:
- ../../conf_files/ue.sa.conf:/opt/oai-nr-ue/etc/nr-ue.conf
healthcheck:
test: /bin/bash -c "pgrep nr-uesoftmodem"
interval: 10s
timeout: 5s
retries: 5
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]

View File

@@ -40,7 +40,7 @@ services:
USE_B2XX: 'yes'
USE_ADDITIONAL_OPTIONS: --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx
--telnetsrv --telnetsrv.listenport 9091 --telnetsrv.shrmod ci
--gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --L1s.[0].max_ldpc_iterations 20
--gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 0 --L1s.[0].max_ldpc_iterations 20
--log_config.global_log_options level,nocolor,time,line_num,function
devices:
- /dev/bus/usb/:/dev/bus/usb/

View File

@@ -1,59 +0,0 @@
# SPDX-License-Identifier: MIT
services:
dpdk-init:
image: docker.io/library/oai-dpdk-init:latest
network_mode: host
container_name: dpdk-init
entrypoint: "/tmp/setup_sriov.sh"
privileged: true
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ./setup_sriov_benetel.sh:/tmp/setup_sriov.sh
- /lib/modules:/lib/modules
- /usr/lib/modules:/usr/lib/modules
oai-du:
image: ${REGISTRY-oaisoftwarealliance/}oai-gnb-fhi72-t2:${TAG:-develop}
cap_add:
- IPC_LOCK
- SYS_NICE
cap_drop:
- ALL
container_name: oai-gnb
environment:
TZ: Europe/Paris
USE_ADDITIONAL_OPTIONS: --thread-pool 13,14,15,16,17,18,19,20 --loader.ldpc.shlibversion _aal --log_config.global_log_options level,nocolor,utc_time
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ../../conf_files/gnb-du.sa.band78.273prb.fhi72.4x4-4L-benetel550.conf:/opt/oai-gnb/etc/gnb.conf
- /dev/hugepages:/dev/hugepages
# Please change these values based on your system
cpuset: "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23"
networks:
oai-net:
ipv4_address: 172.21.10.20
depends_on:
dpdk-init:
condition: service_completed_successfully
healthcheck:
test: /bin/bash -c "/opt/oai-gnb/bin/check-prach-io.sh"
start_period: 15s
start_interval: 500ms
interval: 5s
timeout: 5s
retries: 10
networks:
oai-net:
driver: macvlan
name: oai-net
ipam:
config:
- subnet: "172.21.8.0/22"
ip_range: "172.21.10.20/32"
gateway: "172.21.11.254"
driver_opts:
com.docker.network.bridge.name: "oai-net"
parent: bond0

View File

@@ -1,31 +0,0 @@
#!/bin/sh
# SPDX-License-Identifier: MIT
set -eu
IF_NAME=ens2f1
NUM_VFs=2
U_PLANE_MAC_ADD=00:11:22:33:44:66
C_PLANE_MAC_ADD=00:11:22:33:44:67
VLAN=9
MTU=9216
U_PLANE_PCI=41:11.0
C_PLANE_PCI=41:11.1
## It will be something like this --> $DPDK_INST/bin
DPDK_DEVBIND_PREFIX=/usr/local/bin
ethtool -G $IF_NAME rx 8160 tx 8160
sh -c "echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
sh -c "echo $NUM_VFs > /sys/class/net/$IF_NAME/device/sriov_numvfs"
modprobe -r iavf
modprobe iavf
# this next 2 lines is for C/U planes
ip link set $IF_NAME vf 0 mac $U_PLANE_MAC_ADD vlan $VLAN spoofchk off mtu $MTU
ip link set $IF_NAME vf 1 mac $C_PLANE_MAC_ADD vlan $VLAN spoofchk off mtu $MTU
sleep 1
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind $U_PLANE_PCI
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind $C_PLANE_PCI
modprobe vfio-pci
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci $U_PLANE_PCI
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci $C_PLANE_PCI

View File

@@ -1,59 +0,0 @@
# SPDX-License-Identifier: MIT
services:
dpdk-init:
image: docker.io/library/oai-dpdk-init:latest
network_mode: host
container_name: dpdk-init
entrypoint: "/tmp/setup_sriov.sh"
privileged: true
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ./setup_sriov_benetel650_650.sh:/tmp/setup_sriov.sh
- /lib/modules:/lib/modules
- /usr/lib/modules:/usr/lib/modules
oai-du:
image: ${REGISTRY-oaisoftwarealliance/}oai-gnb-fhi72-t2:${TAG:-develop}
cap_add:
- IPC_LOCK
- SYS_NICE
cap_drop:
- ALL
container_name: oai-gnb
environment:
TZ: Europe/Paris
USE_ADDITIONAL_OPTIONS: --thread-pool 13,14,15,16,17,18,19,20 --loader.ldpc.shlibversion _aal --log_config.global_log_options level,nocolor,utc_time
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ../../conf_files/gnb-du.sa.band78.273prb.fhi72.8x8-benetel650_650.conf:/opt/oai-gnb/etc/gnb.conf
- /dev/hugepages:/dev/hugepages
# Please change these values based on your system
cpuset: "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23"
networks:
oai-net:
ipv4_address: 172.21.10.20
depends_on:
dpdk-init:
condition: service_completed_successfully
healthcheck:
test: /bin/bash -c "/opt/oai-gnb/bin/check-prach-io.sh"
start_period: 15s
start_interval: 500ms
interval: 5s
timeout: 5s
retries: 10
networks:
oai-net:
driver: macvlan
name: oai-net
ipam:
config:
- subnet: "172.21.8.0/22"
ip_range: "172.21.10.20/32"
gateway: "172.21.11.254"
driver_opts:
com.docker.network.bridge.name: "oai-net"
parent: bond0

View File

@@ -1,51 +0,0 @@
#!/bin/sh
#### 100G interface --> enp1s0f0 | pcie-address --> 01:00.0
#### 25G interface (PTP) --> enp193s0f1 | pcie-address --> c1:00.1
# SPDX-License-Identifier: MIT
set -eu
IF_NAME=ens2f1
DPDK_DEVBIND_PREFIX=/usr/local/bin
NUM_VFs=4
U_PLANE_MAC_ADD_1=00:11:22:33:44:66
C_PLANE_MAC_ADD_1=00:11:22:33:44:67
U_PLANE_MAC_ADD_2=00:11:22:33:44:68
C_PLANE_MAC_ADD_2=00:11:22:33:44:69
VLAN_1=5
VLAN_2=6
MTU=9216
U_PLANE_PCI_1=41:11.0
C_PLANE_PCI_1=41:11.1
U_PLANE_PCI_2=41:11.2
C_PLANE_PCI_2=41:11.3
ethtool -G $IF_NAME rx 8160 tx 8160
sh -c "echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
sh -c "echo $NUM_VFs > /sys/class/net/$IF_NAME/device/sriov_numvfs"
modprobe -r iavf
modprobe iavf
ip link set $IF_NAME vf 0 mac $U_PLANE_MAC_ADD_1 vlan $VLAN_1 spoofchk off mtu $MTU
ip link set $IF_NAME vf 1 mac $C_PLANE_MAC_ADD_1 vlan $VLAN_1 spoofchk off mtu $MTU
ip link set $IF_NAME vf 2 mac $U_PLANE_MAC_ADD_2 vlan $VLAN_2 spoofchk off mtu $MTU
ip link set $IF_NAME vf 3 mac $C_PLANE_MAC_ADD_2 vlan $VLAN_2 spoofchk off mtu $MTU
sleep 1
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind $U_PLANE_PCI_1
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind $C_PLANE_PCI_1
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind $U_PLANE_PCI_2
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind $C_PLANE_PCI_2
modprobe vfio-pci
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci $U_PLANE_PCI_1
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci $C_PLANE_PCI_1
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci $U_PLANE_PCI_2
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci $C_PLANE_PCI_2

View File

@@ -1,59 +0,0 @@
# SPDX-License-Identifier: MIT
services:
dpdk-init:
image: docker.io/library/oai-dpdk-init:latest
network_mode: host
container_name: dpdk-init
entrypoint: "/tmp/setup_sriov.sh"
privileged: true
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ./setup_sriov_liteon.sh:/tmp/setup_sriov.sh
- /lib/modules:/lib/modules
- /usr/lib/modules:/usr/lib/modules
oai-du:
image: ${REGISTRY-oaisoftwarealliance/}oai-gnb-fhi72-t2:${TAG:-develop}
cap_add:
- IPC_LOCK
- SYS_NICE
cap_drop:
- ALL
container_name: oai-gnb
environment:
TZ: Europe/Paris
USE_ADDITIONAL_OPTIONS: --thread-pool 13,14,15,16,17,18,19,20 --loader.ldpc.shlibversion _aal --log_config.global_log_options level,nocolor,utc_time
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ../../conf_files/gnb-du.sa.band78.273prb.fhi72.4x4-4L-liteon.conf:/opt/oai-gnb/etc/gnb.conf
- /dev/hugepages:/dev/hugepages
# Please change these values based on your system
cpuset: "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23"
networks:
oai-net:
ipv4_address: 172.21.10.20
depends_on:
dpdk-init:
condition: service_completed_successfully
healthcheck:
test: /bin/bash -c "/opt/oai-gnb/bin/check-prach-io.sh"
start_period: 15s
start_interval: 500ms
interval: 5s
timeout: 5s
retries: 10
networks:
oai-net:
driver: macvlan
name: oai-net
ipam:
config:
- subnet: "172.21.8.0/22"
ip_range: "172.21.10.20/32"
gateway: "172.21.11.254"
driver_opts:
com.docker.network.bridge.name: "oai-net"
parent: bond0

View File

@@ -1,27 +0,0 @@
#!/bin/sh
# SPDX-License-Identifier: MIT
set -eu
IF_NAME=ens2f1
DPDK_DEVBIND_PREFIX=/usr/local/bin
ethtool -G $IF_NAME rx 8160
ethtool -G $IF_NAME tx 8160
sh -c "echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
sh -c "echo 2 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
modprobe -r iavf
modprobe iavf
# this next 2 lines is for C/U planes
ip link set $IF_NAME vf 0 mac 00:11:22:33:44:66 vlan 564 spoofchk off mtu 9216
ip link set $IF_NAME vf 1 mac 00:11:22:33:44:67 vlan 564 spoofchk off mtu 9216
sleep 1
# These are the DPDK bindings for C/U-planes on vlan 4
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind 41:11.0
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind 41:11.1
modprobe vfio-pci
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci 41:11.0
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci 41:11.1
# These are the DPDK bindings for T2 card
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py -b vfio-pci 01:00.0
exit 0

View File

@@ -1,59 +0,0 @@
# SPDX-License-Identifier: MIT
services:
dpdk-init:
image: docker.io/library/oai-dpdk-init:latest
network_mode: host
container_name: dpdk-init
entrypoint: "/tmp/setup_sriov.sh"
privileged: true
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ./setup_sriov_metanoia.sh:/tmp/setup_sriov.sh
- /lib/modules:/lib/modules
- /usr/lib/modules:/usr/lib/modules
oai-du:
image: ${REGISTRY-oaisoftwarealliance/}oai-gnb-fhi72-t2:${TAG:-develop}
cap_add:
- IPC_LOCK
- SYS_NICE
cap_drop:
- ALL
container_name: oai-gnb
environment:
TZ: Europe/Paris
USE_ADDITIONAL_OPTIONS: --thread-pool 13,14,15,16,17,18,19,20 --loader.ldpc.shlibversion _aal --log_config.global_log_options level,nocolor,utc_time
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ../../conf_files/gnb-du.sa.band78.273prb.fhi72.4x4-4L-metanoia.conf:/opt/oai-gnb/etc/gnb.conf
- /dev/hugepages:/dev/hugepages
# Please change these values based on your system
cpuset: "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23"
networks:
oai-net:
ipv4_address: 172.21.10.20
depends_on:
dpdk-init:
condition: service_completed_successfully
healthcheck:
test: /bin/bash -c "/opt/oai-gnb/bin/check-prach-io.sh"
start_period: 15s
start_interval: 500ms
interval: 5s
timeout: 5s
retries: 10
networks:
oai-net:
driver: macvlan
name: oai-net
ipam:
config:
- subnet: "172.21.8.0/22"
ip_range: "172.21.10.20/32"
gateway: "172.21.11.254"
driver_opts:
com.docker.network.bridge.name: "oai-net"
parent: bond0

View File

@@ -1,27 +0,0 @@
#!/bin/sh
# SPDX-License-Identifier: MIT
set -eu
IF_NAME=ens2f1
DPDK_DEVBIND_PREFIX=/usr/local/bin
ethtool -G $IF_NAME rx 8160
ethtool -G $IF_NAME tx 8160
sh -c "echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
sh -c "echo 2 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
modprobe -r iavf
modprobe iavf
# this next 2 lines is for C/U planes
ip link set $IF_NAME vf 0 mac 00:11:22:33:44:54 vlan 3 spoofchk off mtu 9216
ip link set $IF_NAME vf 1 mac 00:11:22:33:44:65 vlan 3 spoofchk off mtu 9216
sleep 1
# These are the DPDK bindings for C/U-planes on vlan 4
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind 41:11.0
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind 41:11.1
modprobe vfio-pci
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci 41:11.0
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci 41:11.1
# These are the DPDK bindings for T2 card
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py -b vfio-pci 01:00.0
exit 0

View File

@@ -1,58 +0,0 @@
# SPDX-License-Identifier: MIT
services:
dpdk-init:
image: docker.io/library/oai-dpdk-init:latest
network_mode: host
container_name: dpdk-init
entrypoint: "/tmp/setup_sriov.sh"
privileged: true
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ./setup_sriov_vvdn.sh:/tmp/setup_sriov.sh
- /lib/modules:/lib/modules
- /usr/lib/modules:/usr/lib/modules
oai-du:
image: ${REGISTRY-oaisoftwarealliance/}oai-gnb-fhi72-t2:${TAG:-develop}
cap_add:
- IPC_LOCK
- SYS_NICE
cap_drop:
- ALL
container_name: oai-gnb
environment:
TZ: Europe/Paris
USE_ADDITIONAL_OPTIONS: --thread-pool 13,14,15,16,17,18,19,20 --loader.ldpc.shlibversion _aal --log_config.global_log_options level,nocolor,utc_time
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ../../conf_files/gnb-du.sa.band77.273prb.fhi72.4x4-4L-vvdn.conf:/opt/oai-gnb/etc/gnb.conf
- /dev/hugepages:/dev/hugepages
# Please change these values based on your system
cpuset: "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23"
networks:
oai-net:
ipv4_address: 172.21.10.20
depends_on:
dpdk-init:
condition: service_completed_successfully
healthcheck:
test: /bin/bash -c "/opt/oai-gnb/bin/check-prach-io.sh"
start_period: 15s
start_interval: 500ms
interval: 5s
timeout: 5s
retries: 10
networks:
oai-net:
driver: macvlan
name: oai-net
ipam:
config:
- subnet: "172.21.8.0/22"
ip_range: "172.21.10.20/32"
gateway: "172.21.11.254"
driver_opts:
com.docker.network.bridge.name: "oai-net"
parent: bond0

View File

@@ -1,27 +0,0 @@
#!/bin/sh
# SPDX-License-Identifier: MIT
set -eu
IF_NAME=ens2f1
DPDK_DEVBIND_PREFIX=/usr/local/bin
ethtool -G $IF_NAME rx 8160
ethtool -G $IF_NAME tx 8160
sh -c "echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
sh -c "echo 2 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
modprobe -r iavf
modprobe iavf
# this next 2 lines is for C/U planes
ip link set $IF_NAME vf 0 mac 76:76:64:6e:00:01 vlan 4 spoofchk off mtu 9216
ip link set $IF_NAME vf 1 mac 76:76:64:6e:00:00 vlan 4 spoofchk off mtu 9216
sleep 1
# These are the DPDK bindings for C/U-planes on vlan 4
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind 41:11.0
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind 41:11.1
modprobe vfio-pci
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci 41:11.0
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci 41:11.1
# These are the DPDK bindings for T2 card
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py -b vfio-pci 01:00.0
exit 0

View File

@@ -1,59 +0,0 @@
# SPDX-License-Identifier: MIT
services:
dpdk-init:
image: docker.io/library/oai-dpdk-init:latest
network_mode: host
container_name: dpdk-init
entrypoint: "/tmp/setup_sriov.sh"
privileged: true
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ./setup_sriov_vvdn.sh:/tmp/setup_sriov.sh
- /lib/modules:/lib/modules
- /usr/lib/modules:/usr/lib/modules
oai-gnb-monolithic:
image: ${REGISTRY-oaisoftwarealliance/}oai-gnb-fhi72-t2:${TAG:-develop}
cap_add:
- IPC_LOCK
- SYS_NICE
cap_drop:
- ALL
container_name: oai-gnb
environment:
TZ: Europe/Paris
USE_ADDITIONAL_OPTIONS: --thread-pool 13,14,15,16,17,18,19,20 --loader.ldpc.shlibversion _aal --log_config.global_log_options level,nocolor,utc_time
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ../../conf_files/gnb.sa.band77.273prb.fhi72.4x4-4layers-vvdn.conf:/opt/oai-gnb/etc/gnb.conf
- /dev/hugepages:/dev/hugepages
# Please change these values based on your system
cpuset: "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23"
networks:
oai-net:
ipv4_address: 172.21.10.20
depends_on:
dpdk-init:
condition: service_completed_successfully
healthcheck:
test: /bin/bash -c "/opt/oai-gnb/bin/check-prach-io.sh"
start_period: 15s
start_interval: 500ms
interval: 5s
timeout: 5s
retries: 10
networks:
oai-net:
driver: macvlan
name: oai-net
ipam:
config:
- subnet: "172.21.8.0/22"
ip_range: "172.21.10.20/32"
gateway: "172.21.11.254"
driver_opts:
com.docker.network.bridge.name: "oai-net"
parent: bond0

View File

@@ -1,27 +0,0 @@
#!/bin/sh
# SPDX-License-Identifier: MIT
set -eu
IF_NAME=ens2f1
DPDK_DEVBIND_PREFIX=/usr/local/bin
ethtool -G $IF_NAME rx 8160
ethtool -G $IF_NAME tx 8160
sh -c "echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
sh -c "echo 2 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
modprobe -r iavf
modprobe iavf
# this next 2 lines is for C/U planes
ip link set $IF_NAME vf 0 mac 76:76:64:6e:00:01 vlan 4 spoofchk off mtu 9216
ip link set $IF_NAME vf 1 mac 76:76:64:6e:00:00 vlan 4 spoofchk off mtu 9216
sleep 1
# These are the DPDK bindings for C/U-planes on vlan 4
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind 41:11.0
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind 41:11.1
modprobe vfio-pci
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci 41:11.0
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci 41:11.1
# These are the DPDK bindings for T2 card
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py -b vfio-pci 01:00.0
exit 0

View File

@@ -1,69 +0,0 @@
# SPDX-License-Identifier: MIT
services:
dpdk-init:
image: docker.io/library/oai-dpdk-init:latest
network_mode: host
container_name: dpdk-init
entrypoint: "/tmp/setup_sriov.sh"
privileged: true
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ./setup_sriov_vvdn.sh:/tmp/setup_sriov.sh
- /lib/modules:/lib/modules
- /usr/lib/modules:/usr/lib/modules
oai-du-high:
image: ${REGISTRY-oaisoftwarealliance/}oai-gnb-fhi72-t2:${TAG:-develop}
network_mode: "host"
cap_add:
- IPC_LOCK
- SYS_NICE
cap_drop:
- ALL
container_name: oai-du-high
environment:
TZ: Europe/Paris
USE_ADDITIONAL_OPTIONS: --nfapi VNF
NFAPI_TRACE_LEVEL: info
volumes:
- ../../conf_files/gnb-vnf.sa.band77.273prb.fhi72.4x4-4L-vvdn.conf:/opt/oai-gnb/etc/gnb.conf
# Please change these values based on your system
cpuset: "24,25,26"
healthcheck:
test: /bin/bash -c "pgrep nr-softmodem"
start_period: 15s
start_interval: 500ms
interval: 5s
timeout: 5s
retries: 10
oai-du-low:
image: ${REGISTRY-oaisoftwarealliance/}oai-gnb-fhi72-t2:${TAG:-develop}
network_mode: "host"
cap_add:
- IPC_LOCK
- SYS_NICE
cap_drop:
- ALL
container_name: oai-du-low
environment:
TZ: Europe/Paris
USE_ADDITIONAL_OPTIONS: --nfapi PNF --thread-pool 13,14,15,16,17,18,19,20 --loader.ldpc.shlibversion _aal --log_config.global_log_options level,nocolor,utc_time
NFAPI_TRACE_LEVEL: info
devices:
- /dev/vfio:/dev/vfio/
volumes:
- ../../conf_files/gnb-pnf.sa.band77.273prb.fhi72.4x4-4L-vvdn.conf:/opt/oai-gnb/etc/gnb.conf
- /dev/hugepages:/dev/hugepages
# Please change these values based on your system
cpuset: "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23"
depends_on:
dpdk-init:
condition: service_completed_successfully
healthcheck:
test: /bin/bash -c "/opt/oai-gnb/bin/check-prach-io.sh"
start_period: 15s
start_interval: 500ms
interval: 5s
timeout: 5s
retries: 10

View File

@@ -1,27 +0,0 @@
#!/bin/sh
# SPDX-License-Identifier: MIT
set -eu
IF_NAME=ens2f1
DPDK_DEVBIND_PREFIX=/usr/local/bin
ethtool -G $IF_NAME rx 8160
ethtool -G $IF_NAME tx 8160
sh -c "echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
sh -c "echo 2 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
modprobe -r iavf
modprobe iavf
# this next 2 lines is for C/U planes
ip link set $IF_NAME vf 0 mac 76:76:64:6e:00:01 vlan 4 spoofchk off mtu 9216
ip link set $IF_NAME vf 1 mac 76:76:64:6e:00:00 vlan 4 spoofchk off mtu 9216
sleep 1
# These are the DPDK bindings for C/U-planes on vlan 4
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind 41:11.0
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --unbind 41:11.1
modprobe vfio-pci
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci 41:11.0
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py --bind vfio-pci 41:11.1
# These are the DPDK bindings for T2 card
${DPDK_DEVBIND_PREFIX}/dpdk-devbind.py -b vfio-pci 01:00.0
exit 0

View File

@@ -59,6 +59,7 @@ services:
- gpu
network_mode: host
shm_size: 4096m
stdin_open: true
tty: true
volumes:
- ../../conf_files/gnb-vnf.sa.band78.273prb.aerial.conf:/opt/oai-gnb/etc/gnb.conf

View File

@@ -59,7 +59,6 @@ services:
- gpu
network_mode: host
shm_size: 4096m
tty: true
volumes:
- ../../conf_files/gnb-vnf.sa.band78.78prb.aerial.conf:/opt/oai-gnb/etc/gnb.conf
container_name: oai-gnb-aerial

View File

@@ -59,7 +59,6 @@ services:
- gpu
network_mode: host
shm_size: 4096m
tty: true
volumes:
- ../../conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.conf:/opt/oai-gnb/etc/gnb.conf
container_name: oai-gnb-aerial

View File

@@ -18,7 +18,7 @@ HWs=""
BUILD_DIR=ran_build
CMAKE_BUILD_TYPE="RelWithDebInfo"
CMAKE_CMD="$CMAKE"
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope ldpc_aal websrv oai_iqplayer imscope imscope_record"
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope ldpc_aal ldpc_cuda websrv oai_iqplayer imscope imscope_record"
TARGET_LIST=""
BUILD_TOOL_OPT="-j$(nproc)"

View File

@@ -2,9 +2,6 @@
add_subdirectory(utils)
add_subdirectory(config/yaml)
if (ENABLE_TESTS)
add_subdirectory(config/tests)
endif()
configure_file(cmake_defs.h.in cmake_defs.h @ONLY)
configure_file(oai_version.h.in oai_version.h @ONLY)

View File

@@ -417,31 +417,12 @@ void end_configmodule(configmodule_interface_t *cfgptr)
cfgptr->numptrs=0;
pthread_mutex_unlock(&cfgptr->memBlocks_mutex);
for (int i = 0; i < cfgptr->num_cfgP; i++) {
if (cfgptr->cfgP[i] != NULL) {
free(cfgptr->cfgP[i]);
}
}
if (cfgptr->cfgmode)
free(cfgptr->cfgmode);
if (cfgptr->argv_info)
free(cfgptr->argv_info);
if (cfgptr->tmpdir)
free(cfgptr->tmpdir);
if (cfgptr->status) {
if (cfgptr->status->debug_cfgname)
free(cfgptr->status->debug_cfgname);
free(cfgptr->status);
}
free(cfgptr);
for (int i = 0; i < sizeofArray(Config_Params); i++) {
Config_Params[i].voidptr = NULL;
Config_Params[i].numelt = 0;
Config_Params[i].paramflags &= ~PARAMFLAG_PARAMSETDEF;
}
}
}

View File

@@ -48,6 +48,8 @@ typedef void (*configmodule_endfunc_t)(struct configmodule_interface *cfg);
typedef int (*configmodule_initfunc_t)(struct configmodule_interface *cfg);
typedef struct configmodule_status {
int num_paramgroups;
char **paramgroups_names;
int num_err_nullvalue;
int emptyla;
int num_err_read;

View File

@@ -159,8 +159,6 @@ int config_getlist(configmodule_interface_t *cfg, paramlist_def_t *ParamList, pa
char *res = strstr(cfg->argv[i], searchstr);
if (res != NULL) {
char *bracket = strchr(res + strlen(searchstr), '[');
if (bracket == NULL)
continue;
bracket++;
long num = strtol(bracket, &endptr, 10);
if (num < valid_idx)
@@ -182,9 +180,7 @@ int config_getlist(configmodule_interface_t *cfg, paramlist_def_t *ParamList, pa
sprintf(cfgpath, "%s.[%i]", newprefix, new_idx);
paramdef_t **old = ParamList->paramarray;
ParamList->paramarray = config_allocate_new(cfg, (new_idx + 1) * sizeof(paramdef_t *), true);
if (new_idx > 0 && old != NULL) {
memcpy(ParamList->paramarray, old, new_idx * sizeof(paramdef_t *));
}
memcpy(ParamList->paramarray, old, new_idx * sizeof(paramdef_t *));
ParamList->paramarray[new_idx] = config_allocate_new(cfg, numparams * sizeof(paramdef_t), true);
memcpy(ParamList->paramarray[new_idx], params, sizeof(paramdef_t) * numparams);

View File

@@ -1,11 +0,0 @@
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
add_executable(test_config_cmdline test_config_cmdline.cpp)
target_link_libraries(test_config_cmdline PRIVATE CONFIG_LIB GTest::gtest)
add_dependencies(test_config_cmdline params_libconfig)
add_dependencies(tests test_config_cmdline)
configure_file(test_config.conf test_config.conf COPYONLY)
add_test(NAME test_config_cmdline COMMAND ./test_config_cmdline)
set_tests_properties(test_config_cmdline PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}")

View File

@@ -1,5 +0,0 @@
prefix = (
{
test = 42;
}
);

View File

@@ -1,183 +0,0 @@
/*
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
*/
#include "gtest/gtest.h"
extern "C" {
#include "common/config/config_userapi.h"
#include "common/utils/LOG/log.h"
void exit_function(const char *file, const char *function, const int line, const char *s, const int assert)
{
if (assert) {
abort();
} else {
exit(EXIT_SUCCESS);
}
}
}
configmodule_interface_t *uniqCfg = nullptr;
void run_config_test(int argc, char **argv, int expected_numelt, int expected_ret)
{
configmodule_interface_t *cfg = load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY);
ASSERT_NE(cfg, nullptr);
uniqCfg = cfg;
paramdef_t params[] = {UINT16PARAM("test", "", 0, NULL, 0)};
paramlist_def_t list = {"prefix", NULL, 0};
int ret = config_getlist(cfg, &list, params, sizeofArray(params), NULL);
EXPECT_EQ(ret, expected_ret);
EXPECT_EQ(list.numelt, expected_numelt);
end_configmodule(cfg);
uniqCfg = nullptr;
}
TEST(cmdline, cmdline_new_array)
{
char *array[] = {strdup("test_program"), strdup("--prefix.[0].test"), strdup("1")};
run_config_test(3, array, 1, 1);
for (auto i = 0U; i < sizeofArray(array); i++) {
free(array[i]);
}
}
TEST(cmdline, cmdline_no_crash_on_missing_bracket)
{
char *array[] = {strdup("test_program"), strdup("--prefix.test"), strdup("1")};
run_config_test(3, array, 0, 0);
for (auto i = 0U; i < sizeofArray(array); i++) {
free(array[i]);
}
}
TEST(cmdline, cmdline_multiple_elements)
{
char *array[] = {strdup("test_program"), strdup("--prefix.[0].test"), strdup("1"), strdup("--prefix.[1].test"), strdup("2")};
run_config_test(sizeofArray(array), array, 2, 2);
for (auto i = 0U; i < sizeofArray(array); i++) {
free(array[i]);
}
}
TEST(cmdline, cmdline_out_of_order_error)
{
char *array[] = {strdup("test_program"), strdup("--prefix.[1].test"), strdup("1")};
run_config_test(sizeofArray(array), array, 0, -1);
for (auto i = 0U; i < sizeofArray(array); i++) {
free(array[i]);
}
}
TEST(cmdline, cmdline_reverse_order_error)
{
char *array[] = {strdup("test_program"), strdup("--prefix.[1].test"), strdup("1"), strdup("--prefix.[0].test"), strdup("2")};
run_config_test(sizeofArray(array), array, 0, -1);
for (auto i = 0U; i < sizeofArray(array); i++) {
free(array[i]);
}
}
TEST(cmdline, load_file_and_cmdline)
{
const char *conf_path = "test_config.conf";
char opt_string[256];
snprintf(opt_string, sizeof(opt_string), "%s", conf_path);
char *array[] = {strdup("test_program"), strdup("-O"), strdup(opt_string), strdup("--prefix.[1].test"), strdup("100")};
configmodule_interface_t *cfg = load_configmodule(sizeofArray(array), array, 0);
ASSERT_NE(cfg, nullptr);
uniqCfg = cfg;
paramdef_t params[] = {UINT16PARAM("test", "", 0, NULL, 0)};
paramlist_def_t list = {"prefix", NULL, 0};
int ret = config_getlist(cfg, &list, params, sizeofArray(params), NULL);
EXPECT_EQ(list.numelt, 2);
EXPECT_EQ(ret, 2);
ASSERT_NE(list.paramarray[0], nullptr);
ASSERT_NE(list.paramarray[0][0].u16ptr, nullptr);
EXPECT_EQ(*(list.paramarray[0][0].u16ptr), 42);
ASSERT_NE(list.paramarray[1], nullptr);
ASSERT_NE(list.paramarray[1][0].u16ptr, nullptr);
EXPECT_EQ(*(list.paramarray[1][0].u16ptr), 100);
end_configmodule(cfg);
uniqCfg = nullptr;
for (auto i = 0U; i < sizeofArray(array); i++) {
free(array[i]);
}
}
TEST(cmdline, load_file_and_overwrite)
{
const char *conf_path = "test_config.conf";
char opt_string[256];
snprintf(opt_string, sizeof(opt_string), "%s", conf_path);
char *array[] = {strdup("test_program"), strdup("-O"), strdup(opt_string), strdup("--prefix.[0].test"), strdup("100")};
configmodule_interface_t *cfg = load_configmodule(5, array, 0);
ASSERT_NE(cfg, nullptr);
uniqCfg = cfg;
paramdef_t params[] = {UINT16PARAM("test", "", 0, NULL, 0)};
paramlist_def_t list = {"prefix", NULL, 0};
int ret = config_getlist(cfg, &list, params, sizeofArray(params), NULL);
EXPECT_EQ(list.numelt, 1);
EXPECT_EQ(ret, 1);
ASSERT_NE(list.paramarray[0], nullptr);
ASSERT_NE(list.paramarray[0][0].u16ptr, nullptr);
EXPECT_EQ(*(list.paramarray[0][0].u16ptr), 100);
end_configmodule(cfg);
uniqCfg = nullptr;
for (auto i = 0U; i < sizeofArray(array); i++) {
free(array[i]);
}
}
TEST(cmdline, load_file_and_out_of_order_error)
{
const char *conf_path = "test_config.conf";
char opt_string[256];
snprintf(opt_string, sizeof(opt_string), "%s", conf_path);
char *array[] = {strdup("test_program"), strdup("-O"), strdup(opt_string), strdup("--prefix.[2].test"), strdup("100")};
configmodule_interface_t *cfg = load_configmodule(sizeofArray(array), array, 0);
ASSERT_NE(cfg, nullptr);
uniqCfg = cfg;
paramdef_t params[] = {UINT16PARAM("test", "", 0, NULL, 0)};
paramlist_def_t list = {"prefix", NULL, 0};
int ret = config_getlist(cfg, &list, params, sizeofArray(params), NULL);
EXPECT_EQ(ret, -1);
end_configmodule(cfg);
uniqCfg = nullptr;
for (auto i = 0U; i < sizeofArray(array); i++) {
free(array[i]);
}
}
int main(int argc, char **argv)
{
logInit();
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

View File

@@ -147,10 +147,6 @@ ID = GNB_PHY_UL_SNR_ESTIMATE
DESC = gNodeB SNR estimation based on SRS
GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
FORMAT = int,gNB_ID : int,rnti : int,frame : int,subframe : int,antenna : buffer,snr
ID = GNB_PHY_SRS_LS_ESTIMATE
DESC = gNodeB SRS least-squares channel estimate in the frequency domain
GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
FORMAT = int,gNB_ID : int,rnti : int,frame : int,slot : int,antenna : int,port : buffer,chest_ls
ID = GNB_PHY_PRACH_INPUT_SIGNAL
DESC = gNodeB input data in the time domain for slots with PRACH detection
GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
@@ -233,10 +229,6 @@ ID = GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA
DESC = NR MAC downlink retransmitted PDU for an UE
GROUP = ALL:MAC:GNB:WIRESHARK
FORMAT = int,gNB_ID : int,CC_id : int,rnti : int,frame : int,slot : int,harq_pid : int,round : buffer,data
ID = GNB_MAC_RSRP_MEASUREMENT
DESC = NR MAC RSRP report for an UE
GROUP = ALL:MAC:GNB:CSV
FORMAT = int,gNB_ID : int,rnti : int,frame : int,slot : int,report_type : int,resource_id : int,rsrp
ID = NRUE_MAC_DL_PDU_WITH_DATA
DESC = NR MAC downlink PDU for an UE
GROUP = ALL:MAC:UE:WIRESHARK
@@ -3809,3 +3801,4 @@ ID = VCD_FUNCTION_BEAM_SWITCHING_GPIO
GROUP = ALL:VCD:ENB:VCD_FUNCTION
FORMAT = int,value
VCD_NAME = beam_switching_gpio

View File

@@ -3,7 +3,6 @@
*/
#include "bits.h"
#include "utils.h"
// we avoid assertions.h as it necessitates othe dependencies (e.g., exit_function)
#include <assert.h>
#include <simde/x86/gfni.h>
@@ -74,70 +73,3 @@ uint64_t reverse_bits(uint64_t in, int n_bits)
return rev_bits;
}
/**
* Finds the next contiguous block of set bits.
* @param bitmap The bit buffer
* @param size Total bits in the buffer
* @param pos Pointer to current bit index (updated by function)
* @param start Output: Start index of the found block
* @param end Output: End index of the found block
* @return true if a block was found, false if no more bits are set
*/
bool find_next_rb_block(const uint32_t *bitmap, int size, int *pos, int *start, int *end)
{
const int words = (size + 31) / 32;
// Find start of next block
int idx = get_first_bit_index_mask(bitmap, words, *pos, size - *pos);
if (idx < 0)
return false;
*start = idx;
// Find end of block: first zero bit after idx
// Reuse get_first_bit_index_from on the inverted bitmap
idx++;
int word_idx = idx / 32;
int n = words - word_idx;
uint32_t inv[n];
for (int i = 0; i < n; i++)
inv[i] = ~bitmap[word_idx + i];
if (size % 32 != 0)
inv[n - 1] &= (1u << (size % 32)) - 1;
int end_off = get_first_bit_index_mask(inv, n, idx - word_idx * 32, size - idx);
idx = (end_off < 0) ? size : word_idx * 32 + end_off;
*end = (idx > size) ? size - 1 : idx - 1;
*pos = idx; // Update position for the next call
return true;
}
bool check_rb_in_bitmap(const freq_alloc_bitmap_t *alloc, int rb)
{
return (alloc->bitmap[rb / 32] >> (rb % 32)) & 0x01;
}
freq_alloc_bitmap_t set_start_end_from_bitmap(int size, int alloc_size, const uint8_t *bitmap)
{
freq_alloc_bitmap_t alloc = {0};
int num_words = (size + 31) / 32;
memcpy(alloc.bitmap, bitmap, alloc_size);
alloc.num_rbs = count_bits(alloc.bitmap, num_words);
alloc.first_rb = get_first_bit_index(alloc.bitmap, num_words);
alloc.last_rb = get_last_bit_index(alloc.bitmap, num_words);
AssertFatal(alloc.first_rb >= 0 && alloc.last_rb >=0 , "No valid RB set, no bit set in bitmap\n");
return alloc;
}
freq_alloc_bitmap_t set_bitmap_from_start_size(int start, int size)
{
freq_alloc_bitmap_t alloc = {
.num_rbs = size,
.first_rb = start,
.last_rb = start + size - 1
};
memset(alloc.bitmap, 0, sizeof(alloc.bitmap));
for (int i = start; i < size + start; i++)
alloc.bitmap[i / 32] |= (1U << (i % 32));
return alloc;
}

View File

@@ -73,16 +73,4 @@ static __attribute__((always_inline)) inline int count_bits64_with_mask(uint64_t
uint64_t mask = ((1LL << num) - 1) << start;
return count_bits64(v & mask);
}
bool find_next_rb_block(const uint32_t *bitmap, int size, int *pos, int *start, int *end);
typedef struct {
int first_rb;
int last_rb;
int num_rbs;
uint32_t bitmap[9];
} freq_alloc_bitmap_t;
bool check_rb_in_bitmap(const freq_alloc_bitmap_t *alloc, int rb);
freq_alloc_bitmap_t set_start_end_from_bitmap(int size, int alloc_size, const uint8_t *bitmap);
freq_alloc_bitmap_t set_bitmap_from_start_size(int start, int size);
#endif /* BITS_H_ */

View File

@@ -36,7 +36,7 @@
#include "common/utils/LOG/log.h"
#define ASN_DEBUG(x...) do{ LOG_I(ASN1,x);LOG_I(ASN1,"\n"); } while(false)
#else
#define ASN_DEBUG(x...) do{}while(0)
#define ASN_DEBUG(x...)
#endif
#endif /* UTILS_CONFIG_H_ASN1 */

View File

@@ -16,7 +16,7 @@
#include "utils.h"
#include "common/utils/threadPool/pthread_utils.h"
#define CIRCULAR_BUFFER_SIZE (30720 * 20)
#define CIRCULAR_BUFFER_SIZE (30720 * 14 * 20)
typedef struct {
int magic;
@@ -97,17 +97,10 @@ ShmTDIQChannel *shm_td_iq_channel_connect(const char *name, int timeout_in_secon
// Create shared memory segment
int fd = -1;
while (timeout_in_seconds > 0 && fd == -1) {
for (int i = 0; i < 1000; i++) {
fd = shm_open(name, O_RDWR, S_IRUSR | S_IWUSR);
if (fd != -1) {
break;
}
usleep(1000);
}
fd = shm_open(name, O_RDWR, S_IRUSR | S_IWUSR);
timeout_in_seconds--;
if (fd == -1) {
printf("Waiting for server to create shared memory segment\n");
}
printf("Waiting for server to create shared memory segment\n");
sleep(1);
}
AssertFatal(fd != -1, "shm_open() failed: errno %d, %s", errno, strerror(errno));

View File

@@ -28,7 +28,8 @@
#include "telnetsrv_cpumeasur_def.h"
#include "openair2/LAYER2/NR_MAC_UE/mac_defs.h"
#include "openair1/PHY/defs_nr_UE.h"
#include "openair1/PHY/phy_extern_nr_ue.h"
extern PHY_VARS_NR_UE ***PHY_vars_UE_g;
void measurcmd_display_macstats(telnet_printfunc_t prnt);
void measurcmd_display_macstats_ue(telnet_printfunc_t prnt);
@@ -63,7 +64,7 @@ int get_measurgroups(telnet_measurgroupdef_t **measurgroups) {
void measurcmd_display_phycpu(telnet_printfunc_t prnt) {
PHY_VARS_NR_UE *UE = nrPHY_vars_UE_g[0][0];
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[0][0];
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);
@@ -79,7 +80,7 @@ void measurcmd_display_phycpu(telnet_printfunc_t prnt) {
}
void measurcmd_display_phyta(telnet_printfunc_t prnt)
{
PHY_VARS_NR_UE *UE = nrPHY_vars_UE_g[0][0];
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[0][0];
prnt("%s PHY TA stats\n", HDR);
prnt("N_TA_offset %d\n", UE->N_TA_offset);
prnt("TA command %d\n", UE->ta_command);

View File

@@ -24,7 +24,7 @@
#include "openair2/LAYER2/NR_MAC_gNB/mac_config.h"
#include "openair2/RRC/NR/rrc_gNB_mobility.h"
#include "openair3/NGAP/ngap_gNB_ue_context.h"
#include "openair2/RRC/NR/rrc_gNB_du.h"
#define TELNETSERVERCODE
#include "telnetsrv.h"
@@ -132,6 +132,8 @@ int trigger_reestab(char *buf, int debug, telnet_printfunc_t prnt)
return 0;
}
extern nr_rrc_du_container_t *get_du_for_ue(gNB_RRC_INST *rrc, uint32_t ue_id);
/** @brief Get connected DU by the UE ID */
int fetch_du_by_ue_id(char *buf, int debug, telnet_printfunc_t prnt)
{
@@ -161,6 +163,7 @@ int fetch_du_by_ue_id(char *buf, int debug, telnet_printfunc_t prnt)
}
}
extern void nr_HO_F1_trigger_telnet(gNB_RRC_INST *rrc, uint32_t rrc_ue_id);
/**
* @brief Trigger F1 handover for UE
* @param buf: RRC UE ID or NULL for the first UE in list
@@ -191,6 +194,8 @@ 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

View File

@@ -19,13 +19,14 @@
#include "openair1/PHY/defs_nr_common.h"
#include "openair1/PHY/defs_nr_UE.h"
#include "openair3/NAS/NR_UE/nr_nas_msg.h"
#include "openair1/PHY/phy_extern_nr_ue.h"
#define TELNETSERVERCODE
#include "telnetsrv.h"
#define ERROR_MSG_RET(mSG, aRGS...) do { prnt(mSG, ##aRGS); return 1; } while (0)
extern PHY_VARS_NR_UE ***PHY_vars_UE_g;
/* UE L2 state string */
const char* NR_UE_L2_STATE_STR[] = {
#define UE_STATE(state) #state,
@@ -124,7 +125,7 @@ static int get_dl_toa(char *buf, int debug, telnet_printfunc_t prnt)
int rsc_id = 0;
int ant = 0;
PHY_VARS_NR_UE *UE = nrPHY_vars_UE_g[0][0];
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[0][0];
if (!UE || !UE->prs_vars[gNB_id])
ERROR_MSG_RET("no UE/prs_vars found!\n");
NR_PRS_RESOURCE_t *prs_res = &UE->prs_vars[gNB_id]->prs_resource[rsc_id];

View File

@@ -6,7 +6,6 @@
#include "thread-pool.h"
#include "task.h"
#include "log.h"
#include <stdio.h>
#include <time.h>
#define NUM_THREADS 10
@@ -17,8 +16,6 @@ typedef struct {
int actor_index;
} actor_task_t;
struct timespec ts_arr[NUM_JOBS];
long long delay_table[NUM_THREADS] = {0};
void calculate_delay(struct timespec* send_ts, int thread_index)
@@ -35,6 +32,7 @@ void tpool_function(void* args)
{
int worker_id = get_tpool_worker_index();
calculate_delay((struct timespec*)args, worker_id);
free(args);
}
void actor_function(void* args)
@@ -64,7 +62,7 @@ int main()
// Push tasks to the thread pool
for (int i = 0; i < NUM_JOBS; i++) {
struct timespec* ts = &ts_arr[i];
struct timespec* ts = malloc(sizeof(struct timespec));
clock_gettime(CLOCK_MONOTONIC, ts);
task.args = ts;
pushTpool(&pool, task);
@@ -80,6 +78,7 @@ int main()
float average_delay = sum_delay / (NUM_JOBS * 1.0f);
printf("Average task delay on tpool: %.2f ns\n", average_delay);
memset(delay_table, 0, sizeof(delay_table));
Actor_t actors[NUM_THREADS];
@@ -107,4 +106,4 @@ int main()
average_delay = sum_delay / (NUM_JOBS * 1.0f);
printf("Average task delay on actors: %.2f ns\n", average_delay);
return 0;
}
}

View File

@@ -20,6 +20,8 @@
#include "openair1/PHY/TOOLS/phy_scope_interface.h"
#include "common/utils/load_module_shlib.h"
extern PHY_VARS_NR_UE ***PHY_vars_UE_g;
static websrv_scope_params_t scope_params = {0, 1000, NULL, NULL, 65535};
static websrv_params_t *websrvparams_ptr;

View File

@@ -306,7 +306,7 @@ configuration](../RRC/rrc-usage.md) as well for SIB configuration.
in downlink
* `do_CSIRS` (default 0): flag whether to use channel-state information
reference signal (CSI-RS)
* `do_SRS` (default `none`): string to define SRS type (options: `none`, `periodic`, or `aperiodic`)
* `do_SRS` (default 0): flag whether to use sounding reference signal (SRS)
* `CSI_report_type` (default `ssb_rsrp`): parameter to enable different CSI reporting (options: `ssb_rsrp`, `ssb_sinr` and `cri_rsrp`)
Default setting of CSI reporting quantity is SSB-RSRP.
* `min_rxtxtime` (default 2): minimum feedback time for UE to respond to

View File

@@ -0,0 +1,417 @@
# OAI 5G NR SA tutorial with OAI nrUE with GPU Offload
This tutorial explains how OAI nrUE can use GPU to offload LDPC decoder. In the future we might offload more functions on the GPU.
**Table of Contents**
[[_TOC_]]
## Current Status
The nrUE GPU offload functionality have been tested on below platforms:
|Platform |Version | OS/Linux Kernel |
|---------------|------------|---------------------------------------|
|Jetson AGX Orin|L4T 36.4.7 | U22/5.15.148-tegra (64K page variant) |
|DGX Spark |7.4.0 | U24/6.14.0-1013-nvidia-64k |
The above versions are tested versions, you are free to try on newer versions as well.
You can use another UE platform with GPU as well but it is preferred to use unified memory GPU variant.
### KPIs
The below throughput numbers are similar for TCP/UDP, the gNB was configured for 5 ms TDD pattern (6D3U and Special slot 10D0U) for Nvidia Aerial Testbed.
The UE was in SISO mode.
Testbed Architecture:
UE <--> Over the Air 1.5m to 2m distance <--> WNC RU <--> gNB/DU server
| Platform | Radio | Bandwidth | DL Throughput | UL Throughput |
| ----------- | --------- | --------- | ------------- | ------------- |
| Jetson Orin | B210 | 10 MHz | 12 Mbps | 7.5 Mbps |
| Jetson Orin | B210 | 20 MHz | 20 Mbps | 9.5 Mbps |
| Jetson Orin | B210 | 30 MHz | 61 Mbps | 33 Mbps |
| Jetson Orin | B210 | 40 MHz | 69 Mbps | 46 Mbps |
| DGX Spark | B210 | 40 MHz | 86 Mbps | 46 Mbps |
| DGX Spark | N310/x410 | 100 MHz | 231 Mbps | 118 Mbps |
Stability or long running test with peak throughput for nrUE was performed for 5hrs.
All the numbers are with LDPC GPU offload.
`NOTE`: At the time of writing we only tested the UE in SISO.
We are working supporting multi antenna use case.
## Aerial Testbed Configuration
If you are using aerial testbed with OAI then depending on the bandwidth you want to use, you will have to adapt the value of `ds_offset_dl` in cuphycontroller configuration file.
For our testing environment we adapted the `ds_offset_dl` values as below:
| Bandwidth | ds_offset_dl |
| ----------- | -------------|
| 10 MHz | 14 |
| 20 MHz | 12 |
| 30 MHz | 10 |
| 40 MHz | 9 |
| 100 MHz | 6 |
On the WNC radio we have the below configuration:
```
transmit-power 24
transmit-power-scale 0.0
compress tx static bfp iq-bitwidth 9
compress rx static bfp iq-bitwidth 9
compress prach static bfp iq-bitwidth 9
```
You can adjust the scaling on the RU or you can adjust it in aerial configuration file.
**NOTE**: You might have to adjust these values for your environment, so that the UE can detect the cell and perform random-access.
## Configure the nrUE Hardware Platform
### Configure Jetson AGX Orin
At the time of writing this tutorial AGX Orin only had Jetpack 6.X release which has U22/5.15.148-tegra, for GPU offload on ARM systems it is preferred to use 64K page size kernel.
To change the kernel to 64K page size variant you will have to manually build the kernel. Probably for Jetpack 7.X it will be easier. Before building the kernel make sure AGX Orin has the up to date kernel for your current distribution.
NVIDIA-SMI Version: 540.4.0
CUDA Version: 12.6
CPU: Cortex-A78AE (12)
OS: U22
Kernel: 5.15.148-tegra
NVCC: Build cuda_12.6.r12.6/compiler.34714021_0
UHD: UHD_4.9.0.HEAD-0-g006d7f76 (v4.9.0.0)
#### Update kernel to 64K page size
Login to Jetson AGX Orin
```bash
sudo apt update
sudo apt upgrade
# reboot
```
**CAUTION**: While building the kernel if you make a mistake you have to flash again the Jetson. We are just providing these steps to help you build the kernel with 64K page size. If you have questions or issues building the kernel you can check the [official nvidia documentation](https://docs.nvidia.com/jetson/archives/r36.4.4/DeveloperGuide/SD/Kernel/KernelCustomization.html#sd-kernel-kernelcustomization)
prepare the kernel source code:
```bash
sudo apt install git-core build-essential bc
cd ~/
wget https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v4.4/sources/public_sources.tbz2
# Build Jetson Linux Kernel
tar -xf public_sources.tbz2
cd ~/Linux_for_Tegra/source
tar -xf kernel_src.tbz2
tar -xf kernel_oot_modules_src.tbz2
tar -xf nvidia_kernel_display_driver_source.tbz2
```
the default kernel configuration file used is `kernel/kernel-jammy-src/arch/arm64/configs/defconfig` it is mentioned in `kernel_src_build_env.sh`.
Add `CONFIG_ARM64_64K_PAGES=y` in `kernel/kernel-jammy-src/arch/arm64/configs/defconfig`.
Build the kernel, out-of-tree modules and dtbs:
```bash
make -C kernel
sudo -E make install -C kernel
cp kernel/kernel-jammy-src/arch/arm64/boot/Image
/boot/Image
# Building the NVIDIA Out-of-Tree Modules
cd ~/Linux_for_Tegra/source
make modules
sudo -E make modules_install
sudo nv-update-initrd
make dtbs
cp kernel-devicetree/generic-dts/dtbs/* /boot/dtbs/
```
#### Configure operating system
```bash
jetson_clocks
touch /etc/sysctl.d/rt.conf
## add below content using vim/vi/nano
kernel.sched_rt_runtime_us=-1
kernel.timer_migration=0
sudo cpufreq-set -c 0 -g performance
sudo cpufreq-set -c 5 -g performance
sudo cpufreq-set -c 9 -g performance
```
### Configure DGX Spark
To setup DGX spark you would need to follow the below steps
NVIDIA-SMI Version: 580.95.05
CUDA Version: 13.0
OS: Ubuntu 24
Kernel: 6.14.0-1013-nvidia-64k (You can use a higher version)
NVCC: Build cuda_13.0.r13.0/compiler.36424714_0
UHD: UHD_4.9.0.HEAD-0-g006d7f76 (v4.9.0.0)
Efficient cores (Cortex-A725): 0,1,2,3,4,10,11,12,13,14
Performance cores (Cortex-X925): 5,6,7,8,9,15,16,17,18,19
You can use `sudo cpupower -c 0-19 frequency-info` to check the above core distribution.
```bash
sudo apt update
sudo apt upgrade
#reboot
sudo /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
# Install 64K kernel corresponding to your running kernel
sudo apt install linux-image-6.14.0-1013-nvidia-64k
# You can also fix the kernel so it is not changed with apt upgrade
sudo sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT="Advanced options for DGX OS
GNU\/Linux>DGX OS GNU\/Linux, with Linux 6.14.0-1013-nvidia-64k"/'
/etc/default/grub
#Configure the command line to isolate the cores
cat <<"EOF" | sudo tee /etc/default/grub.d/cmdline.cfg
GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX pci=realloc=off pci=pcie_bus_safe
default_hugepagesz=512M hugepagesz=512M hugepages=24 tsc=reliable
processor.max_cstate=0 audit=0 idle=poll rcu_nocb_poll nosoftlockup
irqaffinity=0-3 isolcpus=managed_irq,domain,4-19
nohz_full=4-19 rcu_nocbs=4-19 earlycon module_blacklist=nouveau
acpi_power_meter.force_cap_on=y numa_balancing=disable init_on_alloc=0
preempt=none ras=off iommu=off mitgations=off kpti=off skew_tick=1 nowatchdog
mce=ignore_ce transparent_hugepage=never"
EOF
touch /etc/sysctl.d/rt.conf
## add below content using vim/vi/nano
kernel.sched_rt_runtime_us=-1
kernel.timer_migration=0
sudo update-grub
sudo reboot
# after reboot you can make a script to set the gpu clock speed to maximum
nvidia-smi -lgc 2000
sudo cpupower frequency-set --governor performance
sudo cpupower idle-set -D 0
```
### Configuration for Ethernet based USRP
If you want to use Ethernet based USRP like N3XX/X3XX/X4XX you would need to run the below commands:
```bash
sudo sysctl -w net.core.wmem_max=62500000
sudo sysctl -w net.core.rmem_max=62500000
sudo sysctl -w net.core.wmem_default=62500000
sudo sysctl -w net.core.rmem_default=62500000
sudo ethtool -G <usrp-interface> tx <maximum-value> rx <maximum-value>
```
*NOTE*: Currently we finalizing container images for OAI-NR-UE with GPU offload, we will provide it soon for container based deployments.
## Using nrUE with B2XX
### Build OAI-nrUE
```bash
mkdir ~/oai-nr-ue
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/oai-nr-ue
cd ~/oai-nr-ue
git checkout ldpc_offload_cuda
cd ~/oai-nr-ue/openairinterface5g/cmake_targets
#Install third-party dependencies
./build_oai -I -w USRP
# Install nrue with USRP support, default nvcc location is /usr/local/bin/nvcc
./build_oai --ninja --build-lib ldpc_cuda --gNB --nrUE -w USRP -C --cmake-opt -DCMAKE_CUDA_COMPILER=<nvcc-location>
```
## Start the nrUE process
Create a UE configuration file based on the PLMN, slicing information, DNN and DNN type you have configured for the UE in the core network.
```bash
cd ~/oai-nr-ue/
# touch nr-ue.conf
```
Sample UE configuration file, you can use the below configuration file and adjust the values as per your testing environment:
```bash
cat nr-ue.conf
uicc0 = {
imsi = "001010000000001";
key = "fec86ba6eb707ed08905757b1bb44b8f";
opc= "C42449363BBAD02B66D16BC975D77CC1";
pdu_sessions = ({ dnn = "oai"; nssai_sst = 1; });
}
```
To start the `nr-uesoftmodem` you would need to know the center frequency, bandwidth, band and ssb. This information is printed in the OAI-gNB logs. You can search for the line `[NR_MAC] Command line parameters for OAI UE` for example:
```bash
[NR_MAC] Command line parameters for OAI UE: -C 3350010000 -r 106 --numerology 1 --band 78 --ssb 513
```
Once you have this information you can start the `nr-uesoftmodem` process:
**Command for Jetson AGX Orin**:
**MANDATORY**: Before starting the UE process it is important to configure the gNB configuration file with `min_rxtxtime` as 6 or higher integer value.
```bash
cd ~/oai-nr-ue/openairinterface5g/cmake_targets/
sudo ./nr-uesoftmodem -O ~/oai-nr-ue/nr-ue.conf -C 3350010000 -r 106 --ssb 513 --numerology 1 --band 78 --thread-pool -1 --num-dl-actors 6 --num-ul-actors 2 -E --loader.ldpc.shlibversion _cuda --usrp-tx-thread-config 1 --ue-fo-compensation
```
**Command for DGX Spark**:
**MANDATORY**: Before starting the UE process it is important to configure the gNB configuration file with `min_rxtxtime` as 6 or higher integer value.
```bash
cd ~/oai-nr-ue/openairinterface5g/cmake_targets/
sudo taskset -c "5-9,15-19" ./nr-uesoftmodem -O ~/oai-nr-ue/nr-ue.conf -C 3350010000 -r 106 --ssb 513 --numerology 1 --band 78 --thread-pool -1 -E --loader.ldpc.shlibversion _cuda --ue-fo-compensation
```
In the above command task-set allows running the UE only on the performance cores.
Understand the command which you just used:
The main RF/cell settings are:
- `-O`: load the UE config file.
- `-C 3900000000`: set DL carrier to 3.9 GHz.
- `-r 106`: use 106 PRBs
- `--numerology 1`: numerology 1, meaning 30 kHz subcarrier spacing.
- `--band 77`: NR band n77.
- `--ssb 516`: expect the SSB to start at sub-carrier 516.
- `--ue-fo-compensation`: enable initial frequency-offset compensation, useful OTA when clocks are not perfectly aligned.
- `--usrp-tx-thread-config 1`: enable an extra USRP TX processing thread
- `-E`: enable threequarter_fs, meaning the UE uses three-quarter sampling rate mode. In OAI this reduces sample rate / transport load where supported.
The parallelism/offload settings are:
- `--thread-pool -1`: create a thread-pool worker with no CPU affinity.
- `--num-dl-actors 6`: use 6 DL actor threads, parallel RX/PDSCH processing workers.
- `--num-ul-actors 2`: use 2 UL actor threads, parallel TX/PUSCH/PUCCH preparation and transmit workers.
- `--loader.ldpc.shlibversion_cuda`: load the CUDA-backed LDPC shared library variant.
When the UE starts it starts with highest gains, but sometimes you would need to adjust the tx/rx gains based on the UEs position from the RU/gNB. To manipulate the gains you can use the below options:
- `--ue-rxgain x`: set UE RX gain.
- `--ue-txgain x`: set UE TX gain.
- `-A 50`: apply a command-line sample advance of 50 samples to compensate RF timing offset.
Once the UE connects you will see the tunnel interface `oaitun_ue1` with ip-address in the subnet which is configured at SMF. You can open another terminal and from there you can do traffic test.
## Using nrUE with X3XX/N3XX/x4XX
### Build OAI-nrUE
For Ethernet based USRPs it is recommended to use DPDK mostly when you want to test for 60-100 MHz bandwidth. If you don't want to use DPDK then you can build the `nr-uesoftmodem` using the previous section.
```bash
mkdir ~/oai-nr-ue
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/oai-nr-ue
cd ~/oai-nr-ue
git checkout ldpc_offload_cuda
cd ~/oai-nr-ue/openairinterface5g/cmake_targets
#Install third-party dependencies
./build_oai -I
#Build and Install DPDK
cd ~/
wget https://fast.dpdk.org/rel/dpdk-24.11.4.tar.xz
sudo apt install wget xz-utils libnuma-dev meson libibverbs-dev rdma-core python3-pyelftools
meson setup build -Dplatform=generic
ninja -C build
sudo ninja install -C build
#Build and Install UHD
sudo apt install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool g++ git inetutils-tools libboost-all-dev libncurses-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev python3-dev python3-mako python3-numpy python3-requests python3-scipy python3-setuptools python3-ruamel.yaml
git clone https://github.com/EttusResearch/uhd ~/uhd && cd uhd
git checkout v4.9.0.0
cd host && mkdir build && cd build
cmake ../ -GNinja
ninja
sudo ninja install
# Install nrue with USRP support, default nvcc location is /usr/local/bin/nvcc
./build_oai --ninja --build-lib ldpc_cuda --gNB --nrUE -w USRP -C --cmake-opt -DCMAKE_CUDA_COMPILER=<nvcc-location>
```
Create the DPDK interfaces for the UHD, use the below script and modify it for your environment. We are using VLAN 80 for DPDK in our environment:
```bash
vim setup_sriov_usrp.sh
```
```bash
#!/bin/sh
set -xeu
pci_addr()
{
PF_IF=$1
VF_INDEX=$2
SYSFS_PATH="/sys/class/net/${PF_IF}/device/virtfn${VF_INDEX}"
if [ ! -e "$SYSFS_PATH" ]; then
echo "VF $VF_INDEX not found for interface $PF_IF"
exit 1
fi
PCI_ADDR=$(basename "$(readlink "$SYSFS_PATH")")
echo "$PCI_ADDR"
}
IF_NAME=enP2p1s0f1np1 ## interface to reach to the USRP on the UHD host
HOST_MAC_ADD=00:11:22:33:44:67
VLAN=80
MTU=9000
NUM_VFs=1
sudo ethtool -G $IF_NAME rx 8160 tx 8160
sudo sh -c "echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs"
sudo sh -c "echo $NUM_VFs > /sys/class/net/$IF_NAME/device/sriov_numvfs"
HOST_PCI_ADDR=$(pci_addr $IF_NAME 0)
# this next 2 lines is for C/U planes
sudo ip link set $IF_NAME vf 0 mac $HOST_MAC_ADD vlan $VLAN spoofchk off mtu $MTU
sleep 1
sudo dpdk-devbind.py --unbind $HOST_PCI_ADDR
sudo modprobe mlx5_core
sudo dpdk-devbind.py --bind mlx5_core $HOST_PCI_ADDR
echo "Successfully configured interface for USRP:
- Mac-address: $HOST_MAC_ADD, VLAN: $VLAN, PCI: $HOST_PCI_ADDR"
exit 0
```
Create `/etc/uhd/uhd.conf` configuration file for allowing UHD to use dpdk for reaching to the USRP:
```txt
[use_dpdk=1]
dpdk_mtu=9000
dpdk_driver=/usr/local/lib/aarch64-linux-gnu/dpdk/pmds-25.0/
dpdk_corelist=5,6,7,8,9
[dpdk_mac=00:11:22:33:44:67]
dpdk_lcore=6
dpdk_ipv4=192.168.80.25/24
```
The ip-address 192.168.80.25/24 is the UHD host ip-address. Make sure you adjust the `dpdk_driver` location.
### Start the nrUE process
Create a UE configuration file based on the PLMN, slicing information, DNN and DNN type you have configured for the UE in the core network. It is similar to previous section.
To start the `nr-uesoftmodem` process:
**Command for DGX Spark**:
```bash
sudo devlink dev reload pci/<HOST_PCI_ADDR> && sudo taskset -c "5-19" ./nr-uesoftmodem --ue-fo-compensation --thread-pool 15,16,17,18,19 --loader.ldpc.shlibversion _cuda -O ~/oai-nr-ue/nr-ue.conf --usrp-args "addr=192.168.80.251,use_dpdk=1" -C 3350010000 -r 273 --numerology 1 --band 78 --ssb 1515 --usrp-tx-thread-config 1
```
DPDK deployment have some issues currently and we need to reload the pci interface before every run. The devlink command `sudo devlink dev reload pci/<HOST_PCI_ADDR>` is doing that.
If you need to adjust the tx/rx gains then you will need to take the parameters from previous section.

View File

@@ -8,219 +8,189 @@
## Prerequisites
Check the [supported hardware operating system guide](./Supported_Hardware_Operating_System.md)
to know if you have the appropriate hardware for your testing requirements.
This tutorial has been tested with following OS and kernels feel free to
install one of the tested operating systems.
The hardware on which we have tried this tutorial:
|Operating System | Kernel |
|----------------------|-----------|
|Ubuntu 22.04/24.04 | 6.8/6.14 |
|Red Hat 9.X | 5.14 |
|Hardware (CPU,RAM) |Operating System (kernel) |NIC (Vendor,Driver,Firmware) |
|-----------------------------------------|------------------------------------------------|-----------------------------------------|
|Intel(R) Xeon(R) Gold 6354 36-Core, 128GB|RHEL 9.2 (5.14.0-284.18.1.rt14.303.el9_2.x86_64)|Intel X710, i40e, 9.20 0x8000d95e 22.0.9 |
|Intel(R) Xeon(R) Gold 6354 36-Core, 128GB|Ubuntu 22.04.3 LTS (5.15.0-1033-realtime) |Intel X710, i40e, 9.00 0x8000cfeb 21.5.9 |
|AMD EPYC 9374F 32-Core Processor, 128GB |Ubuntu 22.04.2 LTS (5.15.0-1038-realtime) |Intel E810 ,ice, 4.00 0x8001184e 1.3236.0|
**NOTE**:
**NOTE**:
- These are not minimum hardware requirements. This is the configuration of our servers.
- The NIC card should support hardware PTP time stamping.
- If you are using Intel servers then use only Ice Lake or newer generations. In case of AMD use only 4th generation, Genoa or newer.
- If you try on any other server apart from the above listed, then choose a desktop/server with clock speed higher than 3.0 GHz and `avx512` capabilities.
- This tutorial gives few instructions for Arm targets, but DU execution on Arm systems is yet not functional.
This feature is intended to enable experiments and future improvements on Arm systems.
NICs we have tested so far:
|Vendor |Firmware Version |
|---------------|------------------------|
|Intel X710 |9.20 0x8000d95e 22.0.9 |
|Intel E810-XXV |4.00 0x8001184e 1.3236.0|
|E810-C |4.20 0x8001784e 22.0.9 |
|Intel XXV710 |6.02 0x80003888 |
**Note**:
- Compute Hardware:
- For 4x4 100MHz 4L DL and 2L UL, it is important to have a clock speed
higher than 4GHz or use accelerators as AMD T2, Intel V-RAN Boost or Nvidia
Aerial L1.
- Minimum functional hardware requires clock speed of minimum 2.5GHz, 10 SFP
NIC
- Recommended servers for 8/9 bit compression:
- Intel: 3rd Generation (Ice Lake) or higher
- AMD: 4th Generation (Genoa) or higher
- ARM: Neoverse V2
- Uncompressed mode does not require AVX512
- The NIC card should support hardware PTP time stamping.
- With AMD servers/desktop machines with PCIe 5.0 we have only used E810 cards.
- If you are using Mellanox NIC, please be aware that DPDK can't bind the NIC
as `vfio-pci`. Instead it must be bind with `mlx` driver.
- If you are using Mellanox NIC, please be aware that DPDK can't bind the NIC as vfio-pci. Instead it must be bind with mlx driver.
PTP enabled switches and Grandmaster clock we have tested with:
PTP enabled switches and grandmaster clock we have in are lab:
|Vendor |
|------------------------|
|CISCO C93180YC-FX3 |
|Fibrolan Falcon-RX/812/G|
|Qulsar Qg2 (Grandmaster)|
|Vendor |Software Version|
|------------------------|----------------|
|CISCO C93180YC-FX3 |10.2(4) |
|Fibrolan Falcon-RX/812/G|8.0.25.4 |
|Qulsar Qg2 (Grandmaster)|12.1.27 |
**S-Plane synchronization is mandatory.** S-plane support is done via `ptp4l` and `phc2sys`. Make sure your version matches.
| Software | Software Version|
|-----------|-----------------|
| `ptp4l` | 4.4 |
| `phc2sys` | 4.4 |
In our Lab we only use LLS-C3 configuration, i.e. using an external
Grandmaster, a switch as a boundary clock, and the gNB/DU and RU. We have not
tested any RU without S-plane. Though some community members use LLS-C1 and its
support depends on the NIC.
| Software | Software Version |
|-----------|------------------|
| `ptp4l` | 3.1.1 |
| `phc2sys` | 3.1.1 |
We have only verified LLS-C3 configuration in our lab, i.e. using an external
grandmaster, a switch as a boundary clock, and the gNB/DU and RU. We haven't
tested any RU without S-plane.
We tested the category A radio units listed below.
|Vendor |Software Version |
|----------------------|------------------------|
|VVDN LPRU |03-v3.0.5 |
|LiteON RU FR1 |02.00.10 |
|LiteON RU FR2 |02.00.07 |
|Metanoia RU FR1 (Jura)|2.0.6 |
|Benetel 650 |RAN650-1v2.1.0-M-0820797|
|Benetel 550 |RAN550-1v2.1.0-M-0820797|
|Foxconn RPQN |v3.1.15q.551_rc10 |
|Microamp RU (FR2) |0.1.174 |
|Vendor |Software Version |
|-----------------|---------------------------------------------|
|VVDN LPRU |03-v3.0.5 |
|LiteON RU FR1 |01.00.08/02.00.03/02.00.10 |
|LiteON RU FR2 |02.00.07 |
|Metanoia RU FR1 |2.0.6 |
|Benetel 650 |RAN650-1v2.1.0-M-0820797 |
|Benetel 550 |RAN550-1v2.1.0-M-0820797 |
|Foxconn RPQN |v3.1.15q.551_rc10 |
|Microamp RU |0.1.174 |
Supported libxran releases:
Tested libxran releases:
| Vendor |
|-----------------------------------------|
| `oran_f_release_v1.0` |
| `oran_k_release_v1.0` |
**Note**: The libxran driver of OAI identifies the above F release version as
"6.1.0" (F is the sixth letter, then 1.0), and the above K release as "11.1.0".
**Note**: The libxran driver of OAI identifies the above F release version as "6.1.0" (F is the sixth letter, then 1.0), and the above K release as "11.1.0".
### Configure your server
1. Disable Hyperthreading (HT) in your BIOS for ease of CPU pining. If you want
to enable it then adjust the boot line command to isolate the whole physical
CPU including the threads.
2. Configure the system with in performance mode. In some situation it will be
better to avoid BIOS telco profile as it uses HT and lowers the CPU clock
speed.
3. We recommend you to start with a fresh installation of OS (Operating
System), either RPM or Debian.
4. Change the boot commands based on the below section.
1. Disable Hyperthreading (HT) in your BIOS. In all our servers HT is always disabled.
2. We recommend you to start with a fresh installation of OS (either RHEL or Ubuntu). You have to install realtime kernel on your OS (Operating System). Based on your OS you can search how to install realtime kernel.
3. Install realtime kernel for your OS
4. Change the boot commands based on the below section. They can be performed either via `tuned` or via manually building the kernel
##### x86 (Intel/AMD)
#### CPU allocation
We are taking an example of a 32 core Intel(R) Xeon(R) Gold 6433N, depending on
your system you would need to adjust the isolated and non-isolated cores.
Though we don't recommend hyper-threading but if you want to use then make sure
you isolate the whole physical CPU.
**This section is important to read, regardless of the operating system you are using.**
1. Install realtime kernel,
Your server could be:
Ubuntu (to know more about the below commands please check Canonical's official
website):
* One NUMA node (See [one NUMA node example](#one-numa-node)): all the processors are sharing a single memory system.
* Two NUMA nodes (see [two NUMA nodes example](#two-numa-nodes)): processors are grouped in 2 memory systems.
- Usually the even (ie `0,2,4,...`) CPUs are on the 1st socket
- And the odd (ie (`1,3,5,...`) CPUs are on the 2nd socket
DPDK, OAI and kernel threads require to be properly allocated to extract maximum real-time performance for your use case.
1. **NOTE**: Currently the default OAI 7.2 configuration file requires isolated **CPUs 0,2,4** for DPDK/libXRAN, **CPU 6** for `ru_thread`, **CPU 8** for `L1_rx_thread` and **CPU 10** for `L1_tx_thread`. It is preferrable to have all these threads on the same socket.
2. Allocating CPUs to the OAI nr-softmodem is done using the `--thread-pool` option. Allocating 4 CPUs is the minimal configuration but we recommend to allocate at least **8** CPUs. And they can be on a different socket as the DPDK threads.
3. And to avoid kernel preempting these allocated CPUs, it is better to force the kernel to use un-allocated CPUs.
Let summarize for example on a `32-CPU` single NUMA node system, regardless of the number of sockets:
|Applicative Threads|Allocated CPUs |
|-------------------|------------------|
|XRAN DPDK usage |0,2,4 |
|OAI `ru_thread` |6 |
|OAI `L1_rx_thread` |8 |
|OAI `L1_tx_thread` |10 |
|OAI `nr-softmodem` |1,3,5,7,9,11,13,15|
|kernel |16-31 |
In below example we have shown the output of `/proc/cmdline` for two different servers, each of them have different number of NUMA nodes. **Be careful in isolating the CPUs in your environment.** Apart from CPU allocation there are additional parameters which are important to be present in your boot command.
Modifying the `linux` command line usually requires to edit string `GRUB_CMDLINE_LINUX` in `/etc/default/grub`, run a `grub` command and reboot the server.
* Set parameters `isolcpus`, `nohz_full` and `rcu_nocbs` with the list of CPUs to isolate for XRAN.
* Set parameter `kthread_cpus` with the list of CPUs to isolate for kernel.
Set the `tuned` profile to `realtime`. If the `tuned-adm` command is not installed then you have to install it. When choosing this profile you have to mention the isolated cpus in `/etc/tuned/realtime-variables.conf`. By default this profile adds `skew_tick=1 isolcpus=managed_irq,domain,<cpu-you-choose> intel_pstate=disable nosoftlockup` in the boot command. **Make sure you don't add them while changing `/etc/default/grub`**.
```bash
sudo apt install ubuntu-realtime
# using ubuntu pro if you have the subscription
pro enable realtime-kernel
tuned-adm profile realtime
```
Red Hat (to know more about the below commands please check Red Hat's official
website):
**Checkout anyway the examples below.**
#### One NUMA Node
Below is the output of `/proc/cmdline` of a single NUMA node server,
```bash
subscription-manager repos --enable rhel-10-for-x86_64-rt-rpms
dnf groupinstall RT
NUMA:
NUMA node(s): 1
NUMA node0 CPU(s): 0-31
```
For other operating systems you would need to either build the kernel from
source or search if you can install it using a package manager.
2. Update the Grub via creating a file `/etc/default/grub.d/cmdline.cfg`.
```bash
GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX isolcpus=domain,4-31 nohz_full=4-31 irqaffinity=0,1,2,3 rcu_nocbs=4-31 hugepagesz=2M hugepages=0 default_hugepagesz=1G hugepagesz=1G hugepages=20 intel_iommu=on iommu=pt selinux=0 enforcing=0 intel_pstate=disable"
isolcpus=0-15 nohz_full=0-15 rcu_nocbs=0-15 kthread_cpus=16-31 rcu_nocb_poll nosoftlockup default_hugepagesz=1GB hugepagesz=1G hugepages=20 amd_iommu=on iommu=pt mitigations=off skew_tick=1 selinux=0 enforcing=0 tsc=reliable nmi_watchdog=0 softlockup_panic=0 audit=0 vt.handoff=7
```
In the above command:
Example taken for AMD EPYC 9374F 32-Core Processor
1. Isolated CPUs: 4-31, we recommend to leave the initial CPUs for the kernel
- `isolcpus=domain,4-31`: removes CPUs 431 from normal scheduler
load-balancing domains
- `nohz_full=4-31` enables full tickless operation on those CPUs
- `rcu_nocbs=4-31` moves RCU callback processing off those CPUs
2. Non-isolated CPUs: 0,1,2,3
- `irqaffinity=0,1,2,3` directs default interrupt handling to CPUs 03 so
the isolated CPUs are disturbed less.
3. Hugepages: The default hugepage size is 1G (`default_hudepagesz=1G`) and the
command above reserves 20G (`hugepages=20`). If you want to reduce then you
can put `hugepages=9` as OAI gNB/DU by default initializes with 8G
hugepages.
4. IOMMU: It is needed for DPDK, for Intel servers its `intel_iommu` but AMD it
is `amd_iommu`
5. P-State: For Intel the Pstate driver is `intel_pstate` and for AMD it is
`amd_pstate`
#### Two NUMA Nodes
After changing you would need to rebuild the grub and reboot the system:
Below is the output of `/proc/cmdline` of a two NUMA node server,
```bash
sudo update-grub
sudo reboot
```
NUMA:
NUMA node(s): 2
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35
```
3. Configure your server to maximum performance mode either via OS or in BIOS.
If you want to disable CPU sleep states via OS then use the below command:
```bash
mitigations=off usbcore.autosuspend=-1 intel_iommu=on intel_iommu=pt selinux=0 enforcing=0 nmi_watchdog=0 softlockup_panic=0 audit=0 skew_tick=1 isolcpus=managed_irq,domain,0,2,4,6,8,10,12,14,16 nohz_full=0,2,4,6,8,10,12,14,16 rcu_nocbs=0,2,4,6,8,10,12,14,16 rcu_nocb_poll intel_pstate=disable nosoftlockup cgroup_disable=memory mce=off hugepagesz=1G hugepages=40 hugepagesz=2M hugepages=0 default_hugepagesz=1G isolcpus=managed_irq,domain,0,2,4,6,8,10,12,14 kthread_cpus=18-35 intel_pstate=disable nosoftlockup tsc=reliable
```
Example taken for Intel(R) Xeon(R) Gold 6354 CPU @ 3.00GHz
#### Common
Configure your servers to maximum performance mode either via OS or in BIOS. If you want to disable CPU sleep state via OS then use the below command:
```bash
# Disable cpu cstates
# to disable
sudo cpupower idle-set -D 0
# you can make a crontab to automate this step at restart
#to enable
sudo cpupower idle-set -E
```
##### Aarch64
The above information we have gathered either from O-RAN documents or via our own experiments. In case you would like to read the O-RAN documents then here are the links:
We are taking an example from a Gracehopper GH200 Neoverse-V2
1. [O-RAN-SC O-DU Setup Configuration](https://docs.o-ran-sc.org/projects/o-ran-sc-o-du-phy/en/latest/Setup-Configuration_fh.html)
2. [O-RAN Cloud Platform Reference Designs 2.0,O-RAN.WG6.CLOUD-REF-v02.00,February 2021](https://orandownloadsweb.azurewebsites.net/specifications)
1. Install nvidia-64k pagesize kernel using `apt/dnf`
2. Update the Grub via creating a file `/etc/default/grub.d/cmdline.cfg`.
```bash
GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUXpci=realloc=off pci=pcie_bus_safe default_hugepagesz=512M hugepagesz=512M hugepages=256 tsc=reliable processor.max_cstate=0 audit=0 idle=poll rcu_nocb_poll nosoftlockup irqaffinity=0 isolcpus=managed_irq,domain,4-71 nohz_full=4-71 rcu_nocbs=4-71 earlycon module_blacklist=nouveau acpi_power_meter.force_cap_on=y numa_balancing=disable init_on_alloc=0 preempt=none"
```
In the above command (the explanation of the parameters is same as x86):
1. Isolated CPUs: 4-71, we recommend to leave the initial CPUs for the kernel
2. Non-isolated CPUs: 0,1,2,3
3. Hugepages: The default hugepage size is 512M (`default_hudepagesz=512M`) and the command above reserves 131072M (`hugepages=256`).
After changing you would need to rebuild the grub and reboot the system:
```bash
sudo update-grub
sudo reboot
```
You can adapt the above command for a DGX spark.
##### Common for both Architectures
1. Configuration for realtime scheduling:
```bash
# create a file in sysctl.d
vi /etc/sysctl.d/rt.conf
# disables the RT throttling limit, allowing real-time tasks to use unlimited CPU time
kernel.sched_rt_runtime_us=-1
# prevents timers from being migrated between CPUs, reducing jitter on isolated/real-time cores.
kernel.timer_migration=0
```
2. If you are using systemd you can configure `CPUAffinity` in `/etc/systemd/
system.conf` to non-isolated CPUs. It helps if you are having issues with SSH
or tcpdump when OAI-gNB/DU is running.
After applying both the steps you can reboot the system.
### PTP configuration
**Note**: You may run OAI with O-RAN 7.2 Fronthaul without a RU attached (e.g.
for benchmarking).
**Note**: You may run OAI with O-RAN 7.2 Fronthaul without a RU attached (e.g. for benchmarking).
In such case, you can skip PTP configuration and go to DPDK section.
1. You can install `linuxptp` rpm or debian package. It will install ptp4l and phc2sys.
```bash
# Sometimes in the package repository the PTP version is old, so its better to compile from source
git clone https://github.com/richardcochran/linuxptp.git && cd linuxptp
git checkout v4.4
make
cp ptp4l phc2sys /usr/sbin/
#RHEL
sudo dnf install linuxptp -y
#Ubuntu
sudo apt install linuxptp -y
```
Once installed you can use this configuration file for ptp4l (`/etc/ptp4l.conf`). Here the clock domain is 24 so you can adjust it according to your PTP GM clock domain
@@ -311,9 +281,9 @@ Download DPDK version 20.11.9 (F release) or 24.11.4 (K release).
```bash
# on debian
sudo apt install wget xz-utils libnuma-dev libibverbs-dev rdma-core python3-pyelftools meson
sudo apt install wget xz-utils libnuma-dev
# on Fedora/RHEL
sudo dnf install wget xz numactl-devel rdma-core-devel libibverbs-devel python3-pyelftools meson
sudo dnf install wget xz numactl-devel
cd
wget http://fast.dpdk.org/rel/dpdk-20.11.9.tar.xz # F release
wget http://fast.dpdk.org/rel/dpdk-24.11.4.tar.xz # K release
@@ -322,6 +292,11 @@ wget http://fast.dpdk.org/rel/dpdk-24.11.4.tar.xz # K release
#### DPDK Compilation and Installation
```bash
# Installing meson : it should pull ninja-build and compiler packages
# on debian
sudo apt install python3-pyelftools meson
# on Fedora/RHEL
sudo dnf install python3-pyelftools meson
tar xvf dpdk-20.11.9.tar.xz && cd dpdk-stable-20.11.9 # F release
tar xvf dpdk-24.11.4.tar.xz && cd dpdk-stable-24.11.4 # K release
@@ -335,7 +310,6 @@ sudo ninja install -C build
Check if the LD cache contains the DPDK Shared Objects after update:
```bash
# output for DPDK 20.11.9
sudo ldconfig -v | grep rte_
librte_fib.so.0.200.2 -> librte_fib.so.0.200.2
librte_telemetry.so.0.200.2 -> librte_telemetry.so.0.200.2
@@ -409,7 +383,6 @@ cd ~/openairinterface5g/
Download ORAN FHI DU library, checkout the correct version, and apply the correct patch (available in `oai_folder/cmake_targets/tools/oran_fhi_integration_patches`).
#### F release
```bash
git clone https://github.com/openairinterface/o-du-phy.git ~/phy
cd ~/phy
@@ -427,8 +400,10 @@ git checkout <desired-tag> # shall match a variable `K_VERSION`
Compile the fronthaul interface library by calling `make` and the option
`XRAN_LIB_SO=1` to have it build a shared object. Note that we provide two
environment variables `RTE_SDK` for the path to the source tree of DPDK, and
`XRAN_DIR` to set the path to the fronthaul library. For building for a Arm
target, set as well the environment variable `TARGET=armv8`.
`XRAN_DIR` to set the path to the fronthaul library.
For building for a Arm target, set as well the environment variable `TARGET=armv8`.
DU execution on Arm systems is yet not functional.
This feature is intended to enable experiments and future improvements on Arm systems.
**Note**: you need at least gcc-11 and g++-11.
@@ -560,7 +535,7 @@ cat /etc/ru_config.cfg
mimo_mode=1_2_3_4_4x4
downlink_scaling=0
prach_format=short
compression=static_compressed # if `dynamic_compressed` used, set the `comp_hdr_type` to `dynamic` in the gNB config file
compression=static_compressed
lf_prach_compression_enable=true
cplane_per_symbol_workaround=disabled
cuplane_dl_coupling_sectionID=disabled
@@ -586,7 +561,7 @@ cat /etc/ru_config.cfg
mimo_mode=1_2_3_4_4x4
downlink_scaling=0
prach_format=short
compression=static_compressed # if `dynamic_compressed` used, set the `comp_hdr_type` to `dynamic` in the gNB config file
compression=static_compressed
lf_prach_compression_enable=true
cplane_per_symbol_workaround=disabled
cuplane_dl_coupling_sectionID=disabled
@@ -1591,7 +1566,6 @@ Edit the sample OAI gNB configuration file and check following parameters:
* `RunSlotPrbMapBySymbol`: enable CP multisection (one symbol per section); default value is 0
* DU delay profile (`T1a` and `Ta4`): pairs of numbers `(x, y)` specifying minimum and maximum delays
* `ru_config`: RU-specific configuration:
* `comp_hdr_type`: compression header type; `dynamic` or `static` (default)
* `iq_width`: Width of DL/UL IQ samples: if 16, no compression, if <16, applies
compression
* `iq_width_prach`: Width of PRACH IQ samples: if 16, no compression, if <16, applies
@@ -1724,10 +1698,9 @@ For two RUs using a 8x8 configuration, i.e. a single antenna system, the referen
For two RUs each using a 4x4 configuration, i.e. a distributed antenna system (DAS),
we use the analog beamforming implementation. More details can be found in
[this document](./analog_beamforming.md). It is important to note the following parameters in the configuration file:
- In RU section `nb_tx` and `nb_rx` indicates the total number of physical antenna ports across all distributed RUs.
- `pusch_AntennaPorts`, `pdsch_AntennaPorts_XP * pdsch_AntennaPorts_N1 * pdsch_AntennaPorts_N2` indicate the number of logical antenna ports for one analog beam.
The reference DU configuration file is [`gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf).
[this document](./analog_beamforming.md). It is important to note that
the configuration file should be set as a 4x4 scenario and each RU would be given a
different beam. The reference DU configuration file is [`gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf).
DAS is enabled by setting to 1 the parameter `enable_das` in `L1` section.
@@ -2062,7 +2035,7 @@ fhi_72 = {
* `dpdk_mem_size`: [*]
* `dpdk_iova_mode`: [*]
* `owdm_enable`: [*]
* `fh_config`: DU delay profile (`T1a` and `Ta4`), and optionally `ru_config` for IQ bitwidth and compression type (assumed the same for PxSCH/PRACH)
* `fh_config`: only DU delay profile (`T1a` and `Ta4`)
* `app_id`: [*]
[*] see [Configure OAI gNB](#configure-oai-gnb) for more details
@@ -2070,7 +2043,7 @@ fhi_72 = {
The following parameters are retrieved from the RU and forwarded to the xran:
* `MTU`
* `RU MAC address`
* `IQ compression`: unless explicitely specified via gNB config file, the first <iq-bitwidth> value from <compression-method-supported> node is taken and static compression is set (assumed the same for PxSCH/PRACH)
* `IQ compression`: if RU supports multiple, the first value in the list is taken; please note that the same value is used for PxSCH/PRACH
* `PRACH offset`: hardcoded based on the RU vendor (i.e. for Benetel `max(Nrx,Ntx)`)
### Build and compile gNB
@@ -2198,7 +2171,6 @@ sequenceDiagram
[HW] [MPLANE] Storing the following information to forward to xran:
RU MAC address 8c:1f:64:d1:11:c0
MTU 9216
Compression header type static
IQ bitwidth 9
PRACH offset 4
DU port bitmask 61440
@@ -2396,7 +2368,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2416,7 +2387,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2436,7 +2406,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2456,7 +2425,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2476,7 +2444,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2501,7 +2468,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2526,7 +2492,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2551,7 +2516,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2576,7 +2540,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2601,7 +2564,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2626,7 +2588,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
@@ -2651,7 +2612,6 @@ sequenceDiagram
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
<compression-method>BLOCK_FLOATING_POINT</compression-method>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>

View File

@@ -20,7 +20,6 @@ Beware if you previously pulled the `develop` branch that your repository may be
- [BUILD.md](./BUILD.md): how to build the sources
- [environment-variables.md](./environment-variables.md): the environment variables used by OAI
- [tuning_and_security.md](./tuning_and_security.md): performance and security considerations
- [Supported_Hardware_Operating_System.md](./Supported_Hardware_Operating_System.md): List of supported hardware and operating system for OAI
There is some general information in the [OpenAirInterface Gitlab Wiki](https://gitlab.eurecom.fr/oai/openairinterface5g/-/wikis/home)

View File

@@ -1,60 +0,0 @@
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
# Support Hardware and Operating System
This document contains the list of CPUs, RAM, NICs, accelerators and operating
systems which are used for testing in the OAI lab.
The below hardware can support USRPs, 7.2 FR1 or FR2 O-RUs.
**Table of Contents**
[[_TOC_]]
## List of Tested/Supported CPUs
|Hardware |Remark for performance testing |
|------------------------------------------|-----------------------------------------|
|Intel(R) Xeon(R) Gold 6354 36-Core |With or without ACC100 |
|Intel(R) Xeon(R) Gold 6433N 32-Core |Use VRAN Boost |
|INTEL(R) XEON(R) GOLD 6542Y 24-core | |
|AMD EPYC 9374F 32-Core Processor |With or without AMD Xilinx T2 Telco Card |
|AMD EPYC 8534P 64-Core Processor |With AMD Xilinx T2 Telco Card |
|AMD EPYC 9575F 64-Core Processor |With or without AMD Xilinx T2 Telco Card |
|SuperMicro ARS-111GL-NHR, ARM Neoverse-V2 |With or without LDPC GPU offload |
|DGX Spark, GB10 Dell, HPE, Nvidia |With LPDC GPU offload |
|AMD Ryzen 9 PRO 7945 12-Core Processor | |
## List of Tested/Supported SFP NICs
|Network Interface Cards |
|---------------------------|
|Intel E810-C |
|Intel X710 |
|Intel XXV710 |
|Intel E810-XXV |
|Mellanox ConnectX-7 |
|Mellanox ConnectX-6 |
## List of Tested/Supported L1 Look-aside Accelerators for OAI physical layer
|Supported L1 Accelerators |
|---------------------------|
|Intel ACC100 |
|Intel ACC200 |
|AMD Xilinx T2 Telco Card |
## List of supported operating systems
|Operating System |
|---------------------------|
|Ubuntu 22.04/24.04/26.04 |
|Red Hat 9.X |
|Rocky 9.X |
|Fedora 43/44 |
|Debian 11/12 |
## Notes
1. We recommend DDR4 or DDR5 RAMs, though most of the new systems are coming with DDR5 RAMs
2. We recommend to use M2 NVMe SSD for storage or SSD with high IOPS

View File

@@ -10,11 +10,11 @@ This document explains the implementation of analog beamforming in OAI codebase.
Beamforming is a technique applied to antenna arrays to create a directional radiation pattern. This often consists in providing a different phase shift to each element of the array such that signals with a different angle of arrival/departure experience a change in radiation pattern because of constructive or destructive interference.
There are three main beamforming techniques: analog, digital and hybrid. The names refer to the phase shift application before or after the digital to analog conversion (or analog to digital in reception). When we speak about analog beamforming we generally refer to a technique where the phase shifts that produce the beam steering are applied by the radio unit (RU) choosing from a finite set of steering directions. The advantage of analog beamforming is a simplified analog circuitry and therefore reduced costs.
There are three main beamforming techinques: analog, digital and hybrid. The names refer to the phase shift application before or after the digital to analog conversion (or analog to digital in reception). When we speak about analog beamforming we generally refer to a techinique where the phase shifts that produce the beam stearing are applied by the radio unit (RU) choosing from a finite set of steering directions. The advantage of analog beamforming is a simplified analog circuitry and therefore reduced costs.
The presence of a limited number of predefined beams at RU poses constraints to the scheduler at gNB. As a matter of fact, the scheduler can serve only a limited number of beams, depending on the RU characteristics (possibly only 1), in a given time scale, that also depends on the RU characteristics (e.g. 1 slot or 1 symbol). This limitation doesn't exist for digital beamforming.
Analog beamforming implementation also allows to enable distributed antenna systems (DAS), where each beam corresponds to one antenna (or a set of antennas) of the system. In this scenario, the scheduler constraint is alleviated because normally the number of concurrent beams allowed equals the total number of beams.
Analog beamforming implementation also allows to enable distributed antenna systems (DAS), where each beam corrisponds to one antenna (or a set of antennas) of the system. In this scenario, the scheduler constaint is alleviated because normally the number of concurrent beams allowed equals the total number of beams.
## Configuration file fields for analog beamforming
@@ -55,17 +55,19 @@ This definition of beam-ID is present only in the most recent versions of SCF PH
In addition to that, a `config_request` structure defined as vendor extension (`nfapi_nr_analog_beamforming_ve_t`) configures the lower layers at initialization with the following information:
- `analog_bf_vendor_ext` which can assume values 1 or 0 for enabling or disabling analog beamforming
- `num_beams_period_vendor_ext` which corresponds to the configuration parameter `beams_per_period`
Therefore, in case of analog beamforming, L2 provides in each channel FAPI message information about the beam index via the beam-ID parameter with MSB set to 1.
## L1 implementation
The total number of logical antenna ports available at L1 is same as `pusch_AntennaPorts * beams_per_period` in UL and `pdsch_AntennaPorts_N1 * pdsch_AntennaPorts_N2 * pdsch_AntennaPorts_XP * beams_per_period` in DL.
To handle multiple concurrent beams, L2 uses spatial stream indices specified by FAPI to signal L1 on which logical ports to use for a DL or UL signal. The config file parameter `spatial_stream_index` can be used to specify an array of logical port indices to be used. If this parameter is not provided then the indices defaults to `[0 ... pusch_AntennaPorts - 1]`. This parameter is particularly useful when a specific subset of eAxCID has to be used.
To handle multiple concurrent beams, the buffers containing Tx and Rx data in frequency domain (`txdataF` and `rxdataF`) have been extended by one dimension to contain multiple concurrent beams to be transmitted/received.
The function `beam_index_allocation`, called by every L1 channel, is responsible to match the FAPI analog beam index to the RU beam index and to store the latter `beam_id` structure, which allocates the beams per symbol, despite L2 only supporting beam change at slot level. At the same time, the function returns the concurrent beam index, to be used to store data in frequency domain buffers. While doing so, the function also checks if there is room for current beam in the list of concurrent beams, which should always be the case, if L2 properly allocated the channels.
In case of DAS, since each beam corresponds to a specific antenna port, the `beam_index_allocation` function is simplified in the sense that the beam index corresponds to the antenna port index of the frequency domain buffers.
## RU implementation
The implementation is still work in progress.
The first dimension of the Tx and Rx buffers contains the number of Tx/Rx antennas which is at least the number of logical antenna ports.
The first dimension of the Tx and Rx buffers that used to contain the number of Tx/Rx antennas, it is now extended to contain the number of parallel streams which is the number of antennas multiplied by the number of concurrent beams.

Some files were not shown because too many files have changed in this diff Show More