Compare commits

..

50 Commits

Author SHA1 Message Date
Bartosz Podrygajlo
3904d74658 Attempt to fix the ORU hanging issue
In an attempt to make the ORU interrupt more robust, move the timing thread
stop at the very end of vrtism_end function. This will give an extra second to
applications threads to finalize read operations and stop correctly.
2025-12-04 09:13:10 +01:00
Bartosz Podrygajlo
5e0ae8ba05 Correctly reset new thread affinity in case its -1
In case the new thread affinity is -1, instead of reseting affinity
to all cores set the affinity mask to the affinity of the process.
This way if e.g. taskset is used, threads that are assinged -1 affinity
will not move to cores outside configured taskset.
2025-12-04 09:07:01 +01:00
Bartosz Podrygajlo
6c16fce1d0 ORU: Quarter slot parallelization for DL FH processing
Implemented quarter slot parallelization using thread pool for DL FH
processing. The number of threads started is equal to number of antennas
 x 2. However due to O-RU already processing DL in half slot intervals,
the number of threads per antenna per slot is equal to 4. This achieves
quarter-slot parallelization,

To configure, use legacy RU `num_tp_cores` and `tp_cores` config values
in conf files.
2025-12-04 09:00:33 +01:00
Bartosz Podrygajlo
68dc50c491 Add timespec printout to dump_nonzero_symbol 2025-12-04 08:12:11 +01:00
Bartosz Podrygajlo
531a100bdd Add sync thread to O-RU 2025-12-03 11:17:06 +01:00
Bartosz Podrygajlo
c750b9acd0 Hack for PRACH format B4 O-RU
A hacky solution to make PRACH format B4 work on O-RU. This limits the PRACH
symbol accumulation to first four symbols, making PRACH that much faster. This
is not a proper solution - a proper solution would require to write a symbol
based PRACH receiver. A slight complication is that the PRACH symbol does not
conicide with the OFDM symbl boundary.
2025-12-02 19:31:35 +01:00
Bartosz Podrygajlo
954a17ed70 Clear memory in shm_td_iq_channel after RX
Clear memory in shm_td_iq_channel after RX. This prevents the IQ
from being read twice. This can happen if the application crashes
and will keep the other side reading historical IQ samples.
2025-11-28 09:00:28 +01:00
Bartosz Podrygajlo
5ff23f62c2 Add fix patch for oran RX window end callback 2025-11-25 12:29:28 +01:00
Bartosz Podrygajlo
6f286e48fc conf files from my local setup
these conf files are used in my local setup. I use x710 intel NIC to
create 2 paris of inter-connected VFs using separate VLAN tags for
Cplane and Uplane. See setup_ru_ifs.sh for details.
2025-11-25 11:54:02 +01:00
Bartosz Podrygajlo
8f2e2123be PRACH debugging commit 2025-11-25 11:50:07 +01:00
Bartosz Podrygajlo
aabdb6efb1 Add T2a delay profile parameter 2025-11-25 11:49:42 +01:00
Bartosz Podrygajlo
b8b510a185 Fix (?) PRACH TX 2025-11-25 11:49:19 +01:00
Bartosz Podrygajlo
7bc6a11f78 Couple of debugging prints 2025-11-25 11:49:01 +01:00
Bartosz Podrygajlo
b309482118 Fix xran callback installation for O-RU
Install callback using updated xran library.
2025-11-21 15:12:17 +01:00
Bartosz Podrygajlo
450c2d8b95 PUSCH updates for O-RU 2025-11-18 16:46:07 +01:00
Bartosz Podrygajlo
981e3adc19 ORU: Receive PUSCH and send via xran 2025-11-12 09:04:03 +01:00
Bartosz Podrygajlo
623496b2a7 Correct timestamp generation code in symbol_callback 2025-11-11 19:19:22 +01:00
Bartosz Podrygajlo
3f7b5310c1 O-RU PRACH reception 2025-11-07 14:35:15 +01:00
Bartosz Podrygajlo
fea2086560 Enable instrumentation of nr-softmodem 2025-11-07 14:35:15 +01:00
Bartosz Podrygajlo
c7b8e7fd82 Fix tracy package version 2025-11-07 14:35:15 +01:00
Bartosz Podrygajlo
ff0eec582a Update threadCreate
Two modifications for threadCreate:
 - if -1 is passed, the thread no longer inherits its parent affinity.
   instead thread affnity is cleared
 - if the name is too long, the thread name is shorted to maximum
   pthread name (16 characters).
2025-11-07 14:35:15 +01:00
Bartosz Podrygajlo
a34852f24f Add xran patch for PRACH transmission
Add a fix for a segmentation fault at the DU due to incorrect filter_id field
in packets generated by the O-RU for PRACH.
2025-11-06 10:24:19 +01:00
Bartosz Podrygajlo
3735e8a5df O-RU: Synchronize north read to south read threads.
Perform synchronization between input sample from split8
device and split 7.2 timestamp via a fifo queue between threads.
2025-11-06 10:17:33 +01:00
Bartosz Podrygajlo
c60338659f O-RU test reproduction steps 2025-11-06 10:17:25 +01:00
Bartosz Podrygajlo
594d81d3b9 ORU: Fix incorrect pointer to txdataF_BF
Overwrite RU_t common->txdataF_BF with the buffer pointer used by O-RU.
TODO: cleanup the code so this is not needed.
2025-11-06 10:17:18 +01:00
Bartosz Podrygajlo
d01f7e38fb O-RU: Add missing symbol rotation initialization 2025-11-06 10:17:09 +01:00
Bartosz Podrygajlo
9b70ee6374 Fix decompression for O-RU. 2025-11-06 10:16:58 +01:00
Bartosz Podrygajlo
ed44194ff5 Replace tx_rf with tx_rf_symbols in ORU
Fix the O-RU per symbol transmission.
2025-11-06 10:16:51 +01:00
Bartosz Podrygajlo
f93d1ded10 Add a new tx_rf_symbols function to allow per symbol transmission 2025-11-06 10:16:40 +01:00
Bartosz Podrygajlo
12d0ca747c Add symbol timing functions for NR_DL_FRAME_PARMS
Add two new functions for calculation symbol timestamp and symbol
duration for NR_DL_FRAME_PARMS. These functions are not using
the existing indirection mechanism via function pointers as this
prevents the compiler from properly optimizing the code.
2025-11-06 10:16:31 +01:00
Bartosz Podrygajlo
6952a67101 O-RU: Reset nSecDesc on symbol reception
This is required as xran does not manage this value by itself.
Not resetting this will cause nSecDesc to go above the maximum
supported number of sections per symbol and sections to be discarded.
2025-11-06 10:16:24 +01:00
Bartosz Podrygajlo
d922d45599 Fix lte-softmodem and oairu builds 2025-11-06 10:16:17 +01:00
Bartosz Podrygajlo
7bbeec3eb2 Offset timestamp_tx in O-RU by intended symbol
Add sample offset from symbol to timestamp_tx based on symbol
indicated by oran api.
2025-11-06 10:16:10 +01:00
Bartosz Podrygajlo
bcb158cafc Workarond for a bug in callback mechanism in XRAN
Update symbol_callback to detect and correct an issue with the calculated
frame index. This is caused by an issue with the timer functionality
in libxran where if a timer is setup close to the GPS second start
the sfn offset `xran_sfn_at_sec_start` is not setup correctly causing
the frame in xran_sense_of_time struct to be returned with an offset
of 100 frames (1 second).
2025-11-06 10:16:01 +01:00
Bartosz Podrygajlo
6e66b9fc3f Ensure ofdm_offset_divisor is set in O-RU.
Hardcode ofdm_offset_divisor to 8 in O-RU.
2025-11-06 10:15:54 +01:00
Bartosz Podrygajlo
49e652c9c6 Simplify vrtsim timing job thread. 2025-11-06 10:15:47 +01:00
Bartosz Podrygajlo
19a418cd17 Clean exit for the ORU
- Handle SIGINT
 - Print DL FH processing meas
 - Stop & terminate xran and vrtsim
2025-11-06 10:15:38 +01:00
Bartosz Podrygajlo
684dd38dca Use synchronized rfdevice to xran timestamps in ORU
Synchronize the southbound (time domain) interface to XRAN timestamps
in ORU. This currently only works with vrtsim.

Transmit the samples after processing in oru_downlink_processing.
2025-11-06 10:15:30 +01:00
Bartosz Podrygajlo
bd2c9c32c0 Load vrtsim in O-RU and start reading samples
Added oru_south_read_thread that reads samples from vrtsim.
No UL FH processing is done as of this commit.
2025-11-06 10:15:21 +01:00
Bartosz Podrygajlo
801086e401 Print xran counters to stdout in xran_fh_tx_read_slot 2025-11-06 10:15:14 +01:00
Bartosz Podrygajlo
9e95a2ccde Add get_timestamp to openair_device_t and vrtsim
This function can be used to convert a timespec struct to a
openair0_timestamp. It can be used to synchronize the realtime
clock to the device sample number.
2025-11-06 10:13:46 +01:00
Bartosz Podrygajlo
e48661d8cf Add a periodic print out of the O-RU north read thread 2025-11-06 10:13:36 +01:00
Bartosz Podrygajlo
9e94745f65 Add a config file for O-RU from broadbill 2025-11-06 10:12:59 +01:00
Bartosz Podrygajlo
7ba28c1d05 DL FH processing for O-RU
Add DFT and symbol rotation to O-RU
2025-11-06 10:12:48 +01:00
Bartosz Podrygajlo
b0caad9c40 O-RU: Add north_read thread
Added north read thread that can utilize north_in function for timing
and providing IQ data from the XRAN library.
2025-11-06 10:12:24 +01:00
Bartosz Podrygajlo
b2c62c7cd4 Add north_in function to oran_fhlib_5g
The north_in function is supposed to be used by the ORU to read IQ data
sent from O-DU.
2025-11-06 10:12:15 +01:00
Mario Joa-Ng
ed7c1057c5 Use no of fh_config in configuration file to determine the number of peers
Determine number of DU for RU config file or no of RU for DU config file
based on number of fh_config elements.
2025-11-06 10:12:08 +01:00
Raymond Knopp
c3bd911938 Initial implementation of O-RU for 7.2 emulator
Added new executable oainr_ru which acts as a 7.2 O-RU.

Co-authored-by: Bartosz Podrygajlo <bartosz.podrygajlo@openairinterface.org>
Co-authored-by: Mario Joa-Ng <mario.joa-ng@openairinterface.org>
2025-11-06 10:12:01 +01:00
Bartosz Podrygajlo
5bb7a4d274 FD RFSimulator adaptation layer
A new radio library for use with the gNB. It performs the same tasks as an O-RU
and is meant for testing O-DU functionalities. It acts as an RFSim server with
a frequency domain interface.
2025-11-06 10:11:12 +01:00
Bartosz Podrygajlo
decd8ae8ac Add a function which loads the specified radio library 2025-11-06 10:11:03 +01:00
429 changed files with 11957 additions and 24304 deletions

View File

@@ -62,7 +62,6 @@ ForEachMacros:
- BOOST_FOREACH
- RB_FOREACH
- UE_iterator
- FOR_EACH_SEQ_ARR
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^<ext/.*\.h>'

3
.gitmodules vendored
View File

@@ -1,3 +1,4 @@
[submodule "openair2/E2AP/flexric"]
path = openair2/E2AP/flexric
url = https://gitlab.eurecom.fr/mosaic5g/flexric
url = https://gitlab.eurecom.fr/mosaic5g/flexric.git
branch = remotes/origin/service-models-integration

View File

@@ -1,71 +1,5 @@
# RELEASE NOTES: #
## [v2.4.0](https://gitlab.eurecom.fr/oai/openairinterface5g/-/tags/v2.4.0) -> December 2025. ##
General new features and improvements (both RAN and UE):
- Rework LDPC BBdev/AAL interface and support both AMD T2/Intel vRAN Boost
(VRB) 1 accelerators
- Add a taps client for vrtsim real-time simulator (check: vrtsim release?)
- Add new RFemulator virtual radio driver to emulate radio (including noise
generation) for gNB/UE standalone operation
- RLC AM reception improvements for high-throughput scenarios (!3512)
- Small NTN fixes (!3659, !3666, !3581, !3652)
- Improvements to imScope
Stability and bug fixes:
- RFsimulator: fix concurrency problems during multi-client connection
- USRP driver: support synchronization of USRP B200
- MAC scheduler improvements
- General L1 improvements for efficiency and stability
- Correct PRS bug and test in CI
- Upgrade Ubuntu container images to Ubuntu 24.04
- All build system targets compile (`make/ninja all`)
- Minor cleanup, harmonization, and performance improvements all over the stack
- Simplify CI code
RAN changes (gNB/CU/CU-CP/CU-UP/DU/DU-high/DU-low):
- Support of N2 handover
- Support of "UL-heavy" TDD patterns, e.g., DSUUU
- Open Fronthaul M-plane: CM improvements, PM implementation, and additional
v16.01 support
- Improve interoperability with Nvidia Aerial L1 to support 2 layer UL
- Add O-RAN OSC WLS library as FAPI transport and enable L1/L2 shared memory
split
- Implement FAPI Stop exchange
- Improve interoperability with srsRAN_Project DU
- Add new synchronized real-time data recording application (!3462)
- Support for measurement gaps and general handover fixes
- Support of RRC PDU session release procedure
- Add CU-UP load tester
- Correct BWP scheduling and support multiple BWPs per UE
nrUE changes:
- Support one additional PDU session (see !3486)
- L3 measurements for A2 measurement reports
- Support for type0 PDSCH frequency allocation
- UE symbol based PDCCH receiver
Regression or removals:
- No known regressions
- Unused L2 simulator code has been removed
- Unused Benetel radio driver code (not FHI 7.2!) has been removed
Configuration file changes:
- `gNBs.[0].servingCellConfigCommon.[0].ra_ResponseWindow` is automatically
computed and can be removed
- `gNBs.[0].bwp_list` has been added (moved from entries in
`gNBs.[0].servingCellConfigDedicated`)
- `gNBs.[0].phaseTrackingRS` has been added (moved from entries in
`gNBs.[0].servingCellConfigDedicated`)
- `gNBs.[0].local_s_portc` and `gNBs.[0].remote_s_portc` have no effect and
should be removed
- `gNBs.[0].CSI_report_type` has been added
- `MACRLCs.[0].ulsch_max_frame_inactivity` is automatically computed and can be
removed
- `MACRLCs.[0].local_n_portc` and `MACRLCs.[0].remote_n_portc` have no effect and
should be removed
- `MACRLCs.[0].stats_max_ue` has been added
## [v2.3.0](https://gitlab.eurecom.fr/oai/openairinterface5g/-/tags/v2.3.0) -> July 2025. ##
General new features and improvements (both RAN and UE):

View File

