Merge branch 'integration_2026_w16' into 'develop'
Integration `2026.w16` * !4040 fix: issue 911 - replace timer oneshot to periodic. * !4041 Compilation without T: move to physims * !4046 fix(record_db doc): correct the path for T_messages.txt and mention use of ninja/make * !3994 Update CN5G images to release v2.2.0 and update traffic generator image * !4024 Fix fill_srs_channel_matrix * !3983 Add SIB 3,4 support, configurable SIB2 and refactor CU/DU SIB management * !4030 Miscellaneous code improvements * !4039 Verify consistency of CSI report in L2 instead of RRC * !3991 L1 RX: use queues instead of arrays and linear search for PUCCH, PUSCH, SRS, PRACH * !4011 CI: remove cppcheck, cleanup in build and license checks * !4051 Fix EMA cold-start for noise and SNR/RSSI measurements Closes #1063 See merge request oai/openairinterface5g!4048
This commit is contained in:
+45
-32
@@ -709,14 +709,15 @@ target_link_libraries(SCHED_LIB PRIVATE asn1_lte_rrc_hdrs)
|
|||||||
set(SCHED_NR_SRC
|
set(SCHED_NR_SRC
|
||||||
${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_gNB.c
|
${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_gNB.c
|
||||||
${OPENAIR1_DIR}/SCHED_NR/nr_prach_procedures.c
|
${OPENAIR1_DIR}/SCHED_NR/nr_prach_procedures.c
|
||||||
|
${OPENAIR1_DIR}/SCHED_NR/nr_ru_procedures.c
|
||||||
${OPENAIR1_DIR}/SCHED_NR/phy_frame_config_nr.c
|
${OPENAIR1_DIR}/SCHED_NR/phy_frame_config_nr.c
|
||||||
)
|
)
|
||||||
add_library(SCHED_NR_LIB ${SCHED_NR_SRC})
|
add_library(SCHED_NR_LIB ${SCHED_NR_SRC})
|
||||||
target_link_libraries(SCHED_NR_LIB PRIVATE asn1_nr_rrc_hdrs UTIL)
|
target_link_libraries(SCHED_NR_LIB PRIVATE asn1_nr_rrc_hdrs UTIL)
|
||||||
|
target_link_libraries(SCHED_NR_LIB PRIVATE NFAPI_LIB) # some FAPI messages pack "subPDUs"
|
||||||
|
|
||||||
set(SCHED_SRC_RU
|
set(SCHED_SRC_RU
|
||||||
${OPENAIR1_DIR}/SCHED/ru_procedures.c
|
${OPENAIR1_DIR}/SCHED/ru_procedures.c
|
||||||
${OPENAIR1_DIR}/SCHED_NR/nr_ru_procedures.c
|
|
||||||
${OPENAIR1_DIR}/SCHED/prach_procedures.c
|
${OPENAIR1_DIR}/SCHED/prach_procedures.c
|
||||||
)
|
)
|
||||||
add_library(SCHED_RU_LIB ${SCHED_SRC_RU})
|
add_library(SCHED_RU_LIB ${SCHED_SRC_RU})
|
||||||
@@ -752,6 +753,7 @@ set(NFAPI_SRC
|
|||||||
add_library(NFAPI_LIB ${NFAPI_SRC})
|
add_library(NFAPI_LIB ${NFAPI_SRC})
|
||||||
target_link_libraries(NFAPI_LIB PUBLIC nfapi_common)
|
target_link_libraries(NFAPI_LIB PUBLIC nfapi_common)
|
||||||
target_link_libraries(NFAPI_LIB PUBLIC nr_fapi_p5 nr_fapi_p7)
|
target_link_libraries(NFAPI_LIB PUBLIC nr_fapi_p5 nr_fapi_p7)
|
||||||
|
target_link_libraries(NFAPI_LIB PRIVATE z)
|
||||||
|
|
||||||
if(OAI_WLS)
|
if(OAI_WLS)
|
||||||
target_compile_definitions(NFAPI_LIB PRIVATE ENABLE_WLS)
|
target_compile_definitions(NFAPI_LIB PRIVATE ENABLE_WLS)
|
||||||
@@ -877,6 +879,10 @@ set(PHY_SRC
|
|||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_modulation.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_modulation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pbch.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pbch.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c
|
||||||
@@ -893,22 +899,22 @@ set(PHY_SRC
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_SRC_RU
|
set(PHY_SRC_RU
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c
|
${OPENAIR1_DIR}/PHY/if4_tools.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/drs_modulation.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/drs_modulation.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
|
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
|
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_nr.c
|
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
|
${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/gen_75KHz.cpp
|
${OPENAIR1_DIR}/PHY/MODULATION/gen_75KHz.cpp
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
|
${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
|
${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c
|
${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/nr_init_ru.c
|
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(NR_PHY_SRC_RU
|
||||||
|
${OPENAIR1_DIR}/PHY/MODULATION/nr_beamforming.c
|
||||||
|
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_nr.c
|
||||||
|
${OPENAIR1_DIR}/PHY/INIT/nr_init_ru.c
|
||||||
|
${OPENAIR1_DIR}/PHY/if4_tools.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_SRC_UE
|
set(PHY_SRC_UE
|
||||||
@@ -1068,7 +1074,7 @@ add_library(PHY_NR_COMMON ${PHY_NR_SRC_COMMON})
|
|||||||
target_link_libraries(PHY_NR_COMMON PUBLIC UTIL)
|
target_link_libraries(PHY_NR_COMMON PUBLIC UTIL)
|
||||||
|
|
||||||
add_library(PHY_NR ${PHY_NR_SRC})
|
add_library(PHY_NR ${PHY_NR_SRC})
|
||||||
target_link_libraries(PHY_NR nr_phy_common nr_common nr_fapi_p5 polar smallblock)
|
target_link_libraries(PHY_NR nr_phy_common nr_common nr_fapi_p5 polar smallblock ds)
|
||||||
|
|
||||||
add_library(PHY_NR_NO_AVX_256 ${PHY_NR_SRC})
|
add_library(PHY_NR_NO_AVX_256 ${PHY_NR_SRC})
|
||||||
target_link_libraries(PHY_NR_NO_AVX_256 nr_phy_common nr_common)
|
target_link_libraries(PHY_NR_NO_AVX_256 nr_phy_common nr_common)
|
||||||
@@ -1080,6 +1086,8 @@ target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc_hdrs nr_phy_common nr_common
|
|||||||
add_library(PHY_RU ${PHY_SRC_RU})
|
add_library(PHY_RU ${PHY_SRC_RU})
|
||||||
target_link_libraries(PHY_RU PRIVATE asn1_lte_rrc_hdrs UTIL)
|
target_link_libraries(PHY_RU PRIVATE asn1_lte_rrc_hdrs UTIL)
|
||||||
|
|
||||||
|
add_library(NR_PHY_RU ${NR_PHY_SRC_RU})
|
||||||
|
|
||||||
#Layer 2 library
|
#Layer 2 library
|
||||||
#####################
|
#####################
|
||||||
set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC)
|
set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC)
|
||||||
@@ -1742,7 +1750,7 @@ target_link_libraries(lte-softmodem PRIVATE
|
|||||||
lte_rrc nr_rrc s1ap m2ap x2ap m3ap GTPV1U SECURITY UTIL SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB
|
lte_rrc nr_rrc s1ap m2ap x2ap m3ap GTPV1U SECURITY UTIL SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB
|
||||||
PHY_COMMON PHY PHY_RU L2 L2_LTE NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
|
PHY_COMMON PHY PHY_RU L2 L2_LTE NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
|
||||||
${NAS_UE_LIB} ITTI SIMU radio_common softmodem_common
|
${NAS_UE_LIB} ITTI SIMU radio_common softmodem_common
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group dl)
|
||||||
|
|
||||||
target_link_libraries(lte-softmodem PRIVATE pthread m CONFIG_LIB rt)
|
target_link_libraries(lte-softmodem PRIVATE pthread m CONFIG_LIB rt)
|
||||||
target_link_libraries(lte-softmodem PRIVATE ${T_LIB})
|
target_link_libraries(lte-softmodem PRIVATE ${T_LIB})
|
||||||
@@ -1757,13 +1765,17 @@ add_executable(oairu
|
|||||||
${OPENAIR_DIR}/executables/lte-ru.c
|
${OPENAIR_DIR}/executables/lte-ru.c
|
||||||
${OPENAIR_DIR}/executables/ru_control.c
|
${OPENAIR_DIR}/executables/ru_control.c
|
||||||
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
|
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
|
||||||
${OPENAIR_DIR}/executables/main_ru.c
|
${OPENAIR_DIR}/executables/main_ru.c
|
||||||
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||||
)
|
)
|
||||||
target_link_libraries(oairu PRIVATE
|
target_link_libraries(oairu PRIVATE
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
SCHED_RU_LIB PHY_COMMON PHY_RU UTIL radio_common softmodem_common
|
SCHED_RU_LIB PHY_COMMON PHY_RU UTIL radio_common softmodem_common
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group dl)
|
||||||
|
|
||||||
target_link_libraries(oairu PRIVATE pthread m CONFIG_LIB rt ${T_LIB})
|
target_link_libraries(oairu PRIVATE pthread m CONFIG_LIB rt ${T_LIB})
|
||||||
target_link_libraries(oairu PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(oairu PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
@@ -1792,7 +1804,7 @@ target_link_libraries(lte-uesoftmodem PRIVATE
|
|||||||
SECURITY UTIL SCTP_CLIENT MME_APP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
|
SECURITY UTIL SCTP_CLIENT MME_APP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
|
||||||
PHY_UE PHY_RU L2_UE L2_LTE SIMU NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
|
PHY_UE PHY_RU L2_UE L2_LTE SIMU NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
|
||||||
${NAS_UE_LIB} ITTI radio_common softmodem_common
|
${NAS_UE_LIB} ITTI radio_common softmodem_common
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group dl)
|
||||||
|
|
||||||
target_link_libraries(lte-uesoftmodem PRIVATE pthread m CONFIG_LIB rt)
|
target_link_libraries(lte-uesoftmodem PRIVATE pthread m CONFIG_LIB rt)
|
||||||
target_link_libraries(lte-uesoftmodem PRIVATE ${T_LIB})
|
target_link_libraries(lte-uesoftmodem PRIVATE ${T_LIB})
|
||||||
@@ -1808,11 +1820,12 @@ add_executable(nr-oru
|
|||||||
${OPENAIR_DIR}/openair1/PHY/INIT/nr_parms.c
|
${OPENAIR_DIR}/openair1/PHY/INIT/nr_parms.c
|
||||||
${OPENAIR_DIR}/openair1/SCHED_NR/phy_frame_config_nr.c
|
${OPENAIR_DIR}/openair1/SCHED_NR/phy_frame_config_nr.c
|
||||||
${OPENAIR_DIR}/openair1/SCHED_NR/nr_prach_procedures.c
|
${OPENAIR_DIR}/openair1/SCHED_NR/nr_prach_procedures.c
|
||||||
|
${OPENAIR_DIR}/openair1/SCHED_NR/nr_ru_procedures.c
|
||||||
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
|
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
|
||||||
${OPENAIR_DIR}/executables/main_nr_ru.c
|
${OPENAIR_DIR}/executables/main_nr_ru.c
|
||||||
)
|
)
|
||||||
target_link_libraries(nr-oru PRIVATE
|
target_link_libraries(nr-oru PRIVATE
|
||||||
UTIL SCHED_RU_LIB PHY_COMMON PHY_RU PHY_NR shlib_loader z dl
|
UTIL NR_PHY_RU PHY_NR shlib_loader dl
|
||||||
radio_common softmodem_common)
|
radio_common softmodem_common)
|
||||||
target_link_libraries(nr-oru PRIVATE pthread m CONFIG_LIB rt ${T_LIB} utils
|
target_link_libraries(nr-oru PRIVATE pthread m CONFIG_LIB rt ${T_LIB} utils
|
||||||
barrier actor)
|
barrier actor)
|
||||||
@@ -1836,12 +1849,12 @@ add_executable(nr-softmodem
|
|||||||
|
|
||||||
target_link_libraries(nr-softmodem PRIVATE
|
target_link_libraries(nr-softmodem PRIVATE
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
UTIL SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU GTPV1U SECURITY
|
UTIL SCTP_CLIENT SCHED_LIB SCHED_NR_LIB PHY_NR PHY PHY_NR_COMMON NR_PHY_RU GTPV1U SECURITY
|
||||||
ITTI ${NAS_UE_LIB} lte_rrc nr_rrc
|
ITTI ${NAS_UE_LIB} nr_rrc
|
||||||
ngap s1ap L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB SIMU
|
ngap s1ap L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB SIMU
|
||||||
x2ap f1ap m2ap m3ap e1ap radio_common
|
x2ap f1ap m2ap m3ap e1ap radio_common
|
||||||
time_management softmodem_common
|
time_management softmodem_common
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group dl)
|
||||||
|
|
||||||
target_link_libraries(nr-softmodem PRIVATE pthread m CONFIG_LIB rt)
|
target_link_libraries(nr-softmodem PRIVATE pthread m CONFIG_LIB rt)
|
||||||
target_link_libraries(nr-softmodem PRIVATE ${T_LIB})
|
target_link_libraries(nr-softmodem PRIVATE ${T_LIB})
|
||||||
@@ -1881,7 +1894,7 @@ target_link_libraries(nr-cuup PRIVATE
|
|||||||
GTPV1U e1ap f1ap
|
GTPV1U e1ap f1ap
|
||||||
time_management softmodem_common
|
time_management softmodem_common
|
||||||
alg
|
alg
|
||||||
z dl pthread ${T_LIB})
|
dl pthread ${T_LIB})
|
||||||
target_link_libraries(nr-cuup PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
target_link_libraries(nr-cuup PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||||
if(E2_AGENT)
|
if(E2_AGENT)
|
||||||
target_link_libraries(nr-cuup PRIVATE e2_agent e2_agent_arg e2_ran_func_cuup)
|
target_link_libraries(nr-cuup PRIVATE e2_agent e2_agent_arg e2_ran_func_cuup)
|
||||||
@@ -1905,11 +1918,11 @@ add_executable(nr-uesoftmodem
|
|||||||
|
|
||||||
target_link_libraries(nr-uesoftmodem PRIVATE
|
target_link_libraries(nr-uesoftmodem PRIVATE
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
nr_rrc SECURITY UTIL SCHED_RU_LIB SCHED_NR_UE_LIB
|
nr_rrc SECURITY UTIL SCHED_NR_UE_LIB
|
||||||
PHY_COMMON PHY_NR_COMMON PHY_NR_UE NR_L2_UE MAC_NR_COMMON NFAPI_LIB
|
PHY_NR_COMMON PHY_NR_UE NR_L2_UE MAC_NR_COMMON NFAPI_LIB
|
||||||
ITTI SIMU radio_common
|
ITTI SIMU radio_common
|
||||||
time_management softmodem_common
|
time_management softmodem_common
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group dl)
|
||||||
|
|
||||||
target_link_libraries(nr-uesoftmodem PRIVATE pthread m CONFIG_LIB rt nr_ue_phy_meas)
|
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 ${T_LIB})
|
||||||
@@ -1983,14 +1996,14 @@ 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)
|
||||||
target_link_libraries(nr_dlschsim PRIVATE
|
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
|
-Wl,--start-group UTIL SIMU 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 physim_common
|
m pthread ${T_LIB} ITTI dl physim_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_dlschsim PRIVATE asn1_nr_rrc_hdrs)
|
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)
|
||||||
target_link_libraries(nr_pbchsim PRIVATE
|
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
|
-Wl,--start-group UTIL SIMU 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 physim_common
|
m pthread ${T_LIB} ITTI dl physim_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_pbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_pbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
@@ -2000,14 +2013,14 @@ add_executable(nr_psbchsim
|
|||||||
${NFAPI_USER_DIR}/nfapi.c
|
${NFAPI_USER_DIR}/nfapi.c
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_psbchsim PRIVATE
|
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 -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON CONFIG_LIB -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl physim_common softmodem_common
|
m pthread ${T_LIB} ITTI dl physim_common softmodem_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_psbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
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)
|
add_executable(nr_pucchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c)
|
||||||
target_link_libraries(nr_pucchsim PRIVATE
|
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
|
-Wl,--start-group UTIL SIMU 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 physim_common
|
m pthread ${T_LIB} ITTI dl physim_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_pucchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_pucchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
@@ -2019,15 +2032,15 @@ add_executable(nr_dlsim
|
|||||||
${PHY_INTERFACE_DIR}/queue_t.c
|
${PHY_INTERFACE_DIR}/queue_t.c
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_dlsim PRIVATE
|
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 CONFIG_LIB L2_NR -Wl,--end-group
|
-Wl,--start-group UTIL SIMU 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 -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl nr_ue_phy_meas physim_common
|
m pthread ${T_LIB} ITTI dl nr_ue_phy_meas physim_common NR_L2_UE
|
||||||
softmodem_common
|
softmodem_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_dlsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
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)
|
||||||
target_link_libraries(nr_prachsim PRIVATE
|
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 -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR NR_PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB CONFIG_LIB -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl physim_common)
|
m pthread ${T_LIB} ITTI dl physim_common)
|
||||||
target_link_libraries(nr_prachsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_prachsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
|
||||||
@@ -2035,7 +2048,7 @@ add_executable(nr_ulschsim
|
|||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_ulschsim PRIVATE
|
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
|
-Wl,--start-group UTIL SIMU 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 physim_common
|
m pthread ${T_LIB} ITTI dl physim_common
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_ulschsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_ulschsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
@@ -2048,8 +2061,8 @@ add_executable(nr_ulsim
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(nr_ulsim PRIVATE
|
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 CONFIG_LIB L2_NR -Wl,--end-group
|
-Wl,--start-group UTIL SIMU 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 -Wl,--end-group
|
||||||
m pthread ${T_LIB} ITTI dl nr_ue_phy_meas physim_common softmodem_common
|
m pthread ${T_LIB} ITTI dl nr_ue_phy_meas physim_common softmodem_common NR_L2_UE
|
||||||
)
|
)
|
||||||
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||||
|
|
||||||
@@ -2059,7 +2072,7 @@ add_executable(nr_srssim
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(nr_srssim PRIVATE
|
target_link_libraries(nr_srssim 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 -Wl,--end-group
|
-Wl,--start-group UTIL SIMU PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON -Wl,--end-group
|
||||||
m pthread ITTI dl nr_ue_phy_meas physim_common softmodem_common
|
m pthread ITTI dl nr_ue_phy_meas physim_common softmodem_common
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2128,7 +2141,7 @@ if (${T_TRACER})
|
|||||||
SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
||||||
NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
|
NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
|
||||||
MISC_NFAPI_LTE_LIB
|
MISC_NFAPI_LTE_LIB
|
||||||
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU
|
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU NR_PHY_RU
|
||||||
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE MAC_NR_COMMON MAC_UE_NR ngap
|
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE MAC_NR_COMMON MAC_UE_NR ngap
|
||||||
GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE SIMU
|
GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE SIMU
|
||||||
dfts config_internals nr_common crc_byte)
|
dfts config_internals nr_common crc_byte)
|
||||||
|
|||||||
@@ -219,28 +219,6 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("cppcheck") {
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
triggerSlaveJob ('RAN-cppcheck', 'cppcheck')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
always {
|
|
||||||
script {
|
|
||||||
// Using a unique variable name for each test stage to avoid overwriting on a global variable
|
|
||||||
// due to parallel-time concurrency
|
|
||||||
cppcheckStatus = finalizeSlaveJob('RAN-cppcheck')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
failure {
|
|
||||||
script {
|
|
||||||
currentBuild.result = 'FAILURE'
|
|
||||||
failingStages += cppcheckStatus
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ("ARM-Cross-Compile") {
|
stage ("ARM-Cross-Compile") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import constants as CONST
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
||||||
|
|
||||||
force_local = False
|
force_local = False
|
||||||
date_fmt = None
|
date_fmt = None
|
||||||
@@ -53,7 +53,6 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
|||||||
RAN.ranRepository=matchReg.group(1)
|
RAN.ranRepository=matchReg.group(1)
|
||||||
HTML.ranRepository=matchReg.group(1)
|
HTML.ranRepository=matchReg.group(1)
|
||||||
CONTAINERS.ranRepository=matchReg.group(1)
|
CONTAINERS.ranRepository=matchReg.group(1)
|
||||||
SCA.ranRepository=matchReg.group(1)
|
|
||||||
CLUSTER.ranRepository=matchReg.group(1)
|
CLUSTER.ranRepository=matchReg.group(1)
|
||||||
elif re.match(r'^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match(r'^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
if re.match(r'^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||||
@@ -66,7 +65,6 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
|||||||
RAN.ranAllowMerge=True
|
RAN.ranAllowMerge=True
|
||||||
HTML.ranAllowMerge=True
|
HTML.ranAllowMerge=True
|
||||||
CONTAINERS.ranAllowMerge=True
|
CONTAINERS.ranAllowMerge=True
|
||||||
SCA.ranAllowMerge=True
|
|
||||||
CLUSTER.ranAllowMerge=True
|
CLUSTER.ranAllowMerge=True
|
||||||
elif re.match(r'^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match(r'^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
if re.match(r'^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||||
@@ -77,7 +75,6 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
|||||||
RAN.ranBranch=matchReg.group(1)
|
RAN.ranBranch=matchReg.group(1)
|
||||||
HTML.ranBranch=matchReg.group(1)
|
HTML.ranBranch=matchReg.group(1)
|
||||||
CONTAINERS.ranBranch=matchReg.group(1)
|
CONTAINERS.ranBranch=matchReg.group(1)
|
||||||
SCA.ranBranch=matchReg.group(1)
|
|
||||||
CLUSTER.ranBranch=matchReg.group(1)
|
CLUSTER.ranBranch=matchReg.group(1)
|
||||||
elif re.match(r'^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||||
if re.match(r'^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
if re.match(r'^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||||
@@ -88,7 +85,6 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
|||||||
RAN.ranCommitID=matchReg.group(1)
|
RAN.ranCommitID=matchReg.group(1)
|
||||||
HTML.ranCommitID=matchReg.group(1)
|
HTML.ranCommitID=matchReg.group(1)
|
||||||
CONTAINERS.ranCommitID=matchReg.group(1)
|
CONTAINERS.ranCommitID=matchReg.group(1)
|
||||||
SCA.ranCommitID=matchReg.group(1)
|
|
||||||
CLUSTER.ranCommitID=matchReg.group(1)
|
CLUSTER.ranCommitID=matchReg.group(1)
|
||||||
elif re.match(r'^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||||
if re.match(r'^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
if re.match(r'^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||||
@@ -99,7 +95,6 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
|||||||
RAN.ranTargetBranch=matchReg.group(1)
|
RAN.ranTargetBranch=matchReg.group(1)
|
||||||
HTML.ranTargetBranch=matchReg.group(1)
|
HTML.ranTargetBranch=matchReg.group(1)
|
||||||
CONTAINERS.ranTargetBranch=matchReg.group(1)
|
CONTAINERS.ranTargetBranch=matchReg.group(1)
|
||||||
SCA.ranTargetBranch=matchReg.group(1)
|
|
||||||
CLUSTER.ranTargetBranch=matchReg.group(1)
|
CLUSTER.ranTargetBranch=matchReg.group(1)
|
||||||
elif re.match(r'^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
print("parameters --eNB*IPAddress ignored")
|
print("parameters --eNB*IPAddress ignored")
|
||||||
@@ -112,7 +107,6 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
|||||||
matchReg = re.match(r'^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match(r'^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNBSourceCodePath=matchReg.group(1)
|
RAN.eNBSourceCodePath=matchReg.group(1)
|
||||||
CONTAINERS.eNBSourceCodePath=matchReg.group(1)
|
CONTAINERS.eNBSourceCodePath=matchReg.group(1)
|
||||||
SCA.eNBSourceCodePath=matchReg.group(1)
|
|
||||||
CLUSTER.eNBSourceCodePath=matchReg.group(1)
|
CLUSTER.eNBSourceCodePath=matchReg.group(1)
|
||||||
elif re.match(r'^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match(r'^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
||||||
print("parameter --eNB1SourceCodePath ignored")
|
print("parameter --eNB1SourceCodePath ignored")
|
||||||
|
|||||||
@@ -184,11 +184,6 @@ class Containerize():
|
|||||||
self.services = ''
|
self.services = ''
|
||||||
self.deploymentTag = ''
|
self.deploymentTag = ''
|
||||||
|
|
||||||
self.cli = ''
|
|
||||||
self.cliBuildOptions = ''
|
|
||||||
self.dockerfileprefix = ''
|
|
||||||
self.host = ''
|
|
||||||
|
|
||||||
self.num_attempts = 1
|
self.num_attempts = 1
|
||||||
|
|
||||||
self.flexricTag = ''
|
self.flexricTag = ''
|
||||||
@@ -203,18 +198,7 @@ class Containerize():
|
|||||||
cmd = cls_cmd.getConnection(node)
|
cmd = cls_cmd.getConnection(node)
|
||||||
log_files = []
|
log_files = []
|
||||||
|
|
||||||
# Checking the hostname to get adapted on cli and dockerfileprefixes
|
dockerfileprefix = '.ubuntu'
|
||||||
cmd.run('hostnamectl')
|
|
||||||
result = re.search('Ubuntu|Red Hat', cmd.getBefore())
|
|
||||||
self.host = result.group(0)
|
|
||||||
if self.host == 'Ubuntu':
|
|
||||||
self.cli = 'docker'
|
|
||||||
self.dockerfileprefix = '.ubuntu'
|
|
||||||
self.cliBuildOptions = ''
|
|
||||||
elif self.host == 'Red Hat':
|
|
||||||
self.cli = 'sudo podman'
|
|
||||||
self.dockerfileprefix = '.rhel9'
|
|
||||||
self.cliBuildOptions = '--disable-compression'
|
|
||||||
|
|
||||||
# we always build the ran-build image with all targets
|
# we always build the ran-build image with all targets
|
||||||
# Creating a tupple with the imageName, the DockerFile prefix pattern, targetName and sanitized option
|
# Creating a tupple with the imageName, the DockerFile prefix pattern, targetName and sanitized option
|
||||||
@@ -232,23 +216,20 @@ class Containerize():
|
|||||||
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup', ''))
|
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup', ''))
|
||||||
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue', ''))
|
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue', ''))
|
||||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
||||||
if self.host == 'Red Hat':
|
imageNames.append(('oai-lte-ru', 'lteRU', 'oai-lte-ru', ''))
|
||||||
imageNames.append(('oai-physim', 'phySim', 'oai-physim', ''))
|
# Building again the 5G images with Address Sanitizer
|
||||||
if self.host == 'Ubuntu':
|
imageNames.append(('ran-build', 'build', 'ran-build-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
imageNames.append(('oai-lte-ru', 'lteRU', 'oai-lte-ru', ''))
|
imageNames.append(('oai-enb', 'eNB', 'oai-enb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
# Building again the 5G images with Address Sanitizer
|
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
imageNames.append(('ran-build', 'build', 'ran-build-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
imageNames.append(('oai-enb', 'eNB', 'oai-enb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||||
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
imageNames.append(('ran-build-fhi72', 'build.fhi72', 'ran-build-fhi72', ''))
|
||||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
imageNames.append(('oai-gnb', 'gNB.fhi72', 'oai-gnb-fhi72', ''))
|
||||||
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
imageNames.append(('oai-nr-oru', 'nrORU.fhi72', 'oai-nr-oru', ''))
|
||||||
imageNames.append(('ran-build-fhi72', 'build.fhi72', 'ran-build-fhi72', ''))
|
|
||||||
imageNames.append(('oai-gnb', 'gNB.fhi72', 'oai-gnb-fhi72', ''))
|
|
||||||
imageNames.append(('oai-nr-oru', 'nrORU.fhi72', 'oai-nr-oru', ''))
|
|
||||||
result = re.search('build_cross_arm64', self.imageKind)
|
result = re.search('build_cross_arm64', self.imageKind)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
self.dockerfileprefix = '.ubuntu.cross-arm64'
|
dockerfileprefix = '.ubuntu.cross-arm64'
|
||||||
result = re.search('native_armv9', self.imageKind)
|
result = re.search('native_armv9', self.imageKind)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
||||||
@@ -263,10 +244,6 @@ class Containerize():
|
|||||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
||||||
|
|
||||||
cmd.cd(lSourcePath)
|
cmd.cd(lSourcePath)
|
||||||
# if asterix, copy the entitlement and subscription manager configurations
|
|
||||||
if self.host == 'Red Hat':
|
|
||||||
cmd.run('mkdir -p ./etc-pki-entitlement')
|
|
||||||
cmd.run('cp /etc/pki/entitlement/*.pem ./etc-pki-entitlement/')
|
|
||||||
|
|
||||||
baseImage = 'ran-base'
|
baseImage = 'ran-base'
|
||||||
baseTag = 'develop'
|
baseTag = 'develop'
|
||||||
@@ -275,7 +252,7 @@ class Containerize():
|
|||||||
if (self.ranAllowMerge):
|
if (self.ranAllowMerge):
|
||||||
imageTag = 'ci-temp'
|
imageTag = 'ci-temp'
|
||||||
if self.ranTargetBranch == 'develop':
|
if self.ranTargetBranch == 'develop':
|
||||||
cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base{self.dockerfileprefix} | grep --colour=never -i INDEX')
|
cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base{dockerfileprefix} | grep --colour=never -i INDEX')
|
||||||
result = re.search('index', cmd.getBefore())
|
result = re.search('index', cmd.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
forceBaseImageBuild = True
|
forceBaseImageBuild = True
|
||||||
@@ -289,31 +266,30 @@ class Containerize():
|
|||||||
forceBaseImageBuild = True
|
forceBaseImageBuild = True
|
||||||
|
|
||||||
# Let's remove any previous run artifacts if still there
|
# Let's remove any previous run artifacts if still there
|
||||||
cmd.run(f"{self.cli} image prune --force")
|
cmd.run(f"docker image prune --force")
|
||||||
for image,pattern,name,option in imageNames:
|
for image,pattern,name,option in imageNames:
|
||||||
cmd.run(f"{self.cli} image rm {name}:{imageTag}", reportNonZero=False)
|
cmd.run(f"docker image rm {name}:{imageTag}", reportNonZero=False)
|
||||||
|
|
||||||
cmd.run(f'docker login -u oaicicd -p oaicicd {DEFAULT_REGISTRY}')
|
cmd.run(f'docker login -u oaicicd -p oaicicd {DEFAULT_REGISTRY}')
|
||||||
ubuntuImage = "ubuntu:noble"
|
ubuntuImage = "ubuntu:noble"
|
||||||
# Build the base image only on Push Events (not on Merge Requests)
|
# Build the base image only on Push Events (not on Merge Requests)
|
||||||
# On when the base image docker file is being modified.
|
# On when the base image docker file is being modified.
|
||||||
if forceBaseImageBuild:
|
if forceBaseImageBuild:
|
||||||
cmd.run(f"{self.cli} image rm {baseImage}:{baseTag}")
|
cmd.run(f"docker image rm {baseImage}:{baseTag}")
|
||||||
logfile = f'{lSourcePath}/cmake_targets/log/ran-base.docker.log'
|
logfile = f'{lSourcePath}/cmake_targets/log/ran-base.docker.log'
|
||||||
if self.host == 'Ubuntu':
|
option = f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
|
||||||
option = f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
|
cmd.run(f"docker build --target {baseImage} --tag {baseImage}:{baseTag} --file docker/Dockerfile.base{dockerfileprefix} {option} . &> {logfile}", timeout=1600)
|
||||||
cmd.run(f"{self.cli} build {self.cliBuildOptions} --target {baseImage} --tag {baseImage}:{baseTag} --file docker/Dockerfile.base{self.dockerfileprefix} {option} . &> {logfile}", timeout=1600)
|
|
||||||
t = ("ran-base", archiveArtifact(cmd, ctx, logfile))
|
t = ("ran-base", archiveArtifact(cmd, ctx, logfile))
|
||||||
log_files.append(t)
|
log_files.append(t)
|
||||||
|
|
||||||
# First verify if the base image was properly created.
|
# First verify if the base image was properly created.
|
||||||
ret = cmd.run(f"{self.cli} image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}")
|
ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}")
|
||||||
allImagesSize = {}
|
allImagesSize = {}
|
||||||
if ret.returncode != 0:
|
if ret.returncode != 0:
|
||||||
logging.error('\u001B[1m Could not build properly ran-base\u001B[0m')
|
logging.error('\u001B[1m Could not build properly ran-base\u001B[0m')
|
||||||
# Recover the name of the failed container?
|
# Recover the name of the failed container?
|
||||||
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty {self.cli} rm -f")
|
cmd.run(f"docker ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty docker rm -f")
|
||||||
cmd.run(f"{self.cli} image prune --force")
|
cmd.run(f"docker image prune --force")
|
||||||
cmd.close()
|
cmd.close()
|
||||||
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
||||||
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
@@ -333,32 +309,31 @@ class Containerize():
|
|||||||
for image,pattern,name,option in imageNames:
|
for image,pattern,name,option in imageNames:
|
||||||
# the archived Dockerfiles have "ran-base:latest" as base image
|
# the archived Dockerfiles have "ran-base:latest" as base image
|
||||||
# we need to update them with proper tag
|
# we need to update them with proper tag
|
||||||
cmd.run(f'git checkout -- docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
cmd.run(f'git checkout -- docker/Dockerfile.{pattern}{dockerfileprefix}')
|
||||||
cmd.run(f'sed -i -e "s#{baseImage}:latest#{baseImage}:{baseTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
cmd.run(f'sed -i -e "s#{baseImage}:latest#{baseImage}:{baseTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
||||||
# target images should use the proper ran-build image
|
# target images should use the proper ran-build image
|
||||||
if image != 'ran-build' and "-asan" in name:
|
if image != 'ran-build' and "-asan" in name:
|
||||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build-asan:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build-asan:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
||||||
elif "fhi72" in name or name == "oai-nr-oru":
|
elif "fhi72" in name or name == "oai-nr-oru":
|
||||||
cmd.run(f'sed -i -e "s#ran-build-fhi72:latest#ran-build-fhi72:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
cmd.run(f'sed -i -e "s#ran-build-fhi72:latest#ran-build-fhi72:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
||||||
elif image != 'ran-build':
|
elif image != 'ran-build':
|
||||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
||||||
if image == 'oai-gnb-aerial':
|
if image == 'oai-gnb-aerial':
|
||||||
cmd.run('cp -f /opt/nvidia-ipc/nvipc_src.2026.01.07.tar.gz .')
|
cmd.run('cp -f /opt/nvidia-ipc/nvipc_src.2026.01.07.tar.gz .')
|
||||||
logfile = f'{lSourcePath}/cmake_targets/log/{name}.docker.log'
|
logfile = f'{lSourcePath}/cmake_targets/log/{name}.docker.log'
|
||||||
if self.host == 'Ubuntu':
|
option = option + f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
|
||||||
option = option + f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
|
ret = cmd.run(f'docker build --target {image} --tag {name}:{imageTag} --file docker/Dockerfile.{pattern}{dockerfileprefix} {option} . > {logfile} 2>&1', timeout=1200)
|
||||||
ret = cmd.run(f'{self.cli} build {self.cliBuildOptions} --target {image} --tag {name}:{imageTag} --file docker/Dockerfile.{pattern}{self.dockerfileprefix} {option} . > {logfile} 2>&1', timeout=1200)
|
|
||||||
t = (name, archiveArtifact(cmd, ctx, logfile))
|
t = (name, archiveArtifact(cmd, ctx, logfile))
|
||||||
log_files.append(t)
|
log_files.append(t)
|
||||||
if image == 'oai-gnb-aerial':
|
if image == 'oai-gnb-aerial':
|
||||||
cmd.run('rm -f nvipc_src.2026.01.07.tar.gz')
|
cmd.run('rm -f nvipc_src.2026.01.07.tar.gz')
|
||||||
# check the status of the build
|
# check the status of the build
|
||||||
ret = cmd.run(f"{self.cli} image inspect --format=\'Size = {{{{.Size}}}} bytes\' {name}:{imageTag}")
|
ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {name}:{imageTag}")
|
||||||
if ret.returncode != 0:
|
if ret.returncode != 0:
|
||||||
logging.error('\u001B[1m Could not build properly ' + name + '\u001B[0m')
|
logging.error('\u001B[1m Could not build properly ' + name + '\u001B[0m')
|
||||||
status = False
|
status = False
|
||||||
# Here we should check if the last container corresponds to a failed command and destroy it
|
# Here we should check if the last container corresponds to a failed command and destroy it
|
||||||
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty {self.cli} rm -f")
|
cmd.run(f"docker ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty docker rm -f")
|
||||||
allImagesSize[name] = 'N/A -- Build Failed'
|
allImagesSize[name] = 'N/A -- Build Failed'
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
@@ -372,16 +347,16 @@ class Containerize():
|
|||||||
logging.debug(f'{name} size is unknown')
|
logging.debug(f'{name} size is unknown')
|
||||||
allImagesSize[name] = 'unknown'
|
allImagesSize[name] = 'unknown'
|
||||||
# Now pruning dangling images in between target builds
|
# Now pruning dangling images in between target builds
|
||||||
cmd.run(f"{self.cli} image prune --force")
|
cmd.run(f"docker image prune --force")
|
||||||
cmd.run(f'docker logout {DEFAULT_REGISTRY}')
|
cmd.run(f'docker logout {DEFAULT_REGISTRY}')
|
||||||
# Remove all intermediate build images and clean up
|
# Remove all intermediate build images and clean up
|
||||||
cmd.run(f"{self.cli} image rm ran-build:{imageTag} ran-build-asan:{imageTag} ran-build-fhi72:{imageTag} || true")
|
cmd.run(f"docker image rm ran-build:{imageTag} ran-build-asan:{imageTag} ran-build-fhi72:{imageTag} || true")
|
||||||
cmd.run(f"{self.cli} volume prune --force")
|
cmd.run(f"docker volume prune --force")
|
||||||
|
|
||||||
# Remove some cached artifacts to prevent out of diskspace problem
|
# Remove some cached artifacts to prevent out of diskspace problem
|
||||||
logging.debug(cmd.run("df -h").stdout)
|
logging.debug(cmd.run("df -h").stdout)
|
||||||
logging.debug(cmd.run("docker system df").stdout)
|
logging.debug(cmd.run("docker system df").stdout)
|
||||||
cmd.run(f"{self.cli} buildx prune --filter until=1h --force")
|
cmd.run(f"docker buildx prune --filter until=1h --force")
|
||||||
logging.debug(cmd.run("df -h").stdout)
|
logging.debug(cmd.run("df -h").stdout)
|
||||||
logging.debug(cmd.run("docker system df").stdout)
|
logging.debug(cmd.run("docker system df").stdout)
|
||||||
|
|
||||||
@@ -489,20 +464,12 @@ class Containerize():
|
|||||||
cmd = cls_cmd.getConnection(node)
|
cmd = cls_cmd.getConnection(node)
|
||||||
cmd.cd(lSourcePath)
|
cmd.cd(lSourcePath)
|
||||||
|
|
||||||
ret = cmd.run('hostnamectl')
|
|
||||||
result = re.search('Ubuntu', ret.stdout)
|
|
||||||
host = result.group(0)
|
|
||||||
if host != 'Ubuntu':
|
|
||||||
cmd.close()
|
|
||||||
raise Exception("Can build unit tests only on Ubuntu server")
|
|
||||||
logging.debug('running on Ubuntu as expected')
|
|
||||||
|
|
||||||
# check that ran-base image exists as we expect it
|
# check that ran-base image exists as we expect it
|
||||||
baseImage = 'ran-base'
|
baseImage = 'ran-base'
|
||||||
baseTag = 'develop'
|
baseTag = 'develop'
|
||||||
if self.ranAllowMerge:
|
if self.ranAllowMerge:
|
||||||
if self.ranTargetBranch == 'develop':
|
if self.ranTargetBranch == 'develop':
|
||||||
cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base{self.dockerfileprefix} | grep --colour=never -i INDEX')
|
cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base.ubuntu | grep --colour=never -i INDEX')
|
||||||
result = re.search('index', cmd.getBefore())
|
result = re.search('index', cmd.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
baseTag = 'ci-temp'
|
baseTag = 'ci-temp'
|
||||||
|
|||||||
@@ -379,90 +379,6 @@ class HTMLManagement():
|
|||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.close()
|
self.htmlFile.close()
|
||||||
|
|
||||||
def CreateHtmlTestRowCppCheckResults(self, CCR):
|
|
||||||
if (self.htmlFooterCreated or (not self.htmlHeaderCreated)):
|
|
||||||
return
|
|
||||||
self.htmlFile = open('test_results.html', 'a')
|
|
||||||
vId = 0
|
|
||||||
for version in CCR.versions:
|
|
||||||
self.htmlFile.write(' <tr bgcolor = "#F0F0F0" >\n')
|
|
||||||
self.htmlFile.write(' <td colspan="6"><b> Results for cppcheck v ' + version + ' </b></td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> NB ERRORS</b></td>\n')
|
|
||||||
if CCR.nbErrors[vId] == 0:
|
|
||||||
myColor = 'lightgreen'
|
|
||||||
elif CCR.nbErrors[vId] < 20:
|
|
||||||
myColor = 'orange'
|
|
||||||
else:
|
|
||||||
myColor = 'lightcoral'
|
|
||||||
self.htmlFile.write(' <td colspan="3" bgcolor = "' + myColor + '"><b>' + str(CCR.nbErrors[vId]) + '</b></td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> NB WARNINGS</b></td>\n')
|
|
||||||
if CCR.nbWarnings[vId] == 0:
|
|
||||||
myColor = 'lightgreen'
|
|
||||||
elif CCR.nbWarnings[vId] < 20:
|
|
||||||
myColor = 'orange'
|
|
||||||
else:
|
|
||||||
myColor = 'lightcoral'
|
|
||||||
self.htmlFile.write(' <td colspan="3" bgcolor = "' + myColor + '"><b>' + str(CCR.nbWarnings[vId]) + '</b></td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr bgcolor = "#F0F0F0" >\n')
|
|
||||||
self.htmlFile.write(' <td colspan="6"> ----------------- </td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Memory leak</b></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbMemLeaks[vId]) + '</td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Possible null pointer deference</b></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbNullPtrs[vId]) + '</td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Uninitialized variable</b></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbUninitVars[vId]) + '</td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Undefined behaviour shifting</b></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbTooManyBitsShift[vId]) + '</td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Signed integer overflow</b></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbIntegerOverflow[vId]) + '</td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr bgcolor = "#F0F0F0" >\n')
|
|
||||||
self.htmlFile.write(' <td colspan="6"> </td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Printf formatting issues</b></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbInvalidPrintf[vId]) + '</td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Modulo result is predetermined</b></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbModuloAlways[vId]) + '</td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Opposite Condition -> dead code</b></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbOppoInnerCondition[vId]) + '</td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
self.htmlFile.write(' <tr>\n')
|
|
||||||
self.htmlFile.write(' <td></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" ><b> Wrong Scanf Nb Args</b></td>\n')
|
|
||||||
self.htmlFile.write(' <td colspan="3">' + str(CCR.nbWrongScanfArg[vId]) + '</td>\n')
|
|
||||||
self.htmlFile.write(' </tr>\n')
|
|
||||||
vId += 1
|
|
||||||
|
|
||||||
def CreateHtmlTestRowPhySimTestResult(self, testSummary, testResult):
|
def CreateHtmlTestRowPhySimTestResult(self, testSummary, testResult):
|
||||||
if (self.htmlFooterCreated or (not self.htmlHeaderCreated)):
|
if (self.htmlFooterCreated or (not self.htmlHeaderCreated)):
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -27,160 +27,30 @@ import constants as CONST
|
|||||||
import cls_cmd
|
import cls_cmd
|
||||||
from cls_ci_helper import archiveArtifact
|
from cls_ci_helper import archiveArtifact
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
|
||||||
# Class Declaration
|
|
||||||
#-----------------------------------------------------------
|
|
||||||
class CppCheckResults():
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
|
|
||||||
self.variants = ['bionic', 'focal']
|
|
||||||
self.versions = ['','']
|
|
||||||
self.nbErrors = [0,0]
|
|
||||||
self.nbWarnings = [0,0]
|
|
||||||
self.nbNullPtrs = [0,0]
|
|
||||||
self.nbMemLeaks = [0,0]
|
|
||||||
self.nbUninitVars = [0,0]
|
|
||||||
self.nbInvalidPrintf = [0,0]
|
|
||||||
self.nbModuloAlways = [0,0]
|
|
||||||
self.nbTooManyBitsShift = [0,0]
|
|
||||||
self.nbIntegerOverflow = [0,0]
|
|
||||||
self.nbWrongScanfArg = [0,0]
|
|
||||||
self.nbPtrAddNotNull = [0,0]
|
|
||||||
self.nbOppoInnerCondition = [0,0]
|
|
||||||
|
|
||||||
class StaticCodeAnalysis():
|
class StaticCodeAnalysis():
|
||||||
|
|
||||||
def __init__(self):
|
def LicenceAndFormattingCheck(ctx, node, HTML, d, branch, allowMerge, targetBranch):
|
||||||
|
|
||||||
self.ranRepository = ''
|
|
||||||
self.ranBranch = ''
|
|
||||||
self.ranAllowMerge = False
|
|
||||||
self.ranCommitID = ''
|
|
||||||
self.ranTargetBranch = ''
|
|
||||||
self.eNBSourceCodePath = ''
|
|
||||||
|
|
||||||
def CppCheckAnalysis(self, ctx, node, HTML):
|
|
||||||
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
|
||||||
HELP.GenericHelp(CONST.Version)
|
|
||||||
sys.exit('Insufficient Parameter')
|
|
||||||
lSourcePath = self.eNBSourceCodePath
|
|
||||||
|
|
||||||
if not lSourcePath or not node:
|
|
||||||
raise ValueError(f"{lSourcePath=} {node=}")
|
|
||||||
logging.debug('Building on server: ' + node)
|
|
||||||
cmd = cls_cmd.getConnection(node)
|
|
||||||
# on RedHat/CentOS .git extension is mandatory
|
|
||||||
result = re.search(r'([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
|
||||||
if result is not None:
|
|
||||||
full_ran_repo_name = self.ranRepository.replace('git/', 'git')
|
|
||||||
else:
|
|
||||||
full_ran_repo_name = self.ranRepository + '.git'
|
|
||||||
|
|
||||||
cmd.cd(lSourcePath)
|
|
||||||
logDir = f'{lSourcePath}/cmake_targets/log'
|
|
||||||
cmd.run(f'mkdir -p {logDir}')
|
|
||||||
cmd.run('docker image rm oai-cppcheck:bionic oai-cppcheck:focal')
|
|
||||||
cmd.run(f'sed -e "s@xenial@bionic@" {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.xenial > {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.bionic')
|
|
||||||
cmd.run(f'docker build --tag oai-cppcheck:bionic --file {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.bionic . > {logDir}/cppcheck-bionic.txt 2>&1')
|
|
||||||
cmd.run(f'sed -e "s@xenial@focal@" {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.xenial > {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.focal')
|
|
||||||
cmd.run(f'docker build --tag oai-cppcheck:focal --file {lSourcePath}/ci-scripts/docker/Dockerfile.cppcheck.focal . > {logDir}/cppcheck-focal.txt 2>&1')
|
|
||||||
cmd.run('docker image rm oai-cppcheck:bionic oai-cppcheck:focal')
|
|
||||||
|
|
||||||
bionic = archiveArtifact(cmd, ctx, f'{logDir}/cppcheck-bionic.txt')
|
|
||||||
focal = archiveArtifact(cmd, ctx, f'{logDir}/cppcheck-focal.txt')
|
|
||||||
cmd.close()
|
|
||||||
|
|
||||||
CCR = CppCheckResults()
|
|
||||||
CCR_ref = CppCheckResults()
|
|
||||||
vId = 0
|
|
||||||
for variant in CCR.variants:
|
|
||||||
filename = ctx.baseFilename() + '-cppcheck-'+ variant + '.txt'
|
|
||||||
logging.info(f"will check file '{filename}'")
|
|
||||||
if not os.path.isfile(filename):
|
|
||||||
raise FileNotFoundError(f"{filename} is not a file")
|
|
||||||
else:
|
|
||||||
xmlStart = False
|
|
||||||
with open(filename, 'r') as logfile:
|
|
||||||
for line in logfile:
|
|
||||||
ret = re.search(r'cppcheck version="(?P<version>[0-9\.]+)"', str(line))
|
|
||||||
if ret is not None:
|
|
||||||
CCR.versions[vId] = ret.group('version')
|
|
||||||
if re.search('RUN cat cmake_targets/log/cppcheck.xml', str(line)) is not None:
|
|
||||||
xmlStart = True
|
|
||||||
if xmlStart:
|
|
||||||
if re.search('severity="error"', str(line)) is not None:
|
|
||||||
CCR.nbErrors[vId] += 1
|
|
||||||
if re.search('severity="warning"', str(line)) is not None:
|
|
||||||
CCR.nbWarnings[vId] += 1
|
|
||||||
if re.search('id="memleak"', str(line)) is not None:
|
|
||||||
CCR.nbMemLeaks[vId] += 1
|
|
||||||
if re.search('id="nullPointer"', str(line)) is not None:
|
|
||||||
CCR.nbNullPtrs[vId] += 1
|
|
||||||
if re.search('id="uninitvar"', str(line)) is not None:
|
|
||||||
CCR.nbUninitVars[vId] += 1
|
|
||||||
if re.search('id="invalidPrintfArgType_sint"|id="invalidPrintfArgType_uint"', str(line)) is not None:
|
|
||||||
CCR.nbInvalidPrintf[vId] += 1
|
|
||||||
if re.search('id="moduloAlwaysTrueFalse"', str(line)) is not None:
|
|
||||||
CCR.nbModuloAlways[vId] += 1
|
|
||||||
if re.search('id="shiftTooManyBitsSigned"', str(line)) is not None:
|
|
||||||
CCR.nbTooManyBitsShift[vId] += 1
|
|
||||||
if re.search('id="integerOverflow"', str(line)) is not None:
|
|
||||||
CCR.nbIntegerOverflow[vId] += 1
|
|
||||||
if re.search('id="wrongPrintfScanfArgNum"|id="invalidScanfArgType_int"', str(line)) is not None:
|
|
||||||
CCR.nbWrongScanfArg[vId] += 1
|
|
||||||
if re.search('id="pointerAdditionResultNotNull"', str(line)) is not None:
|
|
||||||
CCR.nbPtrAddNotNull[vId] += 1
|
|
||||||
if re.search('id="oppositeInnerCondition"', str(line)) is not None:
|
|
||||||
CCR.nbOppoInnerCondition[vId] += 1
|
|
||||||
vMsg = ''
|
|
||||||
vMsg += '======== Variant ' + variant + ' - ' + CCR.versions[vId] + ' ========\n'
|
|
||||||
vMsg += ' ' + str(CCR.nbErrors[vId]) + ' errors\n'
|
|
||||||
vMsg += ' ' + str(CCR.nbWarnings[vId]) + ' warnings\n'
|
|
||||||
vMsg += ' -- Details --\n'
|
|
||||||
vMsg += ' Memory leak: ' + str(CCR.nbMemLeaks[vId]) + '\n'
|
|
||||||
vMsg += ' Possible null pointer deference: ' + str(CCR.nbNullPtrs[vId]) + '\n'
|
|
||||||
vMsg += ' Uninitialized variable: ' + str(CCR.nbUninitVars[vId]) + '\n'
|
|
||||||
vMsg += ' Undefined behaviour shifting: ' + str(CCR.nbTooManyBitsShift[vId]) + '\n'
|
|
||||||
vMsg += ' Signed integer overflow: ' + str(CCR.nbIntegerOverflow[vId]) + '\n'
|
|
||||||
vMsg += '\n'
|
|
||||||
vMsg += ' Printf formatting issue: ' + str(CCR.nbInvalidPrintf[vId]) + '\n'
|
|
||||||
vMsg += ' Modulo result is predetermined: ' + str(CCR.nbModuloAlways[vId]) + '\n'
|
|
||||||
vMsg += ' Opposite Condition -> dead code: ' + str(CCR.nbOppoInnerCondition[vId]) + '\n'
|
|
||||||
vMsg += ' Wrong Scanf Nb Args: ' + str(CCR.nbWrongScanfArg[vId]) + '\n'
|
|
||||||
for vLine in vMsg.split('\n'):
|
|
||||||
logging.debug(vLine)
|
|
||||||
vId += 1
|
|
||||||
|
|
||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
HTML.CreateHtmlTestRowCppCheckResults(CCR)
|
|
||||||
logging.info('\u001B[1m Static Code Analysis Pass\u001B[0m')
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def LicenceAndFormattingCheck(self, ctx, node, HTML):
|
|
||||||
# Workspace is no longer recreated from scratch.
|
# Workspace is no longer recreated from scratch.
|
||||||
# It implies that this method shall be called last within a build pipeline
|
# It implies that this method shall be called last within a build pipeline
|
||||||
# where workspace is already created
|
# where workspace is already created
|
||||||
lSourcePath = self.eNBSourceCodePath
|
|
||||||
|
|
||||||
if not node or not lSourcePath:
|
if not node or not d:
|
||||||
raise ValueError(f"{lSourcePath=} {node=}")
|
raise ValueError(f"{d=} {node=}")
|
||||||
logging.debug('Building on server: ' + node)
|
logging.debug('Building on server: ' + node)
|
||||||
cmd = cls_cmd.getConnection(node)
|
cmd = cls_cmd.getConnection(node)
|
||||||
check_options = ''
|
check_options = ''
|
||||||
if self.ranAllowMerge:
|
if allowMerge:
|
||||||
check_options = f'--build-arg MERGE_REQUEST=true --build-arg SRC_BRANCH={self.ranBranch}'
|
check_options = f'--build-arg MERGE_REQUEST=true --build-arg SRC_BRANCH={branch}'
|
||||||
if self.ranTargetBranch == '':
|
if targetBranch == '':
|
||||||
if self.ranBranch != 'develop' and self.ranBranch != 'origin/develop':
|
if branch != 'develop' and branch != 'origin/develop':
|
||||||
check_options += ' --build-arg TARGET_BRANCH=develop'
|
check_options += ' --build-arg TARGET_BRANCH=develop'
|
||||||
else:
|
else:
|
||||||
check_options += f' --build-arg TARGET_BRANCH={self.ranTargetBranch}'
|
check_options += f' --build-arg TARGET_BRANCH={targetBranch}'
|
||||||
|
|
||||||
logDir = f'{lSourcePath}/cmake_targets/log/'
|
logDir = f'{d}/cmake_targets/log/'
|
||||||
cmd.run(f'mkdir -p {logDir}')
|
cmd.run(f'mkdir -p {logDir}')
|
||||||
cmd.run('docker image rm oai-formatting-check:latest')
|
cmd.run('docker image rm oai-formatting-check:latest')
|
||||||
cmd.run(f'docker build --target oai-formatting-check --tag oai-formatting-check:latest {check_options} --file {lSourcePath}/ci-scripts/docker/Dockerfile.formatting.ubuntu {lSourcePath} > {logDir}/oai-formatting-check.txt 2>&1')
|
cmd.run(f'docker build --target oai-formatting-check --tag oai-formatting-check:latest {check_options} --file {d}/ci-scripts/docker/Dockerfile.formatting.ubuntu {d} > {logDir}/oai-formatting-check.txt 2>&1')
|
||||||
|
|
||||||
cmd.run('docker image rm oai-formatting-check:latest')
|
cmd.run('docker image rm oai-formatting-check:latest')
|
||||||
cmd.run('docker image prune --force')
|
cmd.run('docker image prune --force')
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ gNBs =
|
|||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
||||||
|
cu_sibs = ( 2, 3, 4 );
|
||||||
@include "neighbour-config.conf"
|
@include "neighbour-config.conf"
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
|
|||||||
@@ -5,6 +5,57 @@
|
|||||||
# for the 2-cell rfsim setup (gNB_ID 0xe00 & 0xb00) #
|
# for the 2-cell rfsim setup (gNB_ID 0xe00 & 0xb00) #
|
||||||
############################################################
|
############################################################
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# SIB2 #
|
||||||
|
############################################################
|
||||||
|
|
||||||
|
sib2_config : {
|
||||||
|
q_Hyst = 0;
|
||||||
|
cellReselectionPriority = 0;
|
||||||
|
threshServingLowP = 0;
|
||||||
|
threshServingLowQ = 0;
|
||||||
|
s_NonIntraSearchP = -1;
|
||||||
|
s_NonIntraSearchQ = -1;
|
||||||
|
q_RxLevMin = -56;
|
||||||
|
q_QualMin = -1;
|
||||||
|
s_IntraSearchP = 22;
|
||||||
|
s_IntraSearchQ = -1;
|
||||||
|
t_ReselectionNR = 1;
|
||||||
|
deriveSSB_IndexFromCell = 1;
|
||||||
|
|
||||||
|
speed_t_Evaluation = 0;
|
||||||
|
speed_t_HystNormal = 0;
|
||||||
|
speed_n_CellChangeMedium = 1;
|
||||||
|
speed_n_CellChangeHigh = 2;
|
||||||
|
speed_sf_Medium = 1;
|
||||||
|
speed_sf_High = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# Per-frequency SIB4 inter-frequency configuration #
|
||||||
|
############################################################
|
||||||
|
|
||||||
|
frequency_list = (
|
||||||
|
{
|
||||||
|
absoluteFrequencySSB = 621312;
|
||||||
|
subcarrierSpacing = 1; # 30 kHz
|
||||||
|
band = 78;
|
||||||
|
|
||||||
|
frequency_config = (
|
||||||
|
{
|
||||||
|
cellReselectionPriority = 5;
|
||||||
|
threshX_HighP = 10;
|
||||||
|
threshX_LowP = 6;
|
||||||
|
threshX_HighQ = -1;
|
||||||
|
threshX_LowQ = -1;
|
||||||
|
q_OffsetFreq = 0;
|
||||||
|
q_RxLevMin = -56;
|
||||||
|
t_ReselectionNR = 1;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
neighbour_list = (
|
neighbour_list = (
|
||||||
##########################################################
|
##########################################################
|
||||||
# Entry USED BY gNB_ID = 0xe00 (nr_cellid = 1) #
|
# Entry USED BY gNB_ID = 0xe00 (nr_cellid = 1) #
|
||||||
@@ -21,6 +72,9 @@ neighbour_list = (
|
|||||||
band = 78;
|
band = 78;
|
||||||
plmn = { mcc = 208; mnc = 99; mnc_length = 2 };
|
plmn = { mcc = 208; mnc = 99; mnc_length = 2 };
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
q_OffsetCell = 2;
|
||||||
|
q_RxLevMinOffsetCell= 2;
|
||||||
|
q_QualMinOffsetCell = 1;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@@ -40,6 +94,9 @@ neighbour_list = (
|
|||||||
band = 78;
|
band = 78;
|
||||||
plmn = { mcc = 208; mnc = 99; mnc_length = 2 };
|
plmn = { mcc = 208; mnc = 99; mnc_length = 2 };
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
q_OffsetCell = 2;
|
||||||
|
q_RxLevMinOffsetCell= 2;
|
||||||
|
q_QualMinOffsetCell = 1;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Dockerfile for the Open-Air-Interface BUILD service
|
|
||||||
# Valid for Ubuntu 22.04
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
FROM ubuntu:xenial AS oai-cppcheck
|
|
||||||
|
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get upgrade --yes && \
|
|
||||||
apt-get install --yes \
|
|
||||||
build-essential \
|
|
||||||
vim \
|
|
||||||
cppcheck
|
|
||||||
|
|
||||||
WORKDIR /oai-ran
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
WORKDIR /oai-ran/common/utils/T
|
|
||||||
RUN make
|
|
||||||
|
|
||||||
WORKDIR /oai-ran
|
|
||||||
RUN mkdir -p cmake_targets/log && \
|
|
||||||
cppcheck --enable=warning --force --xml --xml-version=2 \
|
|
||||||
--inline-suppr \
|
|
||||||
-i openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c \
|
|
||||||
--suppressions-list=ci-scripts/cppcheck_suppressions.list \
|
|
||||||
-I common/utils \
|
|
||||||
-I openair3/NAS/COMMON/UTIL \
|
|
||||||
-j`nproc` . 2> cmake_targets/log/cppcheck.xml 1> cmake_targets/log/cppcheck_build.txt
|
|
||||||
|
|
||||||
RUN grep -E -c 'severity="error' cmake_targets/log/cppcheck.xml
|
|
||||||
|
|
||||||
RUN grep -E -c 'severity="warning' cmake_targets/log/cppcheck.xml
|
|
||||||
|
|
||||||
RUN cat cmake_targets/log/cppcheck.xml
|
|
||||||
+3
-8
@@ -22,7 +22,7 @@ import constants as CONST
|
|||||||
|
|
||||||
import cls_oaicitest #main class for OAI CI test framework
|
import cls_oaicitest #main class for OAI CI test framework
|
||||||
import cls_containerize #class Containerize for all container-based operations on RAN/UE objects
|
import cls_containerize #class Containerize for all container-based operations on RAN/UE objects
|
||||||
import cls_static_code_analysis #class for static code analysis
|
import cls_static_code_analysis as SCA
|
||||||
import cls_cluster # class for building/deploying on cluster
|
import cls_cluster # class for building/deploying on cluster
|
||||||
import cls_native # class for all native/source-based operations
|
import cls_native # class for all native/source-based operations
|
||||||
from cls_ci_helper import TestCaseCtx
|
from cls_ci_helper import TestCaseCtx
|
||||||
@@ -64,7 +64,6 @@ def ExecuteActionWithParam(action, ctx, node):
|
|||||||
global RAN
|
global RAN
|
||||||
global HTML
|
global HTML
|
||||||
global CONTAINERS
|
global CONTAINERS
|
||||||
global SCA
|
|
||||||
global CLUSTER
|
global CLUSTER
|
||||||
if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy' or action == "Build_Cluster_Image" or action == "Build_Run_Tests":
|
if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy' or action == "Build_Cluster_Image" or action == "Build_Run_Tests":
|
||||||
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
||||||
@@ -196,10 +195,7 @@ def ExecuteActionWithParam(action, ctx, node):
|
|||||||
success = CONTAINERS.Create_Workspace(node, HTML)
|
success = CONTAINERS.Create_Workspace(node, HTML)
|
||||||
|
|
||||||
elif action == 'LicenceAndFormattingCheck':
|
elif action == 'LicenceAndFormattingCheck':
|
||||||
success = SCA.LicenceAndFormattingCheck(ctx, node, HTML)
|
success = SCA.StaticCodeAnalysis.LicenceAndFormattingCheck(ctx, node, HTML, RAN.eNBSourceCodePath, RAN.ranBranch, RAN.ranAllowMerge, RAN.ranTargetBranch)
|
||||||
|
|
||||||
elif action == 'Cppcheck_Analysis':
|
|
||||||
success = SCA.CppCheckAnalysis(ctx, node, HTML)
|
|
||||||
|
|
||||||
elif action == 'Push_Local_Registry':
|
elif action == 'Push_Local_Registry':
|
||||||
tag_prefix = test.findtext('tag_prefix') or ""
|
tag_prefix = test.findtext('tag_prefix') or ""
|
||||||
@@ -297,7 +293,6 @@ CiTestObj = cls_oaicitest.OaiCiTest()
|
|||||||
RAN = ran.RANManagement()
|
RAN = ran.RANManagement()
|
||||||
HTML = cls_oai_html.HTMLManagement()
|
HTML = cls_oai_html.HTMLManagement()
|
||||||
CONTAINERS = cls_containerize.Containerize()
|
CONTAINERS = cls_containerize.Containerize()
|
||||||
SCA = cls_static_code_analysis.StaticCodeAnalysis()
|
|
||||||
CLUSTER = cls_cluster.Cluster()
|
CLUSTER = cls_cluster.Cluster()
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -307,7 +302,7 @@ CLUSTER = cls_cluster.Cluster()
|
|||||||
import args_parse
|
import args_parse
|
||||||
# Force local execution, move all execution targets to localhost
|
# Force local execution, move all execution targets to localhost
|
||||||
force_local = False
|
force_local = False
|
||||||
mode, force_local, date_fmt = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER)
|
mode, force_local, date_fmt = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER)
|
||||||
fmt = "%(levelname)8s: %(message)s"
|
fmt = "%(levelname)8s: %(message)s"
|
||||||
if date_fmt:
|
if date_fmt:
|
||||||
fmt = "[%(asctime)s] %(levelname)s %(message)s"
|
fmt = "[%(asctime)s] %(levelname)s %(message)s"
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
- Deploy_Object
|
- Deploy_Object
|
||||||
- Stop_Object
|
- Stop_Object
|
||||||
- Undeploy_Object
|
- Undeploy_Object
|
||||||
- Cppcheck_Analysis
|
|
||||||
- Deploy_Run_OC_PhySim
|
- Deploy_Run_OC_PhySim
|
||||||
- Build_Deploy_PhySim
|
- Build_Deploy_PhySim
|
||||||
- LicenceAndFormattingCheck
|
- LicenceAndFormattingCheck
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->
|
|
||||||
|
|
||||||
<testCaseList>
|
|
||||||
<htmlTabRef>build-tab</htmlTabRef>
|
|
||||||
<htmlTabName>CPPCHECK Analysis</htmlTabName>
|
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
|
||||||
|
|
||||||
<testCase>
|
|
||||||
<class>Create_Workspace</class>
|
|
||||||
<desc>Create new Workspace</desc>
|
|
||||||
<node>carabe</node>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase>
|
|
||||||
<class>Cppcheck_Analysis</class>
|
|
||||||
<desc>Static Code Analysis with cppcheck</desc>
|
|
||||||
<node>carabe</node>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
</testCaseList>
|
|
||||||
@@ -166,7 +166,7 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
trf_gen:
|
trf_gen:
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: l2sim4g-trf-gen
|
container_name: l2sim4g-trf-gen
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
trf_gen:
|
trf_gen:
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim4g-trf-gen
|
container_name: rfsim4g-trf-gen
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
trf_gen:
|
trf_gen:
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim4g-trf-gen
|
container_name: rfsim4g-trf-gen
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
trf_gen:
|
trf_gen:
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim4g-trf-gen
|
container_name: rfsim4g-trf-gen
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
trf_gen:
|
trf_gen:
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim4g-trf-gen
|
container_name: rfsim4g-trf-gen
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
@@ -75,7 +75,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
init: true
|
init: true
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
@@ -74,7 +74,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
init: true
|
init: true
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
|
|||||||
@@ -38,11 +38,11 @@ Password:
|
|||||||
Now pull images.
|
Now pull images.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker pull mysql:8.0
|
$ docker pull mysql:9.6
|
||||||
$ docker pull oaisoftwarealliance/oai-amf:v2.1.10
|
$ docker pull oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
$ docker pull oaisoftwarealliance/oai-smf:v2.1.10
|
$ docker pull oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
$ docker pull oaisoftwarealliance/oai-upf:v2.1.10
|
$ docker pull oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
$ docker pull oaisoftwarealliance/trf-gen-cn5g:focal
|
$ docker pull oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
|
|
||||||
$ docker pull oaisoftwarealliance/oai-gnb:develop
|
$ docker pull oaisoftwarealliance/oai-gnb:develop
|
||||||
$ docker pull oaisoftwarealliance/oai-nr-ue:develop
|
$ docker pull oaisoftwarealliance/oai-nr-ue:develop
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ./oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ./oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
@@ -74,7 +74,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
init: true
|
init: true
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
@@ -74,7 +74,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
init: true
|
init: true
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
@@ -74,7 +74,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
init: true
|
init: true
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
@@ -74,7 +74,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
init: true
|
init: true
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||||
@@ -23,7 +23,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -35,7 +35,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -47,7 +47,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -70,7 +70,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||||
@@ -23,7 +23,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:ci-tmp-pr-372-26c14bcd
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -35,7 +35,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -47,7 +47,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -70,7 +70,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
@@ -74,7 +74,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
init: true
|
init: true
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||||
@@ -25,7 +25,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -37,7 +37,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -49,7 +49,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -72,7 +72,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
@@ -74,7 +74,7 @@ services:
|
|||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: rfsim5g-oai-ext-dn
|
container_name: rfsim5g-oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
init: true
|
init: true
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -26,7 +26,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.131
|
ipv4_address: 192.168.71.131
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.132
|
ipv4_address: 192.168.71.132
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
ipv4_address: 192.168.71.133
|
ipv4_address: 192.168.71.133
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ services:
|
|||||||
|
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -36,7 +36,7 @@ services:
|
|||||||
|
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -49,7 +49,7 @@ services:
|
|||||||
|
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -62,7 +62,7 @@ services:
|
|||||||
|
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ services:
|
|||||||
|
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "rfsim5g-mysql"
|
container_name: "rfsim5g-mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
init: true
|
init: true
|
||||||
volumes:
|
volumes:
|
||||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
@@ -36,7 +36,7 @@ services:
|
|||||||
|
|
||||||
oai-amf:
|
oai-amf:
|
||||||
container_name: "rfsim5g-oai-amf"
|
container_name: "rfsim5g-oai-amf"
|
||||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/paris
|
- TZ=Europe/paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -49,7 +49,7 @@ services:
|
|||||||
|
|
||||||
oai-smf:
|
oai-smf:
|
||||||
container_name: "rfsim5g-oai-smf"
|
container_name: "rfsim5g-oai-smf"
|
||||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
volumes:
|
volumes:
|
||||||
@@ -62,7 +62,7 @@ services:
|
|||||||
|
|
||||||
oai-upf:
|
oai-upf:
|
||||||
container_name: "rfsim5g-oai-upf"
|
container_name: "rfsim5g-oai-upf"
|
||||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||||
init: true
|
init: true
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
trf_gen:
|
trf_gen:
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: prod-trf-gen
|
container_name: prod-trf-gen
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
trf_gen:
|
trf_gen:
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: prod-trf-gen
|
container_name: prod-trf-gen
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
trf_gen:
|
trf_gen:
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: prod-trf-gen
|
container_name: prod-trf-gen
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ typedef union checkedparam {
|
|||||||
int num_okintval; /* number of valid values in the checkingval array */
|
int num_okintval; /* number of valid values in the checkingval array */
|
||||||
} s1a;
|
} s1a;
|
||||||
struct {
|
struct {
|
||||||
int (*f2)(configmodule_interface_t *cfg,
|
int (*f2)(const configmodule_interface_t *cfg,
|
||||||
paramdef_t *param); /* check an integer against an authorized range, defined by its min and max value */
|
const paramdef_t *param); /* check an integer against an authorized range, defined by its min and max value */
|
||||||
int okintrange[CONFIG_MAX_NUMCHECKVAL]; /* integer array, store min and max values */
|
int okintrange[CONFIG_MAX_NUMCHECKVAL]; /* integer array, store min and max values */
|
||||||
|
|
||||||
} s2;
|
} s2;
|
||||||
|
|||||||
@@ -183,14 +183,35 @@ int config_check_intval(configmodule_interface_t *cfg, paramdef_t *param)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( int i=0; i<param->chkPptr->s1.num_okintval ; i++) {
|
if (param->type == TYPE_INT32 || param->type == TYPE_INT) {
|
||||||
if( *(param->uptr) == param->chkPptr->s1.okintval[i] ) {
|
if (param->iptr == NULL) {
|
||||||
return 0;
|
fprintf(stderr, "[CONFIG] config_check_intval: %s: NULL iptr\n", param->optname);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
const int v = *param->iptr;
|
||||||
|
for (int i = 0; i < param->chkPptr->s1.num_okintval; i++) {
|
||||||
|
if (v == param->chkPptr->s1.okintval[i])
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "[CONFIG] config_check_intval: %s: %i invalid value, authorized values:\n ", param->optname, v);
|
||||||
|
for (int i = 0; i < param->chkPptr->s1.num_okintval; i++) {
|
||||||
|
fprintf(stderr, " %i", param->chkPptr->s1.okintval[i]);
|
||||||
|
}
|
||||||
|
fprintf(stderr, " \n");
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if (param->uptr == NULL) {
|
||||||
|
fprintf(stderr, "[CONFIG] config_check_intval: %s: NULL uptr\n", param->optname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < param->chkPptr->s1.num_okintval; i++) {
|
||||||
|
if (*(param->uptr) == (uint32_t)param->chkPptr->s1.okintval[i]) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print_intvalueerror(param, "config_check_intval", param->chkPptr->s1.okintval, param->chkPptr->s1.num_okintval);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
print_intvalueerror(param,"config_check_intval", param->chkPptr->s1.okintval,param->chkPptr->s1.num_okintval);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int config_check_modify_integer(configmodule_interface_t *cfg, paramdef_t *param)
|
int config_check_modify_integer(configmodule_interface_t *cfg, paramdef_t *param)
|
||||||
@@ -211,15 +232,38 @@ int config_check_modify_integer(configmodule_interface_t *cfg, paramdef_t *param
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int config_check_intrange(configmodule_interface_t *cfg, paramdef_t *param)
|
int config_check_intrange(const configmodule_interface_t *cfg, const paramdef_t *param)
|
||||||
{
|
{
|
||||||
UNUSED(cfg);
|
UNUSED(cfg);
|
||||||
if( *(param->iptr) >= param->chkPptr->s2.okintrange[0] && *(param->iptr) <= param->chkPptr->s2.okintrange[1] ) {
|
if( *(param->iptr) >= param->chkPptr->s2.okintrange[0] && *(param->iptr) <= param->chkPptr->s2.okintrange[1] ) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr,"[CONFIG] config_check_intrange: %s: %i invalid value, authorized range: %i %i\n",
|
fprintf(stderr,
|
||||||
param->optname, (int)*(param->uptr), param->chkPptr->s2.okintrange[0], param->chkPptr->s2.okintrange[1]);
|
"[CONFIG] config_check_intrange: %s: %i invalid value, authorized range: %i %i\n",
|
||||||
|
param->optname,
|
||||||
|
(int)*(param->iptr),
|
||||||
|
param->chkPptr->s2.okintrange[0],
|
||||||
|
param->chkPptr->s2.okintrange[1]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int config_check_uintrange(const configmodule_interface_t *cfg, const paramdef_t *param)
|
||||||
|
{
|
||||||
|
(void)cfg;
|
||||||
|
const uint32_t *v = param->uptr;
|
||||||
|
const int *range = param->chkPptr->s2.okintrange;
|
||||||
|
|
||||||
|
if (*v >= (uint32_t)range[0] && *v <= (uint32_t)range[1]) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr,
|
||||||
|
"[CONFIG] config_check_uintrange: %s: %u invalid, authorized range: %i %i\n",
|
||||||
|
param->optname,
|
||||||
|
*v,
|
||||||
|
range[0],
|
||||||
|
range[1]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,8 @@ int config_get_processedint(configmodule_interface_t *cfg, paramdef_t *cfgoption
|
|||||||
/* functions to be used in parameters definition, to check parameters values */
|
/* functions to be used in parameters definition, to check parameters values */
|
||||||
int config_check_intval(configmodule_interface_t *cfg, paramdef_t *param);
|
int config_check_intval(configmodule_interface_t *cfg, paramdef_t *param);
|
||||||
int config_check_modify_integer(configmodule_interface_t *cfg, paramdef_t *param);
|
int config_check_modify_integer(configmodule_interface_t *cfg, paramdef_t *param);
|
||||||
int config_check_intrange(configmodule_interface_t *cfg, paramdef_t *param);
|
int config_check_intrange(const configmodule_interface_t *cfg, const paramdef_t *param);
|
||||||
|
int config_check_uintrange(const configmodule_interface_t *cfg, const paramdef_t *param);
|
||||||
int config_check_strval(configmodule_interface_t *cfg, paramdef_t *param);
|
int config_check_strval(configmodule_interface_t *cfg, paramdef_t *param);
|
||||||
int config_checkstr_assign_integer(configmodule_interface_t *cfg, paramdef_t *param);
|
int config_checkstr_assign_integer(configmodule_interface_t *cfg, paramdef_t *param);
|
||||||
const paramdef_t *config_get_paramdef_from_name(const paramdef_t *pd, int num, const char *name);
|
const paramdef_t *config_get_paramdef_from_name(const paramdef_t *pd, int num, const char *name);
|
||||||
|
|||||||
@@ -66,7 +66,6 @@
|
|||||||
#define RETURNok (0)
|
#define RETURNok (0)
|
||||||
#define RETURNerror (-1)
|
#define RETURNerror (-1)
|
||||||
#define DEFAULT_NAS_PATH "PWD"
|
#define DEFAULT_NAS_PATH "PWD"
|
||||||
#define UNUSED_VARIABLE(vARIABLE) (void)(vARIABLE)
|
|
||||||
#define NUM_PRACH_RX_FOR_NOISE_ESTIMATE 100
|
#define NUM_PRACH_RX_FOR_NOISE_ESTIMATE 100
|
||||||
|
|
||||||
// SDAP
|
// SDAP
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ add_subdirectory(nr)
|
|||||||
add_subdirectory(LOG)
|
add_subdirectory(LOG)
|
||||||
add_subdirectory(threadPool)
|
add_subdirectory(threadPool)
|
||||||
add_subdirectory(time_manager)
|
add_subdirectory(time_manager)
|
||||||
add_library(utils utils.c system.c time_meas.c time_stat.c tuntap_if.c reverse_bits.c)
|
add_library(utils utils.c system.c time_meas.c time_stat.c tuntap_if.c reverse_bits.c fsn.c)
|
||||||
target_include_directories(utils PUBLIC .)
|
target_include_directories(utils PUBLIC .)
|
||||||
target_link_libraries(utils PRIVATE ${T_LIB})
|
target_link_libraries(utils PRIVATE ${T_LIB})
|
||||||
add_subdirectory(barrier)
|
add_subdirectory(barrier)
|
||||||
|
|||||||
@@ -67,18 +67,26 @@ the T tracer and only output on the terminal). The default is
|
|||||||
|
|
||||||
## Run a tracer
|
## Run a tracer
|
||||||
|
|
||||||
Go into the directory `common/utils/T/tracer` (or
|
Go into the directory `common/utils/T/tracer` and run for example the
|
||||||
`cmake_targets/ran_build/build/common/utils/T/tracer`) and run for example the
|
|
||||||
`enb` tracer:
|
`enb` tracer:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
#in common/utils/T/tracer directory
|
||||||
./enb -d ../T_messages.txt
|
./enb -d ../T_messages.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can also run it from `cmake_targets/ran_build/build/` directory:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# in cmake_targets/ran_build/build directory
|
||||||
|
./common/utils/T/tracer/enb -d ../../../common/utils/T/T_messages.txt
|
||||||
|
```
|
||||||
|
|
||||||
To trace a remote program, use the `-ip` option. For example,
|
To trace a remote program, use the `-ip` option. For example,
|
||||||
if you want to trace a program running on `192.168.12.148` do:
|
if you want to trace a program running on `192.168.12.148` do:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
# in common/utils/T/tracer directory
|
||||||
./enb -d ../T_messages.txt -ip 192.168.12.148
|
./enb -d ../T_messages.txt -ip 192.168.12.148
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ Or, from an existing build directory using cmake:
|
|||||||
```shell
|
```shell
|
||||||
cd cmake_targets/ran_build/build
|
cd cmake_targets/ran_build/build
|
||||||
cmake -DT_RECORD_DB=ON .
|
cmake -DT_RECORD_DB=ON .
|
||||||
|
# use make or ninja
|
||||||
make T_tools
|
make T_tools
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -53,6 +54,9 @@ The binary is then available in:
|
|||||||
cmake_targets/ran_build/build/common/utils/T/tracer/record_db
|
cmake_targets/ran_build/build/common/utils/T/tracer/record_db
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**NOTE*: Unlike other docs on T Tracer for `record_db` we are building in cmake
|
||||||
|
directory rather than in the directory of T.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- a running ClickHouse server reachable from `record_db`
|
- a running ClickHouse server reachable from `record_db`
|
||||||
@@ -84,8 +88,8 @@ To enable all events except the most verbose groups and write them to
|
|||||||
ClickHouse:
|
ClickHouse:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
cd cmake_targets/ran_build/build/common/utils/T/tracer
|
cd cmake_targets/ran_build/build/
|
||||||
./record_db -d ../T_messages.txt \
|
./common/utils/T/tracer/record_db -d ../../../common/utils/T/T_messages.txt \
|
||||||
-ON \
|
-ON \
|
||||||
-off VCD \
|
-off VCD \
|
||||||
-off HEAVY \
|
-off HEAVY \
|
||||||
@@ -108,7 +112,7 @@ The event selection rules are the same as for [`record`](./record.md):
|
|||||||
These options are processed in order. For example:
|
These options are processed in order. For example:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
./record_db -d ../T_messages.txt -OFF -on GNB_PHY_UL_FD_PUSCH_IQ -on GNB_PHY_UL_PAYLOAD_RX_BITS
|
./common/utils/T/tracer/record_db -d ../../../common/utils/T/T_messages.txt -OFF -on GNB_PHY_UL_FD_PUSCH_IQ -on GNB_PHY_UL_PAYLOAD_RX_BITS
|
||||||
```
|
```
|
||||||
|
|
||||||
This starts from everything disabled and enables only the two listed
|
This starts from everything disabled and enables only the two listed
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#ifndef ACTOR_H
|
#ifndef ACTOR_H
|
||||||
#define ACTOR_H
|
#define ACTOR_H
|
||||||
#include "notified_fifo.h"
|
#include "common/utils/threadPool/notified_fifo.h"
|
||||||
|
|
||||||
#define INIT_ACTOR(ptr, name, core_affinity) init_actor((Actor_t *)ptr, name, core_affinity);
|
#define INIT_ACTOR(ptr, name, core_affinity) init_actor((Actor_t *)ptr, name, core_affinity);
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ add_library(ds OBJECT
|
|||||||
seq_arr.c
|
seq_arr.c
|
||||||
hashtable.c
|
hashtable.c
|
||||||
obj_hashtable.c
|
obj_hashtable.c
|
||||||
|
spsc_q.c
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(ds PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(ds PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|||||||
@@ -10,36 +10,6 @@
|
|||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
char *hashtable_rc_code2string(hashtable_rc_t rcP)
|
|
||||||
//-------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
{
|
|
||||||
switch (rcP) {
|
|
||||||
case HASH_TABLE_OK:
|
|
||||||
return "HASH_TABLE_OK";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HASH_TABLE_INSERT_OVERWRITTEN_DATA:
|
|
||||||
return "HASH_TABLE_INSERT_OVERWRITTEN_DATA";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HASH_TABLE_KEY_NOT_EXISTS:
|
|
||||||
return "HASH_TABLE_KEY_NOT_EXISTS";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HASH_TABLE_KEY_ALREADY_EXISTS:
|
|
||||||
return "HASH_TABLE_KEY_ALREADY_EXISTS";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HASH_TABLE_BAD_PARAMETER_HASHTABLE:
|
|
||||||
return "HASH_TABLE_BAD_PARAMETER_HASHTABLE";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return "UNKNOWN hashtable_rc_t";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//-------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
/*
|
/*
|
||||||
* free int function
|
* free int function
|
||||||
* hash_free_int_func() is used when this hashtable is used to store int values as data (pointer = value).
|
* hash_free_int_func() is used when this hashtable is used to store int values as data (pointer = value).
|
||||||
@@ -147,41 +117,6 @@ hashtable_rc_t hashtable_is_key_exists (const hash_table_t *const hashtblP, cons
|
|||||||
|
|
||||||
return HASH_TABLE_KEY_NOT_EXISTS;
|
return HASH_TABLE_KEY_NOT_EXISTS;
|
||||||
}
|
}
|
||||||
//-------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
hashtable_rc_t hashtable_dump_content (const hash_table_t *const hashtblP, char *const buffer_pP, int *const remaining_bytes_in_buffer_pP )
|
|
||||||
//-------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
{
|
|
||||||
hash_node_t *node = NULL;
|
|
||||||
unsigned int i = 0;
|
|
||||||
|
|
||||||
if (hashtblP == NULL) {
|
|
||||||
*remaining_bytes_in_buffer_pP = snprintf(
|
|
||||||
buffer_pP,
|
|
||||||
*remaining_bytes_in_buffer_pP,
|
|
||||||
"HASH_TABLE_BAD_PARAMETER_HASHTABLE");
|
|
||||||
return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((i < hashtblP->size) && (*remaining_bytes_in_buffer_pP > 0)) {
|
|
||||||
if (hashtblP->nodes[i] != NULL) {
|
|
||||||
node=hashtblP->nodes[i];
|
|
||||||
|
|
||||||
while(node) {
|
|
||||||
*remaining_bytes_in_buffer_pP = snprintf(
|
|
||||||
buffer_pP,
|
|
||||||
*remaining_bytes_in_buffer_pP,
|
|
||||||
"Key 0x%"PRIx64" Element %p\n",
|
|
||||||
node->key,
|
|
||||||
node->data);
|
|
||||||
node=node->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return HASH_TABLE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------------------------------------------
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -44,12 +44,10 @@ typedef struct hash_table_iterator_s {
|
|||||||
const hash_table_t* const hashtbl;
|
const hash_table_t* const hashtbl;
|
||||||
} hash_table_iterator_s;
|
} hash_table_iterator_s;
|
||||||
|
|
||||||
char *hashtable_rc_code2string(hashtable_rc_t rcP);
|
|
||||||
void hash_free_int_func(void *memoryP);
|
void hash_free_int_func(void *memoryP);
|
||||||
hash_table_t *hashtable_create (const hash_size_t size, hash_size_t (*hashfunc)(const hash_key_t ), void (*freefunc)(void *));
|
hash_table_t *hashtable_create (const hash_size_t size, hash_size_t (*hashfunc)(const hash_key_t ), void (*freefunc)(void *));
|
||||||
hashtable_rc_t hashtable_destroy(hash_table_t **hashtbl);
|
hashtable_rc_t hashtable_destroy(hash_table_t **hashtbl);
|
||||||
hashtable_rc_t hashtable_is_key_exists (const hash_table_t *const hashtbl, const uint64_t key);
|
hashtable_rc_t hashtable_is_key_exists (const hash_table_t *const hashtbl, const uint64_t key);
|
||||||
hashtable_rc_t hashtable_dump_content (const hash_table_t *const hashtblP, char *const buffer_pP, int *const remaining_bytes_in_buffer_pP );
|
|
||||||
hashtable_rc_t hashtable_insert (hash_table_t *const hashtbl, const hash_key_t key, void *data);
|
hashtable_rc_t hashtable_insert (hash_table_t *const hashtbl, const hash_key_t key, void *data);
|
||||||
hashtable_rc_t hashtable_remove (hash_table_t *const hashtbl, const hash_key_t key);
|
hashtable_rc_t hashtable_remove (hash_table_t *const hashtbl, const hash_key_t key);
|
||||||
hashtable_rc_t hashtable_get (const hash_table_t *const hashtbl, const hash_key_t key, void **dataP);
|
hashtable_rc_t hashtable_get (const hash_table_t *const hashtbl, const hash_key_t key, void **dataP);
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "spsc_q.h"
|
||||||
|
|
||||||
|
spsc_q_t spsc_q_alloc(size_t cnt, size_t elsiz)
|
||||||
|
{
|
||||||
|
/* internally, use one element more: the ringbuffer is full if
|
||||||
|
* (write_idx + 1) % cnt == read_idx, so it's full if one element is still
|
||||||
|
* free (because otherwise write_idx == read_idx, but this is the empty
|
||||||
|
* condition) */
|
||||||
|
cnt += 1;
|
||||||
|
spsc_q_t rb = {.cnt = cnt, .elsiz = elsiz};
|
||||||
|
rb.buf = calloc(cnt, elsiz);
|
||||||
|
return rb;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spsc_q_free(spsc_q_t *rb)
|
||||||
|
{
|
||||||
|
free(rb->buf);
|
||||||
|
memset(rb, 0, sizeof(*rb));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool spsc_q_put(spsc_q_t *rb, const void *src, size_t elsiz)
|
||||||
|
{
|
||||||
|
assert(elsiz == rb->elsiz);
|
||||||
|
size_t w = atomic_load_explicit(&rb->write_idx, memory_order_relaxed);
|
||||||
|
size_t r = atomic_load_explicit(&rb->read_idx, memory_order_acquire);
|
||||||
|
if ((w + 1) % rb->cnt == r) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *bufpos = &rb->buf[w * rb->elsiz];
|
||||||
|
memcpy(bufpos, src, elsiz);
|
||||||
|
atomic_store_explicit(&rb->write_idx, (w + 1) % rb->cnt, memory_order_release);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool spsc_q_get_if(spsc_q_t *rb, pred p, void *user, void *dest, size_t elsiz)
|
||||||
|
{
|
||||||
|
assert(elsiz == rb->elsiz);
|
||||||
|
size_t w = atomic_load_explicit(&rb->write_idx, memory_order_acquire);
|
||||||
|
size_t r = atomic_load_explicit(&rb->read_idx, memory_order_relaxed);
|
||||||
|
if (w == r) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *bufpos = &rb->buf[rb->read_idx * rb->elsiz];
|
||||||
|
if (!p(bufpos, user)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dest)
|
||||||
|
memcpy(dest, bufpos, elsiz);
|
||||||
|
atomic_store_explicit(&rb->read_idx, (r + 1) % rb->cnt, memory_order_release);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool always(const void *data, void *user)
|
||||||
|
{
|
||||||
|
(void) data;
|
||||||
|
(void) user;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool spsc_q_get(spsc_q_t *rb, void *dest, size_t elsiz)
|
||||||
|
{
|
||||||
|
return spsc_q_get_if(rb, always, NULL, dest, elsiz);
|
||||||
|
}
|
||||||
|
|
||||||
|
int spsc_q_get_while(spsc_q_t *rb, pred p, void *user, void *dest, size_t elsiz, size_t max_len)
|
||||||
|
{
|
||||||
|
assert(elsiz == rb->elsiz);
|
||||||
|
size_t count = 0;
|
||||||
|
while (count < max_len && spsc_q_get_if(rb, p, user, dest + elsiz * count, elsiz))
|
||||||
|
count++;
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int spsc_q_drop_while(spsc_q_t *rb, pred p, void *user)
|
||||||
|
{
|
||||||
|
size_t dropped = 0;
|
||||||
|
while (spsc_q_get_if(rb, p, user, NULL, rb->elsiz))
|
||||||
|
dropped++;
|
||||||
|
return dropped;
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SPSC_Q_H_
|
||||||
|
#define SPSC_Q_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdatomic.h>
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
// use atomic_size_t to help interworking with C++
|
||||||
|
using std::atomic_size_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct spsc_q {
|
||||||
|
uint8_t *buf;
|
||||||
|
size_t elsiz;
|
||||||
|
size_t cnt;
|
||||||
|
|
||||||
|
atomic_size_t write_idx;
|
||||||
|
atomic_size_t read_idx;
|
||||||
|
} spsc_q_t;
|
||||||
|
|
||||||
|
spsc_q_t spsc_q_alloc(size_t cnt, size_t elsiz);
|
||||||
|
void spsc_q_free(spsc_q_t *rb);
|
||||||
|
|
||||||
|
bool spsc_q_put(spsc_q_t *rb, const void *src, size_t elsiz);
|
||||||
|
bool spsc_q_get(spsc_q_t *rb, void *dest, size_t elsiz);
|
||||||
|
|
||||||
|
typedef bool (*pred)(const void *data, void *user);
|
||||||
|
bool spsc_q_get_if(spsc_q_t *rb, pred p, void *user, void *dest, size_t elsiz);
|
||||||
|
int spsc_q_drop_while(spsc_q_t *rb, pred p, void *user);
|
||||||
|
int spsc_q_get_while(spsc_q_t *rb, pred p, void *user, void *dest, size_t elsiz, size_t max_len);
|
||||||
|
|
||||||
|
#endif /* SPSC_Q_H_ */
|
||||||
@@ -8,5 +8,11 @@ add_test(NAME test_seq_arr COMMAND test_seq_arr) # no options required
|
|||||||
add_executable(test_hashtable test_hashtable.cpp)
|
add_executable(test_hashtable test_hashtable.cpp)
|
||||||
add_dependencies(tests test_hashtable)
|
add_dependencies(tests test_hashtable)
|
||||||
target_link_libraries(test_hashtable PRIVATE ds GTest::gtest)
|
target_link_libraries(test_hashtable PRIVATE ds GTest::gtest)
|
||||||
add_test(NAME test_hashtable
|
add_test(NAME test_hashtable COMMAND ./test_hashtable)
|
||||||
COMMAND ./test_hashtable)
|
|
||||||
|
add_executable(test_spsc_q test_spsc_q.cpp)
|
||||||
|
target_link_libraries(test_spsc_q ds GTest::gtest)
|
||||||
|
add_dependencies(tests test_spsc_q)
|
||||||
|
add_test(NAME test_spsc_q COMMAND test_spsc_q)
|
||||||
|
add_executable(test_spsc_q_perf test_spsc_q_perf.cpp)
|
||||||
|
target_link_libraries(test_spsc_q_perf PRIVATE ds benchmark::benchmark)
|
||||||
|
|||||||
@@ -0,0 +1,135 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
extern "C" {
|
||||||
|
#include "spsc_q.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(spsc_q, basic_test) {
|
||||||
|
spsc_q_t rb = spsc_q_alloc(2, sizeof(int));
|
||||||
|
|
||||||
|
int a = 1;
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &a, sizeof(a)));
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &a, sizeof(a)));
|
||||||
|
EXPECT_FALSE(spsc_q_put(&rb, &a, sizeof(a)));
|
||||||
|
|
||||||
|
int b;
|
||||||
|
EXPECT_TRUE(spsc_q_get(&rb, &b, sizeof(b)));
|
||||||
|
EXPECT_EQ(a, b);
|
||||||
|
EXPECT_TRUE(spsc_q_get(&rb, &b, sizeof(b)));
|
||||||
|
EXPECT_EQ(a, b);
|
||||||
|
EXPECT_FALSE(spsc_q_get(&rb, &b, sizeof(b)));
|
||||||
|
|
||||||
|
spsc_q_free(&rb);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(spsc_q, cont_write) {
|
||||||
|
spsc_q_t rb = spsc_q_alloc(10, sizeof(int));
|
||||||
|
|
||||||
|
int a = 1;
|
||||||
|
for (int i = 0; i < 1111; ++i) {
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &a, sizeof(a)));
|
||||||
|
a++;
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &a, sizeof(a)));
|
||||||
|
a++;
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &a, sizeof(a)));
|
||||||
|
a++;
|
||||||
|
|
||||||
|
int b;
|
||||||
|
EXPECT_TRUE(spsc_q_get(&rb, &b, sizeof(b)));
|
||||||
|
EXPECT_EQ(b, a - 3);
|
||||||
|
EXPECT_TRUE(spsc_q_get(&rb, &b, sizeof(b)));
|
||||||
|
EXPECT_EQ(b, a - 2);
|
||||||
|
EXPECT_TRUE(spsc_q_get(&rb, &b, sizeof(b)));
|
||||||
|
EXPECT_EQ(b, a - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
spsc_q_free(&rb);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool count(const void *data, void *user)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(data != NULL);
|
||||||
|
int *c = (int *)user;
|
||||||
|
(*c)++;
|
||||||
|
return true; /* count all */
|
||||||
|
}
|
||||||
|
TEST(spsc_q, iterator) {
|
||||||
|
spsc_q_t rb = spsc_q_alloc(10, sizeof(int));
|
||||||
|
int n = 8;
|
||||||
|
for (int i = 0; i < n; ++i)
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &i, sizeof(i)));
|
||||||
|
|
||||||
|
int c = 0;
|
||||||
|
int results[n];
|
||||||
|
int ret = spsc_q_get_while(&rb, count, &c, results, sizeof(*results), n);
|
||||||
|
EXPECT_EQ(c, n);
|
||||||
|
EXPECT_EQ(ret, n);
|
||||||
|
for (int i = 0; i < n; ++i)
|
||||||
|
EXPECT_EQ(results[i], i);
|
||||||
|
|
||||||
|
int b;
|
||||||
|
EXPECT_FALSE(spsc_q_get(&rb, &b, sizeof(b))); /* empty! */
|
||||||
|
|
||||||
|
spsc_q_free(&rb);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool drop(const void *data, void *user)
|
||||||
|
{
|
||||||
|
const int *e = (const int *)data;
|
||||||
|
int *c = (int *)user;
|
||||||
|
EXPECT_EQ(*e, *c);
|
||||||
|
(*c)++;
|
||||||
|
return true; /* drop all */
|
||||||
|
}
|
||||||
|
TEST(spsc_q, drop) {
|
||||||
|
spsc_q_t rb = spsc_q_alloc(10, sizeof(int));
|
||||||
|
int n = 8;
|
||||||
|
for (int i = 0; i < n; ++i)
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &i, sizeof(i)));
|
||||||
|
|
||||||
|
int c = 0;
|
||||||
|
int ret = spsc_q_drop_while(&rb, drop, &c);
|
||||||
|
EXPECT_EQ(c, n);
|
||||||
|
EXPECT_EQ(ret, n);
|
||||||
|
|
||||||
|
int b;
|
||||||
|
EXPECT_FALSE(spsc_q_get(&rb, &b, sizeof(b))); /* empty! */
|
||||||
|
|
||||||
|
spsc_q_free(&rb);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(spsc_q, full) {
|
||||||
|
int n = 3;
|
||||||
|
spsc_q_t rb = spsc_q_alloc(n, sizeof(int));
|
||||||
|
int a = 1;
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &a, sizeof(a)));
|
||||||
|
a++;
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &a, sizeof(a)));
|
||||||
|
a++;
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &a, sizeof(a)));
|
||||||
|
a++;
|
||||||
|
EXPECT_FALSE(spsc_q_put(&rb, &a, sizeof(a))); /* full! */
|
||||||
|
|
||||||
|
int b;
|
||||||
|
EXPECT_TRUE(spsc_q_get(&rb, &b, sizeof(b)));
|
||||||
|
EXPECT_EQ(b, a - n);
|
||||||
|
|
||||||
|
EXPECT_TRUE(spsc_q_put(&rb, &a, sizeof(a)));
|
||||||
|
a++;
|
||||||
|
EXPECT_FALSE(spsc_q_put(&rb, &a, sizeof(a))); /* full! */
|
||||||
|
|
||||||
|
EXPECT_TRUE(spsc_q_get(&rb, &b, sizeof(b)));
|
||||||
|
EXPECT_EQ(b, a - n);
|
||||||
|
|
||||||
|
spsc_q_free(&rb);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
#include "benchmark/benchmark.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
#include "assert.h"
|
||||||
|
#include "pthread.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "spsc_q.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct q_args {
|
||||||
|
spsc_q_t q;
|
||||||
|
int range;
|
||||||
|
} q_args_t;
|
||||||
|
|
||||||
|
static void *producer(void *arg)
|
||||||
|
{
|
||||||
|
q_args_t *a = (q_args_t *) arg;
|
||||||
|
int i = 0;
|
||||||
|
while (i <= a->range) {
|
||||||
|
if (spsc_q_put(&a->q, &i, sizeof(i)))
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *consumer(void *arg)
|
||||||
|
{
|
||||||
|
q_args_t *a = (q_args_t *) arg;
|
||||||
|
int i = 0;
|
||||||
|
while (i != a->range) {
|
||||||
|
int r;
|
||||||
|
if (spsc_q_get(&a->q, &r, sizeof(r))) {
|
||||||
|
assert(r == i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void run_test(int range, int q_size)
|
||||||
|
{
|
||||||
|
q_args_t args = {
|
||||||
|
.q = spsc_q_alloc(q_size, sizeof(int)),
|
||||||
|
.range = range,
|
||||||
|
};
|
||||||
|
|
||||||
|
pthread_t p, c;
|
||||||
|
int ret;
|
||||||
|
// start
|
||||||
|
ret = pthread_create(&p, NULL, producer, &args);
|
||||||
|
assert(ret == 0);
|
||||||
|
ret = pthread_create(&c, NULL, consumer, &args);
|
||||||
|
assert(ret == 0);
|
||||||
|
|
||||||
|
ret = pthread_join(p, NULL);
|
||||||
|
assert(ret == 0);
|
||||||
|
ret = pthread_join(c, NULL);
|
||||||
|
assert(ret == 0);
|
||||||
|
// stop
|
||||||
|
// data/time => throughput
|
||||||
|
|
||||||
|
spsc_q_free(&args.q);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void BM_spsc_q(benchmark::State &state)
|
||||||
|
{
|
||||||
|
int range = 500000;
|
||||||
|
int q_size = state.range(0);
|
||||||
|
for (auto _ : state)
|
||||||
|
run_test(range, q_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
BENCHMARK(BM_spsc_q)->RangeMultiplier(2)->Range(10, 160);
|
||||||
|
|
||||||
|
BENCHMARK_MAIN();
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fsn.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
static int num_slots[5] = {10, 20, 40, 80, 160};
|
||||||
|
|
||||||
|
fsn_t fsn_add_delta(fsn_t fsn, uint32_t delta)
|
||||||
|
{
|
||||||
|
const int slots_frame = num_slots[fsn.mu];
|
||||||
|
int next_f = fsn.f + delta / slots_frame;
|
||||||
|
int next_s = fsn.s + delta % slots_frame;
|
||||||
|
fsn_t res = {
|
||||||
|
.f = (next_f + next_s / slots_frame) % 1024,
|
||||||
|
.s = next_s % slots_frame,
|
||||||
|
.mu = fsn.mu,
|
||||||
|
};
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fsn_get_diff(fsn_t a, fsn_t b)
|
||||||
|
{
|
||||||
|
assert(a.mu == b.mu);
|
||||||
|
const int slots_frame = num_slots[a.mu];
|
||||||
|
int diff = (a.f * slots_frame + a.s) - (b.f * slots_frame + b.s);
|
||||||
|
if (diff < -512 * slots_frame)
|
||||||
|
diff += 1024 * slots_frame;
|
||||||
|
else if (diff > 512 * slots_frame)
|
||||||
|
diff -= 1024 * slots_frame;
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
fsn_t fsn_get_max(fsn_t a, fsn_t b)
|
||||||
|
{
|
||||||
|
if (fsn_get_diff(a, b) <= 0) {
|
||||||
|
return b;
|
||||||
|
} else {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool fsn_equal(fsn_t a, fsn_t b)
|
||||||
|
{
|
||||||
|
assert(a.mu == b.mu);
|
||||||
|
return a.f == b.f && a.s == b.s && a.mu == b.mu;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool fsn_in_the_past(fsn_t old, fsn_t new)
|
||||||
|
{
|
||||||
|
int diff = fsn_get_diff(old, new);
|
||||||
|
return diff < 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FSN_H_
|
||||||
|
#define FSN_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/// helper type to encapsulate a frame/slot combination in a single type.
|
||||||
|
typedef struct fsn {
|
||||||
|
uint16_t f; /// frame
|
||||||
|
uint16_t s; /// slot
|
||||||
|
uint8_t mu; /// numerology
|
||||||
|
} fsn_t;
|
||||||
|
|
||||||
|
/* \brief Add delta slots to fsn. Note that this depends also on the stored
|
||||||
|
* numerology inside fsn. */
|
||||||
|
fsn_t fsn_add_delta(fsn_t fsn, uint32_t delta);
|
||||||
|
|
||||||
|
/* \brief Get difference of slots for a and b.
|
||||||
|
* \note asserts if numerology not the same. */
|
||||||
|
int fsn_get_diff(fsn_t a, fsn_t b);
|
||||||
|
|
||||||
|
/* \brief Gets the larger of two fsns */
|
||||||
|
fsn_t fsn_get_max(fsn_t a, fsn_t b);
|
||||||
|
|
||||||
|
/* \brief Compare if both fsn_t's are equal */
|
||||||
|
bool fsn_equal(fsn_t a, fsn_t b);
|
||||||
|
|
||||||
|
/* \brief Determine if told is in the past of tnew. The threshold is 512
|
||||||
|
* frames. */
|
||||||
|
bool fsn_in_the_past(fsn_t told, fsn_t tnew);
|
||||||
|
|
||||||
|
#endif /* FSN_H_ */
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "common/utils/utils.h"
|
#include "common/utils/utils.h"
|
||||||
|
#include "common/utils/ds/byte_array.h"
|
||||||
|
|
||||||
#define MAX_SI_GROUPS 3
|
#define MAX_SI_GROUPS 3
|
||||||
#define NR_MAX_PDSCH_TBS 3824
|
#define NR_MAX_PDSCH_TBS 3824
|
||||||
@@ -79,10 +80,32 @@ static inline const char *rnti_types(nr_rnti_type_t rr)
|
|||||||
// the total shift is 2 * 15, in dB scale thats 10log10(2^(15*2))
|
// the total shift is 2 * 15, in dB scale thats 10log10(2^(15*2))
|
||||||
#define SQ15_SQUARED_NORM_FACTOR_DB 90.3089986992
|
#define SQ15_SQUARED_NORM_FACTOR_DB 90.3089986992
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NR_SIB_1 = 1,
|
||||||
|
NR_SIB_2,
|
||||||
|
NR_SIB_3,
|
||||||
|
NR_SIB_4,
|
||||||
|
NR_SIB_5,
|
||||||
|
NR_SIB_6,
|
||||||
|
NR_SIB_7,
|
||||||
|
NR_SIB_8,
|
||||||
|
NR_SIB_9,
|
||||||
|
NR_SIB_10,
|
||||||
|
NR_SIB_11,
|
||||||
|
NR_SIB_12,
|
||||||
|
NR_SIB_13,
|
||||||
|
NR_SIB_14,
|
||||||
|
NR_SIB_15,
|
||||||
|
NR_SIB_16,
|
||||||
|
NR_SIB_17,
|
||||||
|
NR_SIB_18,
|
||||||
|
NR_SIB_19,
|
||||||
|
NR_SIB_20,
|
||||||
|
NR_SIB_21,
|
||||||
|
} nr_sib_type_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t *SIB_buffer;
|
nr_sib_type_t SIB_type;
|
||||||
int SIB_size;
|
|
||||||
int SIB_type;
|
|
||||||
} nr_SIBs_t;
|
} nr_SIBs_t;
|
||||||
|
|
||||||
typedef struct nr_bandentry_s {
|
typedef struct nr_bandentry_s {
|
||||||
|
|||||||
@@ -2,3 +2,10 @@
|
|||||||
|
|
||||||
add_executable(test_tpool_vs_actors test_tpool_vs_actors.c)
|
add_executable(test_tpool_vs_actors test_tpool_vs_actors.c)
|
||||||
target_link_libraries(test_tpool_vs_actors PRIVATE thread-pool pthread LOG minimal_lib actor)
|
target_link_libraries(test_tpool_vs_actors PRIVATE thread-pool pthread LOG minimal_lib actor)
|
||||||
|
add_test(NAME test_tpool_vs_actors COMMAND ./test_tpool_vs_actors)
|
||||||
|
add_dependencies(tests test_tpool_vs_actors)
|
||||||
|
|
||||||
|
add_executable(test_fsn test_fsn.cpp)
|
||||||
|
add_dependencies(tests test_fsn)
|
||||||
|
target_link_libraries(test_fsn PRIVATE utils GTest::gtest)
|
||||||
|
add_test(NAME test_fsn COMMAND ./test_fsn)
|
||||||
|
|||||||
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
extern "C" {
|
||||||
|
#include "fsn.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(fsn, test_mu0_fsn_add) {
|
||||||
|
fsn_t current = {123, 5, 0};
|
||||||
|
fsn_t next = current;
|
||||||
|
|
||||||
|
next = fsn_add_delta(next, 12);
|
||||||
|
EXPECT_EQ(next.f, 124);
|
||||||
|
EXPECT_EQ(next.s, 7);
|
||||||
|
EXPECT_EQ(next.mu, 0);
|
||||||
|
|
||||||
|
next = fsn_add_delta(next, 10);
|
||||||
|
EXPECT_EQ(next.f, 125);
|
||||||
|
EXPECT_EQ(next.s, 7);
|
||||||
|
EXPECT_EQ(next.mu, 0);
|
||||||
|
|
||||||
|
next = fsn_add_delta(next, 10 * 1024);
|
||||||
|
EXPECT_EQ(next.f, 125);
|
||||||
|
EXPECT_EQ(next.s, 7);
|
||||||
|
EXPECT_EQ(next.mu, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(fsn, test_mu0_get_diff) {
|
||||||
|
fsn_t current = {123, 5, 0};
|
||||||
|
fsn_t next = fsn_add_delta(current, 12);
|
||||||
|
int diff;
|
||||||
|
|
||||||
|
diff = fsn_get_diff(current, next);
|
||||||
|
EXPECT_EQ(diff, -12);
|
||||||
|
|
||||||
|
diff = fsn_get_diff(next, current);
|
||||||
|
EXPECT_EQ(diff, 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(fsn, test_mu0_get_max) {
|
||||||
|
fsn_t current = {123, 5, 0};
|
||||||
|
fsn_t next = {125, 7, 0};
|
||||||
|
|
||||||
|
fsn_t max = fsn_get_max(current, next);
|
||||||
|
EXPECT_EQ(max.f, next.f);
|
||||||
|
EXPECT_EQ(max.s, next.s);
|
||||||
|
EXPECT_EQ(max.mu, next.mu);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(fsn, test_mu0_equal) {
|
||||||
|
fsn_t a = {123, 5, 0};
|
||||||
|
fsn_t b = a;
|
||||||
|
fsn_t c = {123, 6, 0};
|
||||||
|
|
||||||
|
EXPECT_TRUE(fsn_equal(a, b));
|
||||||
|
EXPECT_FALSE(fsn_equal(a, c));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(fsn, test_mu0_in_the_past) {
|
||||||
|
fsn_t a = {0, 0, 0};
|
||||||
|
fsn_t n = {100, 9, 0};
|
||||||
|
fsn_t b_bef = {511, 9, 0};
|
||||||
|
fsn_t b_ex = {512, 0, 0};
|
||||||
|
fsn_t b_aft = {512, 1, 0};
|
||||||
|
|
||||||
|
// a is in the past of n
|
||||||
|
EXPECT_TRUE(fsn_in_the_past(a, n));
|
||||||
|
// similarly, a is in the past of b_bef
|
||||||
|
EXPECT_TRUE(fsn_in_the_past(a, b_bef));
|
||||||
|
// difference "to both sides" is 512 frames, so we consider a still in the
|
||||||
|
// past of b_ex
|
||||||
|
EXPECT_TRUE(fsn_in_the_past(a, b_ex));
|
||||||
|
// (b_aft - a) < (a - b_aft) => b_aft is in the past of a because of
|
||||||
|
// wrap-around
|
||||||
|
EXPECT_TRUE(fsn_in_the_past(b_aft, a));
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
}
|
||||||
+1
-1
@@ -1967,7 +1967,7 @@ INPUT = \
|
|||||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c \
|
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c \
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/dci_NB_IoT.h \
|
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/dci_NB_IoT.h \
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/group_hopping.c \
|
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/group_hopping.c \
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/if4_tools.h \
|
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/if4_tools.h \
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/uci_tools.c \
|
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/uci_tools.c \
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/prach.c \
|
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/prach.c \
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/edci.c \
|
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/edci.c \
|
||||||
|
|||||||
+3
-3
@@ -154,7 +154,7 @@ These modes of operation are supported:
|
|||||||
- RedCap SIB1 v17 IEs supported
|
- RedCap SIB1 v17 IEs supported
|
||||||
- Coexistence of RedCap and Normal UEs
|
- Coexistence of RedCap and Normal UEs
|
||||||
- Handling of RedCap capability for small PDCP/RLC SN size
|
- Handling of RedCap capability for small PDCP/RLC SN size
|
||||||
- Scheduling of other SIBs (2, 19)
|
- Scheduling of other SIBs (2, 3, 4, 19)
|
||||||
- NTN
|
- NTN
|
||||||
- Support downlinkHARQ-FeedbackDisabled-r17
|
- Support downlinkHARQ-FeedbackDisabled-r17
|
||||||
- Support for 32 PDSCH and PUSCH HARQ processes per UE
|
- Support for 32 PDSCH and PUSCH HARQ processes per UE
|
||||||
@@ -194,7 +194,7 @@ These modes of operation are supported:
|
|||||||
|
|
||||||
- NR RRC (38.331) Rel 17 messages using new [asn1c](https://github.com/mouse07410/asn1c)
|
- NR RRC (38.331) Rel 17 messages using new [asn1c](https://github.com/mouse07410/asn1c)
|
||||||
- LTE RRC (36.331) also updated to Rel 15
|
- LTE RRC (36.331) also updated to Rel 15
|
||||||
- Generation of system information (SIB2)
|
- Generation of system information (SIB2, SIB3, SIB4)
|
||||||
- RRC can configure PDCP and SDAP (through E1), and RLC and MAC (through F1)
|
- RRC can configure PDCP and SDAP (through E1), and RLC and MAC (through F1)
|
||||||
- Interface with GTP-U (tunnel creation/handling for S1-U (NSA), N3 (SA), F1 interfaces)
|
- Interface with GTP-U (tunnel creation/handling for S1-U (NSA), N3 (SA), F1 interfaces)
|
||||||
- Integration of RRC messages and procedures supporting UE 5G SA connection
|
- Integration of RRC messages and procedures supporting UE 5G SA connection
|
||||||
@@ -380,7 +380,7 @@ These modes of operation are supported:
|
|||||||
- MIB processing
|
- MIB processing
|
||||||
- Scheduling of system information block 1 (SIB1) reception
|
- Scheduling of system information block 1 (SIB1) reception
|
||||||
* Other system information
|
* Other system information
|
||||||
- Scheduling of other system information blocks reception
|
- Scheduling of other system information blocks reception (SIB2, SIB3, SIB4)
|
||||||
* Random access procedure (needs improvement, there is still not a clear separation between MAC and PHY)
|
* Random access procedure (needs improvement, there is still not a clear separation between MAC and PHY)
|
||||||
- Mapping SSBs to multiple ROs
|
- Mapping SSBs to multiple ROs
|
||||||
- Scheduling of PRACH
|
- Scheduling of PRACH
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ The other SDRs (AW2S, LimeSDR, ...) have no READMEs.
|
|||||||
- [clang-format.md](./clang-format.md): how to format the code. See also the
|
- [clang-format.md](./clang-format.md): how to format the code. See also the
|
||||||
next entry for an error detection tool.
|
next entry for an error detection tool.
|
||||||
- [formatting](../tools/formatting/README.md) is a clang-format error detection tool
|
- [formatting](../tools/formatting/README.md) is a clang-format error detection tool
|
||||||
|
- [cppcheck](../tools/cppcheck/README.md) for static code analysis
|
||||||
- [sanitizers.md](./dev_tools/sanitizers.md): how to run with ASan/UBSan/MemSAN/TSan
|
- [sanitizers.md](./dev_tools/sanitizers.md): how to run with ASan/UBSan/MemSAN/TSan
|
||||||
- [iwyu](../tools/iwyu/README.md) is a tool to detect `#include` errors
|
- [iwyu](../tools/iwyu/README.md) is a tool to detect `#include` errors
|
||||||
- [docker-dev-env](../tools/docker-dev-env/README.md) is a ubuntu24 docker development environment
|
- [docker-dev-env](../tools/docker-dev-env/README.md) is a ubuntu24 docker development environment
|
||||||
|
|||||||
@@ -633,6 +633,98 @@ sequenceDiagram
|
|||||||
Note over TargetCU: Then: encode Handover Command, send NGAP HANDOVER REQUEST ACKNOWLEDGE
|
Note over TargetCU: Then: encode Handover Command, send NGAP HANDOVER REQUEST ACKNOWLEDGE
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Neighbour cells
|
||||||
|
|
||||||
|
#### SIB3/SIB4 and measurement-gap implementation
|
||||||
|
|
||||||
|
The following section documents the implementation-level control flow
|
||||||
|
for SIB3/SIB4 and measurement-gap handling in current OAI, using the configured
|
||||||
|
neighbor cell list as a shared input model.
|
||||||
|
|
||||||
|
Briefly, the three procedures are:
|
||||||
|
- SIB3: CU derives and provides intra-frequency neighbour SI, which DU broadcasts
|
||||||
|
and UE uses for autonomous idle/inactive intra-frequency reselection.
|
||||||
|
- SIB4: CU derives and provides inter-frequency carrier/neighbour SI, which DU
|
||||||
|
broadcasts and UE uses for autonomous idle/inactive inter-frequency reselection.
|
||||||
|
- MeasGap: CU/DU coordinate dedicated `MeasGapConfig` in UE `MeasConfig`, DU
|
||||||
|
scheduler interrupts transmission (`nr_measgap_scheduling()`) for the UE to
|
||||||
|
apply the MeasGap configuration in connected mode for gap-based measurements that
|
||||||
|
are sent as `MeasurementReport` and processed at CU-CP (`rrc_gNB_process_MeasurementReport()`).
|
||||||
|
Event-driven reports (for example A3) are used by CU-side mobility logic and can
|
||||||
|
trigger handover procedures.
|
||||||
|
|
||||||
|
### MeasGap
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant DM as Data model (neighbour_cell_configuration)
|
||||||
|
participant CU as CU-CP (RRC)
|
||||||
|
participant DU as DU (MAC/RRC)
|
||||||
|
participant UE as UE
|
||||||
|
|
||||||
|
CU-->>DM: Read serving + neighbour frequency/PCI/band data
|
||||||
|
DM-->>CU: Provide neighbour/frequency inputs for MeasConfig
|
||||||
|
CU->>CU: nr_rrc_get_measconfig
|
||||||
|
Note over CU: Build UE MeasConfig
|
||||||
|
CU->>CU: get_meas_timing_config (cell.mtc, ue.measConfig)
|
||||||
|
Note over CU: Check distinct ssbFrequency
|
||||||
|
alt one frequency only
|
||||||
|
Note over CU: returns NULL, no meas_timing_config sent to DU
|
||||||
|
else multiple frequencies
|
||||||
|
CU->>DU: F1AP UE Context Setup Request
|
||||||
|
Note over CU,DU: Includes cu_to_du_rrc_info.meas_timing_config
|
||||||
|
DU->>DU: create_measgap_config
|
||||||
|
DU->>DU: encode_measgap_config
|
||||||
|
DU-->>CU: F1AP UE Context Setup Response
|
||||||
|
Note over DU,CU: Includes du_to_cu_rrc_info.meas_gap_config
|
||||||
|
CU->>CU: get_meas_gap_config
|
||||||
|
Note over CU: Decode/store gap in UE MeasConfig (UE.measConfig.measGapConfig)
|
||||||
|
CU->>UE: RRCReconfiguration
|
||||||
|
Note over CU,UE: Includes MeasConfig.measGapConfig
|
||||||
|
rect rgba(210, 235, 255, 0.35)
|
||||||
|
Note over DU,UE: Measurement-gap window
|
||||||
|
DU->>DU: nr_measgap_scheduling
|
||||||
|
Note over DU: Interrupt transmission for meas gap
|
||||||
|
UE->>UE: nr_rrc_handle_meas_indication
|
||||||
|
Note over UE: Perform gap-based neighbour/inter-frequency measurements
|
||||||
|
UE-->>CU: MeasurementReport
|
||||||
|
end
|
||||||
|
Note over UE,CU: UL-DCCH MeasurementReport for configured events (e.g. A3)
|
||||||
|
CU->>CU: rrc_gNB_process_MeasurementReport
|
||||||
|
Note over CU: Run mobility decision logic (may trigger handover)
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
### SIB3/SIB4
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant DM as Data model (neighbour_cell_configuration)
|
||||||
|
participant CU as CU-CP (RRC)
|
||||||
|
participant DU as DU
|
||||||
|
participant UE as UE
|
||||||
|
|
||||||
|
CU->>CU: cp_f1_served_cell_info_to_cell
|
||||||
|
CU->>DM: get_cell_neighbour_list
|
||||||
|
DM-->>CU: neighbour_cell_configuration for serving cell
|
||||||
|
CU->>CU: get_ssb_arfcn
|
||||||
|
Note over CU: Derive serving_ssb_arfcn from cell MTC
|
||||||
|
loop for each configured neighbour
|
||||||
|
Note over CU: Compare neighbour.absoluteFrequencySSB vs serving_ssb_arfcn
|
||||||
|
alt equal
|
||||||
|
CU->>CU: get_sib3_intra_freq_neighbors
|
||||||
|
else different
|
||||||
|
CU->>CU: get_sib4_inter_freq_neighbors
|
||||||
|
end
|
||||||
|
end
|
||||||
|
CU-->>DU: F1AP F1 Setup Response
|
||||||
|
DU-->>UE: BCCH-DL-SCH-Message
|
||||||
|
Note over DU,UE: Broadcast SystemInformation including configured SIB3/SIB4
|
||||||
|
UE->>UE: nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message
|
||||||
|
Note over UE: Evaluate idle/inactive reselection criteria and timers
|
||||||
|
Note over UE,DU: After reselection, access/registration continues on selected cell DU as needed
|
||||||
|
```
|
||||||
|
|
||||||
## UE Context
|
## UE Context
|
||||||
|
|
||||||
UE context information is stored in `gNB_RRC_UE_t`, which includes:
|
UE context information is stored in `gNB_RRC_UE_t`, which includes:
|
||||||
|
|||||||
+158
-6
@@ -94,7 +94,81 @@ the [MAC configuration](../MAC/mac-usage.md) as well for SIB configuration.
|
|||||||
deactivated, a transparent SDAP header is prepended to packets, but no
|
deactivated, a transparent SDAP header is prepended to packets, but no
|
||||||
further processing is being done.
|
further processing is being done.
|
||||||
- `cu_sibs` (default: `[]`) list of SIBs to give to the DU for transmission.
|
- `cu_sibs` (default: `[]`) list of SIBs to give to the DU for transmission.
|
||||||
Currently, SIB2 is supported.
|
Currently supported:
|
||||||
|
- SIB2: serving-cell reselection parameters (configured in `sib2_config`)
|
||||||
|
- SIB3: intra-frequency neighbour cell list (neighbours on the same SSB ARFCN as the serving cell)
|
||||||
|
- SIB4: inter-frequency carriers + neighbour lists, grouped per `(absoluteFrequencySSB, subcarrierSpacing)`. Per-frequency fields (e.g. `cellReselectionPriority`, `threshX_HighP`, `threshX_LowP`, `q_OffsetFreq`) come from `frequency_list`
|
||||||
|
|
||||||
|
Example activation:
|
||||||
|
```
|
||||||
|
cu_sibs = ( 2, 3, 4 );
|
||||||
|
```
|
||||||
|
SIB2 is configured per-gNB in `sib2_config` (see below). SIB3/SIB4 are derived from the neighbour configuration:
|
||||||
|
- `neighbour_list` / `neighbour_cell_configuration`: neighbour identity + per-neighbour offsets (`q_OffsetCell`, etc.)
|
||||||
|
- `frequency_list`: per-frequency SIB4 reselection parameters (priority/thresholds/`q_OffsetFreq`)
|
||||||
|
|
||||||
|
Example `gNBs.[0].sib2_config`:
|
||||||
|
```
|
||||||
|
cu_sibs = ( 2 );
|
||||||
|
|
||||||
|
sib2_config : {
|
||||||
|
q_Hyst = 0;
|
||||||
|
cellReselectionPriority = 0;
|
||||||
|
threshServingLowP = 0;
|
||||||
|
threshServingLowQ = 4;
|
||||||
|
s_NonIntraSearchP = 10;
|
||||||
|
s_NonIntraSearchQ = 8;
|
||||||
|
q_RxLevMin = -56;
|
||||||
|
q_QualMin = -18;
|
||||||
|
s_IntraSearchP = 22;
|
||||||
|
s_IntraSearchQ = 20;
|
||||||
|
t_ReselectionNR = 1;
|
||||||
|
deriveSSB_IndexFromCell = 1;
|
||||||
|
|
||||||
|
speed_t_Evaluation = 0;
|
||||||
|
speed_t_HystNormal = 0;
|
||||||
|
speed_n_CellChangeMedium = 1;
|
||||||
|
speed_n_CellChangeHigh = 2;
|
||||||
|
speed_sf_Medium = 1;
|
||||||
|
speed_sf_High = 0;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
#### SIB3/SIB4 and measurement gaps
|
||||||
|
|
||||||
|
This section summarizes how SIB3/SIB4 and measurement gaps relate in NR and how OAI currently implements them.
|
||||||
|
|
||||||
|
From 3GPP TS 38.331:
|
||||||
|
|
||||||
|
- `SIB3` carries intra-frequency reselection information (`intraFreqNeighCellList`).
|
||||||
|
- `SIB4` carries inter-frequency reselection information (`interFreqCarrierFreqList`
|
||||||
|
and per-carrier neighbour lists).
|
||||||
|
- `MeasGapConfig` is part of dedicated `MeasConfig` (typically sent in
|
||||||
|
`RRCReconfiguration`) and controls measurement gaps in connected mode.
|
||||||
|
|
||||||
|
In other words:
|
||||||
|
|
||||||
|
- SIB3/SIB4 are broadcast SI for idle/inactive (`RRC_IDLE` / `RRC_INACTIVE`)
|
||||||
|
reselection behavior: UE performs autonomous cell reselection using broadcast
|
||||||
|
SI (SIB3 for intra-frequency, SIB4 for inter-frequency).
|
||||||
|
- `MeasGapConfig` is a dedicated UE measurement behavior and applies to
|
||||||
|
connected mode (`RRC_CONNECTED`): the network configures what the UE
|
||||||
|
measures and reports (periodic and event-based, e.g., A3), and those reports
|
||||||
|
are used by CU-CP mobility logic (including handover decisions).
|
||||||
|
|
||||||
|
MeasGap does not depend on SIB3/SIB4, however they share the same underlying
|
||||||
|
neighbour/frequency data model, which is the common source of serving +
|
||||||
|
neighbour frequency information (see also [Neighbor-gNB configuration](#neighbour-gnb-configuration)):
|
||||||
|
|
||||||
|
- SIB3/SIB4 generation is done on the CU-CP side (inside `rrc_gNB_du.c`) from
|
||||||
|
neighbour/frequency configuration and serving-cell MTC-derived ARFCN.
|
||||||
|
- Measurement-gap configuration also starts from the same neighbour/frequency
|
||||||
|
model: CU uses neighbour fields (frequency/PCI/band) to build UE
|
||||||
|
`MeasConfig` measurement objects, then DU derives/encodes gap parameters
|
||||||
|
from CU-provided timing (`meas_timing_config`) and returns `meas_gap_config`
|
||||||
|
for CU forwarding in dedicated `RRCReconfiguration`.
|
||||||
|
|
||||||
|
Detailed implementation flow and sequence diagrams are documented in [`rrc-dev.md`](./rrc-dev.md).
|
||||||
|
|
||||||
#### UE-specific configuration
|
#### UE-specific configuration
|
||||||
|
|
||||||
@@ -105,12 +179,64 @@ the [MAC configuration](../MAC/mac-usage.md) as well for SIB configuration.
|
|||||||
|
|
||||||
Refer to the [handover tutorial](../handover-tutorial.md) for detailed information about gNB neighbors and handover procedures.
|
Refer to the [handover tutorial](../handover-tutorial.md) for detailed information about gNB neighbors and handover procedures.
|
||||||
|
|
||||||
|
##### Configuration structure and key semantics
|
||||||
|
|
||||||
|
The neighbour configuration is a 2-level structure:
|
||||||
|
|
||||||
|
- Outer list: `neighbour_list`
|
||||||
|
- Key: `nr_cellid` of the serving cell
|
||||||
|
- One entry per serving cell
|
||||||
|
- Inner list: `neighbour_cell_configuration`
|
||||||
|
- Actual neighbour cells for that serving cell
|
||||||
|
- Contains neighbour fields such as `gNB_ID`, neighbour `nr_cellid`, `physical_cellId`, frequency, PLMN, etc.
|
||||||
|
|
||||||
|
This same core configuration model is reused by multiple RRC procedures.
|
||||||
|
|
||||||
|
- SIB3/SIB4 generation: uses neighbour identity/frequency/offset fields to derive
|
||||||
|
intra/inter-frequency SI.
|
||||||
|
- Connected-mode measurement config: uses neighbour frequency/PCI/band fields to build
|
||||||
|
UE `MeasConfig` measurement objects.
|
||||||
|
- Handover-related procedures: reuse neighbour identity fields (e.g., cell ID/PCI/PLMN
|
||||||
|
TAC, gNB ID) for target selection and for populating target-cell information carried
|
||||||
|
in NGAP handover messages.
|
||||||
|
|
||||||
|
Conceptually, for each serving cell the RRC keeps:
|
||||||
|
|
||||||
|
- A per-frequency table (`inter_freqs`): one entry per `(absoluteFrequencySSB,
|
||||||
|
subcarrierSpacing)` used for SIB4, containing the SIB4 per-frequency fields
|
||||||
|
(priority, thresholds, `q_OffsetFreq`, `q_RxLevMin`, `t_ReselectionNR`).
|
||||||
|
- A per-neighbour list (`neighbour_cells`): one entry per neighbour, with
|
||||||
|
identity (cell ID, PCI, PLMN, TAC), frequency (`absoluteFrequencySSB`,
|
||||||
|
`subcarrierSpacing`, `band`), and SIB3/SIB4 per-neighbour offsets
|
||||||
|
(`q_OffsetCell`, `q_RxLevMinOffsetCell`, `q_QualMinOffsetCell`).
|
||||||
|
- A link from neighbours to frequencies: each neighbour implicitly points to
|
||||||
|
the matching `inter_freqs` entry via its `(absoluteFrequencySSB,
|
||||||
|
subcarrierSpacing)`; if no such frequency exists, it is treated as having no
|
||||||
|
SIB4 per-frequency configuration.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- In `neighbour_list`, only `nr_cellid` is used as the key for lookup.
|
||||||
|
- `physical_cellId` belongs to neighbour-cell entries in `neighbour_cell_configuration` (inner list).
|
||||||
|
- `nr_cellid` entries in `neighbour_list` should be unique to avoid ambiguous lookup.
|
||||||
|
- Intra-frequency neighbours (SIB3) are derived only from the per-cell
|
||||||
|
`neighbour_cell_configuration` on the serving carrier.
|
||||||
|
|
||||||
|
At configuration time (`gnb_config.c`), neighbours are parsed into `neighbour_cells`,
|
||||||
|
per-neighbour SIB3/SIB4 offsets are validated, and a per-frequency array `inter_freqs`
|
||||||
|
is built by grouping neighbours by `(absoluteFrequencySSB, subcarrierSpacing)` and
|
||||||
|
in-range SIB4 per-frequency fields (`cellReselectionPriority`, `threshX_HighP/L`,
|
||||||
|
`q_OffsetFreq`) across neighbours on the same ARFCN. At SIB4 build time, the RRC uses
|
||||||
|
`inter_freqs` to create one `InterFreqCarrierFreqInfo` per ARFCN for inter-frequency
|
||||||
|
carriers (ARFCN different from the serving SSB ARFCN) and attaches all neighbours whose
|
||||||
|
`inter_freq_idx` points to that frequency entry.
|
||||||
|
|
||||||
##### Required configuration parameters
|
##### Required configuration parameters
|
||||||
|
|
||||||
To define a neighbor cell in the configuration file, the following parameters are required:
|
To define a neighbour cell in the configuration file, the following parameters are required:
|
||||||
|
|
||||||
- `gNB_ID` - identifier of the neighbor gNB (e.g., `0xe01`)
|
- `gNB_ID` - identifier of the neighbour gNB (e.g., `0xe01`)
|
||||||
- `nr_cellid` - cell identifier of the neighbor cell (e.g., `11111111`)
|
- `nr_cellid` - cell identifier of the neighbour cell (e.g., `11111111`)
|
||||||
- `physical_cellId` - physical cell ID for radio identification (e.g., `1`)
|
- `physical_cellId` - physical cell ID for radio identification (e.g., `1`)
|
||||||
- `absoluteFrequencySSB` - SSB frequency in ARFCN notation (e.g., `643296`)
|
- `absoluteFrequencySSB` - SSB frequency in ARFCN notation (e.g., `643296`)
|
||||||
- `subcarrierSpacing` - numerology index: 0=15kHz, 1=30kHz, 2=60kHz, 3=120kHz
|
- `subcarrierSpacing` - numerology index: 0=15kHz, 1=30kHz, 2=60kHz, 3=120kHz
|
||||||
@@ -123,19 +249,45 @@ To define a neighbor cell in the configuration file, the following parameters ar
|
|||||||
|
|
||||||
Example configuration structure:
|
Example configuration structure:
|
||||||
```
|
```
|
||||||
|
# Per-frequency SIB4 configuration (one entry per ARFCN), shared by all cells
|
||||||
|
frequency_list = (
|
||||||
|
{
|
||||||
|
absoluteFrequencySSB = 643296;
|
||||||
|
subcarrierSpacing = 1; # 30 kHz
|
||||||
|
band = 78;
|
||||||
|
|
||||||
|
frequency_config = (
|
||||||
|
{
|
||||||
|
cellReselectionPriority = 5;
|
||||||
|
threshX_HighP = 10;
|
||||||
|
threshX_LowP = 6;
|
||||||
|
q_OffsetFreq = 0;
|
||||||
|
# Optional: threshX_HighQ, threshX_LowQ, etc.
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
# Per-cell neighbour configuration; neighbours reference frequency_list via ARFCN/SCS
|
||||||
neighbour_list = (
|
neighbour_list = (
|
||||||
{
|
{
|
||||||
nr_cellid = 12345678;
|
nr_cellid = 12345678;
|
||||||
|
|
||||||
neighbour_cell_configuration = (
|
neighbour_cell_configuration = (
|
||||||
{
|
{
|
||||||
gNB_ID = 0xe01;
|
gNB_ID = 0xe01;
|
||||||
nr_cellid = 11111111;
|
nr_cellid = 11111111;
|
||||||
physical_cellId = 1;
|
physical_cellId = 1;
|
||||||
absoluteFrequencySSB = 643296;
|
absoluteFrequencySSB = 643296; # ARFCN used to look up matching entry in frequency_list
|
||||||
subcarrierSpacing = 1; # 30 kHz
|
subcarrierSpacing = 1; # 30 kHz
|
||||||
band = 78;
|
band = 78;
|
||||||
plmn = { mcc = 001; mnc = 01; mnc_length = 2 };
|
plmn = { mcc = 001; mnc = 01; mnc_length = 2 };
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
# Example per-neighbour offsets (SIB3/SIB4)
|
||||||
|
q_OffsetCell = 0;
|
||||||
|
q_RxLevMinOffsetCell = -1;
|
||||||
|
q_QualMinOffsetCell = -1;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,10 +96,6 @@ information on how the images are built.
|
|||||||
- orion: Cross-compilation from Intel to ARM
|
- orion: Cross-compilation from Intel to ARM
|
||||||
- base image from `Dockerfile.base.ubuntu.cross-arm64`
|
- base image from `Dockerfile.base.ubuntu.cross-arm64`
|
||||||
- build image from `Dockerfile.build.ubuntu.cross-arm64` (no target images)
|
- build image from `Dockerfile.build.ubuntu.cross-arm64` (no target images)
|
||||||
- [RAN-cppcheck](https://jenkins-oai.eurecom.fr/job/RAN-cppcheck/)
|
|
||||||
~BUILD-ONLY ~4G-LTE ~5G-NR ~nrUE
|
|
||||||
- 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/)
|
- [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 ~nrUE
|
||||||
- cluster (`Asterix-OC-oaicicd-session` resource): RHEL image build using the OpenShift Cluster (using gcc/clang)
|
- cluster (`Asterix-OC-oaicicd-session` resource): RHEL image build using the OpenShift Cluster (using gcc/clang)
|
||||||
|
|||||||
@@ -512,8 +512,16 @@ configuration, e.g. [neighbour-config-rfsim.conf](../../ci-scripts/conf_files/ne
|
|||||||
This configuration can also be present in a different file and included in the
|
This configuration can also be present in a different file and included in the
|
||||||
gNB configuration file with `@include "neighbour-config-rfsim.conf"`.
|
gNB configuration file with `@include "neighbour-config-rfsim.conf"`.
|
||||||
|
|
||||||
For each gNB there is a `neighbour_cell_configuration` linked to its serving
|
The neighbor configuration is nested:
|
||||||
cell ID.
|
|
||||||
|
- `neighbour_list` outer entries are keyed by serving `nr_cellid`
|
||||||
|
- each outer entry contains `neighbour_cell_configuration`, i.e., the list of neighbor cells for that serving cell
|
||||||
|
|
||||||
|
In this model:
|
||||||
|
|
||||||
|
- outer `nr_cellid` entries should be unique
|
||||||
|
- neighbor `physical_cellId` values are defined in inner neighbor entries
|
||||||
|
- the same serving-cell keyed neighbor mapping is used for both F1 and N2 handover logic
|
||||||
|
|
||||||
See the example above for `neighbour-config-ho.conf`. The same configuration
|
See the example above for `neighbour-config-ho.conf`. The same configuration
|
||||||
is for both F1 and N2 handover.
|
is for both F1 and N2 handover.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "mysql"
|
container_name: "mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
volumes:
|
volumes:
|
||||||
- ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
- ./healthscripts/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
- ./healthscripts/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||||
@@ -172,7 +172,7 @@ services:
|
|||||||
privileged: true
|
privileged: true
|
||||||
init: true
|
init: true
|
||||||
container_name: oai-ext-dn
|
container_name: oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:jammy
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"ip route add 10.0.0.0/16 via 192.168.70.134 dev eth0; ip route; sleep infinity"
|
"ip route add 10.0.0.0/16 via 192.168.70.134 dev eth0; ip route; sleep infinity"
|
||||||
command: ["/bin/bash", "-c", "trap : SIGTERM SIGINT; sleep infinity & wait"]
|
command: ["/bin/bash", "-c", "trap : SIGTERM SIGINT; sleep infinity & wait"]
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
container_name: "mysql"
|
container_name: "mysql"
|
||||||
image: mysql:8.0
|
image: mysql:9.6
|
||||||
volumes:
|
volumes:
|
||||||
- ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
- ./healthscripts/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
- ./healthscripts/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||||
@@ -154,9 +154,9 @@ services:
|
|||||||
privileged: true
|
privileged: true
|
||||||
init: true
|
init: true
|
||||||
container_name: oai-ext-dn
|
container_name: oai-ext-dn
|
||||||
image: oaisoftwarealliance/trf-gen-cn5g:jammy
|
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"ip route add 10.0.0.0/16 via 192.168.70.134 dev eth0; ip route; sleep infinity"
|
"ip route add 10.0.0.0/16 via 192.168.70.134 dev eth0; ip route; iperf3 -s -D; sleep infinity"
|
||||||
command: ["/bin/bash", "-c", "trap : SIGTERM SIGINT; sleep infinity & wait"]
|
command: ["/bin/bash", "-c", "trap : SIGTERM SIGINT; sleep infinity & wait"]
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: /bin/bash -c "ip r | grep 10.0.0"
|
test: /bin/bash -c "ip r | grep 10.0.0"
|
||||||
|
|||||||
@@ -25,4 +25,4 @@ RUN /bin/sh oaienv && \
|
|||||||
CFLAGS="-Werror" CXXFLAGS="-Werror -Wno-vla-cxx-extension" \
|
CFLAGS="-Werror" CXXFLAGS="-Werror -Wno-vla-cxx-extension" \
|
||||||
./build_oai --phy_simulators --gNB --eNB --nrUE --UE \
|
./build_oai --phy_simulators --gNB --eNB --nrUE --UE \
|
||||||
--ninja --build-tool-opt -k10 \
|
--ninja --build-tool-opt -k10 \
|
||||||
--noavx512 --disable-T-Tracer -c
|
--noavx512 -c
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ RUN /bin/sh oaienv && \
|
|||||||
-DAVX512=OFF -DCMAKE_C_FLAGS=-Werror -DCMAKE_CXX_FLAGS=-Werror \
|
-DAVX512=OFF -DCMAKE_C_FLAGS=-Werror -DCMAKE_CXX_FLAGS=-Werror \
|
||||||
-DENABLE_PHYSIM_TESTS=ON \
|
-DENABLE_PHYSIM_TESTS=ON \
|
||||||
-DSANITIZE_ADDRESS=ON -DSANITIZE_UNDEFINED=ON \
|
-DSANITIZE_ADDRESS=ON -DSANITIZE_UNDEFINED=ON \
|
||||||
|
-DT_TRACER=OFF \
|
||||||
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/opt/oai-physim/bin && \
|
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/opt/oai-physim/bin && \
|
||||||
ninja -k10 -j36
|
ninja -k10 -j36
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
#include "nfapi/oai_integration/vendor_ext.h"
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
#include "radio/COMMON/common_lib.h"
|
#include "radio/COMMON/common_lib.h"
|
||||||
|
|
||||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
#include "PHY/if4_tools.h"
|
||||||
#include "PHY/LTE_ESTIMATION/lte_estimation.h"
|
#include "PHY/LTE_ESTIMATION/lte_estimation.h"
|
||||||
|
|
||||||
#include "PHY/phy_extern.h"
|
#include "PHY/phy_extern.h"
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
#include "PHY/phy_extern.h"
|
#include "PHY/phy_extern.h"
|
||||||
#include "PHY/LTE_ESTIMATION/lte_estimation.h"
|
#include "PHY/LTE_ESTIMATION/lte_estimation.h"
|
||||||
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
||||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
#include "PHY/if4_tools.h"
|
||||||
#include "PHY/LTE_TRANSPORT/transport_proto.h"
|
#include "PHY/LTE_TRANSPORT/transport_proto.h"
|
||||||
#include "SCHED/sched_common.h"
|
#include "SCHED/sched_common.h"
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
|
|||||||
@@ -161,7 +161,12 @@ static void rx_func(processingData_L1_t *info)
|
|||||||
NR_UL_IND_t UL_INFO = {.frame = frame_rx, .slot = slot_rx, .module_id = gNB->Mod_id, .CC_id = gNB->CC_id};
|
NR_UL_IND_t UL_INFO = {.frame = frame_rx, .slot = slot_rx, .module_id = gNB->Mod_id, .CC_id = gNB->CC_id};
|
||||||
// Do PRACH RU processing
|
// Do PRACH RU processing
|
||||||
UL_INFO.rach_ind.pdu_list = UL_INFO.prach_pdu_indication_list;
|
UL_INFO.rach_ind.pdu_list = UL_INFO.prach_pdu_indication_list;
|
||||||
L1_nr_prach_procedures(gNB, frame_rx, slot_rx, &UL_INFO.rach_ind);
|
UL_INFO.rach_ind.number_of_pdus = 0;
|
||||||
|
// even if processing is late, we might collect all PRACH
|
||||||
|
// the last PRACH's frame/slot is when all UE's appear to have accessed
|
||||||
|
prach_item_t p;
|
||||||
|
while (spsc_q_get(&gNB->prach_l1rx_queue, &p, sizeof(p)))
|
||||||
|
L1_nr_prach_procedures(gNB, &p, &UL_INFO.rach_ind);
|
||||||
|
|
||||||
//WA: comment rotation in tx/rx
|
//WA: comment rotation in tx/rx
|
||||||
if (gNB->phase_comp) {
|
if (gNB->phase_comp) {
|
||||||
|
|||||||
+11
-5
@@ -15,12 +15,13 @@
|
|||||||
#include "common/utils/nr/nr_common.h"
|
#include "common/utils/nr/nr_common.h"
|
||||||
#include "common/utils/assertions.h"
|
#include "common/utils/assertions.h"
|
||||||
#include "common/utils/system.h"
|
#include "common/utils/system.h"
|
||||||
|
#include "common/utils/fsn.h"
|
||||||
#include "common/ran_context.h"
|
#include "common/ran_context.h"
|
||||||
|
|
||||||
#include "radio/COMMON/common_lib.h"
|
#include "radio/COMMON/common_lib.h"
|
||||||
#include "radio/ETHERNET/ethernet_lib.h"
|
#include "radio/ETHERNET/ethernet_lib.h"
|
||||||
|
|
||||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
#include "PHY/if4_tools.h"
|
||||||
|
|
||||||
#include "PHY/defs_nr_common.h"
|
#include "PHY/defs_nr_common.h"
|
||||||
#include "PHY/phy_extern.h"
|
#include "PHY/phy_extern.h"
|
||||||
@@ -980,11 +981,16 @@ void *ru_thread(void *param)
|
|||||||
proc->tti_rx * gNB->frame_parms.samples_per_slot_wCP);
|
proc->tti_rx * gNB->frame_parms.samples_per_slot_wCP);
|
||||||
|
|
||||||
// Do PRACH RU processing
|
// Do PRACH RU processing
|
||||||
prach_item_t *p =
|
fsn_t now = {.f = proc->frame_rx, .s = proc->tti_rx, .mu = fp->numerology_index};
|
||||||
find_nr_prach(&gNB->prach_list, proc->frame_rx, proc->tti_rx, gNB->frame_parms.nb_antennas_rx, NR_SEARCH_EXIST);
|
prach_item_t p;
|
||||||
if (p) {
|
while (get_next_nr_prach(&gNB->prach_ru_queue, &now, &p)) {
|
||||||
// need to extract RACH data for later processing by rx_nr_prach()
|
// need to extract RACH data for later processing by rx_nr_prach()
|
||||||
rx_nr_prach_ru(p, ru->common.rxdata, ru->nr_frame_parms, ru->N_TA_offset);
|
rx_nr_prach_ru(&p, ru->common.rxdata, ru->nr_frame_parms, ru->N_TA_offset);
|
||||||
|
bool success = spsc_q_put(&gNB->prach_l1rx_queue, &p, sizeof(p));
|
||||||
|
// assume prach_l1rx_queue never full: prach_ru_queue filled at
|
||||||
|
// constant pace, but prach_l1rx_queue emptied as fast as possible,
|
||||||
|
// see rx_func()
|
||||||
|
DevAssert(success);
|
||||||
} // end if (prach_id >= 0)
|
} // end if (prach_id >= 0)
|
||||||
} // end if (ru->feprx)
|
} // end if (ru->feprx)
|
||||||
} // end if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
|
} // end if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
#include "radio/COMMON/common_lib.h"
|
#include "radio/COMMON/common_lib.h"
|
||||||
#include "radio/ETHERNET/ethernet_lib.h"
|
#include "radio/ETHERNET/ethernet_lib.h"
|
||||||
|
|
||||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
#include "PHY/if4_tools.h"
|
||||||
|
|
||||||
#include "PHY/LTE_TRANSPORT/transport_proto.h"
|
#include "PHY/LTE_TRANSPORT/transport_proto.h"
|
||||||
#include "SCHED/sched_eNB.h"
|
#include "SCHED/sched_eNB.h"
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ bool wls_pnf_nr_send_p5_message(pnf_t *pnf, nfapi_nr_p4_p5_message_header_t *msg
|
|||||||
|
|
||||||
bool wls_pnf_nr_send_p7_message(pnf_p7_t *pnf_p7, nfapi_nr_p7_message_header_t *msg, uint32_t msg_len)
|
bool wls_pnf_nr_send_p7_message(pnf_p7_t *pnf_p7, nfapi_nr_p7_message_header_t *msg, uint32_t msg_len)
|
||||||
{
|
{
|
||||||
UNUSED_VARIABLE(msg_len);
|
UNUSED(msg_len);
|
||||||
if (pnf_p7->terminate) {
|
if (pnf_p7->terminate) {
|
||||||
// don't send any further P7 messages after terminating
|
// don't send any further P7 messages after terminating
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -410,7 +410,7 @@ int wls_fapi_nr_vnf_start(nfapi_vnf_config_t *cfg)
|
|||||||
|
|
||||||
bool wls_vnf_nr_send_p5_message(vnf_t *vnf, uint16_t p5_idx, nfapi_nr_p4_p5_message_header_t *msg, uint32_t msg_len)
|
bool wls_vnf_nr_send_p5_message(vnf_t *vnf, uint16_t p5_idx, nfapi_nr_p4_p5_message_header_t *msg, uint32_t msg_len)
|
||||||
{
|
{
|
||||||
UNUSED_VARIABLE(p5_idx);
|
UNUSED(p5_idx);
|
||||||
int packed_len =
|
int packed_len =
|
||||||
vnf->_public.pack_func(msg, msg_len, vnf->tx_message_buffer, sizeof(vnf->tx_message_buffer), &vnf->_public.codec_config);
|
vnf->_public.pack_func(msg, msg_len, vnf->tx_message_buffer, sizeof(vnf->tx_message_buffer), &vnf->_public.codec_config);
|
||||||
|
|
||||||
|
|||||||
+12
-31
@@ -50,6 +50,8 @@ int l1_north_init_gNB()
|
|||||||
|
|
||||||
NR_gNB_PHY_STATS_t *get_phy_stats(PHY_VARS_gNB *gNB, uint16_t rnti)
|
NR_gNB_PHY_STATS_t *get_phy_stats(PHY_VARS_gNB *gNB, uint16_t rnti)
|
||||||
{
|
{
|
||||||
|
// TODO reimplement with hashtable? also called from both UL/DL => not
|
||||||
|
// thread-safe
|
||||||
NR_gNB_PHY_STATS_t *stats;
|
NR_gNB_PHY_STATS_t *stats;
|
||||||
int first_free = -1;
|
int first_free = -1;
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_GNB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_GNB; i++) {
|
||||||
@@ -141,16 +143,6 @@ void phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
|
|
||||||
init_DLSCH_struct(gNB);
|
init_DLSCH_struct(gNB);
|
||||||
|
|
||||||
gNB->nr_srs_info = (nr_srs_info_t **)malloc16_clear(gNB->max_nb_srs * sizeof(nr_srs_info_t*));
|
|
||||||
for (int id = 0; id < gNB->max_nb_srs; id++) {
|
|
||||||
gNB->nr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
|
|
||||||
gNB->nr_srs_info[id]->srs_generated_signal = malloc16_clear(MAX_NUM_NR_SRS_AP * sizeof(c16_t *));
|
|
||||||
for(int ap=0; ap<MAX_NUM_NR_SRS_AP; ap++) {
|
|
||||||
gNB->nr_srs_info[id]->srs_generated_signal[ap] =
|
|
||||||
malloc16_clear(fp->ofdm_symbol_size * MAX_NUM_NR_SRS_SYMBOLS * sizeof(c16_t));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do NOT allocate per-antenna rxdataF: the gNB gets a pointer to the
|
/* Do NOT allocate per-antenna rxdataF: the gNB gets a pointer to the
|
||||||
* RU to copy/recover freq-domain memory from there */
|
* RU to copy/recover freq-domain memory from there */
|
||||||
common_vars->rxdataF = (c16_t ***)malloc16(common_vars->num_beams_period * sizeof(c16_t**));
|
common_vars->rxdataF = (c16_t ***)malloc16(common_vars->num_beams_period * sizeof(c16_t**));
|
||||||
@@ -174,7 +166,7 @@ void phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
common_vars->debugBuff_sample_offset = 0;
|
common_vars->debugBuff_sample_offset = 0;
|
||||||
|
|
||||||
// PRACH
|
// PRACH
|
||||||
init_prach_list(&gNB->prach_list);
|
init_nr_prach(gNB);
|
||||||
|
|
||||||
int N_RB_UL = cfg->carrier_config.ul_grid_size[cfg->ssb_config.scs_common.value].value;
|
int N_RB_UL = cfg->carrier_config.ul_grid_size[cfg->ssb_config.scs_common.value].value;
|
||||||
int n_buf = Prx*max_ul_mimo_layers;
|
int n_buf = Prx*max_ul_mimo_layers;
|
||||||
@@ -212,19 +204,11 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
PHY_MEASUREMENTS_gNB *meas = &gNB->measurements;
|
PHY_MEASUREMENTS_gNB *meas = &gNB->measurements;
|
||||||
free_and_zero(meas->n0_subband_power);
|
free_and_zero(meas->n0_subband_power);
|
||||||
|
|
||||||
for (int id = 0; id < gNB->max_nb_srs; id++) {
|
|
||||||
for(int i=0; i<MAX_NUM_NR_SRS_AP; i++) {
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal[i]);
|
|
||||||
}
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]);
|
|
||||||
}
|
|
||||||
free_and_zero(gNB->nr_srs_info);
|
|
||||||
|
|
||||||
free_ul_reference_signal_sequences();
|
free_ul_reference_signal_sequences();
|
||||||
free_gnb_lowpapr_sequences();
|
free_gnb_lowpapr_sequences();
|
||||||
|
|
||||||
reset_nr_transport(gNB);
|
reset_nr_transport(gNB);
|
||||||
|
reset_nr_prach(gNB);
|
||||||
|
|
||||||
destroy_DLSCH_struct(gNB);
|
destroy_DLSCH_struct(gNB);
|
||||||
|
|
||||||
@@ -437,18 +421,14 @@ void init_nr_transport(PHY_VARS_gNB *gNB)
|
|||||||
else
|
else
|
||||||
buffer_ul_slots = (nb_ul_slots_period < slot_ahead) ? nb_ul_slots_period : slot_ahead;
|
buffer_ul_slots = (nb_ul_slots_period < slot_ahead) ? nb_ul_slots_period : slot_ahead;
|
||||||
|
|
||||||
gNB->max_nb_pucch = buffer_ul_slots ? MAX_MOBILES_PER_GNB * buffer_ul_slots : 1;
|
|
||||||
gNB->max_nb_pusch = buffer_ul_slots ? MAX_MOBILES_PER_GNB * buffer_ul_slots : 1;
|
gNB->max_nb_pusch = buffer_ul_slots ? MAX_MOBILES_PER_GNB * buffer_ul_slots : 1;
|
||||||
gNB->max_nb_srs = buffer_ul_slots ? buffer_ul_slots << 1 : 1; // assuming at most 2 SRS per slot
|
|
||||||
|
|
||||||
gNB->pucch = (NR_gNB_PUCCH_t *)malloc16(gNB->max_nb_pucch * sizeof(NR_gNB_PUCCH_t));
|
int max_nb_pucch = buffer_ul_slots ? MAX_MOBILES_PER_GNB * buffer_ul_slots : 1;
|
||||||
for (int i = 0; i < gNB->max_nb_pucch; i++) {
|
gNB->pucch_queue = spsc_q_alloc(max_nb_pucch, sizeof(NR_gNB_PUCCH_job_t));
|
||||||
memset(&gNB->pucch[i], 0, sizeof(gNB->pucch[i]));
|
gNB->pusch_queue = spsc_q_alloc(gNB->max_nb_pusch, sizeof(NR_gNB_PUSCH_job_t));
|
||||||
}
|
|
||||||
|
|
||||||
gNB->srs = (NR_gNB_SRS_t *)malloc16(gNB->max_nb_srs * sizeof(NR_gNB_SRS_t));
|
int max_nb_srs = buffer_ul_slots ? buffer_ul_slots << 1 : 1; // assuming at most 2 SRS per slot
|
||||||
for (int i = 0; i < gNB->max_nb_srs; i++)
|
gNB->srs_queue = spsc_q_alloc(max_nb_srs, sizeof(NR_gNB_SRS_job_t));
|
||||||
gNB->srs[i].active = 0;
|
|
||||||
|
|
||||||
gNB->ulsch = (NR_gNB_ULSCH_t *)malloc16(gNB->max_nb_pusch * sizeof(NR_gNB_ULSCH_t));
|
gNB->ulsch = (NR_gNB_ULSCH_t *)malloc16(gNB->max_nb_pusch * sizeof(NR_gNB_ULSCH_t));
|
||||||
for (int i = 0; i < gNB->max_nb_pusch; i++) {
|
for (int i = 0; i < gNB->max_nb_pusch; i++) {
|
||||||
@@ -465,8 +445,9 @@ void reset_nr_transport(PHY_VARS_gNB *gNB)
|
|||||||
{
|
{
|
||||||
const NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
const NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||||
|
|
||||||
free(gNB->pucch);
|
spsc_q_free(&gNB->pucch_queue);
|
||||||
free(gNB->srs);
|
spsc_q_free(&gNB->pusch_queue);
|
||||||
|
spsc_q_free(&gNB->srs_queue);
|
||||||
|
|
||||||
for (int i = 0; i < gNB->max_nb_pusch; i++)
|
for (int i = 0; i < gNB->max_nb_pusch; i++)
|
||||||
free_gNB_ulsch(&gNB->ulsch[i], fp->N_RB_UL);
|
free_gNB_ulsch(&gNB->ulsch[i], fp->N_RB_UL);
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "PHY/phy_extern.h"
|
#include "PHY/phy_extern.h"
|
||||||
#include "SCHED/sched_common.h"
|
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "openair1/PHY/defs_RU.h"
|
#include "openair1/PHY/defs_RU.h"
|
||||||
|
|||||||
@@ -251,8 +251,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
|||||||
ue->nr_csi_info->csi_rs_generated_signal[i] =
|
ue->nr_csi_info->csi_rs_generated_signal[i] =
|
||||||
malloc16_clear(fp->samples_per_slot_wCP * sizeof(**ue->nr_csi_info->csi_rs_generated_signal));
|
malloc16_clear(fp->samples_per_slot_wCP * sizeof(**ue->nr_csi_info->csi_rs_generated_signal));
|
||||||
}
|
}
|
||||||
|
|
||||||
ue->nr_srs_info = malloc16_clear(sizeof(nr_srs_info_t));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ue->init_averaging = 1;
|
ue->init_averaging = 1;
|
||||||
@@ -301,8 +299,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue)
|
|||||||
free_and_zero(ue->nr_csi_info->csi_rs_generated_signal);
|
free_and_zero(ue->nr_csi_info->csi_rs_generated_signal);
|
||||||
free_and_zero(ue->nr_csi_info);
|
free_and_zero(ue->nr_csi_info);
|
||||||
|
|
||||||
free_and_zero(ue->nr_srs_info);
|
|
||||||
|
|
||||||
free_and_zero(ue->prach_vars[gNB_id]);
|
free_and_zero(ue->prach_vars[gNB_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
#include "PHY/defs_eNB.h"
|
#include "PHY/defs_eNB.h"
|
||||||
//#include "PHY/phy_extern.h"
|
#include "PHY/if4_tools.h"
|
||||||
//#include "prach.h"
|
|
||||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
|
||||||
|
|
||||||
#include "SCHED/sched_eNB.h"
|
#include "SCHED/sched_eNB.h"
|
||||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||||
|
|||||||
@@ -4255,7 +4255,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
|||||||
LOG_D(PHY,"Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
|
LOG_D(PHY,"Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
|
||||||
LOG_D(PHY,"Format 0 DCI :ulsch (ue): phich status %d\n",ulsch->harq_processes[harq_pid]->status);
|
LOG_D(PHY,"Format 0 DCI :ulsch (ue): phich status %d\n",ulsch->harq_processes[harq_pid]->status);
|
||||||
#else
|
#else
|
||||||
UNUSED_VARIABLE(dai);
|
UNUSED(dai);
|
||||||
#endif
|
#endif
|
||||||
return(0);
|
return(0);
|
||||||
} else {
|
} else {
|
||||||
@@ -4889,7 +4889,7 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
|
|||||||
printf("ulsch (eNB): Nsymb_pusch %d\n",ulsch->harq_processes[harq_pid]->Nsymb_pusch);
|
printf("ulsch (eNB): Nsymb_pusch %d\n",ulsch->harq_processes[harq_pid]->Nsymb_pusch);
|
||||||
printf("ulsch (eNB): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
|
printf("ulsch (eNB): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
|
||||||
#else
|
#else
|
||||||
UNUSED_VARIABLE(dai);
|
UNUSED(dai);
|
||||||
#endif
|
#endif
|
||||||
return(0);
|
return(0);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
#include "executables/lte-softmodem.h"
|
#include "executables/lte-softmodem.h"
|
||||||
#include "PHY/phy_extern_ue.h"
|
#include "PHY/phy_extern_ue.h"
|
||||||
//#include "prach.h"
|
//#include "prach.h"
|
||||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
#include "PHY/if4_tools.h"
|
||||||
|
|
||||||
#include "SCHED_UE/sched_UE.h"
|
#include "SCHED_UE/sched_UE.h"
|
||||||
#include "SCHED/sched_common_extern.h"
|
#include "SCHED/sched_common_extern.h"
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
#include "PHY/CODING/lte_interleaver_inline.h"
|
#include "PHY/CODING/lte_interleaver_inline.h"
|
||||||
#include "PHY/LTE_TRANSPORT/transport_eNB.h"
|
#include "PHY/LTE_TRANSPORT/transport_eNB.h"
|
||||||
#include "modulation_eNB.h"
|
#include "modulation_eNB.h"
|
||||||
#include "nr_modulation.h"
|
|
||||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||||
|
|
||||||
int beam_precoding(int32_t **txdataF,
|
int beam_precoding(int32_t **txdataF,
|
||||||
@@ -80,25 +79,3 @@ int beam_precoding_one_eNB(int32_t **txdataF,
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void nr_beam_precoding(c16_t **txdataF,
|
|
||||||
c16_t **txdataF_BF,
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
|
||||||
int32_t ***beam_weights,
|
|
||||||
int symbol,
|
|
||||||
int aa,
|
|
||||||
int nb_antenna_ports,
|
|
||||||
int offset)
|
|
||||||
{
|
|
||||||
// clear txdata_BF[aa][re] for each call of ue_spec_beamforming
|
|
||||||
memset(&txdataF_BF[aa][symbol*frame_parms->ofdm_symbol_size], 0, sizeof(c16_t) *(frame_parms->ofdm_symbol_size));
|
|
||||||
|
|
||||||
for (int p = 0; p < nb_antenna_ports; p++) {
|
|
||||||
multadd_cpx_vector((c16_t *)&txdataF[p][(symbol * frame_parms->ofdm_symbol_size) + offset],
|
|
||||||
(c16_t *)beam_weights[p][aa],
|
|
||||||
(c16_t *)&txdataF_BF[aa][symbol * frame_parms->ofdm_symbol_size],
|
|
||||||
frame_parms->ofdm_symbol_size,
|
|
||||||
15);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nr_modulation.h"
|
||||||
|
#include "openair1/PHY/TOOLS/tools_defs.h"
|
||||||
|
|
||||||
|
void nr_beam_precoding(c16_t **txdataF,
|
||||||
|
c16_t **txdataF_BF,
|
||||||
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
int32_t ***beam_weights,
|
||||||
|
int symbol,
|
||||||
|
int aa,
|
||||||
|
int nb_antenna_ports,
|
||||||
|
int offset)
|
||||||
|
{
|
||||||
|
// clear txdata_BF[aa][re] for each call of ue_spec_beamforming
|
||||||
|
memset(&txdataF_BF[aa][symbol*frame_parms->ofdm_symbol_size], 0, sizeof(c16_t) *(frame_parms->ofdm_symbol_size));
|
||||||
|
|
||||||
|
for (int p = 0; p < nb_antenna_ports; p++) {
|
||||||
|
multadd_cpx_vector((c16_t *)&txdataF[p][(symbol * frame_parms->ofdm_symbol_size) + offset],
|
||||||
|
(c16_t *)beam_weights[p][aa],
|
||||||
|
(c16_t *)&txdataF_BF[aa][symbol * frame_parms->ofdm_symbol_size],
|
||||||
|
frame_parms->ofdm_symbol_size,
|
||||||
|
15);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "nr_modulation.h"
|
#include "nr_modulation.h"
|
||||||
|
#include "openair1/PHY/TOOLS/tools_defs.h"
|
||||||
#include "PHY/NR_REFSIG/nr_mod_table.h"
|
#include "PHY/NR_REFSIG/nr_mod_table.h"
|
||||||
#include "executables/softmodem-common.h"
|
#include "executables/softmodem-common.h"
|
||||||
#include <simde/x86/avx512.h>
|
#include <simde/x86/avx512.h>
|
||||||
@@ -688,12 +689,12 @@ c16_t nr_layer_precoder_cm(int n_layers,
|
|||||||
int symSz,
|
int symSz,
|
||||||
c16_t datatx_F_precoding[n_layers][symSz],
|
c16_t datatx_F_precoding[n_layers][symSz],
|
||||||
int ap,
|
int ap,
|
||||||
nfapi_nr_pm_pdu_t *pmi_pdu,
|
c16_t weights[NR_MAX_NB_LAYERS][NR_MAX_CSI_PORTS],
|
||||||
int offset)
|
int offset)
|
||||||
{
|
{
|
||||||
c16_t precodatatx_F = {0};
|
c16_t precodatatx_F = {0};
|
||||||
for (int al = 0; al < n_layers; al++) {
|
for (int al = 0; al < n_layers; al++) {
|
||||||
c16_t prec_weight = pmi_pdu->weights[al][ap];
|
c16_t prec_weight = weights[al][ap];
|
||||||
precodatatx_F = c16maddShift(datatx_F_precoding[al][offset], prec_weight, precodatatx_F, 15);
|
precodatatx_F = c16maddShift(datatx_F_precoding[al][offset], prec_weight, precodatatx_F, 15);
|
||||||
}
|
}
|
||||||
return precodatatx_F;
|
return precodatatx_F;
|
||||||
@@ -803,15 +804,15 @@ static inline __attribute__((always_inline)) __m128i cmac_prec128(__m128i y, __m
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define load_consts(Type, Instruct, Rank) \
|
#define load_consts(Type, Instruct, Rank) \
|
||||||
const Type w_c##Rank = Instruct(c16toI32(c16conj(pmi_pdu->weights[Rank][ant]))); \
|
const Type w_c##Rank = Instruct(c16toI32(c16conj(weights[Rank][ant]))); \
|
||||||
const Type w_s##Rank = Instruct(c16toI32(c16swap(pmi_pdu->weights[Rank][ant]))); \
|
const Type w_s##Rank = Instruct(c16toI32(c16swap(weights[Rank][ant]))); \
|
||||||
const Type *in##Rank = (Type *)(txdataF_res_mapped[Rank] + sc_offset + (out-beginning));
|
const Type *in##Rank = (Type *)(txdataF_res_mapped[Rank] + sc_offset + (out-beginning));
|
||||||
|
|
||||||
void nr_layer_precoder_simd(const int n_layers,
|
void nr_layer_precoder_simd(const int n_layers,
|
||||||
const int symSz,
|
const int symSz,
|
||||||
const c16_t txdataF_res_mapped[n_layers][symSz],
|
const c16_t txdataF_res_mapped[n_layers][symSz],
|
||||||
const int ant,
|
const int ant,
|
||||||
const nfapi_nr_pm_pdu_t *pmi_pdu,
|
c16_t weights[NR_MAX_NB_LAYERS][NR_MAX_CSI_PORTS],
|
||||||
const int sc_offset,
|
const int sc_offset,
|
||||||
const int re_cnt,
|
const int re_cnt,
|
||||||
c16_t *txdataF_precoded)
|
c16_t *txdataF_precoded)
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "PHY/defs_nr_common.h"
|
#include "PHY/defs_nr_common.h"
|
||||||
#include "PHY/defs_gNB.h"
|
|
||||||
|
|
||||||
#define DMRS_MOD_ORDER 2
|
#define DMRS_MOD_ORDER 2
|
||||||
/*Precoding matices: W[pmi][antenna_port][layer]*/
|
/*Precoding matices: W[pmi][antenna_port][layer]*/
|
||||||
@@ -127,7 +126,7 @@ c16_t nr_layer_precoder_cm(int n_layers,
|
|||||||
int symSz,
|
int symSz,
|
||||||
c16_t datatx_F_precoding[n_layers][symSz],
|
c16_t datatx_F_precoding[n_layers][symSz],
|
||||||
int ap,
|
int ap,
|
||||||
nfapi_nr_pm_pdu_t *pmi_pdu,
|
c16_t weights[NR_MAX_NB_LAYERS][NR_MAX_CSI_PORTS],
|
||||||
int offset);
|
int offset);
|
||||||
|
|
||||||
/*! \brief Precoding with SIMDe, txdataF_precoded[] = prec_matrix[] * txdataF_res_mapped[]
|
/*! \brief Precoding with SIMDe, txdataF_precoded[] = prec_matrix[] * txdataF_res_mapped[]
|
||||||
@@ -140,7 +139,7 @@ void nr_layer_precoder_simd(const int n_layers,
|
|||||||
const int symSz,
|
const int symSz,
|
||||||
const c16_t txdataF_res_mapped[n_layers][symSz],
|
const c16_t txdataF_res_mapped[n_layers][symSz],
|
||||||
const int ant,
|
const int ant,
|
||||||
const nfapi_nr_pm_pdu_t *pmi_pdu,
|
c16_t weights[NR_MAX_NB_LAYERS][NR_MAX_CSI_PORTS],
|
||||||
const int sc_offset,
|
const int sc_offset,
|
||||||
const int re_cnt,
|
const int re_cnt,
|
||||||
c16_t *txdataF_precoded);
|
c16_t *txdataF_precoded);
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "openair1/PHY/TOOLS/tools_defs.h" // c16_t
|
#include "openair1/PHY/TOOLS/tools_defs.h" // c16_t
|
||||||
#include "nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h" // nfapi_nr_pm_pdu_t
|
|
||||||
#include "nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h" // fapi_nr_dl_config_dci_dl_pdu_rel15_t
|
#include "nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h" // fapi_nr_dl_config_dci_dl_pdu_rel15_t
|
||||||
|
|
||||||
//#include "openair1/PHY/MODULATION/nr_modulation.h" // nr_layer_precoder_simd_[cm, simd]
|
//#include "openair1/PHY/MODULATION/nr_modulation.h" // nr_layer_precoder_simd_[cm, simd]
|
||||||
@@ -25,7 +24,7 @@ c16_t nr_layer_precoder_cm(int n_layers,
|
|||||||
int symbol_size,
|
int symbol_size,
|
||||||
c16_t (*dataF_in)[/*symbol_size*/], // c16_t dataF_in[n_layers][symbol_size]
|
c16_t (*dataF_in)[/*symbol_size*/], // c16_t dataF_in[n_layers][symbol_size]
|
||||||
int ant,
|
int ant,
|
||||||
nfapi_nr_pm_pdu_t *pmi_pdu,
|
c16_t weights[NR_MAX_NB_LAYERS][NR_MAX_CSI_PORTS],
|
||||||
int offset);
|
int offset);
|
||||||
|
|
||||||
// Forward declare the function but hide the Variable-Length Array (VLA) feature from C not available in C++
|
// Forward declare the function but hide the Variable-Length Array (VLA) feature from C not available in C++
|
||||||
@@ -33,7 +32,7 @@ void nr_layer_precoder_simd(int n_layers,
|
|||||||
int symbol_size,
|
int symbol_size,
|
||||||
const c16_t (*dataF_in)[/*symbol_size*/], // c16_t dataF_in[n_layers][symbol_size]
|
const c16_t (*dataF_in)[/*symbol_size*/], // c16_t dataF_in[n_layers][symbol_size]
|
||||||
int ant,
|
int ant,
|
||||||
const nfapi_nr_pm_pdu_t *pmi_pdu,
|
c16_t weights[NR_MAX_NB_LAYERS][NR_MAX_CSI_PORTS],
|
||||||
int offset,
|
int offset,
|
||||||
int re_cnt,
|
int re_cnt,
|
||||||
c16_t *dataF_out);
|
c16_t *dataF_out);
|
||||||
@@ -65,15 +64,15 @@ TEST(NrLayerPrecoderTest, Basic)
|
|||||||
c16_t(*dataF_in)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_in.data());
|
c16_t(*dataF_in)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_in.data());
|
||||||
c16_t(*dataF_out)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_out.data());
|
c16_t(*dataF_out)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_out.data());
|
||||||
|
|
||||||
// Create and populate the pmi_pdu structure
|
// Create and populate the weights
|
||||||
nfapi_nr_pm_pdu_t pmi_pdu = {0};
|
c16_t weights[NR_MAX_NB_LAYERS][NR_MAX_CSI_PORTS];
|
||||||
for (int layer = 0; layer < n_layers; ++layer) {
|
for (int layer = 0; layer < n_layers; ++layer) {
|
||||||
pmi_pdu.weights[layer][ant] = (c16_t){-SHRT_MAX, 0};
|
weights[layer][ant] = (c16_t){-SHRT_MAX, 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the C function
|
// Call the C function
|
||||||
for (int symbol = 0; symbol < re_cnt; symbol++)
|
for (int symbol = 0; symbol < re_cnt; symbol++)
|
||||||
dataF_out[ant][symbol] = nr_layer_precoder_cm(n_layers, symbol_size, dataF_in, ant, &pmi_pdu, symbol);
|
dataF_out[ant][symbol] = nr_layer_precoder_cm(n_layers, symbol_size, dataF_in, ant, weights, symbol);
|
||||||
|
|
||||||
// You can calculate the expected value manually or test rough correctness
|
// You can calculate the expected value manually or test rough correctness
|
||||||
for (int symbol = 0; symbol < re_cnt; symbol++) {
|
for (int symbol = 0; symbol < re_cnt; symbol++) {
|
||||||
@@ -110,14 +109,14 @@ TEST(NrLayerPrecoderTest, SIMD)
|
|||||||
c16_t(*dataF_in)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_in.data());
|
c16_t(*dataF_in)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_in.data());
|
||||||
c16_t(*dataF_out)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_out.data());
|
c16_t(*dataF_out)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_out.data());
|
||||||
|
|
||||||
// Create and populate the pmi_pdu structure
|
// Create and populate the weights
|
||||||
nfapi_nr_pm_pdu_t pmi_pdu = {0};
|
c16_t weights[NR_MAX_NB_LAYERS][NR_MAX_CSI_PORTS];
|
||||||
for (int layer = 0; layer < n_layers; ++layer) {
|
for (int layer = 0; layer < n_layers; ++layer) {
|
||||||
pmi_pdu.weights[layer][ant] = (c16_t){-SHRT_MAX, 0};
|
weights[layer][ant] = (c16_t){-SHRT_MAX, 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the C function
|
// Call the C function
|
||||||
nr_layer_precoder_simd(n_layers, symbol_size, dataF_in, ant, &pmi_pdu, 0, re_cnt, dataF_out[ant]);
|
nr_layer_precoder_simd(n_layers, symbol_size, dataF_in, ant, weights, 0, re_cnt, dataF_out[ant]);
|
||||||
|
|
||||||
// You can calculate the expected value manually or test rough correctness
|
// You can calculate the expected value manually or test rough correctness
|
||||||
for (int symbol = 0; symbol < re_cnt; symbol++) {
|
for (int symbol = 0; symbol < re_cnt; symbol++) {
|
||||||
@@ -156,15 +155,14 @@ TEST(NrLayerPrecoderTest, Compare_CM_SIMD)
|
|||||||
c16_t(*dataF_out_cm)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_out_cm.data());
|
c16_t(*dataF_out_cm)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_out_cm.data());
|
||||||
c16_t(*dataF_out_simd)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_out_simd.data());
|
c16_t(*dataF_out_simd)[symbol_size] = reinterpret_cast<c16_t(*)[symbol_size]>(buffer_out_simd.data());
|
||||||
|
|
||||||
// Create and populate the pmi_pdu structure
|
// Create and populate the weights
|
||||||
nfapi_nr_pm_pdu_t pmi_pdu = {0};
|
c16_t weights[NR_MAX_NB_LAYERS][NR_MAX_CSI_PORTS];
|
||||||
pmi_pdu.pm_idx = 4;
|
|
||||||
for (int layer = 0; layer < n_layers; ++layer) {
|
for (int layer = 0; layer < n_layers; ++layer) {
|
||||||
// Could not use convert_precoder_weight() as complex.h could not be used in googletest
|
// Could not use convert_precoder_weight() as complex.h could not be used in googletest
|
||||||
// Use the logic in convert_precoder_weight()
|
// Use the logic in convert_precoder_weight()
|
||||||
// precoder [−1,−j]
|
// precoder [−1,−j]
|
||||||
pmi_pdu.weights[layer][0] = (c16_t){-SHRT_MAX, 0};
|
weights[layer][0] = (c16_t){-SHRT_MAX, 0};
|
||||||
pmi_pdu.weights[layer][1] = (c16_t){0, -SHRT_MAX};
|
weights[layer][1] = (c16_t){0, -SHRT_MAX};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the results for all the antenna
|
// Get the results for all the antenna
|
||||||
@@ -172,10 +170,10 @@ TEST(NrLayerPrecoderTest, Compare_CM_SIMD)
|
|||||||
|
|
||||||
// Call the C function
|
// Call the C function
|
||||||
for (int symbol = 0; symbol < re_cnt; symbol++)
|
for (int symbol = 0; symbol < re_cnt; symbol++)
|
||||||
dataF_out_cm[ant][symbol] = nr_layer_precoder_cm(n_layers, symbol_size, dataF_in, ant, &pmi_pdu, symbol);
|
dataF_out_cm[ant][symbol] = nr_layer_precoder_cm(n_layers, symbol_size, dataF_in, ant, weights, symbol);
|
||||||
|
|
||||||
// Call the C function
|
// Call the C function
|
||||||
nr_layer_precoder_simd(n_layers, symbol_size, dataF_in, ant, &pmi_pdu, 0, re_cnt, dataF_out_simd[ant]);
|
nr_layer_precoder_simd(n_layers, symbol_size, dataF_in, ant, weights, 0, re_cnt, dataF_out_simd[ant]);
|
||||||
|
|
||||||
// Compare the result from both C function
|
// Compare the result from both C function
|
||||||
for (int symbol = 0; symbol < re_cnt; symbol++) {
|
for (int symbol = 0; symbol < re_cnt; symbol++) {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "PHY/defs_eNB.h"
|
|
||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
#include "PHY/NR_ESTIMATION/nr_ul_estimation.h"
|
#include "PHY/NR_ESTIMATION/nr_ul_estimation.h"
|
||||||
|
|
||||||
|
|||||||
@@ -123,12 +123,12 @@ void dump_nr_I0_stats(FILE *fd, PHY_VARS_gNB *gNB)
|
|||||||
fprintf(fd, "\nPRACH I0 = %d.%d dB\n", gNB->measurements.prach_I0 / 10, gNB->measurements.prach_I0 % 10);
|
fprintf(fd, "\nPRACH I0 = %d.%d dB\n", gNB->measurements.prach_I0 / 10, gNB->measurements.prach_I0 % 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_symb, uint32_t rb_mask_ul[14][9])
|
void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_symb, uint32_t rb_mask_ul[14][MAX_BWP_SIZE])
|
||||||
{
|
{
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
NR_gNB_COMMON *common_vars = &gNB->common_vars;
|
NR_gNB_COMMON *common_vars = &gNB->common_vars;
|
||||||
PHY_MEASUREMENTS_gNB *measurements = &gNB->measurements;
|
PHY_MEASUREMENTS_gNB *measurements = &gNB->measurements;
|
||||||
int nb_symb[275]={0};
|
int nb_symb[MAX_BWP_SIZE] = {0};
|
||||||
|
|
||||||
unsigned int tmp_n0_subband[frame_parms->nb_antennas_rx][frame_parms->N_RB_UL];
|
unsigned int tmp_n0_subband[frame_parms->nb_antennas_rx][frame_parms->N_RB_UL];
|
||||||
memset(tmp_n0_subband, 0, sizeof(tmp_n0_subband));
|
memset(tmp_n0_subband, 0, sizeof(tmp_n0_subband));
|
||||||
@@ -137,7 +137,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_sy
|
|||||||
for (int s = first_symb; s < first_symb + num_symb; s++) {
|
for (int s = first_symb; s < first_symb + num_symb; s++) {
|
||||||
int offset0 = ((slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot + s) * frame_parms->ofdm_symbol_size;
|
int offset0 = ((slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot + s) * frame_parms->ofdm_symbol_size;
|
||||||
for (int rb = 0; rb < frame_parms->N_RB_UL; rb++) {
|
for (int rb = 0; rb < frame_parms->N_RB_UL; rb++) {
|
||||||
if ((rb_mask_ul[s][rb >> 5] & (1U << (rb & 31))) == 0 && // check that rb was not used in this subframe
|
if (rb_mask_ul[s][rb] == 0 && // check that rb was not used in this subframe
|
||||||
!(I0_SKIP_DC && rb == frame_parms->N_RB_UL >> 1)) { // skip middle PRB because of artificial noise possibly created by FFT
|
!(I0_SKIP_DC && rb == frame_parms->N_RB_UL >> 1)) { // skip middle PRB because of artificial noise possibly created by FFT
|
||||||
int offset = offset0 + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
int offset = offset0 + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
||||||
nb_symb[rb]++;
|
nb_symb[rb]++;
|
||||||
@@ -162,6 +162,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_sy
|
|||||||
int32_t n0_subband_tot_perANT[frame_parms->nb_antennas_rx];
|
int32_t n0_subband_tot_perANT[frame_parms->nb_antennas_rx];
|
||||||
memset(n0_subband_tot_perANT, 0, sizeof(n0_subband_tot_perANT));
|
memset(n0_subband_tot_perANT, 0, sizeof(n0_subband_tot_perANT));
|
||||||
|
|
||||||
|
bool init_meas = measurements->n0_subband_power == NULL;
|
||||||
allocCast2D(n0_subband_power,
|
allocCast2D(n0_subband_power,
|
||||||
unsigned int,
|
unsigned int,
|
||||||
measurements->n0_subband_power,
|
measurements->n0_subband_power,
|
||||||
@@ -174,6 +175,9 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_sy
|
|||||||
if (nb_symb[rb] > 0) {
|
if (nb_symb[rb] > 0) {
|
||||||
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
tmp_n0_subband[aarx][rb] /= nb_symb[rb];
|
tmp_n0_subband[aarx][rb] /= nb_symb[rb];
|
||||||
|
// Initialize n0_subband_power from the first measurement before EMA
|
||||||
|
if (init_meas)
|
||||||
|
n0_subband_power[aarx][rb] = tmp_n0_subband[aarx][rb];
|
||||||
// apply exponential moving average to smooth noise measurements
|
// apply exponential moving average to smooth noise measurements
|
||||||
n0_subband_power[aarx][rb] = 0.9 * n0_subband_power[aarx][rb] + 0.1 * tmp_n0_subband[aarx][rb];
|
n0_subband_power[aarx][rb] = 0.9 * n0_subband_power[aarx][rb] + 0.1 * tmp_n0_subband[aarx][rb];
|
||||||
n0_subband_tot_perPRB += n0_subband_power[aarx][rb];
|
n0_subband_tot_perPRB += n0_subband_power[aarx][rb];
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ typedef struct puschAntennaProc_s {
|
|||||||
int aarx;
|
int aarx;
|
||||||
int beam_nb;
|
int beam_nb;
|
||||||
int numAntennas;
|
int numAntennas;
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu;
|
const nfapi_nr_pusch_pdu_t *pusch_pdu;
|
||||||
int *max_ch;
|
int *max_ch;
|
||||||
c16_t *pilot;
|
c16_t *pilot;
|
||||||
int *nest_count;
|
int *nest_count;
|
||||||
@@ -82,7 +82,7 @@ static void nr_pusch_antenna_processing(void *arg)
|
|||||||
int aarx = rdata->aarx;
|
int aarx = rdata->aarx;
|
||||||
int numAntennas = rdata->numAntennas;
|
int numAntennas = rdata->numAntennas;
|
||||||
unsigned short bwp_start_subcarrier = rdata->bwp_start_subcarrier;
|
unsigned short bwp_start_subcarrier = rdata->bwp_start_subcarrier;
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu = rdata->pusch_pdu;
|
const nfapi_nr_pusch_pdu_t *pusch_pdu = rdata->pusch_pdu;
|
||||||
int *max_ch = rdata->max_ch;
|
int *max_ch = rdata->max_ch;
|
||||||
c16_t *pilot = rdata->pilot;
|
c16_t *pilot = rdata->pilot;
|
||||||
uint64_t noise_amp2 = *(rdata->noise_amp2);
|
uint64_t noise_amp2 = *(rdata->noise_amp2);
|
||||||
@@ -452,10 +452,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
int nl,
|
int nl,
|
||||||
unsigned short p,
|
unsigned short p,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
int ul_id,
|
NR_gNB_PUSCH *pusch_vars,
|
||||||
int beam_nb,
|
int beam_nb,
|
||||||
unsigned short bwp_start_subcarrier,
|
unsigned short bwp_start_subcarrier,
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu,
|
const nfapi_nr_pusch_pdu_t *pusch_pdu,
|
||||||
int *max_ch,
|
int *max_ch,
|
||||||
uint32_t *nvar,
|
uint32_t *nvar,
|
||||||
c16_t *pusch_dmrs_slot_mem,
|
c16_t *pusch_dmrs_slot_mem,
|
||||||
@@ -534,7 +534,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
int nest_count = 0;
|
int nest_count = 0;
|
||||||
uint64_t noise_amp2 = 0;
|
uint64_t noise_amp2 = 0;
|
||||||
delay_t *delay = &gNB->ulsch[ul_id].delay;
|
delay_t *delay = &pusch_vars->delay;
|
||||||
memset(delay, 0, sizeof(*delay));
|
memset(delay, 0, sizeof(*delay));
|
||||||
|
|
||||||
int nb_antennas_rx = fp->nb_antennas_rx;
|
int nb_antennas_rx = fp->nb_antennas_rx;
|
||||||
@@ -579,7 +579,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
rdata->delay = &delay_arr[rdata->aarx];
|
rdata->delay = &delay_arr[rdata->aarx];
|
||||||
rdata->beam_nb = beam_nb;
|
rdata->beam_nb = beam_nb;
|
||||||
rdata->frame_parms = fp;
|
rdata->frame_parms = fp;
|
||||||
rdata->pusch_vars = &gNB->pusch_vars[ul_id];
|
rdata->pusch_vars = pusch_vars;
|
||||||
rdata->chest_freq = gNB->chest_freq;
|
rdata->chest_freq = gNB->chest_freq;
|
||||||
rdata->rxdataF = gNB->common_vars.rxdataF;
|
rdata->rxdataF = gNB->common_vars.rxdataF;
|
||||||
rdata->scope = gNB->scopeData;
|
rdata->scope = gNB->scopeData;
|
||||||
@@ -628,7 +628,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
*
|
*
|
||||||
* PARAMETERS : gNB : gNB data structure
|
* PARAMETERS : gNB : gNB data structure
|
||||||
* rel15_ul : UL parameters
|
* rel15_ul : UL parameters
|
||||||
* UE_id : UE ID
|
* pusch_vars : PUSCH data
|
||||||
* nr_tti_rx : slot rx TTI
|
* nr_tti_rx : slot rx TTI
|
||||||
* dmrs_symbol_flag: DMRS Symbol Flag
|
* dmrs_symbol_flag: DMRS Symbol Flag
|
||||||
* symbol : OFDM Symbol
|
* symbol : OFDM Symbol
|
||||||
@@ -646,25 +646,22 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
// #define DEBUG_UL_PTRS
|
// #define DEBUG_UL_PTRS
|
||||||
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul,
|
const nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
uint8_t ulsch_id,
|
NR_gNB_PUSCH *pusch_vars,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_tti_rx,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
uint32_t nb_re_pusch)
|
uint32_t nb_re_pusch)
|
||||||
{
|
{
|
||||||
NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ulsch_id];
|
|
||||||
int32_t *ptrs_re_symbol = NULL;
|
int32_t *ptrs_re_symbol = NULL;
|
||||||
int8_t ret = 0;
|
int8_t ret = 0;
|
||||||
uint8_t symbInSlot = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols;
|
uint8_t symbInSlot = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols;
|
||||||
uint8_t *startSymbIndex = &rel15_ul->start_symbol_index;
|
uint8_t startSymbIndex = rel15_ul->start_symbol_index;
|
||||||
uint8_t *nbSymb = &rel15_ul->nr_of_symbols;
|
uint8_t nbSymb = rel15_ul->nr_of_symbols;
|
||||||
uint8_t *L_ptrs = &rel15_ul->pusch_ptrs.ptrs_time_density;
|
uint8_t L_ptrs = rel15_ul->pusch_ptrs.ptrs_time_density;
|
||||||
uint8_t *K_ptrs = &rel15_ul->pusch_ptrs.ptrs_freq_density;
|
uint8_t K_ptrs = rel15_ul->pusch_ptrs.ptrs_freq_density;
|
||||||
uint16_t *dmrsSymbPos = &rel15_ul->ul_dmrs_symb_pos;
|
uint16_t dmrsSymbPos = rel15_ul->ul_dmrs_symb_pos;
|
||||||
uint16_t *ptrsSymbPos = &pusch_vars->ptrs_symbols;
|
uint16_t nb_rb = rel15_ul->rb_size;
|
||||||
uint8_t *ptrsSymbIdx = &pusch_vars->ptrs_symbol_index;
|
uint8_t ptrsReOffset = rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset;
|
||||||
uint16_t *nb_rb = &rel15_ul->rb_size;
|
|
||||||
uint8_t *ptrsReOffset = &rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset;
|
|
||||||
|
|
||||||
/* loop over antennas */
|
/* loop over antennas */
|
||||||
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
@@ -673,7 +670,7 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
|||||||
*ptrs_re_symbol = 0;
|
*ptrs_re_symbol = 0;
|
||||||
phase_per_symbol[symbol].i = 0;
|
phase_per_symbol[symbol].i = 0;
|
||||||
/* set DMRS estimates to 0 angle with magnitude 1 */
|
/* set DMRS estimates to 0 angle with magnitude 1 */
|
||||||
if (is_dmrs_symbol(symbol, *dmrsSymbPos)) {
|
if (is_dmrs_symbol(symbol, dmrsSymbPos)) {
|
||||||
/* set DMRS real estimation to 32767 */
|
/* set DMRS real estimation to 32767 */
|
||||||
phase_per_symbol[symbol].r = INT16_MAX; // 32767
|
phase_per_symbol[symbol].r = INT16_MAX; // 32767
|
||||||
#ifdef DEBUG_UL_PTRS
|
#ifdef DEBUG_UL_PTRS
|
||||||
@@ -683,17 +680,13 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
|||||||
phase_per_symbol[symbol].r = 0;
|
phase_per_symbol[symbol].r = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (symbol == *startSymbIndex) {
|
if (symbol == startSymbIndex) {
|
||||||
*ptrsSymbPos = 0;
|
pusch_vars->ptrs_symbols = 0;
|
||||||
set_ptrs_symb_idx(ptrsSymbPos, *nbSymb, *startSymbIndex, 1 << *L_ptrs, *dmrsSymbPos);
|
set_ptrs_symb_idx(&pusch_vars->ptrs_symbols, nbSymb, startSymbIndex, 1 << L_ptrs, dmrsSymbPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if not PTRS symbol set current ptrs symbol index to zero*/
|
|
||||||
*ptrsSymbIdx = 0;
|
|
||||||
|
|
||||||
/* Check if current symbol contains PTRS */
|
/* Check if current symbol contains PTRS */
|
||||||
if (is_ptrs_symbol(symbol, *ptrsSymbPos)) {
|
if (is_ptrs_symbol(symbol, pusch_vars->ptrs_symbols)) {
|
||||||
*ptrsSymbIdx = symbol;
|
|
||||||
/*------------------------------------------------------------------------------------------------------- */
|
/*------------------------------------------------------------------------------------------------------- */
|
||||||
/* 1) Estimate common phase error per PTRS symbol */
|
/* 1) Estimate common phase error per PTRS symbol */
|
||||||
/*------------------------------------------------------------------------------------------------------- */
|
/*------------------------------------------------------------------------------------------------------- */
|
||||||
@@ -703,9 +696,9 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
|||||||
rel15_ul->scid,
|
rel15_ul->scid,
|
||||||
nr_tti_rx,
|
nr_tti_rx,
|
||||||
symbol);
|
symbol);
|
||||||
nr_ptrs_cpe_estimation(*K_ptrs,
|
nr_ptrs_cpe_estimation(K_ptrs,
|
||||||
*ptrsReOffset,
|
ptrsReOffset,
|
||||||
*nb_rb,
|
nb_rb,
|
||||||
rel15_ul->rnti,
|
rel15_ul->rnti,
|
||||||
frame_parms->ofdm_symbol_size,
|
frame_parms->ofdm_symbol_size,
|
||||||
&pusch_vars->rxdataF_comp[aarx][(symbol * nb_re_pusch)],
|
&pusch_vars->rxdataF_comp[aarx][(symbol * nb_re_pusch)],
|
||||||
@@ -720,8 +713,8 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
|||||||
/* 2) Interpolate PTRS estimated value in TD */
|
/* 2) Interpolate PTRS estimated value in TD */
|
||||||
/*------------------------------------------------------------------------------------------------------- */
|
/*------------------------------------------------------------------------------------------------------- */
|
||||||
/* If L-PTRS is > 0 then we need interpolation */
|
/* If L-PTRS is > 0 then we need interpolation */
|
||||||
if (*L_ptrs > 0) {
|
if (L_ptrs > 0) {
|
||||||
ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, (int16_t *)phase_per_symbol, *startSymbIndex, *nbSymb);
|
ret = nr_ptrs_process_slot(dmrsSymbPos, pusch_vars->ptrs_symbols, (int16_t *)phase_per_symbol, startSymbIndex, nbSymb);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
LOG_W(PHY, "[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n");
|
LOG_W(PHY, "[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n");
|
||||||
}
|
}
|
||||||
@@ -730,17 +723,17 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
|||||||
/*------------------------------------------------------------------------------------------------------- */
|
/*------------------------------------------------------------------------------------------------------- */
|
||||||
/* 3) Compensated DMRS based estimated signal with PTRS estimation */
|
/* 3) Compensated DMRS based estimated signal with PTRS estimation */
|
||||||
/*--------------------------------------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------------------------------------*/
|
||||||
for (uint8_t i = *startSymbIndex; i < symbInSlot; i++) {
|
for (uint8_t i = startSymbIndex; i < symbInSlot; i++) {
|
||||||
/* DMRS Symbol has 0 phase so no need to rotate the respective symbol */
|
/* DMRS Symbol has 0 phase so no need to rotate the respective symbol */
|
||||||
/* Skip rotation if the slot processing is wrong */
|
/* Skip rotation if the slot processing is wrong */
|
||||||
if ((!is_dmrs_symbol(i, *dmrsSymbPos)) && (ret == 0)) {
|
if ((!is_dmrs_symbol(i, dmrsSymbPos)) && (ret == 0)) {
|
||||||
#ifdef DEBUG_UL_PTRS
|
#ifdef DEBUG_UL_PTRS
|
||||||
printf("[PHY][UL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r, phase_per_symbol[i].i);
|
printf("[PHY][UL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r, phase_per_symbol[i].i);
|
||||||
#endif
|
#endif
|
||||||
rotate_cpx_vector(&pusch_vars->rxdataF_comp[aarx][i * nb_re_pusch],
|
rotate_cpx_vector(&pusch_vars->rxdataF_comp[aarx][i * nb_re_pusch],
|
||||||
&phase_per_symbol[i],
|
&phase_per_symbol[i],
|
||||||
&pusch_vars->rxdataF_comp[aarx][i * nb_re_pusch],
|
&pusch_vars->rxdataF_comp[aarx][i * nb_re_pusch],
|
||||||
((*nb_rb) * NR_NB_SC_PER_RB),
|
(nb_rb * NR_NB_SC_PER_RB),
|
||||||
15);
|
15);
|
||||||
} // if not DMRS Symbol
|
} // if not DMRS Symbol
|
||||||
} // symbol loop
|
} // symbol loop
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
\param Ns slot number (0..19)
|
\param Ns slot number (0..19)
|
||||||
\param p
|
\param p
|
||||||
\param symbol symbol within slot
|
\param symbol symbol within slot
|
||||||
\param ul_id
|
\param pusch_vars lower-phy PUSCH info
|
||||||
\param bwp_start_subcarrier first allocated subcarrier
|
\param bwp_start_subcarrier first allocated subcarrier
|
||||||
\param pusch_pdu
|
\param pusch_pdu
|
||||||
\param max_ch maximum value of estimated channel
|
\param max_ch maximum value of estimated channel
|
||||||
@@ -29,10 +29,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
int nl,
|
int nl,
|
||||||
unsigned short p,
|
unsigned short p,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
int ul_id,
|
NR_gNB_PUSCH *pusch_vars,
|
||||||
int beam_nb,
|
int beam_nb,
|
||||||
unsigned short bwp_start_subcarrier,
|
unsigned short bwp_start_subcarrier,
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu,
|
const nfapi_nr_pusch_pdu_t *pusch_pdu,
|
||||||
int *max_ch,
|
int *max_ch,
|
||||||
uint32_t *nvar,
|
uint32_t *nvar,
|
||||||
c16_t *pusch_dmrs_slot_mem,
|
c16_t *pusch_dmrs_slot_mem,
|
||||||
@@ -40,7 +40,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB);
|
void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB);
|
||||||
|
|
||||||
void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_symb, uint32_t rb_mask_ul[14][9]);
|
void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_symb, uint32_t rb_mask_ul[14][MAX_BWP_SIZE]);
|
||||||
|
|
||||||
void nr_est_srs_timing_advance_offset(uint16_t ofdm_symbol_size,
|
void nr_est_srs_timing_advance_offset(uint16_t ofdm_symbol_size,
|
||||||
const c16_t srs_estimated_channel_time[][NR_SRS_IDFT_OVERSAMP_FACTOR * ofdm_symbol_size],
|
const c16_t srs_estimated_channel_time[][NR_SRS_IDFT_OVERSAMP_FACTOR * ofdm_symbol_size],
|
||||||
@@ -52,8 +52,8 @@ void nr_est_srs_timing_advance_offset(uint16_t ofdm_symbol_size,
|
|||||||
|
|
||||||
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul,
|
const nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
uint8_t ulsch_id,
|
NR_gNB_PUSCH *pusch_vars,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_tti_rx,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
uint32_t nb_re_pusch);
|
uint32_t nb_re_pusch);
|
||||||
|
|||||||
@@ -438,7 +438,7 @@ static inline void do_txdataF(c16_t **txdataF,
|
|||||||
symbol_sz,
|
symbol_sz,
|
||||||
txdataF_precoding,
|
txdataF_precoding,
|
||||||
ant,
|
ant,
|
||||||
pmi_pdu,
|
pmi_pdu->weights,
|
||||||
subCarrier,
|
subCarrier,
|
||||||
re_cnt,
|
re_cnt,
|
||||||
&txdataF[ant][txdataF_offset_per_symbol]);
|
&txdataF[ant][txdataF_offset_per_symbol]);
|
||||||
|
|||||||
@@ -12,72 +12,73 @@
|
|||||||
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
|
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
|
||||||
#include "openair1/PHY/NR_TRANSPORT/nr_prach.h"
|
#include "openair1/PHY/NR_TRANSPORT/nr_prach.h"
|
||||||
|
|
||||||
void init_prach_list(prach_list_t *l)
|
void init_nr_prach(PHY_VARS_gNB *gNB)
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&l->prach_list_mutex, NULL);
|
int num_prach = 8;
|
||||||
memset(l->list, 0, sizeof(l->list));
|
gNB->prach_ru_queue = spsc_q_alloc(num_prach, sizeof(prach_item_t));
|
||||||
|
gNB->prach_l1rx_queue = spsc_q_alloc(num_prach, sizeof(prach_item_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_nr_prach_entry(prach_list_t *l, prach_item_t *p)
|
void reset_nr_prach(PHY_VARS_gNB *gNB)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&l->prach_list_mutex);
|
spsc_q_free(&gNB->prach_ru_queue);
|
||||||
if (p->frame == -1)
|
spsc_q_free(&gNB->prach_l1rx_queue);
|
||||||
LOG_E(NR_PHY_RACH, "Freeing a not allocated prach entry\n");
|
|
||||||
*p = (prach_item_t){.frame = -1, .slot = -1, .num_slots = -1, .nb_rx = p->nb_rx, .prach_buf = (void *)(p + 1)};
|
|
||||||
pthread_mutex_unlock(&l->prach_list_mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
prach_item_t *find_nr_prach(prach_list_t *l, int frame, int slot, int nb_rx, nr_find_type_t type)
|
void free_nr_prach_entry(prach_item_t *p)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&l->prach_list_mutex);
|
free(p->prach_buf);
|
||||||
AssertFatal(nb_rx, "Error! Number of antennas set to 0.\n");
|
|
||||||
prach_item_t **p = l->list;
|
|
||||||
prach_item_t **end = p + NUMBER_OF_NR_PRACH_MAX;
|
|
||||||
for (; p < end; p++)
|
|
||||||
if ((*p) && (*p)->frame == frame && ((*p)->slot + (*p)->num_slots - 1) == slot)
|
|
||||||
break;
|
|
||||||
if (p == end) {
|
|
||||||
if (type == NR_SEARCH_EXIST) {
|
|
||||||
pthread_mutex_unlock(&l->prach_list_mutex);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
for (p = l->list; p < end; p++)
|
|
||||||
if (!(*p) || ((*p)->frame == -1 && (*p)->slot == -1))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (p == end) {
|
|
||||||
pthread_mutex_unlock(&l->prach_list_mutex);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
// mark it used, it will be filled later
|
|
||||||
if (*p && (*p)->nb_rx != nb_rx) {
|
|
||||||
LOG_W(PHY, "rach procedure nb_rx ant changed from %d to %d\n", (*p)->nb_rx, nb_rx);
|
|
||||||
free(*p);
|
|
||||||
*p = NULL;
|
|
||||||
}
|
|
||||||
if (!(*p)) {
|
|
||||||
*p = calloc(1, sizeof(prach_item_t) + sizeof(c16_t) * nb_rx * NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX * NR_PRACH_SEQ_LEN_L);
|
|
||||||
(*p)->prach_buf = (void *)((*p) + 1);
|
|
||||||
}
|
|
||||||
(*p)->nb_rx = nb_rx;
|
|
||||||
(*p)->frame = frame;
|
|
||||||
pthread_mutex_unlock(&l->prach_list_mutex);
|
|
||||||
return (*p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
prach_item_t *nr_schedule_rx_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_nr_prach_pdu_t *prach_pdu)
|
static bool drop_old_prach(const void *data, void *user)
|
||||||
|
{
|
||||||
|
const prach_item_t *p = data;
|
||||||
|
const fsn_t *now = user;
|
||||||
|
const fsn_t t = {p->frame, p->slot, now->mu};
|
||||||
|
bool drop = fsn_in_the_past(t, *now);
|
||||||
|
if (drop)
|
||||||
|
LOG_E(NR_PHY, "%4d.%2d PRACH job is in the past (%4d.%2d)\n", now->f, now->s, t.f, t.s);
|
||||||
|
return drop;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool get_current_prach(const void *data, void *user)
|
||||||
|
{
|
||||||
|
const prach_item_t *p = data;
|
||||||
|
const fsn_t *now = user;
|
||||||
|
const fsn_t t = {p->frame, p->slot, now->mu};
|
||||||
|
return fsn_equal(t, *now);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get_next_nr_prach(spsc_q_t *q, const fsn_t *now, prach_item_t *p)
|
||||||
|
{
|
||||||
|
spsc_q_drop_while(q, drop_old_prach, (void *)now);
|
||||||
|
return spsc_q_get_if(q, get_current_prach, (void *)now, p, sizeof(*p));
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_schedule_rx_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_nr_prach_pdu_t *prach_pdu)
|
||||||
{
|
{
|
||||||
prach_item_t *prach = find_nr_prach(&gNB->prach_list, SFN, Slot, gNB->frame_parms.nb_antennas_rx, NR_SEARCH_EXIST_OR_FREE);
|
|
||||||
if (!prach) {
|
|
||||||
LOG_W(PHY, "no free space for a new detected rach, discarding\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
const int fmt = prach_pdu->prach_format;
|
const int fmt = prach_pdu->prach_format;
|
||||||
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
const NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||||
// we set only elements as the whole structure has been cleaned when we release it
|
const nfapi_nr_prach_config_t *cfg = &gNB->gNB_config.prach_config;
|
||||||
prach->frame = SFN;
|
const nfapi_nr_num_prach_fd_occasions_t *occ = &cfg->num_prach_fd_occasions_list[prach_pdu->num_ra];
|
||||||
prach->slot = Slot;
|
prach_item_t prach = {
|
||||||
prach->num_slots = fmt < 4 ? get_long_prach_dur(fmt, fp->numerology_index) : 1;
|
.frame = SFN,
|
||||||
|
.slot = Slot,
|
||||||
|
.num_slots = fmt < 4 ? get_long_prach_dur(fmt, fp->numerology_index) : 1,
|
||||||
|
.pdu = *prach_pdu,
|
||||||
|
.rootSequenceIndex = occ->prach_root_sequence_index.value,
|
||||||
|
.numrootSequenceIndex = occ->num_root_sequences.value,
|
||||||
|
.msg1_frequencystart = occ->k1.value,
|
||||||
|
.mu = cfg->prach_sub_c_spacing.value,
|
||||||
|
.prach_sequence_length = cfg->prach_sequence_length.value,
|
||||||
|
.restricted_set = cfg->restricted_set_config.value,
|
||||||
|
.numerology_index = fp->numerology_index,
|
||||||
|
.nb_rx = gNB->gNB_config.carrier_config.num_rx_ant.value,
|
||||||
|
.Xu = gNB->X_u,
|
||||||
|
.rx_prach = &gNB->rx_prach,
|
||||||
|
// TODO can be made permanently allocated?
|
||||||
|
.prach_buf = calloc_or_fail(1, sizeof(c16_t) * prach.nb_rx * NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX * NR_PRACH_SEQ_LEN_L),
|
||||||
|
};
|
||||||
if (gNB->common_vars.beam_id) {
|
if (gNB->common_vars.beam_id) {
|
||||||
int n_symb = get_nr_prach_duration(prach_pdu->prach_format);
|
int n_symb = get_nr_prach_duration(prach_pdu->prach_format);
|
||||||
AssertFatal(prach_pdu->beamforming.dig_bf_interface < NFAPI_MAX_NUM_BG_IF,
|
AssertFatal(prach_pdu->beamforming.dig_bf_interface < NFAPI_MAX_NUM_BG_IF,
|
||||||
@@ -87,7 +88,7 @@ prach_item_t *nr_schedule_rx_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_n
|
|||||||
int fapi_beam_idx = prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list[i].beam_idx;
|
int fapi_beam_idx = prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list[i].beam_idx;
|
||||||
int start_symb = prach_pdu->prach_start_symbol + i * n_symb;
|
int start_symb = prach_pdu->prach_start_symbol + i * n_symb;
|
||||||
int bitmap = SL_to_bitmap(start_symb, n_symb);
|
int bitmap = SL_to_bitmap(start_symb, n_symb);
|
||||||
prach->beams[i] = beam_index_allocation(gNB->enable_analog_das,
|
prach.beams[i] = beam_index_allocation(gNB->enable_analog_das,
|
||||||
fapi_beam_idx,
|
fapi_beam_idx,
|
||||||
&gNB->common_vars,
|
&gNB->common_vars,
|
||||||
Slot,
|
Slot,
|
||||||
@@ -95,20 +96,9 @@ prach_item_t *nr_schedule_rx_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_n
|
|||||||
bitmap);
|
bitmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
prach->pdu = *prach_pdu;
|
bool found = spsc_q_put(&gNB->prach_ru_queue, &prach, sizeof(prach));
|
||||||
nfapi_nr_prach_config_t *cfg = &gNB->gNB_config.prach_config;
|
if (!found)
|
||||||
nfapi_nr_num_prach_fd_occasions_t *occ = &cfg->num_prach_fd_occasions_list[prach_pdu->num_ra];
|
LOG_W(NR_PHY, "%4d.%2d PRACH occ queue is full: dropping PRACH request\n", SFN, Slot);
|
||||||
prach->rootSequenceIndex = occ->prach_root_sequence_index.value;
|
|
||||||
prach->numrootSequenceIndex = occ->num_root_sequences.value;
|
|
||||||
prach->msg1_frequencystart = occ->k1.value;
|
|
||||||
prach->mu = cfg->prach_sub_c_spacing.value;
|
|
||||||
prach->prach_sequence_length = cfg->prach_sequence_length.value;
|
|
||||||
prach->restricted_set = cfg->restricted_set_config.value;
|
|
||||||
prach->numerology_index = fp->numerology_index;
|
|
||||||
prach->nb_rx = gNB->gNB_config.carrier_config.num_rx_ant.value;
|
|
||||||
prach->Xu = gNB->X_u;
|
|
||||||
prach->rx_prach = &gNB->rx_prach;
|
|
||||||
return prach;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rx_nr_prach_ru_internal(prach_item_t *p,
|
static void rx_nr_prach_ru_internal(prach_item_t *p,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include "PHY/defs_nr_common.h"
|
#include "PHY/defs_nr_common.h"
|
||||||
#include "PHY/defs_gNB.h"
|
#include "PHY/defs_gNB.h"
|
||||||
|
#include "common/utils/fsn.h"
|
||||||
|
|
||||||
#define NR_PBCH_PDU_BITS 24
|
#define NR_PBCH_PDU_BITS 24
|
||||||
|
|
||||||
@@ -85,11 +86,19 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch, uint16_t N_RB, const NR_DL_FRAME_PARM
|
|||||||
- LLR computation
|
- LLR computation
|
||||||
This function supports TM1, 2, 3, 5, and 6.
|
This function supports TM1, 2, 3, 5, and 6.
|
||||||
@param ue Pointer to PHY variables
|
@param ue Pointer to PHY variables
|
||||||
@param UE_id id of current UE
|
@param pusch_vars ULSCH PUSCH data
|
||||||
|
@param rel15_ul FAPI message to process
|
||||||
|
@param unav_res unav_res result
|
||||||
@param frame Frame number
|
@param frame Frame number
|
||||||
@param slot Slot number
|
@param slot Slot number
|
||||||
*/
|
*/
|
||||||
int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, uint8_t ulsch_id, uint32_t frame, uint8_t slot, int beam_nb);
|
int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||||
|
NR_gNB_PUSCH *pusch_vars,
|
||||||
|
const nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
|
uint32_t *ret_unav_res,
|
||||||
|
uint32_t frame,
|
||||||
|
uint8_t slot,
|
||||||
|
int beam_nb);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief This function implements the idft transform precoding in PUSCH
|
\brief This function implements the idft transform precoding in PUSCH
|
||||||
@@ -159,7 +168,7 @@ void nr_fill_ulsch(PHY_VARS_gNB *gNB,
|
|||||||
int slot,
|
int slot,
|
||||||
nfapi_nr_pusch_pdu_t *ulsch_pdu);
|
nfapi_nr_pusch_pdu_t *ulsch_pdu);
|
||||||
|
|
||||||
prach_item_t *nr_schedule_rx_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_nr_prach_pdu_t *prach_pdu);
|
void nr_schedule_rx_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_nr_prach_pdu_t *prach_pdu);
|
||||||
|
|
||||||
typedef struct rx_prach_out {
|
typedef struct rx_prach_out {
|
||||||
uint16_t max_preamble;
|
uint16_t max_preamble;
|
||||||
@@ -170,12 +179,6 @@ rx_prach_out_t rx_nr_prach(const prach_item_t *, int occasion);
|
|||||||
|
|
||||||
void rx_nr_prach_ru(prach_item_t *, int32_t **, NR_DL_FRAME_PARMS *frame_parms, int N_TA_offset);
|
void rx_nr_prach_ru(prach_item_t *, int32_t **, NR_DL_FRAME_PARMS *frame_parms, int N_TA_offset);
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
NR_SEARCH_EXIST = 0,
|
|
||||||
NR_SEARCH_EXIST_OR_FREE
|
|
||||||
} nr_find_type_t;
|
|
||||||
|
|
||||||
prach_item_t *find_nr_prach(prach_list_t *, int frame, int slot, int nb_rx, nr_find_type_t type);
|
|
||||||
void nr_fill_pucch(PHY_VARS_gNB *gNB,
|
void nr_fill_pucch(PHY_VARS_gNB *gNB,
|
||||||
int frame,
|
int frame,
|
||||||
int slot,
|
int slot,
|
||||||
@@ -189,30 +192,32 @@ void nr_fill_srs(PHY_VARS_gNB *gNB,
|
|||||||
int nr_get_srs_signal(PHY_VARS_gNB *gNB,
|
int nr_get_srs_signal(PHY_VARS_gNB *gNB,
|
||||||
c16_t **rxdataF,
|
c16_t **rxdataF,
|
||||||
slot_t slot,
|
slot_t slot,
|
||||||
nfapi_nr_srs_pdu_t *srs_pdu,
|
const nfapi_nr_srs_pdu_t *srs_pdu,
|
||||||
nr_srs_info_t *nr_srs_info,
|
nr_srs_info_t *nr_srs_info,
|
||||||
c16_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)],
|
c16_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)],
|
||||||
c16_t srs_received_noise[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)]);
|
c16_t srs_received_noise[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)]);
|
||||||
|
|
||||||
void nr_srs_rx_procedures(PHY_VARS_gNB *gNB,
|
nr_srs_info_t nr_srs_rx_procedures(PHY_VARS_gNB *gNB,
|
||||||
int frame_rx,
|
int frame_rx,
|
||||||
int slot_rx,
|
int slot_rx,
|
||||||
uint8_t nb_antennas_rx,
|
uint8_t nb_antennas_rx,
|
||||||
uint8_t N_ap,
|
uint8_t N_ap,
|
||||||
uint8_t N_symb_SRS,
|
uint8_t N_symb_SRS,
|
||||||
uint16_t ofdm_symbol_size,
|
uint16_t ofdm_symbol_size,
|
||||||
NR_gNB_SRS_t *srs,
|
const NR_gNB_SRS_job_t *srs,
|
||||||
nr_srs_info_t *nr_srs_info,
|
|
||||||
int *srs_est,
|
int *srs_est,
|
||||||
|
int8_t *snr,
|
||||||
c16_t srs_estimated_channel_freq[][N_ap][ofdm_symbol_size * N_symb_SRS],
|
c16_t srs_estimated_channel_freq[][N_ap][ofdm_symbol_size * N_symb_SRS],
|
||||||
c16_t srs_estimated_channel_time[][N_ap][NR_SRS_IDFT_OVERSAMP_FACTOR * ofdm_symbol_size],
|
|
||||||
int16_t *snr_per_rb,
|
int16_t *snr_per_rb,
|
||||||
uint16_t *timing_advance_offset,
|
uint16_t *timing_advance_offset,
|
||||||
int16_t *timing_advance_offset_nsec);
|
int16_t *timing_advance_offset_nsec);
|
||||||
|
|
||||||
int get_nr_prach_duration(uint8_t prach_format);
|
int get_nr_prach_duration(uint8_t prach_format);
|
||||||
|
|
||||||
void free_nr_prach_entry(prach_list_t *, prach_item_t *);
|
void init_nr_prach(PHY_VARS_gNB *gNB);
|
||||||
|
void reset_nr_prach(PHY_VARS_gNB *gNB);
|
||||||
|
void free_nr_prach_entry(prach_item_t *);
|
||||||
|
bool get_next_nr_prach(spsc_q_t *q, const fsn_t *now, prach_item_t *p);
|
||||||
|
|
||||||
void nr_decode_pucch1(PHY_VARS_gNB *gNB,
|
void nr_decode_pucch1(PHY_VARS_gNB *gNB,
|
||||||
c16_t **rxdataF,
|
c16_t **rxdataF,
|
||||||
@@ -227,14 +232,14 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
int frame,
|
int frame,
|
||||||
int slot,
|
int slot,
|
||||||
nfapi_nr_uci_pucch_pdu_format_2_3_4_t* uci_pdu,
|
nfapi_nr_uci_pucch_pdu_format_2_3_4_t* uci_pdu,
|
||||||
nfapi_nr_pucch_pdu_t* pucch_pdu);
|
const nfapi_nr_pucch_pdu_t* pucch_pdu);
|
||||||
|
|
||||||
void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||||
c16_t **rxdataF,
|
c16_t **rxdataF,
|
||||||
int frame,
|
int frame,
|
||||||
int slot,
|
int slot,
|
||||||
nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
|
nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
|
||||||
nfapi_nr_pucch_pdu_t* pucch_pdu);
|
const nfapi_nr_pucch_pdu_t* pucch_pdu);
|
||||||
|
|
||||||
|
|
||||||
#endif /*__NR_TRANSPORT__H__*/
|
#endif /*__NR_TRANSPORT__H__*/
|
||||||
|
|||||||
@@ -11,30 +11,6 @@
|
|||||||
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
|
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
|
||||||
#include "SCHED_NR/sched_nr.h"
|
#include "SCHED_NR/sched_nr.h"
|
||||||
|
|
||||||
static NR_gNB_ULSCH_t *find_nr_ulsch(PHY_VARS_gNB *gNB, uint16_t rnti, int pid)
|
|
||||||
{
|
|
||||||
int16_t first_free_index = -1;
|
|
||||||
AssertFatal(gNB != NULL, "gNB is null\n");
|
|
||||||
NR_gNB_ULSCH_t *ulsch = NULL;
|
|
||||||
|
|
||||||
for (int i = 0; i < gNB->max_nb_pusch; i++) {
|
|
||||||
ulsch = &gNB->ulsch[i];
|
|
||||||
AssertFatal(ulsch, "gNB->ulsch[%d] is null\n", i);
|
|
||||||
if (!ulsch->active) {
|
|
||||||
if (first_free_index == -1)
|
|
||||||
first_free_index = i;
|
|
||||||
} else {
|
|
||||||
// if there is already an active ULSCH for this RNTI and HARQ_PID
|
|
||||||
if ((ulsch->harq_pid == pid) && (ulsch->rnti == rnti))
|
|
||||||
return ulsch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (first_free_index != -1)
|
|
||||||
ulsch = &gNB->ulsch[first_free_index];
|
|
||||||
|
|
||||||
return ulsch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump_pusch_pdu(int instance, int frame, int slot, nfapi_nr_pusch_pdu_t *pusch_pdu)
|
static void dump_pusch_pdu(int instance, int frame, int slot, nfapi_nr_pusch_pdu_t *pusch_pdu)
|
||||||
{
|
{
|
||||||
LOG_D(PHY,
|
LOG_D(PHY,
|
||||||
@@ -117,49 +93,28 @@ static void dump_pusch_pdu(int instance, int frame, int slot, nfapi_nr_pusch_pdu
|
|||||||
void nr_fill_ulsch(PHY_VARS_gNB *gNB, int frame, int slot, nfapi_nr_pusch_pdu_t *ulsch_pdu)
|
void nr_fill_ulsch(PHY_VARS_gNB *gNB, int frame, int slot, nfapi_nr_pusch_pdu_t *ulsch_pdu)
|
||||||
{
|
{
|
||||||
dump_pusch_pdu(gNB->Mod_id, frame, slot, ulsch_pdu);
|
dump_pusch_pdu(gNB->Mod_id, frame, slot, ulsch_pdu);
|
||||||
int harq_pid = ulsch_pdu->pusch_data.harq_process_id;
|
LOG_D(NR_PHY,
|
||||||
NR_gNB_ULSCH_t *ulsch = find_nr_ulsch(gNB, ulsch_pdu->rnti, harq_pid);
|
"%4d.%2d Programming ULSCH RNTI %04x HARQ PID %d new data indicator %d\n",
|
||||||
if (ulsch == NULL) {
|
frame,
|
||||||
LOG_E(NR_PHY, "No ulsch_id found for rnti %04x\n", ulsch_pdu->rnti);
|
slot,
|
||||||
return;
|
ulsch_pdu->rnti,
|
||||||
}
|
ulsch_pdu->pusch_data.harq_process_id,
|
||||||
|
ulsch_pdu->pusch_data.new_data_indicator);
|
||||||
|
|
||||||
ulsch->rnti = ulsch_pdu->rnti;
|
NR_gNB_PUSCH_job_t pusch = {.frame = frame, .slot = slot, .pusch_pdu = *ulsch_pdu};
|
||||||
ulsch->harq_pid = harq_pid;
|
|
||||||
ulsch->handled = 0;
|
|
||||||
ulsch->active = true;
|
|
||||||
ulsch->beam_nb = 0;
|
|
||||||
if (gNB->common_vars.beam_id) {
|
if (gNB->common_vars.beam_id) {
|
||||||
int fapi_beam_idx = ulsch_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx;
|
int fapi_beam_idx = ulsch_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx;
|
||||||
int bitmap = SL_to_bitmap(ulsch_pdu->start_symbol_index, ulsch_pdu->nr_of_symbols);
|
int bitmap = SL_to_bitmap(ulsch_pdu->start_symbol_index, ulsch_pdu->nr_of_symbols);
|
||||||
ulsch->beam_nb = beam_index_allocation(gNB->enable_analog_das,
|
pusch.beam_nb = beam_index_allocation(gNB->enable_analog_das,
|
||||||
fapi_beam_idx,
|
fapi_beam_idx,
|
||||||
&gNB->common_vars,
|
&gNB->common_vars,
|
||||||
slot,
|
slot,
|
||||||
gNB->frame_parms.symbols_per_slot,
|
gNB->frame_parms.symbols_per_slot,
|
||||||
bitmap);
|
bitmap);
|
||||||
}
|
}
|
||||||
ulsch->frame = frame;
|
bool done = spsc_q_put(&gNB->pusch_queue, &pusch, sizeof(pusch));
|
||||||
ulsch->slot = slot;
|
if (!done)
|
||||||
|
LOG_W(NR_PHY, "PUSCH queue is full: dropping PUSCH UE %04x\n", ulsch_pdu->rnti);
|
||||||
NR_UL_gNB_HARQ_t *harq = ulsch->harq_process;
|
|
||||||
if (ulsch_pdu->pusch_data.new_data_indicator)
|
|
||||||
harq->harq_to_be_cleared = true;
|
|
||||||
LOG_D(NR_PHY,
|
|
||||||
"NEW ULSCH %d.%d RNTI %x HARQ PID %d new data indicator %d\n",
|
|
||||||
frame,
|
|
||||||
slot,
|
|
||||||
ulsch_pdu->rnti,
|
|
||||||
harq_pid,
|
|
||||||
ulsch_pdu->pusch_data.new_data_indicator);
|
|
||||||
|
|
||||||
if (ulsch_pdu->pusch_data.new_data_indicator)
|
|
||||||
harq->round = 0;
|
|
||||||
else
|
|
||||||
harq->round++;
|
|
||||||
|
|
||||||
memcpy(&ulsch->harq_process->ulsch_pdu, ulsch_pdu, sizeof(ulsch->harq_process->ulsch_pdu));
|
|
||||||
LOG_D(PHY, "Initializing nFAPI for ULSCH, harq_pid %d, layers %d\n", harq_pid, ulsch_pdu->nrOfLayers);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset_active_ulsch(PHY_VARS_gNB *gNB, int frame)
|
void reset_active_ulsch(PHY_VARS_gNB *gNB, int frame)
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ NR_gNB_ULSCH_t new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL);
|
|||||||
@param frame_parms, Pointer to frame descriptor structure
|
@param frame_parms, Pointer to frame descriptor structure
|
||||||
@param frame, current received frame
|
@param frame, current received frame
|
||||||
@param nr_tti_rx, current received TTI
|
@param nr_tti_rx, current received TTI
|
||||||
@param G
|
|
||||||
@param ULSCH_ids, array of ULSCH ids
|
@param ULSCH_ids, array of ULSCH ids
|
||||||
@param nb_pusch, number of uplink shared channels
|
@param nb_pusch, number of uplink shared channels
|
||||||
*/
|
*/
|
||||||
@@ -32,8 +31,7 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint32_t frame,
|
uint32_t frame,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_tti_rx,
|
||||||
uint32_t *G,
|
int *ULSCH_ids,
|
||||||
uint8_t *ULSCH_ids,
|
|
||||||
int nb_pusch);
|
int nb_pusch);
|
||||||
|
|
||||||
/*! \brief Perform PUSCH unscrambling. TS 38.211 V15.4.0 subclause 6.3.1.1
|
/*! \brief Perform PUSCH unscrambling. TS 38.211 V15.4.0 subclause 6.3.1.1
|
||||||
|
|||||||
@@ -93,8 +93,7 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint32_t frame,
|
uint32_t frame,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_tti_rx,
|
||||||
uint32_t *G,
|
int *ULSCH_ids,
|
||||||
uint8_t *ULSCH_ids,
|
|
||||||
int nb_pusch)
|
int nb_pusch)
|
||||||
{
|
{
|
||||||
nrLDPC_TB_decoding_parameters_t TBs[nb_pusch];
|
nrLDPC_TB_decoding_parameters_t TBs[nb_pusch];
|
||||||
@@ -112,17 +111,29 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
NR_gNB_ULSCH_t *ulsch = &phy_vars_gNB->ulsch[ULSCH_id];
|
NR_gNB_ULSCH_t *ulsch = &phy_vars_gNB->ulsch[ULSCH_id];
|
||||||
NR_gNB_PUSCH *pusch = &phy_vars_gNB->pusch_vars[ULSCH_id];
|
NR_gNB_PUSCH *pusch = &phy_vars_gNB->pusch_vars[ULSCH_id];
|
||||||
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_process;
|
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_process;
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu = &harq_process->ulsch_pdu;
|
const nfapi_nr_pusch_pdu_t *pusch_pdu = &harq_process->ulsch_pdu;
|
||||||
|
|
||||||
nrLDPC_TB_decoding_parameters_t *TB_parameters = &TBs[pusch_id];
|
nrLDPC_TB_decoding_parameters_t *TB_parameters = &TBs[pusch_id];
|
||||||
|
|
||||||
TB_parameters->G = G[pusch_id];
|
|
||||||
|
|
||||||
if (!harq_process) {
|
if (!harq_process) {
|
||||||
LOG_E(PHY, "ulsch_decoding.c: NULL harq_process pointer\n");
|
LOG_E(PHY, "ulsch_decoding.c: NULL harq_process pointer\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t number_dmrs_symbols = count_bits64_with_mask(pusch_pdu->ul_dmrs_symb_pos, pusch_pdu->start_symbol_index, pusch_pdu->nr_of_symbols);
|
||||||
|
int factor = pusch_pdu->dmrs_config_type == pusch_dmrs_type1 ? 6 : 4;
|
||||||
|
int nb_re_dmrs = factor * pusch_pdu->num_dmrs_cdm_grps_no_data;
|
||||||
|
uint32_t G = nr_get_G(pusch_pdu->rb_size,
|
||||||
|
pusch_pdu->nr_of_symbols,
|
||||||
|
nb_re_dmrs,
|
||||||
|
number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
|
||||||
|
ulsch->unav_res,
|
||||||
|
pusch_pdu->qam_mod_order,
|
||||||
|
pusch_pdu->nrOfLayers);
|
||||||
|
DevAssert(G > 0);
|
||||||
|
TB_parameters->G = G;
|
||||||
|
|
||||||
|
|
||||||
// The harq_pid is not unique among the active HARQ processes in the instance so we use ULSCH_id instead
|
// The harq_pid is not unique among the active HARQ processes in the instance so we use ULSCH_id instead
|
||||||
TB_parameters->harq_unique_pid = ULSCH_id;
|
TB_parameters->harq_unique_pid = ULSCH_id;
|
||||||
|
|
||||||
@@ -134,10 +145,9 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
TB_parameters->processedSegments = &harq_process->processedSegments;
|
TB_parameters->processedSegments = &harq_process->processedSegments;
|
||||||
harq_process->TBS = pusch_pdu->pusch_data.tb_size;
|
|
||||||
|
|
||||||
TB_parameters->BG = pusch_pdu->maintenance_parms_v3.ldpcBaseGraph;
|
TB_parameters->BG = pusch_pdu->maintenance_parms_v3.ldpcBaseGraph;
|
||||||
TB_parameters->A = (harq_process->TBS) << 3;
|
TB_parameters->A = pusch_pdu->pusch_data.tb_size << 3;
|
||||||
NR_gNB_PHY_STATS_t *stats = get_phy_stats(phy_vars_gNB, ulsch->rnti);
|
NR_gNB_PHY_STATS_t *stats = get_phy_stats(phy_vars_gNB, ulsch->rnti);
|
||||||
if (stats) {
|
if (stats) {
|
||||||
stats->frame = frame;
|
stats->frame = frame;
|
||||||
@@ -149,7 +159,7 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
if (!harq_process->harq_to_be_cleared) {
|
if (!harq_process->harq_to_be_cleared) {
|
||||||
stats->ulsch_stats.current_Qm = TB_parameters->Qm;
|
stats->ulsch_stats.current_Qm = TB_parameters->Qm;
|
||||||
stats->ulsch_stats.current_RI = TB_parameters->nb_layers;
|
stats->ulsch_stats.current_RI = TB_parameters->nb_layers;
|
||||||
stats->ulsch_stats.total_bytes_tx += harq_process->TBS;
|
stats->ulsch_stats.total_bytes_tx += pusch_pdu->pusch_data.tb_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ static void nr_ulsch_extract_rbs(c16_t* const rxdataF,
|
|||||||
int rxoffset,
|
int rxoffset,
|
||||||
int choffset,
|
int choffset,
|
||||||
int is_dmrs_symbol,
|
int is_dmrs_symbol,
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu,
|
const nfapi_nr_pusch_pdu_t *pusch_pdu,
|
||||||
NR_DL_FRAME_PARMS *frame_parms)
|
NR_DL_FRAME_PARMS *frame_parms)
|
||||||
{
|
{
|
||||||
uint8_t delta = 0;
|
uint8_t delta = 0;
|
||||||
@@ -160,7 +160,7 @@ static void nr_ulsch_extract_rbs(c16_t* const rxdataF,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_nb_re_pusch (NR_DL_FRAME_PARMS *frame_parms, nfapi_nr_pusch_pdu_t *rel15_ul,int symbol)
|
static int get_nb_re_pusch (NR_DL_FRAME_PARMS *frame_parms, const nfapi_nr_pusch_pdu_t *rel15_ul, int symbol)
|
||||||
{
|
{
|
||||||
uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
|
uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
|
||||||
if (dmrs_symbol_flag == 1) {
|
if (dmrs_symbol_flag == 1) {
|
||||||
@@ -186,7 +186,7 @@ static void nr_ulsch_channel_compensation(uint32_t buffer_length,
|
|||||||
c16_t **rxComp,
|
c16_t **rxComp,
|
||||||
int nb_layers,
|
int nb_layers,
|
||||||
c16_t rho[][nb_layers][buffer_length],
|
c16_t rho[][nb_layers][buffer_length],
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul,
|
const nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
uint32_t symbol,
|
uint32_t symbol,
|
||||||
uint32_t output_shift)
|
uint32_t output_shift)
|
||||||
{
|
{
|
||||||
@@ -857,11 +857,10 @@ static uint8_t nr_ulsch_mmse_2layers(c16_t **rxdataF_comp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void inner_rx(PHY_VARS_gNB *gNB,
|
static void inner_rx(PHY_VARS_gNB *gNB,
|
||||||
int ulsch_id,
|
|
||||||
int slot,
|
int slot,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
NR_gNB_PUSCH *pusch_vars,
|
NR_gNB_PUSCH *pusch_vars,
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul,
|
const nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
c16_t **rxF,
|
c16_t **rxF,
|
||||||
int16_t **llr,
|
int16_t **llr,
|
||||||
int soffset,
|
int soffset,
|
||||||
@@ -952,7 +951,7 @@ static void inner_rx(PHY_VARS_gNB *gNB,
|
|||||||
nr_pusch_ptrs_processing(gNB,
|
nr_pusch_ptrs_processing(gNB,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
rel15_ul,
|
rel15_ul,
|
||||||
ulsch_id,
|
pusch_vars,
|
||||||
slot,
|
slot,
|
||||||
symbol,
|
symbol,
|
||||||
buffer_length);
|
buffer_length);
|
||||||
@@ -1003,8 +1002,8 @@ static void inner_rx(PHY_VARS_gNB *gNB,
|
|||||||
typedef struct puschSymbolProc_s {
|
typedef struct puschSymbolProc_s {
|
||||||
PHY_VARS_gNB *gNB;
|
PHY_VARS_gNB *gNB;
|
||||||
NR_DL_FRAME_PARMS *frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms;
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul;
|
const nfapi_nr_pusch_pdu_t *rel15_ul;
|
||||||
int ulsch_id;
|
NR_gNB_PUSCH *pusch_vars;
|
||||||
int slot;
|
int slot;
|
||||||
int startSymbol;
|
int startSymbol;
|
||||||
int numSymbols;
|
int numSymbols;
|
||||||
@@ -1023,12 +1022,11 @@ static void nr_pusch_symbol_processing(void *arg)
|
|||||||
|
|
||||||
PHY_VARS_gNB *gNB = rdata->gNB;
|
PHY_VARS_gNB *gNB = rdata->gNB;
|
||||||
NR_DL_FRAME_PARMS *frame_parms = rdata->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = rdata->frame_parms;
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul = rdata->rel15_ul;
|
const nfapi_nr_pusch_pdu_t *rel15_ul = rdata->rel15_ul;
|
||||||
int ulsch_id = rdata->ulsch_id;
|
|
||||||
int slot = rdata->slot;
|
int slot = rdata->slot;
|
||||||
NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ulsch_id];
|
NR_gNB_PUSCH *pusch_vars = rdata->pusch_vars;
|
||||||
for (int symbol = rdata->startSymbol; symbol < rdata->startSymbol + rdata->numSymbols; symbol++) {
|
for (int symbol = rdata->startSymbol; symbol < rdata->startSymbol + rdata->numSymbols; symbol++) {
|
||||||
if (gNB->pusch_vars[ulsch_id].ul_valid_re_per_slot[symbol] == 0)
|
if (pusch_vars->ul_valid_re_per_slot[symbol] == 0)
|
||||||
continue;
|
continue;
|
||||||
int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size;
|
int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size;
|
||||||
int buffer_length = ceil_mod(pusch_vars->ul_valid_re_per_slot[symbol] * NR_NB_SC_PER_RB, 16);
|
int buffer_length = ceil_mod(pusch_vars->ul_valid_re_per_slot[symbol] * NR_NB_SC_PER_RB, 16);
|
||||||
@@ -1038,7 +1036,6 @@ static void nr_pusch_symbol_processing(void *arg)
|
|||||||
llrss[l] = llrs[l];
|
llrss[l] = llrs[l];
|
||||||
|
|
||||||
inner_rx(gNB,
|
inner_rx(gNB,
|
||||||
ulsch_id,
|
|
||||||
slot,
|
slot,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
pusch_vars,
|
pusch_vars,
|
||||||
@@ -1047,12 +1044,12 @@ static void nr_pusch_symbol_processing(void *arg)
|
|||||||
llrss,
|
llrss,
|
||||||
soffset,
|
soffset,
|
||||||
symbol,
|
symbol,
|
||||||
gNB->pusch_vars[ulsch_id].log2_maxh,
|
pusch_vars->log2_maxh,
|
||||||
rdata->nvar,
|
rdata->nvar,
|
||||||
rdata->rxFext_slot_mem,
|
rdata->rxFext_slot_mem,
|
||||||
rdata->pusch_ch_est_dmrs_interpl_slot_mem);
|
rdata->pusch_ch_est_dmrs_interpl_slot_mem);
|
||||||
|
|
||||||
int nb_re_pusch = gNB->pusch_vars[ulsch_id].ul_valid_re_per_slot[symbol];
|
int nb_re_pusch = pusch_vars->ul_valid_re_per_slot[symbol];
|
||||||
// layer de-mapping
|
// layer de-mapping
|
||||||
int16_t *llr_ptr = llrs[0];
|
int16_t *llr_ptr = llrs[0];
|
||||||
if (rel15_ul->nrOfLayers != 1) {
|
if (rel15_ul->nrOfLayers != 1) {
|
||||||
@@ -1098,12 +1095,16 @@ static uint32_t average_u32(const uint32_t *x, uint16_t size)
|
|||||||
return (uint32_t)(sum_x / size);
|
return (uint32_t)(sum_x / size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, uint8_t ulsch_id, uint32_t frame, uint8_t slot, int beam_nb)
|
int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||||
|
NR_gNB_PUSCH *pusch_vars,
|
||||||
|
const nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
|
uint32_t *ret_unav_res,
|
||||||
|
uint32_t frame,
|
||||||
|
uint8_t slot,
|
||||||
|
int beam_nb)
|
||||||
{
|
{
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id].harq_process->ulsch_pdu;
|
|
||||||
|
|
||||||
NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ulsch_id];
|
|
||||||
uint32_t bwp_start_subcarrier = ((rel15_ul->rb_start + rel15_ul->bwp_start) * NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size;
|
uint32_t bwp_start_subcarrier = ((rel15_ul->rb_start + rel15_ul->bwp_start) * NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size;
|
||||||
LOG_D(PHY,"pusch %d.%d : bwp_start_subcarrier %d, rb_start %d, first_carrier_offset %d\n", frame,slot,bwp_start_subcarrier, rel15_ul->rb_start, frame_parms->first_carrier_offset);
|
LOG_D(PHY,"pusch %d.%d : bwp_start_subcarrier %d, rb_start %d, first_carrier_offset %d\n", frame,slot,bwp_start_subcarrier, rel15_ul->rb_start, frame_parms->first_carrier_offset);
|
||||||
LOG_D(PHY,"pusch %d.%d : ul_dmrs_symb_pos %x\n",frame,slot,rel15_ul->ul_dmrs_symb_pos);
|
LOG_D(PHY,"pusch %d.%d : ul_dmrs_symb_pos %x\n",frame,slot,rel15_ul->ul_dmrs_symb_pos);
|
||||||
@@ -1159,7 +1160,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, uint8_t ulsch_id, uint32_t frame, uint8_t
|
|||||||
nl,
|
nl,
|
||||||
get_dmrs_port(nl, rel15_ul->dmrs_ports),
|
get_dmrs_port(nl, rel15_ul->dmrs_ports),
|
||||||
symbol,
|
symbol,
|
||||||
ulsch_id,
|
pusch_vars,
|
||||||
beam_nb,
|
beam_nb,
|
||||||
bwp_start_subcarrier,
|
bwp_start_subcarrier,
|
||||||
rel15_ul,
|
rel15_ul,
|
||||||
@@ -1261,7 +1262,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, uint8_t ulsch_id, uint32_t frame, uint8_t
|
|||||||
unav_res,
|
unav_res,
|
||||||
rel15_ul->qam_mod_order,
|
rel15_ul->qam_mod_order,
|
||||||
rel15_ul->nrOfLayers);
|
rel15_ul->nrOfLayers);
|
||||||
gNB->ulsch[ulsch_id].unav_res = unav_res;
|
*ret_unav_res = unav_res;
|
||||||
|
|
||||||
// initialize scrambling sequence //
|
// initialize scrambling sequence //
|
||||||
int16_t scramblingSequence[G + 96] __attribute__((aligned(32)));
|
int16_t scramblingSequence[G + 96] __attribute__((aligned(32)));
|
||||||
@@ -1378,7 +1379,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, uint8_t ulsch_id, uint32_t frame, uint8_t
|
|||||||
rdata->startSymbol = symbol;
|
rdata->startSymbol = symbol;
|
||||||
// Last task processes remainder symbols
|
// Last task processes remainder symbols
|
||||||
rdata->numSymbols = task_index == loop_iter - 1 ? rel15_ul->nr_of_symbols - (loop_iter - 1) * numSymbols : numSymbols;
|
rdata->numSymbols = task_index == loop_iter - 1 ? rel15_ul->nr_of_symbols - (loop_iter - 1) * numSymbols : numSymbols;
|
||||||
rdata->ulsch_id = ulsch_id;
|
rdata->pusch_vars = pusch_vars;
|
||||||
rdata->llr = pusch_vars->llr;
|
rdata->llr = pusch_vars->llr;
|
||||||
rdata->scramblingSequence = scramblingSequence;
|
rdata->scramblingSequence = scramblingSequence;
|
||||||
rdata->nvar = nvar;
|
rdata->nvar = nvar;
|
||||||
|
|||||||
@@ -33,40 +33,32 @@
|
|||||||
//#define DEBUG_NR_PUCCH_RX 1
|
//#define DEBUG_NR_PUCCH_RX 1
|
||||||
void nr_fill_pucch(PHY_VARS_gNB *gNB, int frame, int slot, nfapi_nr_pucch_pdu_t *pucch_pdu)
|
void nr_fill_pucch(PHY_VARS_gNB *gNB, int frame, int slot, nfapi_nr_pucch_pdu_t *pucch_pdu)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < gNB->max_nb_pucch; i++) {
|
LOG_D(PHY,
|
||||||
NR_gNB_PUCCH_t *pucch = &gNB->pucch[i];
|
"%4d.%2d UE %04x Programming PUCCH format %d, nb_harq %d, nb_sr %d, nb_csi %d\n",
|
||||||
if (pucch->active == false) {
|
frame,
|
||||||
pucch->frame = frame;
|
slot,
|
||||||
pucch->slot = slot;
|
pucch_pdu->rnti,
|
||||||
pucch->active = true;
|
pucch_pdu->format_type,
|
||||||
pucch->beam_nb = 0;
|
pucch_pdu->bit_len_harq,
|
||||||
if (gNB->common_vars.beam_id) {
|
pucch_pdu->sr_flag,
|
||||||
int fapi_beam_idx = pucch_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx;
|
pucch_pdu->bit_len_csi_part1);
|
||||||
int bitmap = SL_to_bitmap(pucch_pdu->start_symbol_index, pucch_pdu->nr_of_symbols);
|
NR_gNB_PUCCH_job_t pucch = {.frame = frame, .slot = slot, .pucch_pdu = *pucch_pdu};
|
||||||
pucch->beam_nb = beam_index_allocation(gNB->enable_analog_das,
|
if (gNB->common_vars.beam_id) {
|
||||||
fapi_beam_idx,
|
int fapi_beam_idx = pucch_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx;
|
||||||
&gNB->common_vars,
|
int bitmap = SL_to_bitmap(pucch_pdu->start_symbol_index, pucch_pdu->nr_of_symbols);
|
||||||
slot,
|
pucch.beam_nb = beam_index_allocation(gNB->enable_analog_das,
|
||||||
gNB->frame_parms.symbols_per_slot,
|
fapi_beam_idx,
|
||||||
bitmap);
|
&gNB->common_vars,
|
||||||
}
|
slot,
|
||||||
memcpy((void *)&pucch->pucch_pdu, (void *)pucch_pdu, sizeof(nfapi_nr_pucch_pdu_t));
|
gNB->frame_parms.symbols_per_slot,
|
||||||
LOG_D(PHY,
|
bitmap);
|
||||||
"Programming PUCCH[%d] for %d.%d, format %d, nb_harq %d, nb_sr %d, nb_csi %d\n",
|
|
||||||
i,
|
|
||||||
pucch->frame,
|
|
||||||
pucch->slot,
|
|
||||||
pucch->pucch_pdu.format_type,
|
|
||||||
pucch->pucch_pdu.bit_len_harq,
|
|
||||||
pucch->pucch_pdu.sr_flag,
|
|
||||||
pucch->pucch_pdu.bit_len_csi_part1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
LOG_W(PHY, "PUCCH list is full\n");
|
bool found = spsc_q_put(&gNB->pucch_queue, &pucch, sizeof(pucch));
|
||||||
|
if (!found)
|
||||||
|
LOG_W(NR_PHY, "PUCCH list is full: dropping PUCCH UE %04x\n", pucch_pdu->rnti);
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_pucch0_cs_lut_index(PHY_VARS_gNB *gNB, nfapi_nr_pucch_pdu_t *pucch_pdu)
|
int get_pucch0_cs_lut_index(PHY_VARS_gNB *gNB, const nfapi_nr_pucch_pdu_t *pucch_pdu)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
@@ -129,7 +121,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
int frame,
|
int frame,
|
||||||
int slot,
|
int slot,
|
||||||
nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu,
|
nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu,
|
||||||
nfapi_nr_pucch_pdu_t *pucch_pdu)
|
const nfapi_nr_pucch_pdu_t *pucch_pdu)
|
||||||
{
|
{
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size;
|
int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size;
|
||||||
@@ -1132,7 +1124,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
int frame,
|
int frame,
|
||||||
int slot,
|
int slot,
|
||||||
nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu,
|
nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu,
|
||||||
nfapi_nr_pucch_pdu_t *pucch_pdu)
|
const nfapi_nr_pucch_pdu_t *pucch_pdu)
|
||||||
{
|
{
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
// pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
|
// pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
|
||||||
|
|||||||
@@ -29,37 +29,27 @@
|
|||||||
|
|
||||||
void nr_fill_srs(PHY_VARS_gNB *gNB, frame_t frame, slot_t slot, nfapi_nr_srs_pdu_t *srs_pdu)
|
void nr_fill_srs(PHY_VARS_gNB *gNB, frame_t frame, slot_t slot, nfapi_nr_srs_pdu_t *srs_pdu)
|
||||||
{
|
{
|
||||||
bool found = false;
|
NR_gNB_SRS_job_t srs = {.frame = frame, .slot = slot, .srs_pdu = *srs_pdu};
|
||||||
for (int i = 0; i < gNB->max_nb_srs; i++) {
|
if (gNB->common_vars.beam_id) {
|
||||||
NR_gNB_SRS_t *srs = &gNB->srs[i];
|
const uint8_t l0 = gNB->frame_parms.symbols_per_slot - 1 - srs_pdu->time_start_position;
|
||||||
if (srs->active == false) {
|
int bitmap = SL_to_bitmap(l0, 1 << srs_pdu->num_symbols);
|
||||||
found = true;
|
int fapi_beam_idx = srs_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx;
|
||||||
srs->frame = frame;
|
srs.beam_nb = beam_index_allocation(gNB->enable_analog_das,
|
||||||
srs->slot = slot;
|
fapi_beam_idx,
|
||||||
srs->active = true;
|
&gNB->common_vars,
|
||||||
srs->beam_nb = 0;
|
slot,
|
||||||
if (gNB->common_vars.beam_id) {
|
gNB->frame_parms.symbols_per_slot,
|
||||||
const uint8_t l0 = gNB->frame_parms.symbols_per_slot - 1 - srs_pdu->time_start_position;
|
bitmap);
|
||||||
int bitmap = SL_to_bitmap(l0, 1 << srs_pdu->num_symbols);
|
|
||||||
int fapi_beam_idx = srs_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx;
|
|
||||||
srs->beam_nb = beam_index_allocation(gNB->enable_analog_das,
|
|
||||||
fapi_beam_idx,
|
|
||||||
&gNB->common_vars,
|
|
||||||
slot,
|
|
||||||
gNB->frame_parms.symbols_per_slot,
|
|
||||||
bitmap);
|
|
||||||
}
|
|
||||||
memcpy((void *)&srs->srs_pdu, (void *)srs_pdu, sizeof(nfapi_nr_srs_pdu_t));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
AssertFatal(found, "SRS list is full\n");
|
bool found = spsc_q_put(&gNB->srs_queue, &srs, sizeof(srs));
|
||||||
|
if (!found)
|
||||||
|
LOG_W(NR_PHY, "SRS list is full: dropping SRS UE %04x\n", srs_pdu->rnti);
|
||||||
}
|
}
|
||||||
|
|
||||||
int nr_get_srs_signal(PHY_VARS_gNB *gNB,
|
int nr_get_srs_signal(PHY_VARS_gNB *gNB,
|
||||||
c16_t **rxdataF,
|
c16_t **rxdataF,
|
||||||
slot_t slot,
|
slot_t slot,
|
||||||
nfapi_nr_srs_pdu_t *srs_pdu,
|
const nfapi_nr_srs_pdu_t *srs_pdu,
|
||||||
nr_srs_info_t *nr_srs_info,
|
nr_srs_info_t *nr_srs_info,
|
||||||
c16_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)],
|
c16_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)],
|
||||||
c16_t srs_received_noise[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)])
|
c16_t srs_received_noise[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)])
|
||||||
|
|||||||
@@ -148,11 +148,11 @@ void nr_tx_rotation_and_ofdm_mod(const uint8_t slot,
|
|||||||
bool was_symbol_used[NR_SYMBOLS_PER_SLOT],
|
bool was_symbol_used[NR_SYMBOLS_PER_SLOT],
|
||||||
bool no_phase_pre_comp);
|
bool no_phase_pre_comp);
|
||||||
|
|
||||||
bool ue_srs_procedures_nr(PHY_VARS_NR_UE *ue,
|
void ue_srs_procedures_nr(PHY_VARS_NR_UE *ue,
|
||||||
const UE_nr_rxtx_proc_t *proc,
|
const UE_nr_rxtx_proc_t *proc,
|
||||||
c16_t **txdataF,
|
c16_t **txdataF,
|
||||||
nr_phy_data_tx_t *phy_data,
|
const fapi_nr_ul_config_srs_pdu *srs_config_pdu,
|
||||||
bool was_symbol_used[NR_SYMBOLS_PER_SLOT]);
|
bool was_symbol_used[NR_SYMBOLS_PER_SLOT]);
|
||||||
|
|
||||||
void clean_UE_harq(PHY_VARS_NR_UE *UE);
|
void clean_UE_harq(PHY_VARS_NR_UE *UE);
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user