mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-17 06:30:31 +00:00
Compare commits
4 Commits
fix-null-p
...
bugfix-e1-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25af8f49b2 | ||
|
|
181762978c | ||
|
|
e84adc6057 | ||
|
|
76f7b29277 |
226
CMakeLists.txt
226
CMakeLists.txt
@@ -260,6 +260,7 @@ endif()
|
||||
|
||||
# Debug related options
|
||||
#########################################
|
||||
add_boolean_option(DEBUG_ASN1 False "Enable ASN1 debug logs" OFF)
|
||||
# asn1c skeletons have hardcoded this flag to make customized debug logs
|
||||
# OAI uses this feature to re-use OAI LOG_I(ASN1, ...)
|
||||
# see common/utils/config.h
|
||||
@@ -298,7 +299,6 @@ message(STATUS "Selected KPM Version: ${KPM_VERSION}")
|
||||
|
||||
|
||||
add_boolean_option(ENABLE_IMSCOPE OFF "Enable phy scope based on imgui" OFF)
|
||||
add_boolean_option(ENABLE_IMSCOPE_RECORD OFF "Enable recording IQ data for imscope" OFF)
|
||||
|
||||
##################################################
|
||||
# ASN.1 grammar C code generation & dependencies #
|
||||
@@ -346,7 +346,6 @@ set(NGAP_DIR ${OPENAIR3_DIR}/NGAP)
|
||||
include_directories ("${NGAP_DIR}")
|
||||
add_library(ngap
|
||||
${NGAP_DIR}/ngap_gNB.c
|
||||
${NGAP_DIR}/ngap_common.c
|
||||
${NGAP_DIR}/ngap_gNB_context_management_procedures.c
|
||||
${NGAP_DIR}/ngap_gNB_decoder.c
|
||||
${NGAP_DIR}/ngap_gNB_encoder.c
|
||||
@@ -450,7 +449,7 @@ add_library(f1ap
|
||||
${F1AP_DIR}/f1ap_handlers.c
|
||||
${F1AP_DIR}/f1ap_itti_messaging.c)
|
||||
target_include_directories(f1ap PUBLIC F1AP_DIR)
|
||||
target_link_libraries(f1ap PUBLIC asn1_f1ap GTPV1U)
|
||||
target_link_libraries(f1ap PUBLIC asn1_f1ap L2_NR)
|
||||
target_link_libraries(f1ap PRIVATE ngap nr_rrc HASHTABLE f1ap_lib)
|
||||
target_include_directories(f1ap PRIVATE ${F1AP_DIR}/lib)
|
||||
|
||||
@@ -495,6 +494,7 @@ include_directories ("${OPENAIR_DIR}/radio/COMMON")
|
||||
add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION with max 256 UE" ON)
|
||||
add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION with max 256 UE" ON)
|
||||
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE" ON)
|
||||
add_boolean_option(UESIM_EXPANSION False "enable UESIM_EXPANSION with max 256 UE" ON)
|
||||
|
||||
##########################
|
||||
# SCHEDULING/REAL-TIME/PERF options
|
||||
@@ -506,15 +506,20 @@ add_boolean_option(ENABLE_VCD_FIFO False "time measurements of proc cal
|
||||
##########################
|
||||
# PHY options
|
||||
##########################
|
||||
add_integer_option(MAX_NUM_CCs 1 "Carrier component data arrays size (oai doesn't support carrier aggreagtion for now)" ON)
|
||||
add_boolean_option(LOCALIZATION False "???" ON)
|
||||
add_integer_option(MAX_NUM_CCs 1 "????" ON)
|
||||
add_boolean_option(SMBV False "Rohde&Schwarz SMBV100A vector signal generator" ON)
|
||||
add_boolean_option(DEBUG_PHY False "Enable PHY layer debugging options" ON)
|
||||
add_boolean_option(DEBUG_PHY_PROC False "Enable debugging of PHY layer procedures" ON)
|
||||
add_boolean_option(MEX False "Enabling compilation with mex" ON)
|
||||
|
||||
##########################
|
||||
# NAS LAYER OPTIONS
|
||||
##########################
|
||||
add_boolean_option(ENABLE_NAS_UE_LOGGING True "????" ON)
|
||||
add_boolean_option(NAS_BUILT_IN_UE True "UE NAS layer present in this executable" ON)
|
||||
add_boolean_option(NAS_UE True "NAS UE INSTANCE (<> NAS_MME)" ON)
|
||||
|
||||
|
||||
##########################
|
||||
# RRC LAYER OPTIONS
|
||||
@@ -682,6 +687,7 @@ set(SCHED_SRC_NR_UE
|
||||
${OPENAIR1_DIR}/SCHED_NR_UE/phy_procedures_nr_ue.c
|
||||
${OPENAIR1_DIR}/SCHED_NR_UE/phy_procedures_nr_ue_sl.c
|
||||
${OPENAIR1_DIR}/SCHED_NR_UE/fapi_nr_ue_l1.c
|
||||
${OPENAIR1_DIR}/SCHED_NR_UE/phy_frame_config_nr_ue.c
|
||||
${OPENAIR1_DIR}/SCHED_NR_UE/harq_nr.c
|
||||
${OPENAIR1_DIR}/SCHED_NR_UE/pucch_uci_ue_nr.c
|
||||
)
|
||||
@@ -710,7 +716,6 @@ set(NFAPI_PNF_SRC
|
||||
)
|
||||
add_library(NFAPI_PNF_LIB ${NFAPI_PNF_SRC})
|
||||
target_link_libraries(NFAPI_PNF_LIB PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||
target_link_libraries(NFAPI_PNF_LIB PUBLIC nr_fapi_p7)
|
||||
|
||||
include_directories(${NFAPI_DIR}/pnf/public_inc)
|
||||
include_directories(${NFAPI_DIR}/pnf/inc)
|
||||
@@ -741,9 +746,6 @@ set(NFAPI_USER_SRC
|
||||
add_library(NFAPI_USER_LIB ${NFAPI_USER_SRC})
|
||||
target_link_libraries(NFAPI_USER_LIB PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs UTIL)
|
||||
target_link_libraries(NFAPI_USER_LIB PRIVATE nr_fapi_p7)
|
||||
if(OAI_AERIAL)
|
||||
target_compile_definitions(NFAPI_USER_LIB PRIVATE ENABLE_AERIAL)
|
||||
endif()
|
||||
include_directories(${NFAPI_USER_DIR})
|
||||
|
||||
# Layer 1
|
||||
@@ -776,11 +778,12 @@ set(PHY_NRLDPC_CODINGIF
|
||||
|
||||
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts_neon.c)
|
||||
|
||||
add_library(crc_byte OBJECT ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c)
|
||||
|
||||
set(PHY_SRC_COMMON
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
|
||||
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/slss.c
|
||||
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sldch.c
|
||||
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/slsch.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/get_pmi.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich_common.c
|
||||
@@ -803,6 +806,7 @@ set(PHY_SRC_COMMON
|
||||
${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/crc_byte.c
|
||||
${PHY_TURBOIF}
|
||||
${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/viterbi.c
|
||||
@@ -838,9 +842,13 @@ set(PHY_SRC
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pcfich.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch.c
|
||||
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_decoding.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/rar_tools.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/uci_tools.c
|
||||
# ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
|
||||
# ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
|
||||
# ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_eNB_measurements.c
|
||||
${OPENAIR1_DIR}/PHY/INIT/lte_init.c
|
||||
)
|
||||
@@ -889,7 +897,6 @@ set(PHY_SRC_UE
|
||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/rar_tools_ue.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/initial_sync.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz_ue.c
|
||||
@@ -911,6 +918,7 @@ set(PHY_SRC_UE
|
||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c
|
||||
${OPENAIR1_DIR}/PHY/nr_phy_common/src/nr_phy_common_csirs.c
|
||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_scrambling.c
|
||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c
|
||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/refsig.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
|
||||
)
|
||||
@@ -1018,12 +1026,12 @@ if (${SMBV})
|
||||
set(PHY_SRC "${PHY_SRC} ${OPENAIR1_DIR}/PHY/TOOLS/smbv.c")
|
||||
endif (${SMBV})
|
||||
|
||||
set(PHY_SRC_UE ${PHY_SRC_UE} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
|
||||
|
||||
add_library(PHY_COMMON ${PHY_SRC_COMMON})
|
||||
target_link_libraries(PHY_COMMON
|
||||
PRIVATE shlib_loader asn1_lte_rrc_hdrs crc_byte
|
||||
PUBLIC UTIL
|
||||
)
|
||||
target_link_libraries(PHY_COMMON PRIVATE shlib_loader)
|
||||
add_dependencies(PHY_COMMON dfts)
|
||||
target_link_libraries(PHY_COMMON PRIVATE asn1_lte_rrc_hdrs PUBLIC UTIL)
|
||||
|
||||
add_library(PHY ${PHY_SRC})
|
||||
target_link_libraries(PHY PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||
@@ -1055,6 +1063,28 @@ target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc_hdrs nr_phy_common nr_common
|
||||
add_library(PHY_RU ${PHY_SRC_RU})
|
||||
target_link_libraries(PHY_RU PRIVATE asn1_lte_rrc_hdrs UTIL)
|
||||
|
||||
#Library for mex functions
|
||||
#########################3
|
||||
set(PHY_MEX_UE
|
||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/get_pmi.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch_common.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/cmult_vv.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/simde_operations.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c
|
||||
)
|
||||
add_library(PHY_MEX ${PHY_MEX_UE})
|
||||
target_link_libraries(PHY_MEX PRIVATE asn1_lte_rrc_hdrs UTIL)
|
||||
|
||||
#Layer 2 library
|
||||
#####################
|
||||
set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC)
|
||||
@@ -1109,6 +1139,7 @@ set(L2_SRC
|
||||
${PDCP_DIR}/pdcp_util.c
|
||||
${PDCP_DIR}/pdcp_security.c
|
||||
${OPENAIR2_DIR}/LAYER2/openair2_proc.c
|
||||
# ${RRC_DIR}/rrc_UE.c
|
||||
${RRC_DIR}/rrc_eNB.c
|
||||
${RRC_DIR}/rrc_eNB_endc.c
|
||||
${RRC_DIR}/rrc_eNB_S1AP.c
|
||||
@@ -1123,6 +1154,7 @@ set(L2_SRC
|
||||
|
||||
set(L2_RRC_SRC
|
||||
${OPENAIR2_DIR}/LAYER2/openair2_proc.c
|
||||
# ${RRC_DIR}/rrc_UE.c
|
||||
${RRC_DIR}/rrc_eNB.c
|
||||
${RRC_DIR}/rrc_eNB_endc.c
|
||||
${RRC_DIR}/rrc_eNB_S1AP.c
|
||||
@@ -1181,6 +1213,7 @@ set(NR_L2_SRC_UE
|
||||
${NR_SDAP_SRC}
|
||||
${NR_UE_RRC_DIR}/L2_interface_ue.c
|
||||
${NR_UE_RRC_DIR}/main_ue.c
|
||||
${NR_RRC_DIR}/nr_rrc_config.c
|
||||
${NR_UE_RRC_DIR}/rrc_UE.c
|
||||
${NR_UE_RRC_DIR}/rrc_nsa.c
|
||||
${NR_UE_RRC_DIR}/rrc_timers_and_constants.c
|
||||
@@ -1248,7 +1281,7 @@ set (MAC_NR_SRC_UE
|
||||
${NR_UE_PHY_INTERFACE_DIR}/NR_Packet_Drop.c
|
||||
${NR_UE_MAC_DIR}/config_ue.c
|
||||
${NR_UE_MAC_DIR}/config_ue_sl.c
|
||||
${NR_UE_MAC_DIR}/mac_tables.c
|
||||
${NR_UE_MAC_DIR}/mac_vars.c
|
||||
${NR_UE_MAC_DIR}/main_ue_nr.c
|
||||
${NR_UE_MAC_DIR}/nr_ue_procedures.c
|
||||
${NR_UE_MAC_DIR}/nr_ue_procedures_sl.c
|
||||
@@ -1334,9 +1367,10 @@ if(E2_AGENT)
|
||||
endif()
|
||||
|
||||
add_library(L2_LTE_NR
|
||||
# temporary solution until 4G/5G code completely untangled (as evidenced by deletion of the following file)
|
||||
${MAC_DIR}/dummy_functions.c
|
||||
${L2_RRC_SRC}
|
||||
${MAC_SRC}
|
||||
${ENB_APP_SRC}
|
||||
${MCE_APP_SRC}
|
||||
)
|
||||
|
||||
target_link_libraries(L2_LTE_NR PRIVATE f1ap s1ap nr_rrc)
|
||||
@@ -1348,16 +1382,20 @@ add_library(L2_UE
|
||||
target_link_libraries(L2_UE PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
target_link_libraries(L2_UE PRIVATE GTPV1U)
|
||||
|
||||
add_library(L2_UE_LTE_NR
|
||||
${L2_RRC_SRC_UE}
|
||||
${MAC_SRC_UE}
|
||||
)
|
||||
target_link_libraries(L2_UE_LTE_NR PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
target_link_libraries(L2_UE PRIVATE asn1_lte_rrc_hdrs)
|
||||
|
||||
add_library( NR_L2_UE ${NR_L2_SRC_UE} ${MAC_NR_SRC_UE} )
|
||||
target_link_libraries(NR_L2_UE PRIVATE nr_rlc)
|
||||
target_link_libraries(NR_L2_UE PRIVATE f1ap nr_rlc)
|
||||
target_link_libraries(NR_L2_UE PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs nr_common nr_ue_power_procedures nr_ue_ra_procedures)
|
||||
target_link_libraries(NR_L2_UE PRIVATE nr_nas)
|
||||
|
||||
add_library(MAC_NR_COMMON
|
||||
${OPENAIR2_DIR}/LAYER2/NR_MAC_COMMON/nr_mac_common.c
|
||||
${OPENAIR2_DIR}/LAYER2/NR_MAC_COMMON/nr_mac_common_tdd.c
|
||||
${OPENAIR2_DIR}/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c
|
||||
)
|
||||
target_link_libraries(MAC_NR_COMMON PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
@@ -1399,7 +1437,6 @@ add_library(SCTP_CLIENT ${SCTP_SRC})
|
||||
target_link_libraries(SCTP_CLIENT PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
set(NAS_SRC ${OPENAIR3_DIR}/NAS/)
|
||||
|
||||
set(libnas_api_OBJS
|
||||
${NAS_SRC}COMMON/API/NETWORK/as_message.c
|
||||
${NAS_SRC}COMMON/API/NETWORK/nas_message.c
|
||||
@@ -1439,6 +1476,10 @@ set(libnas_emm_msg_OBJS
|
||||
${NAS_SRC}COMMON/EMM/MSG/UplinkNasTransport.c
|
||||
)
|
||||
|
||||
set(libnas_fgs_msg_OBJS
|
||||
${NAS_SRC}COMMON/EMM/MSG/fgs_service_request.c
|
||||
)
|
||||
|
||||
set(libnas_esm_msg_OBJS
|
||||
${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c
|
||||
${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c
|
||||
@@ -1627,6 +1668,61 @@ set(libnas_ue_esm_sap_OBJS
|
||||
${NAS_SRC}UE/ESM/SAP/esm_sap.c
|
||||
)
|
||||
|
||||
set(libnrnas_emm_msg_OBJS
|
||||
${NAS_SRC}COMMON/EMM/MSG/RegistrationRequest.c
|
||||
${NAS_SRC}COMMON/EMM/MSG/RegistrationAccept.c
|
||||
${NAS_SRC}COMMON/EMM/MSG/FGSIdentityResponse.c
|
||||
${NAS_SRC}COMMON/EMM/MSG/FGSAuthenticationResponse.c
|
||||
${NAS_SRC}COMMON/EMM/MSG/FGSNASSecurityModeComplete.c
|
||||
${NAS_SRC}COMMON/EMM/MSG/RegistrationComplete.c
|
||||
${NAS_SRC}COMMON/EMM/MSG/FGSUplinkNasTransport.c
|
||||
${NAS_SRC}COMMON/ESM/MSG/PduSessionEstablishRequest.c
|
||||
${NAS_SRC}COMMON/ESM/MSG/PduSessionEstablishmentAccept.c
|
||||
${NAS_SRC}COMMON/EMM/MSG/FGSDeregistrationRequestUEOriginating.c
|
||||
)
|
||||
|
||||
set(libnrnas_ies_OBJS
|
||||
${NAS_SRC}COMMON/IES/ExtendedProtocolDiscriminator.c
|
||||
${NAS_SRC}COMMON/IES/FGSMobileIdentity.c
|
||||
${NAS_SRC}COMMON/IES/FGSRegistrationType.c
|
||||
${NAS_SRC}COMMON/IES/SpareHalfOctet.c
|
||||
${NAS_SRC}COMMON/IES/FGSRegistrationResult.c
|
||||
${NAS_SRC}COMMON/IES/FGMMCapability.c
|
||||
${NAS_SRC}COMMON/IES/NrUESecurityCapability.c
|
||||
${NAS_SRC}COMMON/IES/FGCNasMessageContainer.c
|
||||
${NAS_SRC}COMMON/IES/SORTransparentContainer.c
|
||||
)
|
||||
|
||||
add_library(LIB_NAS_SIMUE
|
||||
${NAS_SRC}UE/nas_itti_messaging.c
|
||||
${NAS_SRC}UE/nas_network.c
|
||||
${NAS_SRC}UE/nas_parser.c
|
||||
${NAS_SRC}UE/nas_proc.c
|
||||
${NAS_SRC}UE/nas_user.c
|
||||
${NAS_SRC}NR_UE/nr_nas_msg.c
|
||||
${libnas_api_OBJS}
|
||||
${libnas_ue_api_OBJS}
|
||||
${libnas_emm_msg_OBJS}
|
||||
${libnas_fgs_msg_OBJS}
|
||||
${libnas_esm_msg_OBJS}
|
||||
${libnas_ies_OBJS}
|
||||
${libnas_utils_OBJS}
|
||||
${libnas_ue_emm_OBJS}
|
||||
${libnas_ue_emm_sap_OBJS}
|
||||
${libnas_ue_esm_OBJS}
|
||||
${libnas_ue_esm_sap_OBJS}
|
||||
${libnrnas_emm_msg_OBJS}
|
||||
${libnrnas_ies_OBJS}
|
||||
$<TARGET_OBJECTS:ds>
|
||||
)
|
||||
target_include_directories(LIB_NAS_SIMUE PRIVATE ${OPENAIR_DIR}/common/utils/ds/)
|
||||
target_link_libraries(LIB_NAS_SIMUE PRIVATE lte_rrc)
|
||||
|
||||
|
||||
|
||||
set(NAS_SIM_LIB LIB_NAS_SIMUE)
|
||||
target_link_libraries(LIB_NAS_SIMUE PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
add_library(LIB_NAS_UE
|
||||
${NAS_SRC}UE/nas_itti_messaging.c
|
||||
${NAS_SRC}UE/nas_network.c
|
||||
@@ -1666,6 +1762,15 @@ set (NBIOT_SOURCES
|
||||
)
|
||||
add_library(NB_IoT MODULE ${NBIOT_SOURCES} )
|
||||
|
||||
add_library(LIB_5GNAS_GNB
|
||||
${NAS_SRC}/COMMON/nr_common.c
|
||||
${OPENAIR3_DIR}//UICC/usim_interface.c
|
||||
)
|
||||
|
||||
target_include_directories(LIB_5GNAS_GNB PRIVATE ${OPENAIR_DIR}/common/utils/ds/)
|
||||
target_link_libraries(LIB_5GNAS_GNB PRIVATE SECURITY)
|
||||
target_link_libraries(LIB_5GNAS_GNB PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
# Simulation library
|
||||
##########################
|
||||
set (SIMUSRC
|
||||
@@ -1883,22 +1988,20 @@ add_executable(nr-uesoftmodem
|
||||
${OPENAIR_DIR}/radio/COMMON/common_lib.c
|
||||
${OPENAIR_DIR}/radio/COMMON/record_player.c
|
||||
${OPENAIR2_DIR}/LAYER2/NR_MAC_COMMON/nr_mac_common.c
|
||||
${OPENAIR2_DIR}/LAYER2/NR_MAC_COMMON/nr_mac_common_tdd.c
|
||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/phy_scope_interface.c
|
||||
${NFAPI_USER_DIR}/nfapi.c
|
||||
${PHY_INTERFACE_DIR}/queue_t.c
|
||||
)
|
||||
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE
|
||||
-Wl,--start-group
|
||||
nr_rrc SECURITY UTIL HASHTABLE SCHED_RU_LIB SCHED_NR_UE_LIB
|
||||
PHY_COMMON PHY_NR_COMMON PHY_NR_UE NR_L2_UE MAC_NR_COMMON NFAPI_LIB
|
||||
ITTI SIMU shlib_loader
|
||||
PHY_COMMON PHY_NR_COMMON PHY_NR_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_LIB NFAPI_PNF_LIB
|
||||
NFAPI_USER_LIB MISC_NFAPI_NR_LIB
|
||||
ITTI LIB_5GNAS_GNB LIB_NAS_SIMUE ${NAS_SIM_LIB} SIMU shlib_loader
|
||||
-Wl,--end-group z dl)
|
||||
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE pthread m CONFIG_LIB rt nr_ue_phy_meas)
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE ${T_LIB})
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE nr_nas lib_uicc usim_lib)
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
# force the generation of ASN.1 so that we don't need to wait during the build
|
||||
@@ -1951,37 +2054,36 @@ target_link_libraries(smallblocktest PRIVATE
|
||||
|
||||
|
||||
add_executable(ldpctest
|
||||
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
|
||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_load.c
|
||||
)
|
||||
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.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}
|
||||
# link 'check_crc' to make it resolved in the LDPC coding libraries
|
||||
# 'check_crc' is not used in ldpctest so it is not linked in the executable by default
|
||||
# --whole-archive links 'check_crc' in the executable even though it is note used, see 'man ld'
|
||||
-Wl,--whole-archive crc_byte -Wl,--no-whole-archive
|
||||
)
|
||||
m pthread dl shlib_loader ${T_LIB} nr_coding_segment_utils
|
||||
)
|
||||
|
||||
add_library(physim_common OBJECT ${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_unitary_common.c)
|
||||
target_link_libraries(physim_common PRIVATE UTIL)
|
||||
|
||||
add_executable(nr_dlschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c)
|
||||
add_executable(nr_dlschsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_dummy_functions.c
|
||||
)
|
||||
target_link_libraries(nr_dlschsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader physim_common
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader
|
||||
)
|
||||
target_link_libraries(nr_dlschsim PRIVATE asn1_nr_rrc_hdrs)
|
||||
|
||||
add_executable(nr_pbchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c)
|
||||
add_executable(nr_pbchsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_dummy_functions.c
|
||||
)
|
||||
target_link_libraries(nr_pbchsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader physim_common
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader
|
||||
)
|
||||
target_link_libraries(nr_pbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
add_executable(nr_psbchsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/psbchsim.c
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_dummy_functions.c
|
||||
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||
${NR_UE_RRC_DIR}/rrc_nsa.c
|
||||
${NFAPI_USER_DIR}/nfapi.c
|
||||
@@ -1990,19 +2092,24 @@ add_executable(nr_psbchsim
|
||||
)
|
||||
target_link_libraries(nr_psbchsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON CONFIG_LIB L2_NR -lz -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader physim_common
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader
|
||||
)
|
||||
target_link_libraries(nr_psbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
add_executable(nr_pucchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c)
|
||||
#PUCCH ---> Prashanth
|
||||
add_executable(nr_pucchsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_dummy_functions.c
|
||||
)
|
||||
target_link_libraries(nr_pucchsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader physim_common
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader
|
||||
)
|
||||
target_link_libraries(nr_pucchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
add_executable(nr_dlsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlsim.c
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_dummy_functions.c
|
||||
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||
${NR_UE_RRC_DIR}/rrc_nsa.c
|
||||
${NFAPI_USER_DIR}/nfapi.c
|
||||
@@ -2011,28 +2118,33 @@ add_executable(nr_dlsim
|
||||
)
|
||||
target_link_libraries(nr_dlsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader nr_ue_phy_meas physim_common
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader nr_ue_phy_meas
|
||||
)
|
||||
target_link_libraries(nr_dlsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
add_executable(nr_prachsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/prachsim.c)
|
||||
add_executable(nr_prachsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/prachsim.c
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_dummy_functions.c
|
||||
)
|
||||
target_link_libraries(nr_prachsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB CONFIG_LIB -lz -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader physim_common)
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader)
|
||||
target_link_libraries(nr_prachsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
add_executable(nr_ulschsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_dummy_functions.c
|
||||
${PHY_INTERFACE_DIR}/queue_t.c
|
||||
)
|
||||
target_link_libraries(nr_ulschsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader physim_common
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader
|
||||
)
|
||||
target_link_libraries(nr_ulschsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
add_executable(nr_ulsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulsim.c
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_dummy_functions.c
|
||||
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||
${NR_UE_RRC_DIR}/rrc_nsa.c
|
||||
${NFAPI_USER_DIR}/nfapi.c
|
||||
@@ -2042,7 +2154,7 @@ add_executable(nr_ulsim
|
||||
|
||||
target_link_libraries(nr_ulsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader nr_ue_phy_meas physim_common
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader nr_ue_phy_meas
|
||||
)
|
||||
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
@@ -2082,6 +2194,10 @@ foreach(myExe s1ap
|
||||
)
|
||||
endforeach(myExe)
|
||||
|
||||
# to be added
|
||||
#../targets/TEST/PDCP/test_pdcp.c
|
||||
#../targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c
|
||||
|
||||
#ensure that the T header files are generated before targets depending on them
|
||||
if (${T_TRACER})
|
||||
foreach(i
|
||||
@@ -2098,10 +2214,10 @@ if (${T_TRACER})
|
||||
SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL
|
||||
NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_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
|
||||
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
|
||||
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_UE_NR ngap
|
||||
CN_UTILS GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE NB_IoT SIMU OPENAIR0_LIB
|
||||
dfts config_internals nr_common crc_byte)
|
||||
dfts config_internals nr_common)
|
||||
if (TARGET ${i})
|
||||
add_dependencies(${i} generate_T)
|
||||
endif()
|
||||
|
||||
@@ -27,7 +27,6 @@ def nodeExecutor = params.nodeExecutor
|
||||
def doBuild = true
|
||||
def do4Gtest = false
|
||||
def do5Gtest = false
|
||||
def do5GUeTest = false
|
||||
|
||||
//
|
||||
def gitCommitAuthorEmailAddr
|
||||
@@ -65,24 +64,17 @@ pipeline {
|
||||
message += " - ~BUILD-ONLY (execute only build stages)\n"
|
||||
message += " - ~4G-LTE (perform 4G tests)\n"
|
||||
message += " - ~5G-NR (perform 5G tests)\n"
|
||||
message += " - ~CI (perform both 4G and 5G tests)\n"
|
||||
message += " - ~nrUE (perform only 5G-UE related tests including physims excluding LDPC tests)\n\n"
|
||||
message += " - ~CI (perform both 4G and 5G tests)\n\n"
|
||||
message += "Not performing CI due to lack of labels"
|
||||
addGitLabMRComment comment: message
|
||||
error('Not performing CI due to lack of labels')
|
||||
} else if (LABEL_CHECK == 'FULL') {
|
||||
do4Gtest = true
|
||||
do5Gtest = true
|
||||
do5GUeTest = true
|
||||
} else if (LABEL_CHECK == "SHORTEN-4G") {
|
||||
do4Gtest = true
|
||||
} else if (LABEL_CHECK == 'SHORTEN-5G') {
|
||||
do5Gtest = true
|
||||
} else if (LABEL_CHECK == 'SHORTEN-5G-UE') {
|
||||
do5GUeTest = true
|
||||
} else if (LABEL_CHECK == 'SHORTEN-4G-5G-UE') {
|
||||
do4Gtest = true
|
||||
do5GUeTest = true
|
||||
} else if (LABEL_CHECK == 'documentation') {
|
||||
doBuild = false
|
||||
} else {
|
||||
@@ -153,28 +145,6 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("Ubuntu-ARM-Image-Builder") {
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-Ubuntu-ARM-Image-Builder', 'Ubuntu-ARM-Image-Builder')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
||||
// due to parallel-time concurrency
|
||||
ubuntuArmBuildStatus = finalizeSlaveJob('RAN-Ubuntu-ARM-Image-Builder')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += ubuntuArmBuildStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("RHEL-Cluster-Image-Builder") {
|
||||
steps {
|
||||
script {
|
||||
@@ -247,7 +217,7 @@ pipeline {
|
||||
when { expression {doBuild} }
|
||||
parallel {
|
||||
stage ("PhySim-Cluster") {
|
||||
when { expression {do4Gtest || do5Gtest || do5GUeTest} }
|
||||
when { expression {do4Gtest || do5Gtest} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-PhySim-Cluster', 'PhySim-Cluster')
|
||||
@@ -293,7 +263,7 @@ pipeline {
|
||||
}
|
||||
}
|
||||
stage ("RF-Sim-Test-5G") {
|
||||
when { expression {do5Gtest || do5GUeTest} }
|
||||
when { expression {do5Gtest} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-RF-Sim-Test-5G', 'RF-Sim-Test-5G')
|
||||
@@ -316,7 +286,7 @@ pipeline {
|
||||
}
|
||||
}
|
||||
stage ("OAI-FLEXRIC-RAN-Integration-Test") {
|
||||
when { expression {do5Gtest || do5GUeTest} }
|
||||
when { expression {do5Gtest} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('OAI-FLEXRIC-RAN-Integration-Test', 'OAI-FLEXRIC-RAN-Integration-Test')
|
||||
@@ -639,7 +609,7 @@ pipeline {
|
||||
}
|
||||
}
|
||||
stage ("SA-OAIUE-CN5G") {
|
||||
when { expression {do5Gtest || do5GUeTest} }
|
||||
when { expression {do5Gtest} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-SA-OAIUE-CN5G', 'SA-OAIUE-CN5G')
|
||||
@@ -688,6 +658,9 @@ pipeline {
|
||||
if ("MERGE".equals(env.gitlabActionType)) {
|
||||
addGitLabMRComment comment: message
|
||||
def message2 = message + " -- MergeRequest #" + env.gitlabMergeRequestIid + " (" + env.gitlabMergeRequestTitle + ")"
|
||||
sendSocialMediaMessage('ci-enb', 'good', message2)
|
||||
} else {
|
||||
sendSocialMediaMessage('ci-enb', 'good', message)
|
||||
}
|
||||
echo "Pipeline is SUCCESSFUL"
|
||||
}
|
||||
@@ -699,6 +672,9 @@ pipeline {
|
||||
def fullMessage = message + '\n\nList of failing test stages:' + failingStages
|
||||
addGitLabMRComment comment: fullMessage
|
||||
def message2 = message + " -- MergeRequest #" + env.gitlabMergeRequestIid + " (" + env.gitlabMergeRequestTitle + ")"
|
||||
sendSocialMediaMessage('ci-enb', 'danger', message2)
|
||||
} else {
|
||||
sendSocialMediaMessage('ci-enb', 'danger', message)
|
||||
}
|
||||
echo "Pipeline FAILED"
|
||||
}
|
||||
@@ -822,3 +798,9 @@ def finalizeSlaveJob(jobName) {
|
||||
return artifactUrl
|
||||
}
|
||||
}
|
||||
|
||||
// Abstraction function to send social media messages:
|
||||
// like on Slack or Mattermost
|
||||
def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) {
|
||||
slackSend channel: pipeChannel, color: pipeColor, message: pipeMessage
|
||||
}
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
def node = "${params.JenkinsNode}"
|
||||
def resource = "${params.JenkinsResource}"
|
||||
def node = "porcepix"
|
||||
def resource = "CI-NEU-CI"
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
|
||||
@@ -78,10 +78,9 @@ IS_MR_BUILD_ONLY=`echo $LABELS | grep -c BUILD-ONLY`
|
||||
IS_MR_CI=`echo $LABELS | grep -c CI`
|
||||
IS_MR_4G=`echo $LABELS | grep -c 4G-LTE`
|
||||
IS_MR_5G=`echo $LABELS | grep -c 5G-NR`
|
||||
IS_MR_5G_UE=`echo $LABELS | grep -c nrUE`
|
||||
|
||||
# none is present! No CI
|
||||
if [ $IS_MR_BUILD_ONLY -eq 0 ] && [ $IS_MR_CI -eq 0 ] && [ $IS_MR_4G -eq 0 ] && [ $IS_MR_5G -eq 0 ] && [ $IS_MR_DOCUMENTATION -eq 0 ] && [ $IS_MR_5G_UE -eq 0 ]
|
||||
if [ $IS_MR_BUILD_ONLY -eq 0 ] && [ $IS_MR_CI -eq 0 ] && [ $IS_MR_4G -eq 0 ] && [ $IS_MR_5G -eq 0 ] && [ $IS_MR_DOCUMENTATION -eq 0 ]
|
||||
then
|
||||
echo "NONE"
|
||||
exit 0
|
||||
@@ -94,12 +93,6 @@ then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ $IS_MR_5G_UE -eq 1 ] && [ $IS_MR_4G -eq 1 ]
|
||||
then
|
||||
echo "SHORTEN-4G-5G-UE"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 4G is present: run only 4G
|
||||
if [ $IS_MR_4G -eq 1 ]
|
||||
then
|
||||
@@ -114,12 +107,6 @@ then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ $IS_MR_5G_UE -eq 1 ]
|
||||
then
|
||||
echo "SHORTEN-5G-UE"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# BUILD-ONLY is present: only build stages
|
||||
if [ $IS_MR_BUILD_ONLY -eq 1 ]
|
||||
then
|
||||
|
||||
@@ -72,8 +72,8 @@ def OC_deploy_CN(cmd, ocUserName, ocPassword, ocNamespace, path):
|
||||
succeeded = OC_login(cmd, ocUserName, ocPassword, ocNamespace)
|
||||
if not succeeded:
|
||||
return False, CONST.OC_LOGIN_FAIL
|
||||
cmd.run(f'helm list -aq -n {ocNamespace} | xargs -r helm uninstall -n {ocNamespace} --wait')
|
||||
ret = cmd.run(f'helm install --wait oai5gcn {path}/ci-scripts/charts/oai-5g-basic/.')
|
||||
cmd.run('helm uninstall oai5gcn --wait --timeout 60s')
|
||||
ret = cmd.run(f'helm install --wait --timeout 120s oai5gcn {path}/ci-scripts/charts/oai-5g-basic/.')
|
||||
if ret.returncode != 0:
|
||||
logging.error('OC OAI CN5G: Deployment failed')
|
||||
OC_logout(cmd)
|
||||
@@ -100,10 +100,10 @@ def OC_undeploy_CN(cmd, ocUserName, ocPassword, ocNamespace, path):
|
||||
cmd.run(f'oc logs -f {podName} {ci} &> {path}/logs/{ii}.log &')
|
||||
cmd.run(f'cd {path}/logs && zip -r -qq test_logs_CN.zip *.log')
|
||||
cmd.copyin(f'{path}/logs/test_logs_CN.zip','test_logs_CN.zip')
|
||||
ret = cmd.run(f'helm list -aq -n {ocNamespace} | xargs -r helm uninstall -n {ocNamespace} --wait')
|
||||
ret = cmd.run('helm uninstall --wait --timeout 60s oai5gcn')
|
||||
if ret.returncode != 0:
|
||||
logging.error('OC OAI CN5G: Undeployment failed')
|
||||
cmd.run(f'helm list -aq -n {ocNamespace} | xargs -r helm uninstall -n {ocNamespace} --wait')
|
||||
cmd.run('helm uninstall --wait --timeout 60s oai5gcn')
|
||||
OC_logout(cmd)
|
||||
return False, CONST.OC_PROJECT_FAIL
|
||||
report = cmd.run('oc get pods')
|
||||
@@ -208,7 +208,7 @@ class Cluster:
|
||||
return -1
|
||||
return int(result.group("size"))
|
||||
|
||||
def _deploy_pod(self, filename, timeout = 120):
|
||||
def _deploy_pod(self, filename, timeout = 30):
|
||||
ret = self.cmd.run(f'oc create -f {filename}')
|
||||
result = re.search(f'pod/(?P<pod>[a-zA-Z0-9_\-]+) created', ret.stdout)
|
||||
if result is None:
|
||||
@@ -216,9 +216,11 @@ class Cluster:
|
||||
return None
|
||||
pod = result.group("pod")
|
||||
logging.debug(f'checking if pod {pod} is in Running state')
|
||||
ret = self.cmd.run(f'oc wait --for=condition=ready pod {pod} --timeout={timeout}s', silent=True)
|
||||
if ret.returncode == 0:
|
||||
return pod
|
||||
while timeout > 0:
|
||||
ret = self.cmd.run(f'oc get pod {pod} -o json | jq -Mc .status.phase', silent=True)
|
||||
if re.search('"Running"', ret.stdout) is not None: return pod
|
||||
timeout -= 1
|
||||
time.sleep(1)
|
||||
logging.error(f'pod {pod} did not reach Running state')
|
||||
self._undeploy_pod(filename)
|
||||
return None
|
||||
@@ -226,7 +228,7 @@ class Cluster:
|
||||
def _undeploy_pod(self, filename):
|
||||
self.cmd.run(f'oc delete -f {filename}')
|
||||
|
||||
def PullClusterImage(self, HTML, node, images, tag_prefix):
|
||||
def PullClusterImage(self, HTML, node, images):
|
||||
logging.debug(f'Pull OC image {images} to server {node}')
|
||||
self.testCase_id = HTML.testCase_id
|
||||
with cls_cmd.getConnection(node) as cmd:
|
||||
@@ -242,7 +244,7 @@ class Cluster:
|
||||
return False
|
||||
tag = cls_containerize.CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
registry = f'{self.OCRegistry}/{CI_OC_RAN_NAMESPACE}'
|
||||
success, msg = cls_containerize.Containerize.Pull_Image(cmd, images, tag, tag_prefix, registry, None, None)
|
||||
success, msg = cls_containerize.Containerize.Pull_Image(cmd, images, tag, registry, None, None)
|
||||
OC_logout(cmd)
|
||||
param = f"on node {node}"
|
||||
if success:
|
||||
@@ -315,9 +317,9 @@ class Cluster:
|
||||
|
||||
# delete old images by Sagar Arora <sagar.arora@openairinterface.org>:
|
||||
# 1. retrieve all images and their timestamp
|
||||
# 2. awk retrieves those whose timestamp is older than 3 weeks
|
||||
# 2. awk retrieves those whose timestamp is older than 4 weeks
|
||||
# 3. issue delete command on corresponding istags (the images are dangling and will be cleaned by the registry)
|
||||
delete_cmd = "oc get istag -o go-template --template '{{range .items}}{{.metadata.name}} {{.metadata.creationTimestamp}}{{\"\\n\"}}{{end}}' | awk '$2 <= \"'$(date -d '-3weeks' -Ins --utc | sed 's/+0000/Z/')'\" { print $1 }' | xargs --no-run-if-empty oc delete istag"
|
||||
delete_cmd = "oc get istag -o go-template --template '{{range .items}}{{.metadata.name}} {{.metadata.creationTimestamp}}{{\"\\n\"}}{{end}}' | awk '$2 <= \"'$(date -d '-4weeks' -Ins --utc | sed 's/+0000/Z/')'\" { print $1 }' | xargs --no-run-if-empty oc delete istag"
|
||||
response = self.cmd.run(delete_cmd)
|
||||
logging.debug(f"deleted images:\n{response.stdout}")
|
||||
|
||||
@@ -330,7 +332,7 @@ class Cluster:
|
||||
self._recreate_bc('ran-base', baseTag, 'openshift/ran-base-bc.yaml')
|
||||
ranbase_job = self._start_build('ran-base')
|
||||
attemptedImages += ['ran-base']
|
||||
status = ranbase_job is not None and self._wait_build_end([ranbase_job], 1000)
|
||||
status = ranbase_job is not None and self._wait_build_end([ranbase_job], 800)
|
||||
if not status: logging.error('failure during build of ran-base')
|
||||
self.cmd.run(f'oc logs {ranbase_job} &> cmake_targets/log/ran-base.log') # cannot use cmd.run because of redirect
|
||||
# recover logs by mounting image
|
||||
@@ -392,7 +394,7 @@ class Cluster:
|
||||
gnb_aw2s_job = self._start_build('oai-gnb-aw2s')
|
||||
attemptedImages += ['oai-gnb-aw2s']
|
||||
|
||||
wait = enb_job is not None and gnb_job is not None and gnb_aw2s_job is not None and self._wait_build_end([enb_job, gnb_job, gnb_aw2s_job], 800)
|
||||
wait = enb_job is not None and gnb_job is not None and gnb_aw2s_job is not None and self._wait_build_end([enb_job, gnb_job, gnb_aw2s_job], 600)
|
||||
if not wait: logging.error('error during build of eNB/gNB')
|
||||
status = status and wait
|
||||
# recover logs
|
||||
@@ -421,7 +423,7 @@ class Cluster:
|
||||
nrue_job = self._start_build('oai-nr-ue')
|
||||
attemptedImages += ['oai-nr-ue']
|
||||
|
||||
wait = nr_cuup_job is not None and lteue_job is not None and nrue_job is not None and self._wait_build_end([nr_cuup_job, lteue_job, nrue_job], 800)
|
||||
wait = nr_cuup_job is not None and lteue_job is not None and nrue_job is not None and self._wait_build_end([nr_cuup_job, lteue_job, nrue_job], 600)
|
||||
if not wait: logging.error('error during build of nr-cuup/lteUE/nrUE')
|
||||
status = status and wait
|
||||
# recover logs
|
||||
|
||||
@@ -93,7 +93,7 @@ def CopyLogsToExecutor(cmd, sourcePath, log_name):
|
||||
os.remove(f'./{log_name}.zip')
|
||||
if (os.path.isdir(f'./{log_name}')):
|
||||
shutil.rmtree(f'./{log_name}')
|
||||
cmd.copyin(src=f'{sourcePath}/cmake_targets/{log_name}.zip', tgt=f'{os.getcwd()}/{log_name}.zip')
|
||||
cmd.copyin(f'{sourcePath}/cmake_targets/{log_name}.zip', f'./{log_name}.zip')
|
||||
cmd.run(f'rm -f {log_name}.zip')
|
||||
ZipFile(f'{log_name}.zip').extractall('.')
|
||||
|
||||
@@ -359,7 +359,7 @@ class Containerize():
|
||||
svr = self.eNB_serverId[self.eNB_instance]
|
||||
lIpAddr, lSourcePath = self.GetCredentials(svr)
|
||||
logging.debug('Building on server: ' + lIpAddr)
|
||||
cmd = cls_cmd.getConnection(lIpAddr)
|
||||
cmd = cls_cmd.RemoteCmd(lIpAddr)
|
||||
|
||||
# Checking the hostname to get adapted on cli and dockerfileprefixes
|
||||
cmd.run('hostnamectl')
|
||||
@@ -407,12 +407,6 @@ class Containerize():
|
||||
result = re.search('build_cross_arm64', self.imageKind)
|
||||
if result is not None:
|
||||
self.dockerfileprefix = '.ubuntu22.cross-arm64'
|
||||
result = re.search('native_arm', self.imageKind)
|
||||
if result is not None:
|
||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
||||
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup', ''))
|
||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
||||
imageNames.append(('oai-gnb-aerial', 'gNB.aerial', 'oai-gnb-aerial', ''))
|
||||
|
||||
self.testCase_id = HTML.testCase_id
|
||||
cmd.cd(lSourcePath)
|
||||
@@ -497,10 +491,10 @@ class Containerize():
|
||||
elif image != 'ran-build':
|
||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||
if image == 'oai-gnb-aerial':
|
||||
cmd.run('cp -f /opt/nvidia-ipc/nvipc_src.*.tar.gz .')
|
||||
cmd.run('cp -f /opt/nvidia-ipc/nvipc_src.2024.05.23.tar.gz .')
|
||||
ret = cmd.run(f'{self.cli} build {self.cliBuildOptions} --target {image} --tag {name}:{imageTag} --file docker/Dockerfile.{pattern}{self.dockerfileprefix} {option} . > cmake_targets/log/{name}.log 2>&1', timeout=1200)
|
||||
if image == 'oai-gnb-aerial':
|
||||
cmd.run('rm -f nvipc_src.*.tar.gz')
|
||||
cmd.run('rm -f nvipc_src.2024.05.23.tar.gz')
|
||||
if image == 'ran-build' and ret.returncode == 0:
|
||||
cmd.run(f"docker run --name test-log -d {name}:{imageTag} /bin/true")
|
||||
cmd.run(f"docker cp test-log:/oai-ran/cmake_targets/log/ cmake_targets/log/{name}/")
|
||||
@@ -726,9 +720,9 @@ class Containerize():
|
||||
HTML.CreateHtmlTabFooter(False)
|
||||
return False
|
||||
|
||||
def Push_Image_to_Local_Registry(self, HTML, svr_id, tag_prefix=""):
|
||||
def Push_Image_to_Local_Registry(self, HTML, svr_id):
|
||||
lIpAddr, lSourcePath = self.GetCredentials(svr_id)
|
||||
logging.debug('Pushing images to server: ' + lIpAddr)
|
||||
logging.debug('Pushing images from server: ' + lIpAddr)
|
||||
ssh = cls_cmd.getConnection(lIpAddr)
|
||||
imagePrefix = 'porcepix.sboai.cs.eurecom.fr'
|
||||
ret = ssh.run(f'docker login -u oaicicd -p oaicicd {imagePrefix}')
|
||||
@@ -743,7 +737,7 @@ class Containerize():
|
||||
if self.ranAllowMerge:
|
||||
orgTag = 'ci-temp'
|
||||
for image in IMAGES:
|
||||
tagToUse = tag_prefix + CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
tagToUse = CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
imageTag = f"{image}:{tagToUse}"
|
||||
ret = ssh.run(f'docker image tag {image}:{orgTag} {imagePrefix}/{imageTag}')
|
||||
if ret.returncode != 0:
|
||||
@@ -757,10 +751,9 @@ class Containerize():
|
||||
return False
|
||||
# Creating a develop tag on the local private registry
|
||||
if not self.ranAllowMerge:
|
||||
devTag = f"{tag_prefix}develop"
|
||||
ssh.run(f'docker image tag {image}:{orgTag} {imagePrefix}/{image}:{devTag}')
|
||||
ssh.run(f'docker push {imagePrefix}/{image}:{devTag}')
|
||||
ssh.run(f'docker rmi {imagePrefix}/{image}:{devTag}')
|
||||
ssh.run(f'docker image tag {image}:{orgTag} {imagePrefix}/{image}:develop')
|
||||
ssh.run(f'docker push {imagePrefix}/{image}:develop')
|
||||
ssh.run(f'docker rmi {imagePrefix}/{image}:develop')
|
||||
ssh.run(f'docker rmi {imagePrefix}/{imageTag} {image}:{orgTag}')
|
||||
|
||||
ret = ssh.run(f'docker logout {imagePrefix}')
|
||||
@@ -775,7 +768,7 @@ class Containerize():
|
||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
return True
|
||||
|
||||
def Pull_Image(cmd, images, tag, tag_prefix, registry, username, password):
|
||||
def Pull_Image(cmd, images, tag, registry, username, password):
|
||||
if username is not None and password is not None:
|
||||
logging.info(f"logging into registry {username}@{registry}")
|
||||
response = cmd.run(f'docker login -u {username} -p {password} {registry}', silent=True, reportNonZero=False)
|
||||
@@ -785,15 +778,14 @@ class Containerize():
|
||||
return False, msg
|
||||
pulled_images = []
|
||||
for image in images:
|
||||
imagePrefTag = f"{image}:{tag_prefix}{tag}"
|
||||
imageTag = f"{image}:{tag}"
|
||||
response = cmd.run(f'docker pull {registry}/{imagePrefTag}')
|
||||
response = cmd.run(f'docker pull {registry}/{imageTag}')
|
||||
if response.returncode != 0:
|
||||
msg = f'Could not pull {image} from local registry: {imagePrefTag}'
|
||||
msg = f'Could not pull {image} from local registry: {imageTag}'
|
||||
logging.error(msg)
|
||||
return False, msg
|
||||
cmd.run(f'docker tag {registry}/{imagePrefTag} oai-ci/{imageTag}')
|
||||
cmd.run(f'docker rmi {registry}/{imagePrefTag}')
|
||||
cmd.run(f'docker tag {registry}/{imageTag} oai-ci/{imageTag}')
|
||||
cmd.run(f'docker rmi {registry}/{imageTag}')
|
||||
pulled_images += [f"oai-ci/{imageTag}"]
|
||||
if username is not None and password is not None:
|
||||
response = cmd.run(f'docker logout {registry}')
|
||||
@@ -801,13 +793,13 @@ class Containerize():
|
||||
msg = "Pulled Images:\n" + '\n'.join(pulled_images)
|
||||
return True, msg
|
||||
|
||||
def Pull_Image_from_Registry(self, HTML, svr_id, images, tag=None, tag_prefix="", registry="porcepix.sboai.cs.eurecom.fr", username="oaicicd", password="oaicicd"):
|
||||
def Pull_Image_from_Registry(self, HTML, svr_id, images, tag=None, registry="porcepix.sboai.cs.eurecom.fr", username="oaicicd", password="oaicicd"):
|
||||
lIpAddr, lSourcePath = self.GetCredentials(svr_id)
|
||||
logging.debug('\u001B[1m Pulling image(s) on server: ' + lIpAddr + '\u001B[0m')
|
||||
if not tag:
|
||||
tag = CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
with cls_cmd.getConnection(lIpAddr) as cmd:
|
||||
success, msg = Containerize.Pull_Image(cmd, images, tag, tag_prefix, registry, username, password)
|
||||
success, msg = Containerize.Pull_Image(cmd, images, tag, registry, username, password)
|
||||
param = f"on node {lIpAddr}"
|
||||
if success:
|
||||
HTML.CreateHtmlTestRowQueue(param, 'OK', [msg])
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "nfapi";
|
||||
remote_n_address = "192.168.71.140"; // vnf addr
|
||||
local_n_address = "192.168.71.141"; // pnf addr
|
||||
local_n_portc = 50000; // pnf p5 port [!]
|
||||
remote_n_portc = 50001; // vnf p5 port
|
||||
local_n_portd = 50010; // pnf p7 port
|
||||
remote_n_portd = 50011; // vnf p7 port
|
||||
prach_dtx_threshold = 120;
|
||||
pucch0_dtx_threshold = 150;
|
||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||
}
|
||||
);
|
||||
|
||||
RUs = ({
|
||||
local_rf = "yes";
|
||||
nb_tx = 1;
|
||||
nb_rx = 1;
|
||||
att_tx = 0;
|
||||
att_rx = 0;
|
||||
bands = [7];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 114;
|
||||
sf_extension = 0;
|
||||
eNB_instances = [0];
|
||||
});
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = 4043;
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
log_config: {
|
||||
global_log_level = "info";
|
||||
hw_log_level = "info";
|
||||
phy_log_level = "info";
|
||||
};
|
||||
@@ -1,31 +0,0 @@
|
||||
usrp-tx-thread-config = 1;
|
||||
tune-offset = 30720000;
|
||||
|
||||
L1s = ({
|
||||
num_cc = 1;
|
||||
tr_n_preference = "nfapi";
|
||||
remote_n_address = "127.0.0.1"; // vnf addr
|
||||
local_n_address = "127.0.0.1"; // pnf addr
|
||||
local_n_portc = 50000; // pnf p5 port [!]
|
||||
remote_n_portc = 50001; // vnf p5 port
|
||||
local_n_portd = 50010; // pnf p7 port
|
||||
remote_n_portd = 50011; // vnf p7 port
|
||||
prach_dtx_threshold = 120;
|
||||
pusch_dtx_threshold = 20;
|
||||
max_ldpc_iterations = 10;
|
||||
});
|
||||
|
||||
RUs = ({
|
||||
local_rf = "yes"
|
||||
nb_tx = 4;
|
||||
nb_rx = 4;
|
||||
att_tx = 0;
|
||||
att_rx = 0;
|
||||
bands = [77];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 75;
|
||||
eNB_instances = [0];
|
||||
#clock_src = "internal";
|
||||
sdr_addrs = "addr=192.168.80.53, clock_source=internal,time_source=internal"
|
||||
});
|
||||
|
||||
@@ -1,218 +0,0 @@
|
||||
Active_gNBs = ( "5G-GOA-gNB");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe00;
|
||||
gNB_name = "5G-GOA-gNB";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
sib1_tda = 5;
|
||||
min_rxtxtime = 6;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 2150.43 MHz + 14 PRBs@15kHz SCS (same as initial BWP), points to Subcarrier 0 of RB#10 of SSB block
|
||||
absoluteFrequencySSB = 430590;
|
||||
dl_frequencyBand = 66;
|
||||
# this is 2150.43 MHz
|
||||
dl_absoluteFrequencyPointA = 430086;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 0;
|
||||
dl_carrierBandwidth = 25;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=0,L=25 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 6600;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 0;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 2;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 66;
|
||||
# this is 1750.43 MHz
|
||||
ul_absoluteFrequencyPointA = 350086;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 0;
|
||||
ul_carrierBandwidth = 25;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 6600;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 0;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -118;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 5;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#one (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 0;
|
||||
# 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 = 0;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 0;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ({ ipv4 = "192.168.71.132"; });
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.71.140/26";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.71.140/26";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "nfapi";
|
||||
remote_s_address = "192.168.71.141"; // pnf addr [!]
|
||||
local_s_address = "192.168.71.140"; // vnf addr
|
||||
local_s_portc = 50001; // vnf p5 port
|
||||
remote_s_portc = 50000; // pnf p5 port [!]
|
||||
local_s_portd = 50011; // vnf p7 port [!]
|
||||
remote_s_portd = 50010; // pnf p7 port [!]
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 150;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
}
|
||||
);
|
||||
|
||||
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 ="info";
|
||||
};
|
||||
@@ -1,224 +0,0 @@
|
||||
Active_gNBs = ( "gNB-OAI");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe00;
|
||||
gNB_name = "gNB-OAI";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pusch_AntennaPorts = 4;
|
||||
pdsch_AntennaPorts_N1 = 2;
|
||||
maxMIMO_layers = 4;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 4100.16 MHz
|
||||
absoluteFrequencySSB = 673344;
|
||||
# this is 4071 MHz
|
||||
dl_absoluteFrequencyPointA = 671400;
|
||||
dl_frequencyBand = 77;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 162;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart))
|
||||
initialDLBWPlocationAndBandwidth = 31624;
|
||||
#
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 77;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 162;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 31624;
|
||||
# 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 = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 5;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#one (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -70;
|
||||
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 5;
|
||||
nrofDownlinkSlots = 3;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 1;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ({ ipv4 = "192.168.61.132"; });
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.61.129/26";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.61.129/26";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "nfapi";
|
||||
remote_s_address = "127.0.0.1"; // pnf addr [!]
|
||||
local_s_address = "127.0.0.1"; // vnf addr
|
||||
local_s_portc = 50001; // vnf p5 port
|
||||
remote_s_portc = 50000; // pnf p5 port [!]
|
||||
local_s_portd = 50011; // vnf p7 port [!]
|
||||
remote_s_portd = 50010; // pnf p7 port [!]
|
||||
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 250;
|
||||
pucch_TargetSNRx10 = 250;
|
||||
pusch_FailureThres = 100;
|
||||
ul_max_mcs = 28;
|
||||
}
|
||||
);
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea1", "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia1", "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 = "yes";
|
||||
};
|
||||
|
||||
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";
|
||||
};
|
||||
@@ -18,8 +18,7 @@ gNBs =
|
||||
|
||||
sib1_tda = 5;
|
||||
min_rxtxtime = 6;
|
||||
num_dlharq = 32;
|
||||
num_ulharq = 32;
|
||||
disable_harq = 1;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
@@ -29,11 +28,11 @@ gNBs =
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# GSCN 6221
|
||||
absoluteFrequencySSB = 497770;
|
||||
dl_frequencyBand = 254;
|
||||
# this is 2486.15 MHz
|
||||
dl_absoluteFrequencyPointA = 497230;
|
||||
# this is 2150.43 MHz + 14 PRBs@15kHz SCS (same as initial BWP), points to Subcarrier 0 of RB#10 of SSB block
|
||||
absoluteFrequencySSB = 430590;
|
||||
dl_frequencyBand = 66;
|
||||
# this is 2150.43 MHz
|
||||
dl_absoluteFrequencyPointA = 430086;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
@@ -53,9 +52,9 @@ gNBs =
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 254;
|
||||
# this is 1612.65 MHz
|
||||
ul_absoluteFrequencyPointA = 322530;
|
||||
ul_frequencyBand = 66;
|
||||
# this is 1750.43 MHz
|
||||
ul_absoluteFrequencyPointA = 350086;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
@@ -148,15 +147,14 @@ gNBs =
|
||||
|
||||
#ext2
|
||||
#ntn_Config_r17
|
||||
cellSpecificKoffset_r17 = 40;
|
||||
ta-Common-r17 = 4634000; # 18.87 ms
|
||||
ta-CommonDrift-r17 = -230000; # -46 µs/s
|
||||
cellSpecificKoffset_r17 = 478;
|
||||
ta-Common-r17 = 29314900;
|
||||
positionX-r17 = 0;
|
||||
positionY-r17 = -2166908; # -2816980.4 m
|
||||
positionZ-r17 = 4910784; # 6384019.2 m
|
||||
positionY-r17 = 0;
|
||||
positionZ-r17 = 32433846;
|
||||
velocityVX-r17 = 0;
|
||||
velocityVY-r17 = 115246; # 6914.76 m/s
|
||||
velocityVZ-r17 = 50853; # 3051.18 m/s
|
||||
velocityVY-r17 = 0;
|
||||
velocityVZ-r17 = 0;
|
||||
}
|
||||
|
||||
);
|
||||
@@ -198,11 +196,8 @@ MACRLCs = (
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
# ulsch_max_frame_inactivity = 0;
|
||||
pusch_TargetSNRx10 = 150;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
dl_max_mcs = 9;
|
||||
ul_max_mcs = 9;
|
||||
}
|
||||
);
|
||||
|
||||
@@ -210,7 +205,7 @@ L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 150;
|
||||
prach_dtx_threshold = 120;
|
||||
pucch0_dtx_threshold = 150;
|
||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||
}
|
||||
@@ -248,28 +243,11 @@ rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = 4043;
|
||||
options = ("chanmod"); #("saviq"); or/and "chanmod"
|
||||
prop_delay = 20;
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
channelmod = {
|
||||
max_chan=10;
|
||||
modellist="modellist_rfsimu_1";
|
||||
modellist_rfsimu_1 = (
|
||||
{
|
||||
model_name = "rfsimu_channel_enB0"
|
||||
type = "SAT_LEO_TRANS";
|
||||
noise_power_dB = -100;
|
||||
},
|
||||
{
|
||||
model_name = "rfsimu_channel_ue0"
|
||||
type = "SAT_LEO_TRANS";
|
||||
noise_power_dB = -100;
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
@@ -299,3 +277,4 @@ log_config :
|
||||
ngap_log_level ="debug";
|
||||
f1ap_log_level ="debug";
|
||||
};
|
||||
|
||||
@@ -66,7 +66,7 @@ gNBs =
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 154;
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
@@ -133,21 +133,11 @@ gNBs =
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
# ext: 8=ms3, 9=ms4
|
||||
dl_UL_TransmissionPeriodicity = 8;
|
||||
nrofDownlinkSlots = 3;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
# pattern2
|
||||
pattern2: {
|
||||
dl_UL_TransmissionPeriodicity2 = 4;
|
||||
nrofDownlinkSlots2 = 4;
|
||||
nrofDownlinkSymbols2 = 0;
|
||||
nrofUplinkSlots2 = 0;
|
||||
nrofUplinkSymbols2 = 0;
|
||||
};
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
@@ -9,14 +9,14 @@ ColNames :
|
||||
Ref :
|
||||
feprx : 150.0
|
||||
feptx_prec : 0.0
|
||||
feptx_ofdm : 60.0
|
||||
feptx_total : 150.0
|
||||
L1 Tx processing : 530.0
|
||||
DLSCH encoding : 220.0
|
||||
L1 Rx processing : 530.0
|
||||
PUSCH inner-receiver : 360.0
|
||||
feptx_ofdm : 65.0
|
||||
feptx_total : 177.0
|
||||
L1 Tx processing : 700.0
|
||||
DLSCH encoding : 226.0
|
||||
L1 Rx processing : 640.0
|
||||
PUSCH inner-receiver : 400.0
|
||||
Schedule Response : 3.0
|
||||
DL & UL scheduling timing : 17.0
|
||||
DL & UL scheduling timing : 15.0
|
||||
UL Indication : 3.0
|
||||
Slot Indication : 17.0
|
||||
DeviationThreshold :
|
||||
|
||||
@@ -7,16 +7,16 @@ ColNames :
|
||||
- Average; Max; Count
|
||||
- Average vs Reference Deviation (Reference Value; Acceptability Deviation Threshold)
|
||||
Ref :
|
||||
feprx : 40.0
|
||||
feprx : 46.0
|
||||
feptx_prec : 15.0
|
||||
feptx_ofdm : 30.0
|
||||
feptx_total : 45.0
|
||||
L1 Tx processing : 205.0
|
||||
DLSCH encoding : 140.0
|
||||
L1 Rx processing : 345.0
|
||||
PUSCH inner-receiver : 150.0
|
||||
feptx_ofdm : 35.0
|
||||
feptx_total : 50.0
|
||||
L1 Tx processing : 260.0
|
||||
DLSCH encoding : 160.0
|
||||
L1 Rx processing : 420.0
|
||||
PUSCH inner-receiver : 170.0
|
||||
Schedule Response : 3.0
|
||||
DL & UL scheduling timing : 7.0
|
||||
DL & UL scheduling timing : 8.0
|
||||
UL Indication : 3.0
|
||||
Slot Indication : 8.0
|
||||
DeviationThreshold :
|
||||
|
||||
@@ -7,18 +7,18 @@ ColNames :
|
||||
- Average; Max; Count
|
||||
- Average vs Reference Deviation (Reference Value; Acceptability Deviation Threshold)
|
||||
Ref :
|
||||
feprx : 75.0
|
||||
feprx : 84.0
|
||||
feptx_prec : 14.0
|
||||
feptx_ofdm : 30.0
|
||||
feptx_total : 80.0
|
||||
L1 Tx processing : 315.0
|
||||
DLSCH encoding : 155.0
|
||||
feptx_ofdm : 35.0
|
||||
feptx_total : 100.0
|
||||
L1 Tx processing : 400.0
|
||||
DLSCH encoding : 177.0
|
||||
L1 Rx processing : 345.0
|
||||
PUSCH inner-receiver : 155.0
|
||||
PUSCH inner-receiver : 200.0
|
||||
Schedule Response : 3.0
|
||||
DL & UL scheduling timing : 13.0
|
||||
UL Indication : 3.0
|
||||
Slot Indication : 12.0
|
||||
Slot Indication : 15.0
|
||||
DeviationThreshold :
|
||||
feprx : 0.25
|
||||
feptx_prec : 0.25
|
||||
|
||||
@@ -7,17 +7,17 @@ ColNames :
|
||||
- Average; Max; Count
|
||||
- Average vs Reference Deviation (Reference Value; Acceptability Deviation Threshold)
|
||||
Ref :
|
||||
feprx : 40.0
|
||||
feprx : 43.0
|
||||
feptx_prec : 13.0
|
||||
feptx_ofdm : 30.0
|
||||
feptx_total : 45.0
|
||||
L1 Tx processing : 160.0
|
||||
feptx_ofdm : 33.0
|
||||
feptx_total : 50.0
|
||||
L1 Tx processing : 200.0
|
||||
DLSCH encoding : 100.0
|
||||
L1 Rx processing : 290.0
|
||||
PUSCH inner-receiver : 115.0
|
||||
L1 Rx processing : 330.0
|
||||
PUSCH inner-receiver : 120.0
|
||||
Schedule Response : 3.0
|
||||
DL & UL scheduling timing : 6.0
|
||||
UL Indication : 2.0
|
||||
UL Indication : 3.0
|
||||
Slot Indication : 7.0
|
||||
DeviationThreshold :
|
||||
feprx : 0.25
|
||||
|
||||
@@ -387,30 +387,25 @@ def ExecuteActionWithParam(action):
|
||||
|
||||
elif action == 'Push_Local_Registry':
|
||||
svr_id = test.findtext('svr_id')
|
||||
tag_prefix = test.findtext('tag_prefix') or ""
|
||||
success = CONTAINERS.Push_Image_to_Local_Registry(HTML, svr_id, tag_prefix)
|
||||
success = CONTAINERS.Push_Image_to_Local_Registry(HTML, svr_id)
|
||||
|
||||
elif action == 'Pull_Local_Registry' or action == 'Clean_Test_Server_Images':
|
||||
if force_local:
|
||||
# Do not pull or remove images when running locally. User is supposed to handle image creation & cleanup
|
||||
return True
|
||||
svr_id = test.findtext('svr_id')
|
||||
tag_prefix = test.findtext('tag_prefix') or ""
|
||||
images = test.findtext('images').split()
|
||||
# hack: for FlexRIC, we need to overwrite the tag to use
|
||||
tag = None
|
||||
if len(images) == 1 and images[0] == "oai-flexric":
|
||||
tag = CONTAINERS.flexricTag
|
||||
if action == "Pull_Local_Registry":
|
||||
success = CONTAINERS.Pull_Image_from_Registry(HTML, svr_id, images, tag=tag, tag_prefix=tag_prefix)
|
||||
success = CONTAINERS.Pull_Image_from_Registry(HTML, svr_id, images, tag=tag)
|
||||
if action == "Clean_Test_Server_Images":
|
||||
success = CONTAINERS.Clean_Test_Server_Images(HTML, svr_id, 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')
|
||||
command_fail = test.findtext('command_fail') in ['True', 'true', 'Yes', 'yes']
|
||||
success = cls_oaicitest.Custom_Command(HTML, node, command, command_fail)
|
||||
@@ -422,10 +417,9 @@ def ExecuteActionWithParam(action):
|
||||
success = cls_oaicitest.Custom_Script(HTML, node, script, command_fail)
|
||||
|
||||
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)
|
||||
success = CLUSTER.PullClusterImage(HTML, node, images)
|
||||
|
||||
else:
|
||||
logging.warning(f"unknown action {action}, skip step")
|
||||
|
||||
@@ -45,10 +45,6 @@
|
||||
040023
|
||||
020022
|
||||
040024
|
||||
000024
|
||||
040025
|
||||
000031
|
||||
030021
|
||||
100021
|
||||
222222
|
||||
</TestCaseRequestedList>
|
||||
@@ -77,9 +73,9 @@
|
||||
|
||||
<testCase id="000022">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G CU + DU-PCI0 + UE RF sim SA</desc>
|
||||
<desc>Deploy OAI 5G CU+DU+UE RF sim SA</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_f1_rfsimulator</yaml_path>
|
||||
<services>oai-cu oai-du-pci0 oai-nr-ue</services>
|
||||
<services>oai-cu oai-du oai-nr-ue</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
@@ -90,12 +86,6 @@
|
||||
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000031">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>2</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000023">
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
@@ -103,15 +93,6 @@
|
||||
<nodes>cacofonix</nodes>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000024">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G (target) DU-PCI1 RF sim SA</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_f1_rfsimulator</yaml_path>
|
||||
<services>oai-du-pci1</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020021">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from all NR-UEs</desc>
|
||||
@@ -170,15 +151,6 @@
|
||||
<ping_packetloss_threshold>80</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020023">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from all NR-UEs</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>cacofonix</nodes>
|
||||
<ping_args> -c 5 192.168.72.135 -i0.5 -w25</ping_args>
|
||||
<ping_packetloss_threshold>80</ping_packetloss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="040002">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Verify Reestablishment</desc>
|
||||
@@ -219,14 +191,6 @@
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
|
||||
<testCase id="040025">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Trigger Handover</desc>
|
||||
<node>cacofonix</node>
|
||||
<command>echo ci trigger_f1_ho | nc 192.168.71.150 9090</command>
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100021">
|
||||
<class>Undeploy_Object</class>
|
||||
<always_exec>true</always_exec>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb oai-nr-ue</images>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
@@ -134,7 +134,7 @@
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb oai-nr-ue</images>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -34,9 +34,6 @@
|
||||
020002
|
||||
030001
|
||||
030002
|
||||
040001
|
||||
000004
|
||||
020002
|
||||
100001
|
||||
222222
|
||||
</TestCaseRequestedList>
|
||||
@@ -79,12 +76,6 @@
|
||||
<nodes>cacofonix</nodes>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000004">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
@@ -127,14 +118,6 @@
|
||||
<iperf_bitrate_threshold>90</iperf_bitrate_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="040001">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Force Msg3 C-RNTI RA</desc>
|
||||
<node>cacofonix</node>
|
||||
<command>echo ciUE force_crnti_ra | nc 192.168.71.150 8091</command>
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100001">
|
||||
<class>Undeploy_Object</class>
|
||||
<always_exec>true</always_exec>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-fdd-u0-25prb</htmlTabRef>
|
||||
<htmlTabName>VNF-PNF nFAPI FDD u0 25PRB gNB</htmlTabName>
|
||||
<htmlTabName>Monolithic SA FDD u0 25PRB gNB</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
111111
|
||||
@@ -62,9 +62,9 @@
|
||||
|
||||
<testCase id="000002">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G VNF+PNF+nrUE RF sim SA</desc>
|
||||
<desc>Deploy OAI 5G gNB+nrUE RF sim SA</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_u0_25prb</yaml_path>
|
||||
<services>oai-vnf oai-pnf oai-nr-ue</services>
|
||||
<services>oai-gnb oai-nr-ue</services>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
@@ -122,7 +122,6 @@
|
||||
<class>Undeploy_Object</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Undeploy all OAI 5G stack</desc>
|
||||
<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>
|
||||
|
||||
@@ -1,55 +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>build-tab</htmlTabRef>
|
||||
<htmlTabName>Build Container Images for ARM</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
800813
|
||||
000001
|
||||
000010
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
<desc>Create new Workspace for server 0</desc>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
<testCase id="000001">
|
||||
<class>Build_Image</class>
|
||||
<desc>Build all Images</desc>
|
||||
<kind>native_arm</kind>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000010">
|
||||
<class>Push_Local_Registry</class>
|
||||
<desc>Push Images to Local Registry</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<tag_prefix>arm_</tag_prefix>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -1,49 +0,0 @@
|
||||
<!--
|
||||
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>TEST-GH-AERIAL-SA</htmlTabRef>
|
||||
<htmlTabName>Gracehopper AERIAL 100 MHz TDD SA</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
111111
|
||||
333333
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-aerial</images>
|
||||
<tag_prefix>arm_</tag_prefix>
|
||||
</testCase>
|
||||
|
||||
<testCase id="333333">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<svr_id>0</svr_id>
|
||||
<images>oai-gnb-aerial</images>
|
||||
</testCase>
|
||||
</testCaseList>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>TEST-SA-FR1-N310-4x4-60MHz</htmlTabRef>
|
||||
<htmlTabName>nFAPI 60 MHz 4x4 TDD SA</htmlTabName>
|
||||
<htmlTabName>60 MHz 4x4 TDD SA</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
100000
|
||||
@@ -85,7 +85,7 @@
|
||||
</testCase>
|
||||
<testCase id="030101">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy VNF-PNF (TDD/Band77/60MHz/N310) in a container</desc>
|
||||
<desc>Deploy gNB (TDD/Band77/60MHz/N310) in a container</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz</yaml_path>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
@@ -144,11 +144,11 @@
|
||||
<testCase id="030201">
|
||||
<class>Undeploy_Object</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Undeploy VNF-PNF</desc>
|
||||
<desc>Undeploy gNB</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz</yaml_path>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
<services>oai-vnf oai-pnf</services>
|
||||
<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>
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>TEST-SA-FR1-SC-PATTERN2-FDMA-B200</htmlTabRef>
|
||||
<htmlTabName>40 MHz TDD (pattern2) SA with SC-FDMA</htmlTabName>
|
||||
<htmlTabRef>TEST-SA-FR1-SC-FDMA-B200</htmlTabRef>
|
||||
<htmlTabName>40 MHz TDD SA with SC-FDMA</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
300000
|
||||
@@ -101,7 +101,7 @@
|
||||
</testCase>
|
||||
<testCase id="230101">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy gNB (TDD/pattern2/Band78/40MHz/B200) with SC-FDMA in a container</desc>
|
||||
<desc>Deploy gNB (TDD/Band78/40MHz/B200) with SC-FDMA in a container</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/sa_sc_b200_gnb</yaml_path>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<testCase id="090101">
|
||||
<class>Initialize_eNB</class>
|
||||
<desc>Initialize gNB USRP</desc>
|
||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.106prb.usrpn300.phytest-dora.conf --phy-test -q -U 768 -T 106 -t 23 -D 127 -m 28 -M 106 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.106prb.usrpn300.phytest-dora.conf --phy-test -q -U 787200 -T 106 -t 23 -D 130175 -m 28 -M 106 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||
<rt_stats_cfg>datalog_rt_stats.default.yaml</rt_stats_cfg>
|
||||
<air_interface>NR</air_interface>
|
||||
<USRP_IPAddress>192.168.20.2</USRP_IPAddress>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<testCase id="390101">
|
||||
<class>Initialize_eNB</class>
|
||||
<desc>Initialize gNB USRP</desc>
|
||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.273prb.usrpn300.phytest-dora.conf --phy-test -q -U 768 -T 273 -t 23 -D 127 -m 23 -M 273 -l 2 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.273prb.usrpn300.phytest-dora.conf --phy-test -q -U 787200 -T 273 -t 23 -D 130175 -m 23 -M 273 -l 2 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||
<rt_stats_cfg>datalog_rt_stats.100.2x2.yaml</rt_stats_cfg>
|
||||
<air_interface>NR</air_interface>
|
||||
<USRP_IPAddress>192.168.20.2</USRP_IPAddress>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<testCase id="190101">
|
||||
<class>Initialize_eNB</class>
|
||||
<desc>Initialize gNB USRP</desc>
|
||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.162prb.usrpn300.phytest-dora.conf --phy-test -q -U 768 -T 162 -t 23 -D 127 -m 23 -M 162 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.162prb.usrpn300.phytest-dora.conf --phy-test -q -U 787200 -T 162 -t 23 -D 130175 -m 23 -M 162 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||
<rt_stats_cfg>datalog_rt_stats.1x1.60.yaml</rt_stats_cfg>
|
||||
<air_interface>NR</air_interface>
|
||||
<USRP_IPAddress>192.168.20.2</USRP_IPAddress>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<testCase id="290101">
|
||||
<class>Initialize_eNB</class>
|
||||
<desc>Initialize gNB USRP</desc>
|
||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.162prb.usrpn300.phytest-dora.conf --phy-test --gNBs.[0].pdsch_AntennaPorts_XP 2 --RUs.[0].nb_tx 2 --RUs.[0].nb_rx 2 -q -U 768 -T 162 -t 23 -D 127 -m 23 -M 162 -l 2 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.162prb.usrpn300.phytest-dora.conf --phy-test --gNBs.[0].pdsch_AntennaPorts_XP 2 --RUs.[0].nb_tx 2 --RUs.[0].nb_rx 2 -q -U 787200 -T 162 -t 23 -D 130175 -m 23 -M 162 -l 2 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||
<rt_stats_cfg>datalog_rt_stats.60.2x2.yaml</rt_stats_cfg>
|
||||
<air_interface>NR</air_interface>
|
||||
<USRP_IPAddress>192.168.20.2</USRP_IPAddress>
|
||||
|
||||
@@ -25,10 +25,7 @@
|
||||
<htmlTabRef>test-ldpc-gpu</htmlTabRef>
|
||||
<htmlTabName>Test-ldpc-GPU</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021
|
||||
000022 000023 000024 000025 000026 000027 000028 000029 000030 000031 000032 000033 000034 000035 000036 000037 000038 000039 000040 000041
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseRequestedList>000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="000002">
|
||||
@@ -191,166 +188,6 @@
|
||||
<physim_run_args>-l 8448 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000022">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 1 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000023">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 1 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000024">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 100 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000025">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 100 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000026">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 193 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000027">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 193 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000028">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 500 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000029">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 500 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000030">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 561 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000031">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 561 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000032">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 600 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000033">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 600 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000034">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 641 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000035">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 641 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000036">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 2000 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000037">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 2000 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000038">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 3000 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000039">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 3000 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000040">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 3840 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000041">
|
||||
<class>Run_Physim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<physim_test>ldpctest</physim_test>
|
||||
<physim_run_args>-l 3840 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -90,7 +90,6 @@ services:
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time
|
||||
--rfsimulator.options chanmod
|
||||
--gNBs.[0].remote_s_address 0.0.0.0
|
||||
--telnetsrv --telnetsrv.listenaddr 192.168.71.150
|
||||
--telnetsrv.shrmod ci
|
||||
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||
@@ -107,9 +106,9 @@ services:
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-du-pci0:
|
||||
oai-du:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-du-pci0
|
||||
container_name: rfsim5g-oai-du
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
@@ -118,11 +117,9 @@ services:
|
||||
--rfsimulator.options chanmod
|
||||
--telnetsrv --telnetsrv.listenaddr 192.168.71.171
|
||||
--telnetsrv.shrmod ci
|
||||
--rfsimulator.serveraddr 192.168.71.181
|
||||
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||
depends_on:
|
||||
- oai-cu
|
||||
- oai-nr-ue
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.171
|
||||
@@ -134,37 +131,6 @@ services:
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-du-pci1:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-du-pci1
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --rfsim
|
||||
--log_config.global_log_options level,nocolor,time
|
||||
--gNBs.[0].gNB_DU_ID 3585
|
||||
--gNBs.[0].nr_cellid 11111111
|
||||
--gNBs.[0].servingCellConfigCommon.[0].physCellId 1
|
||||
--gNBs.[0].servingCellConfigCommon.[0].absoluteFrequencySSB 643296
|
||||
--gNBs.[0].servingCellConfigCommon.[0].dl_absoluteFrequencyPointA 642024
|
||||
--gNBs.[0].servingCellConfigCommon.[0].ssb_PositionsInBurst_Bitmap 3
|
||||
--MACRLCs.[0].local_n_address 192.168.71.172
|
||||
--rfsimulator.serveraddr 192.168.71.181
|
||||
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||
depends_on:
|
||||
- oai-cu
|
||||
- oai-nr-ue
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.172
|
||||
volumes:
|
||||
- ../../conf_files/gnb-du.sa.band78.106prb.rfsim.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
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
|
||||
@@ -177,12 +143,12 @@ services:
|
||||
USE_ADDITIONAL_OPTIONS: --rfsim --log_config.global_log_options level,nocolor,time
|
||||
-r 106 --numerology 1 -C 3619200000
|
||||
--uicc0.imsi 208990100001100
|
||||
--rfsimulator.serveraddr 192.168.71.171
|
||||
--rfsimulator.options chanmod
|
||||
--rfsimulator.serveraddr server
|
||||
--telnetsrv --telnetsrv.shrmod ciUE --telnetsrv.listenaddr 192.168.71.181 --telnetsrv.listenport 8091
|
||||
--channelmod.modellist_rfsimu_1.[0].model_name rfsimu_channel_ue0
|
||||
--channelmod.modellist_rfsimu_1.[1].model_name rfsimu_channel_ue1
|
||||
ASAN_OPTIONS: detect_odr_violation=0
|
||||
depends_on:
|
||||
- oai-du
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.181
|
||||
|
||||
@@ -86,7 +86,8 @@ services:
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: -E --log_config.global_log_options level,nocolor,time --device.name vrtsim --vrtsim.role server --vrtsim.timescale 0.5
|
||||
USE_ADDITIONAL_OPTIONS: -E --rfsim --log_config.global_log_options level,nocolor,time
|
||||
ASAN_OPTIONS: detect_leaks=0
|
||||
depends_on:
|
||||
- oai-ext-dn
|
||||
networks:
|
||||
@@ -94,13 +95,11 @@ services:
|
||||
ipv4_address: 192.168.71.140
|
||||
volumes:
|
||||
- ../../conf_files/gnb.sa.band66.106prb.rfsim.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- tmp_data:/tmp/
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
ipc: host
|
||||
oai-nr-ue:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
@@ -110,7 +109,7 @@ services:
|
||||
- NET_ADMIN # for interface bringup
|
||||
- NET_RAW # for ping
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: -E -r 106 --numerology 1 --uicc0.imsi 208990100001100 --band 66 -C 2169090000 --CO -400000000 --ssb 378 --log_config.global_log_options level,nocolor,time --device.name vrtsim
|
||||
USE_ADDITIONAL_OPTIONS: -E --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 --band 66 -C 2169090000 --CO -400000000 --ssb 378 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
depends_on:
|
||||
- oai-gnb
|
||||
networks:
|
||||
@@ -120,13 +119,11 @@ services:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
volumes:
|
||||
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
- tmp_data:/tmp/
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-uesoftmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
ipc: host
|
||||
|
||||
networks:
|
||||
public_net:
|
||||
@@ -145,6 +142,3 @@ networks:
|
||||
- subnet: 192.168.72.128/26
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "rfsim5g-traffic"
|
||||
|
||||
volumes:
|
||||
tmp_data:
|
||||
|
||||
@@ -109,10 +109,7 @@ services:
|
||||
- NET_ADMIN # for interface bringup
|
||||
- NET_RAW # for ping
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --rfsim -r 24 --ssb 24 --numerology 1 -C 3604800000 --uicc0.imsi 208990100001100
|
||||
--rfsimulator.serveraddr 192.168.71.140 --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 24 --ssb 24 --numerology 1 -C 3604800000 --uicc0.imsi 208990100001100 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
depends_on:
|
||||
- oai-gnb
|
||||
networks:
|
||||
|
||||
@@ -86,7 +86,7 @@ services:
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --rfsim --log_config.global_log_options level,nocolor,time
|
||||
USE_ADDITIONAL_OPTIONS: --rfsim --rfsimulator.prop_delay 238.74 --log_config.global_log_options level,nocolor,time
|
||||
ASAN_OPTIONS: detect_leaks=0
|
||||
depends_on:
|
||||
- oai-ext-dn
|
||||
@@ -94,7 +94,7 @@ services:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.140
|
||||
volumes:
|
||||
- ../../conf_files/gnb.sa.band254.u0.25prb.rfsim.ntn.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- ../../conf_files/gnb.sa.band66.ntn.25prb.rfsim.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
@@ -110,7 +110,7 @@ services:
|
||||
- NET_ADMIN # for interface bringup
|
||||
- NET_RAW # for ping
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --band 254 -C 2488400000 --CO -873500000 -r 25 --numerology 0 --ssb 60 --rfsim --rfsimulator.prop_delay 238.74 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
USE_ADDITIONAL_OPTIONS: --band 66 -C 2152680000 --CO -400000000 -r 25 --numerology 0 --ssb 48 --rfsim --rfsimulator.prop_delay 238.74 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
depends_on:
|
||||
- oai-gnb
|
||||
networks:
|
||||
|
||||
@@ -80,15 +80,13 @@ services:
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-vnf:
|
||||
oai-gnb:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-vnf
|
||||
container_name: rfsim5g-oai-gnb
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --nfapi VNF --log_config.global_log_options level,nocolor,time
|
||||
NFAPI_TRACE_LEVEL: info
|
||||
USE_ADDITIONAL_OPTIONS: --rfsim --log_config.global_log_options level,nocolor,time
|
||||
ASAN_OPTIONS: detect_leaks=0
|
||||
depends_on:
|
||||
- oai-ext-dn
|
||||
@@ -96,29 +94,7 @@ services:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.140
|
||||
volumes:
|
||||
- ../../conf_files/gnb-vnf.sa.band66.u0.25prb.nfapi.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-pnf:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-pnf
|
||||
cap_drop:
|
||||
- ALL
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --nfapi PNF --rfsim --log_config.global_log_options level,nocolor,time
|
||||
NFAPI_TRACE_LEVEL: info
|
||||
ASAN_OPTIONS: detect_leaks=0
|
||||
depends_on:
|
||||
- oai-vnf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.141
|
||||
volumes:
|
||||
- ../../conf_files/gnb-pnf.band66.rfsim.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- ../../conf_files/gnb.sa.band66.u0.25prb.rfsim.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
@@ -134,9 +110,9 @@ 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 --log_config.global_log_options level,nocolor,time
|
||||
USE_ADDITIONAL_OPTIONS: --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152680000 --CO -400000000 --ssb 48 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
depends_on:
|
||||
- oai-pnf
|
||||
- oai-gnb
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.150
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
services:
|
||||
oai-vnf:
|
||||
oai-gnb:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
network_mode: "host"
|
||||
container_name: oai-vnf
|
||||
container_name: oai-gnb
|
||||
cap_drop:
|
||||
- ALL
|
||||
cap_add:
|
||||
@@ -10,30 +10,9 @@ services:
|
||||
- IPC_LOCK
|
||||
environment:
|
||||
TZ: Europe/Paris
|
||||
USE_ADDITIONAL_OPTIONS: --nfapi VNF
|
||||
NFAPI_TRACE_LEVEL: info
|
||||
USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time
|
||||
volumes:
|
||||
- ../../conf_files/gnb-vnf.sa.band77.162prb.nfapi.4x4.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
oai-pnf:
|
||||
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
network_mode: "host"
|
||||
container_name: oai-pnf
|
||||
cap_drop:
|
||||
- ALL
|
||||
cap_add:
|
||||
- SYS_NICE
|
||||
- IPC_LOCK
|
||||
environment:
|
||||
TZ: Europe/Paris
|
||||
USE_ADDITIONAL_OPTIONS: --nfapi PNF
|
||||
NFAPI_TRACE_LEVEL: info
|
||||
volumes:
|
||||
- ../../conf_files/gnb-pnf.band77.usrpn310.4x4.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- ../../conf_files/gnb.sa.band77.162prb.usrpn310.4x4.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
|
||||
@@ -9,7 +9,6 @@ services:
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --telnetsrv --telnetsrv.listenport 9090 --telnetsrv.shrmod ci
|
||||
--log_config.global_log_options level,nocolor,time,line_num,function
|
||||
--security.drb_integrity yes
|
||||
volumes:
|
||||
- ../../conf_files/gnb-cucp.sa.f1.quectel.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
# for performance reasons, we use host mode: in bridge mode, we have
|
||||
|
||||
@@ -105,7 +105,11 @@ add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")
|
||||
##########################
|
||||
# NAS LAYER OPTIONS
|
||||
##########################
|
||||
add_boolean_option(ENABLE_NAS_UE_LOGGING True "????")
|
||||
add_boolean_option(NAS_BUILT_IN_EPC False "MME NAS layer not present in this executable")
|
||||
add_boolean_option(NAS_BUILT_IN_UE False "UE NAS layer present in this executable")
|
||||
add_boolean_option(NAS_UE True "NAS UE INSTANCE (<> NAS_MME)")
|
||||
add_boolean_option(NAS_MME False "NAS_UE and NAS_MME are incompatible options")
|
||||
|
||||
################################################################################
|
||||
# SECU LIB
|
||||
|
||||
@@ -66,26 +66,16 @@
|
||||
</testCase>
|
||||
|
||||
<testCase id="ldpctest">
|
||||
<desc>ldpc Test cases. (Test1: block length = 3872, BG1),
|
||||
(Test2: block length = 4224, BG1),
|
||||
(Test3: block length = 4576, BG1),
|
||||
(Test4: block length = 4928, BG1),
|
||||
(Test5: block length = 5280, BG1),
|
||||
(Test6: block length = 5632, BG1),
|
||||
(Test7: block length = 6336, BG1),
|
||||
(Test8: block length = 7040, BG1),
|
||||
(Test9: block length = 7744, BG1),
|
||||
(Test10: block length = 8448, BG1),
|
||||
(Test11: block length = 1, BG2),
|
||||
(Test12: block length = 100, BG2),
|
||||
(Test13: block length = 193, BG2),
|
||||
(Test14: block length = 500, BG2),
|
||||
(Test15: block length = 561, BG2),
|
||||
(Test16: block length = 600, BG2),
|
||||
(Test17: block length = 641, BG2),
|
||||
(Test18: block length = 2000, BG2),
|
||||
(Test19: block length = 3000, BG2),
|
||||
(Test20: block length = 3840, BG2)</desc>
|
||||
<desc>ldpc Test cases. (Test1: block length = 3872),
|
||||
(Test2: block length = 4224),
|
||||
(Test3: block length = 4576),
|
||||
(Test4: block length = 4928),
|
||||
(Test5: block length = 5280),
|
||||
(Test6: block length = 5632),
|
||||
(Test7: block length = 6336),
|
||||
(Test8: block length = 7040),
|
||||
(Test9: block length = 7744),
|
||||
(Test10: block length = 8448)</desc>
|
||||
<main_exec>ldpctest</main_exec>
|
||||
<main_exec_args>-l3872 -s10 -n100
|
||||
-l4224 -s10 -n100
|
||||
@@ -97,17 +87,9 @@
|
||||
-l7040 -s10 -n100
|
||||
-l7744 -s10 -n100
|
||||
-l8448 -s10 -n100
|
||||
-l1 -s10 -n100
|
||||
-l100 -s10 -n100
|
||||
-l193 -s10 -n100
|
||||
-l500 -s10 -n100
|
||||
-l561 -s10 -n100
|
||||
-l600 -s10 -n100
|
||||
-l641 -s10 -n100
|
||||
-l2000 -s10 -n100
|
||||
-l3000 -s10 -n100
|
||||
-l3840 -s10 -n100</main_exec_args>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17 test18 test19 test20</tags>
|
||||
-l561 -s10 -n1
|
||||
-l500 -s10 -n1</main_exec_args>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8 test9 test10</tags>
|
||||
<search_expr_true>BLER 0.000000</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal|differ</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
@@ -186,8 +168,7 @@
|
||||
(Test4: HARQ test 25% TP 4 rounds),
|
||||
(Test5: HARQ test 33% TP 3 rounds),
|
||||
(Test6: HARQ test 50% TP 2 rounds),
|
||||
(Test7: 25 PRBs, 15 kHz SCS),
|
||||
(Test8: 32 PRBs, 120 kHz SCS)</desc>
|
||||
(Test7: 25 PRBs, 15 kHz SCS)</desc>
|
||||
<main_exec>nr_dlsim</main_exec>
|
||||
<main_exec_args>-n100 -R106 -b106 -s5
|
||||
-n100 -R217 -b217 -s5
|
||||
@@ -195,9 +176,8 @@
|
||||
-n100 -s1 -S2 -t25
|
||||
-n100 -s1 -S2 -t33
|
||||
-n100 -s5 -S7 -t50
|
||||
-n100 -m0 -e0 -R25 -b25 -i 2 1 0
|
||||
-n100 -s5 -m3 -R32 -b32</main_exec_args>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8</tags>
|
||||
-n100 -m0 -e0 -R25 -b25 -i 2 1 0</main_exec_args>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7</tags>
|
||||
<search_expr_true>PDSCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
@@ -420,10 +400,9 @@
|
||||
(Test9: PUSCH Type B, 3 DMRS, 2 PTRS, 7 Interpolated Symbols),
|
||||
(Test10: PUSCH Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols),
|
||||
(Test11: 25 PRBs, 15 kHz SCS),
|
||||
(Test12: 32 PRBs, 120 kHz SCS),
|
||||
(Test13: MCS 0, low SNR performance)
|
||||
(Test14: MCS 28, 106 PRBs, Time shift 8)
|
||||
(Test15: SRS, SNR 40 dB)</desc>
|
||||
(Test12: MCS 0, low SNR performance)
|
||||
(Test13: MCS 28, 106 PRBs, Time shift 8)
|
||||
(Test14: SRS, SNR 40 dB)</desc>
|
||||
<main_exec>nr_ulsim</main_exec>
|
||||
<main_exec_args>-n100 -m9 -r106 -s5
|
||||
-n100 -m16 -s10
|
||||
@@ -436,11 +415,10 @@
|
||||
-n100 -s5 -T 2,2 -U 1,2,1,1
|
||||
-n100 -s5 -a4 -b8 -T 1,2 -U 1,3,1,1
|
||||
-n100 -u0 -m0 -R25 -r25 -i 1,0
|
||||
-n100 -s5 -r32 -R32 -u3
|
||||
-n100 -m0 -S -0.6 -i 1,0
|
||||
-n100 -m 28 -R106 -r106 -t90 -s24 -S24 -d 8
|
||||
-n100 -s40 -E 1</main_exec_args>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15</tags>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14</tags>
|
||||
<search_expr_true>PUSCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
|
||||
@@ -46,7 +46,7 @@ BUILD_DOXYGEN=0
|
||||
DISABLE_HARDWARE_DEPENDENCY="False"
|
||||
CMAKE_BUILD_TYPE="RelWithDebInfo"
|
||||
CMAKE_CMD="$CMAKE"
|
||||
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope ldpc_cuda ldpc_t2 ldpc_xdma websrv oai_iqplayer imscope imscope_record"
|
||||
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope ldpc_cuda ldpc_t2 ldpc_xdma websrv oai_iqplayer imscope"
|
||||
TARGET_LIST=""
|
||||
BUILD_TOOL_OPT="-j$(nproc)"
|
||||
|
||||
@@ -99,7 +99,7 @@ Options:
|
||||
USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, AERIAL, None (Default)
|
||||
Adds this RF board support (in external packages installation and in compilation)
|
||||
-t | --transport
|
||||
Selects the transport protocol type, options: None, Ethernet, benetel4g, benetel5g, oran_fhlib_5g, oran_fhlib_5g_mplane
|
||||
Selects the transport protocol type, options: None, Ethernet, benetel4g, benetel5g, oran_fhlib_5g
|
||||
-P | --phy_simulators
|
||||
Makes the unitary tests Layer 1 simulators
|
||||
-s | --check
|
||||
@@ -304,10 +304,6 @@ function main() {
|
||||
TARGET_LIST="$TARGET_LIST $2"
|
||||
CMAKE_CMD="$CMAKE_CMD -DOAI_FHI72=ON"
|
||||
;;
|
||||
"oran_fhlib_5g_mplane")
|
||||
TARGET_LIST="$TARGET_LIST $2"
|
||||
CMAKE_CMD="$CMAKE_CMD -DOAI_FHI72=ON -DOAI_FHI72_MPLANE=ON"
|
||||
;;
|
||||
"None")
|
||||
;;
|
||||
*)
|
||||
@@ -489,7 +485,7 @@ function main() {
|
||||
# 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
|
||||
TARGET_LIST="$TARGET_LIST params_libconfig coding rfsimulator dfts params_yaml vrtsim"
|
||||
TARGET_LIST="$TARGET_LIST params_libconfig coding rfsimulator dfts params_yaml"
|
||||
fi
|
||||
|
||||
mkdir -p $DIR/$BUILD_DIR/build
|
||||
@@ -508,6 +504,12 @@ function main() {
|
||||
echo_info "Built Doxygen based documentation. The documentation file is located here: $DIR/$BUILD_DIR/build/doc/html/index.html"
|
||||
fi
|
||||
|
||||
# TODO: once we got the CMakeLists.txt file done for the ORAN files, remove the following lines
|
||||
if [[ $TARGET_LIST =~ "oran_fhlib_5g" ]]; then
|
||||
rm -f liboai_transpro.so
|
||||
ln -s liboran_fhlib_5g.so liboai_transpro.so
|
||||
fi
|
||||
|
||||
if [ "$UE" = 1 ] ; then
|
||||
|
||||
echo_info "Compiling UE specific part"
|
||||
|
||||
53
cmake_targets/tools/MODULES/FindLibXml2.cmake
Executable file
53
cmake_targets/tools/MODULES/FindLibXml2.cmake
Executable file
@@ -0,0 +1,53 @@
|
||||
# - Try to find the LibXml2 xml processing library
|
||||
# Once done this will define
|
||||
#
|
||||
# LIBXML2_FOUND - System has LibXml2
|
||||
# LIBXML2_INCLUDE_DIR - The LibXml2 include directory
|
||||
# LIBXML2_LIBRARIES - The libraries needed to use LibXml2
|
||||
# LIBXML2_DEFINITIONS - Compiler switches required for using LibXml2
|
||||
# LIBXML2_XMLLINT_EXECUTABLE - The XML checking tool xmllint coming with LibXml2
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2006-2009 Kitware, Inc.
|
||||
# Copyright 2006 Alexander Neundorf <neundorf@kde.org>
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
# (To distributed this file outside of CMake, substitute the full
|
||||
# License text for the above reference.)
|
||||
|
||||
# use pkg-config to get the directories and then use these values
|
||||
# in the FIND_PATH() and FIND_LIBRARY() calls
|
||||
FIND_PACKAGE(PkgConfig)
|
||||
PKG_CHECK_MODULES(PC_LIBXML libxml-2.0)
|
||||
SET(LIBXML2_DEFINITIONS ${PC_LIBXML_CFLAGS_OTHER})
|
||||
|
||||
FIND_PATH(LIBXML2_INCLUDE_DIR NAMES libxml/xpath.h
|
||||
HINTS
|
||||
${PC_LIBXML_INCLUDEDIR}
|
||||
${PC_LIBXML_INCLUDE_DIRS}
|
||||
PATH_SUFFIXES libxml2
|
||||
)
|
||||
|
||||
FIND_LIBRARY(LIBXML2_LIBRARIES NAMES xml2 libxml2
|
||||
HINTS
|
||||
${PC_LIBXML_LIBDIR}
|
||||
${PC_LIBXML_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
FIND_PROGRAM(LIBXML2_XMLLINT_EXECUTABLE xmllint)
|
||||
# for backwards compat. with KDE 4.0.x:
|
||||
SET(XMLLINT_EXECUTABLE "${LIBXML2_XMLLINT_EXECUTABLE}")
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set LIBXML2_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibXml2 DEFAULT_MSG LIBXML2_LIBRARIES LIBXML2_INCLUDE_DIR)
|
||||
|
||||
MARK_AS_ADVANCED(LIBXML2_INCLUDE_DIR LIBXML2_LIBRARIES LIBXML2_XMLLINT_EXECUTABLE)
|
||||
|
||||
@@ -75,6 +75,7 @@ endif()
|
||||
|
||||
find_path(xran_INCLUDE_DIR
|
||||
NAMES
|
||||
xran_common.h
|
||||
xran_compression.h
|
||||
xran_cp_api.h
|
||||
xran_ecpri_owd_measurements.h
|
||||
@@ -83,7 +84,7 @@ find_path(xran_INCLUDE_DIR
|
||||
xran_pkt_up.h
|
||||
xran_sync_api.h
|
||||
HINTS ${xran_LOCATION}
|
||||
PATH_SUFFIXES api
|
||||
PATH_SUFFIXES api include
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
find_library(xran_LIBRARY
|
||||
@@ -126,19 +127,16 @@ find_package_handle_standard_args(xran
|
||||
VERSION_VAR xran_VERSION
|
||||
)
|
||||
|
||||
# in proper usage of cmake, include directory should only contain "api", but not header files under "src" directory;
|
||||
# however, we use xran_dev_get_ctx() and xran_dev_get_ctx_by_id() functions which are defined in xran_common.h;
|
||||
# since xran_common.h is under "src" directory, we have to include it in ${xran_INCLUDE_DIRS}
|
||||
if(xran_FOUND)
|
||||
set(xran_LIBRARIES ${xran_LIBRARY})
|
||||
set(xran_INCLUDE_DIRS ${xran_INCLUDE_DIR} ${xran_INCLUDE_DIR}/../src)
|
||||
set(xran_INCLUDE_DIRS ${xran_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
if(xran_FOUND AND NOT TARGET xran::xran)
|
||||
add_library(xran::xran UNKNOWN IMPORTED)
|
||||
set_target_properties(xran::xran PROPERTIES
|
||||
IMPORTED_LOCATION "${xran_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${xran_INCLUDE_DIRS}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${xran_INCLUDE_DIR}"
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
@@ -546,10 +546,7 @@ check_install_additional_tools (){
|
||||
libforms-bin \
|
||||
libforms-dev \
|
||||
libxft-dev \
|
||||
xmlstarlet \
|
||||
libpcre3-dev \
|
||||
libssh-dev \
|
||||
libxml2-dev"
|
||||
xmlstarlet"
|
||||
elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]] || [[ "$OS_DISTRO" == "fedora" ]]; then
|
||||
PACKAGE_LIST="\
|
||||
doxygen \
|
||||
@@ -559,10 +556,7 @@ check_install_additional_tools (){
|
||||
libXft-devel \
|
||||
xforms \
|
||||
xforms-devel \
|
||||
xmlstarlet \
|
||||
pcre-devel \
|
||||
libssh-devel \
|
||||
libxml2-devel"
|
||||
xmlstarlet"
|
||||
fi
|
||||
$SUDO $INSTALLER install -y $PACKAGE_LIST $optional_packages
|
||||
}
|
||||
@@ -680,8 +674,8 @@ install_simde_from_source(){
|
||||
if [[ -v SIMDE_VERSION ]]; then
|
||||
git checkout -f $SIMDE_VERSION
|
||||
else
|
||||
# At time of writing, last working commit for OAI: c7f26b7
|
||||
git checkout c7f26b73ba8e874b95c2cec2b497826ad2188f68
|
||||
# At time of writing, last working commit for OAI: 1a09d3bc
|
||||
git checkout 1a09d3bc9de47c4d9a5daa23eb753d5322748201
|
||||
fi
|
||||
# Showing which version is used
|
||||
git log -n1
|
||||
|
||||
@@ -63,7 +63,7 @@ void SetDefault(configmodule_interface_t *cfg, paramdef_t *param)
|
||||
*param->i8ptr = param->defintval;
|
||||
break;
|
||||
case TYPE_UINT8:
|
||||
*param->u8ptr = param->defuintval;
|
||||
*param->i8ptr = param->defuintval;
|
||||
break;
|
||||
case TYPE_INT16:
|
||||
*param->i16ptr = param->defintval;
|
||||
@@ -120,11 +120,8 @@ void SetNonDefault(configmodule_interface_t *cfg, const YAML::Node &node, paramd
|
||||
sprintf(*param->strptr, "%s", setting.c_str());
|
||||
break;
|
||||
}
|
||||
case TYPE_INT8:
|
||||
*param->i8ptr = node[optname].as<int8_t>();
|
||||
break;
|
||||
case TYPE_UINT8:
|
||||
*param->u8ptr = node[optname].as<uint8_t>();
|
||||
*param->i8ptr = node[optname].as<uint8_t>();
|
||||
break;
|
||||
case TYPE_INT16:
|
||||
*param->i16ptr = node[optname].as<int16_t>();
|
||||
|
||||
@@ -150,15 +150,6 @@ typedef enum ip_traffic_type_e {
|
||||
TRAFFIC_PC5S_SESSION_INIT = 10
|
||||
} ip_traffic_type_t;
|
||||
|
||||
typedef enum {
|
||||
PDCCH_AGG_LEVEL1 = 0,
|
||||
PDCCH_AGG_LEVEL2,
|
||||
PDCCH_AGG_LEVEL4,
|
||||
PDCCH_AGG_LEVEL8,
|
||||
PDCCH_AGG_LEVEL16,
|
||||
NUM_PDCCH_AGG_LEVELS
|
||||
} Pdcch_Aggregation_Level_t;
|
||||
|
||||
typedef struct net_ip_address_s {
|
||||
unsigned ipv4: 1;
|
||||
unsigned ipv6: 1;
|
||||
@@ -297,12 +288,6 @@ typedef struct protocol_ctxt_s {
|
||||
|
||||
#define CHECK_CTXT_ARGS(CTXT_Pp)
|
||||
|
||||
|
||||
static inline int ceil_mod(const unsigned int v, const unsigned int mod)
|
||||
{
|
||||
return ((v + mod - 1) / mod) * mod;
|
||||
}
|
||||
|
||||
#define exit_fun(msg) exit_function(__FILE__, __FUNCTION__, __LINE__, "exit_fun", OAI_EXIT_NORMAL)
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
||||
@@ -21,4 +21,3 @@ if (ENABLE_TESTS)
|
||||
endif()
|
||||
add_subdirectory(barrier)
|
||||
add_subdirectory(actor)
|
||||
add_subdirectory(shm_iq_channel)
|
||||
|
||||
@@ -1,15 +1,10 @@
|
||||
add_library(log_headers INTERFACE)
|
||||
target_include_directories(log_headers INTERFACE .)
|
||||
target_link_libraries(log_headers INTERFACE T_headers)
|
||||
|
||||
set(log_sources log.c)
|
||||
if (ENABLE_LTTNG)
|
||||
set(log_sources ${log_sources} lttng-tp.c)
|
||||
endif()
|
||||
add_library(LOG ${log_sources})
|
||||
target_include_directories(LOG PUBLIC .)
|
||||
target_link_libraries(LOG PRIVATE CONFIG_LIB)
|
||||
target_link_libraries(LOG PUBLIC log_headers)
|
||||
target_link_libraries(LOG PRIVATE ${T_LIB})
|
||||
if (ENABLE_LTTNG)
|
||||
target_link_libraries(LOG PUBLIC lttng-ust)
|
||||
endif()
|
||||
|
||||
@@ -19,11 +19,8 @@ The following options can be specified to trigger the information added in the h
|
||||
- `thread_id`: add the thread ID
|
||||
- `function`: add the function name
|
||||
- `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 `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.
|
||||
- `time`: add the time since process started
|
||||
- `wall_clock`: add the system-wide clock time that measures real (i.e., wall-clock) time (`time` and `wall_clock` are mutually exclusive)
|
||||
|
||||
### Component specific parameters
|
||||
| name | type | default | description |
|
||||
@@ -231,10 +228,6 @@ It can also be retrieved when using the telnet server, as explained [below](###
|
||||
| `<flag>_debug` | `boolean` | 0 = false | Triggers the activation of conditional code identified by the specified flag.
|
||||
| `<flag>_dump` | `boolean` | 0 = false| Triggers buffer dump, on the console in text form or in a file in matlab format, depending on the developper choice and forcasted usage|
|
||||
|
||||
Example: dump all ASN.1 structures during operation with
|
||||
`--log_config.ASN1_debug`. To get a list of all flag/dump options, provide an
|
||||
invalid flag, e.g. `--log_config.HELP_debug`.
|
||||
|
||||
### Using the configuration file to configure the logging facility
|
||||
The following example sets all components log level to info, exept for hw,phy,mac,rlc,pdcp,rrc which log levels are set to error or warning.
|
||||
```bash
|
||||
|
||||
@@ -52,13 +52,6 @@
|
||||
|
||||
// main log variables
|
||||
|
||||
/** @defgroup _max_length Maximum Length of LOG
|
||||
* @ingroup _macro
|
||||
* @brief the macros that describe the maximum length of LOG
|
||||
* @{*/
|
||||
|
||||
#define MAX_LOG_TOTAL 16384 /*!< \brief the maximum length of a log */
|
||||
|
||||
// Fixme: a better place to be shure it is called
|
||||
void read_cpu_hardware (void) __attribute__ ((constructor));
|
||||
#if !defined(__arm__) && !defined(__aarch64__)
|
||||
@@ -110,8 +103,7 @@ static const unsigned int FLAG_FILE_LINE = 1 << 4;
|
||||
static const unsigned int FLAG_TIME = 1 << 5;
|
||||
static const unsigned int FLAG_THREAD_ID = 1 << 6;
|
||||
static const unsigned int FLAG_REAL_TIME = 1 << 7;
|
||||
static const unsigned int FLAG_UTC_TIME = 1 << 8;
|
||||
static const unsigned int FLAG_INITIALIZED = 1 << 9;
|
||||
static const unsigned int FLAG_INITIALIZED = 1 << 8;
|
||||
|
||||
/** @}*/
|
||||
static mapping log_options[] = {{"nocolor", FLAG_NOCOLOR},
|
||||
@@ -122,13 +114,34 @@ static mapping log_options[] = {{"nocolor", FLAG_NOCOLOR},
|
||||
{"time", FLAG_TIME},
|
||||
{"thread_id", FLAG_THREAD_ID},
|
||||
{"wall_clock", FLAG_REAL_TIME},
|
||||
{"utc_time", FLAG_UTC_TIME},
|
||||
{NULL, -1}};
|
||||
mapping * log_option_names_ptr(void)
|
||||
{
|
||||
return log_options;
|
||||
}
|
||||
|
||||
static mapping log_maskmap[] = {{"PRACH", DEBUG_PRACH},
|
||||
{"RU", DEBUG_RU},
|
||||
{"UE_PHYPROC", DEBUG_UE_PHYPROC},
|
||||
{"LTEESTIM", DEBUG_LTEESTIM},
|
||||
{"DLCELLSPEC", DEBUG_DLCELLSPEC},
|
||||
{"ULSCH", DEBUG_ULSCH},
|
||||
{"RRC", DEBUG_RRC},
|
||||
{"PDCP", DEBUG_PDCP},
|
||||
{"DFT", DEBUG_DFT},
|
||||
{"ASN1", DEBUG_ASN1},
|
||||
{"CTRLSOCKET", DEBUG_CTRLSOCKET},
|
||||
{"SECURITY", DEBUG_SECURITY},
|
||||
{"NAS", DEBUG_NAS},
|
||||
{"RLC", DEBUG_RLC},
|
||||
{"DLSCH_DECOD", DEBUG_DLSCH_DECOD},
|
||||
{"UE_TIMING", UE_TIMING},
|
||||
{NULL, -1}};
|
||||
mapping * log_maskmap_ptr(void)
|
||||
{
|
||||
return log_maskmap;
|
||||
}
|
||||
|
||||
/* .log_format = 0x13 uncolored standard messages
|
||||
* .log_format = 0x93 colored standard messages */
|
||||
/* keep white space in first position; switching it to 0 allows colors to be disabled*/
|
||||
@@ -314,9 +327,6 @@ int write_file_matlab(const char *fname, const char *vname, void *data, int leng
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define FLAG_SETDEBUG(flag) g_log->debug_mask.DEBUG_##flag = *logparams_debug[i++].uptr;
|
||||
#define FLAG_SETDUMP(flag) g_log->dump_mask.DEBUG_##flag = *logparams_dump[i++].uptr;
|
||||
|
||||
/* get log parameters from configuration file */
|
||||
void log_getconfig(log_t *g_log)
|
||||
{
|
||||
@@ -325,6 +335,8 @@ void log_getconfig(log_t *g_log)
|
||||
paramdef_t logparams_defaults[] = LOG_GLOBALPARAMS_DESC;
|
||||
paramdef_t logparams_level[MAX_LOG_PREDEF_COMPONENTS];
|
||||
paramdef_t logparams_logfile[MAX_LOG_PREDEF_COMPONENTS];
|
||||
paramdef_t logparams_debug[sizeofArray(log_maskmap)];
|
||||
paramdef_t logparams_dump[sizeofArray(log_maskmap)];
|
||||
int ret = config_get(config_get_if(), logparams_defaults, sizeofArray(logparams_defaults), CONFIG_STRING_LOG_PREFIX);
|
||||
|
||||
if (ret <0) {
|
||||
@@ -392,45 +404,37 @@ void log_getconfig(log_t *g_log)
|
||||
}
|
||||
|
||||
/* build then read the debug and dump parameter array */
|
||||
int sz = 0;
|
||||
for (const char *const *ptr = flag_name; strlen(*ptr) > 1; ptr++)
|
||||
sz++;
|
||||
paramdef_t logparams_debug[sz];
|
||||
paramdef_t logparams_dump[sz];
|
||||
for (int i = 0; i < sz; i++) {
|
||||
logparams_debug[i] = (paramdef_t){
|
||||
.type = TYPE_UINT,
|
||||
.paramflags = PARAMFLAG_BOOL,
|
||||
};
|
||||
sprintf(logparams_debug[i].optname, LOG_CONFIG_DEBUG_FORMAT, flag_name[i]);
|
||||
logparams_dump[i] = (paramdef_t){.type = TYPE_UINT, .paramflags = PARAMFLAG_BOOL};
|
||||
sprintf(logparams_dump[i].optname, LOG_CONFIG_DUMP_FORMAT, flag_name[i]);
|
||||
for (int i=0; log_maskmap[i].name != NULL ; i++) {
|
||||
sprintf(logparams_debug[i].optname, LOG_CONFIG_DEBUG_FORMAT, log_maskmap[i].name);
|
||||
sprintf(logparams_dump[i].optname, LOG_CONFIG_DUMP_FORMAT, log_maskmap[i].name);
|
||||
logparams_debug[i].defuintval = 0;
|
||||
logparams_debug[i].type = TYPE_UINT;
|
||||
logparams_debug[i].paramflags = PARAMFLAG_BOOL;
|
||||
logparams_debug[i].uptr = NULL;
|
||||
logparams_debug[i].chkPptr = NULL;
|
||||
logparams_debug[i].numelt = 0;
|
||||
logparams_dump[i].defuintval = 0;
|
||||
logparams_dump[i].type = TYPE_UINT;
|
||||
logparams_dump[i].paramflags = PARAMFLAG_BOOL;
|
||||
logparams_dump[i].uptr = NULL;
|
||||
logparams_dump[i].chkPptr = NULL;
|
||||
logparams_dump[i].numelt = 0;
|
||||
}
|
||||
|
||||
config_get(config_get_if(), logparams_debug, sz, CONFIG_STRING_LOG_PREFIX);
|
||||
config_get(config_get_if(), logparams_dump, sz, CONFIG_STRING_LOG_PREFIX);
|
||||
config_get(config_get_if(), logparams_debug, sizeofArray(log_maskmap) - 1, CONFIG_STRING_LOG_PREFIX);
|
||||
config_get(config_get_if(), logparams_dump, sizeofArray(log_maskmap) - 1, CONFIG_STRING_LOG_PREFIX);
|
||||
|
||||
bool old = CONFIG_ISFLAGSET(CONFIG_NOABORTONCHKF);
|
||||
CONFIG_SETRTFLAG(CONFIG_NOABORTONCHKF);
|
||||
if (config_check_unknown_cmdlineopt(config_get_if(), CONFIG_STRING_LOG_PREFIX) > 0) {
|
||||
printf("Existing log_config options:\n");
|
||||
printf(" Boolean options:\n");
|
||||
for (int i = 0; i < sz; i++)
|
||||
printf(" %s, \t%s\n", logparams_debug[i].optname, logparams_dump[i].optname);
|
||||
printf(" Log level per module (");
|
||||
for (int i = 0; log_level_names[i].name != NULL; i++)
|
||||
printf("%s ", log_level_names[i].name);
|
||||
printf(")\n");
|
||||
for (int i = 0; i < MAX_LOG_PREDEF_COMPONENTS; i++)
|
||||
printf(" %s\n", logparams_level[i].optname);
|
||||
if (config_check_unknown_cmdlineopt(config_get_if(), CONFIG_STRING_LOG_PREFIX) > 0)
|
||||
exit(1);
|
||||
|
||||
/* set the debug mask according to the debug parameters values */
|
||||
for (int i=0; log_maskmap[i].name != NULL ; i++) {
|
||||
if (*(logparams_debug[i].uptr) )
|
||||
g_log->debug_mask = g_log->debug_mask | log_maskmap[i].value;
|
||||
|
||||
if (*(logparams_dump[i].uptr) )
|
||||
g_log->dump_mask = g_log->dump_mask | log_maskmap[i].value;
|
||||
}
|
||||
if (!old)
|
||||
CONFIG_CLEARRTFLAG(CONFIG_NOABORTONCHKF);
|
||||
int i = 0;
|
||||
FOREACH_FLAG(FLAG_SETDEBUG);
|
||||
i = 0;
|
||||
FOREACH_FLAG(FLAG_SETDUMP);
|
||||
|
||||
/* log globally enabled/disabled */
|
||||
set_glog_onlinelog(consolelog);
|
||||
@@ -509,8 +513,8 @@ int logInit (void)
|
||||
memset(&(g_log->log_component[i]),0,sizeof(log_component_t));
|
||||
}
|
||||
|
||||
AssertFatal(__builtin_popcount(g_log->flag & (FLAG_TIME | FLAG_REAL_TIME | FLAG_UTC_TIME)) <= 1,
|
||||
"Invalid log options: time, wall_clock and utc_time are mutually exclusive\n");
|
||||
AssertFatal(!((g_log->flag & FLAG_TIME) && (g_log->flag & FLAG_REAL_TIME)),
|
||||
"Invalid log options: time and wall_clock both set but are mutually exclusive\n");
|
||||
|
||||
g_log->flag = g_log->flag | FLAG_INITIALIZED;
|
||||
return 0;
|
||||
@@ -554,24 +558,15 @@ static inline int log_header(log_component_t *c,
|
||||
l[0] = 0;
|
||||
|
||||
// output time information
|
||||
char timeString[64];
|
||||
if ((flag & FLAG_TIME) || (flag & FLAG_REAL_TIME) || (flag & FLAG_UTC_TIME)) {
|
||||
char timeString[32];
|
||||
if ((flag & FLAG_TIME) || (flag & FLAG_REAL_TIME)) {
|
||||
struct timespec t;
|
||||
const clockid_t clock = flag & FLAG_TIME ? CLOCK_MONOTONIC : CLOCK_REALTIME;
|
||||
if (clock_gettime(clock, &t) == -1)
|
||||
abort();
|
||||
if (flag & FLAG_UTC_TIME) {
|
||||
struct tm utc_time;
|
||||
if (gmtime_r(&t.tv_sec, &utc_time) == NULL)
|
||||
abort();
|
||||
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 ",
|
||||
t.tv_sec,
|
||||
t.tv_nsec / 1000);
|
||||
}
|
||||
snprintf(timeString, sizeof(timeString), "%lu.%06lu ",
|
||||
t.tv_sec,
|
||||
t.tv_nsec / 1000);
|
||||
} else {
|
||||
timeString[0] = 0;
|
||||
}
|
||||
@@ -884,32 +879,31 @@ static void log_output_memory(log_component_t *c, const char *file, const char *
|
||||
* correctly. It was not a big problem because in practice MAX_LOG_TOTAL is
|
||||
* big enough so that the buffer is never full.
|
||||
*/
|
||||
static_assert(4 * MAX_LOG_TOTAL <= 65536, "log buffer limited to 64kB, please reduce MAX_LOG_TOTAL\n");
|
||||
char log_buffer[4 * MAX_LOG_TOTAL];
|
||||
char log_buffer[MAX_LOG_TOTAL];
|
||||
|
||||
// make sure that for log trace the extra info is only printed once, reset when the level changes
|
||||
if (level < OAILOG_TRACE) {
|
||||
int n = log_header(c, log_buffer+len, sizeof(log_buffer), file, func, line, level);
|
||||
int n = log_header(c, log_buffer+len, MAX_LOG_TOTAL, file, func, line, level);
|
||||
if (n > 0) {
|
||||
len += n;
|
||||
if (len > sizeof(log_buffer)) {
|
||||
len = sizeof(log_buffer);
|
||||
if (len > MAX_LOG_TOTAL) {
|
||||
len = MAX_LOG_TOTAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
int n = vsnprintf(log_buffer+len, sizeof(log_buffer)-len, format, args);
|
||||
int n = vsnprintf(log_buffer+len, MAX_LOG_TOTAL-len, format, args);
|
||||
if (n > 0) {
|
||||
len += n;
|
||||
if (len > sizeof(log_buffer)) {
|
||||
len = sizeof(log_buffer);
|
||||
if (len > MAX_LOG_TOTAL) {
|
||||
len = MAX_LOG_TOTAL;
|
||||
}
|
||||
}
|
||||
if (!((g_log->flag) & FLAG_NOCOLOR)) {
|
||||
int n = snprintf(log_buffer+len, sizeof(log_buffer)-len, "%s", log_level_highlight_end[level]);
|
||||
int n = snprintf(log_buffer+len, MAX_LOG_TOTAL-len, "%s", log_level_highlight_end[level]);
|
||||
if (n > 0) {
|
||||
len += n;
|
||||
if (len > sizeof(log_buffer)) {
|
||||
len = sizeof(log_buffer);
|
||||
if (len > MAX_LOG_TOTAL) {
|
||||
len = MAX_LOG_TOTAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -949,7 +943,7 @@ static void log_output_memory(log_component_t *c, const char *file, const char *
|
||||
}
|
||||
}
|
||||
}else{
|
||||
AssertFatal(len >= 0 && len <= sizeof(log_buffer), "Bad len %d\n", len);
|
||||
AssertFatal(len >= 0 && len <= MAX_LOG_TOTAL, "Bad len %d\n", len);
|
||||
if (write(fileno(c->stream), log_buffer, len)) {};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,6 +65,12 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** @defgroup _max_length Maximum Length of LOG
|
||||
* @ingroup _macro
|
||||
* @brief the macros that describe the maximum length of LOG
|
||||
* @{*/
|
||||
|
||||
#define MAX_LOG_TOTAL 16384 /*!< \brief the maximum length of a log */
|
||||
/** @}*/
|
||||
|
||||
/** @defgroup _log_level Message levels defined by LOG
|
||||
@@ -82,7 +88,7 @@ extern "C" {
|
||||
#define NUM_LOG_LEVEL 6 /*!< \brief the number of message levels users have with LOG (OAILOG_DISABLE is not available to user as a level, so it is not included)*/
|
||||
/** @}*/
|
||||
|
||||
#define SET_LOG_OPTION(O) g_log->flag = (g_log->flag | O)
|
||||
#define SET_LOG_OPTION(O) g_log->flag = (g_log->flag | O)
|
||||
#define CLEAR_LOG_OPTION(O) g_log->flag = (g_log->flag & (~O))
|
||||
|
||||
/** @defgroup macros to identify a debug entity
|
||||
@@ -93,37 +99,28 @@ extern "C" {
|
||||
* server.
|
||||
* @brief
|
||||
* @{*/
|
||||
#define DEBUG_PRACH (1<<0)
|
||||
#define DEBUG_RU (1<<1)
|
||||
#define DEBUG_UE_PHYPROC (1<<2)
|
||||
#define DEBUG_LTEESTIM (1<<3)
|
||||
#define DEBUG_DLCELLSPEC (1<<4)
|
||||
#define DEBUG_ULSCH (1<<5)
|
||||
#define DEBUG_RRC (1<<6)
|
||||
#define DEBUG_PDCP (1<<7)
|
||||
#define DEBUG_DFT (1<<8)
|
||||
#define DEBUG_ASN1 (1<<9)
|
||||
#define DEBUG_CTRLSOCKET (1<<10)
|
||||
#define DEBUG_SECURITY (1<<11)
|
||||
#define DEBUG_NAS (1<<12)
|
||||
#define DEBUG_RLC (1<<13)
|
||||
#define DEBUG_DLSCH_DECOD (1<<14)
|
||||
#define UE_TIMING (1<<20)
|
||||
|
||||
#define FOREACH_FLAG(FLAG_DEF) \
|
||||
FLAG_DEF(PRACH) \
|
||||
FLAG_DEF(UE_PHYPROC) \
|
||||
FLAG_DEF(LTEESTIM) \
|
||||
FLAG_DEF(DLCELLSPEC) \
|
||||
FLAG_DEF(ULSCH) \
|
||||
FLAG_DEF(RRC) \
|
||||
FLAG_DEF(PDCP) \
|
||||
FLAG_DEF(DFT) \
|
||||
FLAG_DEF(ASN1) \
|
||||
FLAG_DEF(CTRLSOCKET) \
|
||||
FLAG_DEF(SECURITY) \
|
||||
FLAG_DEF(NAS) \
|
||||
FLAG_DEF(DLSCH_DECOD) \
|
||||
FLAG_DEF(UE_TIMING) \
|
||||
FLAG_DEF(F1AP)
|
||||
#define SET_LOG_DEBUG(B) g_log->debug_mask = (g_log->debug_mask | B)
|
||||
#define CLEAR_LOG_DEBUG(B) g_log->debug_mask = (g_log->debug_mask & (~B))
|
||||
|
||||
#define FLAG_BITF(flag) uint64_t DEBUG_##flag: 1;
|
||||
typedef struct {
|
||||
FOREACH_FLAG(FLAG_BITF)
|
||||
} debug_flags_t;
|
||||
|
||||
#define FLAG_TEXT(flag) #flag,
|
||||
static const char *const flag_name[] = {FOREACH_FLAG(FLAG_TEXT) ""};
|
||||
|
||||
#define SET_LOG_DEBUG(B) g_log->debug_mask.B = true
|
||||
#define CLEAR_LOG_DEBUG(B) g_log->debug_mask.B = false
|
||||
|
||||
#define SET_LOG_DUMP(B) g_log->dump_mask.B = true
|
||||
#define CLEAR_LOG_DUMP(B) g_log->dump_mask.B = false
|
||||
#define SET_LOG_DUMP(B) g_log->dump_mask = (g_log->dump_mask | B)
|
||||
#define CLEAR_LOG_DUMP(B) g_log->dump_mask = (g_log->dump_mask & (~B))
|
||||
|
||||
#define FOREACH_COMP(COMP_DEF) \
|
||||
COMP_DEF(PHY, log) \
|
||||
@@ -218,8 +215,8 @@ typedef struct {
|
||||
char level2string[NUM_LOG_LEVEL];
|
||||
int flag;
|
||||
char *filelog_name;
|
||||
debug_flags_t debug_mask;
|
||||
debug_flags_t dump_mask;
|
||||
uint64_t debug_mask;
|
||||
uint64_t dump_mask;
|
||||
} log_t;
|
||||
|
||||
#ifdef LOG_MAIN
|
||||
@@ -233,28 +230,7 @@ extern "C" {
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#define FLAG_DEBUG_SET(flag) \
|
||||
if (strcmp(name, #flag) == 0) { \
|
||||
g_log->debug_mask.DEBUG_##flag = val; \
|
||||
return true; \
|
||||
};
|
||||
static inline bool set_log_debug(char *name, bool val)
|
||||
{
|
||||
FOREACH_FLAG(FLAG_DEBUG_SET);
|
||||
printf("Error: setting log debug of %s option, not existing\n", name);
|
||||
return false;
|
||||
}
|
||||
#define FLAG_DUMP_SET(flag) \
|
||||
if (strcmp(name, #flag) == 0) { \
|
||||
g_log->dump_mask.DEBUG_##flag = val; \
|
||||
return true; \
|
||||
};
|
||||
static inline bool set_log_dump(char *name, bool val)
|
||||
{
|
||||
FOREACH_FLAG(FLAG_DUMP_SET);
|
||||
printf("Error: setting log dump of %s option, not existing\n", name);
|
||||
return false;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int logInit (void);
|
||||
void logTerm (void);
|
||||
@@ -442,15 +418,15 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
|
||||
/* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */
|
||||
#define LOG_DUMPMSG(c, f, b, s, x...) \
|
||||
do { \
|
||||
if (g_log->dump_mask.f) \
|
||||
if (g_log->dump_mask & f) \
|
||||
log_dump(c, b, s, LOG_DUMP_CHAR, x); \
|
||||
} while (0)
|
||||
|
||||
/* bitmask dependent macros, to isolate debugging code */
|
||||
#define LOG_DEBUGFLAG(D) (g_log->debug_mask.D)
|
||||
#define LOG_DEBUGFLAG(D) (g_log->debug_mask & D)
|
||||
|
||||
/* bitmask dependent macros, to generate debug file such as matlab file or message dump */
|
||||
#define LOG_DUMPFLAG(D) (g_log->dump_mask.D)
|
||||
#define LOG_DUMPFLAG(D) (g_log->dump_mask & D)
|
||||
|
||||
#define LOG_M(file, vector, data, len, dec, format) \
|
||||
do { \
|
||||
@@ -553,11 +529,11 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
|
||||
} while (0)
|
||||
|
||||
#define nfapi_log(FILE, FNC, LN, COMP, LVL, FMT...)
|
||||
#define LOG_DEBUGFLAG(D) (g_log->debug_mask.D)
|
||||
#define LOG_DUMPFLAG(D) (g_log->dump_mask.D)
|
||||
#define LOG_DEBUGFLAG(D) (g_log->debug_mask & D)
|
||||
#define LOG_DUMPFLAG(D) (g_log->dump_mask & D)
|
||||
#define LOG_DUMPMSG(c, f, b, s, x...) \
|
||||
do { \
|
||||
if (g_log->dump_mask.f) \
|
||||
if (g_log->dump_mask & f) \
|
||||
log_dump(c, b, s, LOG_DUMP_CHAR, x); \
|
||||
} while (0) /* */
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ add_custom_target(generate_T DEPENDS T_IDs.h check_vcd)
|
||||
# headers have really been created, we make this headers library explicitly
|
||||
# depend on the generated headers.
|
||||
add_library(T_headers INTERFACE)
|
||||
add_dependencies(T_headers T_IDs.h generate_T)
|
||||
add_dependencies(T_headers T_IDs.h T_messages.txt.h)
|
||||
target_include_directories(T_headers INTERFACE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
if(T_TRACER)
|
||||
|
||||
@@ -31,7 +31,7 @@ CMake Error at /usr/share/cmake-3.16/Modules/FindPkgConfig.cmake:463 (message):
|
||||
Run:
|
||||
|
||||
```shell
|
||||
sudo apt-get install libx11-dev libpng-dev libxft-dev
|
||||
sudo apt-get install libxft-dev
|
||||
```
|
||||
|
||||
## Run the softmodem
|
||||
|
||||
@@ -25,4 +25,4 @@ multi-rru-clean: ../utils.o ../database.o ../event.o ../configuration.o multi-rr
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -f *.o core dump_nack_signal time_meas timeplot multi-rru-clean
|
||||
rm -f *.o core dump_nack_signal time_meas timeplot
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include "utils.h"
|
||||
#include "event.h"
|
||||
#include "database.h"
|
||||
@@ -15,8 +14,7 @@ void usage(void)
|
||||
" -d <database file> this option is mandatory\n"
|
||||
" -ip <host> connect to given IP address (default %s)\n"
|
||||
" -p <port> connect to given port (default %d)\n"
|
||||
" -e <event> event to trace (default VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER)\n"
|
||||
" -s stat mode, print every second min/avg/max + count\n",
|
||||
" -e <event> event to trace (default VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER)\n",
|
||||
DEFAULT_REMOTE_IP,
|
||||
DEFAULT_REMOTE_PORT
|
||||
);
|
||||
@@ -36,21 +34,6 @@ struct timespec time_sub(struct timespec a, struct timespec b)
|
||||
return ret;
|
||||
}
|
||||
|
||||
volatile uint64_t acc, count, acc_min, acc_max;
|
||||
|
||||
void *stat_thread(void *_)
|
||||
{
|
||||
while (1) {
|
||||
uint64_t v = acc;
|
||||
uint64_t c = count;
|
||||
uint64_t min = acc_min;
|
||||
uint64_t max = acc_max;
|
||||
acc = acc_min = acc_max = count = 0;
|
||||
printf("%ld %ld %ld [%ld]\n", min, c==0 ? 0 : v/c, max, c);
|
||||
sleepms(1000);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int n, char **v)
|
||||
{
|
||||
char *database_filename = NULL;
|
||||
@@ -66,7 +49,6 @@ int main(int n, char **v)
|
||||
int start_valid = 0;
|
||||
struct timespec start_time, stop_time, delta_time;
|
||||
char *name = "VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER";
|
||||
int stat_mode = 0;
|
||||
|
||||
for (i = 1; i < n; i++) {
|
||||
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
|
||||
@@ -76,13 +58,9 @@ int main(int n, char **v)
|
||||
if (!strcmp(v[i], "-p"))
|
||||
{ if (i > n-2) usage(); port = atoi(v[++i]); continue; }
|
||||
if (!strcmp(v[i], "-e")) { if (i > n-2) usage(); name = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-s")) { stat_mode = 1; continue; }
|
||||
usage();
|
||||
}
|
||||
|
||||
if (stat_mode)
|
||||
new_thread(stat_thread, NULL);
|
||||
|
||||
if (database_filename == NULL) {
|
||||
printf("ERROR: provide a database file (-d)\n");
|
||||
exit(1);
|
||||
@@ -118,8 +96,7 @@ int main(int n, char **v)
|
||||
if (e.type != ev_fun)
|
||||
{ printf("unhandled event %d\n", e.type); continue; }
|
||||
on_off = e.e[0].i;
|
||||
if (!stat_mode)
|
||||
printf("yo %d\n", on_off);
|
||||
printf("yo %d\n", on_off);
|
||||
if (on_off == 1) {
|
||||
start_time = e.sending_time;
|
||||
start_valid = 1;
|
||||
@@ -127,20 +104,11 @@ int main(int n, char **v)
|
||||
}
|
||||
if (on_off != 0) { printf("fatal!\n"); abort(); }
|
||||
if (!start_valid) continue;
|
||||
start_valid = 0;
|
||||
stop_time = e.sending_time;
|
||||
delta_time = time_sub(stop_time, start_time);
|
||||
if (stat_mode) {
|
||||
uint64_t v = delta_time.tv_sec * 1000000000UL + delta_time.tv_nsec;
|
||||
if (count == 0 || v < acc_min) acc_min = v;
|
||||
if (v > acc_max) acc_max = v;
|
||||
acc += v;
|
||||
count++;
|
||||
} else {
|
||||
fprintf(stderr, "%ld\n",
|
||||
delta_time.tv_sec * 1000000000UL + delta_time.tv_nsec);
|
||||
fflush(stderr);
|
||||
}
|
||||
fprintf(stderr, "%ld\n",
|
||||
delta_time.tv_sec * 1000000000UL + delta_time.tv_nsec);
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
add_library(actor actor.c)
|
||||
# Only include header files due to issues with ODR in threadPool binaries
|
||||
target_include_directories(actor PUBLIC ./ ../threadPool/)
|
||||
target_include_directories(actor PUBLIC ./)
|
||||
target_link_libraries(actor PUBLIC thread-pool)
|
||||
if (ENABLE_TESTS)
|
||||
add_subdirectory(tests)
|
||||
endif()
|
||||
|
||||
@@ -72,17 +72,3 @@ byte_array_t cp_str_to_ba(const char* str)
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
char* cp_ba_to_str(const byte_array_t ba)
|
||||
{
|
||||
assert(ba.len > 0);
|
||||
|
||||
const size_t sz = ba.len;
|
||||
char* str = calloc(sz+1, sizeof(char));
|
||||
assert(str != NULL && "Memory exhausted");
|
||||
|
||||
memcpy(str, ba.buf, sz);
|
||||
str[sz] = '\0';
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
@@ -42,6 +42,5 @@ void free_byte_array(byte_array_t ba);
|
||||
bool eq_byte_array(const byte_array_t* m0, const byte_array_t* m1);
|
||||
|
||||
byte_array_t cp_str_to_ba(const char* str);
|
||||
char* cp_ba_to_str(const byte_array_t ba);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -109,6 +109,8 @@ static const unsigned short srs_bandwidth_config[C_SRS_NUMBER][B_SRS_NUMBER][2]
|
||||
/* 63 */ {{272, 1}, {16, 17}, {8, 2}, {4, 2}},
|
||||
};
|
||||
|
||||
const char *duplex_mode[]={"FDD","TDD"};
|
||||
|
||||
static const uint8_t bit_reverse_table_256[] = {
|
||||
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8,
|
||||
0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
|
||||
@@ -124,36 +126,6 @@ static const uint8_t bit_reverse_table_256[] = {
|
||||
0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
|
||||
0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF};
|
||||
|
||||
simde__m128i byte2bit16_lut[256];
|
||||
void init_byte2bit16(void)
|
||||
{
|
||||
for (int s = 0; s < 256; s++) {
|
||||
byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], s & 1, 0);
|
||||
byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 1) & 1, 1);
|
||||
byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 2) & 1, 2);
|
||||
byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 3) & 1, 3);
|
||||
byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 4) & 1, 4);
|
||||
byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 5) & 1, 5);
|
||||
byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 6) & 1, 6);
|
||||
byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 7) & 1, 7);
|
||||
}
|
||||
}
|
||||
|
||||
simde__m128i byte2m128i[256];
|
||||
void init_byte2m128i(void) {
|
||||
|
||||
for (int s=0;s<256;s++) {
|
||||
byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*(s&1)),0);
|
||||
byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>1)&1)),1);
|
||||
byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>2)&1)),2);
|
||||
byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>3)&1)),3);
|
||||
byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>4)&1)),4);
|
||||
byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>5)&1)),5);
|
||||
byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>6)&1)),6);
|
||||
byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>7)&1)),7);
|
||||
}
|
||||
}
|
||||
|
||||
void reverse_bits_u8(uint8_t const* in, size_t sz, uint8_t* out)
|
||||
{
|
||||
DevAssert(in != NULL);
|
||||
@@ -188,20 +160,18 @@ uint64_t reverse_bits(uint64_t in, int n_bits)
|
||||
return rev_bits;
|
||||
}
|
||||
|
||||
#define NUM_BW_ENTRIES 15
|
||||
|
||||
static const int tables_5_3_2[5][NUM_BW_ENTRIES] = {
|
||||
{25, 52, 79, 106, 133, 160, 188, 216, 242, 270, -1, -1, -1, -1, -1}, // 15 FR1
|
||||
{11, 24, 38, 51, 65, 78, 92, 106, 119, 133, 162, 189, 217, 245, 273}, // 30 FR1
|
||||
{-1, 11, 18, 24, 31, 38, 44, 51, 58, 65, 79, 93, 107, 121, 135}, // 60 FR1
|
||||
{66, 132, 264, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 60 FR2
|
||||
{32, 66, 132, 264, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} // 120FR2
|
||||
static const int tables_5_3_2[5][12] = {
|
||||
{25, 52, 79, 106, 133, 160, 216, 270, -1, -1, -1, -1}, // 15 FR1
|
||||
{11, 24, 38, 51, 65, 78, 106, 133, 162, 217, 245, 273}, // 30 FR1
|
||||
{-1, 11, 18, 24, 31, 38, 51, 65, 79, 107, 121, 135}, // 60 FR1
|
||||
{66, 132, 264, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 60 FR2
|
||||
{32, 66, 132, 264, -1, -1, -1, -1, -1, -1, -1, -1} // 120FR2
|
||||
};
|
||||
|
||||
int get_supported_band_index(int scs, frequency_range_t freq_range, int n_rbs)
|
||||
{
|
||||
int scs_index = scs + freq_range;
|
||||
for (int i = 0; i < NUM_BW_ENTRIES; i++) {
|
||||
for (int i = 0; i < 12; i++) {
|
||||
if(n_rbs == tables_5_3_2[scs_index][i])
|
||||
return i;
|
||||
}
|
||||
@@ -211,7 +181,7 @@ int get_supported_band_index(int scs, frequency_range_t freq_range, int n_rbs)
|
||||
int get_smallest_supported_bandwidth_index(int scs, frequency_range_t frequency_range, int n_rbs)
|
||||
{
|
||||
int scs_index = scs + frequency_range;
|
||||
for (int i = 0; i < NUM_BW_ENTRIES; i++) {
|
||||
for (int i = 0; i < 12; i++) {
|
||||
if (n_rbs <= tables_5_3_2[scs_index][i])
|
||||
return i;
|
||||
}
|
||||
@@ -424,8 +394,10 @@ void check_ssb_raster(uint64_t freq, int band, int scs)
|
||||
int get_supported_bw_mhz(frequency_range_t frequency_range, int bw_index)
|
||||
{
|
||||
if (frequency_range == FR1) {
|
||||
int bandwidth_index_to_mhz[] = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100};
|
||||
AssertFatal(bw_index >= 0 && bw_index <= sizeofArray(bandwidth_index_to_mhz), "Bandwidth index %d is invalid\n", bw_index);
|
||||
int bandwidth_index_to_mhz[] = {5, 10, 15, 20, 25, 30, 40, 50, 60, 80, 90, 100};
|
||||
AssertFatal(bw_index >= 0 && bw_index <= sizeofArray(bandwidth_index_to_mhz),
|
||||
"Bandwidth index %d is invalid\n",
|
||||
bw_index);
|
||||
return bandwidth_index_to_mhz[bw_index];
|
||||
} else {
|
||||
int bandwidth_index_to_mhz[] = {50, 100, 200, 400};
|
||||
@@ -551,18 +523,6 @@ void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) {
|
||||
*n_rb = 6*count;
|
||||
}
|
||||
|
||||
// According to 38.211 7.3.2.2
|
||||
int get_coreset_num_cces(uint8_t *FreqDomainResource, int duration)
|
||||
{
|
||||
int num_rbs;
|
||||
int rb_offset;
|
||||
get_coreset_rballoc(FreqDomainResource, &num_rbs, &rb_offset);
|
||||
int total_resource_element_groups = num_rbs * duration;
|
||||
int reg_per_cce = 6;
|
||||
int total_cces = total_resource_element_groups / reg_per_cce;
|
||||
return total_cces;
|
||||
}
|
||||
|
||||
int get_nb_periods_per_frame(uint8_t tdd_period)
|
||||
{
|
||||
|
||||
@@ -716,22 +676,19 @@ uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t nrarfcn)
|
||||
return frequency;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the slot index within the period
|
||||
*/
|
||||
int get_slot_idx_in_period(const int slot, const frame_structure_t *fs)
|
||||
int get_first_ul_slot(int nrofDownlinkSlots, int nrofDownlinkSymbols, int nrofUplinkSymbols)
|
||||
{
|
||||
return slot % fs->numb_slots_period;
|
||||
return (nrofDownlinkSlots + (nrofDownlinkSymbols != 0 && nrofUplinkSymbols == 0));
|
||||
}
|
||||
|
||||
int get_dmrs_port(int nl, uint16_t dmrs_ports)
|
||||
{
|
||||
if (dmrs_ports == 0)
|
||||
return 0; // dci 1_0
|
||||
|
||||
if (dmrs_ports == 0) return 0; // dci 1_0
|
||||
int p = -1;
|
||||
int found = -1;
|
||||
for (int i = 0; i < 12; i++) { // loop over dmrs ports
|
||||
if((dmrs_ports >> i) & 0x01) { // check if current bit is 1
|
||||
for (int i=0; i<12; i++) { // loop over dmrs ports
|
||||
if((dmrs_ports>>i)&0x01) { // check if current bit is 1
|
||||
found++;
|
||||
if (found == nl) { // found antenna port number corresponding to current layer
|
||||
p = i;
|
||||
@@ -739,7 +696,7 @@ int get_dmrs_port(int nl, uint16_t dmrs_ports)
|
||||
}
|
||||
}
|
||||
}
|
||||
AssertFatal(p > -1, "No dmrs port corresponding to layer %d found\n", nl);
|
||||
AssertFatal(p>-1,"No dmrs port corresponding to layer %d found\n",nl);
|
||||
return p;
|
||||
}
|
||||
|
||||
@@ -747,7 +704,7 @@ frame_type_t get_frame_type(uint16_t current_band, uint8_t scs_index)
|
||||
{
|
||||
int32_t delta_duplex = get_delta_duplex(current_band, scs_index);
|
||||
frame_type_t current_type = delta_duplex == 0 ? TDD : FDD;
|
||||
LOG_D(NR_MAC, "NR band %d, duplex mode %s, duplex spacing = %d KHz\n", current_band, duplex_mode_txt[current_type], delta_duplex);
|
||||
LOG_D(NR_MAC, "NR band %d, duplex mode %s, duplex spacing = %d KHz\n", current_band, duplex_mode[current_type], delta_duplex);
|
||||
return current_type;
|
||||
}
|
||||
|
||||
@@ -838,18 +795,6 @@ void get_samplerate_and_bw(int mu,
|
||||
*rx_bw = 50e6;
|
||||
}
|
||||
break;
|
||||
case 242: // 45Mhz
|
||||
case 188: // 35Mhz
|
||||
if (threequarter_fs) {
|
||||
*sample_rate = 46.08e6;
|
||||
*samples_per_frame = 460800;
|
||||
} else {
|
||||
*sample_rate = 61.44e6;
|
||||
*samples_per_frame = 614400;
|
||||
}
|
||||
*tx_bw = (n_rb == 242) ? 45e6 : 35e6;
|
||||
*rx_bw = (n_rb == 242) ? 45e6 : 35e6;
|
||||
break;
|
||||
case 216:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=46.08e6;
|
||||
@@ -950,17 +895,6 @@ void get_samplerate_and_bw(int mu,
|
||||
*rx_bw = 80e6;
|
||||
}
|
||||
break;
|
||||
case 189:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate = 92.16e6;
|
||||
*samples_per_frame = 921600;
|
||||
} else {
|
||||
*sample_rate = 122.88e6;
|
||||
*samples_per_frame = 1228800;
|
||||
}
|
||||
*tx_bw = 70e6;
|
||||
*rx_bw = 70e6;
|
||||
break;
|
||||
case 162 :
|
||||
if (threequarter_fs) {
|
||||
AssertFatal(1==0,"N_RB %d cannot use 3/4 sampling\n",n_rb);
|
||||
@@ -986,20 +920,6 @@ void get_samplerate_and_bw(int mu,
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 119: // 45Mhz
|
||||
case 92: // 35Mhz
|
||||
if (threequarter_fs) {
|
||||
*sample_rate = 46.08e6;
|
||||
*samples_per_frame = 460800;
|
||||
} else {
|
||||
*sample_rate = 61.44e6;
|
||||
*samples_per_frame = 614400;
|
||||
}
|
||||
*tx_bw = (n_rb == 119) ? 45e6 : 35e6;
|
||||
*rx_bw = (n_rb == 119) ? 45e6 : 35e6;
|
||||
break;
|
||||
|
||||
case 106:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=46.08e6;
|
||||
@@ -1287,58 +1207,6 @@ int get_scan_ssb_first_sc(const double fc, const int nbRB, const int nrBand, con
|
||||
return numGscn;
|
||||
}
|
||||
|
||||
// Table 38.211 6.3.3.1-1
|
||||
static uint8_t long_prach_dur[4] = {1, 3, 4, 1}; // 0.9, 2.28, 3.35, 0.9 ms
|
||||
|
||||
uint8_t get_long_prach_dur(unsigned int format, unsigned int mu)
|
||||
{
|
||||
AssertFatal(format < 4, "Invalid long PRACH format %d\n", format);
|
||||
const int num_slots_subframe = (1 << mu);
|
||||
const int prach_dur_subframes = long_prach_dur[format];
|
||||
return (prach_dur_subframes * num_slots_subframe);
|
||||
}
|
||||
|
||||
// Table 38.211 6.3.3.2-1
|
||||
uint8_t get_PRACH_k_bar(unsigned int delta_f_RA_PRACH, unsigned int delta_f_PUSCH)
|
||||
{
|
||||
uint8_t k_bar = 0;
|
||||
if (delta_f_RA_PRACH > 3) { // Rel 15 max PRACH SCS is 120 kHz, 4 and 5 are 1.25 and 5 kHz
|
||||
// long formats
|
||||
DevAssert(delta_f_PUSCH < 3);
|
||||
DevAssert(delta_f_RA_PRACH < 6);
|
||||
const uint8_t k_bar_table[3][2] = {{7, 12},
|
||||
{1, 10},
|
||||
{133, 7}};
|
||||
|
||||
k_bar = k_bar_table[delta_f_PUSCH][delta_f_RA_PRACH - 4];
|
||||
} else {
|
||||
if (delta_f_RA_PRACH == 3 && delta_f_PUSCH == 4) // \delta f_RA == 120 kHz AND \delta f == 480 kHz
|
||||
k_bar = 1;
|
||||
else if (delta_f_RA_PRACH == 3 && delta_f_PUSCH == 5) // \delta f_RA == 120 kHz AND \delta f == 960 kHz
|
||||
k_bar = 23;
|
||||
else
|
||||
k_bar = 2;
|
||||
}
|
||||
return k_bar;
|
||||
}
|
||||
|
||||
// K according to 38.211 5.3.2
|
||||
unsigned int get_prach_K(int prach_sequence_length, int prach_fmt_id, int pusch_mu, int prach_mu)
|
||||
{
|
||||
unsigned int K = 1;
|
||||
if (prach_sequence_length == 0) {
|
||||
if (prach_fmt_id == 3)
|
||||
K = (15 << pusch_mu) / 5;
|
||||
else
|
||||
K = (15 << pusch_mu) / 1.25;
|
||||
} else if (prach_sequence_length == 1) {
|
||||
K = (15 << pusch_mu) / (15 << prach_mu);
|
||||
} else {
|
||||
AssertFatal(0, "Invalid PRACH sequence length %d\n", prach_sequence_length);
|
||||
}
|
||||
return K;
|
||||
}
|
||||
|
||||
int get_delay_idx(int delay, int max_delay_comp)
|
||||
{
|
||||
int delay_idx = max_delay_comp + delay;
|
||||
@@ -1380,22 +1248,15 @@ int set_default_nta_offset(frequency_range_t freq_range, uint32_t samples_per_su
|
||||
void nr_timer_start(NR_timer_t *timer)
|
||||
{
|
||||
timer->active = true;
|
||||
timer->suspended = false;
|
||||
timer->counter = 0;
|
||||
}
|
||||
|
||||
void nr_timer_stop(NR_timer_t *timer)
|
||||
{
|
||||
timer->active = false;
|
||||
timer->suspended = false;
|
||||
timer->counter = 0;
|
||||
}
|
||||
|
||||
void nr_timer_suspension(NR_timer_t *timer)
|
||||
{
|
||||
timer->suspended = !timer->suspended;
|
||||
}
|
||||
|
||||
bool nr_timer_is_active(const NR_timer_t *timer)
|
||||
{
|
||||
return timer->active;
|
||||
@@ -1406,7 +1267,7 @@ bool nr_timer_tick(NR_timer_t *timer)
|
||||
bool expired = false;
|
||||
if (timer->active) {
|
||||
timer->counter += timer->step;
|
||||
if (timer->target == UINT_MAX || timer->suspended) // infinite target, never expires
|
||||
if (timer->target == UINT_MAX) // infinite target, never expires
|
||||
return false;
|
||||
expired = nr_timer_expired(timer);
|
||||
if (expired)
|
||||
@@ -1417,7 +1278,7 @@ bool nr_timer_tick(NR_timer_t *timer)
|
||||
|
||||
bool nr_timer_expired(const NR_timer_t *timer)
|
||||
{
|
||||
if (timer->target == UINT_MAX || timer->suspended) // infinite target, never expires
|
||||
if (timer->target == UINT_MAX) // infinite target, never expires
|
||||
return false;
|
||||
return timer->counter >= timer->target;
|
||||
}
|
||||
@@ -1441,32 +1302,3 @@ unsigned short get_m_srs(int c_srs, int b_srs) {
|
||||
unsigned short get_N_b_srs(int c_srs, int b_srs) {
|
||||
return srs_bandwidth_config[c_srs][b_srs][1];
|
||||
}
|
||||
|
||||
frequency_range_t get_freq_range_from_freq(uint64_t freq)
|
||||
{
|
||||
// 3GPP TS 38.101-1 Version 19.0.0 Table 5.1-1: Definition of frequency ranges
|
||||
if (freq >= 410000000 && freq <= 7125000000)
|
||||
return FR1;
|
||||
|
||||
if (freq >= 24250000000 && freq <= 71000000000)
|
||||
return FR2;
|
||||
|
||||
AssertFatal(false, "Undefined Frequency Range for frequency %ld Hz\n", freq);
|
||||
}
|
||||
|
||||
frequency_range_t get_freq_range_from_arfcn(uint32_t arfcn)
|
||||
{
|
||||
// 3GPP TS 38.101-1 Version 19.0.0 Table 5.1-1: Definition of frequency ranges
|
||||
if (arfcn >= 82000 && arfcn <= 875000)
|
||||
return FR1;
|
||||
|
||||
if (arfcn >= 2016667 && arfcn <= 2795832)
|
||||
return FR2;
|
||||
|
||||
AssertFatal(false, "Undefined Frequency Range for ARFCN %d\n", arfcn);
|
||||
}
|
||||
|
||||
frequency_range_t get_freq_range_from_band(uint16_t band)
|
||||
{
|
||||
return band <= 256 ? FR1 : FR2;
|
||||
}
|
||||
|
||||
@@ -122,29 +122,6 @@ typedef enum frequency_range_e {
|
||||
FR2
|
||||
} frequency_range_t;
|
||||
|
||||
#define MAX_NUM_SLOTS_ALLOWED 80 // up to numerology 3 (120 KHz SCS) is supported
|
||||
enum slot_type { TDD_NR_DOWNLINK_SLOT, TDD_NR_UPLINK_SLOT, TDD_NR_MIXED_SLOT };
|
||||
|
||||
typedef struct tdd_bitmap {
|
||||
enum slot_type slot_type;
|
||||
uint8_t num_dl_symbols;
|
||||
uint8_t num_ul_symbols;
|
||||
} tdd_bitmap_t;
|
||||
|
||||
typedef struct tdd_period_config_s {
|
||||
tdd_bitmap_t tdd_slot_bitmap[MAX_NUM_SLOTS_ALLOWED];
|
||||
uint8_t num_dl_slots;
|
||||
uint8_t num_ul_slots;
|
||||
} tdd_period_config_t;
|
||||
|
||||
typedef struct frame_structure_s {
|
||||
tdd_period_config_t period_cfg;
|
||||
int8_t numb_slots_frame;
|
||||
int8_t numb_slots_period;
|
||||
int8_t numb_period_frame;
|
||||
frame_type_t frame_type;
|
||||
} frame_structure_t;
|
||||
|
||||
typedef struct {
|
||||
/// Time shift in number of samples estimated based on DMRS-PDSCH/PUSCH
|
||||
int est_delay;
|
||||
@@ -156,7 +133,6 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
bool active;
|
||||
bool suspended;
|
||||
uint32_t counter;
|
||||
uint32_t target;
|
||||
uint32_t step;
|
||||
@@ -172,12 +148,6 @@ void nr_timer_start(NR_timer_t *timer);
|
||||
* @param timer Timer to stopped
|
||||
*/
|
||||
void nr_timer_stop(NR_timer_t *timer);
|
||||
/**
|
||||
* @brief To suspend/resume a timer
|
||||
* @param timer Timer to be stopped/suspended
|
||||
*/
|
||||
void nr_timer_suspension(NR_timer_t *timer);
|
||||
|
||||
/**
|
||||
* @brief If active, it increases timer counter by an amout of units equal to step. It stops timer if expired
|
||||
* @param timer Timer to be handled
|
||||
@@ -211,15 +181,7 @@ bool nr_timer_is_active(const NR_timer_t *timer);
|
||||
uint32_t nr_timer_elapsed_time(const NR_timer_t *timer);
|
||||
|
||||
int set_default_nta_offset(frequency_range_t freq_range, uint32_t samples_per_subframe);
|
||||
|
||||
extern simde__m128i byte2bit16_lut[256];
|
||||
void init_byte2bit16(void);
|
||||
void init_byte2m128i(void);
|
||||
|
||||
static inline simde__m128i byte2bit16(uint8_t b)
|
||||
{
|
||||
return byte2bit16_lut[b];
|
||||
}
|
||||
extern const nr_bandentry_t nr_bandtable[];
|
||||
|
||||
static inline int get_num_dmrs(uint16_t dmrs_mask )
|
||||
{
|
||||
@@ -248,10 +210,10 @@ void reverse_bits_u8(uint8_t const* in, size_t sz, uint8_t* out);
|
||||
uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t dl_nrarfcn);
|
||||
uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint8_t scs_index, uint32_t bw);
|
||||
|
||||
int get_first_ul_slot(int nrofDownlinkSlots, int nrofDownlinkSymbols, int nrofUplinkSymbols);
|
||||
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(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);
|
||||
@@ -293,20 +255,12 @@ void check_ssb_raster(uint64_t freq, int band, int scs);
|
||||
int get_smallest_supported_bandwidth_index(int scs, frequency_range_t frequency_range, int n_rbs);
|
||||
unsigned short get_m_srs(int c_srs, int b_srs);
|
||||
unsigned short get_N_b_srs(int c_srs, int b_srs);
|
||||
uint8_t get_long_prach_dur(unsigned int format, unsigned int num_slots_subframe);
|
||||
uint8_t get_PRACH_k_bar(unsigned int delta_f_RA_PRACH, unsigned int delta_f_PUSCH);
|
||||
unsigned int get_prach_K(int prach_sequence_length, int prach_fmt_id, int pusch_mu, int prach_mu);
|
||||
|
||||
int get_slot_idx_in_period(const int slot, const frame_structure_t *fs);
|
||||
|
||||
frequency_range_t get_freq_range_from_freq(uint64_t freq);
|
||||
frequency_range_t get_freq_range_from_arfcn(uint32_t arfcn);
|
||||
frequency_range_t get_freq_range_from_band(uint16_t band);
|
||||
|
||||
#define CEILIDIV(a,b) ((a+b-1)/b)
|
||||
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
|
||||
|
||||
static const char *const duplex_mode_txt[] = {"FDD", "TDD"};
|
||||
// Align up to a multiple of 16
|
||||
#define ALIGN_UP_16(a) ((a + 15) & ~15)
|
||||
|
||||
#ifdef __cplusplus
|
||||
#ifdef min
|
||||
|
||||
@@ -78,10 +78,6 @@
|
||||
// Prints an error if ID not found in list.
|
||||
#define RELEASE_IE_FROMLIST(SOURCE, TARGET, FIELD) \
|
||||
do { \
|
||||
if (!TARGET) { \
|
||||
LOG_E(NR_MAC, "Target list not present, impossible to release element\n"); \
|
||||
break; \
|
||||
} \
|
||||
for (int iI = 0; iI < SOURCE->list.count; iI++) { \
|
||||
long eL = *SOURCE->list.array[iI]; \
|
||||
int iJ; \
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
add_library(shm_td_iq_channel shm_td_iq_channel.c)
|
||||
target_include_directories(shm_td_iq_channel PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
if (ENABLE_TESTS)
|
||||
add_subdirectory(tests)
|
||||
endif()
|
||||
@@ -1,286 +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
|
||||
*/
|
||||
|
||||
#include "shm_td_iq_channel.h"
|
||||
#include <stdio.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include "assertions.h"
|
||||
#include "utils.h"
|
||||
#include "common/utils/threadPool/pthread_utils.h"
|
||||
|
||||
#define CIRCULAR_BUFFER_SIZE (30720 * 14 * 20)
|
||||
|
||||
typedef struct {
|
||||
int magic;
|
||||
int num_antennas_tx;
|
||||
int num_antennas_rx;
|
||||
uint64_t timestamp;
|
||||
bool is_connected;
|
||||
pthread_mutex_t mutex;
|
||||
pthread_cond_t cond;
|
||||
} ShmTDIQChannelData;
|
||||
|
||||
typedef struct ShmTDIQChannel_s {
|
||||
IQChannelType type;
|
||||
ShmTDIQChannelData *data;
|
||||
uint64_t last_timestamp;
|
||||
char name[256];
|
||||
sample_t *tx_iq_data;
|
||||
sample_t *rx_iq_data;
|
||||
} ShmTDIQChannel;
|
||||
|
||||
ShmTDIQChannel *shm_td_iq_channel_create(const char *name, int num_tx_ant, int num_rx_ant)
|
||||
{
|
||||
// Create shared memory segment
|
||||
int fd = shm_open(name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
|
||||
AssertFatal(fd != -1, "shm_open failed: %s\n", strerror(errno));
|
||||
size_t tx_buffer_size = CIRCULAR_BUFFER_SIZE * sizeof(sample_t) * num_tx_ant;
|
||||
size_t rx_buffer_size = CIRCULAR_BUFFER_SIZE * sizeof(sample_t) * num_rx_ant;
|
||||
size_t total_size = sizeof(ShmTDIQChannelData) + tx_buffer_size + rx_buffer_size;
|
||||
|
||||
// Set the size of the shared memory segment
|
||||
int res = ftruncate(fd, total_size);
|
||||
AssertFatal(res != -1, "ftruncate failed: %s\n", strerror(errno));
|
||||
|
||||
// Map shared memory segment to address space
|
||||
ShmTDIQChannelData *shm_ptr = mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
AssertFatal(shm_ptr != MAP_FAILED, "mmap failed: %s\n", strerror(errno));
|
||||
|
||||
// Initialize shared memory
|
||||
memset(shm_ptr, 0, total_size);
|
||||
shm_ptr->num_antennas_tx = num_tx_ant;
|
||||
shm_ptr->num_antennas_rx = num_rx_ant;
|
||||
shm_ptr->is_connected = false;
|
||||
ShmTDIQChannel *channel = calloc_or_fail(1, sizeof(ShmTDIQChannel));
|
||||
strncpy(channel->name, name, sizeof(channel->name) - 1);
|
||||
channel->tx_iq_data = (sample_t *)(shm_ptr + 1);
|
||||
channel->rx_iq_data = channel->tx_iq_data + tx_buffer_size / sizeof(sample_t);
|
||||
channel->data = shm_ptr;
|
||||
channel->type = IQ_CHANNEL_TYPE_SERVER;
|
||||
channel->last_timestamp = 0;
|
||||
pthread_mutexattr_t mutex_attr;
|
||||
pthread_condattr_t cond_attr;
|
||||
int ret = pthread_mutexattr_init(&mutex_attr);
|
||||
AssertFatal(ret == 0, "pthread_mutexattr_init() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
|
||||
ret = pthread_condattr_init(&cond_attr);
|
||||
AssertFatal(ret == 0, "pthread_condattr_init() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
|
||||
ret = pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
|
||||
AssertFatal(ret == 0, "pthread_mutexattr_setpshared() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
|
||||
ret = pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);
|
||||
AssertFatal(ret == 0, "pthread_condattr_setpshared() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
|
||||
ret = pthread_mutex_init(&shm_ptr->mutex, &mutex_attr);
|
||||
AssertFatal(ret == 0, "pthread_mutex_init() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
|
||||
ret = pthread_cond_init(&shm_ptr->cond, &cond_attr);
|
||||
AssertFatal(ret == 0, "pthread_cond_init() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
|
||||
shm_ptr->magic = SHM_MAGIC_NUMBER;
|
||||
close(fd);
|
||||
return channel;
|
||||
}
|
||||
|
||||
ShmTDIQChannel *shm_td_iq_channel_connect(const char *name, int timeout_in_seconds)
|
||||
{
|
||||
// Create shared memory segment
|
||||
int fd = -1;
|
||||
while (timeout_in_seconds > 0 && fd == -1) {
|
||||
fd = shm_open(name, O_RDWR, S_IRUSR | S_IWUSR);
|
||||
timeout_in_seconds--;
|
||||
printf("Waiting for server to create shared memory segment\n");
|
||||
sleep(1);
|
||||
}
|
||||
AssertFatal(fd != -1, "shm_open() failed: errno %d, %s", errno, strerror(errno));
|
||||
|
||||
struct stat buf;
|
||||
fstat(fd, &buf);
|
||||
size_t total_size = buf.st_size;
|
||||
|
||||
// Map shared memory segment to address space
|
||||
ShmTDIQChannelData *shm_ptr = mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
if (shm_ptr == MAP_FAILED) {
|
||||
perror("mmap");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
ShmTDIQChannel *channel = calloc_or_fail(1, sizeof(ShmTDIQChannel));
|
||||
channel->data = shm_ptr;
|
||||
channel->tx_iq_data = (sample_t *)(shm_ptr + 1);
|
||||
size_t tx_buffer_size = CIRCULAR_BUFFER_SIZE * sizeof(sample_t) * channel->data->num_antennas_tx;
|
||||
channel->rx_iq_data = channel->tx_iq_data + tx_buffer_size / sizeof(sample_t);
|
||||
channel->type = IQ_CHANNEL_TYPE_CLIENT;
|
||||
channel->last_timestamp = 0;
|
||||
while (shm_ptr->magic != SHM_MAGIC_NUMBER) {
|
||||
printf("Waiting for server to initialize shared memory\n");
|
||||
sleep(1);
|
||||
}
|
||||
shm_ptr->is_connected = true;
|
||||
close(fd);
|
||||
return channel;
|
||||
}
|
||||
|
||||
IQChannelErrorType shm_td_iq_channel_tx(ShmTDIQChannel *channel,
|
||||
uint64_t timestamp,
|
||||
uint64_t num_samples,
|
||||
int antenna,
|
||||
const sample_t *tx_iq_data)
|
||||
{
|
||||
ShmTDIQChannelData *data = channel->data;
|
||||
if (data->is_connected == false) {
|
||||
return CHANNEL_ERROR_NOT_CONNECTED;
|
||||
}
|
||||
// timestamp in the past
|
||||
uint64_t current_time = data->timestamp;
|
||||
if (timestamp < current_time) {
|
||||
return CHANNEL_ERROR_TOO_LATE;
|
||||
}
|
||||
// timestamp is too far in the future
|
||||
if (timestamp - current_time + num_samples >= CIRCULAR_BUFFER_SIZE) {
|
||||
return CHANNEL_ERROR_TOO_EARLY;
|
||||
}
|
||||
|
||||
sample_t *base_ptr;
|
||||
if (channel->type == IQ_CHANNEL_TYPE_CLIENT) {
|
||||
base_ptr = channel->rx_iq_data + antenna * CIRCULAR_BUFFER_SIZE;
|
||||
} else {
|
||||
base_ptr = channel->tx_iq_data + antenna * CIRCULAR_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
uint64_t first_sample = timestamp % CIRCULAR_BUFFER_SIZE;
|
||||
uint64_t last_sample = first_sample + num_samples - 1;
|
||||
if (last_sample >= CIRCULAR_BUFFER_SIZE) {
|
||||
size_t num_samples_first_copy = CIRCULAR_BUFFER_SIZE - first_sample;
|
||||
memcpy(base_ptr + first_sample, tx_iq_data, num_samples_first_copy * sizeof(sample_t));
|
||||
memcpy(base_ptr, tx_iq_data + num_samples_first_copy, (num_samples - num_samples_first_copy) * sizeof(sample_t));
|
||||
} else {
|
||||
memcpy(base_ptr + first_sample, tx_iq_data, num_samples * sizeof(sample_t));
|
||||
}
|
||||
return CHANNEL_NO_ERROR;
|
||||
}
|
||||
|
||||
IQChannelErrorType shm_td_iq_channel_rx(ShmTDIQChannel *channel,
|
||||
uint64_t timestamp,
|
||||
uint64_t num_samples,
|
||||
int antenna,
|
||||
sample_t *tx_iq_data)
|
||||
{
|
||||
ShmTDIQChannelData *data = channel->data;
|
||||
if (data->is_connected == false) {
|
||||
return CHANNEL_ERROR_NOT_CONNECTED;
|
||||
}
|
||||
// timestamp in the future
|
||||
uint64_t current_time = data->timestamp;
|
||||
if (timestamp > current_time) {
|
||||
return CHANNEL_ERROR_TOO_EARLY;
|
||||
}
|
||||
// timestamp is too far in the past
|
||||
if (current_time - timestamp >= CIRCULAR_BUFFER_SIZE) {
|
||||
return CHANNEL_ERROR_TOO_LATE;
|
||||
}
|
||||
|
||||
sample_t *base_ptr;
|
||||
if (channel->type == IQ_CHANNEL_TYPE_CLIENT) {
|
||||
base_ptr = channel->tx_iq_data + antenna * CIRCULAR_BUFFER_SIZE;
|
||||
} else {
|
||||
base_ptr = channel->rx_iq_data + antenna * CIRCULAR_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
uint64_t first_sample = timestamp % CIRCULAR_BUFFER_SIZE;
|
||||
uint64_t last_sample = first_sample + num_samples - 1;
|
||||
if (last_sample >= CIRCULAR_BUFFER_SIZE) {
|
||||
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));
|
||||
} else {
|
||||
memcpy(tx_iq_data, base_ptr + first_sample, num_samples * sizeof(sample_t));
|
||||
}
|
||||
return CHANNEL_NO_ERROR;
|
||||
}
|
||||
|
||||
void shm_td_iq_channel_produce_samples(ShmTDIQChannel *channel, size_t num_samples)
|
||||
{
|
||||
ShmTDIQChannelData *data = channel->data;
|
||||
if (channel->type != IQ_CHANNEL_TYPE_SERVER) {
|
||||
return;
|
||||
}
|
||||
if (data->is_connected == false) {
|
||||
return;
|
||||
}
|
||||
mutexlock(data->mutex);
|
||||
data->timestamp += num_samples;
|
||||
condbroadcast(data->cond);
|
||||
mutexunlock(data->mutex);
|
||||
}
|
||||
|
||||
void shm_td_iq_channel_wait(ShmTDIQChannel *channel, uint64_t timestamp)
|
||||
{
|
||||
ShmTDIQChannelData *data = channel->data;
|
||||
if (data->is_connected == false) {
|
||||
abort();
|
||||
return;
|
||||
}
|
||||
|
||||
size_t current_timestamp = data->timestamp;
|
||||
if (current_timestamp >= timestamp) {
|
||||
return;
|
||||
}
|
||||
mutexlock(data->mutex);
|
||||
while (current_timestamp < timestamp) {
|
||||
condwait(data->cond, data->mutex);
|
||||
current_timestamp = data->timestamp;
|
||||
}
|
||||
mutexunlock(data->mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
uint64_t shm_td_iq_channel_get_current_sample(const ShmTDIQChannel *channel)
|
||||
{
|
||||
ShmTDIQChannelData *data = channel->data;
|
||||
return data->timestamp;
|
||||
}
|
||||
|
||||
bool shm_td_iq_channel_is_connected(const ShmTDIQChannel *channel)
|
||||
{
|
||||
return channel->data->is_connected;
|
||||
}
|
||||
|
||||
void shm_td_iq_channel_destroy(ShmTDIQChannel *channel)
|
||||
{
|
||||
ShmTDIQChannelData *data = channel->data;
|
||||
size_t tx_buffer_size = CIRCULAR_BUFFER_SIZE * sizeof(sample_t) * data->num_antennas_tx;
|
||||
size_t rx_buffer_size = CIRCULAR_BUFFER_SIZE * sizeof(sample_t) * data->num_antennas_rx;
|
||||
size_t total_size = sizeof(ShmTDIQChannelData) + tx_buffer_size + rx_buffer_size;
|
||||
munmap(data, total_size);
|
||||
if (channel->type == IQ_CHANNEL_TYPE_SERVER) {
|
||||
shm_unlink(channel->name);
|
||||
}
|
||||
free(channel);
|
||||
}
|
||||
@@ -1,148 +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
|
||||
*/
|
||||
#ifndef SHM_IQ_CHANNEL_H
|
||||
#define SHM_IQ_CHANNEL_H
|
||||
|
||||
#include "../threadPool/pthread_utils.h"
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <semaphore.h>
|
||||
|
||||
#define SHM_MAGIC_NUMBER 0x12345678
|
||||
|
||||
/**
|
||||
* ShmTdIqChannel is a shared memory bidirectional time domain IQ channel with a single clock
|
||||
* source. The server (clock source) shall create the channel while the client should connect to
|
||||
* it.
|
||||
*
|
||||
* To write samples, send them via a pointer passed to shm_td_iq_channel_tx.
|
||||
* To read samples, receive them via a pointer passed to shm_td_iq_channel_rx. You can either wait until
|
||||
* the sample are available using shm_td_iq_channel_wait or poll using shm_td_iq_channel_rx until the return
|
||||
* value is not CHANNEL_ERROR_TOO_EARLY.
|
||||
* To indicate that samples are ready to be read by the client, call shm_td_iq_channel_produce_samples
|
||||
* (server only).
|
||||
*
|
||||
* The timestamps used in the API are in absolute samples from the time the client/server connection started.
|
||||
*/
|
||||
|
||||
typedef enum IQChannelType { IQ_CHANNEL_TYPE_SERVER, IQ_CHANNEL_TYPE_CLIENT } IQChannelType;
|
||||
typedef uint32_t sample_t;
|
||||
typedef enum IQChannelErrorType {
|
||||
CHANNEL_NO_ERROR,
|
||||
CHANNEL_ERROR_TOO_LATE,
|
||||
CHANNEL_ERROR_TOO_EARLY,
|
||||
CHANNEL_ERROR_NOT_CONNECTED
|
||||
} IQChannelErrorType;
|
||||
|
||||
typedef struct ShmTDIQChannel_s ShmTDIQChannel;
|
||||
|
||||
/**
|
||||
* @brief Creates a shared memory IQ channel.
|
||||
*
|
||||
* @param name The name of the shared memory segment.
|
||||
* @param num_tx_ant The number of TX antennas.
|
||||
* @param num_rx_ant The number of RX antennas.
|
||||
* @return A pointer to the created ShmTDIQChannel structure.
|
||||
*/
|
||||
ShmTDIQChannel *shm_td_iq_channel_create(const char *name, int num_tx_ant, int num_rx_ant);
|
||||
|
||||
/**
|
||||
* @brief Connects to an existing shared memory IQ channel.
|
||||
*
|
||||
* @param name The name of the shared memory segment.
|
||||
* @param timeout_in_seconds The timeout in seconds for the connection attempt.
|
||||
* @return A pointer to the connected ShmTDIQChannel structure.
|
||||
*/
|
||||
ShmTDIQChannel *shm_td_iq_channel_connect(const char *name, int timeout_in_seconds);
|
||||
|
||||
/**
|
||||
* @brief Transmit data in the channel
|
||||
*
|
||||
* @param channel The ShmTDIQChannel structure.
|
||||
* @param timestamp The timestamp for which to get the TX IQ data slot.
|
||||
* @param num_samples The number of samples to write.
|
||||
* @param antenna The antenna index.
|
||||
* @param tx_iq_data The TX IQ data to write.
|
||||
*
|
||||
* @return CHANNEL_NO_ERROR if successful, error type otherwise
|
||||
*/
|
||||
IQChannelErrorType shm_td_iq_channel_tx(ShmTDIQChannel *channel,
|
||||
uint64_t timestamp,
|
||||
uint64_t num_samples,
|
||||
int antenna,
|
||||
const sample_t *tx_iq_data);
|
||||
|
||||
/**
|
||||
* @brief Receive iq data from the channel
|
||||
*
|
||||
* @param channel The ShmTDIQChannel structure.
|
||||
* @param timestamp The timestamp for which to get the RX IQ data slot.
|
||||
* @param num_samples The number of samples to read.
|
||||
* @param antenna The antenna index.
|
||||
* @param tx_iq_data pointer to the RX IQ data slot.
|
||||
* @return CHANNEL_NO_ERROR if successful, error type otherwise
|
||||
*/
|
||||
IQChannelErrorType shm_td_iq_channel_rx(ShmTDIQChannel *channel,
|
||||
uint64_t timestamp,
|
||||
uint64_t num_samples,
|
||||
int antenna,
|
||||
sample_t *tx_iq_data);
|
||||
|
||||
/**
|
||||
* @brief Advances the time in the channel by specified number of samples
|
||||
*
|
||||
* @param channel The ShmTDIQChannel structure.
|
||||
* @param num_symbols The number of samples to produce.
|
||||
*/
|
||||
void shm_td_iq_channel_produce_samples(ShmTDIQChannel *channel, uint64_t num_samples);
|
||||
|
||||
/**
|
||||
* @brief Wait until sample at the specified timestamp is available
|
||||
*
|
||||
* @param channel The ShmTDIQChannel structure.
|
||||
*/
|
||||
void shm_td_iq_channel_wait(ShmTDIQChannel *channel, uint64_t timestamp);
|
||||
|
||||
/**
|
||||
* @brief Checks if the IQ channel is connected.
|
||||
*
|
||||
* @param channel The ShmTDIQChannel structure.
|
||||
* @return True if the channel is connected, false otherwise.
|
||||
*/
|
||||
bool shm_td_iq_channel_is_connected(const ShmTDIQChannel *channel);
|
||||
|
||||
/**
|
||||
* @brief Destroys the shared memory IQ channel.
|
||||
*
|
||||
* @param channel The ShmTDIQChannel structure.
|
||||
*/
|
||||
void shm_td_iq_channel_destroy(ShmTDIQChannel *channel);
|
||||
|
||||
/**
|
||||
* @brief Returns current sample
|
||||
*
|
||||
* @param channel The ShmTDIQChannel structure.
|
||||
*
|
||||
* @return Current time as sample count since beginning of transmission
|
||||
*/
|
||||
uint64_t shm_td_iq_channel_get_current_sample(const ShmTDIQChannel *channel);
|
||||
|
||||
#endif
|
||||
@@ -1,5 +0,0 @@
|
||||
add_executable(test_shm_td_iq_channel test_shm_td_iq_channel.c)
|
||||
target_link_libraries(test_shm_td_iq_channel shm_td_iq_channel minimal_lib pthread)
|
||||
add_dependencies(tests test_shm_td_iq_channel)
|
||||
# Commented out due to issues with ASAN in the unit test docker container
|
||||
#add_test(test_shm_td_iq_channel ./test_shm_td_iq_channel)
|
||||
@@ -1,169 +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
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
#include <errno.h>
|
||||
#include "assertions.h"
|
||||
|
||||
#define SHM_CHANNEL_NAME "shm_iq_channel_test_file"
|
||||
#include "shm_td_iq_channel.h"
|
||||
|
||||
void server(void);
|
||||
int client(void);
|
||||
|
||||
enum { MODE_SERVER, MODE_CLIENT, MODE_FORK };
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int mode = MODE_FORK;
|
||||
if (argc == 2) {
|
||||
if (strcmp(argv[1], "server") == 0) {
|
||||
mode = MODE_SERVER;
|
||||
} else if (strcmp(argv[1], "client") == 0) {
|
||||
mode = MODE_CLIENT;
|
||||
}
|
||||
} else if (argc > 2) {
|
||||
printf("Usage: %s [server|client]\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
switch (mode) {
|
||||
case MODE_SERVER:
|
||||
server();
|
||||
break;
|
||||
case MODE_CLIENT:
|
||||
return client();
|
||||
break;
|
||||
case MODE_FORK: {
|
||||
char file[256];
|
||||
snprintf(file, sizeof(file), "/dev/shm/%s", SHM_CHANNEL_NAME);
|
||||
remove(file);
|
||||
int pid = fork();
|
||||
if (pid == 0) {
|
||||
server();
|
||||
} else {
|
||||
return client();
|
||||
}
|
||||
} break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const int num_updates = 50;
|
||||
const int num_samples_per_update = 30720;
|
||||
void *produce_symbols(void *arg)
|
||||
{
|
||||
ShmTDIQChannel *channel = (ShmTDIQChannel *)arg;
|
||||
for (int i = 0; i < num_updates; i++) {
|
||||
shm_td_iq_channel_produce_samples(channel, num_samples_per_update);
|
||||
usleep(20000);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void server(void)
|
||||
{
|
||||
int num_ant_tx = 1;
|
||||
int num_ant_rx = 1;
|
||||
ShmTDIQChannel *channel = shm_td_iq_channel_create(SHM_CHANNEL_NAME, num_ant_tx, num_ant_rx);
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (shm_td_iq_channel_is_connected(channel)) {
|
||||
printf("Server connected\n");
|
||||
break;
|
||||
}
|
||||
printf("Waiting for client\n");
|
||||
sleep(1);
|
||||
}
|
||||
AssertFatal(shm_td_iq_channel_is_connected(channel), "Server failed to connect\n");
|
||||
|
||||
pthread_t producer_thread;
|
||||
int ret = pthread_create(&producer_thread, NULL, produce_symbols, channel);
|
||||
AssertFatal(ret == 0, "pthread_create() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
|
||||
uint64_t timestamp = 0;
|
||||
int iq_contents = 0;
|
||||
while (timestamp < num_samples_per_update * num_updates) {
|
||||
shm_td_iq_channel_wait(channel, timestamp + num_samples_per_update);
|
||||
uint64_t target_timestamp = timestamp + num_samples_per_update;
|
||||
timestamp += num_samples_per_update;
|
||||
uint32_t iq_data[num_samples_per_update];
|
||||
for (int i = 0; i < num_samples_per_update; i++) {
|
||||
iq_data[i] = iq_contents;
|
||||
}
|
||||
int result = shm_td_iq_channel_tx(channel, target_timestamp, num_samples_per_update, 0, iq_data);
|
||||
AssertFatal(result == CHANNEL_NO_ERROR, "Failed to write data\n");
|
||||
iq_contents++;
|
||||
}
|
||||
|
||||
printf("Finished writing data\n");
|
||||
|
||||
ret = pthread_join(producer_thread, NULL);
|
||||
AssertFatal(ret == 0, "pthread_join() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
shm_td_iq_channel_destroy(channel);
|
||||
}
|
||||
|
||||
int client(void)
|
||||
{
|
||||
int total_errors = 0;
|
||||
ShmTDIQChannel *channel = shm_td_iq_channel_connect(SHM_CHANNEL_NAME, 10);
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (shm_td_iq_channel_is_connected(channel)) {
|
||||
printf("Client connected\n");
|
||||
break;
|
||||
}
|
||||
printf("Waiting for server\n");
|
||||
sleep(1);
|
||||
}
|
||||
AssertFatal(shm_td_iq_channel_is_connected(channel), "Client failed to connect\n");
|
||||
|
||||
uint64_t timestamp = 0;
|
||||
int iq_contents = 0;
|
||||
|
||||
while (timestamp < num_samples_per_update * num_updates) {
|
||||
shm_td_iq_channel_wait(channel, timestamp + num_samples_per_update);
|
||||
// Server starts producing from second slot
|
||||
if (timestamp > num_samples_per_update) {
|
||||
uint64_t target_timestamp = timestamp - num_samples_per_update;
|
||||
uint32_t iq_data[num_samples_per_update];
|
||||
int result = shm_td_iq_channel_rx(channel, target_timestamp, num_samples_per_update, 0, iq_data);
|
||||
AssertFatal(result == CHANNEL_NO_ERROR, "Failed to read data\n");
|
||||
int num_errors = 0;
|
||||
for (int i = 0; i < num_samples_per_update; i++) {
|
||||
if (iq_data[i] != iq_contents) {
|
||||
num_errors++;
|
||||
}
|
||||
}
|
||||
if (num_errors) {
|
||||
printf("Found %d errors, value = %d, reference = %d\n", num_errors, iq_data[0], iq_contents);
|
||||
total_errors += num_errors;
|
||||
}
|
||||
iq_contents++;
|
||||
}
|
||||
timestamp += num_samples_per_update;
|
||||
}
|
||||
|
||||
printf("Finished reading data\n");
|
||||
shm_td_iq_channel_destroy(channel);
|
||||
return total_errors;
|
||||
}
|
||||
@@ -94,20 +94,11 @@ int force_RRC_IDLE(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** @brief Trigger RA with Msg3 C-RNTI */
|
||||
int force_crnti_ra(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||
trigger_MAC_UE_RA(mac, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Telnet shell command definitions */
|
||||
static telnetshell_cmddef_t cicmds[] = {
|
||||
{"sync_state", "[UE_ID(int,opt)]", get_sync_state},
|
||||
{"force_rlf", "", force_rlf},
|
||||
{"force_RRC_IDLE", "", force_RRC_IDLE},
|
||||
{"force_crnti_ra", "", force_crnti_ra},
|
||||
{"", "", NULL},
|
||||
};
|
||||
|
||||
|
||||
@@ -251,17 +251,12 @@ void print_threads(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
proccmd_get_threaddata(buf, debug, prnt, NULL);
|
||||
}
|
||||
|
||||
#define FLAG_PRINT_DEBUG_DUMP(flag) \
|
||||
logsdata->lines[i].val[0] = (char *)flag_name[i]; \
|
||||
logsdata->lines[i].val[1] = g_log->debug_mask.DEBUG_##flag ? "true" : "false"; \
|
||||
logsdata->lines[i].val[1] = g_log->dump_mask.DEBUG_##flag ? "true" : "false"; \
|
||||
i++;
|
||||
|
||||
int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfunc_t prnt)
|
||||
{
|
||||
webdatadef_t *logsdata = (webdatadef_t *)data;
|
||||
const mapping *const log_level_names = log_level_names_ptr();
|
||||
const mapping *const log_options = log_option_names_ptr();
|
||||
const mapping *log_maskmap = log_maskmap_ptr();
|
||||
if (strncmp(cmdbuff, "set", 3) == 0) {
|
||||
telnet_printfunc_t printfunc = (prnt != NULL) ? prnt : (telnet_printfunc_t)printf;
|
||||
if (strcasestr(cmdbuff, "loglvl") != NULL) {
|
||||
@@ -296,16 +291,23 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
|
||||
}
|
||||
}
|
||||
if (strcasestr(cmdbuff, "dbgopt") != NULL) {
|
||||
if (strcmp(logsdata->lines[0].val[1], "true") == 0)
|
||||
if (!set_log_debug(logsdata->lines[0].val[0], strcmp(logsdata->lines[0].val[2], "true") == 0))
|
||||
printfunc("debug option %s unknown\n", logsdata->lines[0].val[0]);
|
||||
if (strcmp(logsdata->lines[0].val[2], "true") == 0)
|
||||
if (!set_log_dump(logsdata->lines[0].val[0], strcmp(logsdata->lines[0].val[2], "true") == 0))
|
||||
printfunc("debug option %s unknown\n", logsdata->lines[0].val[0]);
|
||||
printfunc("%s debug %s dump %s\n",
|
||||
logsdata->lines[0].val[0],
|
||||
(strcmp(logsdata->lines[0].val[1], "true") == 0) ? "enabled" : "disabled",
|
||||
(strcmp(logsdata->lines[0].val[2], "true") == 0) ? "enabled" : "disabled");
|
||||
int optbit = map_str_to_int(log_maskmap, logsdata->lines[0].val[0]);
|
||||
if (optbit < 0) {
|
||||
printfunc("debug option %s unknown\n", logsdata->lines[0].val[0]);
|
||||
} else {
|
||||
if (strcmp(logsdata->lines[0].val[1], "true") == 0)
|
||||
SET_LOG_DEBUG(optbit);
|
||||
else
|
||||
CLEAR_LOG_DEBUG(optbit);
|
||||
if (strcmp(logsdata->lines[0].val[2], "true") == 0)
|
||||
SET_LOG_DUMP(optbit);
|
||||
else
|
||||
CLEAR_LOG_DUMP(optbit);
|
||||
printfunc("%s debug %s dump %s\n",
|
||||
logsdata->lines[0].val[0],
|
||||
(strcmp(logsdata->lines[0].val[1], "true") == 0) ? "enabled" : "disabled",
|
||||
(strcmp(logsdata->lines[0].val[2], "true") == 0) ? "enabled" : "disabled");
|
||||
}
|
||||
}
|
||||
if (strcasestr(cmdbuff, "threadsched") != NULL) {
|
||||
unsigned int tid = strtoll(logsdata->lines[0].val[0], NULL, 0);
|
||||
@@ -352,9 +354,12 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
|
||||
snprintf(logsdata->columns[2].coltitle, TELNET_CMD_MAXSIZE, "dump");
|
||||
logsdata->columns[2].coltype = TELNET_CHECKVAL_BOOL;
|
||||
|
||||
int i = 0;
|
||||
FOREACH_FLAG(FLAG_PRINT_DEBUG_DUMP);
|
||||
logsdata->numlines += i;
|
||||
for (int i = 0; log_maskmap[i].name != NULL; i++) {
|
||||
logsdata->numlines++;
|
||||
logsdata->lines[i].val[0] = (char *)log_maskmap[i].name;
|
||||
logsdata->lines[i].val[1] = (g_log->debug_mask & log_maskmap[i].value) ? "true" : "false";
|
||||
logsdata->lines[i].val[2] = (g_log->dump_mask & log_maskmap[i].value) ? "true" : "false";
|
||||
}
|
||||
}
|
||||
|
||||
if (strcasestr(cmdbuff, "logopt") != NULL) {
|
||||
@@ -380,14 +385,6 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define FLAG_PRINT2_DEBUG_DUMP(flag) \
|
||||
prnt("%02i %17.17s %5.5s %5.5s\n", \
|
||||
i, \
|
||||
flag_name[i], \
|
||||
g_log->debug_mask.DEBUG_##flag ? "Y" : "N", \
|
||||
g_log->dump_mask.DEBUG_##flag ? "Y" : "N"); \
|
||||
i++;
|
||||
|
||||
int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
if (buf == NULL) {
|
||||
@@ -425,8 +422,12 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
}
|
||||
if (strcasestr(buf,"dbgopt") != NULL) {
|
||||
prnt("\n module debug dumpfile\n");
|
||||
int i = 0;
|
||||
FOREACH_FLAG(FLAG_PRINT2_DEBUG_DUMP);
|
||||
const mapping *log_maskmap = log_maskmap_ptr();
|
||||
for (int i=0; log_maskmap[i].name != NULL ; i++) {
|
||||
prnt("%02i %17.17s %5.5s %5.5s\n",i ,log_maskmap[i].name,
|
||||
((g_log->debug_mask & log_maskmap[i].value)?"Y":"N"),
|
||||
((g_log->dump_mask & log_maskmap[i].value)?"Y":"N") );
|
||||
}
|
||||
}
|
||||
if (strcasestr(buf,"config") != NULL) {
|
||||
prnt("Command line arguments:\n");
|
||||
@@ -592,16 +593,28 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
|
||||
}
|
||||
}
|
||||
else if (l == 2 && strcmp(logparam,"debug") == 0){
|
||||
int ret = set_log_debug(opt, idx1 > 0);
|
||||
if (!ret)
|
||||
optbit = map_str_to_int(log_maskmap, opt);
|
||||
if (optbit < 0) {
|
||||
prnt("module %s unknown\n", opt);
|
||||
proccmd_show("dbgopt", debug, prnt);
|
||||
} else {
|
||||
if (idx1 > 0)
|
||||
SET_LOG_DEBUG(optbit);
|
||||
else
|
||||
CLEAR_LOG_DEBUG(optbit);
|
||||
proccmd_show("dbgopt", debug, prnt);
|
||||
}
|
||||
}
|
||||
else if (l == 2 && strcmp(logparam,"dump") == 0){
|
||||
int ret = set_log_dump(opt, idx1 > 0);
|
||||
if (!ret)
|
||||
optbit = map_str_to_int(log_maskmap, opt);
|
||||
if (optbit < 0) {
|
||||
prnt("module %s unknown\n", opt);
|
||||
proccmd_show("dump", debug, prnt);
|
||||
} else {
|
||||
if (idx1 > 0)
|
||||
SET_LOG_DUMP(optbit);
|
||||
else
|
||||
CLEAR_LOG_DUMP(optbit);
|
||||
proccmd_show("dump", debug, prnt);
|
||||
}
|
||||
}
|
||||
if (logparam != NULL) free(logparam);
|
||||
if (opt != NULL) free(opt);
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#define NOTIFIED_FIFO_H
|
||||
#include "pthread_utils.h"
|
||||
#include <stdint.h>
|
||||
#include <malloc.h>
|
||||
#include <pthread.h>
|
||||
#include "time_meas.h"
|
||||
#include <memory.h>
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
int nas_sock_fd[MAX_MOBILES_PER_ENB * 2]; // Allocated for both LTE UE and NR UE.
|
||||
int nas_sock_mbms_fd;
|
||||
|
||||
static int tun_alloc(const char *dev)
|
||||
static int tun_alloc(char *dev)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
int fd, err;
|
||||
@@ -55,27 +55,25 @@ static int tun_alloc(const char *dev)
|
||||
* IFF_NO_PI - Do not provide packet information
|
||||
*/
|
||||
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
|
||||
strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name) - 1);
|
||||
|
||||
if (*dev)
|
||||
strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name) - 1);
|
||||
|
||||
if ((err = ioctl(fd, TUNSETIFF, (void *)&ifr)) < 0) {
|
||||
close(fd);
|
||||
return err;
|
||||
}
|
||||
// According to https://www.kernel.org/doc/Documentation/networking/tuntap.txt, TUNSETIFF performs string
|
||||
// formatting on ifr_name. To ensure that the generated name is what we expect, check it here.
|
||||
AssertFatal(strcmp(ifr.ifr_name, dev) == 0, "Failed to create tun interface, expected ifname %s, got %s\n", dev, ifr.ifr_name);
|
||||
|
||||
err = fcntl(fd, F_SETFL, O_NONBLOCK);
|
||||
if (err == -1) {
|
||||
close(fd);
|
||||
LOG_E(UTIL, "Error fcntl (%d:%s)\n", errno, strerror(errno));
|
||||
return err;
|
||||
}
|
||||
|
||||
strcpy(dev, ifr.ifr_name);
|
||||
return fd;
|
||||
}
|
||||
|
||||
int tun_init_mbms(char *ifname)
|
||||
int tun_init_mbms(char *ifprefix, int id)
|
||||
{
|
||||
int ret;
|
||||
char ifname[64];
|
||||
|
||||
sprintf(ifname, "%s%d", ifprefix, id);
|
||||
nas_sock_mbms_fd = tun_alloc(ifname);
|
||||
|
||||
if (nas_sock_mbms_fd == -1) {
|
||||
@@ -84,26 +82,48 @@ int tun_init_mbms(char *ifname)
|
||||
}
|
||||
|
||||
LOG_D(UTIL, "Opened socket %s with fd %d\n", ifname, nas_sock_mbms_fd);
|
||||
ret = fcntl(nas_sock_mbms_fd, F_SETFL, O_NONBLOCK);
|
||||
|
||||
if (ret == -1) {
|
||||
LOG_E(UTIL, "Error fcntl (%d:%s)\n", errno, strerror(errno));
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct sockaddr_nl nas_src_addr = {0};
|
||||
nas_src_addr.nl_family = AF_NETLINK;
|
||||
nas_src_addr.nl_pid = 1;
|
||||
nas_src_addr.nl_groups = 0; /* not in mcast groups */
|
||||
bind(nas_sock_mbms_fd, (struct sockaddr *)&nas_src_addr, sizeof(nas_src_addr));
|
||||
ret = bind(nas_sock_mbms_fd, (struct sockaddr *)&nas_src_addr, sizeof(nas_src_addr));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int tun_init(const char *ifname, int instance_id)
|
||||
int tun_init(const char *ifprefix, int num_if, int id)
|
||||
{
|
||||
nas_sock_fd[instance_id] = tun_alloc(ifname);
|
||||
int ret;
|
||||
char ifname[64];
|
||||
|
||||
if (nas_sock_fd[instance_id] == -1) {
|
||||
LOG_E(UTIL, "Error opening socket %s (%d:%s)\n", ifname, errno, strerror(errno));
|
||||
return 0;
|
||||
int begx = (id == 0) ? 0 : id - 1;
|
||||
int endx = (id == 0) ? num_if : id;
|
||||
for (int i = begx; i < endx; i++) {
|
||||
sprintf(ifname, "%s%d", ifprefix, i + 1);
|
||||
nas_sock_fd[i] = tun_alloc(ifname);
|
||||
|
||||
if (nas_sock_fd[i] == -1) {
|
||||
LOG_E(UTIL, "Error opening socket %s (%d:%s)\n", ifname, errno, strerror(errno));
|
||||
return 0;
|
||||
}
|
||||
|
||||
LOG_I(UTIL, "Opened socket %s with fd nas_sock_fd[%d]=%d\n", ifname, i, nas_sock_fd[i]);
|
||||
ret = fcntl(nas_sock_fd[i], F_SETFL, O_NONBLOCK);
|
||||
|
||||
if (ret == -1) {
|
||||
LOG_E(UTIL, "Error fcntl (%d:%s)\n", errno, strerror(errno));
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
LOG_I(UTIL, "Opened socket %s with fd nas_sock_fd[%d]=%d\n", ifname, instance_id, nas_sock_fd[instance_id]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -189,8 +209,12 @@ fail_interface_state:
|
||||
return false;
|
||||
}
|
||||
|
||||
bool tun_config(const char* ifname, const char *ipv4, const char *ipv6)
|
||||
// non blocking full configuration of the interface (address, and the two lest octets of the address)
|
||||
bool tun_config(int interface_id, const char *ipv4, const char *ipv6, const char *ifpref)
|
||||
{
|
||||
char interfaceName[IFNAMSIZ];
|
||||
snprintf(interfaceName, sizeof(interfaceName), "%s%d", ifpref, interface_id);
|
||||
|
||||
AssertFatal(ipv4 != NULL || ipv6 != NULL, "need to have IP address, but none given\n");
|
||||
|
||||
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
@@ -199,16 +223,13 @@ bool tun_config(const char* ifname, const char *ipv4, const char *ipv6)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!change_interface_state(sock_fd, ifname, INTERFACE_DOWN)) {
|
||||
close(sock_fd);
|
||||
return false;
|
||||
}
|
||||
change_interface_state(sock_fd, interfaceName, INTERFACE_DOWN);
|
||||
bool success = true;
|
||||
if (ipv4 != NULL)
|
||||
success = setInterfaceParameter(sock_fd, ifname, AF_INET, ipv4, SIOCSIFADDR);
|
||||
success = setInterfaceParameter(sock_fd, interfaceName, AF_INET, ipv4, SIOCSIFADDR);
|
||||
// set the machine network mask for IPv4
|
||||
if (success && ipv4 != NULL)
|
||||
success = setInterfaceParameter(sock_fd, ifname, AF_INET, "255.255.255.0", SIOCSIFNETMASK);
|
||||
success = setInterfaceParameter(sock_fd, interfaceName, AF_INET, "255.255.255.0", SIOCSIFNETMASK);
|
||||
|
||||
if (ipv6 != NULL) {
|
||||
// for setting the IPv6 address, we need an IPv6 socket. For setting IPv4,
|
||||
@@ -219,25 +240,27 @@ bool tun_config(const char* ifname, const char *ipv4, const char *ipv6)
|
||||
LOG_E(UTIL, "Failed creating socket for interface management: %d, %s\n", errno, strerror(errno));
|
||||
success = false;
|
||||
}
|
||||
success = success && setInterfaceParameter(sock_fd, ifname, AF_INET6, ipv6, SIOCSIFADDR);
|
||||
success = success && setInterfaceParameter(sock_fd, interfaceName, AF_INET6, ipv6, SIOCSIFADDR);
|
||||
close(sock_fd);
|
||||
}
|
||||
|
||||
if (success)
|
||||
success = change_interface_state(sock_fd, ifname, INTERFACE_UP);
|
||||
success = change_interface_state(sock_fd, interfaceName, INTERFACE_UP);
|
||||
|
||||
if (success)
|
||||
LOG_I(OIP, "Interface %s successfully configured, IPv4 %s, IPv6 %s\n", ifname, ipv4, ipv6);
|
||||
LOG_I(OIP, "Interface %s successfully configured, IPv4 %s, IPv6 %s\n", interfaceName, ipv4, ipv6);
|
||||
else
|
||||
LOG_E(OIP, "Interface %s couldn't be configured (IPv4 %s, IPv6 %s)\n", ifname, ipv4, ipv6);
|
||||
LOG_E(OIP, "Interface %s couldn't be configured (IPv4 %s, IPv6 %s)\n", interfaceName, ipv4, ipv6);
|
||||
|
||||
close(sock_fd);
|
||||
return success;
|
||||
}
|
||||
|
||||
void setup_ue_ipv4_route(const char* ifname, int instance_id, const char *ipv4)
|
||||
void setup_ue_ipv4_route(int interface_id, const char *ipv4, const char *ifpref)
|
||||
{
|
||||
int table_id = instance_id - 1 + 10000;
|
||||
int table_id = interface_id - 1 + 10000;
|
||||
char interfaceName[IFNAMSIZ];
|
||||
snprintf(interfaceName, sizeof(interfaceName), "%s%d", ifpref, interface_id);
|
||||
|
||||
char command_line[500];
|
||||
int res = sprintf(command_line,
|
||||
@@ -248,7 +271,7 @@ void setup_ue_ipv4_route(const char* ifname, int instance_id, const char *ipv4)
|
||||
table_id,
|
||||
ipv4,
|
||||
table_id,
|
||||
ifname,
|
||||
interfaceName,
|
||||
table_id);
|
||||
|
||||
if (res < 0) {
|
||||
@@ -258,7 +281,3 @@ void setup_ue_ipv4_route(const char* ifname, int instance_id, const char *ipv4)
|
||||
background_system(command_line);
|
||||
}
|
||||
|
||||
int tun_generate_ifname(char *ifname, const char *ifprefix, int instance_id)
|
||||
{
|
||||
return snprintf(ifname, IFNAMSIZ, "%s%d", ifprefix, instance_id + 1);
|
||||
}
|
||||
|
||||
@@ -23,43 +23,28 @@
|
||||
#define TUN_IF_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <net/if.h>
|
||||
|
||||
/*!
|
||||
* \brief This function generates the name of the interface based on the prefix and
|
||||
* the instance id.
|
||||
*
|
||||
* \param[in,out] ifname name of the interface
|
||||
* \param[in] ifprefix prefix of the interface
|
||||
* \param[in] instance_id unique instance number
|
||||
*/
|
||||
int tun_generate_ifname(char *ifname, const char *ifprefix, int instance_id);
|
||||
/* TODO: doc */
|
||||
int tun_init(const char *ifprefix, int num_if, int id);
|
||||
|
||||
/*!
|
||||
* \brief This function initializes the TUN interface
|
||||
* \param[in] ifname name of the interface
|
||||
* \param[in] instance_id unique instance number, used to save socket file descriptor
|
||||
*/
|
||||
int tun_init(const char *ifname, int instance_id);
|
||||
/* TODO: doc */
|
||||
int tun_init_mbms(char *ifsuffix, int id);
|
||||
|
||||
/*!
|
||||
* \brief This function initializes the TUN interface for MBMS
|
||||
* \param[in] ifname name of the interface
|
||||
*/
|
||||
int tun_init_mbms(char *ifname);
|
||||
|
||||
/*!
|
||||
/*! \fn int tun_config(char*, int, int)
|
||||
* \brief This function initializes the nasmesh interface using the basic values,
|
||||
* basic address, network mask and broadcast address, as the default configured
|
||||
* ones
|
||||
* \param[in] ifname name of the interface
|
||||
* \param[in] interface_id number of this interface, prepended after interface
|
||||
* name
|
||||
* \param[in] ipv4 IPv4 address of this interface as a string
|
||||
* \param[in] ipv6 IPv6 address of this interface as a string
|
||||
* \param[in] ifprefix interface name prefix to which an interface number will
|
||||
* be appended
|
||||
* \return true on success, otherwise false
|
||||
* \note
|
||||
* @ingroup _nas
|
||||
*/
|
||||
bool tun_config(const char* ifname, const char *ipv4, const char *ipv6);
|
||||
bool tun_config(int interface_id, const char *ipv4, const char *ipv6, const char *ifprefix);
|
||||
|
||||
/*!
|
||||
* \brief Setup a IPv4 rule in table (interface_id - 1 + 10000) and route to
|
||||
@@ -67,10 +52,12 @@ bool tun_config(const char* ifname, const char *ipv4, const char *ipv6);
|
||||
* net.ipv4.conf.all.rp_filter=2 (strict source filtering would filter out
|
||||
* responses of packets going out through interface to another IP address not
|
||||
* in same subnet).
|
||||
* \param[in] ifname name of the interface
|
||||
* \param[in] instance_id unique instance number, used to create the table
|
||||
* \param[in] interface_id number of this interface, prepended after interface
|
||||
* name
|
||||
* \param[in] ipv4 IPv4 address of the UE
|
||||
* \param[in] ifprefix interface name prefix to which an interface number will
|
||||
* be appended
|
||||
*/
|
||||
void setup_ue_ipv4_route(const char* ifname, int instance_id, const char *ipv4);
|
||||
void setup_ue_ipv4_route(int interface_id, const char *ipv4, const char *ifpref);
|
||||
|
||||
#endif /*TUN_IF_H_*/
|
||||
|
||||
45
doc/Doxyfile
45
doc/Doxyfile
@@ -997,6 +997,7 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../executables/softmodem-common.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../executables/nr-softmodem.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../executables/nr-gnb.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../executables/rt_profiling.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../executables/nr-uesoftmodem.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../executables/nr-uesoftmodem.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../executables/lte-softmodem.h \
|
||||
@@ -1133,7 +1134,7 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/UICC/usim_interface.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/ocp-gtpu/gtp_itf.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/NR_UE/nr_nas_msg.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/NR_UE/nr_nas_msg.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/NR_UE/nr_nas_msgc \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/UE/nas_itti_messaging.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/UE/user_defs.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/UE/EMM/emm_proc.h \
|
||||
@@ -1274,10 +1275,12 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/emm_msg.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AttachReject.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/FGSDeregistrationRequestUEOriginating.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AttachComplete.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/FGSNASSecurityModeComplete.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h \
|
||||
@@ -1287,6 +1290,7 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AttachReject.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AttachAccept.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/ServiceReject.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/FGSIdentityResponse.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AttachComplete.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AttachRequest.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c \
|
||||
@@ -1298,14 +1302,17 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AttachAccept.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/RegistrationComplete.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/RegistrationAccept.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/RegistrationRequest.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/DetachAccept.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AttachRequest.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/FGSIdentityResponse.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/EmmStatus.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/FGSAuthenticationResponse.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h \
|
||||
@@ -1315,14 +1322,13 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/FGSNASSecurityModeComplete.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/RegistrationComplete.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/FGSDeregistrationRequestUEOriginating.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/emm_cause.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/EmmInformation.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/FGSUplinkNasTransport.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/NR_UE/5GS/5GMM/MSG \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/NR_UE/5GS/5GMM/IES \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/NR_UE/5GS/5GSM \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/NR_UE/5GS/5GSM/MSG \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/EMM/MSG/RegistrationRequest.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/UTIL/parser.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/UTIL/device.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/UTIL/device.c \
|
||||
@@ -1348,6 +1354,7 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/AuthenticationParameterRand.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ProtocolDiscriminator.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ExtendedProtocolDiscriminator.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/CsfbResponse.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EsmCause.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h \
|
||||
@@ -1361,6 +1368,7 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/TransactionIdentifier.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ExtendedProtocolDiscriminator.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/GutiType.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/SupportedCodecList.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/MobileStationClassmark3.c \
|
||||
@@ -1384,10 +1392,12 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/UeSecurityCapability.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ImeisvRequest.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/SpareHalfOctet.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/PdnType.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ShortMac.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/MobileStationClassmark3.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/TrafficFlowTemplate.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/SORTransparentContainer.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/NasPagingIdentity.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/NasMessageContainer.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/Cli.h \
|
||||
@@ -1397,15 +1407,18 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/DetachType.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EmergencyNumberList.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EsmMessageContainer.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGSRegistrationResult.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/GprsTimer.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/TmsiStatus.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/IdentityType2.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsQualityOfService.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/LocationAreaIdentification.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGCNasMessageContainer.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/MsNetworkCapability.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ShortMac.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGSRegistrationResult.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/TrackingAreaIdentity.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EmmCause.h \
|
||||
@@ -1420,10 +1433,12 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/PdnAddress.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/SpareHalfOctet.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/LocationAreaIdentification.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/QualityOfService.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/NrUESecurityCapability.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/SsCode.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsQualityOfService.h \
|
||||
@@ -1433,10 +1448,12 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsMobileIdentity.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/MobileIdentity.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/SsCode.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGSRegistrationType.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/TrackingAreaIdentity.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsBearerIdentity.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/NasMessageContainer.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/DetachType.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGMMCapability.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/TmsiStatus.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/MobileStationClassmark2.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/MessageType.c \
|
||||
@@ -1450,10 +1467,13 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/AdditionalUpdateType.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/NasRequestType.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsBearerContextStatus.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGSMobileIdentity.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/LcsClientIdentity.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGSMobileIdentity.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/ServiceType.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/PagingIdentity.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/UeNetworkCapability.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/NrUESecurityCapability.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/PdnAddress.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsUpdateType.h \
|
||||
@@ -1461,6 +1481,7 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/PTmsiSignature.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/PacketFlowIdentifier.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGCNasMessageContainer.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/PTmsiSignature.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsMobileIdentity.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/GutiType.h \
|
||||
@@ -1476,13 +1497,16 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/NasKeySetIdentifier.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsAttachResult.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/AccessPointName.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGMMCapability.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/AdditionalUpdateResult.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsAttachType.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/UeNetworkCapability.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGSDeregistrationType.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EsmMessageContainer.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/SecurityHeaderType.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EsmCause.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/SORTransparentContainer.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/AdditionalUpdateType.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c \
|
||||
@@ -1495,12 +1519,14 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsBearerIdentity.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/TimeZoneAndTime.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/FGSRegistrationType.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsUpdateResult.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/EpsUpdateType.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/NetworkName.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/IES/SupportedCodecList.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/NR_NAS_defs.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/milenage.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/ESM/MSG/EsmStatus.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h \
|
||||
@@ -1555,6 +1581,7 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/userDef.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/NAS/COMMON/nr_common.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair3/UTILS/conversions.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/X2AP/x2ap_eNB_encoder.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/X2AP/x2ap_eNB_management_procedures.c \
|
||||
@@ -1619,6 +1646,7 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/NETWORK_DRIVER/MESH/ioctl.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/NETWORK_DRIVER/MESH/constant.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h \
|
||||
@@ -1689,12 +1717,13 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/openair2_proc.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/RLC/rlc.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/mac_tables.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/mac_vars.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/mac_defs.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/mac_proto.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/nr_ue_power_procedures.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/config_ue.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/mac_extern.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/main_ue_nr.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c \
|
||||
@@ -1862,6 +1891,7 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/RRC/NR/rrc_gNB.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/RRC/NR/nr_rrc_config.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/RRC/NR/rrc_gNB_radio_bearers.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/RRC/NR/nr_rrc_extern.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/RRC/NR/rrc_gNB_reconfig.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/RRC/NR/rrc_gNB_NGAP.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair2/RRC/NR/mac_rrc_dl_f1ap.c \
|
||||
@@ -2056,6 +2086,7 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/sss_nr.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/scrambling_luts.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/dmrs_nr.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/refsig_defs_ue.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/ptrs_nr.h \
|
||||
@@ -2283,8 +2314,10 @@ INPUT = \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SIMULATION/TOOLS/phase_noise.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SIMULATION/TOOLS/channel_sim.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SIMULATION/TOOLS/sim.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR_UE/phy_frame_config_nr.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR_UE/harq_nr.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR_UE/fapi_nr_ue_l1.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR_UE/phy_frame_config_nr_ue.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR_UE/pucch_uci_ue_nr.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR_UE/harq_nr.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/SCHED_NR_UE/phy_procedures_nr_ue.c \
|
||||
|
||||
@@ -194,7 +194,3 @@ Note that CU-UPs are not released from CU-CP internal structures. That means
|
||||
that you have to restart the CU-CP if you want to connect the CU-UP again
|
||||
(e.g., after a crash). The CU-CP might also misfunction during attach if a
|
||||
CU-UP was connected, but disconnected in the meantime.
|
||||
|
||||
# 5. Abnormal conditions
|
||||
|
||||
* The CU-UP goes offline during normal operation (e.g. UEs have a valid PDU Session and are exchanging data on the UP): after restarting the CU-UP, the UP is not restored and the user will notice GTP errors. In this case the UEs have to reconnect.
|
||||
|
||||
@@ -24,9 +24,7 @@
|
||||
|
||||
The following features are valid for the gNB and the 5G-NR UE.
|
||||
|
||||
* Static TDD
|
||||
- Multi TDD pattern supported refer [TDD Configuration](NR_SA_Multi_TDD_Pattern.md)
|
||||
* Static FDD
|
||||
* Static TDD, FDD
|
||||
* Normal CP
|
||||
* Subcarrier spacings: 15 and 30kHz (FR1), 120kHz (FR2)
|
||||
* Bandwidths: 10, 20, 40, 60, 80, 100MHz
|
||||
@@ -139,7 +137,6 @@ These modes of operation are supported:
|
||||
- evaluation of CQI report
|
||||
- MAC scheduling of SR reception
|
||||
- Intra-frequency handover
|
||||
- Initial support for RedCap
|
||||
|
||||
## gNB RLC
|
||||
|
||||
@@ -186,7 +183,6 @@ These modes of operation are supported:
|
||||
- Interface with NGAP for the interactions with the AMF
|
||||
- Interface with F1AP for CU/DU split deployment option
|
||||
- Periodic RRC measurements of serving cell (no A/B events)
|
||||
- Initial support for RedCap
|
||||
|
||||
## gNB X2AP
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.0 KiB |
@@ -38,33 +38,6 @@ The actual scheduler implementation can be found in functions `pf_dl()` and
|
||||
[`gNB_scheduler_ulsch.c`](../../openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c)
|
||||
(for UL), respectively.
|
||||
|
||||
## PDDCH aggregation level
|
||||
|
||||
PDCCH aggregation level is selected using closed loop controller, where DL HARQ
|
||||
feedback is the controller feedback signal. It is used to increment `pdcch_cl_adjust`
|
||||
variable if no feedback is detected and decrement the variable when feedback is detected.
|
||||
`pdcch_cl_adjust` is later mapped to the PDCCH aggregation level range.
|
||||
|
||||
The value of `pdcch_cl_adjust` is clamped to range <0,1>, the increment value is 0.05 while
|
||||
the decrement value is 0.01. These values are selected to ensure PDCCH success rate is high.
|
||||
See Examples below for futher explaination.
|
||||
|
||||
The possible values of aggregation level on UE SS can be configured via `uess_agg_levels` configuration
|
||||
option. By default the gNB uses only aggregation level 2 which translates to `uess_agg_levels` set to
|
||||
`[0, 1, 0, 0, 0]`. For example, to enable aggregation level 2 and 4 set `uess_agg_levels` to `[0, 1, 1, 0, 0]`.
|
||||
|
||||
### Examples:
|
||||
#### Example 1:
|
||||
Say we have 90% PDCCH success rate at aggregation level 1, `pdcch_cl_adjust` will stay at 0
|
||||
for most of the time. 2 consecutive PDCCH failures will not result in increasing the aggregation
|
||||
level (because (0.05 + 0.05) * 4 = 0.4 which is closer to 0 than to 1). If PDCCH fails 3 times
|
||||
in a row the aggregation level will change to 2 and hopefully back to 1 once more PDDCH successes
|
||||
happen.
|
||||
|
||||
### Example 2
|
||||
Say we have 0% PDCCH success rate (radio link failure scenario) but `pdcch_cl_adjust` is 0 indicating
|
||||
perfect PDCCH channel. it would take ~18 PDCCH failures to reach maximum aggregation level.
|
||||
|
||||
# Periodic output and interpretation
|
||||
|
||||
The scheduler periodically outputs statistics that can help you judge the radio
|
||||
@@ -172,8 +145,8 @@ In the last lines:
|
||||
|
||||
## Split-related options (running in a DU)
|
||||
|
||||
See [nFAPI documentation](../nfapi.md) or [Aerial
|
||||
tutorial](../Aerial_FAPI_Split_Tutorial.md) for information about the (n)FAPI
|
||||
See [nFAPI documentation](../L2NFAPI.md) or [Aerial
|
||||
tutorial](../Aerial_FAPI_Split_Tutorial.md) for information about the FAPI
|
||||
split.
|
||||
|
||||
See [F1 documentation](../F1-design.md) for information about the F1 split.
|
||||
@@ -267,115 +240,3 @@ here, *also they pertain to the DU*, i.e., the scheduler.
|
||||
options are 2, 4, 6, 8, 10, 12, 32; **32 is a Rel-17 features**)
|
||||
* `num_ulharq` (default 16): as `num_dlharq` for UL (other valid option is 32;
|
||||
**32 is i Rel-17 feature**)
|
||||
|
||||
## ServingCellConfigCommon parameters
|
||||
|
||||
The `gNBs` configuration section has a big structure `servingCellConfigCommon`
|
||||
that has an influence on the overall behavior of MAC and L1. As the name says,
|
||||
this structure is a flat representation of the ServingCellConfigCommon
|
||||
structure, specified by 3GPP. Describing all of these parameters would be too
|
||||
exhaustive; more information about the individual fields can be found in 3GPP
|
||||
TS 38.331, section 6.3.2 "Radio resource control information elements".
|
||||
|
||||
Below is a description of some of these parameters.
|
||||
|
||||
### Frequency configuration
|
||||
|
||||
There are many parameters, such as `absoluteFrequencySSB`, etc., that have an
|
||||
impact on the frequency used by the gNB. For more information, please check the
|
||||
[corresponding document](../gNB_frequency_setup.md).
|
||||
|
||||
### TDD pattern configuration
|
||||
|
||||
The TDD configuration parameters allow to use one or two TDD patterns.
|
||||
|
||||
#### Single TDD pattern
|
||||
|
||||
Configure the TDD pattern through these options:
|
||||
- `dl_UL_TransmissionPeriodicity`: Refers to the UL/DL slots periodicity for
|
||||
the TDD pattern. See below for valid numbers.
|
||||
- `nrofDownlinkSlots`: Refers to the number of consecutive DL slots in the TDD
|
||||
pattern. The number of DL slots depends on the TDD period.
|
||||
- `nrofDownlinkSymbols`: Indicates the number of consecutive DL symbols within
|
||||
the special slot that follows the downlink slots in the TDD pattern. The
|
||||
special slot is needed only to switch from DL to UL. The maximum number of
|
||||
symbols in this slot is 14.
|
||||
- `nrofUplinkSlots`: Refers to the number of consecutive UL slots in the TDD
|
||||
pattern, depending on the desired TDD period.
|
||||
- `nrofUplinkSymbols`: Indicates the number of consecutive UL symbols within
|
||||
the special slot that follows the downlink slots in the TDD pattern. The sum
|
||||
of downlink and uplink symbols should not exceed 14.
|
||||
- `prach_ConfigurationIndex`: index for PRACH according to tables 6.3.3.2-2 to
|
||||
6.3.3.2-4 in TS 38.211.
|
||||
|
||||
As an example, the below figure shows a single TDD pattern, consisting of 3 DL
|
||||
slots, 1 mixed slots (with 10 DL, 2 guard, 2 UL symbols), and 1 UL slot.
|
||||
|
||||

|
||||
|
||||
To configure this pattern in the configuration file, use
|
||||
|
||||
```plaintext
|
||||
#dl_UL_TransmissionPeriodicity 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10, 8=ms3, 9=ms4
|
||||
|
||||
dl_UL_TransmissionPeriodicity = 5;
|
||||
nrofDownlinkSlots = 3;
|
||||
nrofDownlinkSymbols = 10;
|
||||
nrofUplinkSlots = 1;
|
||||
nrofUplinkSymbols = 2;
|
||||
```
|
||||
|
||||
The `dl_UL_TransmissionPeriodicity` is set to `5` (2.5ms). The above figure
|
||||
shows two TDD periods over 5ms. The 10 ms frame period must be strictly
|
||||
divisible by the sum of the TDD pattern periods.
|
||||
|
||||
#### Two TDD patterns
|
||||
|
||||
An optional `pattern2` structure is used to signal a TDD pattern 2.
|
||||
In this case, the TDD pattern may have two extended values of 3 ms and 4 ms.
|
||||
These values are standardized as `dl-UL-TransmissionPeriodicity-v1530`. For the
|
||||
sake of simplicity of the gNB configuration file, we have extended the set of
|
||||
`dl-UL-TransmissionPeriodicity` values to support the new TDD periods, as
|
||||
explained in the table below. However, these values will later be encoded as
|
||||
`dl-UL-TransmissionPeriodicity-v1530` to match the specifications.
|
||||
|
||||
| `dl_UL_TransmissionPeriodicity` | TDD period |
|
||||
|---------------------------------|------------|
|
||||
| 0 | 0.5 ms |
|
||||
| 1 | 0.625 ms |
|
||||
| 2 | 1 ms |
|
||||
| 3 | 1.25 ms |
|
||||
| 4 | 2 ms |
|
||||
| 5 | 2.5 ms |
|
||||
| 6 | 5 ms |
|
||||
| 7 | 10 ms |
|
||||
| 8 | 3 ms |
|
||||
| 9 | 4 ms |
|
||||
|
||||
The 10 ms frame period must be strictly divisible by the sum of the TDD pattern
|
||||
periods. For example, the 3 ms TDD pattern should be used with a second TDD
|
||||
pattern of 2 ms. Additionally, the 4 ms TDD pattern should be used with a
|
||||
second TDD pattern of 1 ms.
|
||||
|
||||
As an example, this configuration might be used, where the first TDD pattern is
|
||||
followed by a second, consisting of 4 DL slots.
|
||||
```
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
# ext: 8=ms3, 9=ms4
|
||||
dl_UL_TransmissionPeriodicity = 8;
|
||||
nrofDownlinkSlots = 3;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
# pattern2
|
||||
pattern2: {
|
||||
dl_UL_TransmissionPeriodicity2 = 4;
|
||||
nrofDownlinkSlots2 = 4;
|
||||
nrofDownlinkSymbols2 = 0;
|
||||
nrofUplinkSlots2 = 0;
|
||||
nrofUplinkSymbols2 = 0;
|
||||
};
|
||||
```
|
||||
|
||||
@@ -54,7 +54,7 @@ Important notes:
|
||||
sudo ./nr-uesoftmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.conf -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --uicc0.imsi 001010000000001 --rfsimulator.options chanmod --rfsimulator.serveraddr 10.201.1.100 --telnetsrv --telnetsrv.listenport 9095
|
||||
```
|
||||
|
||||
3. For the second UE, create the namespace ue2 (`-c2`), then execute shell inside (`-o2`, "open"):
|
||||
3. For the second UE, create the namespace ue2 (`-c1`), then execute shell inside (`-o1`, "open"):
|
||||
|
||||
```bash
|
||||
sudo ./multi-ue.sh -c2
|
||||
|
||||
@@ -72,7 +72,6 @@ tested any RU without S-plane. Radio units we are testing/integrating:
|
||||
|LiteON RU |01.00.08/02.00.03 |
|
||||
|Benetel 650 |RAN650-1v1.0.4-dda1bf5|
|
||||
|Benetel 550 CAT-A|RAN550-1v1.0.4-605a25a|
|
||||
|Foxconn RPQN |v3.1.15q.551_rc10 |
|
||||
|
||||
Tested libxran releases:
|
||||
|
||||
@@ -476,19 +475,6 @@ cmake .. -GNinja -DOAI_FHI72=ON -Dxran_LOCATION=$HOME/phy/fhi_lib/lib
|
||||
ninja nr-softmodem oran_fhlib_5g params_libconfig
|
||||
```
|
||||
|
||||
Note that in tags 2025.w06 and prior, the FHI72 driver used polling to wait for
|
||||
the next slot. This is inefficient as it burns CPU time, and has been replaced
|
||||
with a more efficient mechanism. Nevertheless, if you experience problems that
|
||||
did not occur previously, it is possible to re-enable polling, either with
|
||||
`build_oai` like this
|
||||
|
||||
./build_oai --gNB --ninja -t oran_fhlib_5g --cmake-opt -Dxran_LOCATION=$HOME/phy/fhi_lib/lib --cmake-opt -DOAI_FHI72_USE_POLLING=ON
|
||||
|
||||
or with `cmake` like so
|
||||
|
||||
cmake .. -GNinja -DOAI_FHI72=ON -Dxran_LOCATION=$HOME/phy/fhi_lib/lib -DOAI_FHI72_USE_POLLING=ON
|
||||
ninja oran_fhlib_5g
|
||||
|
||||
# Configuration
|
||||
|
||||
RU and DU configurations have a circular dependency: you have to configure DU MAC address in the RU configuration and the RU MAC address, VLAN and Timing advance parameters in the DU configuration.
|
||||
@@ -672,40 +658,6 @@ The RU configuration is stored in `/etc/rumanager.conf`. The required modificati
|
||||
|
||||
At this stage, RU must be rebooted so the changes apply.
|
||||
|
||||
### Foxconn RPQN RU
|
||||
|
||||
**Version v3.1.15q.551_rc10**
|
||||
|
||||
The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4X4-foxconn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4X4-foxconn.conf) corresponds to:
|
||||
- TDD pattern `DDDSU`, 2.5ms
|
||||
- Bandwidth 100MHz
|
||||
- MTU 8000
|
||||
|
||||
#### RU configuration
|
||||
|
||||
After switching on or rebooting the RU, the `/home/root/test/init_rrh_config_enable_cuplane` script should be run.
|
||||
|
||||
The RU configuration file is located in `/home/root/test/RRHconfig_xran.xml`. The required modifications:
|
||||
1. `RRH_DST_MAC_ADDR`
|
||||
2. `RRH_SRC_MAC_ADDR`
|
||||
3. `RRH_EAXC_ID_TYPE1`
|
||||
4. `RRH_EAXC_ID_TYPE3`
|
||||
5. `RRH_CMPR_HDR_PRESENT` -> `0`
|
||||
6. `RRH_C_PLANE_VLAN_TAG`
|
||||
7. `RRH_U_PLANE_VLAN_TAG`
|
||||
8. `RRH_LO_FREQUENCY_KHZ` -> `3750000, 0`
|
||||
9. `RRH_DISABLE_USING_CAL_TABLES` -> `YES`
|
||||
10. `RRH_TX_ATTENUATION` -> must be larger than 10dB
|
||||
11. `RRH_RX_ATTENUATION` -> must be lower than 30dB
|
||||
|
||||
RU must be rebooted so the changes apply.
|
||||
|
||||
**Note**
|
||||
|
||||
- The RU was tested with the `2024.w30` tag of OAI.
|
||||
- The measured throughput was **520 Mbps DL** and **40 Mbps UL**.
|
||||
- With newer OAI versions, throughput degrades. This issue is currently under investigation.
|
||||
|
||||
## Configure Network Interfaces and DPDK VFs
|
||||
|
||||
The 7.2 fronthaul uses the xran library, which requires DPDK. In this step, we
|
||||
@@ -977,8 +929,10 @@ Edit the sample OAI gNB configuration file and check following parameters:
|
||||
including the advantages and disadvantages of each mode, refer to
|
||||
[Memory in DPDK](https://www.dpdk.org/memory-in-dpdk-part-2-deep-dive-into-iova/)
|
||||
* `owdm_enable`: used for eCPRI One-Way Delay Measurements; it depends if the RU supports it; if not set to 1 (enabled), default value is 0 (disabled)
|
||||
* `fh_config`
|
||||
* DU delay profile (`T1a` and `Ta4`): pairs of numbers `(x, y)` specifying minimum and maximum delays
|
||||
* `fh_config`: parameters that need to match RU parameters
|
||||
* timing parameters (starting with `T`) depend on the RU: `Tadv_cp_dl` is a
|
||||
single number, the rest pairs of numbers `(x, y)` specifying minimum and
|
||||
maximum delays
|
||||
* `ru_config`: RU-specific configuration:
|
||||
* `iq_width`: Width of DL/UL IQ samples: if 16, no compression, if <16, applies
|
||||
compression
|
||||
@@ -999,7 +953,7 @@ Layer mapping (eAxC offsets) happens as follows:
|
||||
**Note**
|
||||
|
||||
- At the moment, OAI is compatible with CAT A O-RU only. Therefore, SRS is not supported.
|
||||
- XRAN retrieves DU MAC address with `rte_eth_macaddr_get()` function. Hence, `fhi_72.du_addr` parameter is not taken into account.
|
||||
- XRAN retreives DU MAC address with `rte_eth_macaddr_get()` function. Hence, `fhi_72.du_addr` parameter is not taken into account.
|
||||
|
||||
# Start and Operation of OAI gNB
|
||||
|
||||
@@ -1086,16 +1040,14 @@ In this case, you should reverify that `ptp4l` and `phc2sys` are working, e.g.,
|
||||
do not do any jumps (during the last hour). While an occasional jump is not
|
||||
necessarily problematic for the gNB, many such messages mean that the system is
|
||||
not working, and UEs might not be able to attach or reach good performance.
|
||||
Also, you can try to compile with polling (see [the build
|
||||
section](.#build-oai-gnb)) to see if it resolves the problem.
|
||||
|
||||
# Operation with multiple RUs
|
||||
|
||||
It is possible to connect up to 4 RUs to one DU at the same time and operate
|
||||
them either with a single antenna array or a distributed antenna array. This
|
||||
works since all RUs and the DU are synchronized onto a common clock using PTP.
|
||||
The assumed configuration is that with N RUs each having an M×M configuration,
|
||||
we effectively reach an (N×M)×(N×M) configuration.
|
||||
them as a (single) distributed antenna (array). This works since all RUs and
|
||||
the DU are synchronized onto a common clock using PTP. The assumed
|
||||
configuration is that with N RUs each having an M×M configuration, we
|
||||
effectively reach an (N×M)×(N×M) configuration.
|
||||
|
||||
Some caveats:
|
||||
- Since it's a distributed antenna, this implies that this setup will deploy a
|
||||
@@ -1127,10 +1079,10 @@ fhi_72 = {
|
||||
// mtu
|
||||
fh_config = (
|
||||
{
|
||||
// DU delay profile, ru_config, prach_config of RU1
|
||||
// timing, ru_config, prach_config of RU1
|
||||
},
|
||||
{
|
||||
// DU delay profile, ru_config, prach_config of RU2
|
||||
// timing, ru_config, prach_config of RU2
|
||||
}
|
||||
);
|
||||
};
|
||||
@@ -1154,6 +1106,11 @@ fhi_72 = {
|
||||
fh_config = (
|
||||
# RAN650 #1
|
||||
{
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (259, 500);
|
||||
T2a_cp_ul = (25, 500);
|
||||
T2a_up = (134, 375);
|
||||
Ta3 = (152, 160);
|
||||
T1a_cp_dl = (419, 470);
|
||||
T1a_cp_ul = (285, 336);
|
||||
T1a_up = (294, 345);
|
||||
@@ -1165,6 +1122,11 @@ fhi_72 = {
|
||||
},
|
||||
# RAN650 #2
|
||||
{
|
||||
Tadv_cp_dl = 125;
|
||||
T2a_cp_dl = (259, 500);
|
||||
T2a_cp_ul = (25, 500);
|
||||
T2a_up = (134, 375);
|
||||
Ta3 = (152, 160);
|
||||
T1a_cp_dl = (419, 470);
|
||||
T1a_cp_ul = (285, 336);
|
||||
T1a_up = (294, 345);
|
||||
@@ -1208,815 +1170,6 @@ Note the eight entries after `avg_IO`.
|
||||
|
||||
You should be able to connect a UE now.
|
||||
|
||||
|
||||
# OAI Management Plane
|
||||
We support Configuration Management in OAI gNB, where gNB configures CU-planes, interfaces, TX/RX antennas, and TX/RX carriers for the RU.
|
||||
The reference specifications:
|
||||
* `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).
|
||||
|
||||
### DHCP server
|
||||
The M-plane requires a DHCP server, where the M-plane connection can be established over untagged or tagged VLAN. We tested with untagged (the default VLAN is 1).
|
||||
Please modify `/etc/dhcp/dhcpd.conf` configuration based on your testbed.
|
||||
|
||||
<details>
|
||||
<summary>Example DHCP server configuration</summary>
|
||||
|
||||
```
|
||||
class "vendor-class" {
|
||||
match option vendor-class-identifier;
|
||||
}
|
||||
subclass "vendor-class" "o-ran-ru2/Benetel" {
|
||||
vendor-option-space VC;
|
||||
}
|
||||
option space VC;
|
||||
option VC.server-address code 129 = array of ip-address;
|
||||
option VC.server-fqdn code 130 = string;
|
||||
# Netconf client IP address - DHCP option 43
|
||||
option VC.server-address 192.168.80.1;
|
||||
option VC.server-fqdn "o_du_1.operator.com";
|
||||
set vendor-string = option vendor-class-identifier;
|
||||
# option 143 - DHCPv4 SZTP Redirect Option (RFC8572)
|
||||
# 2 bytes of URI's length + URI
|
||||
option sztp code 143 = { unsigned integer 16, string };
|
||||
option sztp 15 "https://192.168.80.1";
|
||||
# port is optional in URI, e.g. "https://192.168.80.1:222"
|
||||
#option sztp 20 "https://192.168.80.1:2222";
|
||||
subnet 192.168.80.0 netmask 255.255.255.0 {
|
||||
option routers 192.168.80.1;
|
||||
option subnet-mask 255.255.255.0;
|
||||
option domain-name "oai.com";
|
||||
option domain-name-servers 172.21.3.100;
|
||||
host benetel_ru {
|
||||
# RU MAC address
|
||||
hardware ethernet <ru-mac-address>;
|
||||
# RU IP address
|
||||
fixed-address <desired-ru-ip-address>;
|
||||
}
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
Please, configure the interface as:
|
||||
```bash
|
||||
sudo ip address add 192.168.80.1/24 dev <interface>
|
||||
```
|
||||
|
||||
### Mandatory packages
|
||||
* On Fedora (we haven't yet tested RHEL):
|
||||
```bash
|
||||
sudo dnf install pcre-devel libssh-devel libxml2-devel libyang2-devel libnetconf2-devel
|
||||
```
|
||||
|
||||
* On Ubuntu:
|
||||
```bash
|
||||
sudo apt-get install libpcre3-dev libssh-dev libxml2-dev
|
||||
```
|
||||
|
||||
On Ubuntu, please note: `sudo apt-get install libyang2-dev libnetconf2-dev` will install unsupported versions (i.e. v2.0.112/v2.0.24 for `libyang2-dev`/`libnetconf2-dev`, but minimum required are v2.1.4/v2.1.25).
|
||||
Therefore, please compile these libraries from source, as following:
|
||||
|
||||
<details>
|
||||
<summary>Installing latest v2 libyang2 and libnetconf2 libraries</summary>
|
||||
|
||||
```
|
||||
rm -rf /tmp/build_mplane_v2
|
||||
mkdir /tmp/build_mplane_v2
|
||||
|
||||
# libyang
|
||||
cd /tmp/build_mplane_v2
|
||||
git clone https://github.com/CESNET/libyang.git
|
||||
cd libyang
|
||||
git checkout v2.1.111
|
||||
mkdir build && cd build
|
||||
cmake -DENABLE_TESTS=OFF \
|
||||
-DENABLE_VALGRIND_TESTS=OFF \
|
||||
-DCMAKE_INSTALL_PREFIX=/usr/local \
|
||||
-DCMAKE_INSTALL_RPATH=/usr/local/lib \
|
||||
-DPLUGINS_DIR=/usr/local/lib/libyang \
|
||||
-DPLUGINS_DIR_EXTENSIONS=/usr/local/lib/libyang/extensions \
|
||||
-DPLUGINS_DIR_TYPES=/usr/local/lib/libyang/types \
|
||||
-DYANG_MODULE_DIR=/usr/local/share/yang/modules/libyang ..
|
||||
make -j8
|
||||
sudo make install
|
||||
sudo ldconfig
|
||||
|
||||
#libnetconf
|
||||
cd /tmp/build_mplane_v2
|
||||
git clone https://github.com/CESNET/libnetconf2.git
|
||||
cd libnetconf2
|
||||
git checkout v2.1.37
|
||||
mkdir build && cd build
|
||||
cmake -DENABLE_TESTS=OFF \
|
||||
-DENABLE_EXAMPLES=OFF \
|
||||
-DENABLE_VALGRIND_TESTS=OFF \
|
||||
-DCLIENT_SEARCH_DIR=/usr/local/share/yang/modules \
|
||||
-DCMAKE_INSTALL_PREFIX=/usr/local \
|
||||
-DCMAKE_INSTALL_RPATH=/usr/local/lib \
|
||||
-DLIBYANG_INCLUDE_DIR=/usr/local/include \
|
||||
-DLIBYANG_LIBRARY=/usr/local/lib/libyang.so \
|
||||
-DLY_VERSION_PATH=/usr/local/include \
|
||||
-DYANG_MODULE_DIR=/usr/local/share/yang/modules/libnetconf2 ..
|
||||
make -j8
|
||||
sudo make install
|
||||
sudo ldconfig
|
||||
|
||||
# to uninstall libraries
|
||||
# cd /tmp/build_mplane_v2/libyang/build && sudo make uninstall
|
||||
# cd /tmp/build_mplane_v2/libnetconf2/build && sudo make uninstall
|
||||
# cd
|
||||
# rm -rf /tmp/build_mplane_v2
|
||||
```
|
||||
</details>
|
||||
|
||||
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: 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:
|
||||
```bash
|
||||
ssh root@<ru-ip-address>
|
||||
systemctl enable mplane
|
||||
reboot
|
||||
```
|
||||
Once the mplane service is successfully enabled on the RU, two new users are being added in `/etc/passwd`:
|
||||
```bash
|
||||
...
|
||||
oranbenetel:x:1000:1000::/home/oranbenetel:/bin/sh
|
||||
oranext:x:1001:1001::/home/oranext:/bin/sh
|
||||
```
|
||||
Create `oranbenetel` home directory:
|
||||
```bash
|
||||
mkdir /home/oranbenetel && chown oranbenetel:oranbenetel /home/oranbenetel
|
||||
```
|
||||
Connect to the RU as user `oranbenetel`, generate ssh keys, and copy DU public key into RU for NETCONF authentication:
|
||||
```bash
|
||||
ssh oranbenetel@<ru-ip-address>
|
||||
ssh-keygen
|
||||
echo "<DU-pub-key>" >> ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
|
||||
## gNB configuration
|
||||
The reference gNB configuration file for one Benetel RAN550:
|
||||
[`gnb.sa.band78.273prb.fhi72.4x4-benetel550-mplane.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550-mplane.conf)
|
||||
The reference DU configuration file for two Benetel RAN650:
|
||||
[gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650-mplane.conf](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650-mplane.conf)
|
||||
|
||||
In order to run gNB/DU with M-plane, we need to modify the `fhi_72` section in the configuration file.
|
||||
Example for one RU:
|
||||
```bash
|
||||
fhi_72 = {
|
||||
dpdk_devices = ("0000:c3:11.0", "0000:c3:11.1"); # one VF can be used as well
|
||||
system_core = 0;
|
||||
io_core = 1;
|
||||
worker_cores = (2);
|
||||
du_key_pair = ("<path-to>/.ssh/id_rsa.pub", "<path-to>/.ssh/id_rsa");
|
||||
du_addr = ("00:11:22:33:44:66", "00:11:22:33:44:67"); # only one needed if one VF configured
|
||||
vlan_tag = (9, 9); # only one needed if one VF configured
|
||||
ru_ip_addr = ("192.168.80.9");
|
||||
fh_config = ({
|
||||
T1a_cp_dl = (419, 470);
|
||||
T1a_cp_ul = (285, 336);
|
||||
T1a_up = (294, 345);
|
||||
Ta4 = (0, 200);
|
||||
});
|
||||
};
|
||||
```
|
||||
Example for two RUs:
|
||||
```bash
|
||||
fhi_72 = {
|
||||
dpdk_devices = ("0000:c3:11.0", "0000:c3:11.1", "0000:c3:11.2", "0000:c3:11.3"); # two VFs can be used as well
|
||||
system_core = 0;
|
||||
io_core = 1;
|
||||
worker_cores = (2);
|
||||
du_key_pair = ("/home/oaicicd/.ssh/id_rsa.pub", "/home/oaicicd/.ssh/id_rsa");
|
||||
du_addr = ("00:11:22:33:44:66", "00:11:22:33:44:67", "00:11:22:33:44:68", "00:11:22:33:44:69"); # only two needed if two VFs configured
|
||||
vlan_tag = (9, 9, 11, 11); # only two needed if two VFs configured
|
||||
ru_ip_addr = ("192.168.80.9", "192.168.80.10");
|
||||
fh_config = (
|
||||
# RAN550 #1
|
||||
{
|
||||
T1a_cp_dl = (419, 470);
|
||||
T1a_cp_ul = (285, 336);
|
||||
T1a_up = (294, 345);
|
||||
Ta4 = (0, 200);
|
||||
},
|
||||
# RAN550 #2
|
||||
{
|
||||
T1a_cp_dl = (419, 470);
|
||||
T1a_cp_ul = (285, 336);
|
||||
T1a_up = (294, 345);
|
||||
Ta4 = (0, 200);
|
||||
});
|
||||
};
|
||||
```
|
||||
|
||||
* `fhi_72` :
|
||||
* `dpdk_devices`: [*]
|
||||
* `system_core`: [*]
|
||||
* `io_core`: [*]
|
||||
* `worker_cores`: [*]
|
||||
* `file_prefix`: [*]
|
||||
* `du_key_pair`: ssh public and private keys to authenticate RU with NETCONF
|
||||
* `du_addr`: DU MAC address(es) to create CU-plane interface(s) in the RU
|
||||
* `vlan_tag`: VLAN U and C plane tags to create CU-plane interface(s) in the RU
|
||||
* `ru_ip_addr`: RU IP address to connect to the RU via M-plane
|
||||
* `dpdk_mem_size`: [*]
|
||||
* `dpdk_iova_mode`: [*]
|
||||
* `owdm_enable`: [*]
|
||||
* `fh_config`: only DU delay profile (`T1a` and `Ta4`)
|
||||
|
||||
[*] see [Configure OAI gNB](#configure-oai-gnb) for more details
|
||||
|
||||
The following parameters are retrieved from the RU and forwarded to the xran:
|
||||
* `MTU`
|
||||
* `RU MAC address`
|
||||
* `IQ compression`: if RU supports multiple, the first value in the list is taken; please note that the same value is used for PxSCH/PRACH
|
||||
* `PRACH offset`: hardcoded based on the RU vendor (i.e. for Benetel `max(Nrx,Ntx)`)
|
||||
|
||||
## Build and compile gNB
|
||||
The following cmake options are available:
|
||||
* `OAI_FHI72` = CUS support
|
||||
* `OAI_FHI72_MPLANE` = M support
|
||||
|
||||
Compiled libraries:
|
||||
* `OAI_FHI72` <=> `oran_fhlib_5g`
|
||||
* `OAI_FHI72` && `OAI_FHI72_MPLANE` <=> `oran_fhlib_5g` (CUS) && `oran_fhlib_5g_mplane` (CUSM)
|
||||
|
||||
### Using build_oai script
|
||||
```bash
|
||||
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g
|
||||
cd ~/openairinterface5g/cmake_targets/
|
||||
./build_oai -I # if you never installed OAI, use this command once before the next line
|
||||
./build_oai --install-optional-packages # for pcre/libpcre3, libssh, and libxml2 library installation
|
||||
./build_oai --gNB --ninja -t oran_fhlib_5g_mplane --cmake-opt -Dxran_LOCATION=$HOME/phy/fhi_lib/lib
|
||||
# if libyang2 and libnetconf2 are installed in `/opt/mplane-v2`, please use the following command:
|
||||
PKG_CONFIG_PATH=/opt/mplane-v2/lib/pkgconfig ./build_oai --gNB --ninja -t oran_fhlib_5g_mplane --cmake-opt -Dxran_LOCATION=$HOME/phy/fhi_lib/lib
|
||||
```
|
||||
|
||||
### Using cmake directly
|
||||
```bash
|
||||
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g
|
||||
cd ~/openairinterface5g/
|
||||
mkdir build && cd build
|
||||
cmake .. -GNinja -DOAI_FHI72=ON -DOAI_FHI72_MPLANE=ON -Dxran_LOCATION=$HOME/phy/fhi_lib/lib
|
||||
# if libyang2 and libnetconf2 are installed in `/opt/mplane-v2`, please use the following command:
|
||||
PKG_CONFIG_PATH=/opt/mplane-v2/lib/pkgconfig cmake .. -GNinja -DOAI_FHI72=ON -DOAI_FHI72_MPLANE=ON -Dxran_LOCATION=$HOME/phy/fhi_lib/lib
|
||||
ninja nr-softmodem oran_fhlib_5g_mplane params_libconfig
|
||||
```
|
||||
|
||||
## Start the gNB
|
||||
Run the `nr-softmodem` from the build directory:
|
||||
```bash
|
||||
cd ~/openairinterface5g/cmake_targets/ran_build/build
|
||||
sudo ./nr-softmodem -O <mplane-configuration file> --thread-pool <list of non isolated cpus>
|
||||
```
|
||||
|
||||
**Warning**: Make sure that the configuration file you add after the `-O` option is adapted to your machine, especially to its isolated cores.
|
||||
|
||||
M-plane sequence diagram:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant dhcp as DHCP server
|
||||
participant du as O-DU
|
||||
participant ru as O-RU
|
||||
|
||||
dhcp->ru: 1. Transport Layer Initialization
|
||||
note over dhcp,ru: (a) perform VLAN scan (untagged or tagged VLAN)<br/>(b) DHCP assigns IP address to RU<br/>(c) DHCP sends DU IP address to RU
|
||||
|
||||
du->ru: 2. NETCONF/SSH connect
|
||||
|
||||
du->>ru: 3. DU retrieves RU info
|
||||
note left of du: <get>
|
||||
|
||||
note over du: Check if RU is PTP synced
|
||||
|
||||
du->>ru: 4. DU subscribes to all RU notifications
|
||||
note left of du: <subscribe>
|
||||
|
||||
du->>ru: 5. DU updates the supervision timer
|
||||
note left of du: <supervision-watchdog-reset>
|
||||
|
||||
note over du: Store RU MAC, MTU, IQ bitwidth, and PRACH offset info for xran
|
||||
|
||||
note over du: Store all the RU U-plane info - interface name, TX/RX carrier, and TX/RX endpoint names
|
||||
|
||||
du->>ru: 6. DU loads yang models
|
||||
note left of du: <get-schema>
|
||||
note right of ru: ietf-netconf-monitoring.yang
|
||||
|
||||
du->>ru: 7. DU performs CU-plane configuration
|
||||
note left of du: <edit-config>
|
||||
|
||||
note over ru: (1) o-ran-interface.yang - create new interface with VLAN tag, DU and RU MAC addresses<br/>(2)(opt.) o-ran-transceiver.yang - for file upload<br/>(3) o-ran-processing-elements.yang - element with which RU ports should be assigned<br/>(4) o-ran-uplane-conf.yang<br/>#8193;(4a) low-level-tx/rx-endpoints - PxSCH, PRACH<br/>#8193;(4b) tx/rx-array-carriers - center frequency, BW, gain, ACTIVE,...<br/>#8193;(4c) low-level-tx/rx-links - mapping endpoints, carriers and processing element<br/>#8193;(4d)(opt.) if CAT B, SRS configuration<br/>#8193;(4e)(opt.) TDD configuration
|
||||
|
||||
du->>ru: 8. DU checks if CU-plane configuration is valid
|
||||
note left of du: <validate>
|
||||
|
||||
du->>ru: 9. If valid, DU commits the changes
|
||||
note left of du: <commit>
|
||||
|
||||
du->>ru: 10. DU retrieves RU states
|
||||
note right of ru: ietf-hardware.yang
|
||||
note left of du: <get>
|
||||
note over ru: admin-state, power-state, oper-state,<br/>availability-state, usage-state
|
||||
|
||||
ru->>du: 11. RU notifies DU about the configuration change
|
||||
|
||||
note over du: DU configures xran
|
||||
|
||||
du->ru: 12. DU and RU exchange packets
|
||||
```
|
||||
|
||||
|
||||
<details>
|
||||
<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 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".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = "<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.80.9".
|
||||
[HW] [MPLANE] Watchdog timer answer:
|
||||
<next-update-at xmlns="urn:o-ran:supervision:1.0">2025-03-30T08:52:31+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 8c:1f:64:d1:11:c0
|
||||
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
|
||||
[HW] [MPLANE] Successfully retrieved all the U-plane info - interface name, TX/RX carrier names, and TX/RX endpoint names.
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-yang-metadata".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "yang".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-inet-types".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-yang-types".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-yang-schema-mount".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-yang-structure-ext".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-datastores".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "sysrepo".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-netconf-acm".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-factory-default".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "sysrepo-factory-default".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-yang-library".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "sysrepo-monitoring".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "sysrepo-plugind".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-netconf".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-netconf-with-defaults".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-netconf-notifications".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-origin".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-netconf-monitoring".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get-schema> for module "ietf-netconf-nmda".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <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.80.9".
|
||||
[HW] [MPLANE] Unable to load all yang modules from operational datastore for RU "192.168.80.9". Using yang models present in "models" subfolder.
|
||||
[HW] [MPLANE] Successfully loaded all yang modules for RU "192.168.80.9".
|
||||
[HW] [MPLANE] The VLAN tags for C and U plane for the RU "192.168.80.9" are the same. Therefore, configuring one common interface and one processing element.
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <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">8c:1f:64:d1:11:c0</mac-address>
|
||||
<base-interface xmlns="urn:o-ran:interfaces:1.0">eth0</base-interface>
|
||||
<vlan-id xmlns="urn:o-ran:interfaces:1.0">9</vlan-id>
|
||||
</interface>
|
||||
</interfaces>
|
||||
<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>8c:1f:64:d1:11:c0</ru-mac-address>
|
||||
<vlan-id>9</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>TxArray0</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>TxArray0</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>TxArray0</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>RxArray0</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>RxArray0</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>RxArray0</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>RxArray0</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>RxArray0</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>RxArray0</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>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint0</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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>4</eaxc-id>
|
||||
</e-axcid>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxEndpoint1</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint1</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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>5</eaxc-id>
|
||||
</e-axcid>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxEndpoint2</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint2</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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>6</eaxc-id>
|
||||
</e-axcid>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxEndpoint3</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint3</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<cp-length>0</cp-length>
|
||||
<cp-length-other>0</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>7</eaxc-id>
|
||||
</e-axcid>
|
||||
</low-level-rx-endpoints>
|
||||
<tx-array-carriers>
|
||||
<name>TxArray0</name>
|
||||
<absolute-frequency-center>663360</absolute-frequency-center>
|
||||
<center-of-channel-bandwidth>3950400000</center-of-channel-bandwidth>
|
||||
<channel-bandwidth>100000000</channel-bandwidth>
|
||||
<active>ACTIVE</active>
|
||||
<gain>0.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>663360</absolute-frequency-center>
|
||||
<center-of-channel-bandwidth>3950400000</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.80.9".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <validate> candidate datastore.
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully validated candidate datastore for RU "192.168.80.9".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <commit> candidate datastore.
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully commited CU-planes configuration into running datastore for RU "192.168.80.9".
|
||||
[HW] [MPLANE] Usage state = "idle" for RU "192.168.80.9".
|
||||
[HW] [MPLANE] Received notification from RU "192.168.80.9" at (2025-03-29T12:40:23.049085102+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:rx-array-carriers-state-change": {
|
||||
"rx-array-carriers": [
|
||||
{
|
||||
"name": "RxArray0",
|
||||
"state": "BUSY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.80.9" at (2025-03-29T12:40:23.058136880+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.80.9" at (2025-03-29T12:40:23.078776163+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.80.9" at (2025-03-29T12:40:23.093039138+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.80.9" at (2025-03-29T12:40:23.452751936+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] RU "192.168.80.9" is now ready.
|
||||
```
|
||||
</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.
|
||||
```bash
|
||||
cd ~/openairinterface5g/cmake_targets/ran_build/build
|
||||
rm liboai_transpro.so
|
||||
ln -s liboran_fhlib_5g.so liboai_transpro.so
|
||||
sudo ./nr-softmodem -O <without-mplane-configuration file> --thread-pool <list of non isolated cpus>
|
||||
```
|
||||
|
||||
|
||||
# Contact in case of questions
|
||||
|
||||
You can ask your question on the [mailing lists](https://gitlab.eurecom.fr/oai/openairinterface5g/-/wikis/MailingList).
|
||||
|
||||
@@ -57,8 +57,7 @@ There is some general information in the [OpenAirInterface Gitlab Wiki](https://
|
||||
- [How to use the L2 simulator](./L2NFAPI.md)
|
||||
- [How to use the OAI channel simulator](../openair1/SIMULATION/TOOLS/DOC/channel_simulation.md)
|
||||
- [How to use multiple BWPs](./RUN_NR_multiple_BWPs.md)
|
||||
- [How to run OAI-VNF and OAI-PNF](./nfapi.md): how to run the nFAPI split,
|
||||
including some general remarks on FAPI/nFAPI.
|
||||
- [How to run OAI-VNF and OAI-PNF](./RUN_NR_NFAPI.md) _Note: does not work currently_
|
||||
- [How to use the positioning reference signal (PRS)](./RUN_NR_PRS.md)
|
||||
- [How to use device-to-device communication (D2D, 4G)](./d2d_emulator_setup.txt)
|
||||
- [How to run with E2 agent](../openair2/E2AP/README.md)
|
||||
@@ -117,8 +116,6 @@ Some directories under `radio` contain READMEs:
|
||||
- [USRP](../radio/USRP/README.md)
|
||||
- [BladeRF](../radio/BLADERF/README)
|
||||
- [IQPlayer](../radio/iqplayer/DOC/iqrecordplayer_usage.md), and [general documentation](./iqrecordplayer_usage.md)
|
||||
- [fhi_72](../radio/fhi_72/README.md)
|
||||
- [vrtsim](../radio/vrtsim/README.md)
|
||||
|
||||
The other SDRs (AW2S, LimeSDR, ...) have no READMEs.
|
||||
|
||||
@@ -137,4 +134,3 @@ The other SDRs (AW2S, LimeSDR, ...) have no READMEs.
|
||||
|
||||
- [formatting](../tools/formatting/README.md) is a clang-format error detection tool
|
||||
- [iwyu](../tools/iwyu/README.md) is a tool to detect `#include` errors
|
||||
- [docker-dev-env](../tools/docker-dev-env/README.md) is a ubuntu22 docker development environment
|
||||
|
||||
@@ -221,49 +221,15 @@ Or by providing this the the command line parameters:
|
||||
|
||||
### gNB
|
||||
|
||||
The main parameters to cope with the large NTN propagation delay are cellSpecificKoffset, ta-Common, ta-CommonDrift and the ephemeris data (satellite position and velocity vectors).
|
||||
|
||||
The parameter `cellSpecificKoffset_r17` is the scheduling offset used for the timing relationships that are modified for NTN (see TS 38.213).
|
||||
The main parameter to cope with the large NTN propagation delay is the cellSpecificKoffset.
|
||||
This parameter is the scheduling offset used for the timing relationships that are modified for NTN (see TS 38.213).
|
||||
The unit of the field Koffset is number of slots for a given subcarrier spacing of 15 kHz.
|
||||
|
||||
The parameter `ta-Common-r17` is used to provide the propagation delay between the reference point (at the gNB) and the satellite.
|
||||
The granularity of ta-Common is 4.072 × 10^(-3) µs. Values are given in unit of corresponding granularity.
|
||||
|
||||
The parameter `ta-CommonDrift-r17` indicates the drift rate of the common TA.
|
||||
The granularity of ta-CommonDrift is 0.2 × 10^(-3) µs/s. Values are given in unit of corresponding granularity.
|
||||
|
||||
The satellite position and velocity vartors are provided using the following parameters:
|
||||
|
||||
`positionX-r17`, `positionY-r17`, `positionZ-r17`:
|
||||
X, Y, Z coordinate of satellite position state vector in ECEF. Unit is meter.
|
||||
Step of 1.3 m. Actual value = field value * 1.3.
|
||||
|
||||
`velocityVX-r17`, `velocityVY-r17`, `velocityVZ-r17`:
|
||||
X, Y, Z coordinate of satellite velocity state vector in ECEF. Unit is meter/second.
|
||||
Step of 0.06 m/s. Actual value = field value * 0.06.
|
||||
|
||||
These parameters can be provided to the gNB in the conf file in the section `servingCellConfigCommon`:
|
||||
This parameter can be provided to the gNB in the conf file as `cellSpecificKoffset_r17` in the section `servingCellConfigCommon`.
|
||||
```
|
||||
...
|
||||
# GEO satellite
|
||||
cellSpecificKoffset_r17 = 478;
|
||||
ta-Common-r17 = 58629666; # 238.74 ms
|
||||
positionX-r17 = 0;
|
||||
positionY-r17 = 0;
|
||||
positionZ-r17 = 32433846;
|
||||
velocityVX-r17 = 0;
|
||||
velocityVY-r17 = 0;
|
||||
velocityVZ-r17 = 0;
|
||||
# LEO satellite
|
||||
# cellSpecificKoffset_r17 = 40;
|
||||
# ta-Common-r17 = 4634000; # 18.87 ms
|
||||
# ta-CommonDrift-r17 = -230000; # -46 µs/s
|
||||
# positionX-r17 = 0;
|
||||
# positionY-r17 = -2166908; # -2816980.4 m
|
||||
# positionZ-r17 = 4910784; # 6384019.2 m
|
||||
# velocityVX-r17 = 0;
|
||||
# velocityVY-r17 = 115246; # 6914.76 m/s
|
||||
# velocityVZ-r17 = 50853; # 3051.18 m/s
|
||||
cellSpecificKoffset_r17 = 478; # GEO satellite
|
||||
# cellSpecificKoffset_r17 = 40; # LEO satellite
|
||||
...
|
||||
```
|
||||
|
||||
@@ -296,11 +262,10 @@ To enable this feature, the `disable_harq` flag has to be added to the gNB conf
|
||||
...
|
||||
```
|
||||
|
||||
The settings for a transparent GEO satellite scenario are already provided in the file `ci-scripts/conf_files/gnb.sa.band254.u0.25prb.rfsim.ntn.conf`.
|
||||
Using this conf file, an example gNB command for FDD, 5 MHz BW, 15 kHz SCS, transparent GEO satellite 5G NR NTN is this:
|
||||
So with these modifications to the file `targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.25PRB.usrpx300.conf` an example gNB command for FDD, 5 MHz BW, 15 kHz SCS, transparent GEO satellite 5G NR NTN is this:
|
||||
```
|
||||
cd cmake_targets
|
||||
sudo ./ran_build/build/nr-softmodem -O ../ci-scripts/conf_files/gnb.sa.band254.u0.25prb.rfsim.ntn.conf --rfsim
|
||||
sudo ./ran_build/build/nr-softmodem -O ../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.25PRB.usrpx300.conf --rfsim --rfsimulator.prop_delay 238.74
|
||||
```
|
||||
|
||||
To configure NTN gNB with 32 HARQ processes in downlink and uplink, add these settings in conf files under section `gNBs.[0]`
|
||||
@@ -316,43 +281,32 @@ To simulate a LEO satellite channel model with rfsimulator in UL (DL is simulate
|
||||
@include "channelmod_rfsimu_LEO_satellite.conf"
|
||||
```
|
||||
|
||||
The settings for a transparent LEO satellite scenario are already provided in the file `ci-scripts/conf_files/gnb.sa.band254.u0.25prb.rfsim.ntn-leo.conf`.
|
||||
Using this conf file, an example gNB command for FDD, 5 MHz BW, 15 kHz SCS, trasparent LEO satellite 5G NR NTN is this:
|
||||
So with these modifications to the file `targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.25PRB.usrpx300.conf` an example gNB command for FDD, 5 MHz BW, 15 kHz SCS, trasparent LEO satellite 5G NR NTN is this:
|
||||
```
|
||||
cd cmake_targets
|
||||
sudo ./ran_build/build/nr-softmodem -O ../ci-scripts/conf_files/gnb.sa.band254.u0.25prb.rfsim.ntn-leo.conf --rfsim
|
||||
sudo ./ran_build/build/nr-softmodem -O ../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.25PRB.usrpx300.conf --rfsim --rfsimulator.prop_delay 20
|
||||
```
|
||||
|
||||
### NR UE
|
||||
|
||||
At UE side, only few parameters have to be provided, as the UE receives most relevant parameters via SIB19 from the gNB.
|
||||
But to calculate the UE specific TA, the UE position has to be provided in the `ue.conf` file.
|
||||
Also the LEO channel model has to be configured, e.g. by using an `@include` statement, just like on the gNB side:
|
||||
```
|
||||
...
|
||||
position0 = {
|
||||
x = 0.0;
|
||||
y = 0.0;
|
||||
z = 6377900.0;
|
||||
}
|
||||
|
||||
@include "channelmod_rfsimu_LEO_satellite.conf"
|
||||
```
|
||||
At UE side, there are two main parameters to cope with the large NTN propagation delay, cellSpecificKoffset and ta-Common.
|
||||
`cellSpecificKoffset` is the same as for gNB and can be provided to the UE via command line parameter `--ntn-koffset`.
|
||||
`ta-Common` is a common timing advance and can be provided to the UE via command line parameter `--ntn-ta-common` in milliseconds.
|
||||
|
||||
So an example NR UE command for FDD, 5MHz BW, 15 kHz SCS, transparent GEO 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 238.74
|
||||
sudo ./ran_build/build/nr-uesoftmodem --band 66 -C 2152680000 --CO -400000000 -r 25 --numerology 0 --ssb 48 --rfsim --rfsimulator.prop_delay 238.74 --ntn-koffset 478 --ntn-ta-common 477.48
|
||||
```
|
||||
|
||||
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.
|
||||
For LEO satellites a third parameter specifying the NTN propagation delay drift has ben added, ta-CommonDrift.
|
||||
`ta-CommonDrift` provides the drift rate of the common timing advance and can be provided to the UE via command line parameter `--ntn-ta-commondrift` in microseconds per second.
|
||||
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.
|
||||
|
||||
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 --autonomous-ta
|
||||
sudo ./ran_build/build/nr-uesoftmodem --band 66 -C 2152680000 --CO -400000000 -r 25 --numerology 0 --ssb 48 --rfsim --rfsimulator.prop_delay 20 --rfsimulator.options chanmod -O ../targets/PROJECTS/GENERIC-NR-5GC/CONF/channelmod_rfsimu_LEO_satellite.conf --time-sync-I 0.2 --ntn-koffset 40 --ntn-ta-common 37.74 --ntn-ta-commondrift -50 --autonomous-ta
|
||||
```
|
||||
|
||||
# Specific OAI modes
|
||||
|
||||
54
doc/RUN_NR_NFAPI.md
Normal file
54
doc/RUN_NR_NFAPI.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Procedure to run nFAPI in 5G NR
|
||||
|
||||
## Contributed by 5G Testbed IISc
|
||||
|
||||
### Developers: Gokul S, Mahesh A, Aniq U R
|
||||
|
||||
## Procedure to Build gNB and UE
|
||||
|
||||
The regular commands to build gNB and UE can be used
|
||||
```
|
||||
sudo ./build_oai --gNB --nrUE
|
||||
|
||||
```
|
||||
## Procedure to run NR nFAPI using RF-Simulator
|
||||
|
||||
### Bring up another loopback interface
|
||||
|
||||
If running for the first time on your computer, or you have restarted your computer, bring up another loopback interface with this command:
|
||||
|
||||
sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up
|
||||
|
||||
### VNF command
|
||||
```
|
||||
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi VNF --noS1 --phy-test
|
||||
|
||||
```
|
||||
### PNF command
|
||||
```
|
||||
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi PNF --rfsim --phy-test --rfsimulator.serveraddr server
|
||||
|
||||
```
|
||||
### UE command
|
||||
```
|
||||
sudo ./nr-uesoftmodem --rfsim --phy-test -d --rfsimulator.serveraddr 127.0.0.1
|
||||
|
||||
```
|
||||
## Procedure to run NR nFAPI using Hardware (tested with USRP x310)
|
||||
|
||||
### VNF command
|
||||
```
|
||||
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi VNF --noS1 --phy-test
|
||||
|
||||
```
|
||||
### PNF command
|
||||
```
|
||||
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi PNF --phy-test
|
||||
|
||||
```
|
||||
### UE command
|
||||
```
|
||||
sudo ./nr-uesoftmodem --usrp-args "addr=*USRP_ADDRESS*,clock_source=external,time_source=external" --phy-test
|
||||
|
||||
```
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
| aerial2 | 172.21.16.131 | CI-Aerial2-Usage | gNB (PNF/Nvidia CUBB + VNF) | Foxconn RU, _Nvidia Aerial SDK integrated_ |
|
||||
| cacofonix | 172.21.16.150 | CI-Cacofonix-Usage | gNB (n78, FHI7.2) | |
|
||||
| matix | 172.21.19.58 | CI-Matix-Usage | gNB (n77) | N310 |
|
||||
| gracehopper1-oai | -- | Gracehopper1 | build, gNB/Aerial | _Nvidia Aerial SDK integrated_ |
|
||||
|
||||
Note: The available resources, and their current usage, is indicated here:
|
||||
- [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/):
|
||||
@@ -79,7 +78,7 @@ Note: The available resources, and their current usage, is indicated here:
|
||||
### [RAN-Container-Parent](https://jenkins-oai.eurecom.fr/job/RAN-Container-Parent/)
|
||||
|
||||
**Purpose**: automatically triggered tests on MR creation or push, from Gitlab
|
||||
Webhook ~documentation ~BUILD-ONLY ~4G-LTE ~5G-NR ~nrUE
|
||||
Webhook ~documentation ~BUILD-ONLY ~4G-LTE ~5G-NR
|
||||
|
||||
This pipeline has basically two main stages, as follows. For the image build,
|
||||
please also refer to the [dedicated documentation](../docker/README.md) for
|
||||
@@ -88,16 +87,16 @@ information on how the images are built.
|
||||
#### Image Build pipelines
|
||||
|
||||
- [RAN-ARM-Cross-Compile-Builder](https://jenkins-oai.eurecom.fr/job/RAN-ARM-Cross-Compile-Builder/)
|
||||
~BUILD-ONLY ~4G-LTE ~5G-NR ~nrUE
|
||||
~BUILD-ONLY ~4G-LTE ~5G-NR
|
||||
- orion: Cross-compilation from Intel to ARM
|
||||
- base image from `Dockerfile.base.ubuntu22.cross-arm64`
|
||||
- build image from `Dockerfile.build.ubuntu22.cross-arm64` (no target images)
|
||||
- [RAN-cppcheck](https://jenkins-oai.eurecom.fr/job/RAN-cppcheck/)
|
||||
~BUILD-ONLY ~4G-LTE ~5G-NR ~nrUE
|
||||
~BUILD-ONLY ~4G-LTE ~5G-NR
|
||||
- bellatrix
|
||||
- performs static code analysis, currently not actively enforced
|
||||
- [RAN-RHEL8-Cluster-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-RHEL8-Cluster-Image-Builder/)
|
||||
~BUILD-ONLY ~4G-LTE ~5G-NR ~nrUE
|
||||
~BUILD-ONLY ~4G-LTE ~5G-NR
|
||||
- cluster (`Asterix-OC-oaicicd-session` resource): RHEL image build using the OpenShift Cluster (using gcc/clang)
|
||||
- base image from `Dockerfile.build.rhel9`
|
||||
- build image from `Dockerfile.build.rhel9`, followed by
|
||||
@@ -111,7 +110,7 @@ information on how the images are built.
|
||||
image)
|
||||
- build image from `Dockerfile.clang.rhel9` (compilation only, artifacts not used currently)
|
||||
- [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/)
|
||||
~BUILD-ONLY ~4G-LTE ~5G-NR ~nrUE
|
||||
~BUILD-ONLY ~4G-LTE ~5G-NR
|
||||
- run formatting check from `ci-scripts/docker/Dockerfile.formatting.bionic`
|
||||
- obelix: Ubuntu 22 image build using docker (Note: builds U22 images while pipeline is named U18!)
|
||||
- base image from `Dockerfile.base.ubuntu22`
|
||||
@@ -123,22 +122,13 @@ information on how the images are built.
|
||||
- target image from `Dockerfile.lteUE.ubuntu22`
|
||||
- target image from `Dockerfile.lteRU.ubuntu22`
|
||||
- build unit tests from `ci-scripts/docker/Dockerfile.unittest.ubuntu22`, and run them
|
||||
- [RAN-Ubuntu-ARM-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu-ARM-Image-Builder/)
|
||||
~BUILD-ONLY ~4G-LTE ~5G-NR
|
||||
- gracehopper1-oai: ARM Ubuntu 22 image build using docker
|
||||
- base image from `Dockerfile.base.ubuntu22`
|
||||
- build image from `Dockerfile.build.ubuntu22`, followed by
|
||||
- target image from `Dockerfile.gNB.ubuntu22`
|
||||
- target image from `Dockerfile.nr-cuup.ubuntu22`
|
||||
- target image from `Dockerfile.nrUE.ubuntu22`
|
||||
- target image from `Dockerfile.gNB.aerial.ubuntu22`
|
||||
|
||||
#### Image Test pipelines
|
||||
|
||||
- [OAI-CN5G-COTS-UE-Test](https://jenkins-oai.eurecom.fr/job/OAI-CN5G-COTS-UE-Test/)
|
||||
~5G-NR
|
||||
- using 5GC bench (resources `CI-Cetautomatix-OC-oaicicd-session`, `CI-Dogmatix-CN5G-gNB`): Attach/Detach of UE with multiple PDU sessions
|
||||
- [OAI-FLEXRIC-RAN-Integration-Test](https://jenkins-oai.eurecom.fr/job/OAI-FLEXRIC-RAN-Integration-Test/) ~5G-NR ~nrUE
|
||||
- [OAI-FLEXRIC-RAN-Integration-Test](https://jenkins-oai.eurecom.fr/job/OAI-FLEXRIC-RAN-Integration-Test/) ~5G-NR
|
||||
- selfix (gNB, nrUE, OAI 5GC, FlexRIC)
|
||||
- uses RFsimulator, tests FlexRIC/E2 interface and xApps
|
||||
- [RAN-gNB-N300-Timing-Phytest-LDPC](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-gNB-N300-Timing-Phytest-LDPC/)
|
||||
@@ -170,7 +160,7 @@ information on how the images are built.
|
||||
- nepes + B200 (eNB), ofqot + B200 (gNB), idefix + Quectel, nepes w/ ltebox
|
||||
- basic NSA test
|
||||
- [RAN-PhySim-Cluster](https://jenkins-oai.eurecom.fr/job/RAN-PhySim-Cluster/)
|
||||
~4G-LTE ~5G-NR ~nrUE
|
||||
~4G-LTE ~5G-NR
|
||||
- cluster (`Asterix-OC-oaicicd-session` resource), tests in OpenShift Cluster
|
||||
- unitary simulators (`nr_dlsim`, etc.)
|
||||
- see [`./physical-simulators.md`](./physical-simulators.md) for an overview
|
||||
@@ -179,7 +169,7 @@ information on how the images are built.
|
||||
- cacofonix (eNB, lteUE, OAI EPC)
|
||||
- uses RFsimulator, for FDD 5, 10, 20MHz with core, 5MHz noS1
|
||||
- [RAN-RF-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-5G/)
|
||||
~5G-NR ~nrUE
|
||||
~5G-NR
|
||||
- cacofonix (gNB, nrUE, OAI 5GC)
|
||||
- uses RFsimulator, TDD 40MHz, FDD 40MHz, F1 split
|
||||
- [RAN-SA-AW2S-CN5G](https://jenkins-oai.eurecom.fr/job/RAN-SA-AW2S-CN5G/)
|
||||
@@ -192,7 +182,7 @@ information on how the images are built.
|
||||
- ofqot + B200, idefix + Quectel, nepes w/ sabox
|
||||
- basic SA test (20 MHz TDD), F1, reestablishment, ...
|
||||
- [RAN-SA-OAIUE-CN5G](https://jenkins-oai.eurecom.fr/job/RAN-SA-OAIUE-CN5G/)
|
||||
~5G-NR ~nrUE
|
||||
~5G-NR
|
||||
- 5G-NR SA test setup: gNB on avra + N310, OAIUE on caracal + N310, OAI CN5G
|
||||
- OpenShift cluster for CN deployment and container images for gNB and UE deployment
|
||||
- [RAN-SA-AERIAL-CN5G](https://jenkins-oai.eurecom.fr/job/RAN-SA-AERIAL-CN5G/)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
OAI uses/supports a number of environment variables, documented in the following:
|
||||
|
||||
- `NFAPI_TRACE_LEVEL`: set the nfapi custom logging framework's log level; can be one of `error`, `warn`, `note`, `info`, `debug`. Default is `warn`.
|
||||
- `NFAPI_TRACE_LEVEL`: set the nfapi custom logging framework's log level; can be one of `error`, `warn`, `note`, `info`, `debug`
|
||||
- `NR_AWGN_RESULTS_DIR`: directory containing BLER curves for L2simulator channel modelling in SISO case
|
||||
- `NR_MIMO2x2_AWGN_RESULTS_DIR`: directory containing BLER curves for L2simulator channel modelling in 2x2 MIMO case
|
||||
- `NVRAM_DIR`: directory to read/write NVRAM data in (5G) `nvram` tool; if not defined, will use `PWD` (working directory)
|
||||
|
||||
137
doc/nfapi.md
137
doc/nfapi.md
@@ -1,137 +0,0 @@
|
||||
This document describes the SmallCellForum (SCF) (n)FAPI split in 5G, i.e.,
|
||||
between the MAC/L2 and PHY/L1.
|
||||
|
||||
The interested reader is recommended to read a copy of the SCF 222.10
|
||||
specification ("FAPI"). This includes information on what is P5, P7, and how
|
||||
FAPI works. The currently used version is SCF 222.10.02, with some messages
|
||||
upgraded to SCF 222.10.04 due to bugfixes in the spec. Further information
|
||||
about nFAPI can be found in SCF 225.2.0.
|
||||
|
||||
# Quickstart
|
||||
|
||||
Compile OAI as normal. Start the CN and make sure that the VNF configuration
|
||||
matches the PLMN/IP addresses. Then, run the VNF
|
||||
|
||||
sudo NFAPI_TRACE_LEVEL=info ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.106prb.nfapi.conf --nfapi VNF
|
||||
|
||||
Afterwards, start and connect the PNF
|
||||
|
||||
sudo NFAPI_TRACE_LEVEL=info ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.conf --nfapi PNF --rfsim
|
||||
|
||||
Finally, you can start the UE (observe the radio configuration info in the
|
||||
VNF!)
|
||||
|
||||
sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -O ue.conf
|
||||
|
||||
You should not observe a difference between nFAPI split and monolithic.
|
||||
|
||||
|
||||
# Status
|
||||
|
||||
All FAPI message can be transferred between VNF and PNF. This is because OAI
|
||||
uses FAPI with its corresponding messages internally, whether a split is in use
|
||||
or not.
|
||||
|
||||
The nFAPI split mode supports any radio configuration that is also supported by
|
||||
the monolithic gNB, with the notable exceptions that only numerologies of 15kHz
|
||||
and 30kHz (mu=0 and mu=1, respectively) are supported.
|
||||
|
||||
The VNF requests to be notified about every slot by the PNF. No delay
|
||||
management is employed as of now; instead, the PNF sends a Slot.indication to
|
||||
the VNF in every slot (in divergence from the nFAPI spec).
|
||||
|
||||
Currently, downlink transmissions work the same in monolithic and nFAPI. In
|
||||
uplink, we observe an increased number of retransmissions, which limits the MCS
|
||||
and hence the achievable throughput (which is limited to 10-20Mbps). We are still
|
||||
debugging the root cause of this.
|
||||
|
||||
After stopping the PNF, you also have to restart the VNF.
|
||||
|
||||
When using RFsim, the system might run slower than in monolithic. This is
|
||||
because the PNF needs to slow down the execution time of a specific slot,
|
||||
because it has to send a Slot.indication to the VNF for scheduling.
|
||||
|
||||
# Configuration
|
||||
|
||||
Both PNF and VNF are run through the `nr-softmodem` executable. The type of
|
||||
mode is switched through the `--nfapi` switch, with options `MONOLITHIC`
|
||||
(default if not provided), `VNF`, `PNF`.
|
||||
|
||||
If the type is `VNF`, you have to modify the `MACRLCs.tr_s_preference`
|
||||
(transport south preference) to `nfapi`. Further, configure these options:
|
||||
|
||||
- `MACRLCs.remote_s_address` (remote south address): IP of the PNF
|
||||
- `MACRLCs.local_s_address` (local south address): IP of the VNF
|
||||
- `MACRLCs.local_s_portc` (local south port for control): VNF's P5 local port
|
||||
- `MACRLCs.remote_s_portc` (remote south port for data): PNF's P5 remote port
|
||||
- `MACRLCs.local_s_portd` (local south port for control): VNF's P5 local port
|
||||
- `MACRLCs.remote_s_portd` (remote south port for data): PNF's P7 remote port
|
||||
|
||||
Note that any L1-specific section (`L1s`, `RUs`,
|
||||
RFsimulator-specific/IF7.2-specific configuration or other radios, if
|
||||
necessary) will be ignored and can be deleted.
|
||||
|
||||
If the type is `PNF`, you have to modify modify the `L1s.tr_n_preference`
|
||||
(transport north preference) to `nfapi`. Further, configure these options:
|
||||
|
||||
- `L1s.remote_n_address` (remote north address): IP of the VNF
|
||||
- `L1s.local_n_address` (local north address): IP of the PNF
|
||||
- `L1s.local_n_portc` (local north port for control): PNF's P5 local port
|
||||
- `L1s.remote_n_portc` (remote north port for control): VNF's P5 remote port
|
||||
- `L1s.local_n_portd` (local north port for data): PNF's P7 local port
|
||||
- `L1s.remote_n_portd` (remote north port for data): VNF's P7 remote port
|
||||
|
||||
Note that this file should contain additional, L1-specific sections (`L1s`,
|
||||
`RUs` RFsimulator-specific/IF7.2-specific configuration or other radios, if
|
||||
necessary).
|
||||
|
||||
To split an existing config file `monolithic.conf` for nFAPI operation, you
|
||||
can proceed as follows:
|
||||
|
||||
- copy `monolithic.conf`, which will be your VNF file (`vnf.conf`)
|
||||
- in `vnf.conf`
|
||||
* modify `MACRLCs` section to configure south-bound nFAPI transport
|
||||
* delete `L1s`, `RUs`, and radio-specific sections.
|
||||
* in `gNBs` section, increase the `ra_ResponseWindow` by one to extend the RA
|
||||
window: this is necessary because the PNF triggers the scheduler in the VNF
|
||||
in advance, which might make the RA window more likely to run out
|
||||
- copy `monolithic.conf`, which will be your PNF file (`pnf.conf`)
|
||||
- in `pnf.conf`
|
||||
* modify `L1s` section to configure north-bound nFAPI transport (make sure it
|
||||
matches the `MACRLCs` section for `vnf.conf`
|
||||
* delete all the `gNBs`, `MACRLCs`, `security` sections (they are not needed)
|
||||
- if you have root-level options in `monolithic.conf`, such as
|
||||
`usrp-tx-thread-config` or `tune-offset`, make sure to to add them to
|
||||
`pnf.conf`, or provide them on the command line for the PNF.
|
||||
- to run, proceed as described in the quick start above.
|
||||
|
||||
Note: all L1-specific options have to be passed to the PNF, and remaining
|
||||
options to the VNF.
|
||||
|
||||
# nFAPI logging system
|
||||
|
||||
nFAPI has its own logging system, independent of OAI's. It can be activated by
|
||||
setting the `NFAPI_TRACE_LEVEL` environment variable to an appropriate value;
|
||||
see [the environment variables documentation](./environment-variables.md) for
|
||||
more info.
|
||||
|
||||
To see the (any) periodical output at the PNF, define `NFAPI_TRACE_LEVEL=info`.
|
||||
This output shows:
|
||||
|
||||
```
|
||||
41056.739654 [I] 3556767424: pnf_p7_slot_ind: [P7:1] msgs ontime 489 thr DL 0.06 UL 0.01 msg late 0 (vtime)
|
||||
```
|
||||
|
||||
The first numbers are timestamps. `pnf_p7_slot_ind` is the name of the
|
||||
functions that prints the output. `[P7:1]` refers to the fact that these are
|
||||
information on P7, of PHY ID 1. Finally, `msgs ontime 489` means that in the
|
||||
last window (since the last print), 489 messages arrived at the PNF in total.
|
||||
The combined throughput of `TX_data.requests` (DL traffic) was 0.06 Mbps; note
|
||||
that this includes SIB1 and other periodical data channels. In UL, 0.01 Mbps
|
||||
have been sent through `RX_data.indication`. `msg late 0` means that 0 packets
|
||||
have been late. _This number is an aggregate over the total runtime_, unlike
|
||||
the other messages. Finally, `(vtime)` is a reminder that the calculations are
|
||||
done over virtual time, i.e., frames/slots as executed by the 5G Systems. For
|
||||
instance, these numbers might be slightly higher or slower in RFsim than in
|
||||
wall-clock time, depending if the system advances faster or slower than
|
||||
wall-clock time.
|
||||
@@ -72,7 +72,6 @@ COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_ci.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_yaml.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libvrtsim.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=gnb-base \
|
||||
|
||||
@@ -69,7 +69,6 @@ COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_ci.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_yaml.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libvrtsim.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=gnb-base \
|
||||
|
||||
@@ -77,18 +77,7 @@ RUN apt-get update && \
|
||||
# library version. Installing it above would install the wrong version. Hence,
|
||||
# copy the right version from ran-build. When upgrading to Ubuntu24, install
|
||||
# the correct one above!
|
||||
# note: this dockerfile should work for both x86 and arm, hence the glob below
|
||||
# which should either match "x86_64" (x86) or "aarch64" (ARM); since the target
|
||||
# directory needs to be also one of those two, but globs don't work in target
|
||||
# directories, work around this with mv
|
||||
COPY --from=gnb-build /usr/lib/*-linux-gnu/libasan.so.8.0.0 /usr/lib/
|
||||
ARG TARGETPLATFORM
|
||||
RUN case "${TARGETPLATFORM}" in \
|
||||
"linux/amd64") TARGET_DIR=x86_64-linux-gnu ;; \
|
||||
"linux/arm64") TARGET_DIR=aarch64-linux-gnu ;; \
|
||||
*) exit 1 ;; \
|
||||
esac; \
|
||||
mv /usr/lib/libasan.so.8.0.0 /usr/lib/$TARGET_DIR/libasan.so.8.0.0
|
||||
COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libasan.so.8.0.0 /usr/lib/x86_64-linux-gnu/
|
||||
|
||||
WORKDIR /opt/oai-gnb/bin
|
||||
COPY --from=gnb-build \
|
||||
@@ -110,7 +99,6 @@ COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_5Gue.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_rrc.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_o1.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libvrtsim.so \
|
||||
/usr/local/lib/
|
||||
|
||||
# Now we are copying from builder-image the UHD files.
|
||||
|
||||
@@ -54,18 +54,7 @@ RUN apt-get update && \
|
||||
# library version. Installing it above would install the wrong version. Hence,
|
||||
# copy the right version from ran-build. When upgrading to Ubuntu24, install
|
||||
# the correct one above!
|
||||
# note: this dockerfile should work for both x86 and arm, hence the glob below
|
||||
# which should either match "x86_64" (x86) or "aarch64" (ARM); since the target
|
||||
# directory needs to be also one of those two, but globs don't work in target
|
||||
# directories, work around this with mv
|
||||
COPY --from=gnb-build /usr/lib/*-linux-gnu/libasan.so.8.0.0 /usr/lib/
|
||||
ARG TARGETPLATFORM
|
||||
RUN case "${TARGETPLATFORM}" in \
|
||||
"linux/amd64") TARGET_DIR=x86_64-linux-gnu ;; \
|
||||
"linux/arm64") TARGET_DIR=aarch64-linux-gnu ;; \
|
||||
*) exit 1 ;; \
|
||||
esac; \
|
||||
mv /usr/lib/libasan.so.8.0.0 /usr/lib/$TARGET_DIR/libasan.so.8.0.0
|
||||
COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libasan.so.8.0.0 /usr/lib/x86_64-linux-gnu/
|
||||
## Copy E2 SM models
|
||||
COPY --from=gnb-build /usr/local/lib/flexric /usr/local/lib/flexric
|
||||
|
||||
|
||||
@@ -75,7 +75,6 @@ COPY --from=nr-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_5Gue.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_yaml.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libvrtsim.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=nr-ue-base \
|
||||
|
||||
@@ -72,7 +72,6 @@ COPY --from=nr-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_5Gue.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_yaml.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libvrtsim.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=nr-ue-base \
|
||||
|
||||
@@ -77,18 +77,7 @@ RUN apt-get update && \
|
||||
# library version. Installing it above would install the wrong version. Hence,
|
||||
# copy the right version from ran-build. When upgrading to Ubuntu24, install
|
||||
# the correct one above!
|
||||
# note: this dockerfile should work for both x86 and arm, hence the glob below
|
||||
# which should either match "x86_64" (x86) or "aarch64" (ARM); since the target
|
||||
# directory needs to be also one of those two, but globs don't work in target
|
||||
# directories, work around this with mv
|
||||
COPY --from=nr-ue-build /usr/lib/*-linux-gnu/libasan.so.8.0.0 /usr/lib/
|
||||
ARG TARGETPLATFORM
|
||||
RUN case "${TARGETPLATFORM}" in \
|
||||
"linux/amd64") TARGET_DIR=x86_64-linux-gnu ;; \
|
||||
"linux/arm64") TARGET_DIR=aarch64-linux-gnu ;; \
|
||||
*) exit 1 ;; \
|
||||
esac; \
|
||||
mv /usr/lib/libasan.so.8.0.0 /usr/lib/$TARGET_DIR/libasan.so.8.0.0
|
||||
COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libasan.so.8.0.0 /usr/lib/x86_64-linux-gnu/
|
||||
|
||||
WORKDIR /opt/oai-nr-ue/bin
|
||||
COPY --from=nr-ue-build \
|
||||
@@ -110,7 +99,6 @@ COPY --from=nr-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_ciUE.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_5Gue.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_yaml.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libvrtsim.so \
|
||||
/usr/local/lib/
|
||||
|
||||
# Now we are copying from builder-image the UHD files.
|
||||
|
||||
@@ -568,7 +568,7 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,
|
||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||
int ret;
|
||||
LOG_D(PHY,"ENTERED wakeup_rxtx, %d.%d\n",ru_proc->frame_rx,ru_proc->tti_rx);
|
||||
// wake up TX for subframe n+sf_ahead
|
||||
// wake up TX for subframe n+sl_ahead
|
||||
// lock the TX mutex and make sure the thread is ready
|
||||
AssertFatal((ret=pthread_mutex_lock(&L1_proc->mutex)) == 0,"mutex_lock returns %d\n", ret);
|
||||
|
||||
|
||||
@@ -195,15 +195,6 @@ void handle_nr_srs_measurements(const module_id_t module_id,
|
||||
/* forward declarations */
|
||||
void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]);
|
||||
|
||||
/* TODO these declarations are to be removed */
|
||||
void nr_schedule_dl_tti_req(void) {};
|
||||
void nr_schedule_ul_dci_req() {};
|
||||
void nr_schedule_tx_req() {};
|
||||
void nr_schedule_ul_tti_req() {};
|
||||
void nr_slot_select() {};
|
||||
void NR_UL_indication(NR_UL_IND_t *UL_INFO) {};
|
||||
void gNB_dlsch_ulsch_scheduler() {};
|
||||
|
||||
/*---------------------BMC: timespec helpers -----------------------------*/
|
||||
|
||||
struct timespec min_diff_time = { .tv_sec = 0, .tv_nsec = 0 };
|
||||
|
||||
@@ -1726,8 +1726,7 @@ void *UE_thread(void *arg) {
|
||||
pthread_mutex_unlock(&sync_mutex);
|
||||
*/
|
||||
wait_sync("UE thread");
|
||||
|
||||
#ifdef NAS_BUILT_IN_UE
|
||||
#ifdef NAS_UE
|
||||
MessageDef *message_p;
|
||||
message_p = itti_alloc_new_message(TASK_NAS_UE, 0, INITIALIZE_MESSAGE);
|
||||
itti_send_msg_to_task (TASK_NAS_UE, UE->Mod_id + NB_eNB_INST, message_p);
|
||||
@@ -2090,7 +2089,7 @@ void init_UE_single_thread_stub(int nb_inst) {
|
||||
AssertFatal(PHY_vars_UE_g[i][0]!=NULL,"PHY_vars_UE_g[inst][0] is NULL\n");
|
||||
|
||||
if(NFAPI_MODE==NFAPI_UE_STUB_PNF || NFAPI_MODE==NFAPI_MODE_STANDALONE_PNF) {
|
||||
#ifdef NAS_BUILT_IN_UE
|
||||
#ifdef NAS_UE
|
||||
MessageDef *message_p;
|
||||
message_p = itti_alloc_new_message(TASK_NAS_UE, 0, INITIALIZE_MESSAGE);
|
||||
itti_send_msg_to_task (TASK_NAS_UE, i + NB_eNB_INST, message_p);
|
||||
|
||||
@@ -155,12 +155,6 @@ double cpuf;
|
||||
extern char uecap_xer[1024];
|
||||
char uecap_xer_in=0;
|
||||
|
||||
/* TODO these declarations are to be removed */
|
||||
void nr_schedule_dl_tti_req(void) {};
|
||||
void nr_schedule_ul_dci_req() {};
|
||||
void nr_schedule_tx_req() {};
|
||||
void nr_schedule_ul_tti_req() {};
|
||||
void nr_slot_select() {};
|
||||
|
||||
/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
|
||||
* this is very hackish - find a proper solution
|
||||
|
||||
@@ -172,7 +172,6 @@ int main(int argc, char **argv)
|
||||
MessageDef *msg = RCconfig_NR_CU_E1(&e1type);
|
||||
AssertFatal(msg != NULL, "Send init to task for E1AP UP failed\n");
|
||||
itti_send_msg_to_task(TASK_CUUP_E1, 0, msg);
|
||||
LOG_D(E1AP, "Send E1AP REGISTER REQ to TASK_CUUP_E1\n");
|
||||
|
||||
#ifdef E2_AGENT
|
||||
//////////////////////////////////
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "assertions.h"
|
||||
#include <common/utils/LOG/log.h>
|
||||
#include <common/utils/system.h>
|
||||
#include "rt_profiling.h"
|
||||
|
||||
#include "PHY/types.h"
|
||||
|
||||
@@ -48,6 +49,7 @@
|
||||
#include "PHY/MODULATION/nr_modulation.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
|
||||
#include "openair2/NR_PHY_INTERFACE/nr_sched_response.h"
|
||||
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
||||
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
|
||||
#include "radio/COMMON/common_lib.h"
|
||||
@@ -89,6 +91,12 @@ static void tx_func(processingData_L1tx_t *info)
|
||||
int slot_tx = info->slot;
|
||||
int frame_rx = info->frame_rx;
|
||||
int slot_rx = info->slot_rx;
|
||||
int64_t absslot_tx = info->timestamp_tx / info->gNB->frame_parms.get_samples_per_slot(slot_tx, &info->gNB->frame_parms);
|
||||
int64_t absslot_rx = absslot_tx - info->gNB->RU_list[0]->sl_ahead;
|
||||
if (absslot_rx < 0) {
|
||||
LOG_W(NR_PHY, "Slot ahead %d is larger than absslot_tx %ld. Cannot start TX yet.\n", info->gNB->RU_list[0]->sl_ahead, absslot_tx);
|
||||
return;
|
||||
}
|
||||
LOG_D(NR_PHY, "%d.%d running tx_func\n", frame_tx, slot_tx);
|
||||
PHY_VARS_gNB *gNB = info->gNB;
|
||||
module_id_t module_id = gNB->Mod_id;
|
||||
@@ -126,6 +134,8 @@ static void tx_func(processingData_L1tx_t *info)
|
||||
if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT || get_softmodem_params()->continuous_tx) {
|
||||
start_meas(&info->gNB->phy_proc_tx);
|
||||
phy_procedures_gNB_TX(info, frame_tx, slot_tx, 1);
|
||||
const int rt_prof_idx = absslot_rx % RT_PROF_DEPTH;
|
||||
clock_gettime(CLOCK_MONOTONIC, &info->gNB->rt_L1_profiling.return_L1_TX[rt_prof_idx]);
|
||||
|
||||
PHY_VARS_gNB *gNB = info->gNB;
|
||||
processingData_RU_t syncMsgRU;
|
||||
@@ -137,14 +147,9 @@ static void tx_func(processingData_L1tx_t *info)
|
||||
ru_tx_func((void *)&syncMsgRU);
|
||||
stop_meas(&info->gNB->phy_proc_tx);
|
||||
}
|
||||
|
||||
if (NFAPI_MODE == NFAPI_MONOLITHIC) {
|
||||
/* this thread is done with the sched_info, decrease the reference counter.
|
||||
* This only applies for monolithic; in the PNF, the memory is allocated in
|
||||
* a ring buffer that should never be overwritten (one frame duration). */
|
||||
LOG_D(NR_PHY, "Calling deref_sched_response for id %d (tx_func) in %d.%d\n", info->sched_response_id, frame_tx, slot_tx);
|
||||
deref_sched_response(info->sched_response_id);
|
||||
}
|
||||
/* this thread is done with the sched_info, decrease the reference counter */
|
||||
LOG_D(NR_PHY, "Calling deref_sched_response for id %d (tx_func) in %d.%d\n", info->sched_response_id, frame_tx, slot_tx);
|
||||
deref_sched_response(info->sched_response_id);
|
||||
}
|
||||
|
||||
void *L1_rx_thread(void *arg)
|
||||
@@ -182,6 +187,24 @@ static void rx_func(processingData_L1_t *info)
|
||||
int frame_rx = info->frame_rx;
|
||||
int slot_rx = info->slot_rx;
|
||||
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
|
||||
int cumul_samples = gNB->frame_parms.get_samples_per_slot(0, &gNB->frame_parms);
|
||||
int i = 1;
|
||||
for (; i < gNB->frame_parms.slots_per_subframe / 2; i++)
|
||||
cumul_samples += gNB->frame_parms.get_samples_per_slot(i, &gNB->frame_parms);
|
||||
int samples = cumul_samples / i;
|
||||
int64_t absslot_tx = info->timestamp_tx / samples;
|
||||
int64_t absslot_rx = absslot_tx - gNB->RU_list[0]->sl_ahead;
|
||||
int rt_prof_idx = absslot_rx % RT_PROF_DEPTH;
|
||||
clock_gettime(CLOCK_MONOTONIC, &info->gNB->rt_L1_profiling.start_L1_RX[rt_prof_idx]);
|
||||
|
||||
// *******************************************************************
|
||||
|
||||
if (NFAPI_MODE == NFAPI_MODE_PNF) {
|
||||
// I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
|
||||
// LOG_D(PHY, "oai_nfapi_slot_ind(frame:%u, slot:%d) ********\n", frame_rx, slot_rx);
|
||||
handle_nr_slot_ind(frame_rx, slot_rx);
|
||||
}
|
||||
// ****************************************
|
||||
|
||||
// RX processing
|
||||
int rx_slot_type = nr_slot_select(cfg, frame_rx, slot_rx);
|
||||
@@ -218,6 +241,7 @@ static void rx_func(processingData_L1_t *info)
|
||||
gNB->if_inst->NR_UL_indication(&UL_INFO);
|
||||
stop_meas(&gNB->ul_indication_stats);
|
||||
|
||||
#ifndef OAI_FHI72
|
||||
notifiedFIFO_elt_t *res = newNotifiedFIFO_elt(sizeof(processingData_L1_t), 0, &gNB->L1_rx_out, NULL);
|
||||
processingData_L1_t *syncMsg = NotifiedFifoData(res);
|
||||
syncMsg->gNB = gNB;
|
||||
@@ -226,8 +250,10 @@ static void rx_func(processingData_L1_t *info)
|
||||
res->key = slot_rx;
|
||||
LOG_D(NR_PHY, "Signaling completion for %d.%d (mod_slot %d) on L1_rx_out\n", frame_rx, slot_rx, slot_rx % RU_RX_SLOT_DEPTH);
|
||||
pushNotifiedFIFO(&gNB->L1_rx_out, res);
|
||||
#endif
|
||||
}
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &info->gNB->rt_L1_profiling.return_L1_RX[rt_prof_idx]);
|
||||
}
|
||||
|
||||
static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size_t outputlen) {
|
||||
@@ -305,13 +331,7 @@ void *nrL1_stats_thread(void *param) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
void init_gNB_Tpool(int inst)
|
||||
{
|
||||
AssertFatal(NFAPI_MODE == NFAPI_MODE_PNF || NFAPI_MODE == NFAPI_MONOLITHIC,
|
||||
"illegal NFAPI_MODE %d (%s): it cannot have an L1\n",
|
||||
NFAPI_MODE,
|
||||
nfapi_get_strmode());
|
||||
|
||||
void init_gNB_Tpool(int inst) {
|
||||
PHY_VARS_gNB *gNB;
|
||||
gNB = RC.gNB[inst];
|
||||
gNB_L1_proc_t *proc = &gNB->proc;
|
||||
@@ -344,7 +364,8 @@ void init_gNB_Tpool(int inst)
|
||||
// this will be removed when the msgDataTx is not necessary anymore
|
||||
gNB->msgDataTx = msgDataTx;
|
||||
|
||||
if (!IS_SOFTMODEM_NOSTATS)
|
||||
if ((!get_softmodem_params()->emulate_l1) && (!IS_SOFTMODEM_NOSTATS) && (NFAPI_MODE != NFAPI_MODE_VNF)
|
||||
&& (NFAPI_MODE != NFAPI_MODE_AERIAL))
|
||||
threadCreate(&proc->L1_stats_thread, nrL1_stats_thread, (void *)gNB, "L1_stats", -1, OAI_PRIORITY_RT_LOW);
|
||||
}
|
||||
|
||||
@@ -363,7 +384,8 @@ void term_gNB_Tpool(int inst) {
|
||||
abortNotifiedFIFO(&gNB->L1_rx_out);
|
||||
|
||||
gNB_L1_proc_t *proc = &gNB->proc;
|
||||
pthread_join(proc->L1_stats_thread, NULL);
|
||||
if (!get_softmodem_params()->emulate_l1)
|
||||
pthread_join(proc->L1_stats_thread, NULL);
|
||||
}
|
||||
|
||||
/// eNB kept in function name for nffapi calls, TO FIX
|
||||
@@ -371,7 +393,7 @@ void init_eNB_afterRU(void) {
|
||||
int inst,ru_id,i,aa;
|
||||
PHY_VARS_gNB *gNB;
|
||||
|
||||
for (inst=0; inst<RC.nb_nr_L1_inst; inst++) {
|
||||
for (inst=0; inst<RC.nb_nr_inst; inst++) {
|
||||
gNB = RC.gNB[inst];
|
||||
|
||||
phy_init_nr_gNB(gNB);
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include "common/utils/assertions.h"
|
||||
#include "common/utils/system.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "rt_profiling.h"
|
||||
|
||||
#include "radio/COMMON/common_lib.h"
|
||||
#include "radio/ETHERNET/ethernet_lib.h"
|
||||
@@ -68,6 +69,7 @@ static int DEFRUTPCORES[] = {-1,-1,-1,-1};
|
||||
#include <nfapi/oai_integration/vendor_ext.h>
|
||||
#include "executables/nr-softmodem-common.h"
|
||||
|
||||
int sl_ahead;
|
||||
static void NRRCconfig_RU(configmodule_interface_t *cfg);
|
||||
|
||||
/*************************************************************/
|
||||
@@ -1036,6 +1038,15 @@ void ru_tx_func(void *param)
|
||||
int print_frame = 8;
|
||||
char filename[40];
|
||||
|
||||
int cumul_samples = fp->get_samples_per_slot(0, fp);
|
||||
int i = 1;
|
||||
for (; i < fp->slots_per_subframe / 2; i++)
|
||||
cumul_samples += fp->get_samples_per_slot(i, fp);
|
||||
int samples = cumul_samples / i;
|
||||
int64_t absslot_tx = info->timestamp_tx / samples;
|
||||
int64_t absslot_rx = absslot_tx - ru->sl_ahead;
|
||||
int rt_prof_idx = absslot_rx % RT_PROF_DEPTH;
|
||||
clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.start_RU_TX[rt_prof_idx]);
|
||||
// do TX front-end processing if needed (precoding and/or IDFTs)
|
||||
if (ru->feptx_prec)
|
||||
ru->feptx_prec(ru,frame_tx,slot_tx);
|
||||
@@ -1082,48 +1093,11 @@ void ru_tx_func(void *param)
|
||||
}//for (i=0; i<ru->nb_tx; i++)
|
||||
}//if(frame_tx == print_frame)
|
||||
}//else emulate_rf
|
||||
}
|
||||
clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.return_RU_TX[rt_prof_idx]);
|
||||
struct timespec *t0=&ru->rt_ru_profiling.start_RU_TX[rt_prof_idx];
|
||||
struct timespec *t1=&ru->rt_ru_profiling.return_RU_TX[rt_prof_idx];
|
||||
|
||||
/* @brief wait for the next RX TTI to be free
|
||||
*
|
||||
* Certain radios, e.g., RFsim, can run faster than real-time. This might
|
||||
* create problems, e.g., if RX and TX get too far from each other. This
|
||||
* function ensures that a maximum of 4 RX slots are processed at a time (and
|
||||
* not more than those four are started).
|
||||
*
|
||||
* Through the queue L1_rx_out, we are informed about completed RX jobs.
|
||||
* rx_tti_busy keeps track of individual slots that have been started; this
|
||||
* function blocks until the current frame/slot is completed, signaled through
|
||||
* a message.
|
||||
*
|
||||
* @param L1_rx_out the queue from which to read completed RX jobs
|
||||
* @param rx_tti_busy array to mark RX job completion
|
||||
* @param frame_rx the frame to wait for
|
||||
* @param slot_rx the slot to wait for
|
||||
*/
|
||||
static bool wait_free_rx_tti(notifiedFIFO_t *L1_rx_out, bool rx_tti_busy[RU_RX_SLOT_DEPTH], int frame_rx, int slot_rx)
|
||||
{
|
||||
int idx = slot_rx % RU_RX_SLOT_DEPTH;
|
||||
if (rx_tti_busy[idx]) {
|
||||
bool not_done = true;
|
||||
LOG_D(NR_PHY, "%d.%d Waiting to access RX slot %d\n", frame_rx, slot_rx, idx);
|
||||
// block and wait for frame_rx/slot_rx free from previous slot processing.
|
||||
// as we can get other slots, we loop on the queue
|
||||
while (not_done) {
|
||||
notifiedFIFO_elt_t *res = pullNotifiedFIFO(L1_rx_out);
|
||||
if (!res)
|
||||
return false;
|
||||
processingData_L1_t *info = NotifiedFifoData(res);
|
||||
LOG_D(NR_PHY, "%d.%d Got access to RX slot %d.%d (%d)\n", frame_rx, slot_rx, info->frame_rx, info->slot_rx, idx);
|
||||
rx_tti_busy[info->slot_rx % RU_RX_SLOT_DEPTH] = false;
|
||||
if ((info->slot_rx % RU_RX_SLOT_DEPTH) == idx)
|
||||
not_done = false;
|
||||
delNotifiedFIFO_elt(res);
|
||||
}
|
||||
}
|
||||
// set the tti to busy: the caller will process this slot now
|
||||
rx_tti_busy[idx] = true;
|
||||
return true;
|
||||
LOG_D(PHY,"rt_prof_idx %d : RU_TX time %d\n",rt_prof_idx,(int)(1e9 * (t1->tv_sec - t0->tv_sec) + (t1->tv_nsec-t0->tv_nsec)));
|
||||
}
|
||||
|
||||
void *ru_thread(void *param)
|
||||
@@ -1139,7 +1113,9 @@ void *ru_thread(void *param)
|
||||
char threadname[40];
|
||||
int initial_wait = 0;
|
||||
|
||||
#ifndef OAI_FHI72
|
||||
bool rx_tti_busy[RU_RX_SLOT_DEPTH] = {false};
|
||||
#endif
|
||||
// set default return value
|
||||
ru_thread_status = 0;
|
||||
// set default return value
|
||||
@@ -1240,7 +1216,29 @@ void *ru_thread(void *param)
|
||||
struct timespec slot_start;
|
||||
clock_gettime(CLOCK_MONOTONIC, &slot_start);
|
||||
|
||||
struct timespec slot_duration;
|
||||
slot_duration.tv_sec = 0;
|
||||
//slot_duration.tv_nsec = 0.5e6;
|
||||
slot_duration.tv_nsec = 0.5e6;
|
||||
|
||||
|
||||
|
||||
while (!oai_exit) {
|
||||
|
||||
if (NFAPI_MODE==NFAPI_MODE_VNF || NFAPI_MODE == NFAPI_MODE_AERIAL ) {
|
||||
// We should make a VNF main loop with proper tasks calls in case of VNF
|
||||
slot_start = timespec_add(slot_start,slot_duration);
|
||||
struct timespec curr_time;
|
||||
clock_gettime(CLOCK_MONOTONIC, &curr_time);
|
||||
struct timespec sleep_time;
|
||||
|
||||
if((slot_start.tv_sec > curr_time.tv_sec) ||
|
||||
(slot_start.tv_sec == curr_time.tv_sec && slot_start.tv_nsec > curr_time.tv_nsec)){
|
||||
sleep_time = timespec_sub(slot_start,curr_time);
|
||||
usleep(sleep_time.tv_nsec * 1e-3);
|
||||
}
|
||||
}
|
||||
|
||||
if (slot==(fp->slots_per_frame-1)) {
|
||||
slot=0;
|
||||
frame++;
|
||||
@@ -1275,6 +1273,9 @@ void *ru_thread(void *param)
|
||||
proc->timestamp_tx += fp->get_samples_per_slot(i % fp->slots_per_frame, fp);
|
||||
proc->tti_tx = (proc->tti_rx + ru->sl_ahead) % fp->slots_per_frame;
|
||||
proc->frame_tx = proc->tti_rx > proc->tti_tx ? (proc->frame_rx + 1) & 1023 : proc->frame_rx;
|
||||
int64_t absslot_rx = proc->timestamp_rx/fp->get_samples_per_slot(proc->tti_rx,fp);
|
||||
int rt_prof_idx = absslot_rx % RT_PROF_DEPTH;
|
||||
clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.return_RU_south_in[rt_prof_idx]);
|
||||
LOG_D(PHY,"AFTER fh_south_in - SFN/SL:%d%d RU->proc[RX:%d.%d TX:%d.%d] RC.gNB[0]:[RX:%d%d TX(SFN):%d]\n",
|
||||
frame,slot,
|
||||
proc->frame_rx,proc->tti_rx,
|
||||
@@ -1285,14 +1286,42 @@ void *ru_thread(void *param)
|
||||
if (ru->idx != 0)
|
||||
proc->frame_tx = (proc->frame_tx + proc->frame_offset) & 1023;
|
||||
|
||||
#ifndef OAI_FHI72
|
||||
// do RX front-end processing (frequency-shift, dft) if needed
|
||||
int slot_type = nr_slot_select(&ru->config, proc->frame_rx, proc->tti_rx);
|
||||
if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
|
||||
if (!wait_free_rx_tti(&gNB->L1_rx_out, rx_tti_busy, proc->frame_rx, proc->tti_rx))
|
||||
break; // nothing to wait for: we have to stop
|
||||
if (ru->feprx) {
|
||||
if (rx_tti_busy[proc->tti_rx % RU_RX_SLOT_DEPTH]) {
|
||||
bool not_done = true;
|
||||
LOG_D(NR_PHY, "%d.%d Waiting to access RX slot %d\n", proc->frame_rx, proc->tti_rx, proc->tti_rx % RU_RX_SLOT_DEPTH);
|
||||
// now we block and wait our slot memory zone is freed from previous slot processing
|
||||
// as we can get other slots ending, we loop on the queue
|
||||
notifiedFIFO_elt_t *res = NULL;
|
||||
while (not_done) {
|
||||
res = pullNotifiedFIFO(&gNB->L1_rx_out);
|
||||
if (!res)
|
||||
break;
|
||||
processingData_L1_t *info = (processingData_L1_t *)NotifiedFifoData(res);
|
||||
LOG_D(NR_PHY,
|
||||
"%d.%d Got access to RX slot %d.%d (%d)\n",
|
||||
proc->frame_rx,
|
||||
proc->tti_rx,
|
||||
info->frame_rx,
|
||||
info->slot_rx,
|
||||
proc->tti_rx % RU_RX_SLOT_DEPTH);
|
||||
rx_tti_busy[info->slot_rx % RU_RX_SLOT_DEPTH] = false;
|
||||
if ((info->slot_rx % RU_RX_SLOT_DEPTH) == (proc->tti_rx % RU_RX_SLOT_DEPTH))
|
||||
not_done = false;
|
||||
delNotifiedFIFO_elt(res);
|
||||
}
|
||||
if (!res)
|
||||
break;
|
||||
}
|
||||
// set the tti that was generated to busy
|
||||
rx_tti_busy[proc->tti_rx % RU_RX_SLOT_DEPTH] = true;
|
||||
ru->feprx(ru,proc->tti_rx);
|
||||
LOG_D(NR_PHY, "Setting %d.%d (%d) to busy\n", proc->frame_rx, proc->tti_rx, proc->tti_rx % RU_RX_SLOT_DEPTH);
|
||||
clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.return_RU_feprx[rt_prof_idx]);
|
||||
//LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1);
|
||||
LOG_D(PHY,"RU proc: frame_rx = %d, tti_rx = %d\n", proc->frame_rx, proc->tti_rx);
|
||||
gNBscopeCopy(RC.gNB[0],
|
||||
@@ -1308,32 +1337,32 @@ void *ru_thread(void *param)
|
||||
if (prach_id >= 0) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 1 );
|
||||
|
||||
T(T_GNB_PHY_PRACH_INPUT_SIGNAL,
|
||||
T_INT(proc->frame_rx),
|
||||
T_INT(proc->tti_rx),
|
||||
T_INT(0),
|
||||
T_BUFFER(&ru->common.rxdata[0][fp->get_samples_slot_timestamp(proc->tti_rx - 1, fp, 0) /*-ru->N_TA_offset*/],
|
||||
(fp->get_samples_per_slot(proc->tti_rx - 1, fp) + fp->get_samples_per_slot(proc->tti_rx, fp)) * 4));
|
||||
RU_PRACH_list_t *p = ru->prach_list + prach_id;
|
||||
int N_dur = get_nr_prach_duration(p->fmt);
|
||||
T(T_GNB_PHY_PRACH_INPUT_SIGNAL, T_INT(proc->frame_rx), T_INT(proc->tti_rx), T_INT(0),
|
||||
T_BUFFER(&ru->common.rxdata[0][fp->get_samples_slot_timestamp(proc->tti_rx-1,fp,0)]/*-ru->N_TA_offset*/, fp->get_samples_per_slot(proc->tti_rx,fp)*4*2));
|
||||
int N_dur = get_nr_prach_duration(ru->prach_list[prach_id].fmt);
|
||||
|
||||
for (int prach_oc = 0; prach_oc < p->num_prach_ocas; prach_oc++) {
|
||||
int prachStartSymbol = p->prachStartSymbol + prach_oc * N_dur;
|
||||
for (int prach_oc = 0; prach_oc<ru->prach_list[prach_id].num_prach_ocas; prach_oc++) {
|
||||
int prachStartSymbol = ru->prach_list[prach_id].prachStartSymbol + prach_oc * N_dur;
|
||||
//comment FK: the standard 38.211 section 5.3.2 has one extra term +14*N_RA_slot. This is because there prachStartSymbol is given wrt to start of the 15kHz slot or 60kHz slot. Here we work slot based, so this function is anyway only called in slots where there is PRACH. Its up to the MAC to schedule another PRACH PDU in the case there are there N_RA_slot \in {0,1}.
|
||||
rx_nr_prach_ru(ru,
|
||||
p->fmt, // could also use format
|
||||
p->numRA,
|
||||
ru->prach_list[prach_id].fmt, //could also use format
|
||||
ru->prach_list[prach_id].numRA,
|
||||
prachStartSymbol,
|
||||
p->slot,
|
||||
prach_oc,
|
||||
proc->frame_rx,
|
||||
proc->tti_rx);
|
||||
}
|
||||
clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.return_RU_prachrx[rt_prof_idx]);
|
||||
free_nr_ru_prach_entry(ru,prach_id);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 0);
|
||||
} // end if (prach_id >= 0)
|
||||
} // end if (prach_id > 0)
|
||||
} // end if (ru->feprx)
|
||||
else {
|
||||
memset(&ru->rt_ru_profiling.return_RU_feprx[rt_prof_idx],0,sizeof(struct timespec));
|
||||
memset(&ru->rt_ru_profiling.return_RU_prachrx[rt_prof_idx],0,sizeof(struct timespec));
|
||||
}
|
||||
} // end if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
|
||||
#endif
|
||||
|
||||
notifiedFIFO_elt_t *resTx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t), 0, &gNB->L1_tx_out, NULL);
|
||||
processingData_L1tx_t *syncMsgTx = NotifiedFifoData(resTx);
|
||||
|
||||
@@ -64,8 +64,8 @@
|
||||
#define CONFIG_HLP_DLBW_PHYTEST "Set the number of PRBs used for DLSCH in PHYTEST mode\n"
|
||||
#define CONFIG_HLP_ULBW_PHYTEST "Set the number of PRBs used for ULSCH in PHYTEST mode\n"
|
||||
#define CONFIG_HLP_PRB_SA "Set the number of PRBs for SA\n"
|
||||
#define CONFIG_HLP_DLBM_PHYTEST "Bitmap for DLSCH slots in period (slot 0 starts at LSB)\n"
|
||||
#define CONFIG_HLP_ULBM_PHYTEST "Bitmap for ULSCH slots in period (slot 0 starts at LSB)\n"
|
||||
#define CONFIG_HLP_DLBM_PHYTEST "Bitmap for DLSCH slots (slot 0 starts at LSB)\n"
|
||||
#define CONFIG_HLP_ULBM_PHYTEST "Bitmap for ULSCH slots (slot 0 starts at LSB)\n"
|
||||
#define CONFIG_HLP_SSC "Set the start subcarrier \n"
|
||||
#define CONFIG_HLP_TDD "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n"
|
||||
#define CONFIG_HLP_UE "Set the lte softmodem as a UE\n"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user