@@ -113,9 +113,6 @@ else()
message(WARNING "did not find /proc/cpuinfo -- not setting any x86-specific compilation variables")
endif()
eval_boolean(AUTODETECT_AVX512_FP16 DEFINED CPUFLAGS AND CPUFLAGS MATCHES "avx512_fp16")
add_boolean_option(AVX512_FP16 ${AUTODETECT_AVX512_FP16} "Whether AVX512_FP16 intrinsics are available on the host processor" ON)
eval_boolean(AUTODETECT_AVX512 DEFINED CPUFLAGS AND CPUFLAGS MATCHES "avx512")
add_boolean_option(AVX512 ${AUTODETECT_AVX512} "Whether AVX512 intrinsics is available on the host processor" ON)
@@ -130,11 +127,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
# The following intrinsics are assumed to be available on any x86 system
# (avx, f16c, fma, gnfi, mmx, pclmul, sse, sse2, sse3, xop)
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -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_SSE_NATIVE -DSIMDE_X86_XOP_HAVE_COM_ -DSIMDE_X86_XOP_NATIVE")
message(STATUS "AVX512_FP16 intrinsics are ${AVX512_FP16}")
message(STATUS "AVX512 intrinsics are ${AVX512}")
if (${AVX512_FP16})
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX512BW_NATIVE -DSIMDE_X86_AVX512F_NATIVE -DSIMDE_X86_AVX512VL_NATIVE -mavx512bw -march=sapphirerapids -mtune=sapphirerapids")
elseif(${AVX512})
if(${AVX512})
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX512BW_NATIVE -DSIMDE_X86_AVX512F_NATIVE -DSIMDE_X86_AVX512VL_NATIVE -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512")
else()
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mno-avx512f -march=native")
@@ -189,10 +183,6 @@ if(CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang
set(commonOpts "${commonOpts} -Wno-unused-command-line-argument")
endif()
if (ENABLE_CUDA)
set(commonOpts "${commonOpts} -DENABLE_CUDA")
endif()
set(CMAKE_C_FLAGS
"${C_FLAGS_PROCESSOR} ${commonOpts} -std=gnu11 -funroll-loops ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS
@@ -292,7 +282,7 @@ add_boolean_option(TRACY_ENABLE OFF "Enable tracy instrumentation" ON)
if (TRACY_ENABLE)
# the tracy version here should match the tracy server version
# below is latest release as of this commit
CPMAddPackage("gh:wolfpld/tracy#0.12.2")
CPMAddPackage("gh:wolfpld/tracy#v0.12.2")
endif()
set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
@@ -474,9 +464,6 @@ target_include_directories(f1ap PUBLIC F1AP_DIR)
target_link_libraries(f1ap PUBLIC asn1_f1ap GTPV1U)
target_link_libraries(f1ap PRIVATE ngap nr_rrc HASHTABLE f1ap_lib)
target_include_directories(f1ap PRIVATE ${F1AP_DIR}/lib)
if(E2_AGENT)
target_compile_definitions(f1ap PRIVATE E2_AGENT)
endif()
# LPP
##############
@@ -665,6 +652,7 @@ add_library(SCHED_LIB ${SCHED_SRC})
target_link_libraries(SCHED_LIB PRIVATE asn1_lte_rrc_hdrs)
set(SCHED_NR_SRC
${OPENAIR1_DIR}/SCHED_NR/fapi_nr_l1.c
${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_gNB.c
${OPENAIR1_DIR}/SCHED_NR/nr_prach_procedures.c
${OPENAIR1_DIR}/SCHED_NR/phy_frame_config_nr.c
@@ -951,6 +939,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci_tools.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_coding.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch.c
@@ -980,8 +969,6 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/srs_rx.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_uci_tools_common.c
)
set(PHY_NR_SRC_CU
)
set(PHY_NR_UE_SRC
${OPENAIR1_DIR}/PHY/INIT/nr_parms.c
${OPENAIR1_DIR}/PHY/MODULATION/nr_modulation.c
@@ -1059,17 +1046,7 @@ target_include_directories(PHY_UE PRIVATE ${blas_INCLUDE_DIRS} ${lapacke_INCLUDE
add_library(PHY_NR_COMMON ${PHY_NR_SRC_COMMON})
target_link_libraries(PHY_NR_COMMON PUBLIC UTIL)
if (ENABLE_CUDA)
find_package(CUDA REQUIRED)
if (NOT CUDA_FOUND)
message(FATAL_ERROR "no CUDA found")
endif()
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-arch=sm_87;")
set(CUDA_VERBOS_BUILD_ON)
cuda_add_library(PHY_NR ${PHY_NR_SRC} ${PHY_NR_SRC_CU})
else()
add_library(PHY_NR ${PHY_NR_SRC})
endif()
add_library(PHY_NR ${PHY_NR_SRC})
target_link_libraries(PHY_NR nr_phy_common nr_common nr_fapi_p5)
add_library(PHY_NR_NO_AVX_256 ${PHY_NR_SRC})
@@ -1238,6 +1215,7 @@ set (MAC_SRC
set (MAC_NR_SRC
${NR_PHY_INTERFACE_DIR}/NR_IF_Module.c
${NR_PHY_INTERFACE_DIR}/nr_sched_response.c
${NR_GNB_MAC_DIR}/main.c
${NR_GNB_MAC_DIR}/config.c
${NR_GNB_MAC_DIR}/gNB_scheduler.c
@@ -1305,6 +1283,12 @@ set (MISC_NFAPI_LTE
add_library(MISC_NFAPI_LTE_LIB ${MISC_NFAPI_LTE})
set (MISC_NFAPI_NR
${OPENAIR1_DIR}/SCHED/nfapi_nr_dummy.c
)
add_library(MISC_NFAPI_NR_LIB ${MISC_NFAPI_NR})
add_library(L2
${L2_SRC}
${MAC_SRC}
@@ -1313,9 +1297,6 @@ add_library(L2
)
target_link_libraries(L2 PRIVATE x2ap s1ap lte_rrc m2ap)
target_link_libraries(L2 PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
if(E2_AGENT)
target_compile_definitions(L2 PRIVATE ${E2AP_VERSION} ${KPM_VERSION} E2_AGENT)
endif()
add_library(MAC_UE_NR ${MAC_NR_SRC_UE})
target_link_libraries(MAC_UE_NR PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs PUBLIC nr_ue_power_procedures nr_ue_ra_procedures)
@@ -1331,9 +1312,6 @@ add_library(L2_NR
target_link_libraries(L2_NR PRIVATE ds alg)
target_link_libraries(L2_NR PRIVATE f1ap_lib)
target_include_directories(L2_NR PRIVATE ${F1AP_DIR}/lib)
if(E2_AGENT)
target_compile_definitions(L2_NR PRIVATE ${E2AP_VERSION} ${KPM_VERSION} E2_AGENT)
endif()
add_library(e1_if
${NR_RRC_DIR}/cucp_cuup_direct.c
@@ -1810,6 +1788,30 @@ target_link_libraries(lte-uesoftmodem PRIVATE ${blas_LIBRARIES} ${cblas_LIBRARIE
target_link_libraries(lte-uesoftmodem PRIVATE
asn1_lte_rrc asn1_s1ap asn1_m2ap asn1_m3ap asn1_x2ap)
# nr RRU
add_executable(oainr_ru
${OPENAIR_DIR}/executables/nr-ru.c
${OPENAIR_DIR}/openair1/PHY/INIT/nr_parms.c
${OPENAIR_DIR}/openair1/SCHED_NR/phy_frame_config_nr.c
${OPENAIR_DIR}/openair1/PHY/INIT/nr_parms.c
${OPENAIR_DIR}/openair1/SCHED_NR/nr_prach_procedures.c
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
${OPENAIR_DIR}/radio/COMMON/common_lib.c
${OPENAIR_DIR}/radio/COMMON/record_player.c
${OPENAIR_DIR}/executables/softmodem-common.c
${OPENAIR_DIR}/executables/main_nr_ru.c
${OPENAIR_DIR}/executables/nr-oru.c
)
target_link_libraries(oainr_ru PRIVATE
-Wl,--start-group
UTIL SCHED_RU_LIB PHY_COMMON PHY_RU shlib_loader
-Wl,--end-group z dl)
target_link_libraries(oainr_ru PRIVATE pthread m CONFIG_LIB rt ${T_LIB} utils
barrier actor)
target_link_libraries(oainr_ru PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs nr_phy_common time_management PHY_NR MAC_NR_COMMON PHY_NR_COMMON)
# nr-softmodem
###################################################
@@ -1965,21 +1967,13 @@ target_link_libraries(smallblocktest PRIVATE
)
#if (ENABLE_CUDA)
# find_package(CUDA REQUIRED)
# if (NOT CUDA_FOUND)
# message(FATAL_ERROR "no CUDA found")
# endif()
# cuda_add_library(ldpctest)
#else()
#endif()
add_executable(ldpctest
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_load.c
)
target_link_libraries(ldpctest PRIVATE
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON -Wl,--end-group
m pthread dl shlib_loader ${T_LIB} ${CUDA_LIBRARIES}
m pthread dl shlib_loader ${T_LIB}
# link 'check_crc' to make it resolved in the LDPC coding libraries
# 'check_crc' is not used in ldpctest so it is not linked in the executable by default
# --whole-archive links 'check_crc' in the executable even though it is note used, see 'man ld'
@@ -2121,7 +2115,7 @@ if (${T_TRACER})
oai_eth_transpro HASHTABLE UTIL
SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
MISC_NFAPI_LTE_LIB
MISC_NFAPI_LTE_LIB MISC_NFAPI_NR_LIB
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE MAC_NR_COMMON MAC_UE_NR ngap
GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE SIMU

233
ci-scripts/Jenkinsfile vendored
View File

@@ -1,233 +0,0 @@
#!/bin/groovy
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
def pythonExecutor = params.pythonExecutor
def testXMLFile = params.pythonTestXmlFile
def mainPythonAllXmlFiles = ""
def buildStageStatus = true
def JOB_TIMESTAMP
// Choose test stage name or fallback default
def testStageName = params.pipelineTestStageName != null ? params.pipelineTestStageName : 'Template Test Stage'
// Name of the resource
def lockResources = []
if (params.LockResources != null && params.LockResources.trim().length() > 0)
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
// Global Parameters. Normally they should be populated when the master job
// triggers the slave job with parameters
def sourceRepository = params.eNB_Repository ?: env.GIT_URL
def sourceBranch = params.eNB_Branch ?: env.GIT_BRANCH
def targetRepository = params.Target_Repository ?: sourceRepository
def targetBranch = params.eNB_TargetBranch ?: 'develop'
def commitID = params.eNB_CommitID ?: env.GIT_COMMIT
def is_MR = params.eNB_mergeRequest ?: false
def flexricOption = ""
def runWithOC = false
//-------------------------------------------------------------------------------
// Pipeline start
pipeline {
agent {
label pythonExecutor
}
options {
timestamps()
ansiColor('xterm')
lock(extra: lockResources)
}
stages {
stage("Build Init") {
steps {
script {
echo '\u2705 \u001B[94mBuild Init\u001B[0m'
JOB_TIMESTAMP = sh(returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"').trim()
}
// update the build name and description
buildName "${params.eNB_MR}"
buildDescription "Branch : ${sourceBranch}"
}
}
stage ('Verify Parameters') {
steps {
script {
echo '\u2705 \u001B[94mVerify Parameters\u001B[0m'
def allParametersPresent = true
if (params.LockResources == null) {
echo "no LockResources given"
allParametersPresent = false
}
if (params.eNB_SourceCodePath == null) {
echo "no eNB_SourceCodePath given"
allParametersPresent = false
}
if (params.OC_Credentials != null) {
echo "This pipeline is configured to run with Opensift Cluster."
runWithOC = true
if (params.OC_ProjectName == null) {
echo "no OC_ProjectName given"
allParametersPresent = false
}
}
if (params.Flexric_Tag != null) {
echo "This pipeline is configured to run with a FlexRIC deployment."
echo "Appending FlexRicTag option to the list of options"
flexricOption = "--FlexRicTag=${params.Flexric_Tag}"
echo "Using new Flexric option: ${flexricOption}"
}
echo "CI executor node : ${pythonExecutor}"
echo "Source Repository : ${sourceRepository}"
echo "Source Branch : ${sourceBranch}"
echo "Target Repository : ${targetRepository}"
echo "Target Branch : ${targetBranch}"
echo "Commit ID : ${commitID}"
if (allParametersPresent) {
echo '\u2705 \u001B[94m All parameters are present\u001B[0m'
if (is_MR) {
sh "git fetch"
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${sourceBranch} --src-commit ${commitID} --target-branch ${targetBranch} --target-commit latest"
} else {
sh "git fetch"
sh "git checkout -f ${commitID}"
}
} else {
echo "\u274C Some parameters are missing"
sh "./ci-scripts/fail.sh"
}
}
}
}
stage ("Deploy and Test") {
steps {
script {
dir ('ci-scripts') {
echo "\u2705 \u001B[94m Deploy and Test: ${testStageName}\u001B[0m"
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
for (xmlFile in myXmlTestSuite) {
if (fileExists(xmlFile)) {
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
echo "Test XML file : ${xmlFile}"
} else {
echo "Test XML file ${xmlFile}: no such file"
}
}
sh """
python3 main.py --mode=InitiateHtml --ranRepository=${targetRepository} \
--ranBranch=${sourceBranch} --ranCommitID=${commitID} \
--ranAllowMerge=${is_MR} --ranTargetBranch=${targetBranch} \
${flexricOption} ${mainPythonAllXmlFiles}
"""
if (runWithOC) {
withCredentials([usernamePassword(credentialsId: "${params.OC_Credentials}", usernameVariable: 'OC_Username', passwordVariable: 'OC_Password')]) {
sh """
python3 main.py --mode=InitiateHtml --ranRepository=${targetRepository} \
--ranBranch=${sourceBranch} --ranCommitID=${commitID} \
--ranAllowMerge=${is_MR} --ranTargetBranch=${targetBranch} \
${flexricOption} ${mainPythonAllXmlFiles}
"""
for (xmlFile in myXmlTestSuite) {
if (fileExists(xmlFile)) {
try {
timeout (time: 60, unit: 'MINUTES') {
sh """
python3 main.py --mode=TesteNB --ranRepository=${targetRepository} \
--ranBranch=${sourceBranch} --ranCommitID=${commitID} \
--ranAllowMerge=${is_MR} --ranTargetBranch=${targetBranch} \
--eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile} \
--OCUserName=${OC_Username} --OCPassword=${OC_Password} --OCProjectName=${OC_ProjectName} \
${flexricOption}
"""
}
} catch (Exception e) {
currentBuild.result = 'FAILURE'
buildStageStatus = false
}
}
}
}
} else {
for (xmlFile in myXmlTestSuite) {
if (fileExists(xmlFile)) {
try {
timeout (time: 60, unit: 'MINUTES') {
sh """
python3 main.py --mode=TesteNB --ranRepository=${targetRepository} \
--ranBranch=${sourceBranch} --ranCommitID=${commitID} \
--ranAllowMerge=${is_MR} --ranTargetBranch=${targetBranch} \
--eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile} \
${flexricOption}
"""
}
} catch (Exception e) {
currentBuild.result = 'FAILURE'
buildStageStatus = false
}
}
}
}
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
}
}
}
}
stage ("Log Collection") {
steps {
script {
echo '\u2705 \u001B[94mLog Collection\u001B[0m'
dir ('ci-scripts') {
// Zipping all archived log files
sh "mkdir test_logs"
sh "mv *.log* test_logs || true"
// Zip all log files matching cmake_targets/{*.log*,log/*} into test_logs_XXXX.zip
if (fileExists('../cmake_targets/log')) {
sh "mv ../cmake_targets/log/* test_logs || true"
}
sh "zip -r -qq test_logs_${env.BUILD_ID}.zip *test_log*/"
sh "rm -rf *test_log*/"
if (fileExists("test_logs_${env.BUILD_ID}.zip")) {
archiveArtifacts artifacts: "test_logs_${env.BUILD_ID}.zip"
}
if (fileExists("test_results.html")) {
def reportName = "test_results-${env.JOB_NAME}.html"
sh "mv test_results.html ${reportName}"
sh """
sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' \
-e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' \
-e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' \
-e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' \
-e 's#TEMPLATE_STAGE_NAME#${testStageName}#' ${reportName}
"""
archiveArtifacts artifacts: "${reportName}"
}
}
}
}
}
}
}

View File

@@ -380,29 +380,6 @@ pipeline {
}
}
}
stage ("VRT-Sim-Test-5G") {
when { expression {do5Gtest || do5GUeTest} }
steps {
script {
triggerSlaveJob ('RAN-VRT-Sim-Test-5G', 'VRT-Sim-Test-5G')
}
}
post {
always {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
vrtSim5GStatus = finalizeSlaveJob('RAN-VRT-Sim-Test-5G')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += vrtSim5GStatus
}
}
}
}
stage ("RF-Sim-Test-5G") {
when { expression {do5Gtest || do5GUeTest} }
steps {

View File

@@ -43,6 +43,10 @@ import constants as CONST
def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
py_param_file_present = False
py_params={}
force_local = False
while len(argvs) > 1:
myArgv = argvs.pop(1) # 0th is this file's name
@@ -168,4 +172,4 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
HELP.GenericHelp(CONST.Version)
sys.exit('Invalid Parameter: ' + myArgv)
return mode, force_local
return py_param_file_present, py_params, mode, force_local

View File

@@ -397,9 +397,9 @@ class Cluster:
# Analyze the logs
collectInfo = {}
for image, lf in log_files:
imgStatus, errors = cls_containerize.AnalyzeBuildLogs(image, lf)
info = f"Analysis of {os.path.basename(lf)}: {imgStatus=}, size {imageSize[image]}, {len(errors)} errors"
msg = "\n".join([info] + errors)
ret = cls_containerize.AnalyzeBuildLogs(image, lf)
imgStatus = ret['status']
msg = f"size {imageSize[image]}, analysis of {os.path.basename(lf)}: {ret['errors']} errors, {ret['warnings']} warnings"
HTML.CreateHtmlTestRowQueue(image, 'OK' if imgStatus else 'KO', [msg])
status = status and imgStatus

View File

@@ -47,7 +47,6 @@ import helpreadme as HELP
import constants as CONST
import cls_oaicitest
from cls_ci_helper import archiveArtifact
from collections import deque
#-----------------------------------------------------------
# Helper functions used here and in other classes
@@ -86,9 +85,9 @@ def CreateTag(ranCommitID, ranBranch, ranAllowMerge):
return tagToUse
def AnalyzeBuildLogs(image, lf):
errorandwarnings = {}
committed = False
tagged = False
errors = []
with open(lf, mode='r') as inputfile:
for line in inputfile:
lineHasTag = re.search(f'Successfully tagged {image}:', str(line)) is not None
@@ -97,13 +96,11 @@ def AnalyzeBuildLogs(image, lf):
# the OpenShift Cluster builder prepends image registry URL
lineHasCommit = re.search(r'COMMIT [a-zA-Z0-9\.:/\-]*' + image, str(line)) is not None
committed = committed or lineHasCommit
if re.search(r'error:|Errors|ERROR', line):
errors.append(f"=> {line.strip()}")
status = (committed or tagged) and len(errors) == 0
logging.info(f"Analyzing {image}, file {lf}: {status=}, {len(errors)} errors")
for e in errors:
logging.info(e)
return status, errors
errorandwarnings['errors'] = 0 if committed or tagged else 1
errorandwarnings['warnings'] = 0
errorandwarnings['status'] = committed or tagged
logging.info(f"Analyzing {image}, file {lf}: {errorandwarnings}")
return errorandwarnings
def GetImageName(ssh, svcName, file):
ret = ssh.run(f"docker compose -f {file} config --format json {svcName} | jq -r '.services.\"{svcName}\".image'", silent=True)
@@ -168,26 +165,25 @@ def CopyinServiceLog(ssh, lSourcePath, svcName, wd_yaml, ctx):
ssh.run(f'docker compose -f {wd_yaml} logs {svcName} --no-log-prefix &> {remote_filename}')
return archiveArtifact(ssh, ctx, remote_filename)
def GetDeployedServices(ssh, file):
def GetRunningServices(ssh, file):
ret = ssh.run(f'docker compose -f {file} config --services')
if ret.returncode != 0:
logging.error("could not get services")
return None
allServices = ret.stdout.splitlines()
deployed_services = []
running_services = []
for s in allServices:
# outputs the hash if the container has been deployed (but might be stopped)
ret = ssh.run(f'docker compose -f {file} ps --all --quiet -- {s}', silent=True)
# outputs the hash if the container is running
ret = ssh.run(f'docker compose -f {file} ps --all --quiet -- {s}')
if ret.returncode != 0:
# error: should not happen as we iterate over docker-provided service list
logging.error(f"service {s}: {ret.stdout}")
logging.info(f"service {s}: {ret.stdout}")
elif ret.stdout == "":
logging.info(f"service {s} not deployed")
logging.warning(f"could not retrieve information for service {s}")
else:
c = ret.stdout
logging.info(f'service {s} with container id {c}')
deployed_services.append(s)
return deployed_services
logging.debug(f'running service {s} with container id {c}')
running_services.append((s, c))
logging.info(f'stopping services: {running_services}')
return running_services
def CheckLogs(self, filename, HTML, RAN):
success = True
@@ -219,24 +215,6 @@ def CheckLogs(self, filename, HTML, RAN):
else:
HTML.CreateHtmlTestRowQueue(opt, 'OK', [HTML.htmleNBFailureMsg])
HTML.htmleNBFailureMsg = ""
elif 'xapp' in name:
opt = f"Undeploy {name}"
with open(f'{filename}', "r") as f:
last_line = deque(f, maxlen=1).pop()
if ('Test xApp run SUCCESSFULLY' in last_line):
HTML.CreateHtmlTestRowQueue(opt, 'OK', ["xApp run successfully"])
else:
HTML.CreateHtmlTestRowQueue(opt, 'KO', ["xApp didn't run successfully"])
success = False
elif 'RIC' in name:
opt = f"Undeploy {name}"
with open(f'{filename}', 'r') as f:
last_line = deque(f, maxlen=1).pop()
if ('Removing E2 Node' in last_line):
HTML.CreateHtmlTestRowQueue(opt, 'OK', ["nearRT-RIC run successfully"])
else:
HTML.CreateHtmlTestRowQueue(opt, 'KO', ["nearRT-RIC didn't run successfully"])
success = False
else:
logging.info(f"Skipping analysis of log '{filename}': no submatch for xNB/UE")
logging.debug(f"log check: file {filename} passed analysis {success}")
@@ -462,9 +440,9 @@ class Containerize():
# Analyze the logs
for name, lf in log_files:
imgStatus, errors = AnalyzeBuildLogs(name, lf)
info = f"Analysis of {os.path.basename(lf)}: {imgStatus=}, size {allImagesSize[name]}, {len(errors)} errors"
msg = "\n".join([info] + errors)
ret = AnalyzeBuildLogs(name, lf)
imgStatus = ret['status']
msg = f"size {allImagesSize[name]}, analysis of {os.path.basename(lf)}: {ret['errors']} errors, {ret['warnings']} warnings"
HTML.CreateHtmlTestRowQueue(name, 'OK' if imgStatus else 'KO', [msg])
status = status and imgStatus
@@ -737,6 +715,7 @@ class Containerize():
def DeployObject(self, ctx, node, HTML):
num_attempts = self.num_attempts
lSourcePath = self.eNBSourceCodePath
logging.debug(f'Deploying OAI Object on server: {node}')
yaml = self.yamlPath.strip('/')
wd = f'{lSourcePath}/{yaml}'
wd_yaml = f'{wd}/docker-compose.y*ml'
@@ -747,7 +726,6 @@ class Containerize():
logging.error(msg)
HTML.CreateHtmlTestRowQueue('N/A', 'KO', [msg])
return False
logging.info(f'\u001B[1mDeploying object(s) "{services}" on server {node}\u001B[0m')
ExistEnvFilePrint(ssh, wd)
WriteEnvFile(ssh, services, wd, self.deploymentTag, self.flexricTag)
if num_attempts <= 0:
@@ -772,68 +750,36 @@ class Containerize():
imagesInfo = info.stdout.splitlines()[1:]
logging.debug(f'{info.stdout.splitlines()[1:]}')
if deployed:
HTML.CreateHtmlTestRowQueue(self.services, 'OK', ['\n'.join(imagesInfo)])
logging.info('\u001B[1m Deploying objects Pass\u001B[0m')
HTML.CreateHtmlTestRowQueue('N/A', 'OK', ['\n'.join(imagesInfo)])
else:
HTML.CreateHtmlTestRowQueue(self.services, 'KO', ['\n'.join(imagesInfo)])
logging.error('\u001B[1m Deploying objects Failed\u001B[0m')
HTML.CreateHtmlTestRowQueue('N/A', 'KO', ['\n'.join(imagesInfo)])
return deployed
def StopObject(self, ctx, node, HTML):
lSourcePath = self.eNBSourceCodePath
if not self.services:
raise ValueError(f'no services provided')
logging.info(f'\u001B[1m Stopping objects "{self.services}" from server: {node}\u001B[0m')
reqServices = self.services.split()
yaml = self.yamlPath.strip('/')
wd = f'{lSourcePath}/{yaml}'
wd_yaml = f'{wd}/docker-compose.y*ml'
with cls_cmd.getConnection(node) as ssh:
ExistEnvFilePrint(ssh, wd)
services = GetDeployedServices(ssh, wd_yaml)
success = []
fail = []
for s in reqServices:
if s in services:
ssh.run(f'docker compose -f {wd_yaml} stop -- {s}')
success.append(s)
else:
logging.error(f"no such service {s}")
fail.append(s)
if success == reqServices:
logging.info('\u001B[1m Stopping object Pass\u001B[0m')
HTML.CreateHtmlTestRowQueue(self.services, 'OK', [f'Stopped {self.services}'])
else:
logging.error('\u001B[1m Stopping object Failed\u001B[0m')
HTML.CreateHtmlTestRowQueue(self.services, 'KO', [f'Failed stopping {" ".join(fail)}, succeeded {" ".join(success)}'])
return success
def UndeployObject(self, ctx, node, HTML, RAN):
lSourcePath = self.eNBSourceCodePath
logging.info(f'\u001B[1m Undeploying all objects from server {node}\u001B[0m')
logging.debug(f'\u001B[1m Undeploying OAI Object from server: {node}\u001B[0m')
yaml = self.yamlPath.strip('/')
wd = f'{lSourcePath}/{yaml}'
wd_yaml = f'{wd}/docker-compose.y*ml'
with cls_cmd.getConnection(node) as ssh:
ExistEnvFilePrint(ssh, wd)
services = GetDeployedServices(ssh, wd_yaml)
services = GetRunningServices(ssh, f"{wd}/docker-compose.y*ml")
copyin_res = None
ssh.run(f'docker compose -f {wd_yaml} stop')
if services is not None:
copyin_res = [CopyinServiceLog(ssh, lSourcePath, s, wd_yaml, ctx) for s in services]
all_serv = " ".join([s for s, _ in services])
ssh.run(f'docker compose -f {wd}/docker-compose.y*ml stop -- {all_serv}')
copyin_res = [CopyinServiceLog(ssh, lSourcePath, s, f"{wd}/docker-compose.y*ml", ctx) for s, _ in services]
else:
logging.warning('could not identify services to stop => no log file')
ssh.run(f'docker compose -f {wd_yaml} down -v')
ssh.run(f'docker compose -f {wd}/docker-compose.y*ml down -v')
ssh.run(f'rm {wd}/.env')
if not copyin_res:
HTML.CreateHtmlTestRowQueue('N/A', 'KO', ['Could not copy logfile(s)'])
logging.error(f"could not copy all files: {copyin_res=} {services=}")
success = False
return False
else:
log_results = [CheckLogs(self, f, HTML, RAN) for f in copyin_res]
success = all(log_results)
if success:
logging.info('\u001B[1m Undeploying objects Pass\u001B[0m')
logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m')
else:
logging.error('\u001B[1m Undeploying objects Failed\u001B[0m')
logging.error('\u001B[1m Undeploying OAI Object Failed\u001B[0m')
return success

View File

@@ -111,7 +111,7 @@ class Module_UE:
return self._collectTrace(ctx)
return None
def attach(self, attach_tries = 3, attach_timeout = 40):
def attach(self, attach_tries = 4, attach_timeout = 60):
ip = None
while attach_tries > 0:
self._command(self.cmd_dict["attach"])
@@ -125,7 +125,6 @@ class Module_UE:
if ip:
break
logging.warning(f"UE did not receive IP address after {attach_timeout} s, detaching")
attach_timeout += 20
attach_tries -= 1
self._command(self.cmd_dict["detach"])
time.sleep(5)

View File

@@ -233,10 +233,10 @@ def Custom_Command(HTML, node, command):
HTML.CreateHtmlTestRowQueue(command, status, message)
return status == 'OK' or status == 'Warning'
def Custom_Script(HTML, node, script, args):
def Custom_Script(HTML, node, script):
logging.info(f"Executing custom script on {node}")
with cls_cmd.getConnection(node) as c:
ret = c.exec_script(script, 90, args)
ret = c.exec_script(script, 90)
logging.debug(f"Custom_Script: {script} on node: {node} - return code {ret.returncode}, output:\n{ret.stdout}")
status = 'OK'
message = [ret.stdout]
@@ -299,16 +299,18 @@ class OaiCiTest():
self.iperf_packetloss_threshold = ''
self.iperf_bitrate_threshold = ''
self.iperf_profile = ''
self.iperf_options = ''
self.iperf_tcp_rate_target = ''
self.finalStatus = False
self.air_interface=''
self.ue_ids = []
self.nodes = []
self.svr_node = None
self.svr_id = None
self.cmd_prefix = '' # prefix before {lte,nr}-uesoftmodem
def InitializeUE(self, node, HTML):
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
def InitializeUE(self, HTML):
ues = [cls_module.Module_UE(n.strip()) for n in self.ue_ids]
messages = []
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
futures = [executor.submit(ue.initialize) for ue in ues]
@@ -319,8 +321,8 @@ class OaiCiTest():
HTML.CreateHtmlTestRowQueue('N/A', 'OK', messages)
return True
def AttachUE(self, node, HTML):
ues = [cls_module.Module_UE(ue_id, node) for ue_id in self.ue_ids]
def AttachUE(self, HTML):
ues = [cls_module.Module_UE(ue_id, server_name) for ue_id, server_name in zip(self.ue_ids, self.nodes)]
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
futures = [executor.submit(ue.attach) for ue in ues]
attached = [f.result() for f in futures]
@@ -335,8 +337,8 @@ class OaiCiTest():
HTML.CreateHtmlTestRowQueue('N/A', 'KO', ["Could not retrieve UE IP address(es) or MTU(s) wrong!"])
return success
def DetachUE(self, node, HTML):
ues = [cls_module.Module_UE(ue_id, node) for ue_id in self.ue_ids]
def DetachUE(self, HTML):
ues = [cls_module.Module_UE(ue_id, server_name) for ue_id, server_name in zip(self.ue_ids, self.nodes)]
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
futures = [executor.submit(ue.detach) for ue in ues]
[f.result() for f in futures]
@@ -344,8 +346,8 @@ class OaiCiTest():
HTML.CreateHtmlTestRowQueue('NA', 'OK', messages)
return True
def DataDisableUE(self, node, HTML):
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
def DataDisableUE(self, HTML):
ues = [cls_module.Module_UE(n.strip()) for n in self.ue_ids]
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
futures = [executor.submit(ue.dataDisable) for ue in ues]
status = [f.result() for f in futures]
@@ -358,8 +360,8 @@ class OaiCiTest():
HTML.CreateHtmlTestRowQueue('N/A', 'KO', ["Could not disable UE data!"])
return success
def DataEnableUE(self, node, HTML):
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
def DataEnableUE(self, HTML):
ues = [cls_module.Module_UE(n.strip()) for n in self.ue_ids]
logging.debug(f'disabling data for UEs {ues}')
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
futures = [executor.submit(ue.dataEnable) for ue in ues]
@@ -373,8 +375,8 @@ class OaiCiTest():
HTML.CreateHtmlTestRowQueue('N/A', 'KO', ["Could not enable UE data!"])
return success
def CheckStatusUE(self, node, HTML):
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
def CheckStatusUE(self,HTML):
ues = [cls_module.Module_UE(n.strip()) for n in self.ue_ids]
logging.debug(f'checking status of UEs {ues}')
messages = []
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
@@ -444,10 +446,10 @@ class OaiCiTest():
return (True, message)
def Ping(self, ctx, node, HTML, infra_file="ci_infra.yaml"):
def Ping(self, ctx, HTML, infra_file="ci_infra.yaml"):
if self.ue_ids == [] or self.svr_id == None:
raise Exception("no module names in self.ue_ids or/and self.svr_id provided")
ues = [cls_module.Module_UE(ue_id, node, infra_file) for ue_id in self.ue_ids]
ues = [cls_module.Module_UE(ue_id, server_name, infra_file) for ue_id, server_name in zip(self.ue_ids, self.nodes)]
cn = cls_corenetwork.CoreNetwork(self.svr_id, self.svr_node, filename=infra_file)
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
futures = [executor.submit(self.Ping_common, ctx, cn, ue) for ue in ues]
@@ -518,12 +520,12 @@ class OaiCiTest():
return (status, f'{ue_header}\n{msg}')
def Iperf(self, ctx, node, HTML, infra_file="ci_infra.yaml"):
logging.debug(f'Iperf: iperf_args "{self.iperf_args}" iperf_packetloss_threshold "{self.iperf_packetloss_threshold}" iperf_bitrate_threshold "{self.iperf_bitrate_threshold}" iperf_profile "{self.iperf_profile}"')
def Iperf(self, ctx, HTML, infra_file="ci_infra.yaml"):
logging.debug(f'Iperf: iperf_args "{self.iperf_args}" iperf_packetloss_threshold "{self.iperf_packetloss_threshold}" iperf_bitrate_threshold "{self.iperf_bitrate_threshold}" iperf_profile "{self.iperf_profile}" iperf_options "{self.iperf_options}"')
if self.ue_ids == [] or self.svr_id == None:
raise Exception("no module names in self.ue_ids or/and self.svr_id provided")
ues = [cls_module.Module_UE(ue_id, node, infra_file) for ue_id in self.ue_ids]
ues = [cls_module.Module_UE(ue_id, server_name, infra_file) for ue_id, server_name in zip(self.ue_ids, self.nodes)]
cn = cls_corenetwork.CoreNetwork(self.svr_id, self.svr_node, filename=infra_file)
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
futures = [executor.submit(self.Iperf_Module, ctx, cn, ue, i, len(ues)) for i, ue in enumerate(ues)]
@@ -547,10 +549,10 @@ class OaiCiTest():
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'KO', messages)
return success
def Iperf2_Unidir(self, ctx, node, HTML, infra_file="ci_infra.yaml"):
def Iperf2_Unidir(self, ctx, HTML, infra_file="ci_infra.yaml"):
if self.ue_ids == [] or self.svr_id == None or len(self.ue_ids) != 1:
raise Exception("no module names in self.ue_ids or/and self.svr_id provided, multi UE scenario not supported")
ue = cls_module.Module_UE(self.ue_ids[0].strip(), node, infra_file)
ue = cls_module.Module_UE(self.ue_ids[0].strip(),self.nodes[0].strip(), infra_file)
cn = cls_corenetwork.CoreNetwork(self.svr_id, self.svr_node, filename=infra_file)
ueIP = ue.getIP()
if not ueIP:
@@ -850,8 +852,8 @@ class OaiCiTest():
global_status = CONST.OAI_UE_PROCESS_COULD_NOT_SYNC
return global_status
def TerminateUE(self, ctx, node, HTML):
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
def TerminateUE(self, ctx, HTML):
ues = [cls_module.Module_UE(n.strip()) for n in self.ue_ids]
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
futures = [executor.submit(ue.terminate, ctx) for ue in ues]
archives = [f.result() for f in futures]

View File

@@ -53,7 +53,7 @@ security = {
# preferred ciphering algorithms
# the first one of the list that an UE supports in chosen
# valid values: nea0, nea1, nea2, nea3
ciphering_algorithms = ( "nea2", "nea0" );
ciphering_algorithms = ( "nea0" );
# preferred integrity algorithms
# the first one of the list that an UE supports in chosen
@@ -63,7 +63,7 @@ security = {
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
drb_ciphering = "yes";
drb_integrity = "yes";
drb_integrity = "no";
};
log_config :

View File

@@ -146,11 +146,7 @@ gNBs =
);
first_active_bwp = 1;
bwp_list = (
{ scs = 1; bwpStart = 0; bwpSize = 106;},
{ scs = 1; bwpStart = 0; bwpSize = 36;},
{ scs = 1; bwpStart = 36; bwpSize = 70;}
);
bwp_list = ({ scs = 1; bwpStart = 0; bwpSize = 106;});
# ------- SCTP definitions
SCTP :

View File

@@ -32,7 +32,7 @@ gNBs =
pdsch_AntennaPorts_N1 = 2;
pusch_AntennaPorts = 2;
do_CSIRS = 1;
do_SRS = 1;
do_SRS = 0;
min_rxtxtime = 2;
servingCellConfigCommon = (
@@ -155,7 +155,7 @@ gNBs =
nrofUplinkSlots = 3; #1;
nrofUplinkSymbols = 0;
ssPBCH_BlockPower = -15;
ssPBCH_BlockPower = -25;
}
);
@@ -176,8 +176,8 @@ gNBs =
NETWORK_INTERFACES :
{
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.53";
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.53";
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.202";
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.202";
GNB_PORT_FOR_S1U = 2152; # Spec 2152
};
@@ -195,7 +195,7 @@ MACRLCs = (
remote_s_portd = 50010; // pnf p7 port [!]
tr_s_preference = "aerial";
tr_n_preference = "local_RRC";
pusch_TargetSNRx10 = 280; # 150;
pusch_TargetSNRx10 = 200; # 150;
pucch_TargetSNRx10 = 200; #200;
dl_max_mcs = 28;
ul_max_mcs = 28;

View File

@@ -24,9 +24,9 @@ gNBs =
pdsch_AntennaPorts_N1 = 2;
pusch_AntennaPorts = 2;
do_CSIRS = 1;
do_SRS = 1;
do_SRS = 0;
min_rxtxtime = 2;
force_UL256qam_off = 1;
servingCellConfigCommon = (
{
#spCellConfigCommon
@@ -168,8 +168,8 @@ gNBs =
NETWORK_INTERFACES :
{
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.53";
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.53";
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.202";
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.202";
GNB_PORT_FOR_S1U = 2152; # Spec 2152
};
@@ -187,7 +187,7 @@ MACRLCs = (
remote_s_portd = 50010; // pnf p7 port [!]
tr_s_preference = "aerial";
tr_n_preference = "local_RRC";
pusch_TargetSNRx10 = 260; # 150;
pusch_TargetSNRx10 = 220; # 150;
pucch_TargetSNRx10 = 200; #200;
dl_max_mcs = 28;
ul_max_mcs = 28;

View File

@@ -195,7 +195,6 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 50;
eNB_instances = [0];
sl_ahead = 3;
sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
}
);

View File

@@ -172,7 +172,7 @@ MACRLCs = ({
tr_n_preference = "local_RRC";
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200;
set_analog_beamforming = 2;
set_analog_beamforming = 1;
beam_duration = 1;
beams_per_period = 1;
beam_weights = [0]; // single SSB -> one analog beam

View File

@@ -209,7 +209,7 @@ security = {
# preferred ciphering algorithms
# the first one of the list that an UE supports in chosen
# valid values: nea0, nea1, nea2, nea3
ciphering_algorithms = ( "nea2", "nea0" );
ciphering_algorithms = ( "nea0" );
# preferred integrity algorithms
# the first one of the list that an UE supports in chosen
@@ -219,7 +219,7 @@ security = {
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
drb_ciphering = "yes";
drb_integrity = "yes";
drb_integrity = "no";
};
log_config :

View File

@@ -1,209 +0,0 @@
Active_gNBs:
- gnb-rfsim
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity: none
gNBs:
##### Identification parameters:
- gNB_ID: 0xe00
gNB_name: gnb-rfsim
tracking_area_code: 1
plmn_list:
- mcc: 208
mnc: 99
mnc_length: 2
snssaiList:
- sst: 1
sd: 0xffffff
nr_cellid: 12345678
##### Physical parameters:
min_rxtxtime: 6
pusch_AntennaPorts: 2
pdsch_AntennaPorts_XP: 2
servingCellConfigCommon:
#spCellConfigCommon
- physCellId: 0
# downlinkConfigCommon
#frequencyInfoDL
# this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
absoluteFrequencySSB: 621312
# this is 3300.60 MHz
dl_absoluteFrequencyPointA: 620040
#scs-SpecificCarrierList
dl_offstToCarrier: 0
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing: 1
dl_carrierBandwidth: 106
#initialDownlinkBWP
#genericParameters
# this is RBstart=0,L=106 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth: 28875
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing: 1
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero: 11
initialDLBWPsearchSpaceZero: 0
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand: 78
#scs-SpecificCarrierList
ul_offstToCarrier: 0
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing: 1
ul_carrierBandwidth: 106
pMax: 20
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth: 28875
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing: 1
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex: 98
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM: 0
prach_msg1_FrequencyStart: 0
zeroCorrelationZoneConfig: 12
preambleReceivedTargetPower: -104
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax: 6
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep: 1
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR: 4
#one (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB: 15
#ra_ContentionResolutionTimer
#(0..7) 8,16,24,32,40,48,56,64
ra_ContentionResolutionTimer: 7
rsrp_ThresholdSSB: 19
#prach-RootSequenceIndex_PR
#1 = 839, 2 = 139
prach_RootSequenceIndex_PR: 2
prach_RootSequenceIndex: 1
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
msg1_SubcarrierSpacing: 1
# restrictedSetConfig
# 0=unrestricted, 1=restricted type A, 2=restricted type B
restrictedSetConfig: 0
msg3_DeltaPreamble: 1
p0_NominalWithGrant: -90
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping: 0
hoppingId: 40
p0_nominal: -90
ssb_PositionsInBurst_Bitmap: 1
# ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
ssb_periodicityServingCell: 2
# dmrs_TypeA_position
# 0 = pos2, 1 = pos3
dmrs_TypeA_Position: 0
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
subcarrierSpacing: 1
#tdd-UL-DL-ConfigurationCommon
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
referenceSubcarrierSpacing: 1
# pattern1
# dl_UL_TransmissionPeriodicity
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
dl_UL_TransmissionPeriodicity: 6
nrofDownlinkSlots: 7
nrofDownlinkSymbols: 6
nrofUplinkSlots: 2
nrofUplinkSymbols: 4
ssPBCH_BlockPower: -25
SCTP:
SCTP_INSTREAMS: 2
SCTP_OUTSTREAMS: 2
##### AMF parameters:
amf_ip_address:
- ipv4: 192.168.71.132
NETWORK_INTERFACES:
GNB_IPV4_ADDRESS_FOR_NG_AMF: 192.168.71.140
GNB_IPV4_ADDRESS_FOR_NGU: 192.168.71.140
GNB_PORT_FOR_S1U: 2152 # Spec 2152
MACRLCs:
- num_cc: 1
tr_s_preference: local_L1
tr_n_preference: local_RRC
pusch_TargetSNRx10: 200
pucch_TargetSNRx10: 200
L1s:
- num_cc: 1
tr_n_preference: local_mac
prach_dtx_threshold: 200
# pucch0_dtx_threshold = 150;
RUs:
- local_rf: yes
nb_tx: 2
nb_rx: 2
att_tx: 0
att_rx: 0
bands: [78]
max_pdschReferenceSignalPower: -27
max_rxgain: 75
eNB_instances: [0]
sf_extension: 0
security:
# preferred ciphering algorithms
# the first one of the list that an UE supports in chosen
# valid values: nea0, nea1, nea2, nea3
ciphering_algorithms: [nea0]
# preferred integrity algorithms
# the first one of the list that an UE supports in chosen
# valid values: nia0, nia1, nia2, nia3
integrity_algorithms: [nia2, nia0]
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
drb_ciphering: yes
drb_integrity: no
log_config:
global_log_level: info
hw_log_level: info
phy_log_level: info
mac_log_level: info
rlc_log_level: info
pdcp_log_level: info
rrc_log_level: info
ngap_log_level: debug
f1ap_log_level: debug
channelmod:
max_chan: 10
modellist: DefaultChannelList
DefaultChannelList:
- model_name: server_tx_channel_model
type: AWGN
ploss_dB: 0
noise_power_dB: -100
forgetfact: 0
offset: 0
ds_tdl: 0

View File

@@ -1,89 +0,0 @@
PRSs =
(
{
Active_gNBs = 1;
prs_config0 = (
{
gNB_id = 0;
NumPRSResources = 1;
PRSResourceSetPeriod = [20, 2];
SymbolStart = [7];
NumPRSSymbols = [6];
NumRB = 106;
RBOffset = 0;
CombSize = 4;
REOffset = [0];
PRSResourceOffset = [0];
PRSResourceRepetition = 1;
PRSResourceTimeGap = 1;
NPRS_ID = [0];
MutingPattern1 = [];
MutingPattern2 = [];
MutingBitRepetition = 1;
}
);
prs_config1 = (
{
gNB_id = 1;
NumPRSResources = 1;
PRSResourceSetPeriod = [20, 2];
SymbolStart = [7];
NumPRSSymbols = [6];
NumRB = 106;
RBOffset = 0;
CombSize = 4;
REOffset = [0];
PRSResourceOffset = [1];
PRSResourceRepetition = 1;
PRSResourceTimeGap = 1;
NPRS_ID = [1];
MutingPattern1 = [];
MutingPattern2 = [];
MutingBitRepetition = 1;
}
);
prs_config2 = (
{
gNB_id = 2;
NumPRSResources = 1;
PRSResourceSetPeriod = [20, 2];
SymbolStart = [7];
NumPRSSymbols = [6];
NumRB = 106;
RBOffset = 0;
CombSize = 4;
REOffset = [0];
PRSResourceOffset = [2];
PRSResourceRepetition = 1;
PRSResourceTimeGap = 1;
NPRS_ID = [2];
MutingPattern1 = [];
MutingPattern2 = [];
MutingBitRepetition = 1;
}
);
prs_config3 = (
{
gNB_id = 3;
NumPRSResources = 1;
PRSResourceSetPeriod = [20, 2];
SymbolStart = [7];
NumPRSSymbols = [6];
NumRB = 106;
RBOffset = 0;
CombSize = 4;
REOffset = [0];
PRSResourceOffset = [3];
PRSResourceRepetition = 1;
PRSResourceTimeGap = 1;
NPRS_ID = [3];
MutingPattern1 = [];
MutingPattern2 = [];
MutingBitRepetition = 1;
}
);
}
);

View File

@@ -1,20 +0,0 @@
uicc0:
imsi: 208990100001100
key: fec86ba6eb707ed08905757b1bb44b8f
opc: C42449363BBAD02B66D16BC975D77CC1
dnn: oai
nssai_sst: 1
thread-pool: "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1"
channelmod:
max_chan: 10;
modellist: DefaultChannelList
DefaultChannelList:
- model_name: client_tx_channel_model
type: AWGN
ploss_dB: 0
noise_power_dB: -100
forgetfact: 0
offset: 0
ds_tdl: 0

View File

@@ -15,6 +15,7 @@ Ref :
DLSCH encoding : 200.0
L1 Rx processing : 530.0
PUSCH inner-receiver : 360.0
Schedule Response : 1.0
DL & UL scheduling timing : 17.0
UL Indication : 1.0
Slot Indication : 13.0
@@ -30,6 +31,7 @@ DeviationThreshold :
DLSCH encoding : 0.25
L1 Rx processing : 0.25
PUSCH inner-receiver : 0.25
Schedule Response : 1.00
DL & UL scheduling timing : 0.25
UL Indication : 1.00
Slot Indication : 0.50

View File

@@ -15,6 +15,7 @@ Ref :
DLSCH encoding : 110.0
L1 Rx processing : 345.0
PUSCH inner-receiver : 150.0
Schedule Response : 1.0
DL & UL scheduling timing : 5.0
UL Indication : 1.0
Slot Indication : 6.0
@@ -30,6 +31,7 @@ DeviationThreshold :
DLSCH encoding : 0.25
L1 Rx processing : 0.25
PUSCH inner-receiver : 0.25
Schedule Response : 1.00
DL & UL scheduling timing : 0.50
UL Indication : 1.00
Slot Indication : 0.50

View File

@@ -15,6 +15,7 @@ Ref :
DLSCH encoding : 230.0
L1 Rx processing : 175.0
PUSCH inner-receiver : 100.0
Schedule Response : 3.0
DL & UL scheduling timing : 11.0
UL Indication : 3.0
Slot Indication : 14.0
@@ -27,6 +28,7 @@ DeviationThreshold :
DLSCH encoding : 0.25
L1 Rx processing : 0.25
PUSCH inner-receiver : 0.25
Schedule Response : 1.00
DL & UL scheduling timing : 0.50
UL Indication : 1.00
Slot Indication : 0.25

View File

@@ -15,6 +15,7 @@ Ref :
DLSCH encoding : 140.0
L1 Rx processing : 345.0
PUSCH inner-receiver : 155.0
Schedule Response : 1.0
DL & UL scheduling timing : 8.0
UL Indication : 3.0
Slot Indication : 9.0
@@ -30,6 +31,7 @@ DeviationThreshold :
DLSCH encoding : 0.25
L1 Rx processing : 0.25
PUSCH inner-receiver : 0.25
Schedule Response : 1.00
DL & UL scheduling timing : 0.35
UL Indication : 1.00
Slot Indication : 0.35

View File

@@ -15,6 +15,7 @@ Ref :
DLSCH encoding : 90.0
L1 Rx processing : 290.0
PUSCH inner-receiver : 115.0
Schedule Response : 1.0
DL & UL scheduling timing : 4.0
UL Indication : 2.0
Slot Indication : 5.0
@@ -30,6 +31,7 @@ DeviationThreshold :
DLSCH encoding : 0.25
L1 Rx processing : 0.25
PUSCH inner-receiver : 0.25
Schedule Response : 1.00
DL & UL scheduling timing : 0.50
UL Indication : 1.00
Slot Indication : 0.50

View File

@@ -85,7 +85,15 @@ def CheckClassValidity(xml_class_list,action,id):
resp=True
return resp
def ExecuteActionWithParam(action, ctx, node):
#assigning parameters to object instance attributes (even if the attributes do not exist !!)
def AssignParams(params_dict):
for key,value in params_dict.items():
setattr(CiTestObj, key, value)
setattr(RAN, key, value)
setattr(HTML, key, value)
def ExecuteActionWithParam(action, ctx):
global RAN
global HTML
global CONTAINERS
@@ -94,6 +102,7 @@ def ExecuteActionWithParam(action, ctx, node):
if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy' or action == "Build_Cluster_Image" or action == "Build_Run_Tests":
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
CONTAINERS.imageKind=test.findtext('kind')
node = test.findtext('node')
proxy_commit = test.findtext('proxy_commit')
if proxy_commit is not None:
CONTAINERS.proxyCommit = proxy_commit
@@ -109,6 +118,7 @@ def ExecuteActionWithParam(action, ctx, node):
success = CONTAINERS.BuildRunTests(ctx, node, HTML)
elif action == 'Initialize_eNB':
node = test.findtext('node')
datalog_rt_stats_file=test.findtext('rt_stats_cfg')
if datalog_rt_stats_file is None:
RAN.datalog_rt_stats_file='datalog_rt_stats.default.yaml'
@@ -129,6 +139,7 @@ def ExecuteActionWithParam(action, ctx, node):
success = RAN.InitializeeNB(ctx, node, HTML)
elif action == 'Terminate_eNB':
node = test.findtext('node')
#retx checkers
string_field = test.findtext('d_retx_th')
if (string_field is not None):
@@ -147,35 +158,68 @@ def ExecuteActionWithParam(action, ctx, node):
elif action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Terminate_UE' or action == 'CheckStatusUE' or action == 'DataEnable_UE' or action == 'DataDisable_UE':
CiTestObj.ue_ids = test.findtext('id').split(' ')
if force_local:
# Change all execution targets to localhost
CiTestObj.nodes = ['localhost'] * len(CiTestObj.ue_ids)
else:
if test.findtext('nodes'):
CiTestObj.nodes = test.findtext('nodes').split(' ')
if len(CiTestObj.ue_ids) != len(CiTestObj.nodes):
logging.error('Number of Nodes are not equal to the total number of UEs')
sys.exit("Mismatch in number of Nodes and UIs")
else:
CiTestObj.nodes = [None] * len(CiTestObj.ue_ids)
if action == 'Initialize_UE':
success = CiTestObj.InitializeUE(node, HTML)
success = CiTestObj.InitializeUE(HTML)
elif action == 'Attach_UE':
success = CiTestObj.AttachUE(node, HTML)
success = CiTestObj.AttachUE(HTML)
elif action == 'Detach_UE':
success = CiTestObj.DetachUE(node, HTML)
success = CiTestObj.DetachUE(HTML)
elif action == 'Terminate_UE':
success = CiTestObj.TerminateUE(ctx, node, HTML)
success = CiTestObj.TerminateUE(ctx, HTML)
elif action == 'CheckStatusUE':
success = CiTestObj.CheckStatusUE(node, HTML)
success = CiTestObj.CheckStatusUE(HTML)
elif action == 'DataEnable_UE':
success = CiTestObj.DataEnableUE(node, HTML)
success = CiTestObj.DataEnableUE(HTML)
elif action == 'DataDisable_UE':
success = CiTestObj.DataDisableUE(node, HTML)
success = CiTestObj.DataDisableUE(HTML)
elif action == 'Ping':
CiTestObj.ping_args = test.findtext('ping_args')
CiTestObj.ping_packetloss_threshold = test.findtext('ping_packetloss_threshold')
CiTestObj.ue_ids = test.findtext('id').split(' ')
CiTestObj.svr_id = test.findtext('svr_id')
CiTestObj.svr_id = test.findtext('svr_id') or None
if test.findtext('svr_node'):
CiTestObj.svr_node = test.findtext('svr_node') if not force_local else 'localhost'
if force_local:
# Change all execution targets to localhost
CiTestObj.nodes = ['localhost'] * len(CiTestObj.ue_ids)
else:
if test.findtext('nodes'):
CiTestObj.nodes = test.findtext('nodes').split(' ')
if len(CiTestObj.ue_ids) != len(CiTestObj.nodes):
logging.error('Number of Nodes are not equal to the total number of UEs')
sys.exit("Mismatch in number of Nodes and UIs")
else:
CiTestObj.nodes = [None] * len(CiTestObj.ue_ids)
ping_rttavg_threshold = test.findtext('ping_rttavg_threshold') or ''
success = CiTestObj.Ping(ctx, node, HTML)
success = CiTestObj.Ping(ctx, HTML)
elif action == 'Iperf' or action == 'Iperf2_Unidir':
CiTestObj.iperf_args = test.findtext('iperf_args')
CiTestObj.ue_ids = test.findtext('id').split(' ')
CiTestObj.svr_id = test.findtext('svr_id')
CiTestObj.svr_id = test.findtext('svr_id') or None
if force_local:
# Change all execution targets to localhost
CiTestObj.nodes = ['localhost'] * len(CiTestObj.ue_ids)
else:
if test.findtext('nodes'):
CiTestObj.nodes = test.findtext('nodes').split(' ')
if len(CiTestObj.ue_ids) != len(CiTestObj.nodes):
logging.error('Number of Nodes are not equal to the total number of UEs')
sys.exit("Mismatch in number of Nodes and UIs")
else:
CiTestObj.nodes = [None] * len(CiTestObj.ue_ids)
if test.findtext('svr_node'):
CiTestObj.svr_node = test.findtext('svr_node') if not force_local else 'localhost'
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
@@ -185,10 +229,14 @@ def ExecuteActionWithParam(action, ctx, node):
if CiTestObj.iperf_profile != 'balanced' and CiTestObj.iperf_profile != 'unbalanced' and CiTestObj.iperf_profile != 'single-ue':
logging.error(f'test-case has wrong profile {CiTestObj.iperf_profile}, forcing balanced')
CiTestObj.iperf_profile = 'balanced'
CiTestObj.iperf_options = test.findtext('iperf_options') or 'check'
if CiTestObj.iperf_options != 'check' and CiTestObj.iperf_options != 'sink':
logging.error('test-case has wrong option ' + CiTestObj.iperf_options)
CiTestObj.iperf_options = 'check'
if action == 'Iperf':
success = CiTestObj.Iperf(ctx, node, HTML)
success = CiTestObj.Iperf(ctx, HTML)
elif action == 'Iperf2_Unidir':
success = CiTestObj.Iperf2_Unidir(ctx, node, HTML)
success = CiTestObj.Iperf2_Unidir(ctx, HTML)
elif action == 'IdleSleep':
st = test.findtext('idle_sleep_time_in_sec') or "5"
@@ -196,6 +244,7 @@ def ExecuteActionWithParam(action, ctx, node):
elif action == 'Deploy_Run_OC_PhySim':
oc_release = test.findtext('oc_release')
node = test.findtext('node') or None
script = "scripts/oc-deploy-physims.sh"
image_tag = cls_containerize.CreateTag(CLUSTER.ranCommitID, CLUSTER.ranBranch, CLUSTER.ranAllowMerge)
options = f"oaicicd-core-for-ci-ran {oc_release} {image_tag} {CLUSTER.eNBSourceCodePath}"
@@ -203,6 +252,7 @@ def ExecuteActionWithParam(action, ctx, node):
success = cls_oaicitest.Deploy_Physim(ctx, HTML, node, workdir, script, options)
elif action == 'Build_Deploy_Docker_PhySim' or action == 'Build_Deploy_Source_PhySim':
node = test.findtext('node') or None
ctest_opt = test.findtext('ctest-opt') or ''
script = "scripts/docker-build-and-deploy-physims.sh" if action == 'Build_Deploy_Docker_PhySim' else 'scripts/source-deploy-physims.sh'
options = f"{CONTAINERS.eNBSourceCodePath} {ctest_opt}"
@@ -214,7 +264,8 @@ def ExecuteActionWithParam(action, ctx, node):
core_op = getattr(cls_oaicitest.OaiCiTest, action)
success = core_op(cn_id, ctx, HTML)
elif action == 'Deploy_Object' or action == 'Undeploy_Object' or action == "Create_Workspace" or action == "Stop_Object":
elif action == 'Deploy_Object' or action == 'Undeploy_Object' or action == "Create_Workspace":
node = test.findtext('node')
CONTAINERS.yamlPath = test.findtext('yaml_path')
string_field=test.findtext('d_retx_th')
if (string_field is not None):
@@ -227,8 +278,6 @@ def ExecuteActionWithParam(action, ctx, node):
CONTAINERS.deploymentTag = cls_containerize.CreateTag(CONTAINERS.ranCommitID, CONTAINERS.ranBranch, CONTAINERS.ranAllowMerge)
if action == 'Deploy_Object':
success = CONTAINERS.DeployObject(ctx, node, HTML)
elif action == 'Stop_Object':
success = CONTAINERS.StopObject(ctx, node, HTML)
elif action == 'Undeploy_Object':
success = CONTAINERS.UndeployObject(ctx, node, HTML, RAN)
elif action == 'Create_Workspace':
@@ -238,12 +287,15 @@ def ExecuteActionWithParam(action, ctx, node):
success = CONTAINERS.Create_Workspace(node, HTML)
elif action == 'LicenceAndFormattingCheck':
node = test.findtext('node')
success = SCA.LicenceAndFormattingCheck(ctx, node, HTML)
elif action == 'Cppcheck_Analysis':
node = test.findtext('node')
success = SCA.CppCheckAnalysis(ctx, node, HTML)
elif action == 'Push_Local_Registry':
node = test.findtext('node')
tag_prefix = test.findtext('tag_prefix') or ""
success = CONTAINERS.Push_Image_to_Local_Registry(node, HTML, tag_prefix)
@@ -251,6 +303,7 @@ def ExecuteActionWithParam(action, ctx, node):
if force_local:
# Do not pull or remove images when running locally. User is supposed to handle image creation & cleanup
return True
node = test.findtext('node')
tag_prefix = test.findtext('tag_prefix') or ""
images = test.findtext('images').split()
# hack: for FlexRIC, we need to overwrite the tag to use
@@ -263,21 +316,26 @@ def ExecuteActionWithParam(action, ctx, node):
success = CONTAINERS.Clean_Test_Server_Images(HTML, node, images, tag=tag)
elif action == 'Custom_Command':
node = test.findtext('node')
if force_local:
# Change all execution targets to localhost
node = 'localhost'
command = test.findtext('command')
# Allow referencing repository workspace path in XML via %%workspace%%
command = command.replace("%%workspace%%", CONTAINERS.eNBSourceCodePath)
success = cls_oaicitest.Custom_Command(HTML, node, command)
elif action == 'Custom_Script':
node = test.findtext('node')
script = test.findtext('script')
args = test.findtext('args')
# Allow referencing repository workspace path in XML via %%workspace%%
script = script.replace("%%workspace%%", CONTAINERS.eNBSourceCodePath)
success = cls_oaicitest.Custom_Script(HTML, node, script, args)
success = cls_oaicitest.Custom_Script(HTML, node, script)
elif action == 'Pull_Cluster_Image':
tag_prefix = test.findtext('tag_prefix') or ""
images = test.findtext('images').split()
node = test.findtext('node')
success = CLUSTER.PullClusterImage(HTML, node, images, tag_prefix=tag_prefix)
else:
@@ -295,16 +353,8 @@ def test_in_list(test, list):
return True
return False
test_runner_abort = False
def receive_signal(signum, frame):
global test_runner_abort
if not test_runner_abort:
logging.warning("received signal, canceling steps")
logging.info("send signal again to exit immediately")
test_runner_abort = True
else:
logging.warning("received signal again, exiting")
sys.exit(1)
sys.exit(1)
def ShowTestID(ctx, desc):
logging.info(f'\u001B[1m----------------------------------------\u001B[0m')
@@ -349,7 +399,16 @@ CLUSTER = cls_cluster.Cluster()
import args_parse
# Force local execution, move all execution targets to localhost
force_local = False
mode, force_local = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER)
py_param_file_present, py_params, mode, force_local = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER)
#-----------------------------------------------------------
# TEMPORARY params management (UNUSED)
#-----------------------------------------------------------
#temporary solution for testing:
if py_param_file_present == True:
AssignParams(py_params)
#-----------------------------------------------------------
# mode amd XML class (action) analysis
@@ -495,7 +554,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
#logging.info('test will be run: ' + test)
todo_tests.append(test)
signal.signal(signal.SIGINT, receive_signal)
signal.signal(signal.SIGUSR1, receive_signal)
HTML.CreateHtmlTabHeader()
@@ -505,8 +564,6 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
i = 0
for test_case_id in todo_tests:
for test in all_tests:
if test_runner_abort:
task_set_succeeded = False
id = test.get('id')
if test_case_id != id:
continue
@@ -515,7 +572,6 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
ctx = TestCaseCtx(i, int(id), logPath)
HTML.testCase_id=CiTestObj.testCase_id
desc = test.findtext('desc')
node = test.findtext('node') if not force_local else 'localhost'
always_exec = test.findtext('always_exec') in ['True', 'true', 'Yes', 'yes']
may_fail = test.findtext('may_fail') in ['True', 'true', 'Yes', 'yes']
HTML.desc = desc
@@ -530,7 +586,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
HTML.CreateHtmlTestRowQueue(msg, "SKIP", [])
break
try:
test_succeeded = ExecuteActionWithParam(action, ctx, node)
test_succeeded = ExecuteActionWithParam(action, ctx)
if not test_succeeded and may_fail:
logging.warning(f"test ID {test_case_id} action {action} may or may not fail, proceeding despite error")
elif not test_succeeded:

View File

@@ -1,89 +0,0 @@
#!/bin/bash
[[ $# -lt 1 ]] && { echo "Usage: $0 <distance_in_meters...>"; exit 1; }
DISTANCES=("$@")
IP=192.168.71.150
PORT=8091
NCAT_TIMEOUT=1 #s
SLEEP_WAIT=4 #s
MAX_RETRIES=3
set_and_verify_distance() {
local distance=$1
echo "Testing PRS ToA estimation for distance: $distance m"
# it seems that grep returns immediately with this syntax, but not echo | ncat | grep
# so prefer this to receive new distance immediately. We use --idle to keep
# ncat open for some additional time
local setdist_resp="$(grep --max-count 1 new_offset <(echo rfsimu setdistance rfsimu_channel_enB0 $distance | ncat --idle ${NCAT_TIMEOUT} ${IP} ${PORT}))"
echo "> response: ${setdist_resp}"
local gettoa_resp="$(echo "ciUE get_max_dl_toa" | ncat ${IP} ${PORT} | grep "UE max PRS DL ToA")"
echo "> response: ${gettoa_resp}"
[[ -z "$setdist_resp" || -z "$gettoa_resp" ]] && return 1
# Extract ToA values
[[ "$setdist_resp" =~ new_offset\ ([0-9]+) ]] && local set_toa="${BASH_REMATCH[1]}" || { echo "> Set ToA extraction failed for distance: $distance m"; return 1; }
[[ "$gettoa_resp" =~ UE\ max\ PRS\ DL\ ToA\ ([0-9]+) ]] && local est_toa="${BASH_REMATCH[1]}" || { echo "> Estimated ToA extraction failed for distance: $distance m"; return 1; }
# Compare extracted ToA values
[[ $set_toa == $est_toa ]] && echo "PRS SUCCESS for distance: $distance m" || { echo "PRS FAILURE for distance: $distance m (Actual ToA=$set_toa, Estimated ToA=$est_toa)" ; return 1; }
}
test_distance() {
local distance=$1 retries=0
# retry loop incase we didn't receive the response
while (( retries < MAX_RETRIES )); do
echo " Attempt $((retries + 1))/$MAX_RETRIES"
# Always reset to 0 m before testing target distance
if ! set_and_verify_distance 0; then
echo " Set distance 0 m failed during attempt $((retries + 1))"
else
sleep "$SLEEP_WAIT"
# Now test the actual target distance
if set_and_verify_distance "$distance"; then
return 0
fi
fi
((retries++))
if (( retries < MAX_RETRIES )); then
sleep "$SLEEP_WAIT"
else
echo " ERROR: No valid response after $MAX_RETRIES retries for distance: $distance m"
return 1
fi
done
}
num_success=0
num_fail=0
for d in "${DISTANCES[@]}"; do
if test_distance "$d"; then
((num_success++))
else
((num_fail++))
fi
sleep "$SLEEP_WAIT"
done
# ---- Summary ----
echo
echo "==================== SUMMARY ===================="
echo "Total tests run : ${#DISTANCES[@]}"
echo "Successful tests: ${num_success}"
echo "Failed tests : ${num_fail}"
echo "================================================="
if [ $num_success -gt 0 ]; then
exit 0
else
exit 1
fi

View File

@@ -60,33 +60,6 @@ class TestDeploymentMethods(unittest.TestCase):
self.assertTrue(deploy)
self.assertTrue(undeploy)
def test_stop_services(self):
self.cont.yamlPath = 'tests/simple-undep/'
self.cont.deploymentTag = "noble"
# should deploy both testA and testB
deploy = self.cont.DeployObject(self.ctx, self.node, self.html)
# should fail (no such service)
self.cont.services = "testC"
stopC = self.cont.StopObject(self.ctx, self.node, self.html)
# should stop testA
self.cont.services = "testA"
stopA = self.cont.StopObject(self.ctx, self.node, self.html)
# should (re-)stop testA (no-op)
self.cont.services = "testA"
stopA2 = self.cont.StopObject(self.ctx, self.node, self.html)
# should deploy testB
self.cont.services = "testB"
stopB = self.cont.StopObject(self.ctx, self.node, self.html)
# should not undeploy anything (everything already stopped)
self.cont.services = None
undeployAll = self.cont.UndeployObject(self.ctx, self.node, self.html, self.ran)
self.assertTrue(deploy)
self.assertFalse(stopC)
self.assertTrue(stopA)
self.assertTrue(stopA2)
self.assertTrue(stopB)
self.assertTrue(undeployAll)
def test_deployfails(self):
# fails reliably
old = self.cont.yamlPath

View File

@@ -23,7 +23,7 @@ class TestPingIperf(unittest.TestCase):
self.html.testCaseId = "000000"
self.ci = cls_oaicitest.OaiCiTest()
self.ci.ue_ids = ["test"]
self.node = "localhost"
self.ci.nodes = ["localhost"]
self.ctx = TestCaseCtx.Default(tempfile.mkdtemp())
def tearDown(self):
with cls_cmd.LocalCmd() as c:
@@ -35,7 +35,7 @@ class TestPingIperf(unittest.TestCase):
self.ci.svr_id = "test"
infra_file = "tests/config/infra_ping_iperf.yaml"
# TODO Should need nothing but options and UE(s) to use
success = self.ci.Ping(self.ctx, self.node, self.html, infra_file=infra_file)
success = self.ci.Ping(self.ctx, self.html, infra_file=infra_file)
self.assertTrue(success)
def test_iperf(self):
@@ -50,7 +50,7 @@ class TestPingIperf(unittest.TestCase):
self.ci.iperf_profile = "balanced"
infra_file = "tests/config/infra_ping_iperf.yaml"
# TODO Should need nothing but options and UE(s) to use
success = self.ci.Iperf(self.ctx, self.node, self.html, infra_file=infra_file)
success = self.ci.Iperf(self.ctx, self.html, infra_file=infra_file)
self.assertTrue(success)
def test_iperf2_unidir(self):
@@ -62,7 +62,7 @@ class TestPingIperf(unittest.TestCase):
self.ci.iperf_profile = "balanced"
infra_file = "tests/config/infra_ping_iperf.yaml"
# TODO Should need nothing but options and UE(s) to use
success = self.ci.Iperf2_Unidir(self.ctx, self.node, self.html, infra_file=infra_file)
success = self.ci.Iperf2_Unidir(self.ctx, self.html, infra_file=infra_file)
self.assertTrue(success)
def test_iperf_highrate(self):
@@ -77,7 +77,7 @@ class TestPingIperf(unittest.TestCase):
self.ci.iperf_profile = "balanced"
infra_file = "tests/config/infra_ping_iperf.yaml"
# TODO Should need nothing but options and UE(s) to use
success = self.ci.Iperf(self.ctx, self.node, self.html, infra_file=infra_file)
success = self.ci.Iperf(self.ctx, self.html, infra_file=infra_file)
self.assertTrue(success)
if __name__ == '__main__':

View File

@@ -1,23 +0,0 @@
services:
testA:
image: ubuntu:${TAG:-jammy}
container_name: test_container_A
cap_drop:
- ALL
entrypoint: /bin/bash -c "sleep infinity"
healthcheck:
test: /bin/bash -c "true"
interval: 1s
timeout: 1s
retries: 1
testB:
image: ubuntu:${TAG:-jammy}
container_name: test_container_B
cap_drop:
- ALL
entrypoint: /bin/bash -c "sleep infinity"
healthcheck:
test: /bin/bash -c "true"
interval: 1s
timeout: 1s
retries: 1

View File

@@ -20,7 +20,6 @@
- Build_Image
- Build_Run_Tests
- Deploy_Object
- Stop_Object
- Undeploy_Object
- Cppcheck_Analysis
- Deploy_Run_OC_PhySim

View File

@@ -88,14 +88,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE</desc>
<id>l2sim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020001">
<class>Ping</class>
<desc>Ping trf-gen from LTE-UE 1</desc>
<id>l2sim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>l2sim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -106,7 +106,7 @@
<class>Ping</class>
<desc>Ping LTE-UE 1 from trf-gen</desc>
<id>l2sim4g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>l2sim4g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -117,7 +117,7 @@
<class>Iperf</class>
<desc>Iperf UDP Downlink</desc>
<id>l2sim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>l2sim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 1M -R</iperf_args>
@@ -129,7 +129,7 @@
<class>Iperf</class>
<desc>Iperf UDP Uplink</desc>
<id>l2sim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>l2sim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 3M</iperf_args>

View File

@@ -103,14 +103,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020011">
<class>Ping</class>
<desc>Ping Traffic-Gen from LTE-UE</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -121,7 +121,7 @@
<class>Ping</class>
<desc>Ping LTE-UE from Traffic-Gen</desc>
<id>rfsim4g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -136,7 +136,7 @@
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_node>localhost</svr_node>
</testCase>
@@ -148,7 +148,7 @@
<iperf_args>-u -t 30 -b 1M</iperf_args>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_node>localhost</svr_node>
</testCase>

View File

@@ -83,7 +83,7 @@
<class>Ping</class>
<desc>Ping Traffic-Gen from LTE-UE</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_enb_nos1</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -94,7 +94,7 @@
<class>Ping</class>
<desc>Ping LTE-UE from eNB</desc>
<id>rfsim4g_enb_nos1</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -105,7 +105,7 @@
<class>Iperf</class>
<desc>Iperf UDP DL</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_enb_nos1</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
@@ -117,7 +117,7 @@
<class>Iperf</class>
<desc>Iperf UDP UL</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_enb_nos1</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 1M</iperf_args>

View File

@@ -103,14 +103,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020011">
<class>Ping</class>
<desc>Ping Traffic-Gen from LTE-UE</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -121,7 +121,7 @@
<class>Ping</class>
<desc>Ping LTE-UE from Traffic-Gen</desc>
<id>rfsim4g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -132,7 +132,7 @@
<class>Iperf</class>
<desc>Iperf UDP DL</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
@@ -144,7 +144,7 @@
<class>Iperf</class>
<desc>Iperf UDP UL</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 1M</iperf_args>

View File

@@ -103,14 +103,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020011">
<class>Ping</class>
<desc>Ping Traffic-Gen from LTE-UE</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -121,7 +121,7 @@
<class>Ping</class>
<desc>Ping LTE-UE from Traffic-Gen</desc>
<id>rfsim4g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -132,7 +132,7 @@
<class>Iperf</class>
<desc>Iperf UDP DL</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
@@ -144,7 +144,7 @@
<class>Iperf</class>
<desc>Iperf UDP UL</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 1M</iperf_args>

View File

@@ -80,7 +80,7 @@
<class>Iperf2_Unidir</class>
<desc>Iperf2 UDP DL</desc>
<id>rfsim4g_ue_fembms</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_enb_fembms</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 2M</iperf_args>

View File

@@ -80,7 +80,7 @@
<class>Iperf</class>
<desc>Iperf UDP DL</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_enb_nos1</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 2M -R</iperf_args>

View File

@@ -103,7 +103,7 @@
<class>Ping</class>
<desc>Ping Traffic-Gen from LTE-UE</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -114,7 +114,7 @@
<class>Ping</class>
<desc>Ping LTE-UE from Traffic-Gen</desc>
<id>rfsim4g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20</ping_args>
@@ -125,7 +125,7 @@
<class>Iperf</class>
<desc>Iperf UDP DL</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
@@ -137,7 +137,7 @@
<class>Iperf</class>
<desc>Iperf UDP UL</desc>
<id>rfsim4g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim4g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_args>-u -t 30 -b 1M</iperf_args>

View File

@@ -76,14 +76,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue rfsim5g_ue2 rfsim5g_ue3</id>
<node>localhost</node>
<nodes>localhost localhost localhost</nodes>
</testCase>
<testCase id="020021">
<class>Ping</class>
<desc>Ping ext-dn from all NR-UEs</desc>
<id>rfsim5g_ue rfsim5g_ue2 rfsim5g_ue3</id>
<node>localhost</node>
<nodes>localhost localhost localhost</nodes>
<svr_id>rfsim5g_5gc_fixed_ip</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i0.25</ping_args>

View File

@@ -107,7 +107,7 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="000024">
@@ -122,7 +122,7 @@
<class>Ping</class>
<desc>Ping ext-dn from all NR-UEs</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i0.25</ping_args>
@@ -141,7 +141,7 @@
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -153,7 +153,7 @@
<desc>Iperf (UL/3Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 3M -t 20</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -171,7 +171,7 @@
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i0.5 -w25</ping_args>

View File

@@ -70,14 +70,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020011">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -88,7 +88,7 @@
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -100,7 +100,7 @@
<desc>Iperf (DL/3Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 3M -t 30 -R</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -112,7 +112,7 @@
<desc>Iperf (UL/3Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 3M -t 30</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>

View File

@@ -42,13 +42,6 @@
002006
444444
100002
100003
100004
100005
100006
100007
100008
100009
100001
222221
222222
@@ -102,10 +95,10 @@
<testCase id="000002">
<class>Deploy_Object</class>
<desc>Deploy OAI nearRT-RIC</desc>
<desc>Deploy OAI FlexRIC</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>nearRT-RIC</services>
<services>oai-flexric</services>
</testCase>
<testCase id="000003">
@@ -128,7 +121,7 @@
<class>Ping</class>
<desc>Ping ext-dn from both UEs</desc>
<id>rfsim5g_ue rfsim5g_ue2</id>
<node>carabe</node>
<nodes>carabe carabe</nodes>
<svr_id>oai_ext_dn</svr_id>
<svr_node>carabe</svr_node>
<ping_args>-c 20</ping_args>
@@ -139,14 +132,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE 1 and 2</desc>
<id>rfsim5g_ue rfsim5g_ue2</id>
<node>carabe</node>
<nodes>carabe carabe</nodes>
</testCase>
<testCase id="444444">
<class>Detach_UE</class>
<desc>Detach OAI UE 1 and 2</desc>
<id>rfsim5g_ue rfsim5g_ue2</id>
<node>carabe</node>
<nodes>carabe carabe</nodes>
</testCase>
<testCase id="100001">
@@ -158,72 +151,16 @@
</testCase>
<testCase id="100002">
<class>Stop_Object</class>
<desc>Stop RC monitoring xApp</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>xapp-rc-moni</services>
</testCase>
<testCase id="100003">
<class>Stop_Object</class>
<desc>Stop KPM monitoring xApp</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>xapp-kpm-moni</services>
</testCase>
<testCase id="100004">
<class>Stop_Object</class>
<desc>Stop KPM monitoring and RC control xApp</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>xapp-kpm-rc</services>
</testCase>
<testCase id="100005">
<class>Stop_Object</class>
<desc>Stop custom SMs monitoring xApp</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>xapp-gtp-mac-rlc-pdcp-moni</services>
</testCase>
<testCase id="100006">
<class>Stop_Object</class>
<desc>Stop OAI UEs</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>oai-nr-ue oai-nr-ue2</services>
</testCase>
<testCase id="100007">
<class>Stop_Object</class>
<desc>Stop OAI gNB</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>oai-gnb</services>
</testCase>
<testCase id="100008">
<class>Stop_Object</class>
<desc>Stop nearRT-RIC</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>nearRT-RIC</services>
</testCase>
<testCase id="100009">
<class>Undeploy_Object</class>
<desc>Undeploy RAN and FlexRIC</desc>
<desc>Undeploy RAN and Flexric</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<always_exec>true</always_exec>
</testCase>
</testCase>
<testCase id="010000">
<class>Deploy_Object</class>
<desc>Deploy RC monitoring</desc>
<desc>RC monitoring</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>xapp-rc-moni</services>
@@ -231,7 +168,7 @@
<testCase id="010001">
<class>Deploy_Object</class>
<desc>Deploy KPM monitoring</desc>
<desc>KPM monitoring</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>xapp-kpm-moni</services>
@@ -239,7 +176,7 @@
<testCase id="010002">
<class>Deploy_Object</class>
<desc>Deploy KPM monitoring and RC control</desc>
<desc>KPM monitoring and RC control</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>xapp-kpm-rc</services>
@@ -247,7 +184,7 @@
<testCase id="010003">
<class>Deploy_Object</class>
<desc>Deploy custom SMs monitoring</desc>
<desc>Custom SMs monitoring</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
<services>xapp-gtp-mac-rlc-pdcp-moni</services>

View File

@@ -125,14 +125,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue rfsim5g_ue2 rfsim5g_ue3 rfsim5g_ue4 rfsim5g_ue5 rfsim5g_ue6 rfsim5g_ue7 rfsim5g_ue8 rfsim5g_ue9 rfsim5g_ue10</id>
<node>localhost</node>
<nodes>localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost</nodes>
</testCase>
<testCase id="020001">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -143,7 +143,7 @@
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -154,7 +154,7 @@
<class>Ping</class>
<desc>Ping ext-dn from Second NR-UE</desc>
<id>rfsim5g_ue2</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -165,7 +165,7 @@
<class>Ping</class>
<desc>Ping Second NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue2</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -176,7 +176,7 @@
<class>Ping</class>
<desc>Ping ext-dn from both UEs</desc>
<id>rfsim5g_ue rfsim5g_ue2</id>
<node>localhost</node>
<nodes>localhost localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -187,7 +187,7 @@
<class>Ping</class>
<desc>Ping ext-dn from all UEs</desc>
<id>rfsim5g_ue rfsim5g_ue2 rfsim5g_ue3 rfsim5g_ue4 rfsim5g_ue5 rfsim5g_ue6 rfsim5g_ue7 rfsim5g_ue8 rfsim5g_ue9 rfsim5g_ue10</id>
<node>localhost</node>
<nodes>localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25 -s 1016</ping_args>
@@ -199,7 +199,7 @@
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -211,7 +211,7 @@
<desc>Iperf (UL/1Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 1M -t 20</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -222,21 +222,21 @@
<class>Attach_UE</class>
<desc>Attach OAI UE 1 and 2</desc>
<id>rfsim5g_ue rfsim5g_ue2</id>
<node>localhost</node>
<nodes>localhost localhost</nodes>
</testCase>
<testCase id="444444">
<class>Detach_UE</class>
<desc>Detach OAI UE 1 and 2</desc>
<id>rfsim5g_ue rfsim5g_ue2</id>
<node>localhost</node>
<nodes>localhost localhost</nodes>
</testCase>
<testCase id="444445">
<class>Detach_UE</class>
<desc>Detach OAI UE 3 to 10</desc>
<id>rfsim5g_ue3 rfsim5g_ue4 rfsim5g_ue5 rfsim5g_ue6 rfsim5g_ue7 rfsim5g_ue8 rfsim5g_ue9 rfsim5g_ue10</id>
<node>localhost</node>
<nodes>localhost localhost localhost localhost localhost localhost localhost localhost</nodes>
</testCase>
<testCase id="100001">

View File

@@ -88,7 +88,7 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="000004">
@@ -101,7 +101,7 @@
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args> -c 20 -i0.5</ping_args>
@@ -112,7 +112,7 @@
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i0.2</ping_args>
@@ -124,7 +124,7 @@
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -136,7 +136,7 @@
<desc>Iperf (UL/1Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 1M -t 20</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>

View File

@@ -70,14 +70,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020001">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -88,7 +88,7 @@
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -100,7 +100,7 @@
<desc>Iperf (DL/10Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 10M -t 20 -R</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -112,7 +112,7 @@
<desc>Iperf (UL/3Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 3M -t 20</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>

View File

@@ -77,7 +77,7 @@
<class>Ping</class>
<desc>Ping gNB from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_gnb_nos1</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c20 -i0.2</ping_args>
@@ -88,7 +88,7 @@
<class>Ping</class>
<desc>Ping NR-UE from gNB</desc>
<id>rfsim5g_gnb_nos1</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c20 -i0.2</ping_args>
@@ -100,7 +100,7 @@
<desc>Iperf (DL/30kbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 0.03M -t 20 -R -c 10.0.1.1</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_gnb_nos1</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -112,7 +112,7 @@
<desc>Iperf (UL/30kbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 0.03M -t 20 -c 10.0.1.1</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_gnb_nos1</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>

View File

@@ -70,14 +70,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020001">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i0.2</ping_args>
@@ -88,7 +88,7 @@
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i0.2</ping_args>

View File

@@ -84,14 +84,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_multiue1 rfsim5g_multiue2 rfsim5g_multiue3 rfsim5g_multiue4 rfsim5g_multiue5 rfsim5g_multiue6 rfsim5g_multiue7 rfsim5g_multiue8 rfsim5g_multiue9 rfsim5g_multiue10</id>
<node>localhost</node>
<nodes>localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost</nodes>
</testCase>
<testCase id="020001">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_multiue1</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -102,7 +102,7 @@
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_multiue1</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -113,7 +113,7 @@
<class>Ping</class>
<desc>Ping ext-dn from Second NR-UE</desc>
<id>rfsim5g_multiue2</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -124,7 +124,7 @@
<class>Ping</class>
<desc>Ping Second NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_multiue2</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -135,7 +135,7 @@
<class>Ping</class>
<desc>Ping ext-dn from both UEs</desc>
<id>rfsim5g_multiue1 rfsim5g_multiue2</id>
<node>localhost</node>
<nodes>localhost localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -146,7 +146,7 @@
<class>Ping</class>
<desc>Ping ext-dn from all UEs</desc>
<id>rfsim5g_multiue1 rfsim5g_multiue2 rfsim5g_multiue3 rfsim5g_multiue4 rfsim5g_multiue5 rfsim5g_multiue6 rfsim5g_multiue7 rfsim5g_multiue8 rfsim5g_multiue9 rfsim5g_multiue10</id>
<node>localhost</node>
<nodes>localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25 -s 1016</ping_args>
@@ -158,7 +158,7 @@
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
<id>rfsim5g_multiue1</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -170,7 +170,7 @@
<desc>Iperf (UL/1Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 1M -t 20</iperf_args>
<id>rfsim5g_multiue1</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -181,7 +181,7 @@
<class>Detach_UE</class>
<desc>Detach OAI UEs</desc>
<id>rfsim5g_multiue1</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="100001">

View File

@@ -85,7 +85,7 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="000004">
@@ -100,7 +100,7 @@
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 50 -i 0.25</ping_args>
@@ -111,7 +111,7 @@
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 50 -i 0.25</ping_args>
@@ -123,7 +123,7 @@
<desc>Iperf (DL/10Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -135,7 +135,7 @@
<desc>Iperf (UL/4Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 1M -t 20</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>

View File

@@ -74,14 +74,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020001">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -92,7 +92,7 @@
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -111,7 +111,7 @@
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i0.5 -w25</ping_args>

View File

@@ -69,14 +69,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020001">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -87,7 +87,7 @@
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>

View File

@@ -1,100 +0,0 @@
<!--
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The OpenAirInterface Software Alliance licenses this file to You under
the OAI Public License, Version 1.1 (the "License"); you may not use this file
except in compliance with the License.
You may obtain a copy of the License at
http://www.openairinterface.org/?page_id=698
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
For more information about the OpenAirInterface (OAI) Software Alliance:
contact@openairinterface.org
-->
<testCaseList>
<htmlTabRef>rfsim-5gnr-prs</htmlTabRef>
<htmlTabName>Monolithic gNB with PRS</htmlTabName>
<htmlTabIcon>wrench</htmlTabIcon>
<TestCaseRequestedList>
111111
800813
000012
000013
040001
040023
100011
222222
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
<testCase id="111111">
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>localhost</node>
<images>oai-gnb-asan oai-nr-ue-asan</images>
</testCase>
<testCase id="800813">
<class>Create_Workspace</class>
<desc>Create new Workspace</desc>
<node>localhost</node>
</testCase>
<testCase id="000012">
<class>Deploy_Object</class>
<desc>Deploy OAI 5G gNB+UE RF sim SA</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_prs</yaml_path>
<services>oai-gnb oai-nr-ue</services>
</testCase>
<testCase id="000013">
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
</testCase>
<testCase id="040001">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>2</idle_sleep_time_in_sec>
</testCase>
<testCase id="040023">
<class>Custom_Script</class>
<always_exec>true</always_exec>
<desc>Set and verify distance at 50, 100, 150 m</desc>
<node>localhost</node>
<script>scripts/set-and-verify-distance-prs.sh</script>
<args>50 100 150</args>
</testCase>
<testCase id="100011">
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy all OAI 5G stack</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_prs</yaml_path>
<d_retx_th>30,100,100,100</d_retx_th>
<u_retx_th>30,100,100,100</u_retx_th>
</testCase>
<testCase id="222222">
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>localhost</node>
<images>oai-gnb-asan oai-nr-ue-asan</images>
</testCase>
</testCaseList>

View File

@@ -63,14 +63,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020001">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -81,7 +81,7 @@
<class>Detach_UE</class>
<desc>Detach OAI UE 1</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="100001">

View File

@@ -83,7 +83,7 @@
<class>Ping</class>
<desc>Ping gNB from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_gnb_nos1</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c20 -i0.2</ping_args>
@@ -94,7 +94,7 @@
<class>Ping</class>
<desc>Ping NR-UE from gNB</desc>
<id>rfsim5g_gnb_nos1</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c20 -i0.2</ping_args>

View File

@@ -36,11 +36,6 @@
020003
030001
030002
050001
050002
050003
020001
020002
100001
222222
</TestCaseRequestedList>
@@ -77,14 +72,14 @@
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020001">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -95,7 +90,7 @@
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -106,14 +101,14 @@
<class>Attach_UE</class>
<desc>Verify 2nd PDU session is up</desc>
<id>rfsim5g_ue_pdu_2</id>
<node>localhost</node>
<nodes>localhost</nodes>
</testCase>
<testCase id="020003">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE on PDU session ID 2</desc>
<id>rfsim5g_ue_pdu_2</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
@@ -125,7 +120,7 @@
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
@@ -137,39 +132,19 @@
<desc>Iperf (UL/1Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 1M -t 20</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<nodes>localhost</nodes>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
<iperf_bitrate_threshold>90</iperf_bitrate_threshold>
</testCase>
<testCase id="050001">
<class>Custom_Command</class>
<desc>Trigger PDU Session Release via gNB telnet</desc>
<node>acamas</node>
<command>echo ci pdu_session_release 2 | ncat 192.168.71.140 9090</command>
</testCase>
<testCase id="050002">
<class>Custom_Command</class>
<desc>Add PDU Session via UE telnet</desc>
<node>acamas</node>
<command>echo ci add_pdu_session 6,7 | ncat 192.168.71.150 8091</command>
</testCase>
<testCase id="050003">
<class>Custom_Command</class>
<desc>Trigger PDU Session Release via gNB telnet</desc>
<node>acamas</node>
<command>echo ci pdu_session_release 6 | ncat 192.168.71.140 9090</command>
</testCase>
<testCase id="100001">
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy all OAI 5G stack</desc>
<node>localhost</node>
<services>oai-vnf oai-pnf</services>
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_u0_25prb</yaml_path>
<d_retx_th>1,0,0,0</d_retx_th>
<u_retx_th>1,0,0,0</u_retx_th>

View File

@@ -1,140 +0,0 @@
<!--
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The OpenAirInterface Software Alliance licenses this file to You under
the OAI Public License, Version 1.1 (the "License"); you may not use this file
except in compliance with the License.
You may obtain a copy of the License at
http://www.openairinterface.org/?page_id=698
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
For more information about the OpenAirInterface (OAI) Software Alliance:
contact@openairinterface.org
-->
<testCaseList>
<htmlTabRef>vrtsim-5gnr-chanmod</htmlTabRef>
<htmlTabName>Monolithic gNB vrtsim + chanmod</htmlTabName>
<htmlTabIcon>wrench</htmlTabIcon>
<TestCaseRequestedList>
111111
800813
000011
000012
000013
020011
020012
030011
030012
100011
222222
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
<testCase id="111111">
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>localhost</node>
<images>oai-gnb oai-nr-ue</images>
</testCase>
<testCase id="800813">
<class>Create_Workspace</class>
<desc>Create new Workspace</desc>
<node>localhost</node>
</testCase>
<testCase id="000011">
<class>Deploy_Object</class>
<desc>Deploy OAI 5G CoreNetwork</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_vrtsim_chanmod</yaml_path>
<services>mysql oai-amf oai-smf oai-upf oai-ext-dn</services>
</testCase>
<testCase id="000012">
<class>Deploy_Object</class>
<desc>Deploy OAI 5G gNB+UE RF sim SA</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_vrtsim_chanmod</yaml_path>
<services>oai-gnb oai-nr-ue</services>
</testCase>
<testCase id="000013">
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
</testCase>
<testCase id="020011">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
<ping_packetloss_threshold>5</ping_packetloss_threshold>
</testCase>
<testCase id="020012">
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
<ping_packetloss_threshold>5</ping_packetloss_threshold>
</testCase>
<testCase id="030011">
<class>Iperf</class>
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
<iperf_bitrate_threshold>90</iperf_bitrate_threshold>
</testCase>
<testCase id="030012">
<class>Iperf</class>
<desc>Iperf (UL/1Mbps/UDP)(20 sec)</desc>
<iperf_args>-u -b 1M -t 20</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
<iperf_bitrate_threshold>90</iperf_bitrate_threshold>
</testCase>
<testCase id="100011">
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy all OAI 5G stack</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_vrtsim_chanmod</yaml_path>
<d_retx_th>1,0,0,0</d_retx_th>
<u_retx_th>1,0,0,0</u_retx_th>
</testCase>
<testCase id="222222">
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>localhost</node>
<images>oai-gnb oai-nr-ue</images>
</testCase>
</testCaseList>

View File

@@ -1,141 +0,0 @@
<!--
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The OpenAirInterface Software Alliance licenses this file to You under
the OAI Public License, Version 1.1 (the "License"); you may not use this file
except in compliance with the License.
You may obtain a copy of the License at
http://www.openairinterface.org/?page_id=698
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
For more information about the OpenAirInterface (OAI) Software Alliance:
contact@openairinterface.org
-->
<testCaseList>
<htmlTabRef>vrtsim-5gnr-chanmod-gh</htmlTabRef>
<htmlTabName>Monolithic gNB vrtsim + chanmod</htmlTabName>
<htmlTabIcon>wrench</htmlTabIcon>
<TestCaseRequestedList>
111111
800813
000011
000012
000013
020011
020012
030011
030012
100011
222222
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
<testCase id="111111">
<class>Pull_Local_Registry</class>
<desc>Pull Images from Local Registry</desc>
<node>localhost</node>
<images>oai-gnb oai-nr-ue</images>
<tag_prefix>arm_</tag_prefix>
</testCase>
<testCase id="800813">
<class>Create_Workspace</class>
<desc>Create new Workspace</desc>
<node>localhost</node>
</testCase>
<testCase id="000011">
<class>Deploy_Object</class>
<desc>Deploy OAI 5G CoreNetwork</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_vrtsim_chanmod</yaml_path>
<services>mysql oai-amf oai-smf oai-upf oai-ext-dn</services>
</testCase>
<testCase id="000012">
<class>Deploy_Object</class>
<desc>Deploy OAI 5G gNB+UE RF sim SA</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_vrtsim_chanmod</yaml_path>
<services>oai-gnb oai-nr-ue</services>
</testCase>
<testCase id="000013">
<class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
</testCase>
<testCase id="020011">
<class>Ping</class>
<desc>Ping ext-dn from NR-UE</desc>
<id>rfsim5g_ue</id>
<node>localhost</node>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
<ping_packetloss_threshold>5</ping_packetloss_threshold>
</testCase>
<testCase id="020012">
<class>Ping</class>
<desc>Ping NR-UE from ext-dn</desc>
<id>rfsim5g_ext_dn</id>
<node>localhost</node>
<svr_id>rfsim5g_ue</svr_id>
<svr_node>localhost</svr_node>
<ping_args>-c 20 -i 0.25</ping_args>
<ping_packetloss_threshold>5</ping_packetloss_threshold>
</testCase>
<testCase id="030011">
<class>Iperf</class>
<desc>Iperf (DL/3Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 3M -t 30 -R</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
<iperf_bitrate_threshold>90</iperf_bitrate_threshold>
</testCase>
<testCase id="030012">
<class>Iperf</class>
<desc>Iperf (UL/1Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 1M -t 30</iperf_args>
<id>rfsim5g_ue</id>
<node>localhost</node>
<svr_id>rfsim5g_ext_dn</svr_id>
<svr_node>localhost</svr_node>
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
<iperf_bitrate_threshold>90</iperf_bitrate_threshold>
</testCase>
<testCase id="100011">
<class>Undeploy_Object</class>
<always_exec>true</always_exec>
<desc>Undeploy all OAI 5G stack</desc>
<node>localhost</node>
<yaml_path>ci-scripts/yaml_files/5g_vrtsim_chanmod</yaml_path>
<d_retx_th>1,0,0,0</d_retx_th>
<u_retx_th>1,0,0,0</u_retx_th>
</testCase>
<testCase id="222222">
<class>Clean_Test_Server_Images</class>
<always_exec>true</always_exec>
<desc>Clean Test Images on Test Server</desc>
<node>localhost</node>
<images>oai-gnb oai-nr-ue</images>
</testCase>
</testCaseList>

View File

@@ -247,7 +247,6 @@
<testCase id="060000">
<class>UndeployCoreNetwork</class>
<desc>Terminate EPC</desc>
<always_exec>true</always_exec>
<cn_id>ltebox-nepes</cn_id>
</testCase>

View File

@@ -88,8 +88,8 @@
<testCase id="000022">
<class>Iperf</class>
<desc>iperf (DL/UDP/800M)(30 sec)(single-ue profile)</desc>
<iperf_args>-u -b 800M -t 30 -R</iperf_args>
<desc>iperf (DL/UDP/500M)(30 sec)(single-ue profile)</desc>
<iperf_args>-u -b 500M -t 30 -R</iperf_args>
<svr_id>oc-cn5g-20897-aerial</svr_id>
<id>up2-aerial</id>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
@@ -98,8 +98,8 @@
<testCase id="000033">
<class>Iperf</class>
<desc>iperf (UL/UDP/150M)(30 sec)(single-ue profile)</desc>
<iperf_args>-u -b 150M -t 30 -l 1428</iperf_args>
<desc>iperf (UL/UDP/40M)(30 sec)(single-ue profile)</desc>
<iperf_args>-u -b 40M -t 30 -l 1428</iperf_args>
<svr_id>oc-cn5g-20897-aerial</svr_id>
<id>up2-aerial</id>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
@@ -119,9 +119,9 @@
<testCase id="300033">
<class>Iperf</class>
<desc>Optional iperf (UL/UDP/200M)(30 sec)(single-ue profile)</desc>
<desc>Optional iperf (UL/UDP/90M)(30 sec)(single-ue profile)</desc>
<may_fail>true</may_fail>
<iperf_args>-u -b 200M -t 30 -l 1428</iperf_args>
<iperf_args>-u -b 90M -t 30 -l 1428</iperf_args>
<svr_id>oc-cn5g-20897-aerial</svr_id>
<id>up2-aerial</id>
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>

View File

@@ -97,8 +97,8 @@
<testCase id="000032">
<class>Iperf</class>
<desc>iperf (UL/UDP/300M)(30 sec)(single-ue profile)</desc>
<iperf_args>-u -b 300M -t 30 -l 1428</iperf_args>
<desc>iperf (UL/UDP/200M)(30 sec)(single-ue profile)</desc>
<iperf_args>-u -b 200M -t 30 -l 1428</iperf_args>
<svr_id>oc-cn5g-20897-aerial</svr_id>
<id>up2-aerial</id>
<iperf_packetloss_threshold>10</iperf_packetloss_threshold>
@@ -107,9 +107,9 @@
<testCase id="000033">
<class>Iperf</class>
<desc>iperf (UL/UDP/380M)(30 sec)(single-ue profile)</desc>
<desc>iperf (UL/UDP/220M)(30 sec)(single-ue profile)</desc>
<may_fail>true</may_fail>
<iperf_args>-u -b 380M -t 30 -l 1428</iperf_args>
<iperf_args>-u -b 220M -t 30 -l 1428</iperf_args>
<svr_id>oc-cn5g-20897-aerial</svr_id>
<id>up2-aerial</id>
<iperf_packetloss_threshold>10</iperf_packetloss_threshold>

View File

@@ -30,28 +30,20 @@
310000
800813
330101
330102
330103
310001
400001
350000
370001
370000
370002
370003
370004
370002
360001
100002
360002
350000
410002
370012
400002
410003
370013
400003
410000
350000
400000
410001
350000
400001
310011
310002
330201
@@ -96,10 +88,24 @@
</testCase>
<testCase id="330101">
<class>Deploy_Object</class>
<desc>Deploy gNB-CU-CP/gNB-CU-UP/gNB-DU (TDD/n76/40MHz/B200)</desc>
<desc>Deploy gNB-CU-CP in a container</desc>
<node>ofqot</node>
<yaml_path>ci-scripts/yaml_files/sa_e1_b200_gnb</yaml_path>
<services>gnb_cucp gnb_cuup gnb_du_tdd</services>
<services>gnb_cucp</services>
</testCase>
<testCase id="330102">
<class>Deploy_Object</class>
<desc>Deploy gNB-CU-UP in a container</desc>
<node>ofqot</node>
<yaml_path>ci-scripts/yaml_files/sa_e1_b200_gnb</yaml_path>
<services>gnb_cuup</services>
</testCase>
<testCase id="330103">
<class>Deploy_Object</class>
<desc>Deploy gNB-DU (TDD/Band78/40MHz/B200) in a container</desc>
<node>ofqot</node>
<yaml_path>ci-scripts/yaml_files/sa_e1_b200_gnb</yaml_path>
<services>gnb_du_tdd</services>
</testCase>
<testCase id="300000">
@@ -126,6 +132,16 @@
<ping_rttavg_threshold>25</ping_rttavg_threshold>
</testCase>
<testCase id="370000">
<class>Iperf</class>
<desc>iperf (DL/80Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 80M -t 30 -R</iperf_args>
<id>idefix</id>
<svr_id>sabox-nepes</svr_id>
<iperf_packetloss_threshold>10</iperf_packetloss_threshold>
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
</testCase>
<testCase id="400001">
<class>Custom_Command</class>
<desc>Check UE is on dedicated BWP ID 1</desc>
@@ -133,76 +149,19 @@
<command>echo ci get_current_bwp | nc -N 127.0.0.1 9091 | grep 'DL BWP ID 1 (dedicated) UL BWP ID 1 (dedicated)'</command>
</testCase>
<testCase id="410001">
<class>Custom_Command</class>
<desc>Switch to dedicated BWP ID 1</desc>
<node>ofqot</node>
<command>echo ci trigger_bwp_switch 1 | nc -N 127.0.0.1 9091 | grep 'triggered BWP switch to BWP ID 1 for UE'</command>
</testCase>
<testCase id="400000">
<class>Custom_Command</class>
<desc>Check UE is on initial BWP ID 0</desc>
<node>ofqot</node>
<command>echo ci get_current_bwp | nc -N 127.0.0.1 9091 | grep 'DL BWP ID 0 (initial) UL BWP ID 0 (initial)'</command>
</testCase>
<testCase id="410002">
<class>Custom_Command</class>
<desc>Switch to dedicated BWP ID 2</desc>
<node>ofqot</node>
<command>echo ci trigger_bwp_switch 2 | nc -N 127.0.0.1 9091 | grep 'triggered BWP switch to BWP ID 2 for UE'</command>
</testCase>
<testCase id="370012">
<testCase id="370001">
<class>Iperf</class>
<desc>iperf (DL/TCP)(10 sec)(single-ue profile)</desc>
<iperf_args>-t 10 -R</iperf_args>
<desc>iperf (UL/8Mbps/UDP)(30 sec)</desc>
<iperf_args>-u -b 8M -t 30</iperf_args>
<id>idefix</id>
<svr_id>sabox-nepes</svr_id>
<iperf_tcp_rate_target>35</iperf_tcp_rate_target>
</testCase>
<testCase id="400002">
<class>Custom_Command</class>
<desc>Check UE is on dedicated BWP ID 2</desc>
<node>ofqot</node>
<command>echo ci get_current_bwp | nc -N 127.0.0.1 9091 | grep 'DL BWP ID 2 (dedicated) UL BWP ID 2 (dedicated)'</command>
</testCase>
<testCase id="410003">
<class>Custom_Command</class>
<desc>Switch to dedicated BWP ID 3</desc>
<node>ofqot</node>
<command>echo ci trigger_bwp_switch 3 | nc -N 127.0.0.1 9091 | grep 'triggered BWP switch to BWP ID 3 for UE'</command>
</testCase>
<testCase id="370013">
<class>Iperf</class>
<desc>iperf (DL/TCP)(10 sec)(single-ue profile)</desc>
<iperf_args>-t 10 -R</iperf_args>
<id>idefix</id>
<svr_id>sabox-nepes</svr_id>
<iperf_tcp_rate_target>85</iperf_tcp_rate_target>
</testCase>
<testCase id="400003">
<class>Custom_Command</class>
<desc>Check UE is on dedicated BWP ID 3</desc>
<node>ofqot</node>
<command>echo ci get_current_bwp | nc -N 127.0.0.1 9091 | grep 'DL BWP ID 3 (dedicated) UL BWP ID 3 (dedicated)'</command>
</testCase>
<testCase id="410000">
<class>Custom_Command</class>
<desc>Switch to initial BWP ID 0</desc>
<node>ofqot</node>
<command>echo ci trigger_bwp_switch 0 | nc -N 127.0.0.1 9091 | grep 'triggered BWP switch to BWP ID 0 for UE'</command>
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
</testCase>
<testCase id="370002">
<class>Iperf</class>
<desc>iperf (BIDIR TCP)(20 sec)(single-ue profile)</desc>
<desc>iperf (BIDIR TCP)(10 sec)(single-ue profile)</desc>
<iperf_args>-t 20 --bidir</iperf_args>
<id>idefix</id>
<svr_id>sabox-nepes</svr_id>
@@ -210,17 +169,17 @@
<testCase id="370003">
<class>Iperf</class>
<desc>iperf (DL/TCP)(20 sec)(single-ue profile)</desc>
<iperf_args>-t 20 -R</iperf_args>
<desc>iperf (DL/TCP)(30 sec)(single-ue profile)</desc>
<iperf_args>-t 30 -R</iperf_args>
<id>idefix</id>
<svr_id>sabox-nepes</svr_id>
<iperf_tcp_rate_target>140</iperf_tcp_rate_target>
<iperf_tcp_rate_target>30</iperf_tcp_rate_target>
</testCase>
<testCase id="370004">
<class>Iperf</class>
<desc>iperf (UL/TCP)(20 sec)(single-ue profile)</desc>
<iperf_args>-t 20</iperf_args>
<desc>iperf (UL/TCP)(30 sec)(single-ue profile)</desc>
<iperf_args>-t 30</iperf_args>
<id>idefix</id>
<svr_id>sabox-nepes</svr_id>
<iperf_tcp_rate_target>15</iperf_tcp_rate_target>

View File

@@ -146,6 +146,7 @@
<desc>Undeploy gNB</desc>
<node>matix</node>
<yaml_path>ci-scripts/yaml_files/5g_sa_n310_2x2_100MHz</yaml_path>
<services>oai-gnb</services>
<d_retx_th>10,100,100,100</d_retx_th>
<u_retx_th>10,100,100,100</u_retx_th>
</testCase>

View File

@@ -146,6 +146,7 @@
<desc>Undeploy gNB</desc>
<node>matix</node>
<yaml_path>ci-scripts/yaml_files/5g_sa_n310_2x2_60MHz</yaml_path>
<services>oai-gnb</services>
<d_retx_th>15,100,100,100</d_retx_th>
<u_retx_th>20,100,100,100</u_retx_th>
</testCase>

View File

@@ -146,6 +146,7 @@
<desc>Undeploy VNF-PNF</desc>
<node>matix</node>
<yaml_path>ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz</yaml_path>
<services>oai-vnf oai-pnf</services>
<d_retx_th>10,100,100,100</d_retx_th>
<u_retx_th>10,100,100,100</u_retx_th>
</testCase>

View File

@@ -1,7 +1,7 @@
services:
nearRT-RIC:
oai-flexric:
image: ${REGISTRY-oaisoftwarealliance/}oai-flexric:${FLEXRIC_TAG:-develop}
container_name: nearRT-RIC
container_name: oai-flexric
networks:
public_net:
ipv4_address: 192.168.70.150
@@ -17,7 +17,7 @@ services:
command: "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_rc_moni"
container_name: xapp-rc-moni
depends_on:
- nearRT-RIC
- oai-flexric
- oai-gnb
networks:
public_net:
@@ -34,7 +34,7 @@ services:
command: "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_kpm_moni"
container_name: xapp-kpm-moni
depends_on:
- nearRT-RIC
- oai-flexric
- oai-gnb
networks:
public_net:
@@ -51,7 +51,7 @@ services:
command: "stdbuf -o0 /usr/local/flexric/xApp/c/kpm_rc/xapp_kpm_rc"
container_name: xapp-kpm-rc
depends_on:
- nearRT-RIC
- oai-flexric
- oai-gnb
networks:
public_net:
@@ -68,7 +68,7 @@ services:
command: "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni"
container_name: xapp-gtp-mac-rlc-pdcp-moni
depends_on:
- nearRT-RIC
- oai-flexric
- oai-gnb
networks:
public_net:
@@ -88,7 +88,7 @@ services:
USE_ADDITIONAL_OPTIONS: -E --rfsim --log_config.global_log_options level,nocolor,time
ASAN_OPTIONS: detect_leaks=0
depends_on:
- nearRT-RIC
- oai-flexric
networks:
public_net:
ipv4_address: 192.168.70.151

View File

@@ -123,7 +123,7 @@ services:
--rfsim --rfsimulator.prop_delay 20 --rfsimulator.options chanmod
--rfsimulator.serveraddr 192.168.71.140
--time-sync-I 0.1 --ntn-initial-time-drift -46
--initial-fo 57340 --cont-fo-comp 2
--autonomous-ta --initial-fo 57340 --cont-fo-comp 2
--log_config.global_log_options level,nocolor,time
--num-ul-actors 1
depends_on:

View File

@@ -1,71 +0,0 @@
services:
oai-gnb:
image: ${REGISTRY-oaisoftwarealliance/}${GNB_IMG:-oai-gnb}:${TAG:-develop}
container_name: rfsim5g-oai-gnb
cap_drop:
- ALL
cap_add:
- NET_ADMIN # for interface bringup
- NET_RAW # for ping
environment:
USE_ADDITIONAL_OPTIONS: --phy-test --rfsim -E
--log_config.global_log_options level,nocolor,time
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
networks:
public_net:
ipv4_address: 192.168.71.140
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- ../../conf_files/gnb.sa.band78.106prb.rfsim.prs.conf:/opt/oai-gnb/etc/gnb.conf
- rrc.config:/opt/oai-gnb/
healthcheck:
test: /bin/bash -c "pgrep nr-softmodem"
interval: 10s
timeout: 5s
retries: 5
oai-nr-ue:
image: ${REGISTRY-oaisoftwarealliance/}${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
container_name: rfsim5g-oai-nr-ue
cap_drop:
- ALL
cap_add:
- NET_ADMIN # for interface bringup
- NET_RAW # for ping
environment:
USE_ADDITIONAL_OPTIONS: --phy-test --rfsim -E
--reconfig-file etc/rrc/reconfig.raw --rbconfig-file etc/rrc/rbconfig.raw
--rfsimulator.serveraddr 192.168.71.140
--log_config.global_log_options level,nocolor,time
--telnetsrv --telnetsrv.listenaddr 192.168.71.150 --telnetsrv.listenport 8091
--telnetsrv.shrmod ciUE
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- ../../conf_files/nrue.band78.106prb.prs.conf:/opt/oai-nr-ue/etc/nr-ue.conf
- rrc.config:/opt/oai-nr-ue/etc/rrc/
depends_on:
- oai-gnb
networks:
public_net:
ipv4_address: 192.168.71.150
healthcheck:
test: /bin/bash -c "pgrep nr-uesoftmodem"
interval: 10s
timeout: 5s
retries: 5
volumes:
rrc.config:
networks:
public_net:
driver: bridge
name: rfsim5g-oai-public-net
ipam:
config:
- subnet: 192.168.71.128/26
driver_opts:
com.docker.network.bridge.name: "rfsim5g-public"

View File

@@ -97,9 +97,8 @@ services:
- ALL
environment:
USE_ADDITIONAL_OPTIONS: --nfapi VNF --log_config.global_log_options level,nocolor,time
--telnetsrv --telnetsrv.listenaddr 192.168.71.140 --telnetsrv.shrmod ci
NFAPI_TRACE_LEVEL: info
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-ext-dn
networks:
@@ -123,7 +122,7 @@ services:
environment:
USE_ADDITIONAL_OPTIONS: --nfapi PNF --rfsim --log_config.global_log_options level,nocolor,time
NFAPI_TRACE_LEVEL: info
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
ASAN_OPTIONS: detect_leaks=0
depends_on:
- oai-vnf
networks:
@@ -148,10 +147,7 @@ services:
- NET_ADMIN # for interface bringup
- NET_RAW # for ping
environment:
USE_ADDITIONAL_OPTIONS: --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152680000 --CO -400000000 --ssb 48
--rfsimulator.serveraddr 192.168.71.141 --extra-pdu-id 2 --log_config.global_log_options level,nocolor,time
--telnetsrv --telnetsrv.shrmod ciUE --telnetsrv.listenaddr 192.168.71.150 --telnetsrv.listenport 8091
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
USE_ADDITIONAL_OPTIONS: --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152680000 --CO -400000000 --ssb 48 --rfsimulator.serveraddr 192.168.71.141 --extra-pdu-id 2 --log_config.global_log_options level,nocolor,time
depends_on:
- oai-pnf
networks:

View File

@@ -1,163 +0,0 @@
services:
mysql:
container_name: "rfsim5g-mysql"
image: mysql:8.0
init: true
volumes:
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
environment:
- TZ=Europe/Paris
- MYSQL_DATABASE=oai_db
- MYSQL_USER=test
- MYSQL_PASSWORD=test
- MYSQL_ROOT_PASSWORD=linux
healthcheck:
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
interval: 10s
timeout: 5s
start_period: 10s
start_interval: 500ms
retries: 30
networks:
public_net:
ipv4_address: 192.168.71.131
oai-amf:
container_name: "rfsim5g-oai-amf"
image: oaisoftwarealliance/oai-amf:v2.1.10
environment:
- TZ=Europe/paris
volumes:
- ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-amf/etc/config.yaml
depends_on:
- mysql
networks:
public_net:
ipv4_address: 192.168.71.132
oai-smf:
container_name: "rfsim5g-oai-smf"
image: oaisoftwarealliance/oai-smf:v2.1.10
environment:
- TZ=Europe/Paris
volumes:
- ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-smf/etc/config.yaml
depends_on:
- oai-amf
networks:
public_net:
ipv4_address: 192.168.71.133
oai-upf:
container_name: "rfsim5g-oai-upf"
image: oaisoftwarealliance/oai-upf:v2.1.10
init: true
environment:
- TZ=Europe/Paris
volumes:
- ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-upf/etc/config.yaml
depends_on:
- oai-smf
cap_add:
- NET_ADMIN
- SYS_ADMIN
cap_drop:
- ALL
privileged: true
networks:
public_net:
ipv4_address: 192.168.71.134
interface_name: eth0
traffic_net:
ipv4_address: 192.168.72.134
interface_name: eth1
oai-ext-dn:
privileged: true
container_name: rfsim5g-oai-ext-dn
image: oaisoftwarealliance/trf-gen-cn5g:latest
init: true
entrypoint: /bin/bash -c \
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
depends_on:
- oai-upf
networks:
traffic_net:
ipv4_address: 192.168.72.135
healthcheck:
test: /bin/bash -c "ping -c 2 192.168.72.134"
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
start_interval: 500ms
oai-gnb:
image: ${REGISTRY-oaisoftwarealliance/}${GNB_IMG:-oai-gnb}:${TAG:-develop}
container_name: rfsim5g-oai-gnb
cap_drop:
- ALL
environment:
USE_ADDITIONAL_OPTIONS: -E --log_config.global_log_options level,nocolor,time --device.name vrtsim --vrtsim.role server --vrtsim.chanmod 1
depends_on:
- oai-ext-dn
networks:
public_net:
ipv4_address: 192.168.71.140
volumes:
- ../../conf_files/gnb.sa.band78.106prb.vrtsim.2x2.yaml:/opt/oai-gnb/etc/gnb.yaml
- tmp_data:/tmp/
healthcheck:
test: /bin/bash -c "pgrep nr-softmodem"
interval: 10s
timeout: 5s
start_period: 10s
start_interval: 500ms
retries: 5
ipc: host
oai-nr-ue:
image: ${REGISTRY-oaisoftwarealliance/}${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
container_name: rfsim5g-oai-nr-ue
cap_drop:
- ALL
cap_add:
- NET_ADMIN # for interface bringup
- NET_RAW # for ping
environment:
USE_ADDITIONAL_OPTIONS: -E -r 106 --numerology 1 --band 78 -C 3619200000 --ssb 516 --uicc0.imsi 208990100001100 --log_config.global_log_options level,nocolor,time --device.name vrtsim
depends_on:
- oai-gnb
networks:
public_net:
ipv4_address: 192.168.71.150
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- ../../conf_files/nrue.vrtsim.chanmod.yaml:/opt/oai-nr-ue/etc/nr-ue.yaml
- tmp_data:/tmp/
healthcheck:
test: /bin/bash -c "pgrep nr-uesoftmodem"
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
start_interval: 500ms
ipc: host
networks:
public_net:
driver: bridge
name: rfsim5g-oai-public-net
ipam:
config:
- subnet: 192.168.71.128/26
driver_opts:
com.docker.network.bridge.name: "rfsim5g-public"
traffic_net:
driver: bridge
name: rfsim5g-oai-traffic-net
ipam:
config:
- subnet: 192.168.72.128/26
driver_opts:
com.docker.network.bridge.name: "rfsim5g-traffic"
volumes:
tmp_data:

View File

@@ -33,7 +33,7 @@ services:
timeout: 5s
retries: 5
oai-gnb-aerial:
cpuset: "13-16"
cpuset: "13-14"
image: ${REGISTRY-oaisoftwarealliance/}${GNB_IMG:-oai-gnb-aerial}:${TAG:-develop}
depends_on:
nv-cubb:

View File

@@ -82,6 +82,8 @@ Options:
Makes the NR softmodem
--RU
Makes the OAI RRU
--nrRU
Makes the OAI nrRRU
--UE
Makes the UE specific parts (usim, nvram) from the given configuration file
--nrUE
@@ -135,8 +137,6 @@ Options:
CC=/usr/bin/clang CXX=/usr/bin/clang++ ./build_oai ... --sanitize-memory
--sanitize-thread | -fsanitize=thread
Enable the thread sanitizer on all targets
--use-cuda
Tell build to use NVCC for appropriate .cu files and cuda_runtime functions
-h | --help
Print this help"
}
@@ -229,6 +229,11 @@ function main() {
TARGET_LIST="$TARGET_LIST oairu"
echo_info "Will compile RRU"
shift;;
--nrRU)
nrRU=1
TARGET_LIST="$TARGET_LIST oainr_ru"
echo_info "Will compile nrRRU"
shift;;
--UE)
UE=1
TARGET_LIST="$TARGET_LIST lte-uesoftmodem conf2uedata usim nvram"
@@ -384,9 +389,6 @@ function main() {
--sanitize-thread | -fsanitize=thread)
CMAKE_CMD="$CMAKE_CMD -DSANITIZE_THREAD=True"
shift;;
--use-cuda)
CMAKE_CMD="$CMAKE_CMD -DENABLE_CUDA=True"
shift;;
--trace-asn1c-enc-dec)
CMAKE_CMD="$CMAKE_CMD -DTRACE_ASN1C_ENC_DEC=ON"
echo_info "Enabling asn1c internal traces via OAI logging system"
@@ -457,7 +459,7 @@ function main() {
if [[ $TARGET_LIST != "" ]] && [[ -f $OPENAIR_DIR/CMakeLists.txt ]]; then
# add some default libraries that should always be built
# for eNB, gNB, UEs, simulators
if [[ $gNB == 1 || $eNB == 1 || $UE == 1 || $nrUE == 1 || $SIMUS_PHY == 1 || $RU == 1 ]]; then
if [[ $gNB == 1 || $eNB == 1 || $UE == 1 || $nrUE == 1 || $SIMUS_PHY == 1 || $RU == 1 || $nrRU == 1 ]]; then
TARGET_LIST="$TARGET_LIST params_libconfig coding rfsimulator dfts params_yaml vrtsim rf_emulator"
fi

View File

@@ -1,5 +1,5 @@
diff --git a/wls_lib/Makefile b/wls_lib/Makefile
index 2f8e4b2..7b99a26 100644
index 2f8e4b2..e657488 100644
--- a/wls_lib/Makefile
+++ b/wls_lib/Makefile
@@ -1,20 +1,6 @@
@@ -23,7 +23,7 @@ index 2f8e4b2..7b99a26 100644
+################################################################
+# <COPYRIGHT_TAG>
+################################################################
MYCUSTOMTAB=' '
MYCUSTOMSPACE='============================================================================================'
@@ -24,11 +10,17 @@ MYCUSTOMSPACE1='------------------------------------------------------------'
@@ -48,12 +48,9 @@ index 2f8e4b2..7b99a26 100644
else ifeq ($(WIRELESS_SDK_TOOLCHAIN),icx)
CC := icx
CPP := icx
@@ -42,11 +34,11 @@ endif
ifeq ($(WIRELESS_SDK_TARGET_ISA),sse)
TARGET_PROCESSOR := -xSSE4.2
@@ -44,9 +36,9 @@ ifeq ($(WIRELESS_SDK_TARGET_ISA),sse)
else ifeq ($(WIRELESS_SDK_TARGET_ISA),avx2)
- TARGET_PROCESSOR := -xCORE-AVX2
+ TARGET_PROCESSOR := -march=core-avx2
TARGET_PROCESSOR := -xCORE-AVX2
else ifeq ($(WIRELESS_SDK_TARGET_ISA),avx512)
- TARGET_PROCESSOR := -xCORE-AVX512
+ TARGET_PROCESSOR := -march=skylake-avx512
@@ -66,7 +63,7 @@ index 2f8e4b2..7b99a26 100644
@@ -66,15 +58,38 @@ PROJECT_DIR := ./
BUILDDIR := make
PROJECT_BINARY := $(PROJECT_NAME).so
+PKGCONF ?= pkg-config
+LIBDPDK_VERSION=20.11.3
+
@@ -82,7 +79,7 @@ index 2f8e4b2..7b99a26 100644
+$(error "Please define RTE_SDK environment variable OR install DPDK version $(LIBDPDK_VERSION)")
+endif
endif
-RTE_INC := $(shell PKG_CONFIG_PATH=/usr/lib64/pkgconfig:$(RTE_SDK)/build/meson-uninstalled pkgconf --cflags-only-I libdpdk)
+# At least one of the options is defined
+
@@ -91,10 +88,10 @@ index 2f8e4b2..7b99a26 100644
+else ifeq ($(DPDK_INSTALLED),1)
+ RTE_INC := $(shell PKG_CONFIG_PATH=/usr/lib64/pkgconfig $(PKGCONF) --cflags-only-I libdpdk)
+endif
CC_SRC = wls_lib_dpdk.c \
syslib.c
+CC_HDR = syslib.h \
+ ttypes.h \
+ wls.h \
@@ -107,74 +104,74 @@ index 2f8e4b2..7b99a26 100644
@@ -84,18 +99,19 @@ CC_FLAGS += -std=gnu11 -Wall -Wno-deprecated-declarations \
-Wimplicit-function-declaration \
-g -O3 -mcmodel=large $(TARGET_PROCESSOR)
-INC := -I$(RTE_INC)
+INC := -I$(RTE_INC) -I../intel_fapi/
DEF :=
AS_FLAGS :=
AR_FLAGS := rc
PROJECT_OBJ_DIR := $(BUILDDIR)/obj
+PROJECT_DEP_DIR := $(PROJECT_OBJ_DIR)/$(PROJECT_NAME).dep.d
CC_OBJS := $(patsubst %.c,%.o,$(CC_SRC))
AS_OBJS := $(patsubst %.s,%.o,$(AS_SRC))
OBJS := $(CC_OBJS) $(AS_OBJS) $(LIBS)
-DIRLIST := $(addprefix $(PROJECT_OBJ_DIR)/,$(sort $(dir $(OBJS))))
+DIRLIST := $(addprefix $(PROJECT_OBJ_DIR)/,$(sort $(dir $(OBJS)))) $(PROJECT_DEP_DIR)
CC_OBJTARGETS := $(addprefix $(PROJECT_OBJ_DIR)/,$(CC_OBJS))
@@ -104,9 +120,7 @@ CC_FLAGS_FULL := $(CC_FLAGS) $(INC) $(DEF)
AS_FLAGS := $(AS_FLAGS) $(INC)
-PROJECT_DEP_FILE := $(PROJECT_OBJ_DIR)/$(PROJECT_NAME).dep
-
-ifeq ($(wildcard $(PROJECT_DEP_FILE)),$(PROJECT_DEP_FILE))
+ifeq ($(wildcard $(PROJECT_DEP_DIR)),$(PROJECT_DEP_DIR))
GENERATE_DEPS :=
else
@@ -119,11 +133,11 @@ all : welcome_line $(PROJECT_BINARY)
.PHONY : clear_dep
clear_dep:
- @$(RM) $(PROJECT_DEP_FILE)
- @echo [DEP] $(subst $(PROJECT_OBJ_DIR)/,,$(PROJECT_DEP_FILE))
+ @echo [DEP] rm $(PROJECT_DEP_DIR)/$(@F).dep
+ @$(RM) $(PROJECT_DEP_DIR)/$(@F).dep
-$(CC_DEPS) :
- @$(CC) -MM $(subst __up__,../,$(subst __dep__,,$@)) -MT $(PROJECT_OBJ_DIR)/$(patsubst %.c,%.o,$(subst __up__,../,$(subst __dep__,,$@))) $(CC_FLAGS_FULL) >> $(PROJECT_DEP_FILE)
+$(CC_DEPS) : $(PROJECT_DEP_DIR)
+ @$(CC) $(CC_FLAGS_FULL) -MM $(subst __up__,../,$(subst __dep__,,$@)) -MT $(PROJECT_OBJ_DIR)/$(patsubst %.c,%.o,$(subst __up__,../,$(subst __dep__,,$@))) >> $(PROJECT_DEP_DIR)/$(@F).dep
.PHONY : generate_deps
generate_deps : clear_dep $(CC_DEPS)
@@ -136,17 +150,17 @@ echo_start_build :
$(DIRLIST) :
-@$(MD) $@
-$(CC_OBJTARGETS) :
+$(CC_OBJTARGETS) : $(GENERATE_DEPS)
@echo [CC] $(subst $(PROJECT_OBJ_DIR)/,,$@)
@$(CC) -c $(CC_FLAGS_FULL) -o"$@" $(patsubst %.o,%.c,$(subst $(PROJECT_OBJ_DIR)/,,$@))
-$(AS_OBJTARGETS) :
+$(AS_OBJTARGETS) : $(CC_OBJTARGETS) $(CPP_OBJTARGETS)
@echo [AS] $(subst $(PROJECT_OBJ_DIR)/,,$@)
@$(AS) $(AS_FLAGS) -o"$@" $(patsubst %.o,%.s,$(subst $(PROJECT_OBJ_DIR)/,,$@))
-ifeq ($(wildcard $(PROJECT_DEP_FILE)),$(PROJECT_DEP_FILE))
+ifeq ($(wildcard $(PROJECT_DEP_DIR)),$(PROJECT_DEP_DIR))
-include $(PROJECT_DEP_FILE)
+include $(PROJECT_DEP_DIR)/*
endif
@@ -156,7 +170,7 @@ clean:
@$(RM) $(CC_OBJTARGETS) $(AS_OBJTARGETS)
ifneq ($(wildcard $(PROJECT_DIR)/$(PROJECT_MAKE)),)
@@ -182,17 +179,17 @@ index 2f8e4b2..7b99a26 100644
- @$(RM) $(PROJECT_BINARY) $(PROJECT_BINARY_LIB) $(PROJECT_DEP_FILE)
+ @$(RM) -rf $(PROJECT_BINARY) $(PROJECT_BINARY_LIB) $(PROJECT_DEP_DIR)
endif
xclean: clean
@@ -172,7 +186,24 @@ welcome_line :
debug : all
release : all
-$(PROJECT_BINARY) : $(DIRLIST) echo_start_build $(GENERATE_DEPS) $(PRE_BUILD) $(CC_OBJTARGETS) $(AS_OBJTARGETS)
+$(PROJECT_BINARY) : $(DIRLIST) echo_start_build $(GENERATE_DEPS) $(CC_OBJTARGETS) $(AS_OBJTARGETS)
@echo [AR] $(subst $(BUILDDIR)/,,$@)
@$(CC) $(CC_OBJTARGETS) $(AS_OBJTARGETS) -shared -fPIC -o $@
+##############################################################
+# Install configuration
+##############################################################

View File

@@ -0,0 +1,52 @@
diff --git a/fhi_lib/lib/src/xran_cb_proc.c b/fhi_lib/lib/src/xran_cb_proc.c
index 2bb5187..8c5b848 100644
--- a/fhi_lib/lib/src/xran_cb_proc.c
+++ b/fhi_lib/lib/src/xran_cb_proc.c
@@ -460,7 +460,7 @@ xran_reg_sym_cb_rx_win_end(struct xran_device_ctx * p_dev_ctx, xran_callback_sym
int32_t ret = XRAN_STATUS_SUCCESS;
struct cb_user_per_sym_ctx *p_loc_sym_cb_ctx = &p_dev_ctx->symCbCtx[symb][XRAN_CB_SYM_RX_WIN_END];
uint32_t time_diff_us = 0;
- uint32_t time_diff_nSymb = 0;
+ int32_t time_diff_nSymb = 0;
uint32_t absolute_ota_sym = 0;
uint32_t interval_us_local = p_dev_ctx->interval_us_local;
@@ -470,17 +470,29 @@ xran_reg_sym_cb_rx_win_end(struct xran_device_ctx * p_dev_ctx, xran_callback_sym
return ret;
}
- time_diff_us = p_dev_ctx->fh_cfg.Ta4_max;
- printf("RX WIN end Ta4_max is %d [us] where TTI is %d [us] \n", time_diff_us, interval_us_local);
- time_diff_nSymb = time_diff_us*1000/(interval_us_local*1000/N_SYM_PER_SLOT);
- if ((time_diff_nSymb/1000/(interval_us_local*1000/N_SYM_PER_SLOT)) < time_diff_us) {
- time_diff_nSymb+=1;
- printf("time duration %d rounded up to duration of %d symbols\n", time_diff_us, time_diff_nSymb);
+ if (p_dev_ctx->fh_init.io_cfg.id == O_DU) {
+ time_diff_us = p_dev_ctx->fh_cfg.Ta4_max;
+ printf("RX WIN end Ta4_max is %d [us] where TTI is %d [us] \n", time_diff_us, interval_us_local);
+ time_diff_nSymb = time_diff_us*1000/(interval_us_local*1000/N_SYM_PER_SLOT);
+ if ((time_diff_nSymb/1000/(interval_us_local*1000/N_SYM_PER_SLOT)) < time_diff_us) {
+ time_diff_nSymb+=1;
+ printf("time duration %d rounded up to duration of %d symbols\n", time_diff_us, time_diff_nSymb);
+ }
+ printf("U-plane UL delay %d [us] measured against OTA time [offset in symbols is %d]\n", time_diff_us, time_diff_nSymb);
+ } else {
+ time_diff_us = p_dev_ctx->fh_cfg.T2a_min_up;
+ printf("RX WIN end T2a_min_up is %d [us] where TTI is %d [us] \n", time_diff_us, interval_us_local);
+ time_diff_nSymb = time_diff_us*1000/(interval_us_local*1000/N_SYM_PER_SLOT);
+ time_diff_nSymb *= -1;
+ printf("U-plane DL advance %d [us] measured against OTA time [offset in symbols is %d]\n", time_diff_us, time_diff_nSymb);
+ if (time_diff_nSymb == 0) {
+ print_err("T2a_min_up of %d results in 0 symbol offset leaving no time for O-RU processing. Increase T2a_min_up at least above 1 symbol\n", time_diff_us);
+ return -1;
+ }
}
- printf("U-plane UL delay %d [us] measured against OTA time [offset in symbols is %d]\n", time_diff_us, time_diff_nSymb);
- absolute_ota_sym = (symb + time_diff_nSymb) % XRAN_NUM_OF_SYMBOL_PER_SLOT;
+ absolute_ota_sym = (symb + time_diff_nSymb + XRAN_NUM_OF_SYMBOL_PER_SLOT) % XRAN_NUM_OF_SYMBOL_PER_SLOT;
printf("requested symb %d pkt arrival time [deadline] coresponds to symb %d OTA time\n", symb, absolute_ota_sym);
-
+ fflush(stdout);
p_loc_sym_cb_ctx->symb_num_req = symb;
p_loc_sym_cb_ctx->sym_diff = -time_diff_nSymb;
p_loc_sym_cb_ctx->symb_num_ota = absolute_ota_sym;

View File

@@ -0,0 +1,89 @@
diff --git a/fhi_lib/lib/src/xran_common.c b/fhi_lib/lib/src/xran_common.c
index 5968d01..eb9bb9f 100644
--- a/fhi_lib/lib/src/xran_common.c
+++ b/fhi_lib/lib/src/xran_common.c
@@ -908,7 +908,8 @@ inline int32_t prepare_symbol_ex(enum xran_pkt_dir direction,
uint32_t do_copy,
enum xran_comp_hdr_type staticEn,
uint16_t num_sections,
- uint16_t iq_offset)
+ uint16_t iq_offset,
+ bool is_prach)
{
int32_t n_bytes , iq_len_aggr = 0;
int32_t prep_bytes;
@@ -968,7 +969,7 @@ inline int32_t prepare_symbol_ex(enum xran_pkt_dir direction,
xp[idx].app_params.data_feature.value = 0x10;
xp[idx].app_params.data_feature.data_direction = direction;
// xp[idx].app_params.payl_ver = 1;
- // xp[idx].app_params.filter_id = 0;
+ xp[idx].app_params.data_feature.filter_id = is_prach ? 1 : 0;
xp[idx].app_params.frame_id = frame_id;
xp[idx].app_params.sf_slot_sym.subframe_id = subframe_id;
xp[idx].app_params.sf_slot_sym.slot_id = xran_slotid_convert(slot_id, 0);
@@ -1158,7 +1159,8 @@ int send_symbol_mult_section_ex(void *handle,
do_copy,
staticEn,
1,
- 0); /*Send a single section */
+ 0,
+ true); /*Send a single section */
prb_offset += prb_num_sec;
data_offset += n_bytes;
if(sent) {
@@ -1266,7 +1268,8 @@ int send_symbol_ex(void *handle,
do_copy,
staticEn,
1,
- 0); /*Send a single section */
+ 0,
+ true); /*Send a single section */
if(sent){
pCnt->tx_counter++;
diff --git a/fhi_lib/lib/src/xran_common.h b/fhi_lib/lib/src/xran_common.h
index 04076fd..245b1c0 100644
--- a/fhi_lib/lib/src/xran_common.h
+++ b/fhi_lib/lib/src/xran_common.h
@@ -201,7 +201,8 @@ int32_t prepare_symbol_ex(enum xran_pkt_dir direction,
uint32_t do_copy,
enum xran_comp_hdr_type staticEn,
uint16_t num_sections,
- uint16_t iq_buffer_offset);
+ uint16_t iq_buffer_offset,
+ bool is_prach);
int32_t prepare_sf_slot_sym (enum xran_pkt_dir direction,
uint8_t frame_id,
uint8_t subframe_id,
diff --git a/fhi_lib/lib/src/xran_tx_proc.c b/fhi_lib/lib/src/xran_tx_proc.c
index 85ce6fa..b7db317 100644
--- a/fhi_lib/lib/src/xran_tx_proc.c
+++ b/fhi_lib/lib/src/xran_tx_proc.c
@@ -23,6 +23,7 @@
* @author Intel Corporation
**/
+#include <stdbool.h>
#define _GNU_SOURCE
#include <sched.h>
#include <assert.h>
@@ -421,7 +422,8 @@ int32_t xran_process_tx_sym_cp_off(void *pHandle, uint8_t ctx_id, uint32_t tti,
0,
staticEn,
num_sections,
- p_sec_desc->iq_buffer_offset);
+ p_sec_desc->iq_buffer_offset,
+ false);
curr_sect_id += num_sections;
@@ -683,7 +685,8 @@ xran_process_tx_srs_cp_off(void *pHandle, uint8_t ctx_id, uint32_t tti, int32_t
0,
staticEn,
num_sections,
- 0);
+ 0,
+ false);
section_id += num_sections;

View File

@@ -32,11 +32,7 @@
#include <stdint.h>
#include <stdbool.h>
#define __STDC_WANT_IEC_60559_TYPES_EXT__
#include <float.h>
#ifdef __aarch64__
#include <arm_fp16.h>
#endif
#define ALIGNARRAYSIZE(a, b) (((a + b - 1) / b) * b)
#define ALNARS_16_4(a) ALIGNARRAYSIZE(a, 4)
@@ -50,18 +46,6 @@ typedef struct complexf {
float i;
} cf_t;
#ifdef FLT16_MAX
typedef struct complexf16 {
#ifdef __aarch64__
float16_t r;
float16_t i;
#else
_Float16 r;
_Float16 i;
#endif
} cf16_t;
#endif
typedef struct complex8 {
int8_t r;
int8_t i;

View File

@@ -21,7 +21,7 @@ The following options can be specified to trigger the information added in the h
- `line_num`: adds the (source code) line number
- `time`: add the time since the system started in format `ss.ssssss` (seconds and microseconds sourced from `CLOCK_MONOTONIC`)
- `wall_clock`: add the system-wide clock time that measures real (i.e., wall-clock) time in format `ss.ssssss` (seconds and microseconds since 1970-01-01 00:00:00 Coordinated Universal Time (UTC))
- `utc_time`: add the UTC (Coordinated Universal Time) time in format `[hh:mm:ss.ssssss]`. Note that this time is independent of the current time zone (it shows GMT). Also, printing this time has additional overhead compared to other time methods (due to time conversion and formatting).
- `utc_time`: add the UTC (Coordinated Universal Time) time in format `YYYY-MM-DD hh:mm:ss.ssssss UTC`. Note that this time is independent of the current time zone (it shows GMT). Also, printing this time has additional overhead compared to other time methods (due to time conversion and formatting).
Note: `time`, `utc_time` and `wall_clock` are mutually exclusive and cannot be used together.

View File

@@ -461,15 +461,9 @@ int register_log_component(const char *name, const char *fext, int compidx)
}
if (computed_compidx >= 0 && computed_compidx <MAX_LOG_COMPONENTS) {
log_component_t *c = &g_log->log_component[computed_compidx];
c->name = strdup(name);
int n = snprintf(c->headerName, sizeof(c->headerName), "[%s", c->name);
if (n >= sizeof(c->headerName) - 1) // snprintf() truncated
n = sizeof(c->headerName) - 2;
c->headerName[n] = ']';
c->headerName[n + 1] = 0;
c->stream = stdout;
c->filelog = 0;
g_log->log_component[computed_compidx].name = strdup(name);
g_log->log_component[computed_compidx].stream = stdout;
g_log->log_component[computed_compidx].filelog = 0;
g_log->log_rarely_used[computed_compidx].filelog_name = calloc(1, strlen(name) + 16); /* /tmp/<name>.%s */
sprintf(g_log->log_rarely_used[computed_compidx].filelog_name, "/tmp/%s.", name);
strncat(g_log->log_rarely_used[computed_compidx].filelog_name, fext, 3);
@@ -515,15 +509,12 @@ int logInit (void)
for (int i = 0; i < MAX_LOG_PREDEF_COMPONENTS; i++)
register_log_component(comp_name[i], comp_extension[i], i);
for (int i=0 ; log_level_names[i].name != NULL ; i++)
g_log->level2string[i] = toupper(log_level_names[i].name[0]); // uppercased first letter of level name
g_log->filelog_name = "/tmp/openair.log";
log_getconfig(g_log);
for (int i = 0; log_level_names[i].name != NULL; i++)
if (g_log->flag & FLAG_LEVEL)
snprintf(g_log->level2string[i], sizeof g_log->level2string[i], " %c ", toupper(log_level_names[i].name[0]));
else
snprintf(g_log->level2string[i], sizeof g_log->level2string[i], " ");
// set all unused component items to 0, they are for non predefined components
for (int i=MAX_LOG_PREDEF_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
memset(&(g_log->log_component[i]),0,sizeof(log_component_t));
@@ -584,7 +575,8 @@ static inline int log_header(log_component_t *c,
struct tm utc_time;
if (gmtime_r(&t.tv_sec, &utc_time) == NULL)
abort();
snprintf(timeString, sizeof(timeString), "[%02d:%02d:%02d.%06lu] ",
snprintf(timeString, sizeof(timeString), "%04d-%02d-%02d %02d:%02d:%02d.%06lu UTC ",
utc_time.tm_year + 1900, utc_time.tm_mon + 1, utc_time.tm_mday,
utc_time.tm_hour, utc_time.tm_min, utc_time.tm_sec, t.tv_nsec / 1000);
} else {
snprintf(timeString, sizeof(timeString), "%lu.%06lu ",
@@ -601,18 +593,15 @@ static inline int log_header(log_component_t *c,
} else {
threadIdString[0] = 0;
}
return snprintf(log_buffer,
buffsize,
"%s%s%s%-8s%s%-*s%s",
flag & FLAG_NOCOLOR ? "" : log_level_highlight_start[level],
timeString,
threadIdString,
c->headerName,
g_log->level2string[level], // will print space if no level selected
l[0] == 0 ? 0 : 32,
l,
threadname);
return snprintf(log_buffer, buffsize, "%s%s%s[%s] %c %s%s",
flag & FLAG_NOCOLOR ? "" : log_level_highlight_start[level],
timeString,
threadIdString,
c->name,
flag & FLAG_LEVEL ? g_log->level2string[level] : ' ',
l,
threadname
);
}
void logRecord_mt(const char *file,

View File

@@ -206,7 +206,6 @@ typedef struct {
typedef struct {
const char *name;
char headerName[19];
int level;
int filelog;
FILE *stream;
@@ -218,7 +217,7 @@ typedef struct {
typedef struct {
log_component_t log_component[MAX_LOG_COMPONENTS];
log_component_back_t log_rarely_used[MAX_LOG_COMPONENTS];
char level2string[NUM_LOG_LEVEL][4];
char level2string[NUM_LOG_LEVEL];
int flag;
char *filelog_name;
debug_flags_t debug_mask;

View File

@@ -459,50 +459,12 @@ bool compare_relative_ul_channel_bw(int nr_band, int scs, int channel_bandwidth,
return rel_bw > limit;
}
static bool check_delta_duplex(int index, uint64_t dlfreq_khz, uint64_t ulfreq_khz, int64_t dlbw, int64_t ulbw)
{
int uldl_min_offset = nr_bandtable[index].dl_min - nr_bandtable[index].ul_min;
int txrx_offset = dlfreq_khz - ulfreq_khz;
LOG_I(NR_PHY, "dlfreq:%ld ulfreq:%ld deltaduplex:%d khz, uldl_min_offset:%d khz\n",
dlfreq_khz, ulfreq_khz, txrx_offset, uldl_min_offset);
if (txrx_offset == uldl_min_offset)
return true;
int band = nr_bandtable[index].band;
// Refer to section 5.4.4 in spec 38.101-5
if (band == 256 && txrx_offset >= 165000 && txrx_offset <= 215000)
return true;
if (band == 255 && txrx_offset >= -130500 && txrx_offset <= -72500)
return true;
if (band == 254 && txrx_offset >= 862000 && txrx_offset <= 885000)
return true;
// Refer to section 5.4.4 in spec 38.101-1 for these bands 24, 91-94, 109
if (band == 24 && (txrx_offset == -101500 || txrx_offset == -120500))
return true;
//Delta duplex is also a range for these bands n91-n94, n109.
if ((band >= 91 && band <= 94) || band == 109) {
dlbw = ((dlbw / 1000) + 1) * 1000;
ulbw = ((ulbw / 1000) + 1) * 1000;
int lower_limit = nr_bandtable[index].dl_min - nr_bandtable[index].ul_max + ((dlbw + ulbw) >> 1);
int upper_limit = nr_bandtable[index].dl_max - nr_bandtable[index].ul_min - ((dlbw + ulbw) >> 1);
LOG_I(NR_PHY, "Band %d dlbw:%ld Khz, ulbw: %ld Khz RXTX lower limit:%d khz, upper limit:%d khz\n",
band, dlbw, ulbw, lower_limit, upper_limit);
if (txrx_offset >= lower_limit && txrx_offset <= upper_limit)
return true;
}
return false;
}
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex, int64_t dlbw, int64_t ulbw)
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex)
{
const int64_t dl_freq_khz = downlink_frequency / 1000;
const int32_t delta_duplex_khz = delta_duplex / 1000;
const int64_t ul_freq_khz = dl_freq_khz + delta_duplex_khz;
uint64_t center_freq_diff_khz = UINT64_MAX; // 2^64
uint16_t current_band = 0;
for (int ind = 0; ind < sizeofArray(nr_bandtable); ind++) {
@@ -510,13 +472,17 @@ uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex, int64_t dlb
if (dl_freq_khz < nr_bandtable[ind].dl_min || dl_freq_khz > nr_bandtable[ind].dl_max)
continue;
if (ul_freq_khz < nr_bandtable[ind].ul_min || ul_freq_khz > nr_bandtable[ind].ul_max)
int32_t current_offset_khz = nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min;
if (current_offset_khz != delta_duplex_khz)
continue;
if (!check_delta_duplex(ind, dl_freq_khz, ul_freq_khz, dlbw, ulbw))
continue;
int64_t center_frequency_khz = (nr_bandtable[ind].dl_max + nr_bandtable[ind].dl_min) / 2;
current_band = nr_bandtable[ind].band;
if (labs(dl_freq_khz - center_frequency_khz) < center_freq_diff_khz){
current_band = nr_bandtable[ind].band;
center_freq_diff_khz = labs(dl_freq_khz - center_frequency_khz);
}
}
printf("DL frequency %"PRIu64": band %d, UL frequency %"PRIu64"\n",
@@ -575,8 +541,8 @@ int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L,
return f;
}
void get_coreset_rballoc(const uint8_t *FreqDomainResource, int *n_rb, int *rb_offset)
{
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) {
uint8_t count=0, start=0, start_set=0;
uint64_t bitmap = (((uint64_t)FreqDomainResource[0])<<37)|
@@ -599,7 +565,7 @@ void get_coreset_rballoc(const uint8_t *FreqDomainResource, int *n_rb, int *rb_o
}
// According to 38.211 7.3.2.2
int get_coreset_num_cces(const uint8_t *FreqDomainResource, int duration)
int get_coreset_num_cces(uint8_t *FreqDomainResource, int duration)
{
int num_rbs;
int rb_offset;

View File

@@ -280,12 +280,12 @@ uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint8_t scs_index, ui
int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs);
int get_SLIV(uint8_t S, uint8_t L);
void get_coreset_rballoc(const uint8_t *FreqDomainResource, int *n_rb, int *rb_offset);
int get_coreset_num_cces(const uint8_t *FreqDomainResource, int duration);
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
int get_coreset_num_cces(uint8_t *FreqDomainResource, int duration);
int get_nr_table_idx(int nr_bandP, uint8_t scs_index);
int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index);
frame_type_t get_frame_type(uint16_t nr_bandP, uint8_t scs_index);
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex, int64_t dlbw, int64_t ulbw);
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex);
int NRRIV2BW(int locationAndBandwidth,int N_RB);
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize);

View File

@@ -208,8 +208,11 @@ IQChannelErrorType shm_td_iq_channel_rx(ShmTDIQChannel *channel,
size_t num_samples_first_copy = CIRCULAR_BUFFER_SIZE - first_sample;
memcpy(tx_iq_data, base_ptr + first_sample, num_samples_first_copy * sizeof(sample_t));
memcpy(tx_iq_data + num_samples_first_copy, base_ptr, (num_samples - num_samples_first_copy) * sizeof(sample_t));
memset(base_ptr + first_sample, 0, num_samples_first_copy * sizeof(sample_t));
memset(base_ptr, 0, (num_samples - num_samples_first_copy) * sizeof(sample_t));
} else {
memcpy(tx_iq_data, base_ptr + first_sample, num_samples * sizeof(sample_t));
memset(base_ptr + first_sample, 0, num_samples * sizeof(sample_t));
}
return CHANNEL_NO_ERROR;
}

View File

@@ -282,14 +282,25 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name,
ret=pthread_create(t, &attr, func, param);
AssertFatal(ret == 0, "Error in pthread_create(): ret: %d, errno: %d\n", ret, errno);
pthread_setname_np(*t, name);
if (affinity != -1 ) {
char short_name[16];
strncpy(short_name, name, sizeof(short_name) - 1);
short_name[sizeof(short_name) - 1] = '\0';
ret = pthread_setname_np(*t, short_name);
AssertFatal(ret == 0, "Error in pthread_setname_np(): ret: %d, errno: %d\n", ret, errno);
if (affinity != -1) {
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(affinity, &cpuset);
ret = pthread_setaffinity_np(*t, sizeof(cpu_set_t), &cpuset);
AssertFatal(ret == 0, "Error in pthread_getaffinity_np(): ret: %d, errno: %d", ret, errno);
} else {
cpu_set_t cpuset;
ret = sched_getaffinity(0, sizeof(cpu_set_t), &cpuset);
AssertFatal(ret == 0, "Error in sched_getaffinity(): ret: %d, errno: %d", ret, errno);
ret = pthread_setaffinity_np(*t, sizeof(cpu_set_t), &cpuset);
AssertFatal(ret == 0, "Error in pthread_setaffinity_np(): ret: %d, errno: %d", ret, errno);
}
pthread_attr_destroy(&attr);
}

View File

@@ -62,7 +62,7 @@ add_dependencies(telnetsrv telnetsrv_ci)
message(STATUS "Add CI specific telnet functions for nrUE in telnetsrv_ciUE.so")
add_library(telnetsrv_ciUE MODULE telnetsrv_ciUE.c)
target_link_libraries(telnetsrv_ciUE PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs UTIL NR_L2_UE nr_nas)
target_link_libraries(telnetsrv_ciUE PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs UTIL)
add_dependencies(telnetsrv telnetsrv_ciUE)
message(STATUS "Add bearer specific telnet functions in libtelnetsrv_bearer.so")

View File

@@ -50,9 +50,7 @@
#include "telnetsrv_ltemeasur_def.h"
#include "telnetsrv_cpumeasur_def.h"
#include "openair2/LAYER2/NR_MAC_UE/mac_defs.h"
#include "openair1/PHY/defs_nr_UE.h"
extern PHY_VARS_NR_UE ***PHY_vars_UE_g;
#include "openair1/PHY/phy_extern_nr_ue.h"
void measurcmd_display_macstats(telnet_printfunc_t prnt);
void measurcmd_display_macstats_ue(telnet_printfunc_t prnt);

View File

@@ -38,9 +38,7 @@
#include "openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h"
#include "openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h"
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
#include "openair2/LAYER2/NR_MAC_gNB/mac_config.h"
#include "openair2/RRC/NR/rrc_gNB_mobility.h"
#include "openair3/NGAP/ngap_gNB_ue_context.h"
#define TELNETSERVERCODE
#include "telnetsrv.h"
@@ -277,8 +275,6 @@ static int get_current_bwp(char *buf, int debug, telnet_printfunc_t prnt)
if (rnti < 0)
ERROR_MSG_RET("could not identify UE (no UE, no such RNTI, or multiple UEs)\n");
NR_UE_info_t *UE = find_nr_UE(&RC.nrmac[0]->UE_info, rnti);
if (!UE)
ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti);
int dl_bwp = UE->current_DL_BWP.bwp_id;
const char *dl_bwp_text = dl_bwp > 0 ? "dedicated" : "initial";
int ul_bwp = UE->current_UL_BWP.bwp_id;
@@ -288,104 +284,6 @@ static int get_current_bwp(char *buf, int debug, telnet_printfunc_t prnt)
return 0;
}
/** @brief Trigger NGAP PDU Session Release for one or more PDU sessions associated with a UE ID/
* Syntax: trigger_pdu_session_release [ue_id=gNB_ue_ngap_id(int,opt)],pdusession_id(int)[,pdusession_id(int)...]
* - If the gNB_ue_ngap_id is omitted, it is fetched from the only UE present in the RRC layer
* - At least one valid PDU session ID must be provided
* @param[in] buf Comma-separated input string: [ue_id=gNB_ue_ngap_id(int,opt)],PDU1[,PDU2,...]
* @param[in] debug Not used.
* @param[in] prnt Callback for telnet output printing.
* @return 0 on success; negative value on error. */
static int trigger_ngap_pdu_session_release(char *buf, int debug, telnet_printfunc_t prnt)
{
if (buf == NULL) {
ERROR_MSG_RET("Missing input. Usage: trigger_pdu_session_release [ue_id=gNB_ue_ngap_id(int,opt)],pdusession_id(int)[,pdusession_id(int)...]\n");
}
char *tokens[NGAP_MAX_PDU_SESSION + 1];
int count = 0;
for (char *tok = strtok(buf, ","); tok != NULL && count < (int)sizeofArray(tokens); tok = strtok(NULL, ",")) {
tokens[count++] = tok;
}
if (count < 1) {
ERROR_MSG_RET("Invalid input. Usage: trigger_pdu_session_release [ue_id=gNB_ue_ngap_id(int,opt)],pdusession_id(int)[,pdusession_id(int)...]\n");
}
int gNB_ue_ngap_id = -1;
int pdu_start_index = 0;
if (strncmp(tokens[0], "ue_id=", 6) == 0) {
gNB_ue_ngap_id = atoi(tokens[0] + 6);
pdu_start_index = 1;
} else {
// No UE ID: infer it
if (!RC.nrrrc)
ERROR_MSG_RET("No RRC present\n");
rrc_gNB_ue_context_t *ue = get_single_rrc_ue();
if (!ue)
ERROR_MSG_RET("No single UE in RRC present\n");
gNB_ue_ngap_id = ue->ue_context.rrc_ue_id;
}
if (pdu_start_index >= count) {
ERROR_MSG_RET("No pdusession_id(int) provided\n");
}
ngap_gNB_ue_context_t *ngap = ngap_get_ue_context(gNB_ue_ngap_id);
if (!ngap) {
ERROR_MSG_RET("No NGAP UE context for gNB_ue_ngap_id %d\n", gNB_ue_ngap_id);
}
MessageDef *message_p = itti_alloc_new_message(TASK_NGAP, 0, NGAP_PDUSESSION_RELEASE_COMMAND);
ngap_pdusession_release_command_t *msg = &NGAP_PDUSESSION_RELEASE_COMMAND(message_p);
memset(msg, 0, sizeof(*msg));
msg->amf_ue_ngap_id = ngap->amf_ue_ngap_id;
msg->gNB_ue_ngap_id = ngap->gNB_ue_ngap_id;
int nb_sessions = 0;
for (int i = pdu_start_index; i < count; ++i) {
int sid = atoi(tokens[i]);
if (sid < 1 || sid > 255) {
ERROR_MSG_RET("Invalid pdusession_id(int): %s (must be between 1 and 255)\n", tokens[i]);
}
msg->pdusession_ids[nb_sessions++] = sid;
}
msg->nb_pdusessions_torelease = nb_sessions;
if (prnt) {
prnt("Triggering NGAP PDU Session Release for gNB_ue_ngap_id=%d: releasing pdusession_id=%d", gNB_ue_ngap_id);
for (int i = 0; i < nb_sessions; ++i) {
prnt(" %d,", msg->pdusession_ids[i]);
}
prnt("\n");
}
itti_send_msg_to_task(TASK_RRC_GNB, 0, message_p);
return 0;
}
static int trigger_bwp_switch(char *buf, int debug, telnet_printfunc_t prnt)
{
char *sbwpId = strtok(buf, " ");
int bwpId = atoi(sbwpId);
char *srnti = strtok(NULL, " ");
prnt("bwpId %d rnti %s\n", bwpId, srnti);
int rnti = fetch_rnti(srnti, prnt);
if (rnti < 0)
ERROR_MSG_RET("could not identify UE (no UE, no such RNTI, or multiple UEs)\n");
if (!nr_trigger_bwp_switch(rnti, bwpId)) {
prnt("failed trigger BWP switch for UE %04x BWP ID %d\n", rnti, bwpId);
return -1;
} else {
prnt("triggered BWP switch to BWP ID %d for UE %04x\n", bwpId, rnti);
return 0;
}
}
static telnetshell_cmddef_t cicmds[] = {
{"get_single_rnti", "", get_single_rnti},
{"force_reestab", "[rnti(hex,opt)]", trigger_reestab},
@@ -395,9 +293,7 @@ static telnetshell_cmddef_t cicmds[] = {
{"trigger_f1_ho", "[rrc_ue_id(int,opt)]", rrc_gNB_trigger_f1_ho},
{"fetch_du_by_ue_id", "[rrc_ue_id(int,opt)]", fetch_du_by_ue_id},
{"get_current_bwp", "[rnti(hex,opt)]", get_current_bwp},
{"trigger_bwp_switch", "newBWPId [rnti(hex,opt)]", trigger_bwp_switch},
{"trigger_n2_ho", "[neighbour_pci(uint32_t),ueId(uint32_t)]", rrc_gNB_trigger_n2_ho},
{"pdu_session_release", "[gNB_ue_ngap_id(int,opt)]", trigger_ngap_pdu_session_release},
{"", "", NULL},
};

View File

@@ -37,17 +37,12 @@
#include "openair2/LAYER2/NR_MAC_UE/mac_defs.h"
#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
#include "openair2/RRC/NR_UE/rrc_proto.h"
#include "openair1/PHY/defs_nr_common.h"
#include "openair1/PHY/defs_nr_UE.h"
#include "openair3/NAS/NR_UE/nr_nas_msg.h"
#define TELNETSERVERCODE
#include "telnetsrv.h"
#define ERROR_MSG_RET(mSG, aRGS...) do { prnt(mSG, ##aRGS); return 1; } while (0)
extern PHY_VARS_NR_UE ***PHY_vars_UE_g;
/* UE L2 state string */
const char* NR_UE_L2_STATE_STR[] = {
#define UE_STATE(state) #state,
@@ -55,14 +50,6 @@ const char* NR_UE_L2_STATE_STR[] = {
#undef UE_STATE
};
static int get_default_ue_id(void)
{
NR_UE_RRC_INST_t *rrc = get_NR_UE_rrc_inst(0);
if (!rrc)
return -1;
return rrc->ue_id;
}
/**
* Get the synchronization state of a UE.
*
@@ -123,60 +110,6 @@ static int force_deregistration(char *buf, int debug, telnet_printfunc_t prnt)
return 0;
}
extern float get_prs_max_dl_toa(prs_meas_t *prs_meas);
static int get_dl_toa(char *buf, int debug, telnet_printfunc_t prnt)
{
// TODO multiple antennas, resources, gNBs?
int gNB_id = 0;
int rsc_id = 0;
int ant = 0;
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[0][0];
if (!UE || !UE->prs_vars[gNB_id])
ERROR_MSG_RET("no UE/prs_vars found!\n");
NR_PRS_RESOURCE_t *prs_res = &UE->prs_vars[gNB_id]->prs_resource[rsc_id];
if (!prs_res->prs_meas || !prs_res->prs_meas[ant])
ERROR_MSG_RET("prs_meas not initialized!\n");
float max = get_prs_max_dl_toa(prs_res->prs_meas[ant]);
prnt("UE max PRS DL ToA %.3f\n", max);
return 0;
}
static int add_pdu_session(char *buf, int debug, telnet_printfunc_t prnt)
{
int ue_id = -1;
int pdusession_id = -1;
if (!buf) {
ERROR_MSG_RET("Missing argument: expected PDUSessionID[,UE_ID]\n");
}
// Try parsing values in the form: "PDUSessionID[,UE_ID]"
int n = sscanf(buf, "%d,%d", &pdusession_id, &ue_id);
if (n == 1) {
// Only PDUSessionID provided: use default UE ID
ue_id = get_default_ue_id();
if (ue_id < 0)
ERROR_MSG_RET("No default UE context found\n");
} else if (n != 2) {
ERROR_MSG_RET("Invalid format: expected PDUSessionID[,UE_ID]\n");
}
if (pdusession_id < 0 || pdusession_id > 255)
ERROR_MSG_RET("PDUSessionID must be in range [0,255]\n");
if (ue_id < 0)
ERROR_MSG_RET("UE_ID must be >= 0\n");
nr_ue_nas_t *nas = get_ue_nas_info(ue_id);
if (!nas)
ERROR_MSG_RET("No NAS context found for UE_ID %d\n", ue_id);
request_pdusession(nas, pdusession_id);
prnt("Triggered PDU session request for UE %d with ID %d\n", ue_id, pdusession_id);
return 0;
}
/* Telnet shell command definitions */
static telnetshell_cmddef_t cicmds[] = {
{"sync_state", "[UE_ID(int,opt)]", get_sync_state},
@@ -184,8 +117,6 @@ static telnetshell_cmddef_t cicmds[] = {
{"force_RRC_IDLE", "", force_RRC_IDLE},
{"force_crnti_ra", "", force_crnti_ra},
{"deregistration", "", force_deregistration},
{"get_max_dl_toa", "[ant]", get_dl_toa},
{"add_pdu_session", "[PDUSessionID(int)],[UE_ID(int,opt)]", add_pdu_session},
{"", "", NULL},
};

View File

@@ -105,10 +105,10 @@ static int get_stats(char *buf, int debug, telnet_printfunc_t prnt)
int bw_index = get_supported_band_index(scs, fr, nrb);
int bw_mhz = get_supported_bw_mhz(fr, bw_index);
const dlul_mac_stats_t *stat = &mac->mac_stats;
static dlul_mac_stats_t last = {0};
int diff_used = stat->dl.used_prb_aggregate - last.dl.used_prb_aggregate;
int diff_total = stat->dl.total_prb_aggregate - last.dl.total_prb_aggregate;
const mac_stats_t *stat = &mac->mac_stats;
static mac_stats_t last = {0};
int diff_used = stat->used_prb_aggregate - last.used_prb_aggregate;
int diff_total = stat->total_prb_aggregate - last.total_prb_aggregate;
int load = diff_total > 0 ? 100 * diff_used / diff_total : 0;
last = *stat;

View File

@@ -105,7 +105,7 @@ static inline uint64_t rdtsc_oai(void) __attribute__((always_inline));
static inline uint64_t rdtsc_oai(void)
{
uint64_t r = 0;
__asm__ volatile("mrs %0, cntvct_el0" : "=r"(r));
asm volatile("mrs %0, cntvct_el0" : "=r"(r));
return r;
}
@@ -113,7 +113,7 @@ static inline uint64_t rdtsc_oai(void)
static inline uint32_t rdtsc_oai(void) __attribute__((always_inline));
static inline uint32_t rdtsc_oai(void) {
uint32_t r = 0;
__asm__ volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(r) );
asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(r) );
return r;
}
#endif

View File

@@ -33,8 +33,8 @@ extern "C" {
__typeof__ (b) _b = (b); \
_a < _b ? _a : _b; })
#define IS_BIT_SET(a, b) ((a >> b) & 1)
#define SET_BIT(a, b) (a | (1 << b))
#ifdef __cplusplus
#ifdef min

View File

@@ -82,7 +82,7 @@ of the FAPI 10.04 version of the SRS PDU, and RX_Beamforming PDU.
| Applicative Threads | Allocated CPUs |
|------------------------|----------------|
| PTP & PHC2SYS Services | 41 |
| OAI `nr-softmodem` | 13-16 |
| OAI `nr-softmodem` | 13-14 |
## PTP configuration

View File

@@ -1916,6 +1916,8 @@ INPUT = \
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/E1AP/e1ap_api.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/E1AP/e1ap_setup.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/E1AP/e1ap_asnc.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/NR_PHY_INTERFACE/nr_sched_response.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/NR_PHY_INTERFACE/nr_sched_response.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/NR_PHY_INTERFACE/NR_IF_Module.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/NR_PHY_INTERFACE/NR_IF_Module.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/SDAP/nr_sdap/nr_sdap.h \
@@ -1924,6 +1926,7 @@ INPUT = \
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/SDAP/nr_sdap/nr_sdap_entity.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/defs_gNB.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/impl_defs_top.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/phy_extern_nr_ue.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/INIT/lte_parms.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/INIT/nr_init_ru.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/INIT/nr_parms.c \
@@ -2009,6 +2012,7 @@ INPUT = \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_TRANSPORT/nr_sss.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_TRANSPORT/nr_uci_tools_common.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_TRANSPORT/nr_prach.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_TRANSPORT/nr_scrambling.c \
@@ -2290,8 +2294,10 @@ INPUT = \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR/phy_frame_config_nr.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR/phy_frame_config_nr.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR/nr_prach_procedures.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR/fapi_nr_l1.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR/phy_procedures_nr_gNB.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR/sched_nr.h \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR/fapi_nr_l1.c \
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR/nr_ru_procedures.c \
@CMAKE_CURRENT_SOURCE_DIR@/../radio/ETHERNET/if_defs.h \
@CMAKE_CURRENT_SOURCE_DIR@/../radio/ETHERNET/ethernet_lib.h \

View File

@@ -72,36 +72,3 @@ sequenceDiagram
u->>c: BEARER CONTEXT MODIFICATION RESPONSE
Note over c: e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_RESPONSE
```
## PDU Session Release
```mermaid
sequenceDiagram
participant AMF
participant CUCP
participant CUUP
participant DU
participant UE
AMF->>CUCP: NG PDU SESSION RESOURCE RELEASE COMMAND
Note over CUCP: ngap_gNB_handle_pdusession_release_command
CUCP->>CUCP: rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND
Note over CUCP: set status PDU_SESSION_STATUS_TORELEASE
CUCP->>CUUP: E1 Bearer Context Modification Request
Note over CUUP: release_gtpu_tunnel (GTP tunnel, PDCP, SDAP)
CUUP->>CUCP: E1 Bearer Context Modification Response
Note over CUCP: rrc_gNB_send_f1_drb_release_request
CUCP->>DU: F1 UE Context Modification Request
Note over DU: handle_ue_context_drbs_release (release in MAC/RLC)
DU->>CUCP: F1 UE Context Modification Response
Note over CUCP: rrc_CU_process_ue_context_modification_response
Note over CUCP: replace existing CellGroupConfig
Note over CUCP: rrc_gNB_generate_dedicatedRRCReconfiguration
CUCP->>UE: RRCReconfiguration (DRB release list, NAS PDU)
UE->>CUCP: RRCReconfigurationComplete
Note over CUCP: handle_rrcReconfigurationComplete
Note over CUCP: rrc_gNB_send_NGAP_PDUSESSION_RELEASE_RESPONSE
CUCP->>AMF: NG PDU SESSION RESOURCE RELEASE RESPONSE
Note over CUCP: rm_drbs_by_pdusession (from stored RRC list)
Note over CUCP: rm_pduSession (from stored RRC list)
```

View File

@@ -352,9 +352,7 @@ These modes of operation are supported:
- Formats 0,1,2,3, A1-A3, B1-B3
* NTN
- TA adjustemt based on ntn-Config-r17 information
- Different TA adjustemt algorithms between SIB19 receptions:
- Autonomous TA adjustemt based on DL time tracking
- Standard compliant epoch time based TA adjustment including orbital propagation
- Autonomous TA adjustemt between SIB19 receptions based on DL time tracking
- UL Doppler pre-compensation based on continuous DL FO estimation
* Highly efficient 3GPP compliant LDPC encoder and decoder (BG1 and BG2 are supported)
* Highly efficient 3GPP compliant polar encoder and decoder

View File

@@ -420,29 +420,3 @@ Note that you should increase the aggregation level candidates as described in
[the corresponding section above](#pdcch-aggregation-level). This is because the
scheduler has to schedule multiple DCIs in a single DL slots for multiple UL
slots. As a suggestion, you could try `uess_agg_levels = [4, 2, 2, 0, 0]`.
## Multiple Dedicated BWPs
A maximum of 4 dedicated BWPs can be configured for a UE per standard, but only
1 BWP can be active in UL and DL direction at a given time. In the code we
only configure a single BWP for the UE at a given time and we would switch by
reconfiguring this BWP. All this procedure is transparent for users and LOGs
mark BWP switching according to the configuration file enumeration. It is
possible to configure multiple dedicated BWPs and 1st active BWP via
configuration file.
### Setup of the Configuration files ##
In the configuration file you have the option to select the 1st active BWP, the
BWP location and SCS of each BWP in the following way (example with 2
additional BWPs):
```
first_active_bwp = 1;
bwp_list = ({ scs = 1; bwpStart = 0; bwpSize = 106;},
{ scs = 1; bwpStart = 0; bwpSize = 24;});
```
This example configures 3 additional BWPs, with IDs from 1 to 3. A similar
example can be found in configuration file
`ci-scripts/conf_files/gnb-du.sa.band78.106prb.usrpb200.conf` tested in CI.

View File

@@ -161,9 +161,9 @@ unpack function is called.
## P7 DL Transmission by VNF
DL messages are scheduled at the VNF, through gNB_dlsch_ulsch_scheduler(). gNB_dlsch_ulsch_scheduler() is called when
handling a SLOT.indication message in phy_nr_slot_indication().
handling a SLOT.indication message in trigger_scheduler().
The function phy_nr_slot_indication(nfapi_nr_slot_indication_scf_t *slot_ind) calls the functions oai_nfapi_[DL P7 msg]_
The function trigger_scheduler(nfapi_nr_slot_indication_scf_t *slot_ind) calls the functions oai_nfapi_[DL P7 msg]_
req(), calling in turn call the send_p7_msg function pointer, which contain the logic to pack the message into a buffer
and send it to the PNF.
Finally, NR_UL_indication is called to process the other P7 messages received from the PNF that were put in theire
@@ -215,7 +215,7 @@ bool nfapi_vnf_p7_tx_data_req(nfapi_vnf_p7_config_t* config, nfapi_nr_tx_data_re
graph TD
softmodem_start[nr-softmodem init] --> P5_configuration[configure_nr_nfapi_vnf] --> transport_init[Transport mechanism init] --> send_first_msg[Send first P5 message to PNF]
transport_init[Transport mechanism init] --> P5_recv_loop[P5 receive loop] -- P5 Message processing --> P5_recv_loop[P5 receive loop]
P5_recv_loop[P5 receive loop] -- Start.response callback called --> P7_config[P7 Configuration] --> P7_loop[P7 Loop] --> P7_msg_recv[P7 message received] --> call_vnf_handle_p7[Call vnf_nr_handle_p7_msg] --> hdr_unpack[Unpack header] --> call_specific_p7_handler[Call specific P7 message handler] --> slot_ind[Is a SLOT.indication?] -- Yes --> trig_scheduler[Call phy_nr_slot_indication] --> gNB_ulsch_dlsch_sched[Call gNB_dlsch_ulsch_scheduler] --> send_p7_dl[Process and send P7 messages to PNF] --> call_ul_ind[Call NR_UL_indication] --> proc_p7[Process P7 messages in queue] --> P7_loop[P7 Loop]
P5_recv_loop[P5 receive loop] -- Start.response callback called --> P7_config[P7 Configuration] --> P7_loop[P7 Loop] --> P7_msg_recv[P7 message received] --> call_vnf_handle_p7[Call vnf_nr_handle_p7_msg] --> hdr_unpack[Unpack header] --> call_specific_p7_handler[Call specific P7 message handler] --> slot_ind[Is a SLOT.indication?] -- Yes --> trig_scheduler[Call trigger_scheduler] --> gNB_ulsch_dlsch_sched[Call gNB_dlsch_ulsch_scheduler] --> send_p7_dl[Process and send P7 messages to PNF] --> call_ul_ind[Call NR_UL_indication] --> proc_p7[Process P7 messages in queue] --> P7_loop[P7 Loop]
slot_ind[Is a SLOT.indication?] -- No --> put_queue[Put message in queue] --> P7_loop[P7 Loop];

View File

@@ -1243,8 +1243,8 @@ In OAI gNB, we support:
```
The reference specifications:
* `O-RAN.WG4.MP.0-R004-v16.01`
* `O-RAN.WG4.MP-YANGs-R004-v16.01`
* `O-RAN.WG4.MP.0-v05.00`
* `O-RAN.WG4.MP-YANGs-v04.00`
## M-plane prerequisites
Before proceeding, please make sure you have a support for 7.2 interface, as described in [Prerequisites](#prerequisites).
@@ -1366,7 +1366,7 @@ sudo ldconfig
If you would like to install these libraries in the custom path, please replace `/usr/local` default path to e.g. `/opt/mplane-v2`.
## Benetel O-RU
Note: RAN550/650 v1.2.2 and v1.4.1 have been successfully tested.
Note: Only v1.2.2 RAN550 and RAN650 have been successfully tested.
### One time steps
Connect to the RU as user `root`, enable the mplane service, and reboot:
@@ -1400,8 +1400,6 @@ The reference DU configuration file for two Benetel RAN650:
[gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650-mplane.conf](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650-mplane.conf)
In order to run gNB/DU with M-plane, we need to modify Tx gain `att_tx` in RU section, as well as the `fhi_72` section in the configuration file.
**Important note: Benetel v1.4.1 requires only one VF if the same VLAN tag is used for both C-/U-planes. Otherwise, C-plane will not be properly configured. Benetel v1.2.2 will receive the C-plane packets no matter the DU MAC address value.**
Example for one RU:
```bash
fhi_72 = {
@@ -1575,14 +1573,14 @@ sequenceDiagram
<details>
<summary>4x4 MIMO and 100MHz BW with Benetel 550 RU v1.2.2 example run</summary>
<summary>4x4 MIMO and 100MHz BW with Benetel 550 RU example run</summary>
```
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <connect> with username "oranbenetel" and port ID "830".
[HW] [MPLANE] Successfuly connected to RU "192.168.80.9" with username "oranbenetel" and port ID "830".
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get> operational datastore.
[HW] [MPLANE] Successfully retrieved operational datastore from RU "192.168.80.9".
[HW] [MPLANE] RU is in "LOCKED" sync state.
[HW] [MPLANE] RU is already PTP synchronized.
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <subscribe> with stream "NETCONF" and filter "(null)".
[HW] [MPLANE] RPC reply = OK.
[HW] [MPLANE] Successfully subscribed to all notifications from RU "192.168.80.9".
@@ -2225,861 +2223,6 @@ sequenceDiagram
```
</details>
<details>
<summary>4x4 MIMO and 100MHz BW with Benetel 550 RU v1.4.1 example run</summary>
```
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <connect> with username "oranbenetel" and port ID "830".
[HW] [MPLANE] Successfuly connected to RU "192.168.81.4" with username "oranbenetel" and port ID "830".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get> operational datastore.
[HW] [MPLANE] Successfully retrieved operational datastore from RU "192.168.81.4".
[HW] [MPLANE] RU is already PTP synchronized.
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <subscribe> with stream "NETCONF" and filter "(null)".
[HW] [MPLANE] RPC reply = OK.
[HW] [MPLANE] Successfully subscribed to all notifications from RU "192.168.81.4".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = "<supervision-watchdog-reset xmlns="urn:o-ran:supervision:1.0">
<supervision-notification-interval>65535</supervision-notification-interval>
<guard-timer-overhead>65535</guard-timer-overhead>
</supervision-watchdog-reset>".
[HW] [MPLANE] Successfully updated supervision timer to (65535+65535)[s] for RU "192.168.81.4".
[HW] [MPLANE] Watchdog timer answer:
<next-update-at xmlns="urn:o-ran:supervision:1.0">2025-08-29T06:49:32+02:00</next-update-at>
[HW] [MPLANE] Interface MTU 1500 unreliable/not correctly reported by Benetel O-RU, hardcoding to 9600.
[HW] [MPLANE] IQ bitwidth 16 unreliable/not correctly reported by Benetel O-RU, hardcoding to 9.
[HW] [MPLANE] Storing the following information to forward to xran:
RU MAC address 70:b3:d5:e1:5b:81
MTU 9600
IQ bitwidth 9
PRACH offset 4
DU port bitmask 61440
Band sector bitmask 3840
CC ID bitmask 240
RU port ID bitmask 15
DU port ID 0
Band sector ID 0
CC ID 0
RU port ID 0
max Tx gain 24.0
[HW] [MPLANE] Successfully retrieved all the U-plane info - interface name, TX/RX carrier names, and TX/RX endpoint names.
[HW] [MPLANE] Successfully retreived all performance measurement names.
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-yang-metadata".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "yang".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-inet-types".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-yang-types".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-yang-schema-mount".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-yang-structure-ext".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-datastores".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "sysrepo".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf-acm".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-factory-default".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "sysrepo-factory-default".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-yang-library".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "sysrepo-monitoring".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "sysrepo-plugind".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf-with-defaults".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf-notifications".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-origin".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf-monitoring".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf-nmda".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "nc-notifications".
[HW] [MPLANE] [LIBYANG] ERROR: Data model "notifications" not found in local searchdirs. (path: (null)).
[HW] [MPLANE] [LIBYANG] ERROR: Loading "notifications" module failed. (path: (null)).
[HW] [MPLANE] [LIBYANG] ERROR: Parsing module "nc-notifications" failed. (path: (null)).
[HW] [MPLANE] Unable to load module "nc-notifications" from RU "192.168.81.4".
[HW] [MPLANE] Unable to load all yang modules from operational datastore for RU "192.168.81.4". Using yang models present in "models" subfolder.
[HW] [MPLANE] Successfully loaded all yang modules for RU "192.168.81.4".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <edit-config>:
<interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
<interface>
<name>INTERFACE_0</name>
<type xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type">ianaift:l2vlan</type>
<enabled>true</enabled>
<mac-address xmlns="urn:o-ran:interfaces:1.0">70:b3:d5:e1:5b:81</mac-address>
<base-interface xmlns="urn:o-ran:interfaces:1.0">eth0</base-interface>
<vlan-id xmlns="urn:o-ran:interfaces:1.0">3</vlan-id>
</interface>
</interfaces>
<performance-measurement-objects xmlns="urn:o-ran:performance-management:1.0">
<rx-window-measurement-interval>10</rx-window-measurement-interval>
<tx-measurement-interval>10</tx-measurement-interval>
<notification-interval>10</notification-interval>
<rx-window-measurement-objects>
<measurement-object>RX_ON_TIME</measurement-object>
<active>false</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_EARLY</measurement-object>
<active>false</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_LATE</measurement-object>
<active>false</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_TOTAL</measurement-object>
<active>false</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_ON_TIME_C</measurement-object>
<active>false</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_EARLY_C</measurement-object>
<active>false</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_LATE_C</measurement-object>
<active>false</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<tx-measurement-objects>
<measurement-object>TX_TOTAL</measurement-object>
<active>false</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</tx-measurement-objects>
</performance-measurement-objects>
<processing-elements xmlns="urn:o-ran:processing-element:1.0">
<transport-session-type>ETH-INTERFACE</transport-session-type>
<ru-elements>
<name>PLANE_0</name>
<transport-flow>
<interface-name>INTERFACE_0</interface-name>
<eth-flow>
<ru-mac-address>70:b3:d5:e1:5b:81</ru-mac-address>
<vlan-id>3</vlan-id>
<o-du-mac-address>00:11:22:33:44:66</o-du-mac-address>
</eth-flow>
</transport-flow>
</ru-elements>
</processing-elements>
<user-plane-configuration xmlns="urn:o-ran:uplane-conf:1.0">
<low-level-tx-links>
<name>PdschLink0</name>
<processing-element>PLANE_0</processing-element>
<tx-array-carrier>TxArray0</tx-array-carrier>
<low-level-tx-endpoint>LowLevelTxEndpoint0</low-level-tx-endpoint>
</low-level-tx-links>
<low-level-tx-links>
<name>PdschLink1</name>
<processing-element>PLANE_0</processing-element>
<tx-array-carrier>TxArray1</tx-array-carrier>
<low-level-tx-endpoint>LowLevelTxEndpoint1</low-level-tx-endpoint>
</low-level-tx-links>
<low-level-tx-links>
<name>PdschLink2</name>
<processing-element>PLANE_0</processing-element>
<tx-array-carrier>TxArray2</tx-array-carrier>
<low-level-tx-endpoint>LowLevelTxEndpoint2</low-level-tx-endpoint>
</low-level-tx-links>
<low-level-tx-links>
<name>PdschLink3</name>
<processing-element>PLANE_0</processing-element>
<tx-array-carrier>TxArray3</tx-array-carrier>
<low-level-tx-endpoint>LowLevelTxEndpoint3</low-level-tx-endpoint>
</low-level-tx-links>
<low-level-rx-links>
<name>PuschLink0</name>
<processing-element>PLANE_0</processing-element>
<rx-array-carrier>RxArray0</rx-array-carrier>
<low-level-rx-endpoint>LowLevelRxEndpoint0</low-level-rx-endpoint>
</low-level-rx-links>
<low-level-rx-links>
<name>PrachLink0</name>
<processing-element>PLANE_0</processing-element>
<rx-array-carrier>RxArray0</rx-array-carrier>
<low-level-rx-endpoint>LowLevelRxPrachEndpoint0</low-level-rx-endpoint>
</low-level-rx-links>
<low-level-rx-links>
<name>PuschLink1</name>
<processing-element>PLANE_0</processing-element>
<rx-array-carrier>RxArray1</rx-array-carrier>
<low-level-rx-endpoint>LowLevelRxEndpoint1</low-level-rx-endpoint>
</low-level-rx-links>
<low-level-rx-links>
<name>PrachLink1</name>
<processing-element>PLANE_0</processing-element>
<rx-array-carrier>RxArray1</rx-array-carrier>
<low-level-rx-endpoint>LowLevelRxPrachEndpoint1</low-level-rx-endpoint>
</low-level-rx-links>
<low-level-rx-links>
<name>PuschLink2</name>
<processing-element>PLANE_0</processing-element>
<rx-array-carrier>RxArray2</rx-array-carrier>
<low-level-rx-endpoint>LowLevelRxEndpoint2</low-level-rx-endpoint>
</low-level-rx-links>
<low-level-rx-links>
<name>PrachLink2</name>
<processing-element>PLANE_0</processing-element>
<rx-array-carrier>RxArray2</rx-array-carrier>
<low-level-rx-endpoint>LowLevelRxPrachEndpoint2</low-level-rx-endpoint>
</low-level-rx-links>
<low-level-rx-links>
<name>PuschLink3</name>
<processing-element>PLANE_0</processing-element>
<rx-array-carrier>RxArray3</rx-array-carrier>
<low-level-rx-endpoint>LowLevelRxEndpoint3</low-level-rx-endpoint>
</low-level-rx-links>
<low-level-rx-links>
<name>PrachLink3</name>
<processing-element>PLANE_0</processing-element>
<rx-array-carrier>RxArray3</rx-array-carrier>
<low-level-rx-endpoint>LowLevelRxPrachEndpoint3</low-level-rx-endpoint>
</low-level-rx-links>
<low-level-tx-endpoints>
<name>LowLevelTxEndpoint0</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>0</eaxc-id>
</e-axcid>
</low-level-tx-endpoints>
<low-level-tx-endpoints>
<name>LowLevelTxEndpoint1</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>1</eaxc-id>
</e-axcid>
</low-level-tx-endpoints>
<low-level-tx-endpoints>
<name>LowLevelTxEndpoint2</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>2</eaxc-id>
</e-axcid>
</low-level-tx-endpoints>
<low-level-tx-endpoints>
<name>LowLevelTxEndpoint3</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>3</eaxc-id>
</e-axcid>
</low-level-tx-endpoints>
<low-level-rx-endpoints>
<name>LowLevelRxEndpoint0</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<ul-fft-sampling-offsets>
<scs>KHZ_30</scs>
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
</ul-fft-sampling-offsets>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>0</eaxc-id>
</e-axcid>
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
</low-level-rx-endpoints>
<low-level-rx-endpoints>
<name>LowLevelRxPrachEndpoint0</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<ul-fft-sampling-offsets>
<scs>KHZ_30</scs>
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
</ul-fft-sampling-offsets>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>4</eaxc-id>
</e-axcid>
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
</low-level-rx-endpoints>
<low-level-rx-endpoints>
<name>LowLevelRxEndpoint1</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<ul-fft-sampling-offsets>
<scs>KHZ_30</scs>
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
</ul-fft-sampling-offsets>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>1</eaxc-id>
</e-axcid>
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
</low-level-rx-endpoints>
<low-level-rx-endpoints>
<name>LowLevelRxPrachEndpoint1</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<ul-fft-sampling-offsets>
<scs>KHZ_30</scs>
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
</ul-fft-sampling-offsets>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>5</eaxc-id>
</e-axcid>
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
</low-level-rx-endpoints>
<low-level-rx-endpoints>
<name>LowLevelRxEndpoint2</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<ul-fft-sampling-offsets>
<scs>KHZ_30</scs>
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
</ul-fft-sampling-offsets>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>2</eaxc-id>
</e-axcid>
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
</low-level-rx-endpoints>
<low-level-rx-endpoints>
<name>LowLevelRxPrachEndpoint2</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<ul-fft-sampling-offsets>
<scs>KHZ_30</scs>
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
</ul-fft-sampling-offsets>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>6</eaxc-id>
</e-axcid>
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
</low-level-rx-endpoints>
<low-level-rx-endpoints>
<name>LowLevelRxEndpoint3</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<ul-fft-sampling-offsets>
<scs>KHZ_30</scs>
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
</ul-fft-sampling-offsets>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>3</eaxc-id>
</e-axcid>
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
</low-level-rx-endpoints>
<low-level-rx-endpoints>
<name>LowLevelRxPrachEndpoint3</name>
<compression>
<iq-bitwidth>9</iq-bitwidth>
<compression-type>STATIC</compression-type>
</compression>
<frame-structure>193</frame-structure>
<cp-type>NORMAL</cp-type>
<cp-length>352</cp-length>
<cp-length-other>288</cp-length-other>
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
<ul-fft-sampling-offsets>
<scs>KHZ_30</scs>
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
</ul-fft-sampling-offsets>
<e-axcid>
<o-du-port-bitmask>61440</o-du-port-bitmask>
<band-sector-bitmask>3840</band-sector-bitmask>
<ccid-bitmask>240</ccid-bitmask>
<ru-port-bitmask>15</ru-port-bitmask>
<eaxc-id>7</eaxc-id>
</e-axcid>
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
</low-level-rx-endpoints>
<tx-array-carriers>
<name>TxArray0</name>
<absolute-frequency-center>623334</absolute-frequency-center>
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
<channel-bandwidth>100000000</channel-bandwidth>
<active>ACTIVE</active>
<gain>24.0</gain>
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
<downlink-sfn-offset>0</downlink-sfn-offset>
</tx-array-carriers>
<tx-array-carriers>
<name>TxArray1</name>
<absolute-frequency-center>623334</absolute-frequency-center>
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
<channel-bandwidth>100000000</channel-bandwidth>
<active>ACTIVE</active>
<gain>24.0</gain>
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
<downlink-sfn-offset>0</downlink-sfn-offset>
</tx-array-carriers>
<tx-array-carriers>
<name>TxArray2</name>
<absolute-frequency-center>623334</absolute-frequency-center>
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
<channel-bandwidth>100000000</channel-bandwidth>
<active>ACTIVE</active>
<gain>24.0</gain>
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
<downlink-sfn-offset>0</downlink-sfn-offset>
</tx-array-carriers>
<tx-array-carriers>
<name>TxArray3</name>
<absolute-frequency-center>623334</absolute-frequency-center>
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
<channel-bandwidth>100000000</channel-bandwidth>
<active>ACTIVE</active>
<gain>24.0</gain>
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
<downlink-sfn-offset>0</downlink-sfn-offset>
</tx-array-carriers>
<rx-array-carriers>
<name>RxArray0</name>
<absolute-frequency-center>623334</absolute-frequency-center>
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
<channel-bandwidth>100000000</channel-bandwidth>
<active>ACTIVE</active>
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
<downlink-sfn-offset>0</downlink-sfn-offset>
<gain-correction>0.0</gain-correction>
<n-ta-offset>0</n-ta-offset>
</rx-array-carriers>
<rx-array-carriers>
<name>RxArray1</name>
<absolute-frequency-center>623334</absolute-frequency-center>
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
<channel-bandwidth>100000000</channel-bandwidth>
<active>ACTIVE</active>
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
<downlink-sfn-offset>0</downlink-sfn-offset>
<gain-correction>0.0</gain-correction>
<n-ta-offset>0</n-ta-offset>
</rx-array-carriers>
<rx-array-carriers>
<name>RxArray2</name>
<absolute-frequency-center>623334</absolute-frequency-center>
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
<channel-bandwidth>100000000</channel-bandwidth>
<active>ACTIVE</active>
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
<downlink-sfn-offset>0</downlink-sfn-offset>
<gain-correction>0.0</gain-correction>
<n-ta-offset>0</n-ta-offset>
</rx-array-carriers>
<rx-array-carriers>
<name>RxArray3</name>
<absolute-frequency-center>623334</absolute-frequency-center>
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
<channel-bandwidth>100000000</channel-bandwidth>
<active>ACTIVE</active>
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
<downlink-sfn-offset>0</downlink-sfn-offset>
<gain-correction>0.0</gain-correction>
<n-ta-offset>0</n-ta-offset>
</rx-array-carriers>
</user-plane-configuration>
[HW] [MPLANE] RPC reply = OK.
[HW] [MPLANE] Successfully edited the candidate datastore for RU "192.168.81.4".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <validate> candidate datastore.
[HW] [MPLANE] RPC reply = OK.
[HW] [MPLANE] Successfully validated candidate datastore for RU "192.168.81.4".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <commit> candidate datastore.
[HW] [MPLANE] RPC reply = OK.
[HW] [MPLANE] Successfully commited configuration into running datastore for RU "192.168.81.4".
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.335228846+00:00)
{
"o-ran-uplane-conf:rx-array-carriers-state-change": {
"rx-array-carriers": [
{
"name": "RxArray0",
"state": "BUSY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.368360865+00:00)
{
"o-ran-uplane-conf:rx-array-carriers-state-change": {
"rx-array-carriers": [
{
"name": "RxArray1",
"state": "BUSY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.414703766+00:00)
{
"o-ran-uplane-conf:rx-array-carriers-state-change": {
"rx-array-carriers": [
{
"name": "RxArray2",
"state": "BUSY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.452921618+00:00)
{
"o-ran-uplane-conf:rx-array-carriers-state-change": {
"rx-array-carriers": [
{
"name": "RxArray3",
"state": "BUSY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.471419021+00:00)
{
"ietf-netconf-notifications:netconf-config-change": {
"changed-by": {
"username": "root",
"session-id": 0
},
"datastore": "running",
"edit": [
{
"target": "/ietf-interfaces:interfaces/interface[name='INTERFACE_0']",
"operation": "create"
},
{
"target": "/ietf-interfaces:interfaces/interface[name='INTERFACE_0']/name",
"operation": "create"
},
...
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.678251110+00:00)
{
"o-ran-uplane-conf:tx-array-carriers-state-change": {
"tx-array-carriers": [
{
"name": "TxArray0",
"state": "BUSY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.715498360+00:00)
{
"o-ran-uplane-conf:tx-array-carriers-state-change": {
"tx-array-carriers": [
{
"name": "TxArray1",
"state": "BUSY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.830268973+00:00)
{
"o-ran-uplane-conf:tx-array-carriers-state-change": {
"tx-array-carriers": [
{
"name": "TxArray2",
"state": "BUSY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.853387657+00:00)
{
"o-ran-uplane-conf:tx-array-carriers-state-change": {
"tx-array-carriers": [
{
"name": "TxArray3",
"state": "BUSY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.515262267+00:00)
{
"o-ran-uplane-conf:rx-array-carriers-state-change": {
"rx-array-carriers": [
{
"name": "RxArray0",
"state": "READY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.535692962+00:00)
{
"o-ran-uplane-conf:rx-array-carriers-state-change": {
"rx-array-carriers": [
{
"name": "RxArray1",
"state": "READY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.557423764+00:00)
{
"o-ran-uplane-conf:rx-array-carriers-state-change": {
"rx-array-carriers": [
{
"name": "RxArray2",
"state": "READY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.579066867+00:00)
{
"o-ran-uplane-conf:rx-array-carriers-state-change": {
"rx-array-carriers": [
{
"name": "RxArray3",
"state": "READY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.604192995+00:00)
{
"o-ran-uplane-conf:tx-array-carriers-state-change": {
"tx-array-carriers": [
{
"name": "TxArray0",
"state": "READY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.629830498+00:00)
{
"o-ran-uplane-conf:tx-array-carriers-state-change": {
"tx-array-carriers": [
{
"name": "TxArray1",
"state": "READY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.651062685+00:00)
{
"o-ran-uplane-conf:tx-array-carriers-state-change": {
"tx-array-carriers": [
{
"name": "TxArray2",
"state": "READY"
}
]
}
}
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.672865767+00:00)
{
"o-ran-uplane-conf:tx-array-carriers-state-change": {
"tx-array-carriers": [
{
"name": "TxArray3",
"state": "READY"
}
]
}
}
[HW] [MPLANE] RU "192.168.81.4" is now ready.
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <edit-config>:
<performance-measurement-objects xmlns="urn:o-ran:performance-management:1.0">
<rx-window-measurement-interval>10</rx-window-measurement-interval>
<tx-measurement-interval>10</tx-measurement-interval>
<notification-interval>10</notification-interval>
<rx-window-measurement-objects>
<measurement-object>RX_ON_TIME</measurement-object>
<active>true</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_EARLY</measurement-object>
<active>true</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_LATE</measurement-object>
<active>true</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_TOTAL</measurement-object>
<active>true</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_ON_TIME_C</measurement-object>
<active>true</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_EARLY_C</measurement-object>
<active>true</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<rx-window-measurement-objects>
<measurement-object>RX_LATE_C</measurement-object>
<active>true</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</rx-window-measurement-objects>
<tx-measurement-objects>
<measurement-object>TX_TOTAL</measurement-object>
<active>true</active>
<object-unit>RU</object-unit>
<report-info>COUNT</report-info>
</tx-measurement-objects>
</performance-measurement-objects>
[HW] [MPLANE] RPC reply = OK.
[HW] [MPLANE] Successfully edited the candidate datastore for RU "192.168.81.4".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <validate> candidate datastore.
[HW] [MPLANE] RPC reply = OK.
[HW] [MPLANE] Successfully validated candidate datastore for RU "192.168.81.4".
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <commit> candidate datastore.
[HW] [MPLANE] RPC reply = OK.
[HW] [MPLANE] Successfully commited configuration into running datastore for RU "192.168.81.4".
[HW] [MPLANE] Sucessfully activated PM after start-up procedure for RU "192.168.81.4".
```
</details>
Note: If you wish to run the fronthaul without M-plane, no need for recompilation, as the library `oran_fhlib_5g` already exists.
The only mandatory step is to link `oran_fhlib_5g` to `oai_transpro` library.

View File

@@ -356,9 +356,7 @@ sudo ./ran_build/build/nr-uesoftmodem -O ../targets/PROJECTS/GENERIC-NR-5GC/CONF
For LEO satellite scenarios, the parameter `--ntn-initial-time-drift` must be provided via command line, as the UE needs this value to compensate for the time drift during initial sync, before SIB19 was received.
This parameter provides the drift rate of the complete DL timing (incl. feeder link and service link) in µs/s.
To perform an autonomous TA update based on the DL drift, the boolean parameter `--autonomous-ta` can be added.
If that parameter is omitted, the TA is continuously computed based on the SIB19 information.
Also, to perform an autonomous TA update based on the DL drift, the boolean parameter `--autonomous-ta` should be added in case of a LEO satellite scenario.
For LEO satellite scenario we assume the LO to be very accurate and the main FO contribution comes from Doppler shift.
Therefore, we use the command line parameter `--cont-fo-comp 2` to continuously compensate the DL Doppler and pre-compensate the UL Doppler.
@@ -369,7 +367,7 @@ For other information on optional NR UE command line options, please refer [here
So an example NR UE command for FDD, 5MHz BW, 15 kHz SCS, transparent LEO satellite 5G NR NTN is this:
```
cd cmake_targets
sudo ./ran_build/build/nr-uesoftmodem -O ../targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.conf --band 254 -C 2488400000 --CO -873500000 -r 25 --numerology 0 --ssb 60 --rfsim --rfsimulator.prop_delay 20 --rfsimulator.options chanmod --time-sync-I 0.1 --ntn-initial-time-drift -46 --initial-fo 57340 --cont-fo-comp 2
sudo ./ran_build/build/nr-uesoftmodem -O ../targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.conf --band 254 -C 2488400000 --CO -873500000 -r 25 --numerology 0 --ssb 60 --rfsim --rfsimulator.prop_delay 20 --rfsimulator.options chanmod --time-sync-I 0.1 --ntn-initial-time-drift -46 --autonomous-ta --initial-fo 57340 --cont-fo-comp 2
```
# Specific OAI modes
@@ -470,30 +468,19 @@ The hardcoded DRBs will be treated like GBR Flows. Due to code limitations at th
## IF setup with OAI
OAI is also compatible with Intermediate Frequency (IF) equipment, allowing the
use of RF front-ends operating on arbitrary frequency bands that do not conform
to the standardized 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.
### OAIUE configuration
To configure IF frequencies on the UE side, provide the following command-line
options:
- `if_freq`: DL frequency in Hz
- `if_freq_off`: UL frequency offset in Hz
To configure the IF frequencies it is necessary to use two command-line options at UE side:
- `if_freq`, downlink frequency in Hz
- `if_freq_off`, uplink frequency offset in Hz
### gNB configuration
On the gNB side, the corresponding parameters must be set in the RUs section of
the configuration file:
- `if_freq`: DL frequency in Hz
- `if_offset`: UL frequency offset in Hz
> Note: When using a libconfig-based configuration file for the gNB, ensure that
> `if_freq` numeric value is suffixed with "L" so it is correctly parsed as
> 64-bit integer.
Accordingly, the following parameters must be configured in the RUs section of the gNB configuration file:
- `if_freq`
- `if_offset`
### Run OAI with custom DL/UL arbitrary frequencies
The following example uses DL frequency 2169.080 MHz and UL frequency offset
-400 MHz, with a configuration file for band 66 (FDD) at gNB side.
The following example uses DL frequency 2169.080 MHz and UL frequency offset -400 MHz, with a configuration file for band 66 (FDD) at gNB side.
On two separate machines with USRPs, run:

View File

@@ -0,0 +1,44 @@
# Procedure to add dedicated Bandwidth part (BWP)
## Contributed by 5G Testbed IISc
### Developers: Abhijith A, Shruthi S
# Terminology #
## Bandwidth part (BWP) ##
Bandwidth Part (BWP) is a set of contiguous Resource Blocks in the resource grid.
Parameters of a BWP are communicated to UE using RRC parameters: BWP-Downlink and BWP-Uplink.
A UE can be configured with a set of 4 BWPs in uplink (UL) and downlink (DL) direction (3GPP TS 38.331 Annex B.2 Description of BWP configuration options). But only 1 BWP can be active in UL and DL direction at a given time.
# Procedure to run multiple dedicated BWPs #
A maximum of 4 dedicated BWPs can be configured for a UE.
To configure multiple BWPs, add the following parameters in the physical parameters section:
## Setup of the Configuration files ##
In the configuration file you have the option to select the 1st active BWP, the RIV and SCS of each BWP in the following way (example with 3 additional BWPs):
```
first_active_bwp = 1;
bwp_list = ({ scs = 1; bwpStart = 0; bwpSize = 106;},
{ scs = 1; bwpStart = 0; bwpSize = 51;},
{ scs = 1; bwpStart = 0; bwpSize = 24;});
```
This example configures 3 additional BWPs, with IDs from 1 to 3. Find these parameters in this configuration file: "ci-scripts/conf_files/gnb.sa.band78.106prb.rfsim.neighbour.conf"
# Testing gNB and UE in RF simulator
## gNB command:
```
sudo ./nr-softmodem -O ../../../ci-scripts/conf_files/gnb.sa.band78.106prb.rfsim.neighbour.conf --rfsim --rfsimulator.serveraddr server
```
## UE command:
```
sudo ./nr-uesoftmodem -C 3319680000 -r 106 --numerology 1 --ssb 516 --band 78 --rfsim --rfsimulator.serveraddr 127.0.0.1
```

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