Commit 84611333 authored by Robert Schmidt's avatar Robert Schmidt

Merge branch 'integration_2022_wk40' into 'develop'

integration_2022_wk40

See merge request oai/openairinterface5g!1740

MR !1597 Multiple DRB Support
MR !1607 SRS feedback for 1 layer
MR !1644 Add Positioning Reference Signal (PRS) to gNB and nrUE
MR !1665 CI fix for UE ID
MR !1700 fix for DCI bundle size in NR gNB
MR !1701 Change LDPC decoder rate based on round/rv
MR !1712 Ue remove PUCCH global vars
MR !1713 NR improvements for SIB1 detection and RA procedures
MR !1728 Ue remove thread id
MR !1732 CI september cleanup
MR !1737 Changed gnu99 to gnu11 flag
MR !1636 SIMDE
parents a1de5e3d 755fcbbf
...@@ -178,7 +178,6 @@ if (CUDA_FOUND) ...@@ -178,7 +178,6 @@ if (CUDA_FOUND)
# Disable warnings for CUDA # Disable warnings for CUDA
SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-lpthread;-w;-O3;--default-stream;per-thread;-I/usr/local/cuda/inc;-L/usr/local/cuda/lib -lcutil;-rdc=true;-lcudadevrt") SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-lpthread;-w;-O3;--default-stream;per-thread;-I/usr/local/cuda/inc;-L/usr/local/cuda/lib -lcutil;-rdc=true;-lcudadevrt")
SET(CUDA_VERBOSE_BUILD ON) SET(CUDA_VERBOSE_BUILD ON)
SET(CUDA_HOST_COMPILER "/usr/bin/g++")
SET(CUDA_SEPARABLE_COMPILATION ON) SET(CUDA_SEPARABLE_COMPILATION ON)
...@@ -198,44 +197,36 @@ message("CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}") ...@@ -198,44 +197,36 @@ message("CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")
add_list_string_option(CMAKE_BUILD_TYPE "RelWithDebInfo" "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." Debug Release RelWithDebInfo MinSizeRel) add_list_string_option(CMAKE_BUILD_TYPE "RelWithDebInfo" "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." Debug Release RelWithDebInfo MinSizeRel)
Message("Architecture is ${CMAKE_SYSTEM_PROCESSOR}") Message("Architecture is ${CMAKE_SYSTEM_PROCESSOR}")
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") # in case /proc/cpuinfo exists we want to inspect available Intrinsics
set(C_FLAGS_PROCESSOR "-gdwarf-2 -mfloat-abi=hard -mfpu=neon -lgcc -lrt") # -so not to go always through SIMDE emulation
else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") # -so to avoid AVX512 instructions generation by gcc
if(EXISTS "/proc/cpuinfo") if(EXISTS "/proc/cpuinfo")
file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1) file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1)
message("NOAVX512 is ${NOAVX512}") message("AVX512 is ${AVX512}")
if (CPUINFO MATCHES "avx512bw" AND "${NOAVX512}" STREQUAL "False") message("AVX2 is ${AVX2}")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512 " ) if ("${AVX512}" STREQUAL "False")
set(COMPILATION_AVX2 "True") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mno-avx512f -march=native -DSIMDE_X86_AVX2_NATIVE -DSIMDE_X86_AVX2_NATIVE -DSIMDE_X86_AVX512BW_NATIVE -DSIMDE_X86_AVX512F_NATIVE -DSIMDE_X86_AVX512VL_NATIVE -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_F16C_NATIVE -DSIMDE_X86_FMA_NATIVE -DSIMDE_X86_GFNI_NATIVE -DSIMDE_X86_MMX_NATIVE -DSIMDE_X86_PCLMUL_NATIVE -DSIMDE_X86_SSE2_NATIVE -DSIMDE_X86_SSE3_NATIVE -DSIMDE_X86_SSE4_1_NATIVE -DSIMDE_X86_SSE4_2_NATIVE -DSIMDE_X86_SSE_NATIVE -DSIMDE_X86_SSSE3_NATIVE -DSIMDE_X86_VPCLMULQDQ_NATIVE -DSIMDE_X86_XOP_HAVE_COM_ -DSIMDE_X86_XOP_NATIVE")
else() else()
if (CPUINFO MATCHES "avx2") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") endif()
set(COMPILATION_AVX2 "True") if (CPUINFO MATCHES "avx2" AND "${AVX2}" STREQUAL "True")
else() set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX2_NATIVE -DSIMDE_X86_VPCLMULQDQ_NATIVE")
set(COMPILATION_AVX2 "False") endif()
endif() if (CPUINFO MATCHES "sse4_1")
if (CPUINFO MATCHES "sse4_1") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSE4_1_NATIVE")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mpclmul") endif()
endif() if (CPUINFO MATCHES "sse4_2")
if (CPUINFO MATCHES "ssse3") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSE4_2_NATIVE")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3") endif()
endif() if (CPUINFO MATCHES "ssse3")
endif() set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSSE3_NATIVE")
else() endif()
Message("/proc/cpuinfo does not exit. We will use manual CPU flags")
endif()
endif() endif()
set(C_FLAGS_PROCESSOR " ${C_FLAGS_PROCESSOR} ${CFLAGS_PROCESSOR_USER}") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -fno-var-tracking-assignments -march=native")
Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}") Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}")
#if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
# if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) )
# Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1 -mavx2\" ")
# endif()
#endif()
# #
# add autotools definitions that were maybe used! # add autotools definitions that were maybe used!
...@@ -244,7 +235,7 @@ add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAV ...@@ -244,7 +235,7 @@ add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAV
set(commonOpts "-pipe -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic") set(commonOpts "-pipe -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic")
set(CMAKE_C_FLAGS set(CMAKE_C_FLAGS
"${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} ${commonOpts} -std=gnu99 -funroll-loops") "${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} ${commonOpts} -std=gnu11 -funroll-loops")
set(CMAKE_CXX_FLAGS set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} ${commonOpts} -std=c++11") "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} ${commonOpts} -std=c++11")
...@@ -713,6 +704,32 @@ file(GLOB F1AP_C_FILES ${F1AP_DIR}/*.c) ...@@ -713,6 +704,32 @@ file(GLOB F1AP_C_FILES ${F1AP_DIR}/*.c)
add_library(F1AP ${F1AP_C_FILES} ) add_library(F1AP ${F1AP_C_FILES} )
# LPP
##############
set(LPP_DIR ${OPENAIR3_DIR}/LPP)
set(LPP_ASN_DIR ${LPP_DIR}/MESSAGES)
set(LPP_ASN_FILES
${LPP_ASN_DIR}/37355-g60.asn
)
set(LPP_ASN_GENERATED_C_DIR ${asn1_generated_dir}/LPP)
set(lpp_cmd ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "LPP_" "-findirect-choice -fno-include-deps" "${LPP_ASN_GENERATED_C_DIR}")
compile_asn1("${LPP_ASN_FILES}" "${lpp_cmd}" lpp_flag)
file(GLOB LPP_ASN_GENERATED_C_FILES ${LPP_ASN_GENERATED_C_DIR}/*.c)
add_library(LPP_LIB
${LPP_ASN_GENERATED_C_FILES}
)
add_dependencies (LPP_LIB lpp_flag)
include_directories ("${LPP_ASN_GENERATED_C_DIR}")
include_directories ("${LPP_DIR}")
#file(GLOB LPP_C_FILES ${LPP_DIR}/*.c)
#add_library(LPP ${LPP_C_FILES} )
# Hardware dependant options # Hardware dependant options
################################### ###################################
add_list1_option(NB_ANTENNAS_RX "4" "Number of antennas in reception" "1" "2" "4") add_list1_option(NB_ANTENNAS_RX "4" "Number of antennas in reception" "1" "2" "4")
...@@ -855,9 +872,6 @@ endif () ...@@ -855,9 +872,6 @@ endif ()
include_directories ("${OPENAIR_DIR}/sdr/COMMON") include_directories ("${OPENAIR_DIR}/sdr/COMMON")
Message("DEADLINE_SCHEDULER flag is ${DEADLINE_SCHEDULER}")
Message("CPU_Affinity flag is ${CPU_AFFINITY}")
############################################################## ##############################################################
# ???!!! TO BE DOCUMENTED OPTIONS !!!??? # ???!!! TO BE DOCUMENTED OPTIONS !!!???
############################################################## ##############################################################
...@@ -1610,6 +1624,7 @@ set(PHY_SRC_UE ...@@ -1610,6 +1624,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/INIT/nr_init.c ${OPENAIR1_DIR}/PHY/INIT/nr_init.c
${OPENAIR1_DIR}/PHY/INIT/nr_parms.c ${OPENAIR1_DIR}/PHY/INIT/nr_parms.c
${OPENAIR1_DIR}/PHY/MODULATION/nr_modulation.c ${OPENAIR1_DIR}/PHY/MODULATION/nr_modulation.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prs.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pss.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pss.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sss.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sss.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pbch.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pbch.c
...@@ -1711,14 +1726,8 @@ if (${SMBV}) ...@@ -1711,14 +1726,8 @@ if (${SMBV})
set(PHY_SRC "${PHY_SRC} ${OPENAIR1_DIR}/PHY/TOOLS/smbv.c") set(PHY_SRC "${PHY_SRC} ${OPENAIR1_DIR}/PHY/TOOLS/smbv.c")
endif (${SMBV}) endif (${SMBV})
if (${COMPILATION_AVX2} STREQUAL "True") set(PHY_SRC_UE ${PHY_SRC_UE} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
#set(PHY_SRC ${PHY_SRC} ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.c) set(PHY_NR_UE_SRC ${PHY_NR_UE_SRC} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
set(PHY_SRC_UE ${PHY_SRC_UE} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
endif ()
if (${COMPILATION_AVX2} STREQUAL "True")
set(PHY_NR_UE_SRC ${PHY_NR_UE_SRC} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
endif ()
add_library(PHY_COMMON ${PHY_SRC_COMMON}) add_library(PHY_COMMON ${PHY_SRC_COMMON})
add_dependencies(PHY_COMMON rrc_flag) add_dependencies(PHY_COMMON rrc_flag)
...@@ -1906,6 +1915,7 @@ set(L2_NR_SRC ...@@ -1906,6 +1915,7 @@ set(L2_NR_SRC
${NR_RRC_DIR}/rrc_gNB_reconfig.c ${NR_RRC_DIR}/rrc_gNB_reconfig.c
${NR_RRC_DIR}/rrc_gNB_UE_context.c ${NR_RRC_DIR}/rrc_gNB_UE_context.c
${NR_RRC_DIR}/rrc_gNB_NGAP.c ${NR_RRC_DIR}/rrc_gNB_NGAP.c
${NR_RRC_DIR}/rrc_gNB_radio_bearers.c
) )
set(L2_SRC_UE set(L2_SRC_UE
...@@ -2829,16 +2839,14 @@ add_executable(nr-uesoftmodem ...@@ -2829,16 +2839,14 @@ add_executable(nr-uesoftmodem
target_link_libraries (nr-uesoftmodem target_link_libraries (nr-uesoftmodem
-Wl,--start-group -Wl,--start-group
RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB NR_RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_RU_LIB SCHED_NR_UE_LIB
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB PHY_COMMON PHY_NR_COMMON PHY_NR_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
NFAPI_USER_LIB MISC_NFAPI_NR_LIB S1AP_LIB S1AP_ENB NFAPI_USER_LIB MISC_NFAPI_NR_LIB
${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ATLAS_LIBRARIES} ${RAL_LIB} ITTI ${ATLAS_LIBRARIES} LIB_5GNAS_GNB LIB_NAS_SIMUE ${NAS_SIM_LIB}
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ATLAS_LIBRARIES} LIB_5GNAS_GNB LIB_NAS_SIMUE ${NAS_SIM_LIB}
-Wl,--end-group z dl) -Wl,--end-group z dl)
target_link_libraries (nr-uesoftmodem ${LIBXML2_LIBRARIES}) target_link_libraries (nr-uesoftmodem ${LIBXML2_LIBRARIES})
target_link_libraries (nr-uesoftmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) target_link_libraries (nr-uesoftmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${XFORMS_LIBRARIES} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
target_link_libraries (nr-uesoftmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (nr-uesoftmodem ${LIB_LMS_LIBRARIES})
target_link_libraries (nr-uesoftmodem ${T_LIB}) target_link_libraries (nr-uesoftmodem ${T_LIB})
...@@ -3126,7 +3134,7 @@ function(make_driver name dir) ...@@ -3126,7 +3134,7 @@ function(make_driver name dir)
endforeach() endforeach()
CONFIGURE_FILE(${OPENAIR_CMAKE}/tools/Kbuild.cmake ${OPENAIR_BIN_DIR}/${name}/Kbuild) CONFIGURE_FILE(${OPENAIR_CMAKE}/tools/Kbuild.cmake ${OPENAIR_BIN_DIR}/${name}/Kbuild)
add_custom_command(OUTPUT ${name}.ko add_custom_command(OUTPUT ${name}.ko
COMMAND make -j2 -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name} COMMAND make -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name}
WORKING_DIRECTORY ${OPENAIR_BIN_DIR}/${name} WORKING_DIRECTORY ${OPENAIR_BIN_DIR}/${name}
COMMENT "building ${module}.ko" COMMENT "building ${module}.ko"
VERBATIM VERBATIM
......
...@@ -24,8 +24,9 @@ ...@@ -24,8 +24,9 @@
def nodeExecutor = params.nodeExecutor def nodeExecutor = params.nodeExecutor
// Tags to shorten pipeline duration // Tags to shorten pipeline duration
def doMandatoryTests = false def doBuild = true
def doFullTestsuite = false def do4Gtest = false
def do5Gtest = false
// //
def gitCommitAuthorEmailAddr def gitCommitAuthorEmailAddr
...@@ -56,26 +57,30 @@ pipeline { ...@@ -56,26 +57,30 @@ pipeline {
LABEL_CHECK = sh returnStdout: true, script: 'ci-scripts/checkGitLabMergeRequestLabels.sh --mr-id ' + env.gitlabMergeRequestIid LABEL_CHECK = sh returnStdout: true, script: 'ci-scripts/checkGitLabMergeRequestLabels.sh --mr-id ' + env.gitlabMergeRequestIid
LABEL_CHECK = LABEL_CHECK.trim() LABEL_CHECK = LABEL_CHECK.trim()
if (LABEL_CHECK == 'NONE') { if (LABEL_CHECK == 'NONE') {
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Your merge request has none of the mandatory labels:\n\n" def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Your merge request should have one of the mandatory labels:\n\n"
message += " - BUILD-ONLY\n" message += " - ~documentation (don't perform any stages)\n"
message += " - 4G-LTE\n" message += " - ~BUILD-ONLY (execute only build stages)\n"
message += " - 5G-NR\n" message += " - ~4G-LTE (perform 4G tests)\n"
message += " - CI\n\n" message += " - ~5G-NR (perform 5G tests)\n"
message += " - ~CI (perform both 4G and 5G tests)\n\n"
message += "Not performing CI due to lack of labels" message += "Not performing CI due to lack of labels"
addGitLabMRComment comment: message addGitLabMRComment comment: message
error('Not performing CI due to lack of labels') error('Not performing CI due to lack of labels')
} else if (LABEL_CHECK == 'FULL') { } else if (LABEL_CHECK == 'FULL') {
doMandatoryTests = true do4Gtest = true
doFullTestsuite = true do5Gtest = true
} else if (LABEL_CHECK == "SHORTEN-4G") {
do4Gtest = true
} else if (LABEL_CHECK == 'SHORTEN-5G') { } else if (LABEL_CHECK == 'SHORTEN-5G') {
doMandatoryTests = true do5Gtest = true
} else if (LABEL_CHECK == 'documentation') {
doBuild = false
} else { } else {
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): We will perform only build stages on your Merge Request" // is "BUILD-ONLY", will only build
addGitLabMRComment comment: message
} }
} else { } else {
doMandatoryTests = true do4Gtest = true
doFullTestsuite = true do5Gtest = true
} }
} }
} }
...@@ -116,11 +121,12 @@ pipeline { ...@@ -116,11 +121,12 @@ pipeline {
// Build Stages are Mandatory // Build Stages are Mandatory
// Later we will add a Ubuntu20 build // Later we will add a Ubuntu20 build
stage ("Image Building Processes") { stage ("Image Building Processes") {
when { expression {doBuild} }
parallel { parallel {
stage ("Ubuntu18 Build") { stage ("Ubuntu18-Image-Builder") {
steps { steps {
script { script {
triggerSlaveJob ('RAN-Ubuntu18-Image-Builder', 'Ubuntu18-Images-Build') triggerSlaveJob ('RAN-Ubuntu18-Image-Builder', 'Ubuntu18-Image-Builder')
} }
} }
post { post {
...@@ -155,10 +161,10 @@ pipeline { ...@@ -155,10 +161,10 @@ pipeline {
} }
} }
} }
stage ("CppCheck Analysis") { stage ("cppcheck") {
steps { steps {
script { script {
triggerSlaveJob ('RAN-cppcheck', 'CppCheck Analysis') triggerSlaveJob ('RAN-cppcheck', 'cppcheck')
} }
} }
post { post {
...@@ -177,12 +183,13 @@ pipeline { ...@@ -177,12 +183,13 @@ pipeline {
} }
} }
stage ("Image Test Processes") { stage ("Image Test Processes") {
when { expression {doBuild} }
parallel { parallel {
stage ("Physical Simulators") { stage ("PhySim-Cluster") {
when { expression {doMandatoryTests} } when { expression {do4Gtest || do5Gtest} }
steps { steps {
script { script {
triggerSlaveJob ('RAN-PhySim-Cluster', 'Test-Physim-Cluster') triggerSlaveJob ('RAN-PhySim-Cluster', 'PhySim-Cluster')
} }
} }
post { post {
...@@ -198,11 +205,11 @@ pipeline { ...@@ -198,11 +205,11 @@ pipeline {
} }
} }
} }
stage ("4G RF Simulators") { stage ("RF-Sim-Test-4G") {
when { expression {doMandatoryTests} } when { expression {do4Gtest} }
steps { steps {
script { script {
triggerSlaveJob ('RAN-RF-Sim-Test-4G', 'Test-RF-Sim-Container-4G') triggerSlaveJob ('RAN-RF-Sim-Test-4G', 'RF-Sim-Test-4G')
} }
} }
post { post {
...@@ -218,11 +225,11 @@ pipeline { ...@@ -218,11 +225,11 @@ pipeline {
} }
} }
} }
stage ("5G RF Simulators") { stage ("RF-Sim-Test-5G") {
when { expression {doMandatoryTests} } when { expression {do5Gtest} }
steps { steps {
script { script {
triggerSlaveJob ('RAN-RF-Sim-Test-5G', 'Test-RF-Sim-Container-5G') triggerSlaveJob ('RAN-RF-Sim-Test-5G', 'RF-Sim-Test-5G')
} }
} }
post { post {
...@@ -238,11 +245,11 @@ pipeline { ...@@ -238,11 +245,11 @@ pipeline {
} }
} }
} }
stage ("4G L2 Simulators") { stage ("L2-Sim-Test-4G") {
when { expression {doMandatoryTests} } when { expression {do4Gtest} }
steps { steps {
script { script {
triggerSlaveJob ('RAN-L2-Sim-Test-4G', 'Test-L2-Sim-Container-4G') triggerSlaveJob ('RAN-L2-Sim-Test-4G', 'L2-Sim-Test-4G')
} }
} }
post { post {
...@@ -258,11 +265,11 @@ pipeline { ...@@ -258,11 +265,11 @@ pipeline {
} }
} }
} }
stage ("5G L2 Simulators") { stage ("L2-Sim-Test-5G") {
when { expression {doMandatoryTests} } when { expression {do5Gtest} }
steps { steps {
script { script {
triggerSlaveJob ('RAN-L2-Sim-Test-5G', 'Test-L2-Sim-Container-5G') triggerSlaveJob ('RAN-L2-Sim-Test-5G', 'L2-Sim-Test-5G')
} }
} }
post { post {
...@@ -278,11 +285,11 @@ pipeline { ...@@ -278,11 +285,11 @@ pipeline {
} }
} }
} }
stage ("NSA B200 Sanity Check") { stage ("NSA-B200-Module-LTEBOX-Container") {
when { expression {doMandatoryTests} } when { expression {do4Gtest || do5Gtest} }
steps { steps {
script { script {
triggerSlaveJob ('RAN-NSA-B200-Module-LTEBOX-Container', 'Test-NSA-B200') triggerSlaveJob ('RAN-NSA-B200-Module-LTEBOX-Container', 'NSA-B200-Module-LTEBOX-Container')
} }
} }
post { post {
...@@ -298,11 +305,11 @@ pipeline { ...@@ -298,11 +305,11 @@ pipeline {
} }
} }
} }
stage ("SA B200 Sanity Check") { stage ("SA-B200-Module-SABOX-Container") {
when { expression {doMandatoryTests} } when { expression {do5Gtest} }
steps { steps {
script { script {
triggerSlaveJob ('RAN-SA-B200-Module-SABOX-Container', 'Test-SA-B200') triggerSlaveJob ('RAN-SA-B200-Module-SABOX-Container', 'SA-B200-Module-SABOX-Container')
} }
} }
post { post {
...@@ -318,17 +325,17 @@ pipeline { ...@@ -318,17 +325,17 @@ pipeline {
} }
} }
} }
stage ("Test OAI NR UE - OAI gNB - TDD - Band 78 - N300") { stage ("gNB-N300-Timing-Phytest-LDPC") {
when { expression {doMandatoryTests} } when { expression {do5Gtest} }
steps { steps {
script { script {
triggerSlaveJob ('RAN-gNB-nrUE-MONO-TDD-Band78-N300', 'Test-TDD-Band78-gNB-NR-UE') triggerSlaveJob ('RAN-gNB-N300-Timing-Phytest-LDPC', 'gNB-N300-Timing-Phytest-LDPC')
} }
} }
post { post {
always { always {
script { script {
finalizeSlaveJob('RAN-gNB-nrUE-MONO-TDD-Band78-N300') finalizeSlaveJob('RAN-gNB-N300-Timing-Phytest-LDPC')
} }
} }
failure { failure {
...@@ -339,11 +346,11 @@ pipeline { ...@@ -339,11 +346,11 @@ pipeline {
} }
} }
//avra is offline, re-enable once it is available //avra is offline, re-enable once it is available
//stage ("Test T1 Offload") { //stage ("T1-Offload-Test") {
// when { expression {doMandatoryTests} } // when { expression {do5Gtest} }
// steps { // steps {
// script { // script {
// triggerSlaveJob ('RAN-T1-Offload-Test', 'Test-T1-Offload') // triggerSlaveJob ('RAN-T1-Offload-Test', 'T1-Offload-Test')
// } // }
// } // }
// post { // post {
...@@ -361,11 +368,11 @@ pipeline { ...@@ -361,11 +368,11 @@ pipeline {
//} //}
} }
} }
stage ("Images Push to Registries") { stage ("DockerHub-Push") {
when { expression {"PUSH".equals(env.gitlabActionType)} } when { expression {doBuild && "PUSH".equals(env.gitlabActionType)} }
steps { steps {
script { script {
triggerSlaveJob ('RAN-DockerHub-Push', 'Push-to-Docker-Hub') triggerSlaveJob ('RAN-DockerHub-Push', 'DockerHub-Push')
} }
} }
post { post {
...@@ -401,7 +408,6 @@ pipeline { ...@@ -401,7 +408,6 @@ pipeline {
script { script {
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): passed (" + BUILD_URL + ")" def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): passed (" + BUILD_URL + ")"
if ("MERGE".equals(env.gitlabActionType)) { if ("MERGE".equals(env.gitlabActionType)) {
echo "This is a MERGE event"
addGitLabMRComment comment: message addGitLabMRComment comment: message
} }
echo "Pipeline is SUCCESSFUL" echo "Pipeline is SUCCESSFUL"
...@@ -411,7 +417,6 @@ pipeline { ...@@ -411,7 +417,6 @@ pipeline {
script { script {
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ")" def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ")"
if ("MERGE".equals(env.gitlabActionType)) { if ("MERGE".equals(env.gitlabActionType)) {
echo "This is a MERGE event"
addGitLabMRComment comment: message addGitLabMRComment comment: message
} }
echo "Pipeline FAILED" echo "Pipeline FAILED"
......
...@@ -33,8 +33,9 @@ def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) { ...@@ -33,8 +33,9 @@ def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) {
// Location of the executor node // Location of the executor node
def nodeExecutor = params.nodeExecutor def nodeExecutor = params.nodeExecutor
// VM Lockable resources def lockResources = []
def vmResource = params.vmLockableResource if (params.LockResources != null && params.LockResources.trim().length() > 0)
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
// Tags to shorten pipeline duration // Tags to shorten pipeline duration
def doMandatoryTests = false def doMandatoryTests = false
...@@ -81,7 +82,7 @@ pipeline { ...@@ -81,7 +82,7 @@ pipeline {
message += "Not performing CI due to lack of labels" message += "Not performing CI due to lack of labels"
addGitLabMRComment comment: message addGitLabMRComment comment: message
error('Not performing CI due to lack of labels') error('Not performing CI due to lack of labels')
} else if (LABEL_CHECK == 'FULL') { } else if (LABEL_CHECK == 'FULL' || LABEL_CHECK == 'SHORTEN-4G') {
doMandatoryTests = true doMandatoryTests = true
doFullTestsuite = true doFullTestsuite = true
} else if (LABEL_CHECK == 'SHORTEN-5G') { } else if (LABEL_CHECK == 'SHORTEN-5G') {
...@@ -138,7 +139,7 @@ pipeline { ...@@ -138,7 +139,7 @@ pipeline {
stage ("Start VM -- gnb-usrp") { stage ("Start VM -- gnb-usrp") {
steps { steps {
lock (vmResource) { lock (extra: lockResources) {
timeout (time: 5, unit: 'MINUTES') { timeout (time: 5, unit: 'MINUTES') {
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant gnb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon" sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant gnb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
} }
...@@ -148,7 +149,7 @@ pipeline { ...@@ -148,7 +149,7 @@ pipeline {
stage ("Start VM -- nr-ue-usrp") { stage ("Start VM -- nr-ue-usrp") {
steps { steps {
lock (vmResource) { lock (extra: lockResources) {
timeout (time: 5, unit: 'MINUTES') { timeout (time: 5, unit: 'MINUTES') {
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant nr-ue-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon" sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant nr-ue-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
} }
...@@ -158,7 +159,7 @@ pipeline { ...@@ -158,7 +159,7 @@ pipeline {
stage ("Start VM -- enb-ethernet") { stage ("Start VM -- enb-ethernet") {
steps { steps {
lock (vmResource) { lock (extra: lockResources) {
timeout (time: 7, unit: 'MINUTES') { timeout (time: 7, unit: 'MINUTES') {
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon" sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
} }
...@@ -168,7 +169,7 @@ pipeline { ...@@ -168,7 +169,7 @@ pipeline {
stage ("Start VM -- ue-ethernet") { stage ("Start VM -- ue-ethernet") {
steps { steps {
lock (vmResource) { lock (extra: lockResources) {
timeout (time: 7, unit: 'MINUTES') { timeout (time: 7, unit: 'MINUTES') {
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon" sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
} }
...@@ -208,7 +209,7 @@ pipeline { ...@@ -208,7 +209,7 @@ pipeline {
stage ("Build UE-ethernet") { stage ("Build UE-ethernet") {
steps { steps {
// This is typically the last one to finish. // This is typically the last one to finish.
lock (vmResource) { lock (extra: lockResources) {
gitlabCommitStatus(name: "Build UE-ethernet") { gitlabCommitStatus(name: "Build UE-ethernet") {
timeout (time: 45, unit: 'MINUTES') { timeout (time: 45, unit: 'MINUTES') {
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
...@@ -269,7 +270,7 @@ pipeline { ...@@ -269,7 +270,7 @@ pipeline {
expression {doMandatoryTests} expression {doMandatoryTests}
} }
steps { steps {
lock (vmResource) { lock (extra: lockResources) {
script { script {
timeout (time: 30, unit: 'MINUTES') { timeout (time: 30, unit: 'MINUTES') {
try { try {
...@@ -289,7 +290,7 @@ pipeline { ...@@ -289,7 +290,7 @@ pipeline {
expression {doMandatoryTests} expression {doMandatoryTests}
} }
steps { steps {
lock (vmResource) { lock (extra: lockResources) {
script { script {
timeout (time: 40, unit: 'MINUTES') { timeout (time: 40, unit: 'MINUTES') {
try { try {
...@@ -309,7 +310,7 @@ pipeline { ...@@ -309,7 +310,7 @@ pipeline {
expression {doMandatoryTests} expression {doMandatoryTests}
} }
steps { steps {
lock (vmResource) { lock (extra: lockResources) {
script { script {
timeout (time: 40, unit: 'MINUTES') { timeout (time: 40, unit: 'MINUTES') {
try { try {
...@@ -329,7 +330,7 @@ pipeline { ...@@ -329,7 +330,7 @@ pipeline {
expression {doMandatoryTests} expression {doMandatoryTests}
} }
steps { steps {
lock (vmResource) { lock (extra: lockResources) {
sh "./ci-scripts/oai-ci-vm-tool destroy --job-name ${JOB_NAME} --build-id ${BUILD_ID}" sh "./ci-scripts/oai-ci-vm-tool destroy --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
} }
} }
......
This diff is collapsed.
...@@ -32,7 +32,9 @@ def buildStageStatus = true ...@@ -32,7 +32,9 @@ def buildStageStatus = true
def testStageName = params.pipelineTestStageName def testStageName = params.pipelineTestStageName
// Name of the resource // Name of the resource
def ciEpcResource = params.epcResource 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 // Global Parameters. Normally they should be populated when the master job
// triggers the slave job with parameters // triggers the slave job with parameters
...@@ -56,7 +58,7 @@ pipeline { ...@@ -56,7 +58,7 @@ pipeline {
disableConcurrentBuilds() disableConcurrentBuilds()
timestamps() timestamps()
ansiColor('xterm') ansiColor('xterm')
lock(ciEpcResource) lock(lockResources)
} }
stages { stages {
...@@ -80,7 +82,8 @@ pipeline { ...@@ -80,7 +82,8 @@ pipeline {
testStageName = 'Template Test Stage' testStageName = 'Template Test Stage'
} }
if (params.smartphonesResource == null) { if (params.LockResources == null) {
echo "no LockResources given"
allParametersPresent = false allParametersPresent = false
} }
if (params.eNB_IPAddress == null) { if (params.eNB_IPAddress == null) {
......
This diff is collapsed.
...@@ -23,8 +23,10 @@ ...@@ -23,8 +23,10 @@
// Location of the python executor node shall be in the same subnet as the others servers // Location of the python executor node shall be in the same subnet as the others servers
def nodeExecutor = params.nodeExecutor def nodeExecutor = params.nodeExecutor
// Name of the phone resource // Name of the resource
def ciServerResource = params.serverResource def lockResources = []
if (params.LockResources != null && params.LockResources.trim().length() > 0)
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
// Docker Hub account to push to // Docker Hub account to push to
def DH_Account = "oaisoftwarealliance" def DH_Account = "oaisoftwarealliance"
...@@ -36,7 +38,7 @@ pipeline { ...@@ -36,7 +38,7 @@ pipeline {
options { options {
disableConcurrentBuilds() disableConcurrentBuilds()
ansiColor('xterm') ansiColor('xterm')
lock (ciServerResource) lock(extra: lockResources)
} }
stages { stages {
stage ("Verify Parameters") { stage ("Verify Parameters") {
...@@ -49,7 +51,8 @@ pipeline { ...@@ -49,7 +51,8 @@ pipeline {
if (params.nodeExecutor != null) { if (params.nodeExecutor != null) {
echo "Docker Push executor node : ${nodeExecutor}" echo "Docker Push executor node : ${nodeExecutor}"
} }
if (params.serverResource == null) { if (params.LockResources == null) {
echo "no LockResources given"
allParametersPresent = false allParametersPresent = false
} }
} }
......
...@@ -33,11 +33,9 @@ def buildStageStatus = true ...@@ -33,11 +33,9 @@ def buildStageStatus = true
// Name of the test stage // Name of the test stage
def testStageName = params.pipelineTestStageName def testStageName = params.pipelineTestStageName
// Name of the phone resource def lockResources = []
def ciSmartPhoneResource = params.smartphonesResource if (params.LockResources != null && params.LockResources.trim().length() > 0)
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
// Name of the phone resource
def oaiUEResource = params.oaiUEResource
// Terminate Status // Terminate Status
def termENB = 0 def termENB = 0
...@@ -65,7 +63,7 @@ pipeline { ...@@ -65,7 +63,7 @@ pipeline {
options { options {
disableConcurrentBuilds() disableConcurrentBuilds()
ansiColor('xterm') ansiColor('xterm')
lock(extra: [[resource: oaiUEResource]], resource: ciSmartPhoneResource) lock(extra: lockResources)
} }
stages { stages {
...@@ -85,11 +83,9 @@ pipeline { ...@@ -85,11 +83,9 @@ pipeline {
testStageName = 'Template Test Stage' testStageName = 'Template Test Stage'
} }
if (params.smartphonesResource == null) { if (params.LockResources == null) {
allParametersPresent = false echo "no LockResources given"
} allParametersPresent = false
if (params.oaiUEResource == null) {
allParametersPresent = false
} }
if (params.eNB_IPAddress == null) { if (params.eNB_IPAddress == null) {
allParametersPresent = false allParametersPresent = false
......
...@@ -33,11 +33,9 @@ def buildStageStatus = true ...@@ -33,11 +33,9 @@ def buildStageStatus = true
// Name of the test stage // Name of the test stage
def testStageName = params.pipelineTestStageName def testStageName = params.pipelineTestStageName
// Name of the phone resource def lockResources = []
def ciSmartPhoneResource = params.smartphonesResource if (params.LockResources != null && params.LockResources.trim().length() > 0)
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
// Name of the phone resource
def ciEpcResource = params.epcResource
// Global Parameters. Normally they should be populated when the master job // Global Parameters. Normally they should be populated when the master job
// triggers the slave job with parameters // triggers the slave job with parameters
...@@ -54,7 +52,7 @@ pipeline { ...@@ -54,7 +52,7 @@ pipeline {
options { options {
disableConcurrentBuilds() disableConcurrentBuilds()
ansiColor('xterm') ansiColor('xterm')
lock(extra: [[resource: ciEpcResource]], resource: ciSmartPhoneResource) lock(extra: lockResources)
} }
stages { stages {
stage ("Verify Parameters") { stage ("Verify Parameters") {
...@@ -73,8 +71,9 @@ pipeline { ...@@ -73,8 +71,9 @@ pipeline {
testStageName = 'Template Test Stage' testStageName = 'Template Test Stage'
} }
if (params.smartphonesResource == null) { if (params.LockResources == null) {
allParametersPresent = false echo "no LockResources given"
allParametersPresent = false
} }
// 1st eNB parameters // 1st eNB parameters
if (params.eNB_IPAddress == null) { if (params.eNB_IPAddress == null) {
......
This diff is collapsed.
This diff is collapsed.
...@@ -34,10 +34,9 @@ def buildStageStatus = true ...@@ -34,10 +34,9 @@ def buildStageStatus = true
// Name of the test stage // Name of the test stage
def testStageName = params.pipelineTestStageName def testStageName = params.pipelineTestStageName
// Name of the phone/server resource def lockResources = []
def ciSmartPhonesResource1 = params.SmartPhonesResource1 if (params.LockResources != null && params.LockResources.trim().length() > 0)
def ciSmartPhonesResource2 = params.SmartPhonesResource2 params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
def ciSmartPhonesResource3 = params.SmartPhonesResource3
// Global Parameters. Normally they should be populated when the master job // Global Parameters. Normally they should be populated when the master job
// triggers the slave job with parameters // triggers the slave job with parameters
...@@ -56,7 +55,7 @@ pipeline { ...@@ -56,7 +55,7 @@ pipeline {
options { options {
disableConcurrentBuilds() disableConcurrentBuilds()
ansiColor('xterm') ansiColor('xterm')
lock(extra: [[resource: ciSmartPhonesResource2],[resource: ciSmartPhonesResource1]],resource: ciSmartPhonesResource3) lock(extra: lockResources)
} }
stages { stages {
stage("Build Init") { stage("Build Init") {
...@@ -82,15 +81,10 @@ pipeline { ...@@ -82,15 +81,10 @@ pipeline {
testStageName = 'Template Test Stage' testStageName = 'Template Test Stage'
} }
if (params.SmartPhonesResource1 == null) { if (params.LockResources == null) {
echo "no LockResources given"
allParametersPresent = false allParametersPresent = false
} }
if (params.SmartPhonesResource2 == null) {
allParametersPresent = false
}
if (params.SmartPhonesResource3 == null) {
allParametersPresent = false
}
// 1st eNB parameters // 1st eNB parameters
if (params.eNB_IPAddress == null) { if (params.eNB_IPAddress == null) {
allParametersPresent = false allParametersPresent = false
......
...@@ -33,11 +33,9 @@ def buildStageStatus = true ...@@ -33,11 +33,9 @@ def buildStageStatus = true
// Name of the test stage // Name of the test stage
def testStageName = params.pipelineTestStageName def testStageName = params.pipelineTestStageName
// Name of the phone resource def lockResources = []
def ciSmartPhoneResource = params.smartphonesResource if (params.LockResources != null && params.LockResources.trim().length() > 0)
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
// Name of the phone resource
def ciEpcResource = params.epcResource
// Terminate Status // Terminate Status
def termUE = 0 def termUE = 0
...@@ -67,7 +65,7 @@ pipeline { ...@@ -67,7 +65,7 @@ pipeline {
options { options {
disableConcurrentBuilds() disableConcurrentBuilds()
ansiColor('xterm') ansiColor('xterm')
lock(extra: [[resource: ciEpcResource]], resource: ciSmartPhoneResource) lock(extra: lockResources)
} }
// the following parameter options are commented out so it shows the ones // the following parameter options are commented out so it shows the ones
// that you SHALL have to run the job. // that you SHALL have to run the job.
...@@ -79,7 +77,7 @@ pipeline { ...@@ -79,7 +77,7 @@ pipeline {
string(name: 'pythonTestXmlFile', defaultValue: 'enb_usrpB210_band7_50PRB.xml', description: 'Location of the Test XML to be run') string(name: 'pythonTestXmlFile', defaultValue: 'enb_usrpB210_band7_50PRB.xml', description: 'Location of the Test XML to be run')
string(name: 'pipelineTestStageName', defaultValue: 'Test COTS-UE - OAI eNB - LTEBOX EPC', description: 'Naming of the Test Stage') string(name: 'pipelineTestStageName', defaultValue: 'Test COTS-UE - OAI eNB - LTEBOX EPC', description: 'Naming of the Test Stage')
booleanParam(name: 'pipelineZipsConsoleLog', defaultValue: 'True', description: 'If true, the pipeline script retrieves the job console log, zips it and archives it as artifact') booleanParam(name: 'pipelineZipsConsoleLog', defaultValue: 'True', description: 'If true, the pipeline script retrieves the job console log, zips it and archives it as artifact')
string(name: 'smartphonesResource', defaultValue: 'CI-Bench-1-Phones', description: 'Lockeable Resource to prevent multiple jobs to run simultaneously with the same resource') string(name: 'lockResources', defaultValue: 'CI-Bench-1-Phones', description: 'Lockeable Resource to prevent multiple jobs to run simultaneously with the same resource')
//eNB parameters //eNB parameters
string(name: 'eNB_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of eNB') string(name: 'eNB_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of eNB')
...@@ -115,8 +113,9 @@ pipeline { ...@@ -115,8 +113,9 @@ pipeline {
testStageName = 'Template Test Stage' testStageName = 'Template Test Stage'
} }
if (params.smartphonesResource == null) { if (params.LockResources == null) {
allParametersPresent = false echo "no LockResources given"
allParametersPresent = false
} }
if (params.eNB_IPAddress == null) { if (params.eNB_IPAddress == null) {
allParametersPresent = false allParametersPresent = false
......
...@@ -33,8 +33,9 @@ def buildStageStatus = true ...@@ -33,8 +33,9 @@ def buildStageStatus = true
// Name of the test stage // Name of the test stage
def testStageName = params.pipelineTestStageName def testStageName = params.pipelineTestStageName
// Name of the phone resource def lockResources = []
def ciSmartPhoneResource = params.smartphonesResource if (params.LockResources != null && params.LockResources.trim().length() > 0)
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
// Terminate Status // Terminate Status
def termUE = 0 def termUE = 0
...@@ -64,7 +65,7 @@ pipeline { ...@@ -64,7 +65,7 @@ pipeline {
options { options {
disableConcurrentBuilds() disableConcurrentBuilds()
ansiColor('xterm') ansiColor('xterm')
lock (ciSmartPhoneResource) lock(extra: lockResources)
} }
stages { stages {
stage ("Verify Parameters") { stage ("Verify Parameters") {
...@@ -83,8 +84,9 @@ pipeline { ...@@ -83,8 +84,9 @@ pipeline {
testStageName = 'Template Test Stage' testStageName = 'Template Test Stage'
} }
if (params.smartphonesResource == null) { if (params.LockResources == null) {
allParametersPresent = false echo "no LockResources given"
allParametersPresent = false
} }
if (params.UE_IPAddress == null) { if (params.UE_IPAddress == null) {
allParametersPresent = false allParametersPresent = false
......
...@@ -73,36 +73,50 @@ done ...@@ -73,36 +73,50 @@ done
LABELS=`curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/$MERGE_REQUEST_ID" | jq '.labels' || true` LABELS=`curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/$MERGE_REQUEST_ID" | jq '.labels' || true`
IS_MR_BUILD_ONLY=`echo $LABELS | grep -c BUILD-ONLY || true` IS_MR_DOCUMENTATION=`echo $LABELS | grep -ic documentation`
IS_MR_CI=`echo $LABELS | grep -c CI || true` IS_MR_BUILD_ONLY=`echo $LABELS | grep -c BUILD-ONLY`
IS_MR_4G=`echo $LABELS | grep -c 4G-LTE || true` IS_MR_CI=`echo $LABELS | grep -c CI`
IS_MR_5G=`echo $LABELS | grep -c 5G-NR || true` IS_MR_4G=`echo $LABELS | grep -c 4G-LTE`
IS_MR_5G=`echo $LABELS | grep -c 5G-NR`
# First case: none is present! No CI # none is present! No CI
if [ $IS_MR_BUILD_ONLY -eq 0 ] && [ $IS_MR_CI -eq 0 ] && [ $IS_MR_4G -eq 0 ] && [ $IS_MR_5G -eq 0 ] if [ $IS_MR_BUILD_ONLY -eq 0 ] && [ $IS_MR_CI -eq 0 ] && [ $IS_MR_4G -eq 0 ] && [ $IS_MR_5G -eq 0 ] && [ $IS_MR_DOCUMENTATION -eq 0 ]
then then
echo "NONE" echo "NONE"
exit 0 exit 0
fi fi
# Second case: Build-Only # 4G and 5G or CI labels: run everything (4G, 5G)
if [ $IS_MR_BUILD_ONLY -eq 1 ] if [ $IS_MR_4G -eq 1 ] && [ $IS_MR_5G -eq 1 ] || [ $IS_MR_CI -eq 1 ]
then then
echo "BUILD-ONLY" echo "FULL"
exit 0 exit 0
fi fi
# Third case: CI or 4G label --> Full CI run # 4G is present: run only 4G
if [ $IS_MR_4G -eq 1 ] || [ $IS_MR_CI -eq 1 ] if [ $IS_MR_4G -eq 1 ]
then then
echo "FULL" echo "SHORTEN-4G"
exit 0 exit 1
fi fi
# Fourth case: 5G label # 5G is present: run only 5G
if [ $IS_MR_BUILD_ONLY -eq 0 ] && [ $IS_MR_CI -eq 0 ] && [ $IS_MR_4G -eq 0 ] && [ $IS_MR_5G -eq 1 ] if [ $IS_MR_5G -eq 1 ]
then then
echo "SHORTEN-5G" echo "SHORTEN-5G"
exit 0 exit 0
fi fi
# BUILD-ONLY is present: only build stages
if [ $IS_MR_BUILD_ONLY -eq 1 ]
then
echo "BUILD-ONLY"
exit 0
fi
# Documentation is present: don't do anything
if [ $IS_MR_DOCUMENTATION -eq 1 ]
then
echo "documentation"
exit 1
fi
...@@ -15,7 +15,7 @@ gNBs = ...@@ -15,7 +15,7 @@ gNBs =
// Tracking area code, 0x0000 and 0xfffe are reserved values // Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1; tracking_area_code = 1;
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1 }) }); plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0x010203 }) });
nr_cellid = 12345678L nr_cellid = 12345678L
......
...@@ -13,12 +13,12 @@ Ref : ...@@ -13,12 +13,12 @@ Ref :
feptx_total : 59.0 feptx_total : 59.0
L1 Tx processing : 210.0 L1 Tx processing : 210.0
DLSCH encoding : 129.0 DLSCH encoding : 129.0
L1 Rx processing : 287.0 L1 Rx processing : 359.0
PUSCH inner-receiver : 166.0 PUSCH inner-receiver : 166.0
PUSCH decoding : 176.0 PUSCH decoding : 270.0
Schedule Response : 42.0 Schedule Response : 52.0
DL & UL scheduling timing : 13.0 DL & UL scheduling timing : 13.0
UL Indication : 55.0 UL Indication : 65.0
Threshold : Threshold :
feprx : 1.25 feprx : 1.25
feptx_prec : 1.25 feptx_prec : 1.25
......
...@@ -13,12 +13,12 @@ Ref : ...@@ -13,12 +13,12 @@ Ref :
feptx_total : 62.0 feptx_total : 62.0
L1 Tx processing : 170.0 L1 Tx processing : 170.0
DLSCH encoding : 118.0 DLSCH encoding : 118.0
L1 Rx processing : 223.0 L1 Rx processing : 275.0
PUSCH inner-receiver : 107.0 PUSCH inner-receiver : 107.0
PUSCH decoding : 170.0 PUSCH decoding : 246.0
Schedule Response : 15.0 Schedule Response : 22.0
DL & UL scheduling timing : 10.0 DL & UL scheduling timing : 10.0
UL Indication : 27.0 UL Indication : 34.0
Threshold : Threshold :
feprx : 1.25 feprx : 1.25
feptx_prec : 1.25 feptx_prec : 1.25
......
...@@ -414,10 +414,10 @@ def GetParametersFromXML(action): ...@@ -414,10 +414,10 @@ def GetParametersFromXML(action):
CONTAINERS.nb_healthy[0] = int(string_field) CONTAINERS.nb_healthy[0] = int(string_field)
string_field=test.findtext('d_retx_th') string_field=test.findtext('d_retx_th')
if (string_field is not None): if (string_field is not None):
CONTAINERS.ran_checkers['d_retx_th']= string_field CONTAINERS.ran_checkers['d_retx_th'] = [float(x) for x in string_field.split(',')]
string_field=test.findtext('u_retx_th') string_field=test.findtext('u_retx_th')
if (string_field is not None): if (string_field is not None):
CONTAINERS.ran_checkers['u_retx_th']= string_field CONTAINERS.ran_checkers['u_retx_th'] = [float(x) for x in string_field.split(',')]
elif action == 'PingFromContainer': elif action == 'PingFromContainer':
string_field = test.findtext('container_name') string_field = test.findtext('container_name')
......
...@@ -177,7 +177,7 @@ function variant__v1__enb_usrp { ...@@ -177,7 +177,7 @@ function variant__v1__enb_usrp {
function variant__v2__basic_sim { function variant__v2__basic_sim {
NB_PATTERN_FILES=11 NB_PATTERN_FILES=11
BUILD_OPTIONS="--eNB --UE" BUILD_OPTIONS="--eNB --UE --noavx512"
VM_MEMORY=8192 VM_MEMORY=8192
RUN_OPTIONS="complex" RUN_OPTIONS="complex"
} }
...@@ -201,28 +201,28 @@ function variant__v5__gnb_usrp { ...@@ -201,28 +201,28 @@ function variant__v5__gnb_usrp {
VM_MEMORY=10240 VM_MEMORY=10240
VM_CPU=8 VM_CPU=8
NB_PATTERN_FILES=6 NB_PATTERN_FILES=6
BUILD_OPTIONS="--gNB -w USRP" BUILD_OPTIONS="--gNB -w USRP --noavx512"
} }
function variant__v6__nr_ue_usrp { function variant__v6__nr_ue_usrp {
VM_MEMORY=4096 VM_MEMORY=4096
VM_CPU=4 VM_CPU=4
NB_PATTERN_FILES=6 NB_PATTERN_FILES=6
BUILD_OPTIONS="--nrUE -w USRP" BUILD_OPTIONS="--nrUE -w USRP --noavx512"
} }
function variant__v7__enb_ethernet { function variant__v7__enb_ethernet {
VM_MEMORY=4096 VM_MEMORY=4096
ARCHIVES_LOC=enb_eth ARCHIVES_LOC=enb_eth
NB_PATTERN_FILES=6 NB_PATTERN_FILES=6
BUILD_OPTIONS="--eNB -w USRP" BUILD_OPTIONS="--eNB -w USRP --noavx512"
} }
function variant__v8__ue_ethernet { function variant__v8__ue_ethernet {
VM_MEMORY=4096 VM_MEMORY=4096
ARCHIVES_LOC=ue_eth ARCHIVES_LOC=ue_eth
NB_PATTERN_FILES=10 NB_PATTERN_FILES=10
BUILD_OPTIONS="--UE -w USRP" BUILD_OPTIONS="--UE -w USRP --noavx512"
} }
function variant__v10__flexran_rtc { function variant__v10__flexran_rtc {
......
...@@ -975,29 +975,24 @@ class RANManagement(): ...@@ -975,29 +975,24 @@ class RANManagement():
if result is not None: if result is not None:
mbmsRequestMsg += 1 mbmsRequestMsg += 1
#FR1 NSA test : add new markers to make sure gNB is used #FR1 NSA test : add new markers to make sure gNB is used
result = re.search('\[gNB [0-9]+\]\[RAPROC\] PUSCH with TC_RNTI 0x[0-9a-fA-F]+ received correctly, adding UE MAC Context UE_id [0-9]+\/RNTI 0x[0-9a-fA-F]+', str(line)) result = re.search('\[gNB [0-9]+\]\[RAPROC\] PUSCH with TC_RNTI 0x[0-9a-fA-F]+ received correctly, adding UE MAC Context RNTI 0x[0-9a-fA-F]+', str(line))
if result is not None: if result is not None:
NSA_RAPROC_PUSCH_check = 1 NSA_RAPROC_PUSCH_check = 1
#dlsch and ulsch statistics
#keys below are the markers we are loooking for, loop over this keys list # Collect information on UE DLSCH and ULSCH statistics
#everytime these markers are found in the log file, the previous ones are overwritten in the dict keys = {'dlsch_rounds','dlsch_total_bytes','ulsch_rounds','ulsch_total_bytes_scheduled'}
#eventually we record and print only the last occurence
keys = {'UE ID','dlsch_rounds','dlsch_total_bytes','ulsch_rounds','ulsch_total_bytes_scheduled'}
for k in keys: for k in keys:
result = re.search(k, line) result = re.search(k, line)
if result is not None: if result is None:
ue_prefix = 'ue0' continue
ue_res = re.search('UE ID 1|UE 1:', line) result = re.search('UE (?:RNTI )?([0-9a-f]{4})', line)
if ue_res is not None: if result is None:
ue_prefix = 'ue1' logging.error(f'did not find RNTI while matching key {k}')
ue_res = re.search('UE ID 2|UE 2:', line) continue
if ue_res is not None: rnti = result.group(1)
ue_prefix = 'ue2'
ue_res = re.search('UE ID 3|UE 3:', line) #remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
if ue_res is not None: dlsch_ulsch_stats[rnti+k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
ue_prefix = 'ue3'
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
dlsch_ulsch_stats[ue_prefix+k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
result = re.search('Received NR_RRCReconfigurationComplete from UE', str(line)) result = re.search('Received NR_RRCReconfigurationComplete from UE', str(line))
if result is not None: if result is not None:
...@@ -1155,12 +1150,10 @@ class RANManagement(): ...@@ -1155,12 +1150,10 @@ class RANManagement():
#checker #checker
if (len(dlsch_ulsch_stats)!=0) and (len(checkers)!=0): if (len(dlsch_ulsch_stats)!=0) and (len(checkers)!=0):
if 'd_retx_th' in checkers: if 'd_retx_th' in checkers:
checkers['d_retx_th'] = [float(x) for x in checkers['d_retx_th'].split(',')]
dlsch_checker_status = list(0 for i in checkers['d_retx_th'])#status 0 / -1 dlsch_checker_status = list(0 for i in checkers['d_retx_th'])#status 0 / -1
d_perc_retx = list(0 for i in checkers['d_retx_th'])#results in % d_perc_retx = list(0 for i in checkers['d_retx_th'])#results in %
if 'u_retx_th' in checkers: if 'u_retx_th' in checkers:
checkers['u_retx_th'] = [float(x) for x in checkers['u_retx_th'].split(',')]
ulsch_checker_status = list(0 for i in checkers['u_retx_th']) ulsch_checker_status = list(0 for i in checkers['u_retx_th'])
u_perc_retx = list(0 for i in checkers['u_retx_th']) u_perc_retx = list(0 for i in checkers['u_retx_th'])
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
<testCase id="040000"> <testCase id="040000">
<class>Initialize_eNB</class> <class>Initialize_eNB</class>
<desc>Initialize gNB</desc> <desc>Initialize gNB</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf --sa -q --usrp-tx-thread-config 1 --T_stdout 2 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args> <Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf --sa -q --usrp-tx-thread-config 1 --T_stdout 2 --tune-offset 30000000 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
<eNB_instance>0</eNB_instance> <eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId> <eNB_serverId>0</eNB_serverId>
<air_interface>nr</air_interface> <air_interface>nr</air_interface>
......
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
<testCase id="040000"> <testCase id="040000">
<class>Initialize_eNB</class> <class>Initialize_eNB</class>
<desc>Initialize gNB</desc> <desc>Initialize gNB</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --T_stdout 2 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args> <Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --T_stdout 2 --tune-offset 30000000 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
<eNB_instance>0</eNB_instance> <eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId> <eNB_serverId>0</eNB_serverId>
<air_interface>nr</air_interface> <air_interface>nr</air_interface>
......
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
<testCase id="042000"> <testCase id="042000">
<class>Initialize_eNB</class> <class>Initialize_eNB</class>
<desc>Initialize gNB</desc> <desc>Initialize gNB</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args> <Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --tune-offset 30000000 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
<eNB_instance>0</eNB_instance> <eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId> <eNB_serverId>0</eNB_serverId>
<air_interface>nr</air_interface> <air_interface>nr</air_interface>
......
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
<testCase id="041000"> <testCase id="041000">
<class>Initialize_eNB</class> <class>Initialize_eNB</class>
<desc>Initialize gNB</desc> <desc>Initialize gNB</desc>
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args> <Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --tune-offset 30000000 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
<eNB_instance>0</eNB_instance> <eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId> <eNB_serverId>0</eNB_serverId>
<air_interface>nr</air_interface> <air_interface>nr</air_interface>
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
<mode>TesteNB</mode> <mode>TesteNB</mode>
<class>Build_eNB</class> <class>Build_eNB</class>
<desc>Build gNB (USRP)</desc> <desc>Build gNB (USRP)</desc>
<Build_eNB_args>--gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169 --noavx512</Build_eNB_args> <Build_eNB_args>--gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169 --cmake-opt -DCUDA_HOST_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/gcc -c -P</Build_eNB_args>
<forced_workspace_cleanup>True</forced_workspace_cleanup> <forced_workspace_cleanup>True</forced_workspace_cleanup>
</testCase> </testCase>
......
...@@ -55,7 +55,8 @@ BUILD_COVERITY_SCAN=0 ...@@ -55,7 +55,8 @@ BUILD_COVERITY_SCAN=0
DISABLE_HARDWARE_DEPENDENCY="False" DISABLE_HARDWARE_DEPENDENCY="False"
CMAKE_BUILD_TYPE="RelWithDebInfo" CMAKE_BUILD_TYPE="RelWithDebInfo"
CMAKE_CMD="$CMAKE" CMAKE_CMD="$CMAKE"
NOAVX512="False" AVX512="True"
AVX2="True"
BUILD_ECLIPSE=0 BUILD_ECLIPSE=0
NR="False" NR="False"
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope" OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope"
...@@ -127,11 +128,9 @@ Options: ...@@ -127,11 +128,9 @@ Options:
-x | --xforms -x | --xforms
Will compile with software oscilloscope features Will compile with software oscilloscope features
--verbose-ci --verbose-ci
Compile with verbose instructions in CI Docker env Compile with verbose instructions in CI Docker env
--verbose-compile --verbose-compile
Shows detailed compilation instructions in makefile Shows detailed compilation instructions in makefile
--cflags_processor
Manually Add CFLAGS of processor if they are not detected correctly by script. Only add these flags if you know your processor supports them. Example flags: -msse3 -msse4.1 -msse4.2 -mavx2
--build-doxygen --build-doxygen
Builds doxygen based documentation. Builds doxygen based documentation.
--build-coverity-scan --build-coverity-scan
...@@ -159,10 +158,10 @@ Options: ...@@ -159,10 +158,10 @@ Options:
Build eclipse project files. Build eclipse project files.
--build-lib <libraries> --build-lib <libraries>
Build optional shared library, <libraries> can be one or several of $OPTIONAL_LIBRARIES or \"all\" Build optional shared library, <libraries> can be one or several of $OPTIONAL_LIBRARIES or \"all\"
--usrp-recplay
Build for I/Q record-playback modes
--noavx512 --noavx512
Build without AVX512 if it is present on CPU Disable AVX512 intrinsics whatever processor capability is
--noavx2
Disable AVX2 intrinsics if processor supports it or use SIMDE emulation
-k | --skip-shared-libraries -k | --skip-shared-libraries
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
--ninja --ninja
...@@ -349,10 +348,6 @@ function main() { ...@@ -349,10 +348,6 @@ function main() {
VERBOSE_COMPILE=1 VERBOSE_COMPILE=1
echo_info "Will compile with verbose instructions" echo_info "Will compile with verbose instructions"
shift;; shift;;
--cflags_processor)
CMAKE_CMD="$CMAKE_CMD -DCFLAGS_PROCESSOR_USER=\"$2\""
echo_info "Setting CPU FLAGS from USER to: $2"
shift 2;;
--build-doxygen) --build-doxygen)
BUILD_DOXYGEN=1 BUILD_DOXYGEN=1
echo_info "Will build doxygen support" echo_info "Will build doxygen support"
...@@ -430,8 +425,12 @@ function main() { ...@@ -430,8 +425,12 @@ function main() {
fi fi
shift 2;; shift 2;;
--noavx512) --noavx512)
NOAVX512="True" AVX512="False"
echo_info "Disabling AVX512" echo_info "Disabling AVX512 instructions"
shift 1;;
--noavx2)
AVX2="False"
echo_info "Disabling AVX2 instructions"
shift 1;; shift 1;;
-k | --skip-shared-libraries) -k | --skip-shared-libraries)
SKIP_SHARED_LIB_FLAG="True" SKIP_SHARED_LIB_FLAG="True"
...@@ -614,9 +613,24 @@ function main() { ...@@ -614,9 +613,24 @@ function main() {
cd $DIR/$BUILD_DIR/build cd $DIR/$BUILD_DIR/build
if [[ ${#CMAKE_C_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS[*]}\""; fi if [[ ${#CMAKE_C_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS[*]}\""; fi
if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi
# if --noavx512 is not specified the AVX512 equals "True" by default
# override AVX512 to "False" if processor does not have avx512
# this avoids having to specify --noavx512 systematically
if [ -f /proc/cpuinfo ]; then
if grep -q avx512 /proc/cpuinfo
then
echo_info "Processor has avx512 intrinsics"
else
echo_info "Processor does not have avx512 intrinsics"
echo_info "Forcing AVX512 to False"
AVX512="False"
fi
fi
# for historical reasons we build in a subdirectory cmake_targets/XYZ/build, # for historical reasons we build in a subdirectory cmake_targets/XYZ/build,
# e.g., cmake_targets/ran_build/build, hence the ../../.. # e.g., cmake_targets/ran_build/build, hence the ../../..
CMAKE_CMD="$CMAKE_CMD -DNOAVX512=\"${NOAVX512[*]}\" ../../.." CMAKE_CMD="$CMAKE_CMD -DAVX512=\"${AVX512[*]}\" -DAVX2=\"${AVX2[*]}\" ../../.."
echo_info "running $CMAKE_CMD" echo_info "running $CMAKE_CMD"
eval $CMAKE_CMD eval $CMAKE_CMD
......
...@@ -122,6 +122,7 @@ check_supported_distribution() { ...@@ -122,6 +122,7 @@ check_supported_distribution() {
"rhel8.6") return 0 ;; "rhel8.6") return 0 ;;
"rhel8.7") return 0 ;; "rhel8.7") return 0 ;;
"centos7") return 0 ;; "centos7") return 0 ;;
"centos8") return 0 ;;
esac esac
return 1 return 1
} }
...@@ -897,6 +898,7 @@ check_install_oai_software() { ...@@ -897,6 +898,7 @@ check_install_oai_software() {
fi fi
install_asn1c_from_source $1 install_asn1c_from_source $1
install_simde_from_source $1
} }
install_asn1c_from_source(){ install_asn1c_from_source(){
...@@ -923,6 +925,37 @@ install_asn1c_from_source(){ ...@@ -923,6 +925,37 @@ install_asn1c_from_source(){
) > $asn1_install_log 2>&1 ) > $asn1_install_log 2>&1
} }
install_simde_from_source(){
echo_info "\nInstalling SIMDE from source without test cases (header files only)"
cd /tmp
$SUDO rm -rf /tmp/simde
git clone https://github.com/simd-everywhere/simde-no-tests.git /tmp/simde
cd /tmp/simde
# brute force copy into /usr/include
$SUDO \cp -rv ../simde /usr/include
$SUDO patch /usr/include/simde/x86/avx.h << FIN
--- /usr/include/simde/x86/avx.h.old 2022-10-03 19:17:39.828223432 +0200
+++ /usr/include/simde/x86/avx.h 2022-10-05 16:19:55.086019445 +0200
@@ -3636,12 +3636,16 @@
SIMDE_FUNCTION_ATTRIBUTES
simde__m256i simde_mm256_insertf128_si256(simde__m256i a, simde__m128i b, int imm8)
SIMDE_REQUIRE_CONSTANT_RANGE(imm8, 0, 1) {
+#if defined(SIMDE_X86_AVX_NATIVE)
+ return _mm256_insertf128_si256(a, b, imm8);
+#else
simde__m256i_private a_ = simde__m256i_to_private(a);
simde__m128i_private b_ = simde__m128i_to_private(b);
a_.m128i_private[imm8] = b_;
return simde__m256i_from_private(a_);
+#endif
}
#if defined(SIMDE_X86_AVX_ENABLE_NATIVE_ALIASES)
#undef _mm256_insertf128_si256
FIN
}
################################################# #################################################
# 2. compile # 2. compile
################################################ ################################################
......
...@@ -105,6 +105,10 @@ ID = GNB_PHY_PRACH_INPUT_SIGNAL ...@@ -105,6 +105,10 @@ ID = GNB_PHY_PRACH_INPUT_SIGNAL
DESC = gNodeB input data in the time domain for slots with PRACH detection DESC = gNodeB input data in the time domain for slots with PRACH detection
GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
FORMAT = int,frame : int,slot : int,antenna : buffer,rxdata FORMAT = int,frame : int,slot : int,antenna : buffer,rxdata
ID = GNB_PHY_DL_OUTPUT_SIGNAL
DESC = gNodeB output data in the freq domain for slots
GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
FORMAT = int,gNB_ID : int,frame : int,slot : int,antenna : buffer,txdata
#MAC logs #MAC logs
ID = ENB_MAC_UE_DL_SDU ID = ENB_MAC_UE_DL_SDU
...@@ -1305,7 +1309,11 @@ ID = UE_PHY_INPUT_SIGNAL ...@@ -1305,7 +1309,11 @@ ID = UE_PHY_INPUT_SIGNAL
ID = UE_PHY_DL_CHANNEL_ESTIMATE ID = UE_PHY_DL_CHANNEL_ESTIMATE
DESC = UE channel estimation in the time domain DESC = UE channel estimation in the time domain
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,chest_t FORMAT = int,eNB_ID : int,rsc_id : int,frame : int,subframe : int,antenna : buffer,chest_t
ID = UE_PHY_DL_CHANNEL_ESTIMATE_FREQ
DESC = UE channel estimation in the frequency domain
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
FORMAT = int,eNB_ID : int,rsc_id : int,frame : int,subframe : int,antenna : buffer,chestF_t
ID = UE_PHY_PDCCH_IQ ID = UE_PHY_PDCCH_IQ
DESC = UE PDCCH received IQ data DESC = UE PDCCH received IQ data
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
......
#!/bin/bash
: ${1?"Usage: $0 [-g num_gnb] [-n num_rsc] [-f filename] [-c count]"}
# Usage info
show_help()
{
echo "
Usage of script with arguments: [-g num_gnb] [-n num_rsc] [-f filename] [-c count]
-g num_gnb Number of active gNBs
-n num_rsc Number of PRS resources
-f filename T tracer recorded .raw filename
-c count Number of dump instances to be extacted
For Example: ./extract_prs_dumps.sh -g 1 -n 8 -f fr2_64_prbs.raw -c 100
-h Help
"
exit 0
}
while getopts g:n:f:c:h flag
do
case "${flag}" in
g) num_gnb=${OPTARG};;
n) num_rsc=${OPTARG};;
f) file=${OPTARG};;
c) count=${OPTARG};;
h) show_help;;
*) exit -1;;
esac
done
echo "num_gnb: $num_gnb";
echo "num_rsc: $num_rsc";
echo "filename: $file";
echo "count: $count";
for (( i = 0; i < $num_gnb; i++ ))
do
for (( j = 0; j < $num_rsc; j++ ))
do
name=chF_gnb${i}_${j}.raw
echo "Extracting $name"
./extract -d ../T_messages.txt $file UE_PHY_DL_CHANNEL_ESTIMATE_FREQ chestF_t -f eNB_ID $i -f rsc_id $j -o $name -count $count
name=chT_gnb${i}_${j}.raw
echo "Extracting $name"
./extract -d ../T_messages.txt $file UE_PHY_DL_CHANNEL_ESTIMATE chest_t -f eNB_ID $i -f rsc_id $j -o $name -count $count
done
done
# zip the extracted dumps
name=prs_dumps.tgz
tar cvzf $name chF_gnb* chT_gnb*
echo "created a zip file $name"
...@@ -198,8 +198,8 @@ int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, ...@@ -198,8 +198,8 @@ int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L,
f = k; f = k;
else { else {
int c = k/R; int c = k/R;
int r = k%R; int r = k % R;
f = (r*C + c + n_shift)%(N_regs/L); f = (r * C + c + n_shift) % (N_regs / L);
} }
return f; return f;
} }
...@@ -664,10 +664,26 @@ void get_samplerate_and_bw(int mu, ...@@ -664,10 +664,26 @@ void get_samplerate_and_bw(int mu,
} }
} else if (mu == 3) { } else if (mu == 3) {
switch(n_rb) { switch(n_rb) {
case 66: case 132:
case 128:
if (threequarter_fs) { if (threequarter_fs) {
*sample_rate=184.32e6; *sample_rate=184.32e6;
*samples_per_frame = 1843200; *samples_per_frame = 1843200;
*tx_bw = 200e6;
*rx_bw = 200e6;
} else {
*sample_rate = 245.76e6;
*samples_per_frame = 2457600;
*tx_bw = 200e6;
*rx_bw = 200e6;
}
break;
case 66:
case 64:
if (threequarter_fs) {
*sample_rate=92.16e6;
*samples_per_frame = 921600;
*tx_bw = 100e6; *tx_bw = 100e6;
*rx_bw = 100e6; *rx_bw = 100e6;
} else { } else {
...@@ -676,7 +692,6 @@ void get_samplerate_and_bw(int mu, ...@@ -676,7 +692,6 @@ void get_samplerate_and_bw(int mu,
*tx_bw = 100e6; *tx_bw = 100e6;
*rx_bw = 100e6; *rx_bw = 100e6;
} }
break; break;
case 32: case 32:
...@@ -691,7 +706,6 @@ void get_samplerate_and_bw(int mu, ...@@ -691,7 +706,6 @@ void get_samplerate_and_bw(int mu,
*tx_bw = 50e6; *tx_bw = 50e6;
*rx_bw = 50e6; *rx_bw = 50e6;
} }
break; break;
default: default:
......
...@@ -98,8 +98,8 @@ ...@@ -98,8 +98,8 @@
/* from openair1/PHY/defs_nr_UE.h */ /* from openair1/PHY/defs_nr_UE.h */
#define CPU_PHYNRUE_MEASURE \ #define CPU_PHYNRUE_MEASURE \
{ \ { \
{"phy_proc", &(UE->phy_proc[0]),0,RX_NB_TH},\ {"phy_proc", &(UE->phy_proc),0,1},\
{"phy_proc_rx", &(UE-> phy_proc_rx[0]),0,RX_NB_TH},\ {"phy_proc_rx", &(UE-> phy_proc_rx),0,1},\
{"phy_proc_tx", &(UE->phy_proc_tx),0,1},\ {"phy_proc_tx", &(UE->phy_proc_tx),0,1},\
{"ue_ul_indication_stats", &(UE->ue_ul_indication_stats),0,1},\ {"ue_ul_indication_stats", &(UE->ue_ul_indication_stats),0,1},\
{"ofdm_mod_stats", &(UE->ofdm_mod_stats),0,1},\ {"ofdm_mod_stats", &(UE->ofdm_mod_stats),0,1},\
...@@ -111,7 +111,7 @@ ...@@ -111,7 +111,7 @@
{"ulsch_interleaving_stats", &(UE->ulsch_interleaving_stats),0,1},\ {"ulsch_interleaving_stats", &(UE->ulsch_interleaving_stats),0,1},\
{"ulsch_multiplexing_stats", &(UE->ulsch_multiplexing_stats),0,1},\ {"ulsch_multiplexing_stats", &(UE->ulsch_multiplexing_stats),0,1},\
{"generic_stat", &(UE->generic_stat),0,1},\ {"generic_stat", &(UE->generic_stat),0,1},\
{"generic_stat_bis", &(UE->generic_stat_bis[0][0]),0,RX_NB_TH,LTE_SLOTS_PER_SUBFRAME},\ {"generic_stat_bis", &(UE->generic_stat_bis[0]),0,LTE_SLOTS_PER_SUBFRAME},\
{"ofdm_demod_stats", &(UE->ofdm_demod_stats),0,1},\ {"ofdm_demod_stats", &(UE->ofdm_demod_stats),0,1},\
{"dlsch_rx_pdcch_stats", &(UE->dlsch_rx_pdcch_stats),0,1},\ {"dlsch_rx_pdcch_stats", &(UE->dlsch_rx_pdcch_stats),0,1},\
{"rx_dft_stats", &(UE->rx_dft_stats),0,1},\ {"rx_dft_stats", &(UE->rx_dft_stats),0,1},\
...@@ -139,14 +139,14 @@ ...@@ -139,14 +139,14 @@
{"dlsch_modulation_SIC_stats", &(UE->dlsch_modulation_SIC_stats),0,1},\ {"dlsch_modulation_SIC_stats", &(UE->dlsch_modulation_SIC_stats),0,1},\
{"dlsch...ping_unit_SIC_stats", &(UE->dlsch_llr_stripping_unit_SIC_stats),0,1},\ {"dlsch...ping_unit_SIC_stats", &(UE->dlsch_llr_stripping_unit_SIC_stats),0,1},\
{"dlsch_unscrambling_SIC_stats", &(UE->dlsch_unscrambling_SIC_stats),0,1},\ {"dlsch_unscrambling_SIC_stats", &(UE->dlsch_unscrambling_SIC_stats),0,1},\
{"ue_front_end_stat", &(UE->ue_front_end_stat[0]),0,RX_NB_TH},\ {"ue_front_end_stat", &(UE->ue_front_end_stat),0,1},\
{"ue_front_end_per_slot_stat", &(UE->ue_front_end_per_slot_stat[0][0]),0,RX_NB_TH,LTE_SLOTS_PER_SUBFRAME},\ {"ue_front_end_per_slot_stat", &(UE->ue_front_end_per_slot_stat[0]),0,LTE_SLOTS_PER_SUBFRAME},\
{"pdcch_procedures_stat", &(UE->pdcch_procedures_stat[0]),0,RX_NB_TH},\ {"pdcch_procedures_stat", &(UE->pdcch_procedures_stat),0,1},\
{"rx_pdsch_stats", &(UE->rx_pdsch_stats), 0, 1}, \ {"rx_pdsch_stats", &(UE->rx_pdsch_stats), 0, 1}, \
{"pdsch_procedures_stat", &(UE->pdsch_procedures_stat[0]),0,RX_NB_TH},\ {"pdsch_procedures_stat", &(UE->pdsch_procedures_stat),0,1},\
{"pdsch_procedures_per_slot_stat", &(UE->pdsch_procedures_per_slot_stat[0][0]),0,RX_NB_TH,LTE_SLOTS_PER_SUBFRAME},\ {"pdsch_procedures_per_slot_stat", &(UE->pdsch_procedures_per_slot_stat[0]),0,LTE_SLOTS_PER_SUBFRAME},\
{"dlsch_procedures_stat", &(UE->dlsch_procedures_stat[0]),0,RX_NB_TH},\ {"dlsch_procedures_stat", &(UE->dlsch_procedures_stat),0,1},\
{"dlsch_decoding_stats", &(UE->dlsch_decoding_stats[0]),0,RX_NB_TH},\ {"dlsch_decoding_stats", &(UE->dlsch_decoding_stats),0,1},\
{"dlsch_llr_stats_para", &(UE->dlsch_llr_stats_parallelization[0][0]),0,RX_NB_TH,LTE_SLOTS_PER_SUBFRAME},\ {"dlsch_llr_stats_para", &(UE->dlsch_llr_stats_parallelization[0]),0,LTE_SLOTS_PER_SUBFRAME},\
} }
#endif #endif
...@@ -37,7 +37,7 @@ extern double cpu_freq_GHz __attribute__ ((aligned(32)));; ...@@ -37,7 +37,7 @@ extern double cpu_freq_GHz __attribute__ ((aligned(32)));;
// structure to store data to compute cpu measurment // structure to store data to compute cpu measurment
#if defined(__x86_64__) || defined(__i386__) #if defined(__x86_64__) || defined(__i386__)
typedef long long oai_cputime_t; typedef long long oai_cputime_t;
#elif defined(__arm__) #elif defined(__arm__) || defined(__aarch64__)
typedef uint32_t oai_cputime_t; typedef uint32_t oai_cputime_t;
#else #else
#error "building on unsupported CPU architecture" #error "building on unsupported CPU architecture"
...@@ -107,7 +107,7 @@ static inline unsigned long long rdtsc_oai(void) { ...@@ -107,7 +107,7 @@ static inline unsigned long long rdtsc_oai(void) {
return (d<<32) | a; return (d<<32) | a;
} }
#elif defined(__arm__) #elif defined(__arm__) || defined(__aarch64__)
static inline uint32_t rdtsc_oai(void) __attribute__((always_inline)); static inline uint32_t rdtsc_oai(void) __attribute__((always_inline));
static inline uint32_t rdtsc_oai(void) { static inline uint32_t rdtsc_oai(void) {
uint32_t r = 0; uint32_t r = 0;
......
...@@ -34,11 +34,7 @@ extern "C" { ...@@ -34,11 +34,7 @@ extern "C" {
#endif #endif
#ifndef malloc16 #ifndef malloc16
# ifdef __AVX2__
# define malloc16(x) memalign(32,x+32) # define malloc16(x) memalign(32,x+32)
# else
# define malloc16(x) memalign(16,x+16)
# endif
#endif #endif
#define free16(y,x) free(y) #define free16(y,x) free(y)
#define bigmalloc malloc #define bigmalloc malloc
...@@ -54,11 +50,7 @@ extern "C" { ...@@ -54,11 +50,7 @@ extern "C" {
} while (0) } while (0)
static inline void *malloc16_clear( size_t size ) { static inline void *malloc16_clear( size_t size ) {
#ifdef __AVX2__
void *ptr = memalign(32, size+32); void *ptr = memalign(32, size+32);
#else
void *ptr = memalign(16, size+16);
#endif
DevAssert(ptr); DevAssert(ptr);
memset( ptr, 0, size ); memset( ptr, 0, size );
return ptr; return ptr;
...@@ -91,11 +83,7 @@ static inline void *malloc_or_fail(size_t size) { ...@@ -91,11 +83,7 @@ static inline void *malloc_or_fail(size_t size) {
# define msg(aRGS...) LOG_D(PHY, ##aRGS) # define msg(aRGS...) LOG_D(PHY, ##aRGS)
#endif #endif
#ifndef malloc16 #ifndef malloc16
# ifdef __AVX2__
# define malloc16(x) memalign(32,x) # define malloc16(x) memalign(32,x)
# else
# define malloc16(x) memalign(16,x)
# endif
#endif #endif
#define free16(y,x) free(y) #define free16(y,x) free(y)
......
...@@ -298,6 +298,10 @@ The following features are valid for the gNB and the 5G-NR UE. ...@@ -298,6 +298,10 @@ The following features are valid for the gNB and the 5G-NR UE.
- SRS signal reception - SRS signal reception
- Channel estimation (with T tracer real time monitoring) - Channel estimation (with T tracer real time monitoring)
- Power noise estimation - Power noise estimation
* NR-PRS
- Rel16 Positioning reference signal(PRS) generation and modulation
- Multiple PRS resources, one per beam is supported in FR2 TDD mode
- FR1 and FR2 support with config file
* NR-PRACH * NR-PRACH
- Formats 0,1,2,3, A1-A3, B1-B3 - Formats 0,1,2,3, A1-A3, B1-B3
* Highly efficient 3GPP compliant LDPC encoder and decoder (BG1 and BG2 are supported) * Highly efficient 3GPP compliant LDPC encoder and decoder (BG1 and BG2 are supported)
...@@ -328,6 +332,7 @@ The following features are valid for the gNB and the 5G-NR UE. ...@@ -328,6 +332,7 @@ The following features are valid for the gNB and the 5G-NR UE.
- HARQ procedures for uplink - HARQ procedures for uplink
- Scheduler procedures for SRS reception - Scheduler procedures for SRS reception
- Periodic SRS reception - Periodic SRS reception
- TPMI computation based on SRS up 4 antenna ports and 1 layer
- MAC procedures to handle CSI measurement report - MAC procedures to handle CSI measurement report
- evalution of RSRP report - evalution of RSRP report
- evaluation of CQI report - evaluation of CQI report
...@@ -458,6 +463,11 @@ The following features are valid for the gNB and the 5G-NR UE. ...@@ -458,6 +463,11 @@ The following features are valid for the gNB and the 5G-NR UE.
* NR-SRS * NR-SRS
- Generation of sequence at PHY - Generation of sequence at PHY
- SRS signal transmission - SRS signal transmission
* NR-PRS
- PRS based Channel estimation with T tracer dumps
- Time of arrival(ToA) estimation based on channel impulse response(CIR)
- Finer ToA estimation by 16x oversampled IDFT for CIR
- Support for multiple gNB reception with gNBs synced via GPSDO
* NR-PRACH * NR-PRACH
- Formats 0,1,2,3, A1-A3, B1-B3 - Formats 0,1,2,3, A1-A3, B1-B3
* SS-RSRP * SS-RSRP
......
...@@ -181,6 +181,17 @@ where `-r` sets the transmission bandwidth configuration in terms of RBs, `-C` s ...@@ -181,6 +181,17 @@ where `-r` sets the transmission bandwidth configuration in terms of RBs, `-C` s
Additionally, at UE side `--uecap_file` option can be used to pass the UE Capabilities input file (path location + filename), e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap.xml` Additionally, at UE side `--uecap_file` option can be used to pass the UE Capabilities input file (path location + filename), e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap.xml`
### Run OAI with SDAP & Custom DRBs
To run OAI gNB with SDAP, simply include `--gNBs.[0].enable_sdap 1` to the binary's arguments.
The DRB creation is dependent on the 5QI.
If the 5QI corresponds to a GBR Flow it assigns a dedicated data radio bearer.
The Non-GBR flows use a shared data radio bearer.
To hardcode the DRBs for testing purposes, simply add `--gNBs.[0].drbs x` to the binary's arguements, where `x` is the number of DRBs, along with SDAP.
The hardcoded DRBs will be treated like GBR Flows. Due to code limitations at this point the max. number of DRBs is 4.
## IF setup with OAI ## IF setup with OAI
OAI is also compatible with Intermediate Frequency (IF) equipment. This allows to use RF front-end that with arbitrary frequencies bands that do not comply with the standardised 3GPP NR bands. OAI is also compatible with Intermediate Frequency (IF) equipment. This allows to use RF front-end that with arbitrary frequencies bands that do not comply with the standardised 3GPP NR bands.
......
This diff is collapsed.
...@@ -18,10 +18,10 @@ ...@@ -18,10 +18,10 @@
| idefix | 172.21.16.135 | CI-NSA-MiniBench | Quectel | Quectel module | | idefix | 172.21.16.135 | CI-NSA-MiniBench | Quectel | Quectel module |
| amariue | 172.21.16.144 | CI-Amarisoft-UE-Usage | nrUE | Amarisoft UE simulator | | amariue | 172.21.16.144 | CI-Amarisoft-UE-Usage | nrUE | Amarisoft UE simulator |
| bellatrix | 192.168.117.115 | CI-RAN-VM-Deployment | Executor | -- | | bellatrix | 192.168.117.115 | CI-RAN-VM-Deployment | Executor | -- |
| nano | 192.168.12.62 | CI-Bench-1-Phones | EPC, adb | 2x COTS (adb) | | nano | 172.21.18.48 | CI-Bench-1-Phones | EPC, adb | 2x COTS (adb) |
| hutch | 192.168.12.19 | CI-Bench-1-Phones | eNB (B7) | B200mini (30C5239) | | hutch | 172.21.18.46 | CI-Bench-1-Phones | eNB (B7) | B200mini (30C5239) |
| starsky | 192.168.12.18 | CI-Bench-1-Phones | eNB (B40) | b200mini (30A3E3C) | | starsky | 172.21.18.45 | CI-Bench-1-Phones | eNB (B40) | b200mini (30A3E3C) |
| carabe | 192.168.12.211 | CI-Bench-2-OAI-Phone | UE (B7UE) | B200mini (30AE8C9) | | carabe | 172.21.18.47 | CI-Bench-2-OAI-Phone | UE (B7UE) | B200mini (30AE8C9) |
Note: The available resources, and their current usage, is indicated here: Note: The available resources, and their current usage, is indicated here:
- [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/): - [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/):
...@@ -97,7 +97,8 @@ Webhook ...@@ -97,7 +97,8 @@ Webhook
- obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ sabox - obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ sabox
- basic SA test (40 MHz TDD) - basic SA test (40 MHz TDD)
- [RAN-PhySim-Cluster](https://jenkins-oai.eurecom.fr/job/RAN-PhySim-Cluster/) - [RAN-PhySim-Cluster](https://jenkins-oai.eurecom.fr/job/RAN-PhySim-Cluster/)
- asterix (`Asterix-OC-oaicicd-session` resource), tests in OpenShift Cluster - poseidon (jumphost, `Asterix-OC-oaicicd-session` resource), tests in
OpenShift Cluster
- unitary simulators (`nr_dlsim`, etc.) - unitary simulators (`nr_dlsim`, etc.)
- [RAN-RF-Sim-Test-4G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-4G/) - [RAN-RF-Sim-Test-4G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-4G/)
- obelix (eNB, 1x UE, OAI EPC) - obelix (eNB, 1x UE, OAI EPC)
...@@ -106,8 +107,8 @@ Webhook ...@@ -106,8 +107,8 @@ Webhook
- obelix (gNB, 2x UE, OAI 5GC) - obelix (gNB, 2x UE, OAI 5GC)
- uses RFsimulator, TDD 40MHz, FDD 40MHz, F1 split - uses RFsimulator, TDD 40MHz, FDD 40MHz, F1 split
- [RAN-RHEL8-Cluster-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-RHEL8-Cluster-Image-Builder/) - [RAN-RHEL8-Cluster-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-RHEL8-Cluster-Image-Builder/)
- asterix (`Asterix-OC-oaicicd-session` resource): RHEL 8 image build using - poseidon (jumphost, `Asterix-OC-oaicicd-session` resource): RHEL 8 image
the OpenShift in Eurecom build using the OpenShift Cluster
- [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/) - [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/)
- obelix: Ubuntu 18 image build using docker - obelix: Ubuntu 18 image build using docker
...@@ -144,10 +145,6 @@ runs tests: ...@@ -144,10 +145,6 @@ runs tests:
- bellatrix: runs 4G/5G simulators directly (eNB + 1x UE + (opt.) OAI EPC, gNB + 1x UE in "noS1") - bellatrix: runs 4G/5G simulators directly (eNB + 1x UE + (opt.) OAI EPC, gNB + 1x UE in "noS1")
triggers pipelines: triggers pipelines:
- [eNB-CI-F1-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-F1-FDD-Band7-B210/)
- hutch + B210, nano w/ ltebox + 2x UE
- tests 4G FDD with F1 split, 5MHz, 10MHz, 20MHz. 5MHz stable, rest known to
be unstable
- [eNB-CI-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-FDD-Band7-B210/) - [eNB-CI-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-FDD-Band7-B210/)
- hutch + B210, nano w/ ltebox + 2x UE - hutch + B210, nano w/ ltebox + 2x UE
- tests T tracer, information through FlexRAN, RRC inactivity timers, - tests T tracer, information through FlexRAN, RRC inactivity timers,
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
#include <executables/split_headers.h> #include <executables/split_headers.h>
#include <openair1/PHY/CODING/coding_extern.h> #include <openair1/PHY/CODING/coding_extern.h>
#include <threadPool/thread-pool.h> #include <threadPool/thread-pool.h>
#include <emmintrin.h> #include "PHY/sse_intrin.h"
#define FS6_BUF_SIZE 1000*1000 #define FS6_BUF_SIZE 1000*1000
static UDPsock_t sockFS6; static UDPsock_t sockFS6;
......
...@@ -75,7 +75,8 @@ int oai_exit = 0; ...@@ -75,7 +75,8 @@ int oai_exit = 0;
double cpuf; double cpuf;
THREAD_STRUCT thread_struct; THREAD_STRUCT thread_struct;
uint16_t sf_ahead=4; extern uint16_t sf_ahead; // Bell Labs
//uint16_t sf_ahead=4;
//uint16_t slot_ahead=6; //uint16_t slot_ahead=6;
int otg_enabled; int otg_enabled;
uint64_t downlink_frequency[MAX_NUM_CCs][4]; uint64_t downlink_frequency[MAX_NUM_CCs][4];
...@@ -725,12 +726,8 @@ void ocp_tx_rf(RU_t *ru, L1_rxtx_proc_t *proc) { ...@@ -725,12 +726,8 @@ void ocp_tx_rf(RU_t *ru, L1_rxtx_proc_t *proc) {
} }
#if defined(__x86_64) || defined(__i386__) #if defined(__x86_64) || defined(__i386__)
#ifdef __AVX2__
sf_extension = (sf_extension)&0xfffffff8; sf_extension = (sf_extension)&0xfffffff8;
#else #elif defined(__arm__) || defined(__aarch64__)
sf_extension = (sf_extension)&0xfffffffc;
#endif
#elif defined(__arm__)
sf_extension = (sf_extension)&0xfffffffc; sf_extension = (sf_extension)&0xfffffffc;
#endif #endif
...@@ -1141,6 +1138,7 @@ int main ( int argc, char **argv ) { ...@@ -1141,6 +1138,7 @@ int main ( int argc, char **argv ) {
int i; int i;
int CC_id = 0; int CC_id = 0;
int node_type = ngran_eNB; int node_type = ngran_eNB;
sf_ahead=4; // Bell Labs
AssertFatal(load_configmodule(argc,argv,0), "[SOFTMODEM] Error, configuration module init failed\n"); AssertFatal(load_configmodule(argc,argv,0), "[SOFTMODEM] Error, configuration module init failed\n");
logInit(); logInit();
printf("Reading in command-line options\n"); printf("Reading in command-line options\n");
......
...@@ -99,6 +99,8 @@ ...@@ -99,6 +99,8 @@
#define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n" #define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n"
#define CONFIG_HLP_LDPC_OFFLOAD "enable LDPC offload\n" #define CONFIG_HLP_LDPC_OFFLOAD "enable LDPC offload\n"
#define CONFIG_HLP_USRP_ARGS "set the arguments to identify USRP (same syntax as in UHD)\n" #define CONFIG_HLP_USRP_ARGS "set the arguments to identify USRP (same syntax as in UHD)\n"
#define CONFIG_HLP_TX_SUBDEV "set the arguments to select tx_subdev (same syntax as in UHD)\n"
#define CONFIG_HLP_RX_SUBDEV "set the arguments to select rx_subdev (same syntax as in UHD)\n"
#define CONFIG_HLP_FLOG "Enable online log \n" #define CONFIG_HLP_FLOG "Enable online log \n"
#define CONFIG_HLP_LOGL "Set the global log level, valid options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n" #define CONFIG_HLP_LOGL "Set the global log level, valid options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n"
......
This diff is collapsed.
...@@ -117,6 +117,8 @@ int vcdflag = 0; ...@@ -117,6 +117,8 @@ int vcdflag = 0;
double rx_gain_off = 0.0; double rx_gain_off = 0.0;
char *usrp_args = NULL; char *usrp_args = NULL;
char *tx_subdev = NULL;
char *rx_subdev = NULL;
char *rrc_config_path = NULL; char *rrc_config_path = NULL;
char *uecap_file = NULL; char *uecap_file = NULL;
int dumpframe = 0; int dumpframe = 0;
...@@ -359,6 +361,8 @@ void init_openair0(void) { ...@@ -359,6 +361,8 @@ void init_openair0(void) {
openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file; openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file;
if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args; if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args;
if (tx_subdev) openair0_cfg[card].tx_subdev = tx_subdev;
if (rx_subdev) openair0_cfg[card].rx_subdev = rx_subdev;
} }
} }
......
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
/*------------------------------------------------------------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------------------------------------------------------------*/
#define CMDLINE_NRUEPARAMS_DESC { \ #define CMDLINE_NRUEPARAMS_DESC { \
{"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:&usrp_args, defstrval:"type=b200", TYPE_STRING, 0}, \ {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:&usrp_args, defstrval:"type=b200", TYPE_STRING, 0}, \
{"tx_subdev", CONFIG_HLP_TX_SUBDEV, 0, strptr:&tx_subdev, defstrval:NULL, TYPE_STRING, 0}, \
{"rx_subdev", CONFIG_HLP_RX_SUBDEV, 0, strptr:&rx_subdev, defstrval:NULL, TYPE_STRING, 0}, \
{"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \ {"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \
{"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, u8ptr:NULL, defintval:0, TYPE_UINT8, 0}, \ {"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, u8ptr:NULL, defintval:0, TYPE_UINT8, 0}, \
{"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:&nrUE_params.ofdm_offset_divisor, defuintval:8, TYPE_UINT32, 0}, \ {"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:&nrUE_params.ofdm_offset_divisor, defuintval:8, TYPE_UINT32, 0}, \
...@@ -97,5 +99,4 @@ extern void start_oai_nrue_threads(void); ...@@ -97,5 +99,4 @@ extern void start_oai_nrue_threads(void);
void *UE_thread(void *arg); void *UE_thread(void *arg);
void init_nr_ue_vars(PHY_VARS_NR_UE *ue, uint8_t UE_id, uint8_t abstraction_flag); void init_nr_ue_vars(PHY_VARS_NR_UE *ue, uint8_t UE_id, uint8_t abstraction_flag);
void init_nrUE_standalone_thread(int ue_idx); void init_nrUE_standalone_thread(int ue_idx);
#endif #endif
...@@ -210,10 +210,11 @@ void set_softmodem_sighandler(void) { ...@@ -210,10 +210,11 @@ void set_softmodem_sighandler(void) {
act.sa_handler=signal_handler; act.sa_handler=signal_handler;
sigaction(SOFTMODEM_RTSIGNAL,&act,&oldact); sigaction(SOFTMODEM_RTSIGNAL,&act,&oldact);
// Disabled in order generate a core dump for analysis with gdb // Disabled in order generate a core dump for analysis with gdb
// Enable for clean exit on CTRL-C (i.e. record player, USRP...)
signal(SIGINT, signal_handler);
# if 0 # if 0
printf("Send signal %d to display resource usage...\n",SIGRTMIN+1); printf("Send signal %d to display resource usage...\n",SIGRTMIN+1);
signal(SIGSEGV, signal_handler); signal(SIGSEGV, signal_handler);
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler); signal(SIGTERM, signal_handler);
signal(SIGABRT, signal_handler); signal(SIGABRT, signal_handler);
#endif #endif
......
...@@ -4060,4 +4060,42 @@ int nfapi_p7_update_checksum(uint8_t* buffer, uint32_t len); ...@@ -4060,4 +4060,42 @@ int nfapi_p7_update_checksum(uint8_t* buffer, uint32_t len);
*/ */
int nfapi_p7_update_transmit_timestamp(uint8_t* buffer, uint32_t timestamp); int nfapi_p7_update_transmit_timestamp(uint8_t* buffer, uint32_t timestamp);
/*! \brief Encodes a nfapi_nr_srs_normalized_channel_iq_matrix_t to a buffer
*
* \param pMessageBuf A pointer to a nfapi_nr_srs_normalized_channel_iq_matrix_t structure
* \param pPackedBuf A pointer to the buffer that the nfapi_nr_srs_normalized_channel_iq_matrix_t will be packed into
* \param packedBufLen The size of the buffer
* \return number of bytes written to the buffer
*/
int pack_nr_srs_normalized_channel_iq_matrix(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen);
/*! \brief Decodes a nfapi_nr_srs_normalized_channel_iq_matrix_t from a buffer
*
* \param pMessageBuf A pointer to an encoded nfapi_nr_srs_normalized_channel_iq_matrix_t
* \param messageBufLen The size of the encoded nfapi_nr_srs_normalized_channel_iq_matrix_t
* \param pUnpackedBuf A pointer to the nfapi_nr_srs_normalized_channel_iq_matrix_t
* \param unpackedBufLen The size of nfapi_nr_srs_normalized_channel_iq_matrix_t structure.
* \return 0 means success, -1 means failure.
*/
int unpack_nr_srs_normalized_channel_iq_matrix(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen);
/*! \brief Encodes a nfapi_nr_srs_beamforming_report_t to a buffer
*
* \param pMessageBuf A pointer to a nfapi_nr_srs_beamforming_report_t structure
* \param pPackedBuf A pointer to the buffer that the nfapi_nr_srs_beamforming_report_t will be packed into
* \param packedBufLen The size of the buffer
* \return number of bytes written to the buffer
*/
int pack_nr_srs_beamforming_report(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen);
/*! \brief Decodes a nfapi_nr_srs_beamforming_report_t from a buffer
*
* \param pMessageBuf A pointer to an encoded nfapi_nr_srs_beamforming_report_t
* \param messageBufLen The size of the encoded nfapi_nr_srs_beamforming_report_t
* \param pUnpackedBuf A pointer to the nfapi_nr_srs_beamforming_report_t
* \param unpackedBufLen The size of nfapi_nr_srs_beamforming_report_t structure.
* \return 0 means success, -1 means failure.
*/
int unpack_nr_srs_beamforming_report(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen);
#endif /* _NFAPI_INTERFACE_H_ */ #endif /* _NFAPI_INTERFACE_H_ */
This diff is collapsed.
This diff is collapsed.
...@@ -36,11 +36,7 @@ ...@@ -36,11 +36,7 @@
#define MAX_BLOCK_LENGTH 8448 #define MAX_BLOCK_LENGTH 8448
#ifndef malloc16 #ifndef malloc16
# ifdef __AVX2__
# define malloc16(x) memalign(32,x) # define malloc16(x) memalign(32,x)
# else
# define malloc16(x) memalign(16,x)
# endif
#endif #endif
#define NR_LDPC_PROFILER_DETAIL #define NR_LDPC_PROFILER_DETAIL
......
...@@ -472,6 +472,13 @@ void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f); ...@@ -472,6 +472,13 @@ void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f);
void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f); void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f);
int nr_get_R_ldpc_decoder(int rvidx,
int E,
int BG,
int Z,
int *llrLen,
int round);
int nr_rate_matching_ldpc(uint32_t Tbslbrm, int nr_rate_matching_ldpc(uint32_t Tbslbrm,
uint8_t BG, uint8_t BG,
uint16_t Z, uint16_t Z,
......
...@@ -44,8 +44,7 @@ ...@@ -44,8 +44,7 @@
#include "crcext.h" #include "crcext.h"
#include "types.h" #include "types.h"
#include <immintrin.h> #include "PHY/sse_intrin.h"
#include <wmmintrin.h>
/** /**
* PCLMULQDQ CRC computation context structure * PCLMULQDQ CRC computation context structure
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include "PHY/sse_intrin.h"
#include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPCdecoder_defs.h"
#include "../../nrLDPC_types.h" #include "../../nrLDPC_types.h"
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include "PHY/sse_intrin.h"
#include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPCdecoder_defs.h"
#include "../../nrLDPC_types.h" #include "../../nrLDPC_types.h"
...@@ -44,8 +44,8 @@ void nrLDPC_bnProcPc_BG2_generator_AVX512(const char *dir, int R) ...@@ -44,8 +44,8 @@ void nrLDPC_bnProcPc_BG2_generator_AVX512(const char *dir, int R)
abort(); abort();
} }
// fprintf(fd,"#include <stdint.h>\n"); // fprintf(fd,"#include <stdint.h>\n");
//fprintf(fd,"#include <immintrin.h>\n"); // fprintf(fd,"#include \"PHY/sse_intrin.h\"\n");
fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]);
const uint8_t* lut_numBnInBnGroups; const uint8_t* lut_numBnInBnGroups;
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include "PHY/sse_intrin.h"
#include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPCdecoder_defs.h"
#include "../../nrLDPC_types.h" #include "../../nrLDPC_types.h"
...@@ -45,7 +45,7 @@ void nrLDPC_bnProc_BG1_generator_AVX512(const char *dir, int R) ...@@ -45,7 +45,7 @@ void nrLDPC_bnProc_BG1_generator_AVX512(const char *dir, int R)
} }
//fprintf(fd,"#include <stdint.h>\n"); //fprintf(fd,"#include <stdint.h>\n");
//fprintf(fd,"#include <immintrin.h>\n"); //fprintf(fd,"#include \"PHY/sse_intrin.h\"\n");
fprintf(fd,"static inline void nrLDPC_bnProc_BG1_R%s_AVX512(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n", ratestr[R]); fprintf(fd,"static inline void nrLDPC_bnProc_BG1_R%s_AVX512(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n", ratestr[R]);
......
...@@ -140,7 +140,7 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,int ...@@ -140,7 +140,7 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,int
shift=5; // AVX2 - 256-bit SIMD shift=5; // AVX2 - 256-bit SIMD
mask=31; mask=31;
strcpy(data_type,"__m256i"); strcpy(data_type,"__m256i");
strcpy(xor_command,"_mm256_xor_si256"); strcpy(xor_command,"simde_mm256_xor_si256");
} }
else if ((Zc&15)==0) { else if ((Zc&15)==0) {
shift=4; // SSE4 - 128-bit SIMD shift=4; // SSE4 - 128-bit SIMD
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment