mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-14 13:10:28 +00:00
Compare commits
21 Commits
pre-commit
...
beam-api-b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8837de52a3 | ||
|
|
7efe1aaf5e | ||
|
|
1138134f71 | ||
|
|
2257cad674 | ||
|
|
b2c99ab01c | ||
|
|
09bbabd748 | ||
|
|
6db1b2de91 | ||
|
|
343c54eff1 | ||
|
|
af78f814e9 | ||
|
|
2b1e431e14 | ||
|
|
b5b93bdb55 | ||
|
|
f35cb06da5 | ||
|
|
199a436441 | ||
|
|
32b404fa81 | ||
|
|
3d79f90c38 | ||
|
|
e76ebc8e56 | ||
|
|
de3d364425 | ||
|
|
301ceaf492 | ||
|
|
5d6b915a57 | ||
|
|
a81333ebde | ||
|
|
20420cd818 |
@@ -709,15 +709,14 @@ target_link_libraries(SCHED_LIB PRIVATE asn1_lte_rrc_hdrs)
|
||||
set(SCHED_NR_SRC
|
||||
${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_gNB.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
|
||||
)
|
||||
add_library(SCHED_NR_LIB ${SCHED_NR_SRC})
|
||||
target_link_libraries(SCHED_NR_LIB PRIVATE asn1_nr_rrc_hdrs UTIL)
|
||||
target_link_libraries(SCHED_NR_LIB PRIVATE NFAPI_LIB) # some FAPI messages pack "subPDUs"
|
||||
|
||||
set(SCHED_SRC_RU
|
||||
${OPENAIR1_DIR}/SCHED/ru_procedures.c
|
||||
${OPENAIR1_DIR}/SCHED_NR/nr_ru_procedures.c
|
||||
${OPENAIR1_DIR}/SCHED/prach_procedures.c
|
||||
)
|
||||
add_library(SCHED_RU_LIB ${SCHED_SRC_RU})
|
||||
@@ -753,7 +752,6 @@ set(NFAPI_SRC
|
||||
add_library(NFAPI_LIB ${NFAPI_SRC})
|
||||
target_link_libraries(NFAPI_LIB PUBLIC nfapi_common)
|
||||
target_link_libraries(NFAPI_LIB PUBLIC nr_fapi_p5 nr_fapi_p7)
|
||||
target_link_libraries(NFAPI_LIB PRIVATE z)
|
||||
|
||||
if(OAI_WLS)
|
||||
target_compile_definitions(NFAPI_LIB PRIVATE ENABLE_WLS)
|
||||
@@ -879,10 +877,6 @@ set(PHY_SRC
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.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/pbch.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c
|
||||
@@ -899,22 +893,22 @@ set(PHY_SRC
|
||||
)
|
||||
|
||||
set(PHY_SRC_RU
|
||||
${OPENAIR1_DIR}/PHY/if4_tools.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.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_nr.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/gen_75KHz.cpp
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
|
||||
${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.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
|
||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c
|
||||
|
||||
)
|
||||
|
||||
set(PHY_SRC_UE
|
||||
@@ -1004,6 +998,7 @@ set(PHY_SRC_UE
|
||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/pucch_rx.c
|
||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/srs_rx.c
|
||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_uci_tools_common.c
|
||||
${OPENAIR1_DIR}/PHY/phy_digital_beamforming.c
|
||||
)
|
||||
set(PHY_NR_UE_SRC
|
||||
${OPENAIR1_DIR}/PHY/INIT/nr_parms.c
|
||||
@@ -1074,7 +1069,7 @@ add_library(PHY_NR_COMMON ${PHY_NR_SRC_COMMON})
|
||||
target_link_libraries(PHY_NR_COMMON PUBLIC UTIL)
|
||||
|
||||
add_library(PHY_NR ${PHY_NR_SRC})
|
||||
target_link_libraries(PHY_NR nr_phy_common nr_common nr_fapi_p5 polar smallblock ds)
|
||||
target_link_libraries(PHY_NR nr_phy_common nr_common nr_fapi_p5 polar smallblock)
|
||||
|
||||
add_library(PHY_NR_NO_AVX_256 ${PHY_NR_SRC})
|
||||
target_link_libraries(PHY_NR_NO_AVX_256 nr_phy_common nr_common)
|
||||
@@ -1086,8 +1081,6 @@ target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc_hdrs nr_phy_common nr_common
|
||||
add_library(PHY_RU ${PHY_SRC_RU})
|
||||
target_link_libraries(PHY_RU PRIVATE asn1_lte_rrc_hdrs UTIL)
|
||||
|
||||
add_library(NR_PHY_RU ${NR_PHY_SRC_RU})
|
||||
|
||||
#Layer 2 library
|
||||
#####################
|
||||
set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC)
|
||||
@@ -1750,7 +1743,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
|
||||
PHY_COMMON PHY PHY_RU L2 L2_LTE NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
|
||||
${NAS_UE_LIB} ITTI SIMU radio_common softmodem_common
|
||||
-Wl,--end-group dl)
|
||||
-Wl,--end-group z dl)
|
||||
|
||||
target_link_libraries(lte-softmodem PRIVATE pthread m CONFIG_LIB rt)
|
||||
target_link_libraries(lte-softmodem PRIVATE ${T_LIB})
|
||||
@@ -1765,17 +1758,13 @@ add_executable(oairu
|
||||
${OPENAIR_DIR}/executables/lte-ru.c
|
||||
${OPENAIR_DIR}/executables/ru_control.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}/common/utils/lte/prach_utils.c
|
||||
)
|
||||
target_link_libraries(oairu PRIVATE
|
||||
-Wl,--start-group
|
||||
SCHED_RU_LIB PHY_COMMON PHY_RU UTIL radio_common softmodem_common
|
||||
-Wl,--end-group dl)
|
||||
-Wl,--end-group z dl)
|
||||
|
||||
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)
|
||||
@@ -1804,7 +1793,7 @@ target_link_libraries(lte-uesoftmodem PRIVATE
|
||||
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
|
||||
${NAS_UE_LIB} ITTI radio_common softmodem_common
|
||||
-Wl,--end-group dl)
|
||||
-Wl,--end-group z dl)
|
||||
|
||||
target_link_libraries(lte-uesoftmodem PRIVATE pthread m CONFIG_LIB rt)
|
||||
target_link_libraries(lte-uesoftmodem PRIVATE ${T_LIB})
|
||||
@@ -1820,12 +1809,11 @@ add_executable(nr-oru
|
||||
${OPENAIR_DIR}/openair1/PHY/INIT/nr_parms.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_ru_procedures.c
|
||||
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
|
||||
${OPENAIR_DIR}/executables/main_nr_ru.c
|
||||
)
|
||||
target_link_libraries(nr-oru PRIVATE
|
||||
UTIL NR_PHY_RU PHY_NR shlib_loader dl
|
||||
UTIL SCHED_RU_LIB PHY_COMMON PHY_RU PHY_NR shlib_loader z dl
|
||||
radio_common softmodem_common)
|
||||
target_link_libraries(nr-oru PRIVATE pthread m CONFIG_LIB rt ${T_LIB} utils
|
||||
barrier actor)
|
||||
@@ -1849,12 +1837,12 @@ add_executable(nr-softmodem
|
||||
|
||||
target_link_libraries(nr-softmodem PRIVATE
|
||||
-Wl,--start-group
|
||||
UTIL SCTP_CLIENT SCHED_LIB SCHED_NR_LIB PHY_NR PHY PHY_NR_COMMON NR_PHY_RU GTPV1U SECURITY
|
||||
ITTI ${NAS_UE_LIB} nr_rrc
|
||||
UTIL SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU GTPV1U SECURITY
|
||||
ITTI ${NAS_UE_LIB} lte_rrc nr_rrc
|
||||
ngap s1ap L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB SIMU
|
||||
x2ap f1ap m2ap m3ap e1ap radio_common
|
||||
time_management softmodem_common
|
||||
-Wl,--end-group dl)
|
||||
-Wl,--end-group z dl)
|
||||
|
||||
target_link_libraries(nr-softmodem PRIVATE pthread m CONFIG_LIB rt)
|
||||
target_link_libraries(nr-softmodem PRIVATE ${T_LIB})
|
||||
@@ -1894,7 +1882,7 @@ target_link_libraries(nr-cuup PRIVATE
|
||||
GTPV1U e1ap f1ap
|
||||
time_management softmodem_common
|
||||
alg
|
||||
dl pthread ${T_LIB})
|
||||
z dl pthread ${T_LIB})
|
||||
target_link_libraries(nr-cuup PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||
if(E2_AGENT)
|
||||
target_link_libraries(nr-cuup PRIVATE e2_agent e2_agent_arg e2_ran_func_cuup)
|
||||
@@ -1918,11 +1906,11 @@ add_executable(nr-uesoftmodem
|
||||
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE
|
||||
-Wl,--start-group
|
||||
nr_rrc SECURITY UTIL SCHED_NR_UE_LIB
|
||||
PHY_NR_COMMON PHY_NR_UE NR_L2_UE MAC_NR_COMMON NFAPI_LIB
|
||||
nr_rrc SECURITY UTIL SCHED_RU_LIB SCHED_NR_UE_LIB
|
||||
PHY_COMMON PHY_NR_COMMON PHY_NR_UE NR_L2_UE MAC_NR_COMMON NFAPI_LIB
|
||||
ITTI SIMU radio_common
|
||||
time_management softmodem_common
|
||||
-Wl,--end-group dl)
|
||||
-Wl,--end-group z dl)
|
||||
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE pthread m CONFIG_LIB rt nr_ue_phy_meas)
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE ${T_LIB})
|
||||
@@ -1996,14 +1984,14 @@ target_link_libraries(physim_common PRIVATE UTIL)
|
||||
|
||||
add_executable(nr_dlschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c)
|
||||
target_link_libraries(nr_dlschsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU 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_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl physim_common
|
||||
)
|
||||
target_link_libraries(nr_dlschsim PRIVATE asn1_nr_rrc_hdrs)
|
||||
|
||||
add_executable(nr_pbchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c)
|
||||
target_link_libraries(nr_pbchsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU 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_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl physim_common
|
||||
)
|
||||
target_link_libraries(nr_pbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
@@ -2013,14 +2001,14 @@ add_executable(nr_psbchsim
|
||||
${NFAPI_USER_DIR}/nfapi.c
|
||||
)
|
||||
target_link_libraries(nr_psbchsim PRIVATE
|
||||
-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
|
||||
-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
|
||||
m pthread ${T_LIB} ITTI dl physim_common softmodem_common
|
||||
)
|
||||
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)
|
||||
target_link_libraries(nr_pucchsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU 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_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl physim_common
|
||||
)
|
||||
target_link_libraries(nr_pucchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
@@ -2032,15 +2020,15 @@ add_executable(nr_dlsim
|
||||
${PHY_INTERFACE_DIR}/queue_t.c
|
||||
)
|
||||
target_link_libraries(nr_dlsim PRIVATE
|
||||
-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 NR_L2_UE
|
||||
-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
|
||||
m pthread ${T_LIB} ITTI dl nr_ue_phy_meas physim_common
|
||||
softmodem_common
|
||||
)
|
||||
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)
|
||||
target_link_libraries(nr_prachsim PRIVATE
|
||||
-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
|
||||
-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
|
||||
m pthread ${T_LIB} ITTI dl physim_common)
|
||||
target_link_libraries(nr_prachsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
@@ -2048,7 +2036,7 @@ add_executable(nr_ulschsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
||||
)
|
||||
target_link_libraries(nr_ulschsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU 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_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl physim_common
|
||||
)
|
||||
target_link_libraries(nr_ulschsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
@@ -2061,8 +2049,8 @@ add_executable(nr_ulsim
|
||||
)
|
||||
|
||||
target_link_libraries(nr_ulsim PRIVATE
|
||||
-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 NR_L2_UE
|
||||
-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
|
||||
m pthread ${T_LIB} ITTI dl nr_ue_phy_meas physim_common softmodem_common
|
||||
)
|
||||
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
@@ -2072,7 +2060,7 @@ add_executable(nr_srssim
|
||||
)
|
||||
|
||||
target_link_libraries(nr_srssim PRIVATE
|
||||
-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
|
||||
-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
|
||||
m pthread ITTI dl nr_ue_phy_meas physim_common softmodem_common
|
||||
)
|
||||
|
||||
@@ -2141,7 +2129,7 @@ if (${T_TRACER})
|
||||
SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
||||
NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
|
||||
MISC_NFAPI_LTE_LIB
|
||||
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU NR_PHY_RU
|
||||
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU
|
||||
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE MAC_NR_COMMON MAC_UE_NR ngap
|
||||
GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE SIMU
|
||||
dfts config_internals nr_common crc_byte)
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
repos:
|
||||
# Clang-Format: Ensures code style is consistent
|
||||
- repo: https://github.com/pre-commit/mirrors-clang-format
|
||||
rev: 'v22.1.3'
|
||||
hooks:
|
||||
- id: clang-format
|
||||
|
||||
# Cppcheck: Static analysis to find bugs
|
||||
- repo: https://github.com/pocc/pre-commit-hooks
|
||||
rev: 'v1.3.5'
|
||||
hooks:
|
||||
- id: cppcheck
|
||||
|
||||
# Basic sanity checks (trailing whitespace, end of file, etc.)
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: 'v6.0.0'
|
||||
hooks:
|
||||
- id: check-added-large-files
|
||||
- id: check-case-conflict
|
||||
- id: end-of-file-fixer
|
||||
@@ -219,6 +219,28 @@ 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") {
|
||||
steps {
|
||||
script {
|
||||
|
||||
@@ -22,7 +22,7 @@ import constants as CONST
|
||||
#-----------------------------------------------------------
|
||||
|
||||
|
||||
def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
||||
def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
||||
|
||||
force_local = False
|
||||
date_fmt = None
|
||||
@@ -53,6 +53,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
||||
RAN.ranRepository=matchReg.group(1)
|
||||
HTML.ranRepository=matchReg.group(1)
|
||||
CONTAINERS.ranRepository=matchReg.group(1)
|
||||
SCA.ranRepository=matchReg.group(1)
|
||||
CLUSTER.ranRepository=matchReg.group(1)
|
||||
elif re.match(r'^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||
if re.match(r'^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||
@@ -65,6 +66,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
||||
RAN.ranAllowMerge=True
|
||||
HTML.ranAllowMerge=True
|
||||
CONTAINERS.ranAllowMerge=True
|
||||
SCA.ranAllowMerge=True
|
||||
CLUSTER.ranAllowMerge=True
|
||||
elif re.match(r'^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||
if re.match(r'^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||
@@ -75,6 +77,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
||||
RAN.ranBranch=matchReg.group(1)
|
||||
HTML.ranBranch=matchReg.group(1)
|
||||
CONTAINERS.ranBranch=matchReg.group(1)
|
||||
SCA.ranBranch=matchReg.group(1)
|
||||
CLUSTER.ranBranch=matchReg.group(1)
|
||||
elif re.match(r'^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||
if re.match(r'^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||
@@ -85,6 +88,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
||||
RAN.ranCommitID=matchReg.group(1)
|
||||
HTML.ranCommitID=matchReg.group(1)
|
||||
CONTAINERS.ranCommitID=matchReg.group(1)
|
||||
SCA.ranCommitID=matchReg.group(1)
|
||||
CLUSTER.ranCommitID=matchReg.group(1)
|
||||
elif re.match(r'^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||
if re.match(r'^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||
@@ -95,6 +99,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
||||
RAN.ranTargetBranch=matchReg.group(1)
|
||||
HTML.ranTargetBranch=matchReg.group(1)
|
||||
CONTAINERS.ranTargetBranch=matchReg.group(1)
|
||||
SCA.ranTargetBranch=matchReg.group(1)
|
||||
CLUSTER.ranTargetBranch=matchReg.group(1)
|
||||
elif re.match(r'^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||
print("parameters --eNB*IPAddress ignored")
|
||||
@@ -107,6 +112,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER):
|
||||
matchReg = re.match(r'^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
||||
RAN.eNBSourceCodePath=matchReg.group(1)
|
||||
CONTAINERS.eNBSourceCodePath=matchReg.group(1)
|
||||
SCA.eNBSourceCodePath=matchReg.group(1)
|
||||
CLUSTER.eNBSourceCodePath=matchReg.group(1)
|
||||
elif re.match(r'^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
||||
print("parameter --eNB1SourceCodePath ignored")
|
||||
|
||||
@@ -184,6 +184,11 @@ class Containerize():
|
||||
self.services = ''
|
||||
self.deploymentTag = ''
|
||||
|
||||
self.cli = ''
|
||||
self.cliBuildOptions = ''
|
||||
self.dockerfileprefix = ''
|
||||
self.host = ''
|
||||
|
||||
self.num_attempts = 1
|
||||
|
||||
self.flexricTag = ''
|
||||
@@ -198,7 +203,18 @@ class Containerize():
|
||||
cmd = cls_cmd.getConnection(node)
|
||||
log_files = []
|
||||
|
||||
dockerfileprefix = '.ubuntu'
|
||||
# Checking the hostname to get adapted on cli and dockerfileprefixes
|
||||
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
|
||||
# Creating a tupple with the imageName, the DockerFile prefix pattern, targetName and sanitized option
|
||||
@@ -216,20 +232,23 @@ class Containerize():
|
||||
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup', ''))
|
||||
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue', ''))
|
||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
||||
imageNames.append(('oai-lte-ru', 'lteRU', 'oai-lte-ru', ''))
|
||||
# Building again the 5G images with Address Sanitizer
|
||||
imageNames.append(('ran-build', 'build', 'ran-build-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
imageNames.append(('oai-enb', 'eNB', 'oai-enb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
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', ''))
|
||||
if self.host == 'Red Hat':
|
||||
imageNames.append(('oai-physim', 'phySim', 'oai-physim', ''))
|
||||
if self.host == 'Ubuntu':
|
||||
imageNames.append(('oai-lte-ru', 'lteRU', 'oai-lte-ru', ''))
|
||||
# Building again the 5G images with Address Sanitizer
|
||||
imageNames.append(('ran-build', 'build', 'ran-build-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
imageNames.append(('oai-enb', 'eNB', 'oai-enb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
imageNames.append(('oai-lte-ue', 'lteUE', 'oai-lte-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
imageNames.append(('oai-nr-cuup', 'nr-cuup', 'oai-nr-cuup-asan', '--build-arg "BUILD_OPTION=--sanitize"'))
|
||||
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)
|
||||
if result is not None:
|
||||
dockerfileprefix = '.ubuntu.cross-arm64'
|
||||
self.dockerfileprefix = '.ubuntu.cross-arm64'
|
||||
result = re.search('native_armv9', self.imageKind)
|
||||
if result is not None:
|
||||
imageNames.append(('oai-gnb', 'gNB', 'oai-gnb', ''))
|
||||
@@ -244,6 +263,10 @@ class Containerize():
|
||||
imageNames.append(('oai-nr-ue', 'nrUE', 'oai-nr-ue', ''))
|
||||
|
||||
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'
|
||||
baseTag = 'develop'
|
||||
@@ -252,7 +275,7 @@ class Containerize():
|
||||
if (self.ranAllowMerge):
|
||||
imageTag = 'ci-temp'
|
||||
if self.ranTargetBranch == 'develop':
|
||||
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')
|
||||
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')
|
||||
result = re.search('index', cmd.getBefore())
|
||||
if result is not None:
|
||||
forceBaseImageBuild = True
|
||||
@@ -266,30 +289,31 @@ class Containerize():
|
||||
forceBaseImageBuild = True
|
||||
|
||||
# Let's remove any previous run artifacts if still there
|
||||
cmd.run(f"docker image prune --force")
|
||||
cmd.run(f"{self.cli} image prune --force")
|
||||
for image,pattern,name,option in imageNames:
|
||||
cmd.run(f"docker image rm {name}:{imageTag}", reportNonZero=False)
|
||||
cmd.run(f"{self.cli} image rm {name}:{imageTag}", reportNonZero=False)
|
||||
|
||||
cmd.run(f'docker login -u oaicicd -p oaicicd {DEFAULT_REGISTRY}')
|
||||
ubuntuImage = "ubuntu:noble"
|
||||
# Build the base image only on Push Events (not on Merge Requests)
|
||||
# On when the base image docker file is being modified.
|
||||
if forceBaseImageBuild:
|
||||
cmd.run(f"docker image rm {baseImage}:{baseTag}")
|
||||
cmd.run(f"{self.cli} image rm {baseImage}:{baseTag}")
|
||||
logfile = f'{lSourcePath}/cmake_targets/log/ran-base.docker.log'
|
||||
option = f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
|
||||
cmd.run(f"docker build --target {baseImage} --tag {baseImage}:{baseTag} --file docker/Dockerfile.base{dockerfileprefix} {option} . &> {logfile}", timeout=1600)
|
||||
if self.host == 'Ubuntu':
|
||||
option = f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
|
||||
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))
|
||||
log_files.append(t)
|
||||
|
||||
# First verify if the base image was properly created.
|
||||
ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}")
|
||||
ret = cmd.run(f"{self.cli} image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}")
|
||||
allImagesSize = {}
|
||||
if ret.returncode != 0:
|
||||
logging.error('\u001B[1m Could not build properly ran-base\u001B[0m')
|
||||
# Recover the name of the failed container?
|
||||
cmd.run(f"docker ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty docker rm -f")
|
||||
cmd.run(f"docker image prune --force")
|
||||
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty {self.cli} rm -f")
|
||||
cmd.run(f"{self.cli} image prune --force")
|
||||
cmd.close()
|
||||
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
||||
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
||||
@@ -309,31 +333,32 @@ class Containerize():
|
||||
for image,pattern,name,option in imageNames:
|
||||
# the archived Dockerfiles have "ran-base:latest" as base image
|
||||
# we need to update them with proper tag
|
||||
cmd.run(f'git checkout -- docker/Dockerfile.{pattern}{dockerfileprefix}')
|
||||
cmd.run(f'sed -i -e "s#{baseImage}:latest#{baseImage}:{baseTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
||||
cmd.run(f'git checkout -- docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||
cmd.run(f'sed -i -e "s#{baseImage}:latest#{baseImage}:{baseTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||
# target images should use the proper ran-build image
|
||||
if image != 'ran-build' and "-asan" in name:
|
||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build-asan:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build-asan:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||
elif "fhi72" in name or name == "oai-nr-oru":
|
||||
cmd.run(f'sed -i -e "s#ran-build-fhi72:latest#ran-build-fhi72:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
||||
cmd.run(f'sed -i -e "s#ran-build-fhi72:latest#ran-build-fhi72:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||
elif image != 'ran-build':
|
||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{dockerfileprefix}')
|
||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||
if image == 'oai-gnb-aerial':
|
||||
cmd.run('cp -f /opt/nvidia-ipc/nvipc_src.2026.01.07.tar.gz .')
|
||||
logfile = f'{lSourcePath}/cmake_targets/log/{name}.docker.log'
|
||||
option = option + f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
|
||||
ret = cmd.run(f'docker build --target {image} --tag {name}:{imageTag} --file docker/Dockerfile.{pattern}{dockerfileprefix} {option} . > {logfile} 2>&1', timeout=1200)
|
||||
if self.host == 'Ubuntu':
|
||||
option = option + f" --build-arg UBUNTU_IMAGE={DEFAULT_REGISTRY}/{ubuntuImage}"
|
||||
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))
|
||||
log_files.append(t)
|
||||
if image == 'oai-gnb-aerial':
|
||||
cmd.run('rm -f nvipc_src.2026.01.07.tar.gz')
|
||||
# check the status of the build
|
||||
ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {name}:{imageTag}")
|
||||
ret = cmd.run(f"{self.cli} image inspect --format=\'Size = {{{{.Size}}}} bytes\' {name}:{imageTag}")
|
||||
if ret.returncode != 0:
|
||||
logging.error('\u001B[1m Could not build properly ' + name + '\u001B[0m')
|
||||
status = False
|
||||
# Here we should check if the last container corresponds to a failed command and destroy it
|
||||
cmd.run(f"docker ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty docker rm -f")
|
||||
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty {self.cli} rm -f")
|
||||
allImagesSize[name] = 'N/A -- Build Failed'
|
||||
break
|
||||
else:
|
||||
@@ -347,16 +372,16 @@ class Containerize():
|
||||
logging.debug(f'{name} size is unknown')
|
||||
allImagesSize[name] = 'unknown'
|
||||
# Now pruning dangling images in between target builds
|
||||
cmd.run(f"docker image prune --force")
|
||||
cmd.run(f"{self.cli} image prune --force")
|
||||
cmd.run(f'docker logout {DEFAULT_REGISTRY}')
|
||||
# Remove all intermediate build images and clean up
|
||||
cmd.run(f"docker image rm ran-build:{imageTag} ran-build-asan:{imageTag} ran-build-fhi72:{imageTag} || true")
|
||||
cmd.run(f"docker volume prune --force")
|
||||
cmd.run(f"{self.cli} image rm ran-build:{imageTag} ran-build-asan:{imageTag} ran-build-fhi72:{imageTag} || true")
|
||||
cmd.run(f"{self.cli} volume prune --force")
|
||||
|
||||
# Remove some cached artifacts to prevent out of diskspace problem
|
||||
logging.debug(cmd.run("df -h").stdout)
|
||||
logging.debug(cmd.run("docker system df").stdout)
|
||||
cmd.run(f"docker buildx prune --filter until=1h --force")
|
||||
cmd.run(f"{self.cli} buildx prune --filter until=1h --force")
|
||||
logging.debug(cmd.run("df -h").stdout)
|
||||
logging.debug(cmd.run("docker system df").stdout)
|
||||
|
||||
@@ -464,12 +489,20 @@ class Containerize():
|
||||
cmd = cls_cmd.getConnection(node)
|
||||
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
|
||||
baseImage = 'ran-base'
|
||||
baseTag = 'develop'
|
||||
if self.ranAllowMerge:
|
||||
if self.ranTargetBranch == 'develop':
|
||||
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')
|
||||
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')
|
||||
result = re.search('index', cmd.getBefore())
|
||||
if result is not None:
|
||||
baseTag = 'ci-temp'
|
||||
|
||||
@@ -379,6 +379,90 @@ class HTMLManagement():
|
||||
self.htmlFile.write(' </tr>\n')
|
||||
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):
|
||||
if (self.htmlFooterCreated or (not self.htmlHeaderCreated)):
|
||||
return
|
||||
|
||||
@@ -27,30 +27,160 @@ import constants as CONST
|
||||
import cls_cmd
|
||||
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():
|
||||
|
||||
def LicenceAndFormattingCheck(ctx, node, HTML, d, branch, allowMerge, targetBranch):
|
||||
def __init__(self):
|
||||
|
||||
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.
|
||||
# It implies that this method shall be called last within a build pipeline
|
||||
# where workspace is already created
|
||||
lSourcePath = self.eNBSourceCodePath
|
||||
|
||||
if not node or not d:
|
||||
raise ValueError(f"{d=} {node=}")
|
||||
if not node or not lSourcePath:
|
||||
raise ValueError(f"{lSourcePath=} {node=}")
|
||||
logging.debug('Building on server: ' + node)
|
||||
cmd = cls_cmd.getConnection(node)
|
||||
check_options = ''
|
||||
if allowMerge:
|
||||
check_options = f'--build-arg MERGE_REQUEST=true --build-arg SRC_BRANCH={branch}'
|
||||
if targetBranch == '':
|
||||
if branch != 'develop' and branch != 'origin/develop':
|
||||
if self.ranAllowMerge:
|
||||
check_options = f'--build-arg MERGE_REQUEST=true --build-arg SRC_BRANCH={self.ranBranch}'
|
||||
if self.ranTargetBranch == '':
|
||||
if self.ranBranch != 'develop' and self.ranBranch != 'origin/develop':
|
||||
check_options += ' --build-arg TARGET_BRANCH=develop'
|
||||
else:
|
||||
check_options += f' --build-arg TARGET_BRANCH={targetBranch}'
|
||||
check_options += f' --build-arg TARGET_BRANCH={self.ranTargetBranch}'
|
||||
|
||||
logDir = f'{d}/cmake_targets/log/'
|
||||
logDir = f'{lSourcePath}/cmake_targets/log/'
|
||||
cmd.run(f'mkdir -p {logDir}')
|
||||
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 {d}/ci-scripts/docker/Dockerfile.formatting.ubuntu {d} > {logDir}/oai-formatting-check.txt 2>&1')
|
||||
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('docker image rm oai-formatting-check:latest')
|
||||
cmd.run('docker image prune --force')
|
||||
|
||||
@@ -17,7 +17,6 @@ gNBs =
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
||||
cu_sibs = ( 2, 3, 4 );
|
||||
@include "neighbour-config.conf"
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
@@ -5,57 +5,6 @@
|
||||
# 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 = (
|
||||
##########################################################
|
||||
# Entry USED BY gNB_ID = 0xe00 (nr_cellid = 1) #
|
||||
@@ -72,9 +21,6 @@ neighbour_list = (
|
||||
band = 78;
|
||||
plmn = { mcc = 208; mnc = 99; mnc_length = 2 };
|
||||
tracking_area_code = 1;
|
||||
q_OffsetCell = 2;
|
||||
q_RxLevMinOffsetCell= 2;
|
||||
q_QualMinOffsetCell = 1;
|
||||
}
|
||||
);
|
||||
},
|
||||
@@ -94,9 +40,6 @@ neighbour_list = (
|
||||
band = 78;
|
||||
plmn = { mcc = 208; mnc = 99; mnc_length = 2 };
|
||||
tracking_area_code = 1;
|
||||
q_OffsetCell = 2;
|
||||
q_RxLevMinOffsetCell= 2;
|
||||
q_QualMinOffsetCell = 1;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ ColNames :
|
||||
- Average vs Reference Deviation (Reference Value; Acceptability Deviation Threshold)
|
||||
Ref :
|
||||
feprx : 150.0
|
||||
feptx_prec : 0.0
|
||||
feptx_prec : 30.0
|
||||
feptx_ofdm : 60.0
|
||||
feptx_total : 150.0
|
||||
L1 Tx processing : 475.0
|
||||
|
||||
41
ci-scripts/docker/Dockerfile.cppcheck.xenial
Normal file
41
ci-scripts/docker/Dockerfile.cppcheck.xenial
Normal file
@@ -0,0 +1,41 @@
|
||||
# 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
|
||||
@@ -22,7 +22,7 @@ import constants as CONST
|
||||
|
||||
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_static_code_analysis as SCA
|
||||
import cls_static_code_analysis #class for static code analysis
|
||||
import cls_cluster # class for building/deploying on cluster
|
||||
import cls_native # class for all native/source-based operations
|
||||
from cls_ci_helper import TestCaseCtx
|
||||
@@ -64,6 +64,7 @@ def ExecuteActionWithParam(action, ctx, node):
|
||||
global RAN
|
||||
global HTML
|
||||
global CONTAINERS
|
||||
global SCA
|
||||
global CLUSTER
|
||||
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')
|
||||
@@ -195,7 +196,10 @@ def ExecuteActionWithParam(action, ctx, node):
|
||||
success = CONTAINERS.Create_Workspace(node, HTML)
|
||||
|
||||
elif action == 'LicenceAndFormattingCheck':
|
||||
success = SCA.StaticCodeAnalysis.LicenceAndFormattingCheck(ctx, node, HTML, RAN.eNBSourceCodePath, RAN.ranBranch, RAN.ranAllowMerge, RAN.ranTargetBranch)
|
||||
success = SCA.LicenceAndFormattingCheck(ctx, node, HTML)
|
||||
|
||||
elif action == 'Cppcheck_Analysis':
|
||||
success = SCA.CppCheckAnalysis(ctx, node, HTML)
|
||||
|
||||
elif action == 'Push_Local_Registry':
|
||||
tag_prefix = test.findtext('tag_prefix') or ""
|
||||
@@ -293,6 +297,7 @@ CiTestObj = cls_oaicitest.OaiCiTest()
|
||||
RAN = ran.RANManagement()
|
||||
HTML = cls_oai_html.HTMLManagement()
|
||||
CONTAINERS = cls_containerize.Containerize()
|
||||
SCA = cls_static_code_analysis.StaticCodeAnalysis()
|
||||
CLUSTER = cls_cluster.Cluster()
|
||||
|
||||
#-----------------------------------------------------------
|
||||
@@ -302,7 +307,7 @@ CLUSTER = cls_cluster.Cluster()
|
||||
import args_parse
|
||||
# Force local execution, move all execution targets to localhost
|
||||
force_local = False
|
||||
mode, force_local, date_fmt = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,CONTAINERS,HELP,CLUSTER)
|
||||
mode, force_local, date_fmt = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER)
|
||||
fmt = "%(levelname)8s: %(message)s"
|
||||
if date_fmt:
|
||||
fmt = "[%(asctime)s] %(levelname)s %(message)s"
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
- Deploy_Object
|
||||
- Stop_Object
|
||||
- Undeploy_Object
|
||||
- Cppcheck_Analysis
|
||||
- Deploy_Run_OC_PhySim
|
||||
- Build_Deploy_PhySim
|
||||
- LicenceAndFormattingCheck
|
||||
|
||||
20
ci-scripts/xml_files/cppcheck.xml
Normal file
20
ci-scripts/xml_files/cppcheck.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<!-- 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
|
||||
|
||||
trf_gen:
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
privileged: true
|
||||
container_name: l2sim4g-trf-gen
|
||||
networks:
|
||||
|
||||
@@ -166,7 +166,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
trf_gen:
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
privileged: true
|
||||
container_name: rfsim4g-trf-gen
|
||||
networks:
|
||||
|
||||
@@ -166,7 +166,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
trf_gen:
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
privileged: true
|
||||
container_name: rfsim4g-trf-gen
|
||||
networks:
|
||||
|
||||
@@ -166,7 +166,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
trf_gen:
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
privileged: true
|
||||
container_name: rfsim4g-trf-gen
|
||||
networks:
|
||||
|
||||
@@ -166,7 +166,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
trf_gen:
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
privileged: true
|
||||
container_name: rfsim4g-trf-gen
|
||||
networks:
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -50,7 +50,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
@@ -75,7 +75,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
init: true
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -50,7 +50,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
@@ -74,7 +74,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
init: true
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
|
||||
@@ -38,11 +38,11 @@ Password:
|
||||
Now pull images.
|
||||
|
||||
```bash
|
||||
$ docker pull mysql:9.6
|
||||
$ docker pull oaisoftwarealliance/oai-amf:v2.2.1
|
||||
$ docker pull oaisoftwarealliance/oai-smf:v2.2.1
|
||||
$ docker pull oaisoftwarealliance/oai-upf:v2.2.1
|
||||
$ docker pull oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
$ docker pull mysql:8.0
|
||||
$ docker pull oaisoftwarealliance/oai-amf:v2.1.10
|
||||
$ docker pull oaisoftwarealliance/oai-smf:v2.1.10
|
||||
$ docker pull oaisoftwarealliance/oai-upf:v2.1.10
|
||||
$ docker pull oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
|
||||
$ docker pull oaisoftwarealliance/oai-gnb:develop
|
||||
$ docker pull oaisoftwarealliance/oai-nr-ue:develop
|
||||
@@ -570,7 +570,7 @@ runs the gnb service with modified gNB executable.
|
||||
```bash
|
||||
docker compose -f docker-compose.yaml -f local-override.yaml up -d oai-gnb
|
||||
```
|
||||
This command rebuilds both the gNB & nrUE and runs the oai-nr-ue container with
|
||||
This command rebuilds both the gNB & nrUE and runs the oai-nr-ue container with
|
||||
modified nrUE executable.
|
||||
```bash
|
||||
docker compose -f docker-compose.yaml -f local-override.yaml up -d oai-nr-ue
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ./oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -50,7 +50,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
@@ -74,7 +74,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
init: true
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -50,7 +50,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
@@ -74,7 +74,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
init: true
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -50,7 +50,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
@@ -74,7 +74,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
init: true
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -50,7 +50,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -50,7 +50,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
@@ -74,7 +74,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
init: true
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||
@@ -23,7 +23,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -35,7 +35,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -47,7 +47,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -70,7 +70,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||
@@ -23,7 +23,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:ci-tmp-pr-372-26c14bcd
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -35,7 +35,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.9
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -47,7 +47,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.9
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -70,7 +70,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -50,7 +50,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
@@ -74,7 +74,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
init: true
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
- ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||
@@ -25,7 +25,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -37,7 +37,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -49,7 +49,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -72,7 +72,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
"ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -50,7 +50,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
@@ -74,7 +74,7 @@ services:
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
init: true
|
||||
entrypoint: /bin/bash -c \
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
ipv4_address: 192.168.71.131
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
ipv4_address: 192.168.71.132
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -50,7 +50,7 @@ services:
|
||||
ipv4_address: 192.168.71.133
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
@@ -12,7 +12,7 @@ services:
|
||||
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -49,7 +49,7 @@ services:
|
||||
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -62,7 +62,7 @@ services:
|
||||
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
@@ -12,7 +12,7 @@ services:
|
||||
|
||||
mysql:
|
||||
container_name: "rfsim5g-mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
init: true
|
||||
volumes:
|
||||
- ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
@@ -36,7 +36,7 @@ services:
|
||||
|
||||
oai-amf:
|
||||
container_name: "rfsim5g-oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-amf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/paris
|
||||
volumes:
|
||||
@@ -49,7 +49,7 @@ services:
|
||||
|
||||
oai-smf:
|
||||
container_name: "rfsim5g-oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-smf:v2.1.10
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
@@ -62,7 +62,7 @@ services:
|
||||
|
||||
oai-upf:
|
||||
container_name: "rfsim5g-oai-upf"
|
||||
image: oaisoftwarealliance/oai-upf:v2.2.1
|
||||
image: oaisoftwarealliance/oai-upf:v2.1.10
|
||||
init: true
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
|
||||
@@ -184,7 +184,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
trf_gen:
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
privileged: true
|
||||
container_name: prod-trf-gen
|
||||
networks:
|
||||
|
||||
@@ -168,7 +168,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
trf_gen:
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
privileged: true
|
||||
container_name: prod-trf-gen
|
||||
networks:
|
||||
|
||||
@@ -168,7 +168,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
trf_gen:
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:focal
|
||||
privileged: true
|
||||
container_name: prod-trf-gen
|
||||
networks:
|
||||
|
||||
@@ -48,8 +48,8 @@ typedef union checkedparam {
|
||||
int num_okintval; /* number of valid values in the checkingval array */
|
||||
} s1a;
|
||||
struct {
|
||||
int (*f2)(const configmodule_interface_t *cfg,
|
||||
const paramdef_t *param); /* check an integer against an authorized range, defined by its min and max value */
|
||||
int (*f2)(configmodule_interface_t *cfg,
|
||||
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 */
|
||||
|
||||
} s2;
|
||||
|
||||
@@ -183,35 +183,14 @@ int config_check_intval(configmodule_interface_t *cfg, paramdef_t *param)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (param->type == TYPE_INT32 || param->type == TYPE_INT) {
|
||||
if (param->iptr == NULL) {
|
||||
fprintf(stderr, "[CONFIG] config_check_intval: %s: NULL iptr\n", param->optname);
|
||||
return -1;
|
||||
for ( int i=0; i<param->chkPptr->s1.num_okintval ; i++) {
|
||||
if( *(param->uptr) == param->chkPptr->s1.okintval[i] ) {
|
||||
return 0;
|
||||
}
|
||||
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)
|
||||
@@ -232,38 +211,15 @@ int config_check_modify_integer(configmodule_interface_t *cfg, paramdef_t *param
|
||||
return -1;
|
||||
}
|
||||
|
||||
int config_check_intrange(const configmodule_interface_t *cfg, const paramdef_t *param)
|
||||
int config_check_intrange(configmodule_interface_t *cfg, paramdef_t *param)
|
||||
{
|
||||
UNUSED(cfg);
|
||||
if( *(param->iptr) >= param->chkPptr->s2.okintrange[0] && *(param->iptr) <= param->chkPptr->s2.okintrange[1] ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
fprintf(stderr,
|
||||
"[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]);
|
||||
fprintf(stderr,"[CONFIG] config_check_intrange: %s: %i invalid value, authorized range: %i %i\n",
|
||||
param->optname, (int)*(param->uptr), param->chkPptr->s2.okintrange[0], param->chkPptr->s2.okintrange[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -51,8 +51,7 @@ int config_get_processedint(configmodule_interface_t *cfg, paramdef_t *cfgoption
|
||||
/* 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_modify_integer(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_intrange(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);
|
||||
const paramdef_t *config_get_paramdef_from_name(const paramdef_t *pd, int num, const char *name);
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
#define RETURNok (0)
|
||||
#define RETURNerror (-1)
|
||||
#define DEFAULT_NAS_PATH "PWD"
|
||||
#define UNUSED_VARIABLE(vARIABLE) (void)(vARIABLE)
|
||||
#define NUM_PRACH_RX_FOR_NOISE_ESTIMATE 100
|
||||
|
||||
// SDAP
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
#define ALIGNARRAYSIZE(a, b) (((a + b - 1) / b) * b)
|
||||
#define ALNARS_16_4(a) ALIGNARRAYSIZE(a, 4)
|
||||
#define ALNARS_32_8(a) ALIGNARRAYSIZE(a, 8)
|
||||
|
||||
typedef struct complexd {
|
||||
double r;
|
||||
|
||||
@@ -16,7 +16,7 @@ add_subdirectory(nr)
|
||||
add_subdirectory(LOG)
|
||||
add_subdirectory(threadPool)
|
||||
add_subdirectory(time_manager)
|
||||
add_library(utils utils.c system.c time_meas.c time_stat.c tuntap_if.c reverse_bits.c fsn.c)
|
||||
add_library(utils utils.c system.c time_meas.c time_stat.c tuntap_if.c reverse_bits.c)
|
||||
target_include_directories(utils PUBLIC .)
|
||||
target_link_libraries(utils PRIVATE ${T_LIB})
|
||||
add_subdirectory(barrier)
|
||||
|
||||
@@ -67,26 +67,18 @@ the T tracer and only output on the terminal). The default is
|
||||
|
||||
## Run a tracer
|
||||
|
||||
Go into the directory `common/utils/T/tracer` and run for example the
|
||||
Go into the directory `common/utils/T/tracer` (or
|
||||
`cmake_targets/ran_build/build/common/utils/T/tracer`) and run for example the
|
||||
`enb` tracer:
|
||||
|
||||
```shell
|
||||
#in common/utils/T/tracer directory
|
||||
./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,
|
||||
if you want to trace a program running on `192.168.12.148` do:
|
||||
|
||||
```shell
|
||||
# in common/utils/T/tracer directory
|
||||
./enb -d ../T_messages.txt -ip 192.168.12.148
|
||||
```
|
||||
|
||||
|
||||
@@ -44,7 +44,6 @@ Or, from an existing build directory using cmake:
|
||||
```shell
|
||||
cd cmake_targets/ran_build/build
|
||||
cmake -DT_RECORD_DB=ON .
|
||||
# use make or ninja
|
||||
make T_tools
|
||||
```
|
||||
|
||||
@@ -54,9 +53,6 @@ The binary is then available in:
|
||||
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
|
||||
|
||||
- a running ClickHouse server reachable from `record_db`
|
||||
@@ -88,8 +84,8 @@ To enable all events except the most verbose groups and write them to
|
||||
ClickHouse:
|
||||
|
||||
```shell
|
||||
cd cmake_targets/ran_build/build/
|
||||
./common/utils/T/tracer/record_db -d ../../../common/utils/T/T_messages.txt \
|
||||
cd cmake_targets/ran_build/build/common/utils/T/tracer
|
||||
./record_db -d ../T_messages.txt \
|
||||
-ON \
|
||||
-off VCD \
|
||||
-off HEAVY \
|
||||
@@ -112,7 +108,7 @@ The event selection rules are the same as for [`record`](./record.md):
|
||||
These options are processed in order. For example:
|
||||
|
||||
```shell
|
||||
./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
|
||||
./record_db -d ../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
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
#ifndef ACTOR_H
|
||||
#define ACTOR_H
|
||||
#include "common/utils/threadPool/notified_fifo.h"
|
||||
#include "notified_fifo.h"
|
||||
|
||||
#define INIT_ACTOR(ptr, name, core_affinity) init_actor((Actor_t *)ptr, name, core_affinity);
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ add_library(ds OBJECT
|
||||
seq_arr.c
|
||||
hashtable.c
|
||||
obj_hashtable.c
|
||||
spsc_q.c
|
||||
)
|
||||
|
||||
target_include_directories(ds PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
@@ -10,6 +10,36 @@
|
||||
#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
|
||||
* hash_free_int_func() is used when this hashtable is used to store int values as data (pointer = value).
|
||||
@@ -117,6 +147,41 @@ hashtable_rc_t hashtable_is_key_exists (const hash_table_t *const hashtblP, cons
|
||||
|
||||
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,10 +44,12 @@ typedef struct hash_table_iterator_s {
|
||||
const hash_table_t* const hashtbl;
|
||||
} hash_table_iterator_s;
|
||||
|
||||
char *hashtable_rc_code2string(hashtable_rc_t rcP);
|
||||
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 *));
|
||||
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_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_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);
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
* 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,11 +8,5 @@ add_test(NAME test_seq_arr COMMAND test_seq_arr) # no options required
|
||||
add_executable(test_hashtable test_hashtable.cpp)
|
||||
add_dependencies(tests test_hashtable)
|
||||
target_link_libraries(test_hashtable PRIVATE ds GTest::gtest)
|
||||
add_test(NAME 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)
|
||||
add_test(NAME test_hashtable
|
||||
COMMAND ./test_hashtable)
|
||||
|
||||
@@ -1,135 +0,0 @@
|
||||
/*
|
||||
* 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();
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
#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();
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/*
|
||||
* 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,7 +13,6 @@
|
||||
#include <stdlib.h>
|
||||
#include "assertions.h"
|
||||
#include "common/utils/utils.h"
|
||||
#include "common/utils/ds/byte_array.h"
|
||||
|
||||
#define MAX_SI_GROUPS 3
|
||||
#define NR_MAX_PDSCH_TBS 3824
|
||||
@@ -80,32 +79,10 @@ 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))
|
||||
#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 {
|
||||
nr_sib_type_t SIB_type;
|
||||
uint8_t *SIB_buffer;
|
||||
int SIB_size;
|
||||
int SIB_type;
|
||||
} nr_SIBs_t;
|
||||
|
||||
typedef struct nr_bandentry_s {
|
||||
|
||||
@@ -2,10 +2,3 @@
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
/*
|
||||
* 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();
|
||||
}
|
||||
@@ -51,6 +51,10 @@ extern "C" {
|
||||
#define IS_BIT_SET(a, b) ((a >> b) & 1)
|
||||
#define SET_BIT(a, b) (a | (1 << b))
|
||||
|
||||
// Gives number of bytes to next 32 byte mem boundary from an element in array
|
||||
#define PTR_ALIGN_OFFSET_BYTES(ptr, bytes) (((bytes) - ((uintptr_t)(ptr) & (bytes - 1))) & (bytes - 1))
|
||||
#define PTR_ALIGN_OFFSET_ELEMS(ptr, bytes) (PTR_ALIGN_OFFSET_BYTES(ptr, bytes) / sizeof(*(ptr)))
|
||||
|
||||
#ifdef __cplusplus
|
||||
#ifdef min
|
||||
#undef min
|
||||
|
||||
@@ -1967,7 +1967,7 @@ INPUT = \
|
||||
@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/group_hopping.c \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/if4_tools.h \
|
||||
@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/LTE_TRANSPORT/if4_tools.h \
|
||||
@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/edci.c \
|
||||
|
||||
@@ -154,7 +154,7 @@ These modes of operation are supported:
|
||||
- RedCap SIB1 v17 IEs supported
|
||||
- Coexistence of RedCap and Normal UEs
|
||||
- Handling of RedCap capability for small PDCP/RLC SN size
|
||||
- Scheduling of other SIBs (2, 3, 4, 19)
|
||||
- Scheduling of other SIBs (2, 19)
|
||||
- NTN
|
||||
- Support downlinkHARQ-FeedbackDisabled-r17
|
||||
- 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)
|
||||
- LTE RRC (36.331) also updated to Rel 15
|
||||
- Generation of system information (SIB2, SIB3, SIB4)
|
||||
- Generation of system information (SIB2)
|
||||
- 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)
|
||||
- Integration of RRC messages and procedures supporting UE 5G SA connection
|
||||
@@ -380,7 +380,7 @@ These modes of operation are supported:
|
||||
- MIB processing
|
||||
- Scheduling of system information block 1 (SIB1) reception
|
||||
* Other system information
|
||||
- Scheduling of other system information blocks reception (SIB2, SIB3, SIB4)
|
||||
- Scheduling of other system information blocks reception
|
||||
* Random access procedure (needs improvement, there is still not a clear separation between MAC and PHY)
|
||||
- Mapping SSBs to multiple ROs
|
||||
- Scheduling of PRACH
|
||||
|
||||
@@ -1259,11 +1259,10 @@ For two RUs using a 8x8 configuration, i.e. a single antenna system, the referen
|
||||
|
||||
For two RUs each using a 4x4 configuration, i.e. a distributed antenna system (DAS),
|
||||
we use the analog beamforming implementation. More details can be found in
|
||||
[this document](./analog_beamforming.md). It is important to note that
|
||||
the configuration file should be set as a 4x4 scenario and each RU would be given a
|
||||
different beam. The reference DU configuration file is [`gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf).
|
||||
|
||||
DAS is enabled by setting to 1 the parameter `enable_das` in `L1` section.
|
||||
[this document](./analog_beamforming.md). It is important to note the following parameters in the configuration file:
|
||||
- In RU section `nb_tx` and `nb_rx` indicates the total number of physical antenna ports across all distributed RUs.
|
||||
- `pusch_AntennaPorts`, `pdsch_AntennaPorts_XP * pdsch_AntennaPorts_N1 * pdsch_AntennaPorts_N2` indicate the number of logical antenna ports for one analog beam.
|
||||
The reference DU configuration file is [`gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf).
|
||||
|
||||
The following parameters shall be configured on the gNB in the `MACRLC` section:
|
||||
- `set_analog_beamforming`
|
||||
|
||||
@@ -135,7 +135,6 @@ The other SDRs (AW2S, LimeSDR, ...) have no READMEs.
|
||||
- [clang-format.md](./clang-format.md): how to format the code. See also the
|
||||
next entry for an 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
|
||||
- [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
|
||||
|
||||
@@ -633,98 +633,6 @@ sequenceDiagram
|
||||
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 information is stored in `gNB_RRC_UE_t`, which includes:
|
||||
|
||||
@@ -94,81 +94,7 @@ the [MAC configuration](../MAC/mac-usage.md) as well for SIB configuration.
|
||||
deactivated, a transparent SDAP header is prepended to packets, but no
|
||||
further processing is being done.
|
||||
- `cu_sibs` (default: `[]`) list of SIBs to give to the DU for transmission.
|
||||
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).
|
||||
Currently, SIB2 is supported.
|
||||
|
||||
#### UE-specific configuration
|
||||
|
||||
@@ -179,64 +105,12 @@ Detailed implementation flow and sequence diagrams are documented in [`rrc-dev.m
|
||||
|
||||
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
|
||||
|
||||
To define a neighbour cell in the configuration file, the following parameters are required:
|
||||
To define a neighbor cell in the configuration file, the following parameters are required:
|
||||
|
||||
- `gNB_ID` - identifier of the neighbour gNB (e.g., `0xe01`)
|
||||
- `nr_cellid` - cell identifier of the neighbour cell (e.g., `11111111`)
|
||||
- `gNB_ID` - identifier of the neighbor gNB (e.g., `0xe01`)
|
||||
- `nr_cellid` - cell identifier of the neighbor cell (e.g., `11111111`)
|
||||
- `physical_cellId` - physical cell ID for radio identification (e.g., `1`)
|
||||
- `absoluteFrequencySSB` - SSB frequency in ARFCN notation (e.g., `643296`)
|
||||
- `subcarrierSpacing` - numerology index: 0=15kHz, 1=30kHz, 2=60kHz, 3=120kHz
|
||||
@@ -249,45 +123,19 @@ To define a neighbour cell in the configuration file, the following parameters a
|
||||
|
||||
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 = (
|
||||
{
|
||||
nr_cellid = 12345678;
|
||||
|
||||
neighbour_cell_configuration = (
|
||||
{
|
||||
gNB_ID = 0xe01;
|
||||
nr_cellid = 11111111;
|
||||
physical_cellId = 1;
|
||||
absoluteFrequencySSB = 643296; # ARFCN used to look up matching entry in frequency_list
|
||||
subcarrierSpacing = 1; # 30 kHz
|
||||
absoluteFrequencySSB = 643296;
|
||||
subcarrierSpacing = 1; # 30 kHz
|
||||
band = 78;
|
||||
plmn = { mcc = 001; mnc = 01; mnc_length = 2 };
|
||||
tracking_area_code = 1;
|
||||
|
||||
# Example per-neighbour offsets (SIB3/SIB4)
|
||||
q_OffsetCell = 0;
|
||||
q_RxLevMinOffsetCell = -1;
|
||||
q_QualMinOffsetCell = -1;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -96,6 +96,10 @@ information on how the images are built.
|
||||
- orion: Cross-compilation from Intel to ARM
|
||||
- base image from `Dockerfile.base.ubuntu.cross-arm64`
|
||||
- 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/)
|
||||
~BUILD-ONLY ~4G-LTE ~5G-NR ~nrUE
|
||||
- cluster (`Asterix-OC-oaicicd-session` resource): RHEL image build using the OpenShift Cluster (using gcc/clang)
|
||||
|
||||
@@ -10,11 +10,11 @@ This document explains the implementation of analog beamforming in OAI codebase.
|
||||
|
||||
Beamforming is a technique applied to antenna arrays to create a directional radiation pattern. This often consists in providing a different phase shift to each element of the array such that signals with a different angle of arrival/departure experience a change in radiation pattern because of constructive or destructive interference.
|
||||
|
||||
There are three main beamforming techinques: analog, digital and hybrid. The names refer to the phase shift application before or after the digital to analog conversion (or analog to digital in reception). When we speak about analog beamforming we generally refer to a techinique where the phase shifts that produce the beam stearing are applied by the radio unit (RU) choosing from a finite set of steering directions. The advantage of analog beamforming is a simplified analog circuitry and therefore reduced costs.
|
||||
There are three main beamforming techniques: analog, digital and hybrid. The names refer to the phase shift application before or after the digital to analog conversion (or analog to digital in reception). When we speak about analog beamforming we generally refer to a technique where the phase shifts that produce the beam steering are applied by the radio unit (RU) choosing from a finite set of steering directions. The advantage of analog beamforming is a simplified analog circuitry and therefore reduced costs.
|
||||
|
||||
The presence of a limited number of predefined beams at RU poses constraints to the scheduler at gNB. As a matter of fact, the scheduler can serve only a limited number of beams, depending on the RU characteristics (possibly only 1), in a given time scale, that also depends on the RU characteristics (e.g. 1 slot or 1 symbol). This limitation doesn't exist for digital beamforming.
|
||||
|
||||
Analog beamforming implementation also allows to enable distributed antenna systems (DAS), where each beam corrisponds to one antenna (or a set of antennas) of the system. In this scenario, the scheduler constaint is alleviated because normally the number of concurrent beams allowed equals the total number of beams.
|
||||
Analog beamforming implementation also allows to enable distributed antenna systems (DAS), where each beam corresponds to one antenna (or a set of antennas) of the system. In this scenario, the scheduler constraint is alleviated because normally the number of concurrent beams allowed equals the total number of beams.
|
||||
|
||||
## Configuration file fields for analog beamforming
|
||||
|
||||
@@ -28,7 +28,7 @@ In the `MACRLC` section of configuration files, there are three new parameters:
|
||||
|
||||
Setting analog beamforming to "preconfigured" or "lophy" changes the way FAPI beam index is treated. By setting "preconfigured", we instruct L1 to look up in Hi-PHY preconfigured DBM beam index. By setting "lophy", we instruct L2 to directly signal to Lo-PHY the beam index (e.g. over 7.2x fronthaul).
|
||||
|
||||
DAS is enabled by setting to 1 the parameter `enable_das` in the L1 section of the configuration file. In case of DAS enabled, the field `beam_weights` in `MACRLC` section can be omitted and the number of beams per period equals the total number of beams.
|
||||
DAS is enabled by setting the field `beams_per_period` in `MACRLC` section to a value equal to the number of distributed units and by ensuring `nb_tx` and `nb_rx` in RU section is adequate enough to serve all beams. `beam_mode` must be set to "preconfigured" and `beam_weights` can be omitted.
|
||||
|
||||
## Implementation in OAI scheduler
|
||||
|
||||
@@ -55,19 +55,16 @@ This definition of beam-ID is present only in the most recent versions of SCF PH
|
||||
|
||||
In addition to that, a `config_request` structure defined as vendor extension (`nfapi_nr_analog_beamforming_ve_t`) configures the lower layers at initialization with the following information:
|
||||
- `analog_bf_vendor_ext` which can assume values 1 or 0 for enabling or disabling analog beamforming
|
||||
- `num_beams_period_vendor_ext` which corresponds to the configuration parameter `beams_per_period`
|
||||
|
||||
Therefore, in case of analog beamforming, L2 provides in each channel FAPI message information about the beam index via the beam-ID parameter with MSB set to 1.
|
||||
|
||||
## L1 implementation
|
||||
|
||||
To handle multiple concurrent beams, the buffers containing Tx and Rx data in frequency domain (`txdataF` and `rxdataF`) have been extended by one dimension to contain multiple concurrent beams to be transmitted/received.
|
||||
The function `beam_index_allocation`, called by every L1 channel, is responsible to match the FAPI analog beam index to the RU beam index and to store the latter `beam_id` structure, which allocates the beams per symbol, despite L2 only supporting beam change at slot level. At the same time, the function returns the concurrent beam index, to be used to store data in frequency domain buffers. While doing so, the function also checks if there is room for current beam in the list of concurrent beams, which should always be the case, if L2 properly allocated the channels.
|
||||
|
||||
In case of DAS, since each beam corresponds to a specific antenna port, the `beam_index_allocation` function is simplified in the sense that the beam index corresponds to the antenna port index of the frequency domain buffers.
|
||||
The total number of logical antenna ports available at L1 is same as `pusch_AntennaPorts * beams_per_period` in UL and `pdsch_AntennaPorts_N1 * pdsch_AntennaPorts_N2 * pdsch_AntennaPorts_XP * beams_per_period` in DL.
|
||||
To handle multiple concurrent beams, L2 uses spatial stream indices specified by FAPI to signal L1 on which logical ports to use for a DL or UL signal. The config file parameter `spatial_stream_index` can be used to specify an array of logical port indices to be used. If this parameter is not provided then the indices defaults to `[0 ... pusch_AntennaPorts - 1]`. This parameter is particularly useful when a specific subset of eAxCID has to be used.
|
||||
|
||||
## RU implementation
|
||||
|
||||
The implementation is still work in progress.
|
||||
|
||||
The first dimension of the Tx and Rx buffers that used to contain the number of Tx/Rx antennas, it is now extended to contain the number of parallel streams which is the number of antennas multiplied by the number of concurrent beams.
|
||||
The first dimension of the Tx and Rx buffers contains the number of Tx/Rx antennas which is at least the number of logical antenna ports.
|
||||
|
||||
@@ -512,16 +512,8 @@ 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
|
||||
gNB configuration file with `@include "neighbour-config-rfsim.conf"`.
|
||||
|
||||
The neighbor configuration is nested:
|
||||
|
||||
- `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
|
||||
For each gNB there is a `neighbour_cell_configuration` linked to its serving
|
||||
cell ID.
|
||||
|
||||
See the example above for `neighbour-config-ho.conf`. The same configuration
|
||||
is for both F1 and N2 handover.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
volumes:
|
||||
- ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
- ./healthscripts/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||
@@ -172,7 +172,7 @@ services:
|
||||
privileged: true
|
||||
init: true
|
||||
container_name: oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:jammy
|
||||
entrypoint: /bin/bash -c \
|
||||
"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"]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
services:
|
||||
mysql:
|
||||
container_name: "mysql"
|
||||
image: mysql:9.6
|
||||
image: mysql:8.0
|
||||
volumes:
|
||||
- ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
- ./healthscripts/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||
@@ -154,9 +154,9 @@ services:
|
||||
privileged: true
|
||||
init: true
|
||||
container_name: oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:jammy
|
||||
entrypoint: /bin/bash -c \
|
||||
"ip route add 10.0.0.0/16 via 192.168.70.134 dev eth0; ip route; iperf3 -s -D; 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"]
|
||||
healthcheck:
|
||||
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" \
|
||||
./build_oai --phy_simulators --gNB --eNB --nrUE --UE \
|
||||
--ninja --build-tool-opt -k10 \
|
||||
--noavx512 -c
|
||||
--noavx512 --disable-T-Tracer -c
|
||||
|
||||
@@ -24,7 +24,6 @@ RUN /bin/sh oaienv && \
|
||||
-DAVX512=OFF -DCMAKE_C_FLAGS=-Werror -DCMAKE_CXX_FLAGS=-Werror \
|
||||
-DENABLE_PHYSIM_TESTS=ON \
|
||||
-DSANITIZE_ADDRESS=ON -DSANITIZE_UNDEFINED=ON \
|
||||
-DT_TRACER=OFF \
|
||||
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/opt/oai-physim/bin && \
|
||||
ninja -k10 -j36
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include "nfapi/oai_integration/vendor_ext.h"
|
||||
#include "radio/COMMON/common_lib.h"
|
||||
|
||||
#include "PHY/if4_tools.h"
|
||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
||||
#include "PHY/LTE_ESTIMATION/lte_estimation.h"
|
||||
|
||||
#include "PHY/phy_extern.h"
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#include "PHY/phy_extern.h"
|
||||
#include "PHY/LTE_ESTIMATION/lte_estimation.h"
|
||||
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
||||
#include "PHY/if4_tools.h"
|
||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
||||
#include "PHY/LTE_TRANSPORT/transport_proto.h"
|
||||
#include "SCHED/sched_common.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "PHY/INIT/nr_phy_init.h"
|
||||
#include "PHY/MODULATION/nr_modulation.h"
|
||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||
#include "PHY/phy_digital_beamforming.h"
|
||||
#include "PHY/TOOLS/tools_defs.h"
|
||||
#include "PHY/defs_RU.h"
|
||||
#include "PHY/defs_gNB.h"
|
||||
@@ -65,8 +66,6 @@ static void tx_func(processingData_L1tx_t *info)
|
||||
reset_active_ulsch(gNB, frame_rx);
|
||||
}
|
||||
|
||||
clear_slot_beamid(gNB, slot_tx);
|
||||
|
||||
nfapi_nr_slot_indication_scf_t ind = {.sfn = frame_tx, .slot = slot_tx};
|
||||
start_meas(&gNB->slot_indication_stats);
|
||||
// this variable is very big (multiple MB), so we put it into static storage
|
||||
@@ -161,31 +160,45 @@ 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};
|
||||
// Do PRACH RU processing
|
||||
UL_INFO.rach_ind.pdu_list = UL_INFO.prach_pdu_indication_list;
|
||||
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);
|
||||
L1_nr_prach_procedures(gNB, frame_rx, slot_rx, &UL_INFO.rach_ind);
|
||||
|
||||
int soffset = (slot_rx % RU_RX_SLOT_DEPTH) * gNB->frame_parms.symbols_per_slot * gNB->frame_parms.ofdm_symbol_size;
|
||||
const uint max_symb = (gNB->frame_parms.Ncp == NR_EXTENDED) ? 12 : 14;
|
||||
//WA: comment rotation in tx/rx
|
||||
if (gNB->phase_comp) {
|
||||
//apply the rx signal rotation here
|
||||
int soffset = (slot_rx % RU_RX_SLOT_DEPTH) * gNB->frame_parms.symbols_per_slot * gNB->frame_parms.ofdm_symbol_size;
|
||||
for (int bb = 0; bb < gNB->common_vars.num_beams_period; bb++) {
|
||||
for (int aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
|
||||
const uint max_symb = (gNB->frame_parms.Ncp == NR_EXTENDED) ? 12 : 14;
|
||||
for (int sym = 0; sym < max_symb; sym++)
|
||||
apply_nr_rotation_symbol_RX(&gNB->frame_parms,
|
||||
gNB->common_vars.rxdataF[bb][aa] + soffset + sym * gNB->frame_parms.ofdm_symbol_size,
|
||||
gNB->frame_parms.symbol_rotation[1],
|
||||
gNB->frame_parms.N_RB_UL,
|
||||
slot_rx,
|
||||
sym);
|
||||
}
|
||||
// apply the rx signal rotation here
|
||||
for (int aa = 0; aa < gNB->frame_parms.nb_antennas_tx; aa++) {
|
||||
for (int sym = 0; sym < max_symb; sym++)
|
||||
apply_nr_rotation_symbol_RX(&gNB->frame_parms,
|
||||
gNB->common_vars.rxdataF[aa] + soffset + sym * gNB->frame_parms.ofdm_symbol_size,
|
||||
gNB->frame_parms.symbol_rotation[1],
|
||||
gNB->frame_parms.N_RB_UL,
|
||||
slot_rx,
|
||||
sym);
|
||||
}
|
||||
}
|
||||
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx, &UL_INFO);
|
||||
|
||||
// Array to pass into phy_procedures_gNB_uespec_RX()
|
||||
c16_t *rxdataF[gNB->frame_parms.nb_antennas_rx];
|
||||
for (uint_fast8_t aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++)
|
||||
rxdataF[aa] = (c16_t *)gNB->common_vars.rxdataF[aa] + soffset;
|
||||
|
||||
// Check if current slot should be beamformed here
|
||||
struct nr_grid_slot *nrg = get_grid_slot(frame_rx, slot_rx);
|
||||
if (nrg) { // There is slot waiting to be beamformed.
|
||||
for (uint_fast8_t aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
|
||||
nrg->grid[aa].dataF = gNB->common_vars.rxdataF_BF[aa];
|
||||
memset(nrg->grid[aa].dataF, 0, gNB->frame_parms.samples_per_slot_wCP * sizeof(c16_t));
|
||||
}
|
||||
// Rx beamforming. Maybe combine with signal rotation?
|
||||
apply_beamforming(&gNB->gNB_config.dbt_config, &gNB->frame_parms, gNB->frame_parms.nb_antennas_rx, rxdataF, nrg->grid, false);
|
||||
// Remove the slot from list
|
||||
remove_grid_slot(frame_rx, slot_rx);
|
||||
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx, &UL_INFO, gNB->common_vars.rxdataF_BF);
|
||||
} else {
|
||||
// No BF here, use the baseband buffer
|
||||
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx, &UL_INFO, rxdataF);
|
||||
}
|
||||
|
||||
// Call the scheduler
|
||||
start_meas(&gNB->ul_indication_stats);
|
||||
@@ -228,7 +241,7 @@ static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size
|
||||
bool full_slot = ru->half_slot_parallelization == 0;
|
||||
if (ru->feptx_prec) {
|
||||
output += print_meas_log(&ru->precoding_stats,
|
||||
full_slot ? "feptx_prec (per port)" : "feptx_prec (per port, half_slot)",
|
||||
"feptx_prec",
|
||||
NULL,
|
||||
NULL,
|
||||
output,
|
||||
@@ -360,10 +373,7 @@ void init_eNB_afterRU(void)
|
||||
AssertFatal(gNB->RU_list[ru_id]->common.rxdataF != NULL, "RU %d : common.rxdataF is NULL\n", gNB->RU_list[ru_id]->idx);
|
||||
for (int i = 0; i < gNB->RU_list[ru_id]->nb_rx; aa++, i++) {
|
||||
LOG_I(PHY, "Attaching RU %d antenna %d to gNB antenna %d\n", gNB->RU_list[ru_id]->idx, i, aa);
|
||||
for (int b = 0; b < gNB->RU_list[ru_id]->num_beams_period; b++) {
|
||||
int idx = i + b * gNB->RU_list[ru_id]->nb_rx;
|
||||
gNB->common_vars.rxdataF[b][aa] = (c16_t *)gNB->RU_list[ru_id]->common.rxdataF[idx];
|
||||
}
|
||||
gNB->common_vars.rxdataF[aa] = (c16_t *)gNB->RU_list[ru_id]->common.rxdataF[i];
|
||||
}
|
||||
}
|
||||
/* TODO: review this code, there is something wrong.
|
||||
|
||||
@@ -15,13 +15,12 @@
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "common/utils/assertions.h"
|
||||
#include "common/utils/system.h"
|
||||
#include "common/utils/fsn.h"
|
||||
#include "common/ran_context.h"
|
||||
|
||||
#include "radio/COMMON/common_lib.h"
|
||||
#include "radio/ETHERNET/ethernet_lib.h"
|
||||
|
||||
#include "PHY/if4_tools.h"
|
||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
||||
|
||||
#include "PHY/defs_nr_common.h"
|
||||
#include "PHY/phy_extern.h"
|
||||
@@ -49,6 +48,7 @@ static int DEFRUTPCORES[] = {-1,-1,-1,-1};
|
||||
#include "nfapi_interface.h"
|
||||
#include <nfapi/oai_integration/vendor_ext.h>
|
||||
#include "executables/nr-softmodem-common.h"
|
||||
#include "PHY/phy_digital_beamforming.h"
|
||||
|
||||
static void NRRCconfig_RU(configmodule_interface_t *cfg);
|
||||
|
||||
@@ -347,7 +347,7 @@ static void rx_rf(RU_t *ru, int *frame, int *slot)
|
||||
AssertFatal(*slot < fp->slots_per_frame && *slot >= 0, "slot %d is illegal (%d)\n", *slot, fp->slots_per_frame);
|
||||
|
||||
start_meas(&ru->rx_fhaul);
|
||||
int nb = ru->nb_rx * ru->num_beams_period;
|
||||
int nb = ru->nb_rx;
|
||||
void *rxp[nb];
|
||||
for (int i = 0; i < nb; i++)
|
||||
rxp[i] = (void *)&ru->common.rxdata[i][get_samples_slot_timestamp(fp, *slot)];
|
||||
@@ -454,49 +454,27 @@ static void rx_rf(RU_t *ru, int *frame, int *slot)
|
||||
stop_meas(&ru->rx_fhaul);
|
||||
}
|
||||
|
||||
static radio_tx_gpio_flag_t get_gpio_flags(RU_t *ru, int slot)
|
||||
void ctrl_rf(RU_t *ru, int frame, int slot, uint64_t timestamp, struct nr_grid *nrg)
|
||||
{
|
||||
radio_tx_gpio_flag_t flags_gpio = 0;
|
||||
NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
|
||||
openair0_config_t *cfg0 = &ru->openair0_cfg;
|
||||
const int num_ant_ports = ru->nb_tx;
|
||||
uint16_t beam_id[num_ant_ports];
|
||||
|
||||
switch (cfg0->gpio_controller) {
|
||||
case RU_GPIO_CONTROL_GENERIC:
|
||||
// currently we switch beams at the beginning of a slot and we take the beam index of the first symbol of this slot
|
||||
// we only send the beam to the gpio if the beam is different from the previous slot
|
||||
|
||||
if (ru->common.beam_id) {
|
||||
int prev_slot = (slot - 1 + fp->slots_per_frame) % fp->slots_per_frame;
|
||||
const int *beam_ids = ru->common.beam_id[0];
|
||||
int prev_beam = beam_ids[prev_slot * fp->symbols_per_slot];
|
||||
int beam = beam_ids[slot * fp->symbols_per_slot];
|
||||
if (prev_beam != beam) {
|
||||
flags_gpio = beam | TX_GPIO_CHANGE; // enable change of gpio
|
||||
LOG_I(HW, "slot %d, beam %d\n", slot, ru->common.beam_id[0][slot * fp->symbols_per_slot]);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RU_GPIO_CONTROL_INTERDIGITAL: {
|
||||
// the beam index is written in bits 8-10 of the flags
|
||||
// bit 11 enables the gpio programming
|
||||
int beam = 0;
|
||||
if ((slot % 10 == 0) && ru->common.beam_id && (ru->common.beam_id[0][slot * fp->symbols_per_slot] < 64)) {
|
||||
// beam = ru->common.beam_id[0][slot*fp->symbols_per_slot] | 64;
|
||||
beam = 1024; // hardcoded now for beam32 boresight
|
||||
// beam = 127; //for the sake of trying beam63
|
||||
LOG_D(HW, "slot %d, beam %d\n", slot, beam);
|
||||
}
|
||||
flags_gpio = beam | TX_GPIO_CHANGE;
|
||||
// flags_gpio |= beam << 8; // MSB 8 bits are used for beam
|
||||
LOG_I(HW, "slot %d, beam %d, flags_gpio %d\n", slot, beam, flags_gpio);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
AssertFatal(false, "illegal GPIO controller %d\n", cfg0->gpio_controller);
|
||||
for (int_fast16_t i = 0; i < num_ant_ports; i++) {
|
||||
if (!IS_BIT_SET(nrg[i].grid_info->beam_id, 15))
|
||||
return; // MSB must be set to send beam to RU
|
||||
beam_id[i] = nrg[i].grid_info->beam_id & 0x7fff; // FAPI beam_id is only 15 bits. MSB already handled
|
||||
}
|
||||
|
||||
return flags_gpio;
|
||||
const NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
|
||||
uint64_t ts = timestamp + ru->ts_offset;
|
||||
nfapi_nr_config_request_scf_t *cfg = &ru->config;
|
||||
int slot_type = nr_slot_select(cfg, frame, slot % fp->slots_per_frame);
|
||||
int prevslot_type = nr_slot_select(cfg, frame, (slot + (fp->slots_per_frame - 1)) % fp->slots_per_frame);
|
||||
if (cfg->cell_config.frame_duplex_type.value == TDD && slot_type == NR_DOWNLINK_SLOT && prevslot_type == NR_UPLINK_SLOT
|
||||
&& !get_softmodem_params()->continuous_tx && !IS_SOFTMODEM_RFSIM)
|
||||
ts -= ru->sf_extension;
|
||||
|
||||
ru->rfdevice.trx_set_beams(&ru->rfdevice, beam_id, num_ant_ports, ts);
|
||||
}
|
||||
|
||||
void tx_rf(RU_t *ru, int frame,int slot, uint64_t timestamp)
|
||||
@@ -514,7 +492,6 @@ void tx_rf(RU_t *ru, int frame,int slot, uint64_t timestamp)
|
||||
int sf_extension = 0;
|
||||
int siglen = get_samples_per_slot(slot, fp);
|
||||
radio_tx_burst_flag_t flags_burst = TX_BURST_INVALID;
|
||||
radio_tx_gpio_flag_t flags_gpio = 0;
|
||||
|
||||
if (cfg->cell_config.frame_duplex_type.value == TDD && !get_softmodem_params()->continuous_tx && !IS_SOFTMODEM_RFSIM) {
|
||||
int slot_type = nr_slot_select(cfg,frame,slot%fp->slots_per_frame);
|
||||
@@ -558,24 +535,22 @@ void tx_rf(RU_t *ru, int frame,int slot, uint64_t timestamp)
|
||||
flags_burst = proc->first_tx == 1 ? TX_BURST_START : TX_BURST_MIDDLE;
|
||||
}
|
||||
|
||||
if (ru->openair0_cfg.gpio_controller != RU_GPIO_CONTROL_NONE)
|
||||
flags_gpio = get_gpio_flags(ru, slot);
|
||||
|
||||
const int flags = flags_burst | (flags_gpio << 4);
|
||||
proc->first_tx = 0;
|
||||
|
||||
int nt = ru->nb_tx * ru->num_beams_period;
|
||||
int nt = ru->nb_tx;
|
||||
void *txp[nt];
|
||||
// prepare tx buffer pointers
|
||||
for (int i = 0; i < nt; i++)
|
||||
txp[i] = (void *)&ru->common.txdata[i][get_samples_slot_timestamp(fp, slot)] - sf_extension * sizeof(int32_t);
|
||||
|
||||
// prepare tx buffer pointers
|
||||
ctrl_rf(ru, frame, slot, timestamp, ru->common.ru_tx_grid);
|
||||
|
||||
uint32_t txs = ru->rfdevice.trx_write_func(&ru->rfdevice,
|
||||
timestamp + ru->ts_offset - sf_extension,
|
||||
txp,
|
||||
siglen + sf_extension,
|
||||
nt,
|
||||
flags);
|
||||
flags_burst);
|
||||
LOG_D(PHY,
|
||||
"[TXPATH] RU %d tx_rf, writing to TS %lu, %d.%d, unwrapped_frame %d, slot %d, flags %d, siglen+sf_extension %d, "
|
||||
"returned %d, E %f\n",
|
||||
@@ -585,7 +560,7 @@ void tx_rf(RU_t *ru, int frame,int slot, uint64_t timestamp)
|
||||
slot,
|
||||
proc->frame_tx_unwrap,
|
||||
slot,
|
||||
flags,
|
||||
flags_burst,
|
||||
siglen + sf_extension,
|
||||
txs,
|
||||
10 * log10((double)signal_energy(txp[0], siglen + sf_extension)));
|
||||
@@ -617,13 +592,13 @@ static void fill_rf_config(RU_t *ru, char *rf_config_file)
|
||||
AssertFatal(ru->nb_rx > 0 && ru->nb_rx <= 8, "openair0 does not support more than 8 antennas\n");
|
||||
|
||||
cfg->num_rb_dl = N_RB;
|
||||
cfg->tx_num_channels = ru->nb_tx * ru->num_beams_period;
|
||||
cfg->rx_num_channels = ru->nb_rx * ru->num_beams_period;
|
||||
cfg->num_distributed_ru = ru->num_beams_period;
|
||||
cfg->tx_num_channels = ru->nb_tx;
|
||||
cfg->rx_num_channels = ru->nb_rx;
|
||||
cfg->num_distributed_ru = 1;
|
||||
LOG_I(PHY,"Setting RF config for N_RB %d, NB_RX %d, NB_TX %d\n",cfg->num_rb_dl,cfg->rx_num_channels,cfg->tx_num_channels);
|
||||
LOG_I(PHY,"tune_offset %.0f Hz, sample_rate %.0f Hz\n",cfg->tune_offset,cfg->sample_rate);
|
||||
|
||||
for (int i = 0; i < ru->nb_tx * ru->num_beams_period; i++) {
|
||||
for (int i = 0; i < ru->nb_tx; i++) {
|
||||
if (ru->if_frequency == 0) {
|
||||
cfg->tx_freq[i] = fp->dl_CarrierFreq;
|
||||
} else if (ru->if_freq_offset) {
|
||||
@@ -638,7 +613,7 @@ static void fill_rf_config(RU_t *ru, char *rf_config_file)
|
||||
i, cfg->tx_gain[i],cfg->tx_freq[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < ru->nb_rx * ru->num_beams_period; i++) {
|
||||
for (int i = 0; i < ru->nb_rx; i++) {
|
||||
if (ru->if_frequency == 0) {
|
||||
cfg->rx_freq[i] = fp->ul_CarrierFreq;
|
||||
} else if (ru->if_freq_offset) {
|
||||
@@ -711,7 +686,7 @@ int setup_RU_buffers(RU_t *ru)
|
||||
|
||||
if (ru->openair0_cfg.mmapped_dma == 1) {
|
||||
// replace RX signal buffers with mmaped HW versions
|
||||
for (int i = 0; i < ru->nb_rx * ru->num_beams_period; i++) {
|
||||
for (int i = 0; i < ru->nb_rx; i++) {
|
||||
int card = i / 4;
|
||||
int ant = i % 4;
|
||||
LOG_D(PHY, "Mapping RU id %u, rx_ant %d, on card %d, chain %d\n", ru->idx, i, ru->rf_map.card + card, ru->rf_map.chain + ant);
|
||||
@@ -723,7 +698,7 @@ int setup_RU_buffers(RU_t *ru)
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < ru->nb_tx * ru->num_beams_period; i++) {
|
||||
for (int i = 0; i < ru->nb_tx; i++) {
|
||||
int card = i / 4;
|
||||
int ant = i % 4;
|
||||
LOG_D(PHY, "Mapping RU id %u, tx_ant %d, on card %d, chain %d\n", ru->idx, i, ru->rf_map.card + card, ru->rf_map.chain + ant);
|
||||
@@ -847,6 +822,9 @@ void *ru_thread(void *param)
|
||||
t = ru->ifdevice.get_internal_parameter("fh_if4p5_south_out");
|
||||
if (t != NULL)
|
||||
ru->fh_south_out = t;
|
||||
t = ru->ifdevice.get_internal_parameter("fh_if4p5_south_out_ctrl");
|
||||
if (t != NULL)
|
||||
ru->fh_south_out_ctrl = t;
|
||||
} else {
|
||||
malloc_IF4p5_buffer(ru);
|
||||
}
|
||||
@@ -981,16 +959,10 @@ void *ru_thread(void *param)
|
||||
proc->tti_rx * gNB->frame_parms.samples_per_slot_wCP);
|
||||
|
||||
// Do PRACH RU processing
|
||||
fsn_t now = {.f = proc->frame_rx, .s = proc->tti_rx, .mu = fp->numerology_index};
|
||||
prach_item_t p;
|
||||
while (get_next_nr_prach(&gNB->prach_ru_queue, &now, &p)) {
|
||||
prach_item_t *p = find_nr_prach(&gNB->prach_list, proc->frame_rx, proc->tti_rx, 0, NR_SEARCH_EXIST);
|
||||
if (p) {
|
||||
// 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);
|
||||
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);
|
||||
rx_nr_prach_ru(p, ru->common.rxdata, ru->nr_frame_parms, ru->N_TA_offset);
|
||||
} // end if (prach_id >= 0)
|
||||
} // end if (ru->feprx)
|
||||
} // end if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
|
||||
@@ -1127,13 +1099,14 @@ void set_function_spec_param(RU_t *ru)
|
||||
ru->do_prach = 0; // no prach processing in RU
|
||||
ru->feprx = nr_fep_tp; // this is frequency-shift + DFTs
|
||||
ru->feptx_ofdm = nr_feptx_tp; // this is fep with idft and precoding
|
||||
ru->feptx_prec = NULL;
|
||||
ru->feptx_prec = nr_feptx_prec;
|
||||
ru->fh_north_in = NULL; // no incoming fronthaul from north
|
||||
ru->fh_north_out = NULL; // no outgoing fronthaul to north
|
||||
ru->nr_start_if = NULL; // no if interface
|
||||
ru->rfdevice.host_type = RAU_HOST;
|
||||
ru->fh_south_in = rx_rf; // local synchronous RF RX
|
||||
ru->fh_south_out = tx_rf; // local synchronous RF TX
|
||||
ru->fh_south_out_ctrl = ctrl_rf; // local synchronous RF control
|
||||
ru->start_rf = start_rf; // need to start the local RF interface
|
||||
ru->stop_rf = stop_rf;
|
||||
ru->start_write_thread = start_write_thread; // starting RF TX in different thread
|
||||
@@ -1144,8 +1117,8 @@ void set_function_spec_param(RU_t *ru)
|
||||
ru->do_prach = 0;
|
||||
ru->txfh_in_fep = 0;
|
||||
ru->feprx = nr_fep_tp; // this is frequency-shift + DFTs
|
||||
ru->feptx_prec = NULL; // need to do transmit Precoding + IDFTs
|
||||
ru->feptx_ofdm = nr_feptx_tp; // need to do transmit Precoding + IDFTs
|
||||
ru->feptx_prec = nr_feptx_prec; // transmit precoding
|
||||
ru->feptx_ofdm = nr_feptx_tp; // IDFTs
|
||||
ru->fh_south_in = fh_if5_south_in; // synchronous IF5 reception
|
||||
ru->fh_south_out = (ru->txfh_in_fep>0) ? NULL : fh_if5_south_out; // synchronous IF5 transmission
|
||||
ru->fh_south_asynch_in = NULL; // no asynchronous UL
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#include "radio/COMMON/common_lib.h"
|
||||
#include "radio/ETHERNET/ethernet_lib.h"
|
||||
|
||||
#include "PHY/if4_tools.h"
|
||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
||||
|
||||
#include "PHY/LTE_TRANSPORT/transport_proto.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)
|
||||
{
|
||||
UNUSED(msg_len);
|
||||
UNUSED_VARIABLE(msg_len);
|
||||
if (pnf_p7->terminate) {
|
||||
// don't send any further P7 messages after terminating
|
||||
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)
|
||||
{
|
||||
UNUSED(p5_idx);
|
||||
UNUSED_VARIABLE(p5_idx);
|
||||
int packed_len =
|
||||
vnf->_public.pack_func(msg, msg_len, vnf->tx_message_buffer, sizeof(vnf->tx_message_buffer), &vnf->_public.codec_config);
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ uint32_t pullarray32(uint8_t **values_to_pull,
|
||||
uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end);
|
||||
|
||||
uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharray16(const uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharray32(const uint32_t *values_to_push,
|
||||
uint32_t max_num_values_to_push,
|
||||
|
||||
@@ -381,7 +381,7 @@ uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t le
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
|
||||
uint32_t pusharray16(const uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
|
||||
{
|
||||
if (len == 0)
|
||||
return 1;
|
||||
|
||||
@@ -1215,17 +1215,6 @@ uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e
|
||||
numTLVs++;
|
||||
}
|
||||
|
||||
// The call to pack the TLV would be the same as any other TLV, it is only packed if the tag is set,
|
||||
// so, it's safe to add the call to pack_nr_tlv even if it is not always set
|
||||
retval &= pack_nr_tlv(NFAPI_NR_FAPI_NUM_BEAMS_PERIOD_VENDOR_EXTENSION_TAG,
|
||||
&(pNfapiMsg->analog_beamforming_ve.num_beams_period_vendor_ext),
|
||||
ppWritePackedMsg,
|
||||
end,
|
||||
&pack_uint8_tlv_value);
|
||||
// only increase if it was set
|
||||
numTLVs += pNfapiMsg->analog_beamforming_ve.num_beams_period_vendor_ext.tl.tag == NFAPI_NR_FAPI_NUM_BEAMS_PERIOD_VENDOR_EXTENSION_TAG;
|
||||
|
||||
|
||||
// The call to pack the TLV would be the same as any other TLV, it is only packed if the tag is set,
|
||||
// so, it's safe to add the call to pack_nr_tlv even if it is not always set
|
||||
retval &= pack_nr_tlv(NFAPI_NR_FAPI_ANALOG_BF_VENDOR_EXTENSION_TAG,
|
||||
@@ -1268,7 +1257,7 @@ static uint8_t unpack_dbt_table_tlv_value(void *tlv, uint8_t **ppReadPackedMsg,
|
||||
}
|
||||
for (int k = 0; k < dbt_config->num_txrus; k++) {
|
||||
nfapi_nr_txru_t *tx_ru = &dig_beam->txru_list[k];
|
||||
if (!(pull16(ppReadPackedMsg, &tx_ru->dig_beam_weight_Re, end) && pull16(ppReadPackedMsg, &tx_ru->dig_beam_weight_Im, end))) {
|
||||
if (!(pull16(ppReadPackedMsg, (uint16_t *)&tx_ru->dig_beam_weight_Re, end) && pull16(ppReadPackedMsg, (uint16_t *)&tx_ru->dig_beam_weight_Im, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1404,15 +1393,10 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
|
||||
{NFAPI_NR_CONFIG_TDD_TABLE, NULL, &unpack_nr_tdd_table_10_04},
|
||||
#endif
|
||||
#endif
|
||||
{NFAPI_NR_FAPI_NUM_BEAMS_PERIOD_VENDOR_EXTENSION_TAG,
|
||||
&(pNfapiMsg->analog_beamforming_ve.num_beams_period_vendor_ext),
|
||||
&unpack_uint8_tlv_value},
|
||||
{NFAPI_NR_FAPI_ANALOG_BF_VENDOR_EXTENSION_TAG,
|
||||
&(pNfapiMsg->analog_beamforming_ve.analog_bf_vendor_ext),
|
||||
&unpack_uint8_tlv_value},
|
||||
{NFAPI_NR_FAPI_SSB_CASE_VENDOR_EXTENSION_TAG,
|
||||
&(pNfapiMsg->ssb_table.case_v3),
|
||||
&unpack_uint8_tlv_value},
|
||||
{NFAPI_NR_FAPI_ANALOG_BF_VENDOR_EXTENSION_TAG,
|
||||
&(pNfapiMsg->analog_beamforming_ve.analog_bf_vendor_ext),
|
||||
&unpack_uint8_tlv_value},
|
||||
{NFAPI_NR_FAPI_SSB_CASE_VENDOR_EXTENSION_TAG, &(pNfapiMsg->ssb_table.case_v3), &unpack_uint8_tlv_value},
|
||||
{NFAPI_NR_CONFIG_RSSI_MEASUREMENT_TAG, &(pNfapiMsg->measurement_config.rssi_measurement), &unpack_uint8_tlv_value},
|
||||
{NFAPI_NR_CONFIG_BEAMFORMING_TABLE_TAG, NULL, &unpack_dbt_table_tlv_value},
|
||||
{NFAPI_NR_CONFIG_PRECODING_TABLE_V6_TAG, NULL, &unpack_pm_table_tlv_value},
|
||||
|
||||
@@ -298,8 +298,6 @@ bool eq_config_request(const nfapi_nr_config_request_scf_t *unpacked_req, const
|
||||
|
||||
EQ_TLV(unpacked_req->nfapi_config.timing_info_period, req->nfapi_config.timing_info_period);
|
||||
|
||||
EQ_TLV(unpacked_req->analog_beamforming_ve.num_beams_period_vendor_ext, req->analog_beamforming_ve.num_beams_period_vendor_ext);
|
||||
|
||||
EQ_TLV(unpacked_req->analog_beamforming_ve.analog_bf_vendor_ext, req->analog_beamforming_ve.analog_bf_vendor_ext);
|
||||
|
||||
return true;
|
||||
@@ -873,8 +871,6 @@ void copy_config_request(const nfapi_nr_config_request_scf_t *src, nfapi_nr_conf
|
||||
|
||||
COPY_TLV(dst->nfapi_config.tx_data_timing_offset, src->nfapi_config.tx_data_timing_offset);
|
||||
|
||||
COPY_TLV(dst->analog_beamforming_ve.num_beams_period_vendor_ext, src->analog_beamforming_ve.num_beams_period_vendor_ext);
|
||||
|
||||
COPY_TLV(dst->analog_beamforming_ve.analog_bf_vendor_ext, src->analog_beamforming_ve.analog_bf_vendor_ext);
|
||||
}
|
||||
|
||||
@@ -1334,7 +1330,6 @@ void dump_config_request(const nfapi_nr_config_request_scf_t *msg)
|
||||
INDENTED_TLV_FORMAT_PRINT("TX_DATA Timing Offset", "%d", nfapi_config->tx_data_timing_offset);
|
||||
/* Beamforming VE */
|
||||
const nfapi_nr_analog_beamforming_ve_t *analog_beamforming_ve = &msg->analog_beamforming_ve;
|
||||
INDENTED_TLV_FORMAT_PRINT("Num Beams per Period", "%d", analog_beamforming_ve->num_beams_period_vendor_ext);
|
||||
INDENTED_TLV_PRINT("Analog Beamforming VE", analog_beamforming_ve->analog_bf_vendor_ext);
|
||||
/* Vendor Extension */
|
||||
if (msg->vendor_extension) {
|
||||
|
||||
@@ -267,6 +267,17 @@ static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePa
|
||||
if(!pack_nr_tx_beamforming_pdu(&value->precodingAndBeamforming,ppWritePackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!push8(value->param_v4.numSpatialStreamIndices, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
if (!pusharray8(value->param_v4.spatialStreamIndices,
|
||||
MAX_NUM_SPATIAL_STREAMS,
|
||||
value->param_v4.numSpatialStreamIndices,
|
||||
ppWritePackedMsg,
|
||||
end))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -306,6 +317,31 @@ static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void *tlv, uint8_t **ppWritePac
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef ENABLE_AERIAL
|
||||
// Spatial steam indices for MU-MIMO
|
||||
const nfapi_v4_pdcch_pdu_parameters_t *p = &value->param_v4;
|
||||
if (!push16(p->numSpatialStreams, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
for (uint_fast16_t i = 0; i < p->numSpatialStreams; i++)
|
||||
if (!(push16(p->dci_spatialStreamMap[i].dci_index, ppWritePackedMsg, end)
|
||||
&& push16(p->dci_spatialStreamMap[i].spatial_stream_index, ppWritePackedMsg, end)))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline uint8_t pack_spatial_stream_indices(const nfapi_nr_spatial_stream_index_t *ss,
|
||||
uint8_t **ppWritePackedMsg,
|
||||
uint8_t *end)
|
||||
{
|
||||
if (!push8(ss->numSpatialStreamIndices, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
if (!pusharray16(ss->spatialStreamIndices, MAX_NUM_SPATIAL_STREAMS, ss->numSpatialStreamIndices, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -368,6 +404,14 @@ static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppWritePac
|
||||
if (!push8(value->maintenance_parms_v3.ldpcBaseGraph, ppWritePackedMsg, end)
|
||||
|| !push32(value->maintenance_parms_v3.tbSizeLbrmBytes, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
// PDSCH parameter in FAPI v4 for MU-MIMO spatial stream indexing
|
||||
if (!push8(value->param_v4.numberCodewords, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
for (uint_fast8_t c = 0; c < value->param_v4.numberCodewords; c++)
|
||||
if (!pack_spatial_stream_indices(value->param_v4.spatialStreamsCw + c, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
@@ -389,6 +433,11 @@ static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppWritePacke
|
||||
if(!pack_nr_tx_beamforming_pdu(&value->precoding_and_beamforming,ppWritePackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!(push8(value->param_v4.spatialStreamIndexPresent, ppWritePackedMsg, end)
|
||||
&& push16(value->param_v4.spatialStreamIndex, ppWritePackedMsg, end)))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -516,6 +565,30 @@ static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void *tlv, uint8_t **ppReadPa
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef ENABLE_AERIAL
|
||||
// Spatial steam indices for MU-MIMO
|
||||
nfapi_v4_pdcch_pdu_parameters_t *p = &value->param_v4;
|
||||
if (!pull16(ppReadPackedMsg, &p->numSpatialStreams, end))
|
||||
return 0;
|
||||
|
||||
for (uint_fast16_t i = 0; i < p->numSpatialStreams; i++) {
|
||||
if (!(pull16(ppReadPackedMsg, &p->dci_spatialStreamMap[i].dci_index, end)
|
||||
&& pull16(ppReadPackedMsg, &p->dci_spatialStreamMap[i].spatial_stream_index, end)))
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline uint8_t unpack_spatial_stream_indices(nfapi_nr_spatial_stream_index_t *ss, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
{
|
||||
if (!pull8(ppReadPackedMsg, &ss->numSpatialStreamIndices, end))
|
||||
return 0;
|
||||
|
||||
if (!pullarray16(ppReadPackedMsg, ss->spatialStreamIndices, MAX_NUM_SPATIAL_STREAMS, ss->numSpatialStreamIndices, end))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -578,6 +651,14 @@ static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppReadPa
|
||||
if (!pull8(ppReadPackedMsg, &value->maintenance_parms_v3.ldpcBaseGraph, end)
|
||||
|| !pull32(ppReadPackedMsg, &value->maintenance_parms_v3.tbSizeLbrmBytes, end))
|
||||
return 0;
|
||||
|
||||
// PDSCH parameter in FAPI v4 for MU-MIMO spatial stream indexing
|
||||
if (!pull8(ppReadPackedMsg, &value->param_v4.numberCodewords, end))
|
||||
return 0;
|
||||
|
||||
for (uint_fast8_t c = 0; c < value->param_v4.numberCodewords; c++)
|
||||
if (!unpack_spatial_stream_indices(value->param_v4.spatialStreamsCw + c, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
@@ -601,6 +682,17 @@ static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadP
|
||||
if(!unpack_nr_tx_beamforming_pdu(&value->precodingAndBeamforming, ppReadPackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!pull8(ppReadPackedMsg, &value->param_v4.numSpatialStreamIndices, end))
|
||||
return 0;
|
||||
|
||||
if (!pullarray8(ppReadPackedMsg,
|
||||
value->param_v4.spatialStreamIndices,
|
||||
MAX_NUM_SPATIAL_STREAMS,
|
||||
value->param_v4.numSpatialStreamIndices,
|
||||
end))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -625,6 +717,11 @@ static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppReadPack
|
||||
if(!unpack_nr_tx_beamforming_pdu(&value->precoding_and_beamforming, ppReadPackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!(pull8(ppReadPackedMsg, &value->param_v4.spatialStreamIndexPresent, end)
|
||||
&& pull16(ppReadPackedMsg, &value->param_v4.spatialStreamIndex, end)))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -724,7 +821,14 @@ static uint8_t pack_ul_tti_request_prach_pdu(const nfapi_nr_prach_pdu_t *prach_p
|
||||
return 0;
|
||||
}
|
||||
|
||||
return pack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppWritePackedMsg, end);
|
||||
if (!pack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
const nfapi_nr_spatial_stream_index_t *p = &prach_pdu->param_v4;
|
||||
if (!pack_spatial_stream_indices(p, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
|
||||
@@ -816,7 +920,8 @@ static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, ui
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!(push8(pusch_pdu->maintenance_parms_v3.ldpcBaseGraph, ppWritePackedMsg, end)
|
||||
&& push32(pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, ppWritePackedMsg, end)))
|
||||
&& push32(pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, ppWritePackedMsg, end)
|
||||
&& pack_spatial_stream_indices(&pusch_pdu->param_v4, ppWritePackedMsg, end)))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
@@ -844,7 +949,15 @@ static uint8_t pack_ul_tti_request_pucch_pdu(const nfapi_nr_pucch_pdu_t *pucch_p
|
||||
return 0;
|
||||
}
|
||||
|
||||
return pack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppWritePackedMsg, end);
|
||||
if (!pack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!pack_spatial_stream_indices(&pucch_pdu->param_v4, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t pack_ul_tti_request_srs_parameters_v4(nfapi_v4_srs_parameters_t *srsParameters,
|
||||
@@ -1049,7 +1162,14 @@ static uint8_t unpack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu,
|
||||
return 0;
|
||||
}
|
||||
|
||||
return unpack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppReadPackedMsg, end);
|
||||
if (!unpack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!unpack_spatial_stream_indices(&prach_pdu->param_v4, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t unpack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
@@ -1138,7 +1258,8 @@ static uint8_t unpack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!(pull8(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.ldpcBaseGraph, end)
|
||||
&& pull32(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, end)))
|
||||
&& pull32(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, end)
|
||||
&& unpack_spatial_stream_indices(&pusch_pdu->param_v4, ppReadPackedMsg, end)))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
@@ -1165,7 +1286,14 @@ static uint8_t unpack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu,
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end))) {
|
||||
return 0;
|
||||
}
|
||||
return unpack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppReadPackedMsg, end);
|
||||
if (!unpack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!unpack_spatial_stream_indices(&pucch_pdu->param_v4, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t unpack_ul_tti_request_srs_parameters_v4(nfapi_v4_srs_parameters_t *srsParameters,
|
||||
|
||||
@@ -983,126 +983,76 @@ static void copy_dl_tti_beamforming(const nfapi_nr_tx_precoding_and_beamforming_
|
||||
}
|
||||
}
|
||||
|
||||
// Macro to get size from start to a member (exclusive)
|
||||
#define SIZE_UPTO(type, member) offsetof(type, member)
|
||||
|
||||
// Macro to get size from start to a member (inclusive)
|
||||
#define SIZE_INCLUDING(type, member) (offsetof(type, member) + sizeof(((type *)0)->member))
|
||||
|
||||
// Macro to copy partial struct
|
||||
#define PARTIAL_COPY(dst, src, type, last_member) memcpy((dst), (src), SIZE_INCLUDING(type, last_member))
|
||||
|
||||
// Macro to copy partial struct
|
||||
#define PARTIAL_COPY_RANGE(dst, src, type, first_member, last_member) \
|
||||
memcpy(((uint8_t *)(dst)) + SIZE_UPTO(type, first_member), \
|
||||
((uint8_t *)(src)) + SIZE_UPTO(type, first_member), \
|
||||
SIZE_INCLUDING(type, last_member) - SIZE_UPTO(type, first_member))
|
||||
|
||||
// Macro to copy array
|
||||
#define COPY_STRUCT_ARRAY(dst, src, data_member, count_member) \
|
||||
do { \
|
||||
size_t _len = (src)->count_member * sizeof((src)->data_member[0]); \
|
||||
if (_len > sizeof((dst)->data_member)) \
|
||||
_len = sizeof((dst)->data_member); \
|
||||
(dst)->count_member = (src)->count_member; \
|
||||
memcpy((dst)->data_member, (src)->data_member, _len); \
|
||||
} while (0)
|
||||
|
||||
static void copy_dl_tti_request_pdcch_pdu(const nfapi_nr_dl_tti_pdcch_pdu_rel15_t *src, nfapi_nr_dl_tti_pdcch_pdu_rel15_t *dst)
|
||||
{
|
||||
dst->BWPSize = src->BWPSize;
|
||||
dst->BWPStart = src->BWPStart;
|
||||
dst->SubcarrierSpacing = src->SubcarrierSpacing;
|
||||
dst->CyclicPrefix = src->CyclicPrefix;
|
||||
dst->StartSymbolIndex = src->StartSymbolIndex;
|
||||
dst->DurationSymbols = src->DurationSymbols;
|
||||
for (int fdr_idx = 0; fdr_idx < 6; ++fdr_idx) {
|
||||
dst->FreqDomainResource[fdr_idx] = src->FreqDomainResource[fdr_idx];
|
||||
}
|
||||
dst->CceRegMappingType = src->CceRegMappingType;
|
||||
dst->RegBundleSize = src->RegBundleSize;
|
||||
dst->InterleaverSize = src->InterleaverSize;
|
||||
dst->CoreSetType = src->CoreSetType;
|
||||
dst->ShiftIndex = src->ShiftIndex;
|
||||
dst->precoderGranularity = src->precoderGranularity;
|
||||
dst->numDlDci = src->numDlDci;
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_dl_tti_pdcch_pdu_rel15_t, numDlDci);
|
||||
size_t partial_size = offsetof(nfapi_nr_dl_tti_pdcch_pdu_rel15_t, dci_pdu);
|
||||
memcpy(dst, src, partial_size);
|
||||
for (int dl_dci = 0; dl_dci < dst->numDlDci; ++dl_dci) {
|
||||
nfapi_nr_dl_dci_pdu_t *dst_dci_pdu = &dst->dci_pdu[dl_dci];
|
||||
const nfapi_nr_dl_dci_pdu_t *src_dci_pdu = &src->dci_pdu[dl_dci];
|
||||
dst_dci_pdu->RNTI = src_dci_pdu->RNTI;
|
||||
dst_dci_pdu->ScramblingId = src_dci_pdu->ScramblingId;
|
||||
dst_dci_pdu->ScramblingRNTI = src_dci_pdu->ScramblingRNTI;
|
||||
dst_dci_pdu->CceIndex = src_dci_pdu->CceIndex;
|
||||
dst_dci_pdu->AggregationLevel = src_dci_pdu->AggregationLevel;
|
||||
PARTIAL_COPY(dst_dci_pdu, src_dci_pdu, nfapi_nr_dl_dci_pdu_t, AggregationLevel);
|
||||
copy_dl_tti_beamforming(&src_dci_pdu->precodingAndBeamforming, &dst_dci_pdu->precodingAndBeamforming);
|
||||
dst_dci_pdu->beta_PDCCH_1_0 = src_dci_pdu->beta_PDCCH_1_0;
|
||||
dst_dci_pdu->powerControlOffsetSS = src_dci_pdu->powerControlOffsetSS;
|
||||
dst_dci_pdu->PayloadSizeBits = src_dci_pdu->PayloadSizeBits;
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
dst_dci_pdu->Payload[i] = src_dci_pdu->Payload[i];
|
||||
}
|
||||
PARTIAL_COPY_RANGE(dst_dci_pdu, src_dci_pdu, nfapi_nr_dl_dci_pdu_t, beta_PDCCH_1_0, Payload);
|
||||
}
|
||||
dst->param_v4.numSpatialStreams = src->param_v4.numSpatialStreams;
|
||||
for (uint_fast16_t i = 0; i < dst->param_v4.numSpatialStreams; i++) {
|
||||
dst->param_v4.dci_spatialStreamMap[i] = src->param_v4.dci_spatialStreamMap[i];
|
||||
}
|
||||
}
|
||||
|
||||
static void copy_dl_tti_request_pdsch_pdu(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *src, nfapi_nr_dl_tti_pdsch_pdu_rel15_t *dst)
|
||||
{
|
||||
dst->pduBitmap = src->pduBitmap;
|
||||
dst->rnti = src->rnti;
|
||||
dst->pduIndex = src->pduIndex;
|
||||
dst->BWPSize = src->BWPSize;
|
||||
dst->BWPStart = src->BWPStart;
|
||||
dst->SubcarrierSpacing = src->SubcarrierSpacing;
|
||||
dst->CyclicPrefix = src->CyclicPrefix;
|
||||
dst->NrOfCodewords = src->NrOfCodewords;
|
||||
for (int cw = 0; cw < dst->NrOfCodewords; ++cw) {
|
||||
dst->targetCodeRate[cw] = src->targetCodeRate[cw];
|
||||
dst->qamModOrder[cw] = src->qamModOrder[cw];
|
||||
dst->mcsIndex[cw] = src->mcsIndex[cw];
|
||||
dst->mcsTable[cw] = src->mcsTable[cw];
|
||||
dst->rvIndex[cw] = src->rvIndex[cw];
|
||||
dst->TBSize[cw] = src->TBSize[cw];
|
||||
}
|
||||
dst->dataScramblingId = src->dataScramblingId;
|
||||
dst->nrOfLayers = src->nrOfLayers;
|
||||
dst->transmissionScheme = src->transmissionScheme;
|
||||
dst->refPoint = src->refPoint;
|
||||
dst->dlDmrsSymbPos = src->dlDmrsSymbPos;
|
||||
dst->dmrsConfigType = src->dmrsConfigType;
|
||||
dst->dlDmrsScramblingId = src->dlDmrsScramblingId;
|
||||
dst->SCID = src->SCID;
|
||||
dst->numDmrsCdmGrpsNoData = src->numDmrsCdmGrpsNoData;
|
||||
dst->dmrsPorts = src->dmrsPorts;
|
||||
dst->resourceAlloc = src->resourceAlloc;
|
||||
for (int i = 0; i < 36; ++i) {
|
||||
dst->rbBitmap[i] = src->rbBitmap[i];
|
||||
}
|
||||
dst->rbStart = src->rbStart;
|
||||
dst->rbSize = src->rbSize;
|
||||
dst->VRBtoPRBMapping = src->VRBtoPRBMapping;
|
||||
dst->StartSymbolIndex = src->StartSymbolIndex;
|
||||
dst->NrOfSymbols = src->NrOfSymbols;
|
||||
dst->PTRSPortIndex = src->PTRSPortIndex;
|
||||
dst->PTRSTimeDensity = src->PTRSTimeDensity;
|
||||
dst->PTRSFreqDensity = src->PTRSFreqDensity;
|
||||
dst->PTRSReOffset = src->PTRSReOffset;
|
||||
dst->nEpreRatioOfPDSCHToPTRS = src->nEpreRatioOfPDSCHToPTRS;
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_dl_tti_pdsch_pdu_rel15_t, nEpreRatioOfPDSCHToPTRS);
|
||||
copy_dl_tti_beamforming(&src->precodingAndBeamforming, &dst->precodingAndBeamforming);
|
||||
dst->powerControlOffset = src->powerControlOffset;
|
||||
dst->powerControlOffsetSS = src->powerControlOffsetSS;
|
||||
dst->isLastCbPresent = src->isLastCbPresent;
|
||||
dst->isInlineTbCrc = src->isInlineTbCrc;
|
||||
dst->dlTbCrc = src->dlTbCrc;
|
||||
dst->maintenance_parms_v3.ldpcBaseGraph = src->maintenance_parms_v3.ldpcBaseGraph;
|
||||
dst->maintenance_parms_v3.tbSizeLbrmBytes = src->maintenance_parms_v3.tbSizeLbrmBytes;
|
||||
PARTIAL_COPY_RANGE(dst, src, nfapi_nr_dl_tti_pdsch_pdu_rel15_t, powerControlOffset, maintenance_parms_v3);
|
||||
dst->param_v4.numberCodewords = src->param_v4.numberCodewords;
|
||||
for (uint_fast8_t i = 0; i < dst->param_v4.numberCodewords; i++) {
|
||||
const nfapi_nr_spatial_stream_index_t *s = src->param_v4.spatialStreamsCw + i;
|
||||
nfapi_nr_spatial_stream_index_t *d = dst->param_v4.spatialStreamsCw + i;
|
||||
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
|
||||
}
|
||||
}
|
||||
|
||||
static void copy_dl_tti_request_csi_rs_pdu(const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *src, nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *dst)
|
||||
{
|
||||
dst->bwp_size = src->bwp_size;
|
||||
dst->bwp_start = src->bwp_start;
|
||||
dst->subcarrier_spacing = src->subcarrier_spacing;
|
||||
dst->cyclic_prefix = src->cyclic_prefix;
|
||||
dst->start_rb = src->start_rb;
|
||||
dst->nr_of_rbs = src->nr_of_rbs;
|
||||
dst->csi_type = src->csi_type;
|
||||
dst->row = src->row;
|
||||
dst->freq_domain = src->freq_domain;
|
||||
dst->symb_l0 = src->symb_l0;
|
||||
dst->symb_l1 = src->symb_l1;
|
||||
dst->cdm_type = src->cdm_type;
|
||||
dst->freq_density = src->freq_density;
|
||||
dst->scramb_id = src->scramb_id;
|
||||
dst->power_control_offset = src->power_control_offset;
|
||||
dst->power_control_offset_ss = src->power_control_offset_ss;
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_dl_tti_csi_rs_pdu_rel15_t, power_control_offset_ss);
|
||||
copy_dl_tti_beamforming(&src->precodingAndBeamforming, &dst->precodingAndBeamforming);
|
||||
const struct nfapi_nr_csi_spatial_stream_index *s = &src->param_v4;
|
||||
struct nfapi_nr_csi_spatial_stream_index *d = &dst->param_v4;
|
||||
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
|
||||
}
|
||||
|
||||
static void copy_dl_tti_request_ssb_pdu(const nfapi_nr_dl_tti_ssb_pdu_rel15_t *src, nfapi_nr_dl_tti_ssb_pdu_rel15_t *dst)
|
||||
{
|
||||
dst->PhysCellId = src->PhysCellId;
|
||||
dst->BetaPss = src->BetaPss;
|
||||
dst->SsbBlockIndex = src->SsbBlockIndex;
|
||||
dst->SsbSubcarrierOffset = src->SsbSubcarrierOffset;
|
||||
dst->ssbOffsetPointA = src->ssbOffsetPointA;
|
||||
dst->bchPayloadFlag = src->bchPayloadFlag;
|
||||
dst->bchPayload = src->bchPayload;
|
||||
dst->ssbRsrp = src->ssbRsrp;
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_dl_tti_ssb_pdu_rel15_t, ssbRsrp);
|
||||
copy_dl_tti_beamforming(&src->precoding_and_beamforming, &dst->precoding_and_beamforming);
|
||||
dst->param_v4 = src->param_v4;
|
||||
}
|
||||
|
||||
static void copy_dl_tti_request_pdu(const nfapi_nr_dl_tti_request_pdu_t *src, nfapi_nr_dl_tti_request_pdu_t *dst)
|
||||
@@ -1175,73 +1125,25 @@ static void copy_ul_tti_beamforming(const nfapi_nr_ul_beamforming_t *src, nfapi_
|
||||
|
||||
static void copy_ul_tti_request_prach_pdu(const nfapi_nr_prach_pdu_t *src, nfapi_nr_prach_pdu_t *dst)
|
||||
{
|
||||
dst->phys_cell_id = src->phys_cell_id;
|
||||
dst->num_prach_ocas = src->num_prach_ocas;
|
||||
dst->prach_format = src->prach_format;
|
||||
dst->num_ra = src->num_ra;
|
||||
dst->prach_start_symbol = src->prach_start_symbol;
|
||||
dst->num_cs = src->num_cs;
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_prach_pdu_t, num_cs);
|
||||
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
|
||||
const nfapi_nr_spatial_stream_index_t *s = &src->param_v4;
|
||||
nfapi_nr_spatial_stream_index_t *d = &dst->param_v4;
|
||||
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
|
||||
}
|
||||
|
||||
static void copy_ul_tti_request_pusch_pdu(const nfapi_nr_pusch_pdu_t *src, nfapi_nr_pusch_pdu_t *dst)
|
||||
{
|
||||
dst->pdu_bit_map = src->pdu_bit_map;
|
||||
dst->rnti = src->rnti;
|
||||
dst->handle = src->handle;
|
||||
dst->bwp_size = src->bwp_size;
|
||||
dst->bwp_start = src->bwp_start;
|
||||
dst->subcarrier_spacing = src->subcarrier_spacing;
|
||||
dst->cyclic_prefix = src->cyclic_prefix;
|
||||
dst->target_code_rate = src->target_code_rate;
|
||||
dst->qam_mod_order = src->qam_mod_order;
|
||||
dst->mcs_index = src->mcs_index;
|
||||
dst->mcs_table = src->mcs_table;
|
||||
dst->transform_precoding = src->transform_precoding;
|
||||
dst->data_scrambling_id = src->data_scrambling_id;
|
||||
dst->nrOfLayers = src->nrOfLayers;
|
||||
dst->ul_dmrs_symb_pos = src->ul_dmrs_symb_pos;
|
||||
dst->dmrs_config_type = src->dmrs_config_type;
|
||||
dst->ul_dmrs_scrambling_id = src->ul_dmrs_scrambling_id;
|
||||
dst->pusch_identity = src->pusch_identity;
|
||||
dst->scid = src->scid;
|
||||
dst->num_dmrs_cdm_grps_no_data = src->num_dmrs_cdm_grps_no_data;
|
||||
dst->dmrs_ports = src->dmrs_ports;
|
||||
dst->resource_alloc = src->resource_alloc;
|
||||
for (int i = 0; i < 36; ++i) {
|
||||
dst->rb_bitmap[i] = src->rb_bitmap[i];
|
||||
}
|
||||
dst->rb_start = src->rb_start;
|
||||
dst->rb_size = src->rb_size;
|
||||
dst->vrb_to_prb_mapping = src->vrb_to_prb_mapping;
|
||||
dst->frequency_hopping = src->frequency_hopping;
|
||||
dst->tx_direct_current_location = src->tx_direct_current_location;
|
||||
dst->uplink_frequency_shift_7p5khz = src->uplink_frequency_shift_7p5khz;
|
||||
dst->start_symbol_index = src->start_symbol_index;
|
||||
dst->nr_of_symbols = src->nr_of_symbols;
|
||||
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_pusch_pdu_t, nr_of_symbols);
|
||||
if (dst->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_DATA) {
|
||||
const nfapi_nr_pusch_data_t *src_pusch_data = &src->pusch_data;
|
||||
nfapi_nr_pusch_data_t *dst_pusch_data = &dst->pusch_data;
|
||||
dst_pusch_data->rv_index = src_pusch_data->rv_index;
|
||||
dst_pusch_data->harq_process_id = src_pusch_data->harq_process_id;
|
||||
dst_pusch_data->new_data_indicator = src_pusch_data->new_data_indicator;
|
||||
dst_pusch_data->tb_size = src_pusch_data->tb_size;
|
||||
dst_pusch_data->num_cb = src_pusch_data->num_cb;
|
||||
for (int i = 0; i < (src_pusch_data->num_cb + 7) / 8; ++i) {
|
||||
dst_pusch_data->cb_present_and_position[i] = src_pusch_data->cb_present_and_position[i];
|
||||
}
|
||||
*dst_pusch_data = *src_pusch_data;
|
||||
}
|
||||
if (src->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_UCI) {
|
||||
const nfapi_nr_pusch_uci_t *src_pusch_uci = &src->pusch_uci;
|
||||
nfapi_nr_pusch_uci_t *dst_pusch_uci = &dst->pusch_uci;
|
||||
dst_pusch_uci->harq_ack_bit_length = src_pusch_uci->harq_ack_bit_length;
|
||||
dst_pusch_uci->csi_part1_bit_length = src_pusch_uci->csi_part1_bit_length;
|
||||
dst_pusch_uci->csi_part2_bit_length = src_pusch_uci->csi_part2_bit_length;
|
||||
dst_pusch_uci->alpha_scaling = src_pusch_uci->alpha_scaling;
|
||||
dst_pusch_uci->beta_offset_harq_ack = src_pusch_uci->beta_offset_harq_ack;
|
||||
dst_pusch_uci->beta_offset_csi1 = src_pusch_uci->beta_offset_csi1;
|
||||
dst_pusch_uci->beta_offset_csi2 = src_pusch_uci->beta_offset_csi2;
|
||||
*dst_pusch_uci = *src_pusch_uci;
|
||||
}
|
||||
if (src->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
|
||||
const nfapi_nr_pusch_ptrs_t *src_pusch_ptrs = &src->pusch_ptrs;
|
||||
@@ -1252,10 +1154,7 @@ static void copy_ul_tti_request_pusch_pdu(const nfapi_nr_pusch_pdu_t *src, nfapi
|
||||
for (int i = 0; i < src_pusch_ptrs->num_ptrs_ports; ++i) {
|
||||
const nfapi_nr_ptrs_ports_t *src_ptrs_port = &src_pusch_ptrs->ptrs_ports_list[i];
|
||||
nfapi_nr_ptrs_ports_t *dst_ptrs_port = &dst_pusch_ptrs->ptrs_ports_list[i];
|
||||
|
||||
dst_ptrs_port->ptrs_port_index = src_ptrs_port->ptrs_port_index;
|
||||
dst_ptrs_port->ptrs_dmrs_port = src_ptrs_port->ptrs_dmrs_port;
|
||||
dst_ptrs_port->ptrs_re_offset = src_ptrs_port->ptrs_re_offset;
|
||||
*dst_ptrs_port = *src_ptrs_port;
|
||||
}
|
||||
|
||||
dst_pusch_ptrs->ptrs_time_density = src_pusch_ptrs->ptrs_time_density;
|
||||
@@ -1265,50 +1164,23 @@ static void copy_ul_tti_request_pusch_pdu(const nfapi_nr_pusch_pdu_t *src, nfapi
|
||||
if (src->pdu_bit_map & PUSCH_PDU_BITMAP_DFTS_OFDM) {
|
||||
const nfapi_nr_dfts_ofdm_t *src_dfts_ofdm = &src->dfts_ofdm;
|
||||
nfapi_nr_dfts_ofdm_t *dst_dfts_ofdm = &dst->dfts_ofdm;
|
||||
|
||||
dst_dfts_ofdm->low_papr_group_number = src_dfts_ofdm->low_papr_group_number;
|
||||
dst_dfts_ofdm->low_papr_sequence_number = src_dfts_ofdm->low_papr_sequence_number;
|
||||
dst_dfts_ofdm->ul_ptrs_sample_density = src_dfts_ofdm->ul_ptrs_sample_density;
|
||||
dst_dfts_ofdm->ul_ptrs_time_density_transform_precoding = src_dfts_ofdm->ul_ptrs_time_density_transform_precoding;
|
||||
*dst_dfts_ofdm = *src_dfts_ofdm;
|
||||
}
|
||||
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
|
||||
dst->maintenance_parms_v3.ldpcBaseGraph = src->maintenance_parms_v3.ldpcBaseGraph;
|
||||
dst->maintenance_parms_v3.tbSizeLbrmBytes = src->maintenance_parms_v3.tbSizeLbrmBytes;
|
||||
const nfapi_nr_spatial_stream_index_t *s = &src->param_v4;
|
||||
nfapi_nr_spatial_stream_index_t *d = &dst->param_v4;
|
||||
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
|
||||
}
|
||||
|
||||
static void copy_ul_tti_request_pucch_pdu(const nfapi_nr_pucch_pdu_t *src, nfapi_nr_pucch_pdu_t *dst)
|
||||
{
|
||||
dst->rnti = src->rnti;
|
||||
dst->handle = src->handle;
|
||||
dst->bwp_size = src->bwp_size;
|
||||
dst->bwp_start = src->bwp_start;
|
||||
dst->subcarrier_spacing = src->subcarrier_spacing;
|
||||
dst->cyclic_prefix = src->cyclic_prefix;
|
||||
dst->format_type = src->format_type;
|
||||
dst->multi_slot_tx_indicator = src->multi_slot_tx_indicator;
|
||||
dst->pi_2bpsk = src->pi_2bpsk;
|
||||
dst->prb_start = src->prb_start;
|
||||
dst->prb_size = src->prb_size;
|
||||
dst->start_symbol_index = src->start_symbol_index;
|
||||
dst->nr_of_symbols = src->nr_of_symbols;
|
||||
dst->freq_hop_flag = src->freq_hop_flag;
|
||||
dst->second_hop_prb = src->second_hop_prb;
|
||||
dst->group_hop_flag = src->group_hop_flag;
|
||||
dst->sequence_hop_flag = src->sequence_hop_flag;
|
||||
dst->hopping_id = src->hopping_id;
|
||||
dst->initial_cyclic_shift = src->initial_cyclic_shift;
|
||||
dst->data_scrambling_id = src->data_scrambling_id;
|
||||
dst->time_domain_occ_idx = src->time_domain_occ_idx;
|
||||
dst->pre_dft_occ_idx = src->pre_dft_occ_idx;
|
||||
dst->pre_dft_occ_len = src->pre_dft_occ_len;
|
||||
dst->add_dmrs_flag = src->add_dmrs_flag;
|
||||
dst->dmrs_scrambling_id = src->dmrs_scrambling_id;
|
||||
dst->dmrs_cyclic_shift = src->dmrs_cyclic_shift;
|
||||
dst->sr_flag = src->sr_flag;
|
||||
dst->bit_len_harq = src->bit_len_harq;
|
||||
dst->bit_len_csi_part1 = src->bit_len_csi_part1;
|
||||
dst->bit_len_csi_part2 = src->bit_len_csi_part2;
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_pucch_pdu_t, bit_len_csi_part2);
|
||||
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
|
||||
const nfapi_nr_spatial_stream_index_t *s = &src->param_v4;
|
||||
nfapi_nr_spatial_stream_index_t *d = &dst->param_v4;
|
||||
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
|
||||
}
|
||||
|
||||
static void copy_ul_tti_request_srs_parameters(const nfapi_v4_srs_parameters_t *src,
|
||||
@@ -1316,24 +1188,20 @@ static void copy_ul_tti_request_srs_parameters(const nfapi_v4_srs_parameters_t *
|
||||
nfapi_v4_srs_parameters_t *dst)
|
||||
{
|
||||
dst->srs_bandwidth_size = src->srs_bandwidth_size;
|
||||
for (int symbol_idx = 0; symbol_idx < num_symbols; ++symbol_idx) {
|
||||
nfapi_v4_srs_parameters_symbols_t *dst_symbol = &dst->symbol_list[symbol_idx];
|
||||
const nfapi_v4_srs_parameters_symbols_t *src_symbol = &src->symbol_list[symbol_idx];
|
||||
dst_symbol->srs_bandwidth_start = src_symbol->srs_bandwidth_start;
|
||||
dst_symbol->sequence_group = src_symbol->sequence_group;
|
||||
dst_symbol->sequence_number = src_symbol->sequence_number;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_AERIAL
|
||||
// For Aerial, we always process the 4 reported symbols, not only the ones indicated by num_symbols
|
||||
for (int symbol_idx = num_symbols; symbol_idx < 4; ++symbol_idx) {
|
||||
const uint8_t symbols_to_fill = 4;
|
||||
(void)num_symbols; // To supress unused warning
|
||||
#else
|
||||
const uint8_t symbols_to_fill = num_symbols;
|
||||
#endif // ENABLE_AERIAL
|
||||
for (uint_fast8_t symbol_idx = 0; symbol_idx < symbols_to_fill; ++symbol_idx) {
|
||||
nfapi_v4_srs_parameters_symbols_t *dst_symbol = &dst->symbol_list[symbol_idx];
|
||||
const nfapi_v4_srs_parameters_symbols_t *src_symbol = &src->symbol_list[symbol_idx];
|
||||
dst_symbol->srs_bandwidth_start = src_symbol->srs_bandwidth_start;
|
||||
dst_symbol->sequence_group = src_symbol->sequence_group;
|
||||
dst_symbol->sequence_number = src_symbol->sequence_number;
|
||||
}
|
||||
#endif // ENABLE_AERIAL
|
||||
dst->usage = src->usage;
|
||||
const uint8_t nUsage = __builtin_popcount(dst->usage);
|
||||
for (int idx = 0; idx < nUsage; ++idx) {
|
||||
@@ -1346,37 +1214,12 @@ static void copy_ul_tti_request_srs_parameters(const nfapi_v4_srs_parameters_t *
|
||||
dst->ue_antennas_in_this_srs_resource_set = src->ue_antennas_in_this_srs_resource_set;
|
||||
dst->sampled_ue_antennas = src->sampled_ue_antennas;
|
||||
dst->report_scope = src->report_scope;
|
||||
dst->num_ul_spatial_streams_ports = src->num_ul_spatial_streams_ports;
|
||||
for (int idx = 0; idx < dst->num_ul_spatial_streams_ports; ++idx) {
|
||||
dst->Ul_spatial_stream_ports[idx] = src->Ul_spatial_stream_ports[idx];
|
||||
}
|
||||
COPY_STRUCT_ARRAY(dst, src, Ul_spatial_stream_ports, num_ul_spatial_streams_ports);
|
||||
}
|
||||
|
||||
static void copy_ul_tti_request_srs_pdu(const nfapi_nr_srs_pdu_t *src, nfapi_nr_srs_pdu_t *dst)
|
||||
{
|
||||
dst->rnti = src->rnti;
|
||||
dst->handle = src->handle;
|
||||
dst->bwp_size = src->bwp_size;
|
||||
dst->bwp_start = src->bwp_start;
|
||||
dst->subcarrier_spacing = src->subcarrier_spacing;
|
||||
dst->cyclic_prefix = src->cyclic_prefix;
|
||||
dst->num_ant_ports = src->num_ant_ports;
|
||||
dst->num_symbols = src->num_symbols;
|
||||
dst->num_repetitions = src->num_repetitions;
|
||||
dst->time_start_position = src->time_start_position;
|
||||
dst->config_index = src->config_index;
|
||||
dst->sequence_id = src->sequence_id;
|
||||
dst->bandwidth_index = src->bandwidth_index;
|
||||
dst->comb_size = src->comb_size;
|
||||
dst->comb_offset = src->comb_offset;
|
||||
dst->cyclic_shift = src->cyclic_shift;
|
||||
dst->frequency_position = src->frequency_position;
|
||||
dst->frequency_shift = src->frequency_shift;
|
||||
dst->frequency_hopping = src->frequency_hopping;
|
||||
dst->group_or_sequence_hopping = src->group_or_sequence_hopping;
|
||||
dst->resource_type = src->resource_type;
|
||||
dst->t_srs = src->t_srs;
|
||||
dst->t_offset = src->t_offset;
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_srs_pdu_t, t_offset);
|
||||
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
|
||||
copy_ul_tti_request_srs_parameters(&src->srs_parameters_v4, 1 << src->num_symbols, &dst->srs_parameters_v4);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#define NFAPI_NR_NFAPI_TIMING_WINDOW_TAG 0x011E
|
||||
#define NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG 0x011F
|
||||
#define NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG 0x0120
|
||||
#define NFAPI_NR_FAPI_NUM_BEAMS_PERIOD_VENDOR_EXTENSION_TAG 0xA000
|
||||
#define NFAPI_NR_FAPI_ANALOG_BF_VENDOR_EXTENSION_TAG 0xA001
|
||||
#define NFAPI_NR_FAPI_SSB_CASE_VENDOR_EXTENSION_TAG 0xA002
|
||||
|
||||
|
||||
@@ -473,17 +473,17 @@ typedef struct
|
||||
//table 3-32
|
||||
|
||||
typedef struct {
|
||||
uint16_t dig_beam_weight_Re;
|
||||
uint16_t dig_beam_weight_Im;
|
||||
int16_t dig_beam_weight_Re;
|
||||
int16_t dig_beam_weight_Im;
|
||||
} nfapi_nr_txru_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t beam_idx; //0~65535
|
||||
uint16_t beam_idx; //0~32767
|
||||
nfapi_nr_txru_t *txru_list;
|
||||
} nfapi_nr_dig_beam_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t num_dig_beams; //0~65535
|
||||
uint16_t num_dig_beams; //0~32767
|
||||
uint16_t num_txrus; //0~65535
|
||||
nfapi_nr_dig_beam_t *dig_beam_list;
|
||||
} nfapi_nr_dbt_pdu_t;
|
||||
@@ -515,7 +515,6 @@ typedef struct {
|
||||
} nfapi_nr_pm_tlv_ve_t;
|
||||
|
||||
typedef struct {
|
||||
nfapi_uint8_tlv_t num_beams_period_vendor_ext;
|
||||
nfapi_uint8_tlv_t analog_bf_vendor_ext;
|
||||
} nfapi_nr_analog_beamforming_ve_t;
|
||||
|
||||
@@ -859,6 +858,21 @@ typedef struct {
|
||||
|
||||
} nfapi_nr_dl_dci_pdu_t;
|
||||
|
||||
// The maximum number of spatial streams to be mapped depends on TLV 0x16E and
|
||||
// the number of streams could be same as number of layers or number of antenna
|
||||
// ports or number of baseband ports. Hence we set this to be the maximum number
|
||||
// of baseband ports
|
||||
#define MAX_NUM_SPATIAL_STREAMS 16
|
||||
|
||||
typedef struct {
|
||||
uint16_t dci_index;
|
||||
uint16_t spatial_stream_index;
|
||||
} nfapi_v4_dci_spatial_stream_index_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t numSpatialStreams;
|
||||
nfapi_v4_dci_spatial_stream_index_t dci_spatialStreamMap[MAX_NUM_SPATIAL_STREAMS];
|
||||
} nfapi_v4_pdcch_pdu_parameters_t;
|
||||
|
||||
typedef struct {
|
||||
///Bandwidth part size [TS38.213 sec12]. Number of contiguous PRBs allocated to the BWP,Value: 1->275
|
||||
@@ -891,13 +905,32 @@ typedef struct {
|
||||
uint16_t numDlDci;
|
||||
///DL DCI PDU
|
||||
nfapi_nr_dl_dci_pdu_t dci_pdu[MAX_DCI_CORESET];
|
||||
} nfapi_nr_dl_tti_pdcch_pdu_rel15_t;
|
||||
/// Spatial stream indexing for MU-MIMO
|
||||
nfapi_v4_pdcch_pdu_parameters_t param_v4;
|
||||
} nfapi_nr_dl_tti_pdcch_pdu_rel15_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t ldpcBaseGraph;
|
||||
uint32_t tbSizeLbrmBytes;
|
||||
}nfapi_v3_pdsch_maintenance_parameters_t;
|
||||
|
||||
typedef struct {
|
||||
/// Number of spatial streams used in the index array
|
||||
uint8_t numSpatialStreamIndices;
|
||||
/// Spatial stream index array
|
||||
uint16_t spatialStreamIndices[MAX_NUM_SPATIAL_STREAMS];
|
||||
} nfapi_nr_spatial_stream_index_t;
|
||||
|
||||
#define MAX_NUM_CODEWORDS 2
|
||||
|
||||
typedef struct {
|
||||
// MU-MIMO support in FAPIv4
|
||||
/// Number of codewords with spatial stream indices
|
||||
uint8_t numberCodewords;
|
||||
/// Spatial stream indexing for codeworeds
|
||||
nfapi_nr_spatial_stream_index_t spatialStreamsCw[MAX_NUM_CODEWORDS];
|
||||
} nfapi_v4_pdsch_parameters_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t pduBitmap;
|
||||
uint16_t rnti;
|
||||
@@ -990,8 +1023,9 @@ typedef struct {
|
||||
uint32_t dlTbCrc;
|
||||
|
||||
nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3;
|
||||
}nfapi_nr_dl_tti_pdsch_pdu_rel15_t;
|
||||
|
||||
/// PDSCH parameters FAPI v4. used only for spatial stream indexing in MU-MIMO
|
||||
nfapi_v4_pdsch_parameters_t param_v4;
|
||||
} nfapi_nr_dl_tti_pdsch_pdu_rel15_t;
|
||||
|
||||
//for pdsch_pdu:
|
||||
/*
|
||||
@@ -1075,9 +1109,15 @@ typedef struct
|
||||
uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS
|
||||
uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS
|
||||
nfapi_nr_tx_precoding_and_beamforming_t precodingAndBeamforming;
|
||||
/// Spatial stream indexing for MU-MIMO
|
||||
struct nfapi_nr_csi_spatial_stream_index {
|
||||
/// Number of spatial streams used in the index array
|
||||
uint8_t numSpatialStreamIndices;
|
||||
/// Spatial stream index array
|
||||
uint8_t spatialStreamIndices[MAX_NUM_SPATIAL_STREAMS];
|
||||
} param_v4;
|
||||
} nfapi_nr_dl_tti_csi_rs_pdu_rel15_t;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t bch_payload;//BCH payload. The valid bits are indicated in the PARAM/CONFIG TLVs. If PARAM/CONFIG TLVs indicate MAC generates full bchPayload then the payload length is 31 bits with the 8 LSB bits being. Otherwise timing PBCH bits are generated by the PHY. And for bchPayload the 24 LSB are used.
|
||||
@@ -1118,6 +1158,11 @@ typedef struct {
|
||||
/// A value indicating the channel quality between the gNB and nrUE. Value: 0->255 dBM
|
||||
uint8_t ssbRsrp;
|
||||
nfapi_nr_tx_precoding_and_beamforming_t precoding_and_beamforming;
|
||||
/// Spatial stream indexing
|
||||
struct nfapi_v4_ssb_param {
|
||||
uint8_t spatialStreamIndexPresent;
|
||||
uint16_t spatialStreamIndex;
|
||||
} param_v4;
|
||||
} nfapi_nr_dl_tti_ssb_pdu_rel15_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -1285,7 +1330,7 @@ typedef struct
|
||||
uint8_t prach_start_symbol;
|
||||
uint16_t num_cs;
|
||||
nfapi_nr_ul_beamforming_t beamforming;
|
||||
|
||||
nfapi_nr_spatial_stream_index_t param_v4;
|
||||
} nfapi_nr_prach_pdu_t;
|
||||
|
||||
//for pusch_pdu:
|
||||
@@ -1398,6 +1443,8 @@ typedef struct
|
||||
//beamforming
|
||||
nfapi_nr_ul_beamforming_t beamforming;
|
||||
nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3;
|
||||
// Spatial stream indexing for MU-MIMO
|
||||
nfapi_nr_spatial_stream_index_t param_v4;
|
||||
} nfapi_nr_pusch_pdu_t;
|
||||
|
||||
//for pucch_pdu:
|
||||
@@ -1443,7 +1490,7 @@ typedef struct
|
||||
uint16_t bit_len_csi_part2;
|
||||
|
||||
nfapi_nr_ul_beamforming_t beamforming;
|
||||
|
||||
nfapi_nr_spatial_stream_index_t param_v4;
|
||||
} nfapi_nr_pucch_pdu_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -276,13 +276,7 @@ static void fill_config_request_tlv_tdd_rand(nfapi_nr_config_request_scf_t *nfap
|
||||
nfapi_resp->num_tlv++;
|
||||
/*
|
||||
// TODO: Uncomment this block when ready to enable the pack of the following VE TLVs in nr_fapi_p5.c
|
||||
// NFAPI_NR_FAPI_NUM_BEAMS_PERIOD_VENDOR_EXTENSION_TAG
|
||||
// NFAPI_NR_FAPI_ANALOG_BF_VENDOR_EXTENSION_TAG
|
||||
FILL_TLV(nfapi_resp->analog_beamforming_ve.num_beams_period_vendor_ext,
|
||||
NFAPI_NR_FAPI_NUM_BEAMS_PERIOD_VENDOR_EXTENSION_TAG,
|
||||
rand8());
|
||||
nfapi_resp->num_tlv++;
|
||||
|
||||
FILL_TLV(nfapi_resp->analog_beamforming_ve.analog_bf_vendor_ext, NFAPI_NR_FAPI_ANALOG_BF_VENDOR_EXTENSION_TAG, rand8());
|
||||
nfapi_resp->num_tlv++;
|
||||
*/
|
||||
|
||||
20
nfapi/tests/p7/nr_fapi_common_util_test.h
Normal file
20
nfapi/tests/p7/nr_fapi_common_util_test.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
||||
*/
|
||||
#ifndef OPENAIRINTERFACE_NR_FAPI_COMMON_UTIL_TEST_H
|
||||
#define OPENAIRINTERFACE_NR_FAPI_COMMON_UTIL_TEST_H
|
||||
#include "nfapi/tests/nr_fapi_test.h"
|
||||
|
||||
static uint8_t get_num_spatial_streams(void)
|
||||
{
|
||||
const uint16_t max_logical_ant_ports = MAX_NUM_SPATIAL_STREAMS;
|
||||
return rand8_range(0, max_logical_ant_ports);
|
||||
}
|
||||
|
||||
static void fill_spatial_streams(const uint8_t num_s, uint16_t s[MAX_NUM_SPATIAL_STREAMS])
|
||||
{
|
||||
for (int n = 0; n < num_s; n++)
|
||||
s[n] = rand16_range(0, num_s - 1);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "dci_payload_utils.h"
|
||||
#include "nr_fapi_p7.h"
|
||||
#include "nr_fapi_p7_utils.h"
|
||||
#include "nr_fapi_common_util_test.h"
|
||||
|
||||
static void fill_dl_tti_request_beamforming(nfapi_nr_tx_precoding_and_beamforming_t *precodingAndBeamforming)
|
||||
{
|
||||
@@ -48,6 +49,11 @@ static void fill_dl_tti_request_pdcch_pdu(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdu
|
||||
pdu->dci_pdu[dl_dci].PayloadSizeBits = rand16_range(0, DCI_PAYLOAD_BYTE_LEN * 8);
|
||||
generate_payload(pdu->dci_pdu[dl_dci].PayloadSizeBits, pdu->dci_pdu[dl_dci].Payload);
|
||||
}
|
||||
pdu->param_v4.numSpatialStreams = get_num_spatial_streams();
|
||||
for (int n = 0; n < pdu->param_v4.numSpatialStreams; n++) {
|
||||
pdu->param_v4.dci_spatialStreamMap[n].dci_index = rand16();
|
||||
pdu->param_v4.dci_spatialStreamMap[n].spatial_stream_index = rand16_range(0, pdu->param_v4.numSpatialStreams - 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void fill_dl_tti_request_pdsch_pdu(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdu)
|
||||
@@ -109,6 +115,12 @@ static void fill_dl_tti_request_pdsch_pdu(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdu
|
||||
}
|
||||
pdu->maintenance_parms_v3.ldpcBaseGraph = rand8();
|
||||
pdu->maintenance_parms_v3.tbSizeLbrmBytes = rand32();
|
||||
pdu->param_v4.numberCodewords = rand8_range(0, MAX_NUM_CODEWORDS);
|
||||
for (int c = 0; c < pdu->param_v4.numberCodewords; c++) {
|
||||
pdu->param_v4.spatialStreamsCw[c].numSpatialStreamIndices = get_num_spatial_streams();
|
||||
fill_spatial_streams(pdu->param_v4.spatialStreamsCw[c].numSpatialStreamIndices,
|
||||
pdu->param_v4.spatialStreamsCw[c].spatialStreamIndices);
|
||||
}
|
||||
}
|
||||
|
||||
static void fill_dl_tti_request_csi_rs_pdu(nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *pdu)
|
||||
@@ -147,6 +159,9 @@ static void fill_dl_tti_request_csi_rs_pdu(nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *p
|
||||
pdu->power_control_offset = rand8_range(0, 23);
|
||||
pdu->power_control_offset_ss = rand8_range(0, 3);
|
||||
fill_dl_tti_request_beamforming(&pdu->precodingAndBeamforming);
|
||||
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
|
||||
for (int n = 0; n < pdu->param_v4.numSpatialStreamIndices; n++)
|
||||
pdu->param_v4.spatialStreamIndices[n] = rand8_range(0, pdu->param_v4.numSpatialStreamIndices - 1);
|
||||
}
|
||||
|
||||
static void fill_dl_tti_request_ssb_pdu(nfapi_nr_dl_tti_ssb_pdu_rel15_t *pdu)
|
||||
@@ -159,6 +174,8 @@ static void fill_dl_tti_request_ssb_pdu(nfapi_nr_dl_tti_ssb_pdu_rel15_t *pdu)
|
||||
pdu->bchPayloadFlag = rand8_range(0, 2);
|
||||
pdu->bchPayload = rand24();
|
||||
fill_dl_tti_request_beamforming(&pdu->precoding_and_beamforming);
|
||||
pdu->param_v4.spatialStreamIndexPresent = rand8(0, 1);
|
||||
pdu->param_v4.spatialStreamIndex = rand16_range(0, MAX_NUM_SPATIAL_STREAMS);
|
||||
}
|
||||
|
||||
static void fill_dl_tti_request(nfapi_nr_dl_tti_request_t *msg)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "dci_payload_utils.h"
|
||||
#include "nr_fapi_p7.h"
|
||||
#include "nr_fapi_p7_utils.h"
|
||||
#include "nr_fapi_common_util_test.h"
|
||||
|
||||
static void fill_ul_tti_request_beamforming(nfapi_nr_ul_beamforming_t *beamforming_pdu)
|
||||
{
|
||||
@@ -28,6 +29,8 @@ static void fill_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *pdu)
|
||||
pdu->prach_start_symbol = rand8_range(0, 13);
|
||||
pdu->num_cs = rand16_range(0, 419);
|
||||
fill_ul_tti_request_beamforming(&pdu->beamforming);
|
||||
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
|
||||
fill_spatial_streams(pdu->param_v4.numSpatialStreamIndices, pdu->param_v4.spatialStreamIndices);
|
||||
}
|
||||
|
||||
static void fill_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pdu)
|
||||
@@ -133,6 +136,8 @@ static void fill_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pdu)
|
||||
fill_ul_tti_request_beamforming(&pdu->beamforming);
|
||||
pdu->maintenance_parms_v3.ldpcBaseGraph = rand8();
|
||||
pdu->maintenance_parms_v3.tbSizeLbrmBytes = rand32();
|
||||
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
|
||||
fill_spatial_streams(pdu->param_v4.numSpatialStreamIndices, pdu->param_v4.spatialStreamIndices);
|
||||
}
|
||||
|
||||
static void fill_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pdu)
|
||||
@@ -247,6 +252,8 @@ static void fill_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pdu)
|
||||
}
|
||||
|
||||
fill_ul_tti_request_beamforming(&pdu->beamforming);
|
||||
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
|
||||
fill_spatial_streams(pdu->param_v4.numSpatialStreamIndices, pdu->param_v4.spatialStreamIndices);
|
||||
}
|
||||
|
||||
static void fill_ul_tti_request_srs_parameters(nfapi_v4_srs_parameters_t *params, const uint8_t num_symbols){
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
|
||||
#include <string.h>
|
||||
#include "nfapi/open-nFAPI/fapi/inc/nr_fapi_p5_utils.h"
|
||||
#include "PHY/phy_digital_beamforming.h"
|
||||
|
||||
static void init_DLSCH_struct(PHY_VARS_gNB *gNB);
|
||||
static void destroy_DLSCH_struct(const PHY_VARS_gNB *gNB);
|
||||
@@ -50,8 +51,6 @@ int l1_north_init_gNB()
|
||||
|
||||
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;
|
||||
int first_free = -1;
|
||||
for (int i = 0; i < MAX_MOBILES_PER_GNB; i++) {
|
||||
@@ -90,15 +89,7 @@ void phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
// shortcuts
|
||||
NR_DL_FRAME_PARMS *const fp = &gNB->frame_parms;
|
||||
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
|
||||
NR_gNB_COMMON *const common_vars = &gNB->common_vars;
|
||||
common_vars->analog_bf = cfg->analog_beamforming_ve.analog_bf_vendor_ext.value;
|
||||
LOG_I(PHY, "L1 configured with%s analog beamforming\n", common_vars->analog_bf ? "" : "out");
|
||||
if (common_vars->analog_bf) {
|
||||
// True only if nrmac->beam_info.beam_mode == FAPI_ANALOG_BEAM, thus analog_beamforming=2
|
||||
common_vars->num_beams_period = cfg->analog_beamforming_ve.num_beams_period_vendor_ext.value;
|
||||
LOG_I(PHY, "Max number of concurrent beams: %d\n", common_vars->num_beams_period);
|
||||
} else
|
||||
common_vars->num_beams_period = 1;
|
||||
NR_gNB_COMMON *const common_vars = &gNB->common_vars;
|
||||
|
||||
int Ptx = cfg->carrier_config.num_tx_ant.value;
|
||||
int Prx = cfg->carrier_config.num_rx_ant.value;
|
||||
@@ -143,30 +134,31 @@ void phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
|
||||
init_DLSCH_struct(gNB);
|
||||
|
||||
/* Do NOT allocate per-antenna rxdataF: the gNB gets a pointer to the
|
||||
* RU to copy/recover freq-domain memory from there */
|
||||
common_vars->rxdataF = (c16_t ***)malloc16(common_vars->num_beams_period * sizeof(c16_t**));
|
||||
for (int i = 0; i < common_vars->num_beams_period; i++)
|
||||
common_vars->rxdataF[i] = (c16_t **)malloc16(Prx * sizeof(c16_t*));
|
||||
|
||||
if (cfg->analog_beamforming_ve.analog_bf_vendor_ext.value) {
|
||||
common_vars->beam_id = (int **)malloc16(common_vars->num_beams_period * sizeof(int*));
|
||||
for (int i = 0; i < common_vars->num_beams_period; i++) {
|
||||
common_vars->beam_id[i] = (int*)malloc16(fp->symbols_per_slot * fp->slots_per_frame * sizeof(int));
|
||||
memset(common_vars->beam_id[i], -1, fp->symbols_per_slot * fp->slots_per_frame * sizeof(int));
|
||||
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));
|
||||
}
|
||||
}
|
||||
common_vars->txdataF = (c16_t ***)malloc16(common_vars->num_beams_period * sizeof(c16_t**));
|
||||
for (int i = 0; i < common_vars->num_beams_period; i++) {
|
||||
common_vars->txdataF[i] = (c16_t**)malloc16_clear(Ptx * sizeof(c16_t*));
|
||||
for (int j = 0; j < Ptx; j++)
|
||||
common_vars->txdataF[i][j] = (c16_t*)malloc16_clear(fp->samples_per_slot_wCP * sizeof(c16_t));
|
||||
}
|
||||
common_vars->debugBuff = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t)*100);
|
||||
common_vars->debugBuff_sample_offset = 0;
|
||||
|
||||
/* Do NOT allocate per-antenna rxdataF: the gNB gets a pointer to the
|
||||
* RU to copy/recover freq-domain memory from there */
|
||||
common_vars->rxdataF = malloc16_clear(Prx * sizeof(*common_vars->rxdataF));
|
||||
|
||||
// This buffer holds signal after beamforming
|
||||
common_vars->rxdataF_BF = malloc16(Prx * sizeof(*common_vars->rxdataF_BF));
|
||||
for (int j = 0; j < Prx; j++)
|
||||
common_vars->rxdataF_BF[j] = (c16_t *)malloc16_clear(fp->samples_per_slot_wCP * sizeof(**common_vars->rxdataF_BF));
|
||||
|
||||
common_vars->tx_grid_info = calloc(Ptx, sizeof(*common_vars->tx_grid_info));
|
||||
for (int j = 0; j < Ptx; j++)
|
||||
common_vars->tx_grid_info[j].dataF = (c16_t*)malloc16_clear(fp->samples_per_slot_wCP * sizeof(c16_t));
|
||||
|
||||
// PRACH
|
||||
init_nr_prach(gNB);
|
||||
init_prach_list(&gNB->prach_list);
|
||||
|
||||
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;
|
||||
@@ -196,41 +188,44 @@ void phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
|
||||
void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
{
|
||||
const int Ptx = gNB->gNB_config.carrier_config.num_tx_ant.value;
|
||||
const int Prx = gNB->gNB_config.carrier_config.num_rx_ant.value;
|
||||
const int Ptx = gNB->gNB_config.carrier_config.num_tx_ant.value;
|
||||
const int max_ul_mimo_layers = 4; // taken from phy_init_nr_gNB()
|
||||
const int n_buf = Prx * max_ul_mimo_layers;
|
||||
|
||||
PHY_MEASUREMENTS_gNB *meas = &gNB->measurements;
|
||||
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_gnb_lowpapr_sequences();
|
||||
|
||||
reset_nr_transport(gNB);
|
||||
reset_nr_prach(gNB);
|
||||
|
||||
destroy_DLSCH_struct(gNB);
|
||||
|
||||
NR_gNB_COMMON * common_vars = &gNB->common_vars;
|
||||
for (int j = 0; j < common_vars->num_beams_period; j++) {
|
||||
if (common_vars->beam_id)
|
||||
free_and_zero(common_vars->beam_id[j]);
|
||||
for (int i = 0; i < Ptx; i++) {
|
||||
free_and_zero(common_vars->txdataF[j][i]);
|
||||
}
|
||||
free_and_zero(common_vars->txdataF[j]);
|
||||
for (int i = 0; i < Ptx; i++) {
|
||||
free_and_zero(common_vars->tx_grid_info[i].dataF);
|
||||
}
|
||||
free_and_zero(common_vars->tx_grid_info);
|
||||
|
||||
/* Do NOT free per-antenna txdataF/rxdataF: the gNB gets a pointer to the
|
||||
* RU's txdataF/rxdataF, and the RU will free that */
|
||||
for (int j = 0; j < common_vars->num_beams_period; j++)
|
||||
free_and_zero(common_vars->rxdataF[j]);
|
||||
free_and_zero(common_vars->txdataF);
|
||||
free_and_zero(common_vars->rxdataF);
|
||||
free_and_zero(common_vars->beam_id);
|
||||
|
||||
free_and_zero(common_vars->debugBuff);
|
||||
for (int i = 0; i < Prx;i++){
|
||||
free_and_zero(common_vars->rxdataF_BF[i]);
|
||||
}
|
||||
free_and_zero(common_vars->rxdataF_BF);
|
||||
|
||||
for (int ULSCH_id = 0; ULSCH_id < gNB->max_nb_pusch; ULSCH_id++) {
|
||||
NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ULSCH_id];
|
||||
@@ -249,7 +244,6 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
free(gNB->pusch_vars);
|
||||
|
||||
free_nrLDPC_coding_interface(&gNB->nrLDPC_coding_interface);
|
||||
|
||||
}
|
||||
|
||||
void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
|
||||
@@ -421,14 +415,18 @@ void init_nr_transport(PHY_VARS_gNB *gNB)
|
||||
else
|
||||
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_srs = buffer_ul_slots ? buffer_ul_slots << 1 : 1; // assuming at most 2 SRS per slot
|
||||
|
||||
int max_nb_pucch = buffer_ul_slots ? MAX_MOBILES_PER_GNB * buffer_ul_slots : 1;
|
||||
gNB->pucch_queue = spsc_q_alloc(max_nb_pucch, sizeof(NR_gNB_PUCCH_job_t));
|
||||
gNB->pusch_queue = spsc_q_alloc(gNB->max_nb_pusch, sizeof(NR_gNB_PUSCH_job_t));
|
||||
gNB->pucch = (NR_gNB_PUCCH_t *)malloc16(gNB->max_nb_pucch * sizeof(NR_gNB_PUCCH_t));
|
||||
for (int i = 0; i < gNB->max_nb_pucch; i++) {
|
||||
memset(&gNB->pucch[i], 0, sizeof(gNB->pucch[i]));
|
||||
}
|
||||
|
||||
int max_nb_srs = buffer_ul_slots ? buffer_ul_slots << 1 : 1; // assuming at most 2 SRS per slot
|
||||
gNB->srs_queue = spsc_q_alloc(max_nb_srs, sizeof(NR_gNB_SRS_job_t));
|
||||
gNB->srs = (NR_gNB_SRS_t *)malloc16(gNB->max_nb_srs * sizeof(NR_gNB_SRS_t));
|
||||
for (int i = 0; i < gNB->max_nb_srs; i++)
|
||||
gNB->srs[i].active = 0;
|
||||
|
||||
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++) {
|
||||
@@ -445,9 +443,8 @@ void reset_nr_transport(PHY_VARS_gNB *gNB)
|
||||
{
|
||||
const NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||
|
||||
spsc_q_free(&gNB->pucch_queue);
|
||||
spsc_q_free(&gNB->pusch_queue);
|
||||
spsc_q_free(&gNB->srs_queue);
|
||||
free(gNB->pucch);
|
||||
free(gNB->srs);
|
||||
|
||||
for (int i = 0; i < gNB->max_nb_pusch; i++)
|
||||
free_gNB_ulsch(&gNB->ulsch[i], fp->N_RB_UL);
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
*/
|
||||
|
||||
#include "PHY/phy_extern.h"
|
||||
#include "SCHED/sched_common.h"
|
||||
#include "assertions.h"
|
||||
#include <math.h>
|
||||
#include "openair1/PHY/defs_RU.h"
|
||||
@@ -15,31 +16,15 @@ void nr_phy_init_RU(RU_t *ru)
|
||||
|
||||
LOG_D(PHY, "Initializing RU signal buffers (if_south %s) nb_tx %d, nb_rx %d\n", ru_if_types[ru->if_south], ru->nb_tx, ru->nb_rx);
|
||||
|
||||
ru->num_beams_period = 1;
|
||||
if (ru->num_gNB > 0) {
|
||||
nfapi_nr_config_request_scf_t *cfg = &ru->config;
|
||||
ru->nb_log_antennas = 0;
|
||||
for (int n = 0; n < ru->num_gNB; n++) {
|
||||
if (cfg->carrier_config.num_tx_ant.value > ru->nb_log_antennas)
|
||||
ru->nb_log_antennas = cfg->carrier_config.num_tx_ant.value;
|
||||
}
|
||||
nfapi_nr_analog_beamforming_ve_t *analog_config = &cfg->analog_beamforming_ve;
|
||||
ru->num_beams_period = analog_config->analog_bf_vendor_ext.value ? analog_config->num_beams_period_vendor_ext.value : 1;
|
||||
}
|
||||
else ru->nb_log_antennas = ru->nb_tx;
|
||||
|
||||
// copy configuration from gNB[0] in to RU, assume that all gNB instances sharing RU use the same configuration
|
||||
// (at least the parts that are needed by the RU, numerology and PRACH)
|
||||
|
||||
AssertFatal(ru->nb_log_antennas > 0 && ru->nb_log_antennas < 13, "ru->nb_log_antennas %d ! \n",ru->nb_log_antennas);
|
||||
int nb_tx_streams = ru->nb_tx * ru->num_beams_period;
|
||||
int nb_rx_streams = ru->nb_rx * ru->num_beams_period;
|
||||
LOG_I(NR_PHY, "nb_tx_streams %d, nb_rx_streams %d, num_Beams_period %d\n", nb_tx_streams, nb_rx_streams, ru->num_beams_period);
|
||||
ru->common.beam_id = malloc16_clear(ru->num_beams_period * sizeof(int*));
|
||||
for(int i = 0; i < ru->num_beams_period; i++) {
|
||||
ru->common.beam_id[i] = malloc16(fp->symbols_per_slot * fp->slots_per_frame * sizeof(int));
|
||||
memset(ru->common.beam_id[i], -1, fp->symbols_per_slot * fp->slots_per_frame * sizeof(int));
|
||||
}
|
||||
int nb_tx_streams = ru->nb_tx;
|
||||
int nb_rx_streams = ru->nb_rx;
|
||||
|
||||
AssertFatal(!((nb_tx_streams > fp->nb_antennas_tx) || (nb_rx_streams > fp->nb_antennas_rx)),
|
||||
"Current implementation only supports number of logical ports same as number of baseband ports. Increase N1, N2, Xp "
|
||||
"to match nb_tx, nb_rx in RU\n");
|
||||
|
||||
if (ru->if_south <= REMOTE_IF5) { // this means REMOTE_IF5 or LOCAL_RF, so allocate memory for time-domain signals
|
||||
// Time-domain signals
|
||||
@@ -107,8 +92,8 @@ void nr_phy_init_RU(RU_t *ru)
|
||||
void nr_phy_free_RU(RU_t *ru)
|
||||
{
|
||||
LOG_D(PHY, "Freeing RU signal buffers (if_south %s) nb_tx %d\n", ru_if_types[ru->if_south], ru->nb_tx);
|
||||
int nb_tx_streams = ru->nb_tx * ru->num_beams_period;
|
||||
int nb_rx_streams = ru->nb_rx * ru->num_beams_period;
|
||||
int nb_tx_streams = ru->nb_tx;
|
||||
int nb_rx_streams = ru->nb_rx;
|
||||
|
||||
if (ru->if_south <= REMOTE_IF5) { // this means REMOTE_IF5 or LOCAL_RF, so free memory for time-domain signals
|
||||
// Hack: undo what is done at allocation
|
||||
@@ -143,9 +128,6 @@ void nr_phy_free_RU(RU_t *ru)
|
||||
free_and_zero(ru->common.rxdataF[i]);
|
||||
free_and_zero(ru->common.rxdataF);
|
||||
|
||||
for(int i = 0; i < ru->num_beams_period; ++i)
|
||||
free_and_zero(ru->common.beam_id[i]);
|
||||
free_and_zero(ru->common.beam_id);
|
||||
}
|
||||
|
||||
PHY_VARS_gNB *gNB0 = ru->gNB_list[0];
|
||||
|
||||
@@ -251,6 +251,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
||||
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));
|
||||
}
|
||||
|
||||
ue->nr_srs_info = malloc16_clear(sizeof(nr_srs_info_t));
|
||||
}
|
||||
|
||||
ue->init_averaging = 1;
|
||||
@@ -299,6 +301,8 @@ 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);
|
||||
|
||||
free_and_zero(ue->nr_srs_info);
|
||||
|
||||
free_and_zero(ue->prach_vars[gNB_id]);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
//#include "PHY/defs_eNB.h"
|
||||
#include "PHY/defs_RU.h"
|
||||
#include "PHY/TOOLS/alaw_lut.h"
|
||||
//#include "PHY/phy_extern.h"
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
#ifndef __IF4_TOOLS_H__
|
||||
#define __IF4_TOOLS_H__
|
||||
#include "openair1/PHY/defs_RU.h"
|
||||
#include "PHY/defs_eNB.h"
|
||||
|
||||
/// Macro for IF4 packet type
|
||||
#define IF4p5_PACKET_TYPE 0x080A
|
||||
@@ -7,7 +7,9 @@
|
||||
*/
|
||||
#include "PHY/sse_intrin.h"
|
||||
#include "PHY/defs_eNB.h"
|
||||
#include "PHY/if4_tools.h"
|
||||
//#include "PHY/phy_extern.h"
|
||||
//#include "prach.h"
|
||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
||||
|
||||
#include "SCHED/sched_eNB.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user