tmp
This commit is contained in:
+61
-61
@@ -301,7 +301,7 @@ add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace" ON)
|
||||
|
||||
set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
|
||||
add_library(ITTI ${OCP_ITTI}/intertask_interface.cpp)
|
||||
target_link_libraries(ITTI PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(ITTI PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
# asn1c skeletons have hardcoded this flag to make customized debug logs
|
||||
# OAI uses this feature to re-use OAI LOG_I(ASN, ...)
|
||||
@@ -318,14 +318,14 @@ endif()
|
||||
add_library(lte_rrc
|
||||
${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1_msg.c
|
||||
${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c)
|
||||
target_link_libraries(lte_rrc PUBLIC asn1_lte_rrc)
|
||||
target_link_libraries(lte_rrc PUBLIC asn1_lte_rrc asn1_ngap)
|
||||
target_link_libraries(lte_rrc PRIVATE nr_rrc)
|
||||
|
||||
|
||||
#NR RRC
|
||||
#######
|
||||
add_library(nr_rrc ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1_msg.c)
|
||||
target_link_libraries(nr_rrc PUBLIC asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nr_rrc PUBLIC asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
|
||||
# S1AP
|
||||
@@ -415,7 +415,7 @@ add_library(m3ap
|
||||
${M3AP_DIR}/m3ap_ids.c
|
||||
${M3AP_DIR}/m3ap_timers.c
|
||||
)
|
||||
target_link_libraries(m3ap PUBLIC asn1_m3ap)
|
||||
target_link_libraries(m3ap PUBLIC asn1_m3ap asn1_ngap)
|
||||
target_link_libraries(m3ap PRIVATE m2ap)
|
||||
target_link_libraries(m3ap PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_include_directories(m3ap PUBLIC "${M3AP_DIR}")
|
||||
@@ -783,7 +783,7 @@ add_library(UTIL
|
||||
${OPENAIR_DIR}/common/utils/time_meas.c
|
||||
${OPENAIR_DIR}/common/utils/time_stat.c
|
||||
)
|
||||
target_link_libraries(UTIL PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(UTIL PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
set(SECU_OSA_SRC
|
||||
${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c
|
||||
@@ -822,7 +822,7 @@ set(SCHED_SRC
|
||||
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c
|
||||
)
|
||||
add_library(SCHED_LIB ${SCHED_SRC})
|
||||
target_link_libraries(SCHED_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(SCHED_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
set(SCHED_NR_SRC
|
||||
${OPENAIR1_DIR}/SCHED_NR/fapi_nr_l1.c
|
||||
@@ -831,7 +831,7 @@ set(SCHED_NR_SRC
|
||||
${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 asn1_lte_rrc)
|
||||
target_link_libraries(SCHED_NR_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
set(SCHED_SRC_RU
|
||||
${OPENAIR1_DIR}/SCHED/ru_procedures.c
|
||||
@@ -839,7 +839,7 @@ set(SCHED_SRC_RU
|
||||
${OPENAIR1_DIR}/SCHED/prach_procedures.c
|
||||
)
|
||||
add_library(SCHED_RU_LIB ${SCHED_SRC_RU})
|
||||
target_link_libraries(SCHED_RU_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(SCHED_RU_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
set(SCHED_SRC_UE
|
||||
${OPENAIR1_DIR}/SCHED_UE/phy_procedures_lte_ue.c
|
||||
@@ -849,7 +849,7 @@ set(SCHED_SRC_UE
|
||||
${OPENAIR1_DIR}/SCHED_UE/srs_pc.c
|
||||
)
|
||||
add_library(SCHED_UE_LIB ${SCHED_SRC_UE})
|
||||
target_link_libraries(SCHED_UE_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(SCHED_UE_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
set(SCHED_SRC_NR_UE
|
||||
${OPENAIR1_DIR}/SCHED_NR_UE/phy_procedures_nr_ue.c
|
||||
@@ -859,7 +859,7 @@ set(SCHED_SRC_NR_UE
|
||||
${OPENAIR1_DIR}/SCHED_NR_UE/pucch_uci_ue_nr.c
|
||||
)
|
||||
add_library(SCHED_NR_UE_LIB ${SCHED_SRC_NR_UE})
|
||||
target_link_libraries(SCHED_NR_UE_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(SCHED_NR_UE_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
|
||||
# nFAPI
|
||||
@@ -889,7 +889,7 @@ set(NFAPI_PNF_SRC
|
||||
${NFAPI_DIR}/pnf/src/pnf_p7_interface.c
|
||||
)
|
||||
add_library(NFAPI_PNF_LIB ${NFAPI_PNF_SRC})
|
||||
target_link_libraries(NFAPI_PNF_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(NFAPI_PNF_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
include_directories(${NFAPI_DIR}/pnf/public_inc)
|
||||
include_directories(${NFAPI_DIR}/pnf/inc)
|
||||
@@ -901,7 +901,7 @@ set(NFAPI_VNF_SRC
|
||||
${NFAPI_DIR}/vnf/src/vnf_p7_interface.c
|
||||
)
|
||||
add_library(NFAPI_VNF_LIB ${NFAPI_VNF_SRC})
|
||||
target_link_libraries(NFAPI_VNF_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(NFAPI_VNF_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
include_directories(${NFAPI_DIR}/vnf/public_inc)
|
||||
include_directories(${NFAPI_DIR}/vnf/inc)
|
||||
@@ -915,7 +915,7 @@ set(NFAPI_USER_SRC
|
||||
${NFAPI_USER_DIR}/gnb_ind_vars.c
|
||||
)
|
||||
add_library(NFAPI_USER_LIB ${NFAPI_USER_SRC})
|
||||
target_link_libraries(NFAPI_USER_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(NFAPI_USER_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
include_directories(${NFAPI_USER_DIR})
|
||||
|
||||
# Layer 1
|
||||
@@ -1017,7 +1017,7 @@ add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} )
|
||||
target_link_libraries(ldpc PRIVATE ldpc_gen_HEADERS)
|
||||
|
||||
add_library(coding MODULE ${PHY_TURBOSRC} )
|
||||
target_link_libraries(coding PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(coding PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c )
|
||||
|
||||
@@ -1276,25 +1276,25 @@ set(PHY_NR_UE_SRC ${PHY_NR_UE_SRC} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_ll
|
||||
add_library(PHY_COMMON ${PHY_SRC_COMMON})
|
||||
target_link_libraries(PHY_COMMON PRIVATE lte_rrc)
|
||||
add_dependencies(PHY_COMMON dfts)
|
||||
target_link_libraries(PHY_COMMON PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(PHY_COMMON PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(PHY ${PHY_SRC})
|
||||
target_link_libraries(PHY PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(PHY PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(PHY_UE ${PHY_SRC_UE})
|
||||
target_link_libraries(PHY_UE PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(PHY_UE PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(PHY_NR_COMMON ${PHY_NR_SRC_COMMON})
|
||||
target_link_libraries(PHY_NR_COMMON PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(PHY_NR_COMMON PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(PHY_NR ${PHY_NR_SRC})
|
||||
target_link_libraries(PHY_NR PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(PHY_NR PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(PHY_NR_UE ${PHY_NR_UE_SRC})
|
||||
target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(PHY_RU ${PHY_SRC_RU})
|
||||
target_link_libraries(PHY_RU PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(PHY_RU PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
#Library for mex functions
|
||||
#########################3
|
||||
@@ -1559,14 +1559,14 @@ set (MISC_NFAPI_LTE
|
||||
)
|
||||
|
||||
add_library(MISC_NFAPI_LTE_LIB ${MISC_NFAPI_LTE})
|
||||
target_link_libraries(MISC_NFAPI_LTE_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(MISC_NFAPI_LTE_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
set (MISC_NFAPI_NR
|
||||
${OPENAIR1_DIR}/SCHED/nfapi_nr_dummy.c
|
||||
)
|
||||
|
||||
add_library(MISC_NFAPI_NR_LIB ${MISC_NFAPI_NR})
|
||||
target_link_libraries(MISC_NFAPI_NR_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(MISC_NFAPI_NR_LIB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(L2
|
||||
${L2_SRC}
|
||||
@@ -1575,16 +1575,16 @@ add_library(L2
|
||||
${MCE_APP_SRC}
|
||||
)
|
||||
target_link_libraries(L2 PRIVATE x2ap s1ap lte_rrc m2ap)
|
||||
target_link_libraries(L2 PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(L2 PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(MAC_NR ${MAC_NR_SRC})
|
||||
target_link_libraries(MAC_NR PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(MAC_NR PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(MAC_UE_NR ${MAC_NR_SRC_UE})
|
||||
target_link_libraries(MAC_UE_NR PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(MAC_UE_NR PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(L2_LTE ${L2_LTE_SRC})
|
||||
target_link_libraries(L2_LTE PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(L2_LTE PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(L2_NR
|
||||
${L2_NR_SRC}
|
||||
@@ -1597,13 +1597,13 @@ add_library(e1_if
|
||||
${NR_RRC_DIR}/cucp_cuup_e1ap.c
|
||||
)
|
||||
|
||||
target_link_libraries(e1_if PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_f1ap e1ap GTPV1U)
|
||||
target_link_libraries(e1_if PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_f1ap e1ap GTPV1U asn1_ngap)
|
||||
|
||||
add_library(e1_pdcp_if
|
||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_e1_api.c
|
||||
)
|
||||
|
||||
target_link_libraries(e1_pdcp_if PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(e1_pdcp_if PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
target_link_libraries(L2_NR PRIVATE f1ap x2ap s1ap ngap nr_rrc e1ap)
|
||||
|
||||
@@ -1614,19 +1614,19 @@ add_library(L2_LTE_NR
|
||||
${MCE_APP_SRC}
|
||||
)
|
||||
|
||||
target_link_libraries(L2_LTE_NR PRIVATE f1ap s1ap nr_rrc)
|
||||
target_link_libraries(L2_LTE_NR PRIVATE f1ap s1ap nr_rrc asn1_ngap)
|
||||
|
||||
add_library(L2_UE
|
||||
${L2_SRC_UE}
|
||||
${MAC_SRC_UE}
|
||||
)
|
||||
target_link_libraries(L2_UE PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(L2_UE PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(L2_UE_LTE_NR
|
||||
${L2_RRC_SRC_UE}
|
||||
${MAC_SRC_UE}
|
||||
)
|
||||
target_link_libraries(L2_UE_LTE_NR PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(L2_UE_LTE_NR PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
if (NOT ${NOS1})
|
||||
target_compile_definitions(L2_UE PUBLIC -DPDCP_USE_NETLINK)
|
||||
@@ -1636,13 +1636,13 @@ target_link_libraries(L2_UE PRIVATE lte_rrc)
|
||||
|
||||
add_library( NR_L2_UE ${NR_L2_SRC_UE} ${MAC_NR_SRC_UE} )
|
||||
target_link_libraries(NR_L2_UE PRIVATE f1ap)
|
||||
target_link_libraries(NR_L2_UE PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(NR_L2_UE PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(MAC_NR_COMMON
|
||||
${OPENAIR2_DIR}/LAYER2/NR_MAC_COMMON/nr_mac_common.c
|
||||
${OPENAIR2_DIR}/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c
|
||||
)
|
||||
target_link_libraries(MAC_NR_COMMON PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(MAC_NR_COMMON PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
include_directories("${OPENAIR2_DIR}/NR_UE_PHY_INTERFACE")
|
||||
include_directories("${OPENAIR2_DIR}/LAYER2")
|
||||
@@ -1660,7 +1660,7 @@ add_library (GTPV1U
|
||||
${RRC_DIR}/rrc_eNB_GTPV1U.c
|
||||
${OPENAIR3_DIR}/ocp-gtpu/gtp_itf.cpp
|
||||
)
|
||||
target_link_libraries(GTPV1U PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(GTPV1U PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
target_link_libraries(GTPV1U PRIVATE SIMU)
|
||||
include_directories(${OPENAIR3_DIR}/ocp-gtp)
|
||||
|
||||
@@ -1670,7 +1670,7 @@ set (MME_APP_SRC
|
||||
)
|
||||
add_library(MME_APP ${MME_APP_SRC})
|
||||
target_link_libraries(MME_APP PRIVATE m2ap m3ap)
|
||||
target_link_libraries(MME_APP PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(MME_APP PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
set(SCTP_SRC
|
||||
${OPENAIR3_DIR}/SCTP/sctp_common.c
|
||||
@@ -1678,7 +1678,7 @@ set(SCTP_SRC
|
||||
${OPENAIR3_DIR}/SCTP/sctp_eNB_itti_messaging.c
|
||||
)
|
||||
add_library(SCTP_CLIENT ${SCTP_SRC})
|
||||
target_link_libraries(SCTP_CLIENT PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(SCTP_CLIENT PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
set(NAS_SRC ${OPENAIR3_DIR}/NAS/)
|
||||
set(libnas_api_OBJS
|
||||
@@ -1960,7 +1960,7 @@ target_link_libraries(LIB_NAS_SIMUE PRIVATE lte_rrc)
|
||||
|
||||
|
||||
set(NAS_SIM_LIB LIB_NAS_SIMUE)
|
||||
target_link_libraries(LIB_NAS_SIMUE PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(LIB_NAS_SIMUE PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(LIB_NAS_UE
|
||||
${NAS_SRC}UE/nas_itti_messaging.c
|
||||
@@ -1983,7 +1983,7 @@ add_library(LIB_NAS_UE
|
||||
target_include_directories(LIB_NAS_UE PRIVATE ${OPENAIR_DIR}/common/utils/ds/)
|
||||
target_link_libraries(LIB_NAS_UE PRIVATE lte_rrc)
|
||||
set(NAS_UE_LIB LIB_NAS_UE)
|
||||
target_link_libraries(LIB_NAS_UE PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(LIB_NAS_UE PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
include_directories(${NAS_SRC}NR_UE)
|
||||
include_directories(${NAS_SRC}UE)
|
||||
@@ -2015,7 +2015,7 @@ add_library(LIB_5GNAS_GNB
|
||||
|
||||
target_include_directories(LIB_5GNAS_GNB PRIVATE ${OPENAIR_DIR}/common/utils/ds/)
|
||||
target_link_libraries(LIB_5GNAS_GNB PRIVATE SECU_CN ${CRYPTO_LIBRARIES})
|
||||
target_link_libraries(LIB_5GNAS_GNB PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(LIB_5GNAS_GNB PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
# Simulation library
|
||||
##########################
|
||||
@@ -2034,7 +2034,7 @@ set (SIMUSRC
|
||||
)
|
||||
add_library(SIMU STATIC ${SIMUSRC} )
|
||||
target_include_directories(SIMU PUBLIC ${OPENAIR1_DIR}/SIMULATION/TOOLS ${OPENAIR1_DIR}/SIMULATION/RF)
|
||||
target_link_libraries(SIMU PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(SIMU PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
# Qt-based scope
|
||||
add_boolean_option(ENABLE_NRQTSCOPE OFF "Build the Qt-Scope" OFF)
|
||||
@@ -2046,7 +2046,7 @@ if (ENABLE_NRQTSCOPE)
|
||||
qt5_wrap_cpp(QTSCOPE_SOURCE_NR ${OPENAIR1_DIR}/PHY/TOOLS/nr_phy_qt_scope.h)
|
||||
add_library(nrqtscope MODULE ${QTSCOPE_SOURCE_NR})
|
||||
target_link_libraries(nrqtscope PRIVATE Qt5::Widgets Qt5::Charts)
|
||||
target_link_libraries(nrqtscope PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nrqtscope PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
endif()
|
||||
|
||||
add_library(SIMU_ETH
|
||||
@@ -2073,7 +2073,7 @@ add_library(rfsimulator MODULE
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c
|
||||
)
|
||||
target_link_libraries(rfsimulator PRIVATE SIMU ${ATLAS_LIBRARIES})
|
||||
target_link_libraries(rfsimulator PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(rfsimulator PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_library(oai_iqplayer MODULE
|
||||
${OPENAIR_DIR}/radio/iqplayer/iqplayer_lib.c
|
||||
@@ -2189,7 +2189,7 @@ target_link_libraries(lte-softmodem PRIVATE
|
||||
target_link_libraries(lte-softmodem PRIVATE ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries(lte-softmodem PRIVATE pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp)
|
||||
target_link_libraries(lte-softmodem PRIVATE ${T_LIB})
|
||||
target_link_libraries(lte-softmodem PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(lte-softmodem PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
|
||||
add_executable(oairu
|
||||
@@ -2211,7 +2211,7 @@ target_link_libraries(oairu PRIVATE
|
||||
-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 asn1_lte_rrc)
|
||||
target_link_libraries(oairu PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
# force the generation of ASN.1 so that we don't need to wait during the build
|
||||
target_link_libraries(lte-softmodem PRIVATE
|
||||
@@ -2255,7 +2255,7 @@ target_link_libraries(lte-uesoftmodem PRIVATE
|
||||
target_link_libraries(lte-uesoftmodem PRIVATE ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries(lte-uesoftmodem PRIVATE pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${ATLAS_LIBRARIES})
|
||||
target_link_libraries(lte-uesoftmodem PRIVATE ${T_LIB})
|
||||
target_link_libraries(lte-uesoftmodem PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(lte-uesoftmodem PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
# force the generation of ASN.1 so that we don't need to wait during the build
|
||||
target_link_libraries(lte-uesoftmodem PRIVATE
|
||||
@@ -2298,7 +2298,7 @@ target_link_libraries(nr-softmodem PRIVATE
|
||||
target_link_libraries(nr-softmodem PRIVATE ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries(nr-softmodem PRIVATE pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${ATLAS_LIBRARIES})
|
||||
target_link_libraries(nr-softmodem PRIVATE ${T_LIB})
|
||||
target_link_libraries(nr-softmodem PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nr-softmodem PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_dependencies(nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc)
|
||||
|
||||
@@ -2327,7 +2327,7 @@ target_link_libraries(nr-cuup PRIVATE
|
||||
CONFIG_LIB ITTI SCTP_CLIENT
|
||||
GTPV1U e1ap e1_pdcp_if f1ap
|
||||
SECU_OSA SECU_CN ${OPENSSL_LIBRARIES} crypt z sctp dl pthread)
|
||||
target_link_libraries(nr-cuup PRIVATE asn1_lte_rrc asn1_nr_rrc)
|
||||
target_link_libraries(nr-cuup PRIVATE asn1_lte_rrc asn1_nr_rrc asn1_ngap)
|
||||
|
||||
# nr-uesoftmodem is UE implementation
|
||||
#######################################
|
||||
@@ -2363,7 +2363,7 @@ target_link_libraries(nr-uesoftmodem PRIVATE
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${ATLAS_LIBRARIES})
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE ${T_LIB})
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nr-uesoftmodem PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_dependencies( nr-uesoftmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
|
||||
if (ENABLE_LDPC_CUDA)
|
||||
@@ -2402,7 +2402,7 @@ add_executable(rftest
|
||||
${SHLIB_LOADER_SOURCES}
|
||||
)
|
||||
target_link_libraries(rftest PRIVATE minimal_lib CONFIG_LIB PHY_NR_COMMON UTIL pthread dl m ${T_LIB} )
|
||||
target_link_libraries(rftest PRIVATE asn1_lte_rrc asn1_nr_rrc)
|
||||
target_link_libraries(rftest PRIVATE asn1_lte_rrc asn1_nr_rrc asn1_ngap)
|
||||
|
||||
add_executable(polartest
|
||||
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/polartest.c
|
||||
@@ -2414,7 +2414,7 @@ target_link_libraries(polartest PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_COMMON PHY_NR_UE CONFIG_LIB -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} dl
|
||||
)
|
||||
target_link_libraries(polartest PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(polartest PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_executable(smallblocktest
|
||||
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/smallblocktest.c
|
||||
@@ -2427,7 +2427,7 @@ target_link_libraries(smallblocktest PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} dl
|
||||
)
|
||||
target_link_libraries(smallblocktest PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(smallblocktest PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
|
||||
add_executable(ldpctest
|
||||
@@ -2445,7 +2445,7 @@ target_link_libraries(ldpctest PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} dl
|
||||
)
|
||||
target_link_libraries(ldpctest PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(ldpctest PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_executable(nr_dlschsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c
|
||||
@@ -2458,7 +2458,7 @@ target_link_libraries(nr_dlschsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI dl
|
||||
)
|
||||
target_link_libraries(nr_dlschsim PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nr_dlschsim PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_executable(nr_pbchsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c
|
||||
@@ -2470,7 +2470,7 @@ target_link_libraries(nr_pbchsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI dl
|
||||
)
|
||||
target_link_libraries(nr_pbchsim PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nr_pbchsim PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
|
||||
#PUCCH ---> Prashanth
|
||||
@@ -2485,7 +2485,7 @@ target_link_libraries(nr_pucchsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI dl
|
||||
)
|
||||
target_link_libraries(nr_pucchsim PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nr_pucchsim PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_executable(nr_dlsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlsim.c
|
||||
@@ -2503,7 +2503,7 @@ target_link_libraries(nr_dlsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON lte_rrc nr_rrc CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE x2ap SECU_CN ngap NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -lz -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI ${OPENSSL_LIBRARIES} dl
|
||||
)
|
||||
target_link_libraries(nr_dlsim PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nr_dlsim PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_executable(nr_prachsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/prachsim.c
|
||||
@@ -2518,7 +2518,7 @@ add_executable(nr_prachsim
|
||||
target_link_libraries(nr_prachsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON lte_rrc nr_rrc CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE x2ap SECU_CN ngap NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -lz -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI ${OPENSSL_LIBRARIES} dl)
|
||||
target_link_libraries(nr_prachsim PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nr_prachsim PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_executable(nr_ulschsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
||||
@@ -2532,7 +2532,7 @@ target_link_libraries(nr_ulschsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI dl
|
||||
)
|
||||
target_link_libraries(nr_ulschsim PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nr_ulschsim PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
add_executable(nr_ulsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulsim.c
|
||||
@@ -2555,7 +2555,7 @@ target_link_libraries(nr_ulsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON lte_rrc nr_rrc CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE x2ap SECU_CN ngap NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -lz -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI ${OPENSSL_LIBRARIES} dl
|
||||
)
|
||||
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
|
||||
|
||||
@@ -2572,7 +2572,7 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr
|
||||
-Wl,--start-group SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU ITTI -Wl,--end-group
|
||||
pthread m rt CONFIG_LIB ${ATLAS_LIBRARIES} ${T_LIB} dl
|
||||
)
|
||||
target_link_libraries(${myExe} PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
target_link_libraries(${myExe} PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_ngap)
|
||||
|
||||
endforeach(myExe)
|
||||
|
||||
|
||||
@@ -54,4 +54,7 @@ typedef enum { CPtype = 0, UPtype } E1_t;
|
||||
#define NODE_IS_DU(nOdE_TyPe) ((nOdE_TyPe) == ngran_eNB_DU || (nOdE_TyPe) == ngran_gNB_DU)
|
||||
#define NODE_IS_MBMS(nOdE_TyPe) ((nOdE_TyPe) == ngran_eNB_MBMS_STA)
|
||||
#define GTPV1_U_PORT_NUMBER (2152)
|
||||
|
||||
typedef enum { non_dynamic, dynamic } fiveQI_type_t;
|
||||
#define maxSRBs 4
|
||||
#endif
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#ifndef E1AP_MESSAGES_TYPES_H
|
||||
#define E1AP_MESSAGES_TYPES_H
|
||||
|
||||
#include "common/ngran_types.h"
|
||||
#include "f1ap_messages_types.h"
|
||||
#include "ngap_messages_types.h"
|
||||
|
||||
|
||||
@@ -29,8 +29,9 @@
|
||||
|
||||
#ifndef NGAP_MESSAGES_TYPES_H_
|
||||
#define NGAP_MESSAGES_TYPES_H_
|
||||
|
||||
#include "common/ngran_types.h"
|
||||
#include "LTE_asn_constant.h"
|
||||
#include "NGAP_Cause.h"
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
// Defines to access message fields.
|
||||
|
||||
@@ -49,7 +50,7 @@
|
||||
#define NGAP_UE_CTXT_MODIFICATION_RESP(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_ctxt_modification_resp
|
||||
#define NGAP_UE_CTXT_MODIFICATION_FAIL(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_ctxt_modification_fail
|
||||
#define NGAP_PDUSESSION_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_setup_resp
|
||||
#define NGAP_PDUSESSION_SETUP_FAIL(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_setup_req_fail
|
||||
#define NGAP_PDUSESSION_SETUP_FAIL(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_setup_request_fail
|
||||
#define NGAP_PDUSESSION_MODIFY_RESP(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_modify_resp
|
||||
#define NGAP_PATH_SWITCH_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_path_switch_req
|
||||
#define NGAP_PATH_SWITCH_REQ_ACK(mSGpTR) (mSGpTR)->ittiMsg.ngap_path_switch_req_ack
|
||||
@@ -194,6 +195,13 @@ typedef enum ngap_rrc_establishment_cause_e {
|
||||
NGAP_RRC_CAUSE_LAST
|
||||
} ngap_rrc_establishment_cause_t;
|
||||
|
||||
typedef struct pdusession_level_qos_parameter_s {
|
||||
uint8_t qfi;
|
||||
uint64_t fiveQI;
|
||||
fiveQI_type_t fiveQI_type;
|
||||
ngap_allocation_retention_priority_t allocation_retention_priority;
|
||||
} pdusession_level_qos_parameter_t;
|
||||
|
||||
typedef struct ngap_guami_s {
|
||||
uint16_t mcc;
|
||||
uint16_t mnc;
|
||||
@@ -242,7 +250,7 @@ typedef struct ngap_nas_pdu_s {
|
||||
uint8_t *buffer;
|
||||
/* Length of the octet string */
|
||||
uint32_t length;
|
||||
} ngap_nas_pdu_t, ngap_ue_radio_cap_t;
|
||||
} ngap_pdu_t;
|
||||
|
||||
typedef struct ngap_mobility_restriction_s{
|
||||
ngap_plmn_identity_t serving_plmn;
|
||||
@@ -267,43 +275,22 @@ typedef struct ngap_transport_layer_addr_s {
|
||||
uint8_t buffer[20]; // in network byte order
|
||||
} ngap_transport_layer_addr_t;
|
||||
|
||||
#define TRANSPORT_LAYER_ADDR_COPY(dEST,sOURCE) \
|
||||
do { \
|
||||
AssertFatal(sOURCE.len <= 20); \
|
||||
memcpy(dEST.buffer, sOURCE.buffer, sOURCE.len); \
|
||||
dEST.length = sOURCE.length; \
|
||||
} while (0)
|
||||
|
||||
typedef enum {
|
||||
non_dynamic,
|
||||
dynamic
|
||||
} fiveQI_type_t;
|
||||
|
||||
typedef struct pdusession_level_qos_parameter_s {
|
||||
uint8_t qfi;
|
||||
uint64_t fiveQI;
|
||||
fiveQI_type_t fiveQI_type;
|
||||
ngap_allocation_retention_priority_t allocation_retention_priority;
|
||||
} pdusession_level_qos_parameter_t;
|
||||
|
||||
typedef struct pdusession_s {
|
||||
/* Unique pdusession_id for the UE. */
|
||||
uint8_t pdusession_id;
|
||||
|
||||
uint8_t nb_qos;
|
||||
int pdusession_id;
|
||||
ngap_pdu_t nas_pdu;
|
||||
ngap_pdu_t pdusessionTransfer;
|
||||
uint8_t nb_qos;
|
||||
/* Quality of service for this pdusession */
|
||||
pdusession_level_qos_parameter_t qos[QOSFLOW_MAX_VALUE];
|
||||
/* The NAS PDU should be forwarded by the RRC layer to the NAS layer */
|
||||
ngap_nas_pdu_t nas_pdu;
|
||||
/* The transport layer address for the IP packets */
|
||||
ngap_transport_layer_addr_t upf_addr;
|
||||
ngap_transport_layer_addr_t upf_addr;
|
||||
/* S-GW Tunnel endpoint identifier */
|
||||
uint32_t gtp_teid;
|
||||
uint32_t gtp_teid;
|
||||
/* Stores the DRB ID of the DRBs used by this PDU Session */
|
||||
uint8_t used_drbs[NGAP_MAX_DRBS_PER_UE];
|
||||
uint8_t used_drbs[NGAP_MAX_DRBS_PER_UE];
|
||||
} pdusession_t;
|
||||
|
||||
|
||||
typedef enum pdusession_qosflow_mapping_ind_e{
|
||||
QOSFLOW_MAPPING_INDICATION_UL = 0,
|
||||
QOSFLOW_MAPPING_INDICATION_DL = 1,
|
||||
@@ -332,20 +319,6 @@ typedef struct pdusession_setup_s {
|
||||
pdusession_associate_qosflow_t associated_qos_flows[QOSFLOW_MAX_VALUE];
|
||||
} pdusession_setup_t;
|
||||
|
||||
typedef struct pdusession_tobe_added_s {
|
||||
/* Unique pdusession_id for the UE. */
|
||||
uint8_t pdusession_id;
|
||||
|
||||
/* Unique drb_ID for the UE. */
|
||||
uint8_t drb_ID;
|
||||
|
||||
/* The transport layer address for the IP packets */
|
||||
ngap_transport_layer_addr_t upf_addr;
|
||||
|
||||
/* S-GW Tunnel endpoint identifier */
|
||||
uint32_t gtp_teid;
|
||||
} pdusession_tobe_added_t;
|
||||
|
||||
typedef struct pdusession_admitted_tobe_added_s {
|
||||
/* Unique pdusession_id for the UE. */
|
||||
uint8_t pdusession_id;
|
||||
@@ -454,7 +427,7 @@ typedef struct pdusession_failed_s {
|
||||
uint8_t pdusession_id;
|
||||
/* Cause of the failure */
|
||||
// cause_t cause;
|
||||
ngap_Cause_t cause;
|
||||
NGAP_Cause_PR cause;
|
||||
uint8_t cause_value;
|
||||
} pdusession_failed_t;
|
||||
|
||||
@@ -541,7 +514,7 @@ typedef struct ngap_deregistered_gnb_ind_s {
|
||||
*/
|
||||
typedef struct ngap_nas_first_req_s {
|
||||
/* UE id for initial connection to NGAP */
|
||||
uint16_t ue_initial_id;
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
/* the chosen PLMN identity as index, see TS 36.331 6.2.2 RRC Connection
|
||||
* Setup Complete. This index here is zero-based, unlike the standard! */
|
||||
@@ -551,7 +524,7 @@ typedef struct ngap_nas_first_req_s {
|
||||
ngap_rrc_establishment_cause_t establishment_cause;
|
||||
|
||||
/* NAS PDU */
|
||||
ngap_nas_pdu_t nas_pdu;
|
||||
ngap_pdu_t nas_pdu;
|
||||
|
||||
/* If this flag is set NGAP layer is expecting the GUAMI. If = 0,
|
||||
* the temporary s-tmsi is used.
|
||||
@@ -561,15 +534,14 @@ typedef struct ngap_nas_first_req_s {
|
||||
|
||||
typedef struct ngap_uplink_nas_s {
|
||||
/* Unique UE identifier within an gNB */
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
/* NAS pdu */
|
||||
ngap_nas_pdu_t nas_pdu;
|
||||
ngap_pdu_t nas_pdu;
|
||||
} ngap_uplink_nas_t;
|
||||
|
||||
typedef struct ngap_ue_cap_info_ind_s {
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
ngap_ue_radio_cap_t ue_radio_cap;
|
||||
ngap_pdu_t ue_radio_cap;
|
||||
} ngap_ue_cap_info_ind_t;
|
||||
|
||||
typedef struct ngap_initial_context_setup_resp_s {
|
||||
@@ -594,7 +566,7 @@ typedef struct ngap_initial_context_setup_fail_s {
|
||||
|
||||
typedef struct ngap_nas_non_delivery_ind_s {
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
ngap_nas_pdu_t nas_pdu;
|
||||
ngap_pdu_t nas_pdu;
|
||||
/* TODO: add cause */
|
||||
} ngap_nas_non_delivery_ind_t;
|
||||
|
||||
@@ -621,30 +593,21 @@ typedef struct ngap_ue_ctxt_modification_resp_s {
|
||||
} ngap_ue_ctxt_modification_resp_t;
|
||||
|
||||
typedef struct ngap_ue_release_complete_s {
|
||||
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
} ngap_ue_release_complete_t;
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
// NGAP -> RRC messages
|
||||
typedef struct ngap_downlink_nas_s {
|
||||
/* UE id for initial connection to NGAP */
|
||||
uint16_t ue_initial_id;
|
||||
|
||||
/* Unique UE identifier within an gNB */
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
/* NAS pdu */
|
||||
ngap_nas_pdu_t nas_pdu;
|
||||
ngap_pdu_t nas_pdu;
|
||||
} ngap_downlink_nas_t;
|
||||
|
||||
|
||||
typedef struct ngap_initial_context_setup_req_s {
|
||||
/* UE id for initial connection to NGAP */
|
||||
uint16_t ue_initial_id;
|
||||
|
||||
/* gNB ue ngap id as initialized by NGAP layer */
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
uint64_t amf_ue_ngap_id:40;
|
||||
@@ -676,7 +639,7 @@ typedef struct ngap_initial_context_setup_req_s {
|
||||
|
||||
/* Nas Pdu */
|
||||
uint8_t nas_pdu_flag;
|
||||
ngap_nas_pdu_t nas_pdu;
|
||||
ngap_pdu_t nas_pdu;
|
||||
} ngap_initial_context_setup_req_t;
|
||||
|
||||
|
||||
@@ -704,14 +667,11 @@ typedef struct ngap_paging_ind_s {
|
||||
|
||||
typedef struct ngap_pdusession_setup_req_s {
|
||||
/* UE id for initial connection to NGAP */
|
||||
uint16_t ue_initial_id;
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
/* AMF UE id */
|
||||
uint64_t amf_ue_ngap_id:40;
|
||||
|
||||
/* gNB ue ngap id as initialized by NGAP layer */
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
/* S-NSSAI */
|
||||
ngap_allowed_NSSAI_t allowed_nssai[8];
|
||||
|
||||
@@ -730,8 +690,7 @@ typedef struct ngap_pdusession_setup_req_s {
|
||||
} ngap_pdusession_setup_req_t;
|
||||
|
||||
typedef struct ngap_pdusession_setup_resp_s {
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
/* Number of pdusession setup-ed in the list */
|
||||
uint8_t nb_of_pdusessions;
|
||||
/* list of pdusession setup-ed by RRC layers */
|
||||
@@ -744,7 +703,6 @@ typedef struct ngap_pdusession_setup_resp_s {
|
||||
} ngap_pdusession_setup_resp_t;
|
||||
|
||||
typedef struct ngap_path_switch_req_s {
|
||||
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
/* Number of pdusession setup-ed in the list */
|
||||
@@ -759,8 +717,7 @@ typedef struct ngap_path_switch_req_s {
|
||||
ngap_guami_t ue_guami;
|
||||
|
||||
uint16_t ue_initial_id;
|
||||
|
||||
/* Security algorithms */
|
||||
/* Security algorithms */
|
||||
ngap_security_capabilities_t security_capabilities;
|
||||
|
||||
} ngap_path_switch_req_t;
|
||||
@@ -830,10 +787,7 @@ typedef struct ngap_ue_release_command_s {
|
||||
typedef struct pdusession_release_s {
|
||||
/* Unique pdusession_id for the UE. */
|
||||
uint8_t pdusession_id;
|
||||
/* Octet string data */
|
||||
uint8_t *transfer_buffer;
|
||||
/* Length of the octet string */
|
||||
uint32_t transfer_length;
|
||||
ngap_pdu_t data;
|
||||
} pdusession_release_t;
|
||||
|
||||
typedef struct ngap_ue_release_req_s {
|
||||
@@ -842,14 +796,11 @@ typedef struct ngap_ue_release_req_s {
|
||||
uint8_t nb_of_pdusessions;
|
||||
/* list of pdusession resource by RRC layers */
|
||||
pdusession_release_t pdusessions[NGAP_MAX_PDUSESSION];
|
||||
ngap_Cause_t cause;
|
||||
NGAP_Cause_PR cause;
|
||||
long cause_value;
|
||||
} ngap_ue_release_req_t, ngap_ue_release_resp_t;
|
||||
|
||||
typedef struct ngap_pdusession_modify_req_s {
|
||||
/* UE id for initial connection to NGAP */
|
||||
uint16_t ue_initial_id;
|
||||
|
||||
/* AMF UE id */
|
||||
uint64_t amf_ue_ngap_id:40;
|
||||
|
||||
@@ -885,7 +836,7 @@ typedef struct ngap_pdusession_release_command_s {
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
/* The NAS PDU should be forwarded by the RRC layer to the NAS layer */
|
||||
ngap_nas_pdu_t nas_pdu;
|
||||
ngap_pdu_t nas_pdu;
|
||||
|
||||
/* Number of pdusession to be released in the list */
|
||||
uint8_t nb_pdusessions_torelease;
|
||||
|
||||
@@ -3,5 +3,5 @@ add_subdirectory(MESSAGES)
|
||||
add_library(e1ap e1ap.c e1ap_common.c e1ap_api.c)
|
||||
target_link_libraries(e1ap
|
||||
PUBLIC asn1_e1ap f1ap
|
||||
PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_f1ap UTIL e1_pdcp_if e1_if)
|
||||
PRIVATE asn1_nr_rrc asn1_lte_rrc asn1_f1ap UTIL e1_pdcp_if e1_if asn1_ngap)
|
||||
target_include_directories(e1ap PUBLIC ${CMAKE_CURRENT_DIR})
|
||||
|
||||
@@ -107,17 +107,17 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p,
|
||||
|
||||
gtpv1u_gnb_create_tunnel_req_t create_tunnel_req={0};
|
||||
gtpv1u_gnb_create_tunnel_resp_t create_tunnel_resp={0};
|
||||
|
||||
int i = ue_context_p->ue_context.nb_of_pdusessions - 1;
|
||||
pdu_session_param_t *pdu = ue_context_p->ue_context.pduSession + i;
|
||||
create_tunnel_req.pdusession_id[0] = pdu->param.pdusession_id;
|
||||
create_tunnel_req.incoming_rb_id[0] = i + 1;
|
||||
create_tunnel_req.outgoing_qfi[0] = req->pduSession[i].DRBnGRanList[0].qosFlows[0].id;
|
||||
memcpy(&create_tunnel_req.dst_addr[0].buffer, &pdu->param.upf_addr.buffer, sizeof(create_tunnel_req.dst_addr[0].buffer));
|
||||
create_tunnel_req.dst_addr[0].length = pdu->param.upf_addr.length;
|
||||
create_tunnel_req.outgoing_teid[0] = pdu->param.gtp_teid;
|
||||
|
||||
create_tunnel_req.num_tunnels = 1;
|
||||
LOG_W(NR_RRC, "recreate existing tunnels, while adding new ones\n");
|
||||
for (int i = 0; i < ue_context_p->ue_context.nb_of_pdusessions; i++) {
|
||||
rrc_pdu_session_param_t *pdu = ue_context_p->ue_context.pduSession + i;
|
||||
create_tunnel_req.pdusession_id[i] = pdu->param.pdusession_id;
|
||||
create_tunnel_req.incoming_rb_id[i] = i + 1;
|
||||
create_tunnel_req.outgoing_qfi[i] = req->pduSession[i].DRBnGRanList[0].qosFlows[0].id;
|
||||
memcpy(&create_tunnel_req.dst_addr[i].buffer, &pdu->param.upf_addr.buffer, sizeof(create_tunnel_req.dst_addr[0].buffer));
|
||||
create_tunnel_req.dst_addr[i].length = pdu->param.upf_addr.length;
|
||||
create_tunnel_req.outgoing_teid[i] = pdu->param.gtp_teid;
|
||||
}
|
||||
create_tunnel_req.num_tunnels = ue_context_p->ue_context.nb_of_pdusessions;
|
||||
create_tunnel_req.ue_id = ue_context_p->ue_context.rnti;
|
||||
int ret = gtpv1u_create_ngu_tunnel(getCxtE1(instance)->gtpInstN3, &create_tunnel_req, &create_tunnel_resp);
|
||||
|
||||
@@ -127,7 +127,7 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p,
|
||||
return ret;
|
||||
}
|
||||
|
||||
nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(ctxt_p, &create_tunnel_resp, i);
|
||||
nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(ctxt_p, &create_tunnel_resp, 0);
|
||||
|
||||
uint8_t *kRRCenc = NULL;
|
||||
uint8_t *kRRCint = NULL;
|
||||
|
||||
@@ -267,9 +267,12 @@ typedef struct pdu_session_param_s {
|
||||
pdusession_t param;
|
||||
uint8_t status;
|
||||
uint8_t xid; // transaction_id
|
||||
ngap_Cause_t cause;
|
||||
NGAP_Cause_PR cause;
|
||||
uint8_t cause_value;
|
||||
} __attribute__ ((__packed__)) pdu_session_param_t;
|
||||
ngap_pdu_t nas_pdu;
|
||||
ngap_pdu_t pdusessionTransfer;
|
||||
|
||||
} rrc_pdu_session_param_t;
|
||||
|
||||
typedef struct gNB_RRC_UE_s {
|
||||
uint8_t primaryCC_id;
|
||||
@@ -281,8 +284,7 @@ typedef struct gNB_RRC_UE_s {
|
||||
uint8_t DRB_active[NGAP_MAX_DRBS_PER_UE];
|
||||
|
||||
NR_SRB_INFO SI;
|
||||
NR_SRB_INFO_TABLE_ENTRY Srb1;
|
||||
NR_SRB_INFO_TABLE_ENTRY Srb2;
|
||||
NR_SRB_INFO_TABLE_ENTRY Srb[maxSRBs]; // 3gpp max is 3 SRBs, number 1..3, we waste the entry 0 for code simplicity
|
||||
NR_MeasConfig_t *measConfig;
|
||||
NR_HANDOVER_INFO *handover_info;
|
||||
NR_MeasResults_t *measResults;
|
||||
@@ -350,11 +352,11 @@ typedef struct gNB_RRC_UE_s {
|
||||
/* Number of e_rab to be modified in the list */
|
||||
uint8_t nb_of_modify_pdusessions;
|
||||
uint8_t nb_of_failed_pdusessions;
|
||||
pdu_session_param_t modify_pdusession[NR_NB_RB_MAX];
|
||||
rrc_pdu_session_param_t modify_pdusession[NR_NB_RB_MAX];
|
||||
/* list of e_rab to be setup by RRC layers */
|
||||
/* list of pdu session to be setup by RRC layers */
|
||||
nr_e_rab_param_t e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
|
||||
pdu_session_param_t pduSession[NGAP_MAX_PDU_SESSION];
|
||||
rrc_pdu_session_param_t pduSession[NGAP_MAX_PDU_SESSION];
|
||||
//release e_rabs
|
||||
uint8_t nb_release_of_e_rabs;
|
||||
e_rab_failed_t e_rabs_release_failed[S1AP_MAX_E_RAB];
|
||||
@@ -395,8 +397,7 @@ typedef struct gNB_RRC_UE_s {
|
||||
struct NR_PhysicalCellGroupConfig *physicalCellGroupConfig;
|
||||
|
||||
/* Nas Pdu */
|
||||
uint8_t nas_pdu_flag;
|
||||
ngap_nas_pdu_t nas_pdu;
|
||||
ngap_pdu_t nas_pdu;
|
||||
|
||||
} gNB_RRC_UE_t;
|
||||
|
||||
@@ -492,12 +493,7 @@ typedef struct gNB_RRC_INST_s {
|
||||
rrc_gNB_carrier_data_t carrier;
|
||||
uid_allocator_t uid_allocator;
|
||||
RB_HEAD(rrc_nr_ue_tree_s, rrc_gNB_ue_context_s) rrc_ue_head; // ue_context tree key search by rnti
|
||||
int Nb_ue;
|
||||
hash_table_t *initial_id2_s1ap_ids; // key is content is rrc_ue_s1ap_ids_t
|
||||
hash_table_t *s1ap_id2_s1ap_ids ; // key is content is rrc_ue_s1ap_ids_t
|
||||
hash_table_t *initial_id2_ngap_ids;
|
||||
hash_table_t *ngap_id2_ngap_ids ;
|
||||
|
||||
int Nb_ue;
|
||||
/// NR cell id
|
||||
uint64_t nr_cellid;
|
||||
|
||||
|
||||
+73
-104
@@ -248,10 +248,6 @@ static void openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_Rrc
|
||||
rrc_gNB_CU_DU_init(rrc);
|
||||
uid_linear_allocator_init(&rrc->uid_allocator);
|
||||
RB_INIT(&rrc->rrc_ue_head);
|
||||
rrc->initial_id2_s1ap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL);
|
||||
rrc->s1ap_id2_s1ap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL);
|
||||
rrc->initial_id2_ngap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL);
|
||||
rrc->ngap_id2_ngap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL);
|
||||
rrc->configuration = *configuration;
|
||||
rrc->carrier.servingcellconfigcommon = configuration->scc;
|
||||
rrc->carrier.servingcellconfig = configuration->scd;
|
||||
@@ -512,9 +508,9 @@ static void rrc_gNB_process_RRCSetupComplete(const protocol_ctxt_t *const ctxt_p
|
||||
{
|
||||
LOG_A(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel UL-DCCH, " "processing NR_RRCSetupComplete from UE (SRB1 Active)\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
ue_context_pP->ue_context.Srb1.Active = 1;
|
||||
ue_context_pP->ue_context.Srb1.Srb_info.Srb_id = 1;
|
||||
ue_context_pP->ue_context.Srb2.Active = 0;
|
||||
ue_context_pP->ue_context.Srb[1].Active = 1;
|
||||
ue_context_pP->ue_context.Srb[1].Srb_info.Srb_id = 1;
|
||||
ue_context_pP->ue_context.Srb[2].Active = 0;
|
||||
ue_context_pP->ue_context.StatusRrc = NR_RRC_CONNECTED;
|
||||
|
||||
if (get_softmodem_params()->sa) {
|
||||
@@ -553,7 +549,7 @@ static void rrc_gNB_generate_defaultRRCReconfiguration(const protocol_ctxt_t *co
|
||||
i, ue_context_pP->ue_context.pduSession[i].status, "PDU_SESSION_STATUS_DONE");
|
||||
}
|
||||
|
||||
if (ue_context_pP->ue_context.nas_pdu_flag == 1) {
|
||||
if (ue_context_pP->ue_context.nas_pdu.length) {
|
||||
dedicatedNAS_Message = CALLOC(1, sizeof(NR_DedicatedNAS_Message_t));
|
||||
OCTET_STRING_fromBuf(dedicatedNAS_Message,
|
||||
(char *)ue_context_pP->ue_context.nas_pdu.buffer,
|
||||
@@ -1281,15 +1277,12 @@ rrc_gNB_process_RRCReconfigurationComplete(
|
||||
if (SRB_configList != NULL) {
|
||||
for (int i = 0; (i < SRB_configList->list.count) && (i < 3); i++) {
|
||||
if (SRB_configList->list.array[i]->srb_Identity == 1) {
|
||||
ue_context_pP->ue_context.Srb1.Active = 1;
|
||||
ue_context_pP->ue_context.Srb1.Srb_info.Srb_id = 1;
|
||||
ue_context_pP->ue_context.Srb[1].Active = 1;
|
||||
ue_context_pP->ue_context.Srb[1].Srb_info.Srb_id = 1;
|
||||
} else if (SRB_configList->list.array[i]->srb_Identity == 2) {
|
||||
ue_context_pP->ue_context.Srb2.Active = 1;
|
||||
ue_context_pP->ue_context.Srb2.Srb_info.Srb_id = 2;
|
||||
LOG_I(NR_RRC,"[gNB %d] Frame %d CC %d: SRB2 is now active\n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->frame,
|
||||
ue_context_pP->ue_context.primaryCC_id);
|
||||
ue_context_pP->ue_context.Srb[2].Active = 1;
|
||||
ue_context_pP->ue_context.Srb[2].Srb_info.Srb_id = 2;
|
||||
LOG_I(NR_RRC, "[gNB %d] Frame %d CC %d : SRB2 is now active\n", ctxt_pP->module_id, ctxt_pP->frame, ue_context_pP->ue_context.primaryCC_id);
|
||||
} else {
|
||||
LOG_W(NR_RRC,"[gNB %d] Frame %d CC %d: invalid SRB identity %ld\n",
|
||||
ctxt_pP->module_id,
|
||||
@@ -1554,33 +1547,17 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
|
||||
}
|
||||
}
|
||||
|
||||
ue_context_pP->ue_context.Srb1.Active = 1;
|
||||
//ue_context_pP->ue_context.Srb2.Srb_info.Srb_id = 2;
|
||||
ue_context_pP->ue_context.Srb[1].Active = 1;
|
||||
// ue_context_pP->ue_context.Srb[2].Srb_info.Srb_id = 2;
|
||||
|
||||
if (get_softmodem_params()->sa) {
|
||||
hashtable_rc_t h_rc;
|
||||
int j;
|
||||
rrc_ue_ngap_ids_t *rrc_ue_ngap_ids_p = NULL;
|
||||
int j;
|
||||
uint16_t ue_initial_id = ue_context_pP->ue_context.ue_initial_id;
|
||||
uint32_t gNB_ue_ngap_id = ue_context_pP->ue_context.gNB_ue_ngap_id;
|
||||
gNB_RRC_INST *rrc_instance_p = RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(ctxt_pP->instance)];
|
||||
|
||||
if (gNB_ue_ngap_id > 0) {
|
||||
h_rc = hashtable_get(rrc_instance_p->ngap_id2_ngap_ids, (hash_key_t)gNB_ue_ngap_id, (void **)&rrc_ue_ngap_ids_p);
|
||||
|
||||
if (h_rc == HASH_TABLE_OK) {
|
||||
rrc_ue_ngap_ids_p->ue_rnti = ctxt_pP->rntiMaybeUEid;
|
||||
}
|
||||
}
|
||||
|
||||
if (ue_initial_id != 0) {
|
||||
h_rc = hashtable_get(rrc_instance_p->initial_id2_ngap_ids, (hash_key_t)ue_initial_id, (void **)&rrc_ue_ngap_ids_p);
|
||||
|
||||
if (h_rc == HASH_TABLE_OK) {
|
||||
rrc_ue_ngap_ids_p->ue_rnti = ctxt_pP->rntiMaybeUEid;
|
||||
}
|
||||
}
|
||||
|
||||
AssertFatal(false, "rework identity mapping \n");
|
||||
gtpv1u_gnb_create_tunnel_req_t create_tunnel_req={0};
|
||||
/* Save e RAB information for later */
|
||||
|
||||
@@ -1608,23 +1585,25 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
|
||||
|
||||
if ( ret != 0 ) {
|
||||
LOG_E(NR_RRC,"gtpv1u_update_ngu_tunnel failed,start to release UE %x\n",reestablish_rnti);
|
||||
|
||||
AssertFatal(false, "\n");
|
||||
/*
|
||||
// update s1u tunnel failed,reset rnti?
|
||||
if (gNB_ue_ngap_id > 0) {
|
||||
h_rc = hashtable_get(rrc_instance_p->ngap_id2_ngap_ids, (hash_key_t)gNB_ue_ngap_id, (void **)&rrc_ue_ngap_ids_p);
|
||||
h_rc = hashtable_get(rrc_instance_p->ngap_id2_ngap_ids, (hash_key_t)gNB_ue_ngap_id, (void **)&rrc_ue_ngap_ids_p);
|
||||
|
||||
if (h_rc == HASH_TABLE_OK ) {
|
||||
rrc_ue_ngap_ids_p->ue_rnti = reestablish_rnti;
|
||||
}
|
||||
if (h_rc == HASH_TABLE_OK ) {
|
||||
rrc_ue_ngap_ids_p->ue_rnti = reestablish_rnti;
|
||||
}
|
||||
}
|
||||
|
||||
if (ue_initial_id != 0) {
|
||||
h_rc = hashtable_get(rrc_instance_p->initial_id2_ngap_ids, (hash_key_t)ue_initial_id, (void **)&rrc_ue_ngap_ids_p);
|
||||
|
||||
if (h_rc == HASH_TABLE_OK ) {
|
||||
if (h_rc == HASH_TABLE_OK ) {
|
||||
rrc_ue_ngap_ids_p->ue_rnti = reestablish_rnti;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
ue_context_pP->ue_context.ue_release_timer_s1 = 1;
|
||||
ue_context_pP->ue_context.ue_release_timer_thres_s1 = 100;
|
||||
@@ -1637,8 +1616,6 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
|
||||
}
|
||||
|
||||
/* Update RNTI in ue_context */
|
||||
LOG_I(NR_RRC, "Updating UEid from %04x to %lx\n", ue_context_pP->ue_context.rnti, ctxt_pP->rntiMaybeUEid);
|
||||
ue_context_pP->ue_id_rnti = ctxt_pP->rntiMaybeUEid; // here ue_id_rnti is just a key, may be something else
|
||||
ue_context_pP->ue_context.rnti = ctxt_pP->rntiMaybeUEid;
|
||||
|
||||
if (get_softmodem_params()->sa) {
|
||||
@@ -2101,19 +2078,19 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
//LG COMMENT Idx = (ue_mod_idP * NB_RB_MAX) + DCCH;
|
||||
Idx = DCCH;
|
||||
// SRB1
|
||||
ue_context_p->ue_context.Srb1.Active = 1;
|
||||
ue_context_p->ue_context.Srb1.Srb_info.Srb_id = Idx;
|
||||
rrc_init_nr_srb_param(&ue_context_p->ue_context.Srb1.Srb_info.Lchan_desc[0]);
|
||||
rrc_init_nr_srb_param(&ue_context_p->ue_context.Srb1.Srb_info.Lchan_desc[1]);
|
||||
ue_context_p->ue_context.Srb[1].Active = 1;
|
||||
ue_context_p->ue_context.Srb[1].Srb_info.Srb_id = Idx;
|
||||
rrc_init_nr_srb_param(&ue_context_p->ue_context.Srb[1].Srb_info.Lchan_desc[0]);
|
||||
rrc_init_nr_srb_param(&ue_context_p->ue_context.Srb[1].Srb_info.Lchan_desc[1]);
|
||||
// SRB2: set it to go through SRB1 with id 1 (DCCH)
|
||||
ue_context_p->ue_context.Srb2.Active = 1;
|
||||
ue_context_p->ue_context.Srb2.Srb_info.Srb_id = Idx;
|
||||
rrc_init_nr_srb_param(&ue_context_p->ue_context.Srb2.Srb_info.Lchan_desc[0]);
|
||||
rrc_init_nr_srb_param(&ue_context_p->ue_context.Srb2.Srb_info.Lchan_desc[1]);
|
||||
ue_context_p->ue_context.Srb[2].Active = 1;
|
||||
ue_context_p->ue_context.Srb[2].Srb_info.Srb_id = Idx;
|
||||
rrc_init_nr_srb_param(&ue_context_p->ue_context.Srb[2].Srb_info.Lchan_desc[0]);
|
||||
rrc_init_nr_srb_param(&ue_context_p->ue_context.Srb[2].Srb_info.Lchan_desc[1]);
|
||||
|
||||
rrc_gNB_generate_RRCReestablishment(ctxt_pP, ue_context_p, du_to_cu_rrc_container, gnb_rrc_inst->carrier.servingcellconfigcommon, 0);
|
||||
rrc_gNB_generate_RRCReestablishment(ctxt_pP, ue_context_p, du_to_cu_rrc_container, gnb_rrc_inst->carrier.servingcellconfigcommon, 0);
|
||||
|
||||
LOG_I(NR_RRC, "CALLING RLC CONFIG SRB1 (rbid %d)\n", Idx);
|
||||
LOG_I(NR_RRC, "CALLING RLC CONFIG SRB1 (rbid %d)\n", Idx);
|
||||
} break;
|
||||
|
||||
case NR_UL_CCCH_MessageType__c1_PR_rrcSystemInfoRequest:
|
||||
@@ -2839,7 +2816,8 @@ void rrc_gNB_process_dc_overall_timeout(const module_id_t gnb_mod_idP, x2ap_ENDC
|
||||
rrc_remove_nsa_user(rrc, m->rnti);
|
||||
}
|
||||
|
||||
static int rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_t instance) {
|
||||
static int rrc_process_DU_DL(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
NRDuDlReq_t * req=&NRDuDlReq(msg_p);
|
||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||
@@ -2896,19 +2874,18 @@ static int rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_
|
||||
if (SRB_configList != NULL) {
|
||||
for (i = 0; (i < SRB_configList->list.count) && (i < 3); i++) {
|
||||
if (SRB_configList->list.array[i]->srb_Identity == 1 ) {
|
||||
ue_context_p->ue_context.Srb1.Active=1;
|
||||
} else if (SRB_configList->list.array[i]->srb_Identity == 2 ) {
|
||||
ue_context_p->ue_context.Srb2.Active=1;
|
||||
ue_context_p->ue_context.Srb2.Srb_info.Srb_id=2;
|
||||
LOG_I(F1AP, "[DU %d] SRB2 is now active\n",ctxt.module_id);
|
||||
} else {
|
||||
LOG_W(F1AP, "[DU %d] invalide SRB identity %ld\n",ctxt.module_id,
|
||||
SRB_configList->list.array[i]->srb_Identity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (DRB_configList != NULL) {
|
||||
ue_context_p->ue_context.Srb[1].Active = 1;
|
||||
} else if (SRB_configList->list.array[i]->srb_Identity == 2) {
|
||||
ue_context_p->ue_context.Srb[2].Active = 1;
|
||||
ue_context_p->ue_context.Srb[2].Srb_info.Srb_id = 2;
|
||||
LOG_I(F1AP, "[DU %d] SRB2 is now active\n", ctxt.module_id);
|
||||
} else {
|
||||
LOG_W(F1AP, "[DU %d] invalide SRB identity %ld\n", ctxt.module_id, SRB_configList->list.array[i]->srb_Identity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (DRB_configList != NULL) {
|
||||
for (i = 0; i < DRB_configList->list.count; i++) { // num max DRB (11-3-8)
|
||||
if (DRB_configList->list.array[i]) {
|
||||
drb_id = (int)DRB_configList->list.array[i]->drb_Identity;
|
||||
@@ -3028,8 +3005,8 @@ static int rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const char *msg_name, instance_t instance){
|
||||
|
||||
static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_SETUP_REQ(msg_p);
|
||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||
@@ -3257,8 +3234,8 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
|
||||
itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p);
|
||||
}
|
||||
|
||||
static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, const char *msg_name, instance_t instance){
|
||||
|
||||
static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_MODIFICATION_REQ(msg_p);
|
||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||
@@ -3407,8 +3384,8 @@ static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, co
|
||||
itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p);
|
||||
}
|
||||
|
||||
static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const char *msg_name, instance_t instance){
|
||||
|
||||
static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = resp->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||
@@ -3460,11 +3437,10 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const ch
|
||||
|
||||
free(cellGroupConfig->rlc_BearerToAddModList);
|
||||
free(cellGroupConfig);
|
||||
|
||||
}
|
||||
|
||||
static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, const char *msg_name, instance_t instance){
|
||||
|
||||
static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
f1ap_ue_context_setup_t *resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = resp->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||
@@ -3845,8 +3821,7 @@ void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_contex
|
||||
void rrc_gNB_process_e1_bearer_context_setup_resp(e1ap_bearer_setup_resp_t *resp, instance_t instance) {
|
||||
// Find the UE context from UE ID and send ITTI message to F1AP to send UE context modification message to DU
|
||||
|
||||
uint16_t ue_initial_id = 0; // Making an invalid UE initial ID
|
||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_from_ngap_ids(instance, ue_initial_id, resp->gNB_cu_cp_ue_id);
|
||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_from_ngap_ids(instance, resp->gNB_cu_cp_ue_id);
|
||||
protocol_ctxt_t ctxt = {0};
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0, 0);
|
||||
|
||||
@@ -3930,8 +3905,7 @@ static void write_rrc_stats(const gNB_RRC_INST *rrc)
|
||||
///---------------------------------------------------------------------------------------------------------------///
|
||||
///---------------------------------------------------------------------------------------------------------------///
|
||||
void *rrc_gnb_task(void *args_p) {
|
||||
MessageDef *msg_p;
|
||||
const char *msg_name_p;
|
||||
MessageDef *msg_p;
|
||||
instance_t instance;
|
||||
int result;
|
||||
//SRB_INFO *srb_info_p;
|
||||
@@ -3948,9 +3922,9 @@ void *rrc_gnb_task(void *args_p) {
|
||||
while (1) {
|
||||
// Wait for a message
|
||||
itti_receive_msg(TASK_RRC_GNB, &msg_p);
|
||||
msg_name_p = ITTI_MSG_NAME(msg_p);
|
||||
const char *msg_name_p = ITTI_MSG_NAME(msg_p);
|
||||
instance = ITTI_MSG_DESTINATION_INSTANCE(msg_p);
|
||||
|
||||
LOG_D(NR_RRC, "Received Msg %s\n", msg_name_p);
|
||||
switch (ITTI_MSG_ID(msg_p)) {
|
||||
case TERMINATE_MESSAGE:
|
||||
LOG_W(NR_RRC, " *** Exiting NR_RRC thread\n");
|
||||
@@ -4000,53 +3974,50 @@ void *rrc_gnb_task(void *args_p) {
|
||||
break;
|
||||
|
||||
case NGAP_DOWNLINK_NAS:
|
||||
rrc_gNB_process_NGAP_DOWNLINK_NAS(msg_p, msg_name_p, instance, &rrc_gNB_mui);
|
||||
rrc_gNB_process_NGAP_DOWNLINK_NAS(msg_p, instance, &rrc_gNB_mui);
|
||||
break;
|
||||
|
||||
case NGAP_PDUSESSION_SETUP_REQ:
|
||||
rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(msg_p, msg_name_p, instance);
|
||||
rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(msg_p, instance);
|
||||
break;
|
||||
|
||||
case NGAP_PDUSESSION_MODIFY_REQ:
|
||||
rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(msg_p, msg_name_p, instance);
|
||||
rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(msg_p, instance);
|
||||
break;
|
||||
|
||||
case NGAP_PDUSESSION_RELEASE_COMMAND:
|
||||
rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(msg_p, msg_name_p, instance);
|
||||
rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(msg_p, instance);
|
||||
break;
|
||||
|
||||
/* Messages from gNB app */
|
||||
case NRRRC_CONFIGURATION_REQ:
|
||||
LOG_I(NR_RRC, "[gNB %ld] Received %s : %p\n", instance, msg_name_p,&NRRRC_CONFIGURATION_REQ(msg_p));
|
||||
openair_rrc_gNB_configuration(GNB_INSTANCE_TO_MODULE_ID(instance), &NRRRC_CONFIGURATION_REQ(msg_p));
|
||||
break;
|
||||
|
||||
/* Messages from F1AP task */
|
||||
case F1AP_SETUP_REQ:
|
||||
AssertFatal(NODE_IS_CU(RC.nrrrc[instance]->node_type),
|
||||
"should not receive F1AP_SETUP_REQUEST, need call by CU!\n");
|
||||
LOG_I(NR_RRC,"[gNB %ld] Received %s : %p\n", instance, msg_name_p, &F1AP_SETUP_REQ(msg_p));
|
||||
AssertFatal(NODE_IS_CU(RC.nrrrc[instance]->node_type), "should not receive F1AP_SETUP_REQUEST, need call by CU!\n");
|
||||
rrc_gNB_process_f1_setup_req(&F1AP_SETUP_REQ(msg_p));
|
||||
break;
|
||||
|
||||
case NR_DU_RRC_DL_INDICATION:
|
||||
rrc_process_DU_DL(msg_p, msg_name_p, instance);
|
||||
rrc_process_DU_DL(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_SETUP_REQ:
|
||||
rrc_DU_process_ue_context_setup_request(msg_p, msg_name_p, instance);
|
||||
rrc_DU_process_ue_context_setup_request(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_SETUP_RESP:
|
||||
rrc_CU_process_ue_context_setup_response(msg_p, msg_name_p, instance);
|
||||
rrc_CU_process_ue_context_setup_response(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_MODIFICATION_RESP:
|
||||
rrc_CU_process_ue_context_modification_response(msg_p, msg_name_p, instance);
|
||||
rrc_CU_process_ue_context_modification_response(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_MODIFICATION_REQ:
|
||||
rrc_DU_process_ue_context_modification_request(msg_p, msg_name_p, instance);
|
||||
rrc_DU_process_ue_context_modification_request(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_RELEASE_CMD:
|
||||
@@ -4065,7 +4036,7 @@ void *rrc_gnb_task(void *args_p) {
|
||||
break;
|
||||
|
||||
case NGAP_INITIAL_CONTEXT_SETUP_REQ:
|
||||
rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p, msg_name_p, instance);
|
||||
rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p, instance);
|
||||
break;
|
||||
|
||||
case X2AP_ENDC_SGNB_RELEASE_REQUEST:
|
||||
@@ -4078,24 +4049,22 @@ void *rrc_gnb_task(void *args_p) {
|
||||
break;
|
||||
|
||||
case NGAP_UE_CONTEXT_RELEASE_REQ:
|
||||
rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_REQ(msg_p, msg_name_p, instance);
|
||||
rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_REQ(msg_p, instance);
|
||||
break;
|
||||
|
||||
case NGAP_UE_CONTEXT_RELEASE_COMMAND:
|
||||
rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_COMMAND(msg_p, msg_name_p, instance);
|
||||
rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_COMMAND(msg_p, instance);
|
||||
break;
|
||||
|
||||
case E1AP_SETUP_REQ:
|
||||
LOG_I(NR_RRC, "Received E1AP_SETUP_REQ for instance %d\n", (int)instance);
|
||||
rrc_gNB_process_e1_setup_req(&E1AP_SETUP_REQ(msg_p), instance);
|
||||
break;
|
||||
|
||||
case E1AP_BEARER_CONTEXT_SETUP_RESP:
|
||||
LOG_I(NR_RRC, "Received E1AP_BEARER_CONTEXT_SETUP_RESP for instance %d\n", (int)instance);
|
||||
rrc_gNB_process_e1_bearer_context_setup_resp(&E1AP_BEARER_CONTEXT_SETUP_RESP(msg_p), instance);
|
||||
|
||||
case NGAP_PAGING_IND:
|
||||
rrc_gNB_process_PAGING_IND(msg_p, msg_name_p, instance);
|
||||
rrc_gNB_process_PAGING_IND(msg_p, instance);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -4138,8 +4107,8 @@ rrc_gNB_generate_SecurityModeCommand(
|
||||
case ngran_gNB_CU:
|
||||
case ngran_gNB_CUCP:
|
||||
// create an ITTI message
|
||||
memcpy(ue_context_pP->ue_context.Srb1.Srb_info.Tx_buffer.Payload, buffer, size);
|
||||
ue_context_pP->ue_context.Srb1.Srb_info.Tx_buffer.payload_size = size;
|
||||
memcpy(ue_context_pP->ue_context.Srb[1].Srb_info.Tx_buffer.Payload, buffer, size);
|
||||
ue_context_pP->ue_context.Srb[1].Srb_info.Tx_buffer.payload_size = size;
|
||||
|
||||
LOG_I(NR_RRC,"calling rrc_data_req :securityModeCommand\n");
|
||||
nr_rrc_data_req(ctxt_pP,
|
||||
|
||||
+715
-920
File diff suppressed because it is too large
Load Diff
@@ -40,18 +40,6 @@
|
||||
#include "NR_UL-DCCH-Message.h"
|
||||
#include "NGAP_CauseRadioNetwork.h"
|
||||
|
||||
typedef struct rrc_ue_ngap_ids_s {
|
||||
/* Tree related data */
|
||||
RB_ENTRY(rrc_ue_ngap_ids_s) entries;
|
||||
|
||||
// keys
|
||||
uint16_t ue_initial_id;
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
// value
|
||||
rnti_t ue_rnti;
|
||||
} rrc_ue_ngap_ids_t;
|
||||
|
||||
void
|
||||
rrc_gNB_send_NGAP_NAS_FIRST_REQ(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
@@ -59,12 +47,7 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ(
|
||||
NR_RRCSetupComplete_IEs_t *rrcSetupComplete
|
||||
);
|
||||
|
||||
int
|
||||
rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
|
||||
MessageDef *msg_p,
|
||||
const char *msg_name,
|
||||
instance_t instance
|
||||
);
|
||||
int rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, instance_t instance);
|
||||
|
||||
void
|
||||
rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(
|
||||
@@ -72,20 +55,7 @@ rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(
|
||||
rrc_gNB_ue_context_t *const ue_context_pP
|
||||
);
|
||||
|
||||
int
|
||||
rrc_gNB_process_security(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
ngap_security_capabilities_t *security_capabilities_pP
|
||||
);
|
||||
|
||||
int
|
||||
rrc_gNB_process_NGAP_DOWNLINK_NAS(
|
||||
MessageDef *msg_p,
|
||||
const char *msg_name,
|
||||
instance_t instance,
|
||||
mui_t *rrc_gNB_mui
|
||||
);
|
||||
int rrc_gNB_process_NGAP_DOWNLINK_NAS(MessageDef *msg_p, instance_t instance, mui_t *rrc_gNB_mui);
|
||||
|
||||
void
|
||||
rrc_gNB_send_NGAP_UPLINK_NAS(
|
||||
@@ -101,19 +71,9 @@ rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(
|
||||
uint8_t xid
|
||||
);
|
||||
|
||||
void
|
||||
rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
|
||||
MessageDef *msg_p,
|
||||
const char *msg_name,
|
||||
instance_t instance
|
||||
);
|
||||
void rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(MessageDef *msg_p, instance_t instance);
|
||||
|
||||
int
|
||||
rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(
|
||||
MessageDef *msg_p,
|
||||
const char *msg_name,
|
||||
instance_t instance
|
||||
);
|
||||
int rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(MessageDef *msg_p, instance_t instance);
|
||||
|
||||
int
|
||||
rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(
|
||||
@@ -128,38 +88,13 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
|
||||
rrc_gNB_ue_context_t *ue_context_pP
|
||||
);
|
||||
|
||||
void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP, const rrc_gNB_ue_context_t *const ue_context_pP, const NGAP_Cause_PR causeP, const long cause_valueP);
|
||||
|
||||
void
|
||||
rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(
|
||||
const module_id_t gnb_mod_idP,
|
||||
const rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
const ngap_Cause_t causeP,
|
||||
const long cause_valueP
|
||||
);
|
||||
int rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_REQ(MessageDef *msg_p, instance_t instance);
|
||||
|
||||
int
|
||||
rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_REQ (
|
||||
MessageDef *msg_p,
|
||||
const char *msg_name,
|
||||
instance_t instance
|
||||
);
|
||||
int rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_COMMAND(MessageDef *msg_p, instance_t instance);
|
||||
|
||||
int
|
||||
rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_COMMAND(
|
||||
MessageDef *msg_p,
|
||||
const char *msg_name,
|
||||
instance_t instance
|
||||
);
|
||||
|
||||
void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_COMPLETE(
|
||||
instance_t instance,
|
||||
uint32_t gNB_ue_ngap_id);
|
||||
|
||||
void
|
||||
rrc_gNB_NGAP_remove_ue_ids(
|
||||
gNB_RRC_INST *const rrc_instance_pP,
|
||||
struct rrc_ue_ngap_ids_s *const ue_ids_pP
|
||||
);
|
||||
void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, uint32_t gNB_ue_ngap_id);
|
||||
|
||||
void
|
||||
rrc_gNB_send_NGAP_UE_CAPABILITIES_IND(
|
||||
@@ -168,12 +103,7 @@ rrc_gNB_send_NGAP_UE_CAPABILITIES_IND(
|
||||
NR_UL_DCCH_Message_t *const ul_dcch_msg
|
||||
);
|
||||
|
||||
int
|
||||
rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(
|
||||
MessageDef *msg_p,
|
||||
const char *msg_name,
|
||||
instance_t instance
|
||||
);
|
||||
int rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(MessageDef *msg_p, instance_t instance);
|
||||
|
||||
void
|
||||
rrc_gNB_send_NGAP_PDUSESSION_RELEASE_RESPONSE(
|
||||
@@ -189,17 +119,6 @@ nr_rrc_pdcp_config_security(
|
||||
const uint8_t send_security_mode_command
|
||||
);
|
||||
|
||||
struct rrc_gNB_ue_context_s *
|
||||
rrc_gNB_get_ue_context_from_ngap_ids(
|
||||
const instance_t instanceP,
|
||||
const uint16_t ue_initial_idP,
|
||||
const uint32_t gNB_ue_ngap_idP
|
||||
);
|
||||
|
||||
int
|
||||
rrc_gNB_process_PAGING_IND(
|
||||
MessageDef *msg_p,
|
||||
const char *msg_name,
|
||||
instance_t instance);
|
||||
int rrc_gNB_process_PAGING_IND(MessageDef *msg_p, instance_t instance);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -22,19 +22,16 @@
|
||||
#include "rrc_gNB_radio_bearers.h"
|
||||
#include "oai_asn1.h"
|
||||
|
||||
NR_DRB_ToAddMod_t *generateDRB(gNB_RRC_UE_t *ue, uint8_t drb_id, pdu_session_param_t *pduSession, bool enable_sdap, int do_drb_integrity, int do_drb_ciphering)
|
||||
NR_DRB_ToAddMod_t *generateDRB(gNB_RRC_UE_t *ue, uint8_t drb_id, rrc_pdu_session_param_t *pduSession, bool enable_sdap, int do_drb_integrity, int do_drb_ciphering)
|
||||
{
|
||||
NR_DRB_ToAddMod_t *DRB_config = NULL;
|
||||
NR_SDAP_Config_t *SDAP_config = NULL;
|
||||
|
||||
DRB_config = CALLOC(1, sizeof(*DRB_config));
|
||||
NR_DRB_ToAddMod_t *DRB_config = CALLOC(1, sizeof(*DRB_config));
|
||||
DRB_config->drb_Identity = drb_id;
|
||||
DRB_config->cnAssociation = CALLOC(1, sizeof(*DRB_config->cnAssociation));
|
||||
DRB_config->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_sdap_Config;
|
||||
|
||||
asn1cCalloc(DRB_config->cnAssociation, association);
|
||||
association->present = NR_DRB_ToAddMod__cnAssociation_PR_sdap_Config;
|
||||
|
||||
/* SDAP Configuration */
|
||||
SDAP_config = CALLOC(1, sizeof(NR_SDAP_Config_t));
|
||||
SDAP_config->mappedQoS_FlowsToAdd = calloc(1, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
|
||||
NR_SDAP_Config_t *SDAP_config = CALLOC(1, sizeof(NR_SDAP_Config_t));
|
||||
asn1cCalloc(SDAP_config->mappedQoS_FlowsToAdd, sdapFlows);
|
||||
|
||||
SDAP_config->pdu_Session = pduSession->param.pdusession_id;
|
||||
|
||||
@@ -50,7 +47,7 @@ NR_DRB_ToAddMod_t *generateDRB(gNB_RRC_UE_t *ue, uint8_t drb_id, pdu_session_par
|
||||
|
||||
for (int qos_flow_index = 0; qos_flow_index < pduSession->param.nb_qos; qos_flow_index++)
|
||||
{
|
||||
NR_QFI_t *qfi = calloc(1, sizeof(NR_QFI_t));
|
||||
asn1cSequenceAdd(sdapFlows->list, NR_QFI_t, qfi);
|
||||
*qfi = pduSession->param.qos[qos_flow_index].qfi;
|
||||
asn1cSeqAdd(&SDAP_config->mappedQoS_FlowsToAdd->list, qfi);
|
||||
|
||||
@@ -59,44 +56,29 @@ NR_DRB_ToAddMod_t *generateDRB(gNB_RRC_UE_t *ue, uint8_t drb_id, pdu_session_par
|
||||
else
|
||||
pduSession->param.used_drbs[drb_id - 1] = DRB_ACTIVE;
|
||||
}
|
||||
|
||||
SDAP_config->mappedQoS_FlowsToRelease = NULL;
|
||||
DRB_config->cnAssociation->choice.sdap_Config = SDAP_config;
|
||||
|
||||
|
||||
association->choice.sdap_Config = SDAP_config;
|
||||
|
||||
/* PDCP Configuration */
|
||||
DRB_config->reestablishPDCP = NULL;
|
||||
DRB_config->recoverPDCP = NULL;
|
||||
DRB_config->pdcp_Config = calloc(1, sizeof(*DRB_config->pdcp_Config));
|
||||
DRB_config->pdcp_Config->drb = calloc(1,sizeof(*DRB_config->pdcp_Config->drb));
|
||||
asn1cCalloc(DRB_config->pdcp_Config, pdcpConfig);
|
||||
asn1cCalloc(pdcpConfig->drb, drb);
|
||||
|
||||
DRB_config->pdcp_Config->drb->discardTimer = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->discardTimer));
|
||||
*DRB_config->pdcp_Config->drb->discardTimer = NR_PDCP_Config__drb__discardTimer_infinity;
|
||||
DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL));
|
||||
*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits;
|
||||
DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL));
|
||||
*DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits;
|
||||
asn1cCallocOne(drb->discardTimer, NR_PDCP_Config__drb__discardTimer_infinity);
|
||||
|
||||
asn1cCallocOne(drb->pdcp_SN_SizeUL, NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits);
|
||||
asn1cCallocOne(drb->pdcp_SN_SizeDL, NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits);
|
||||
|
||||
drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed;
|
||||
drb->headerCompression.choice.notUsed = 0;
|
||||
|
||||
asn1cCallocOne(pdcpConfig->t_Reordering, NR_PDCP_Config__t_Reordering_ms0);
|
||||
|
||||
DRB_config->pdcp_Config->drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed;
|
||||
DRB_config->pdcp_Config->drb->headerCompression.choice.notUsed = 0;
|
||||
|
||||
DRB_config->pdcp_Config->drb->integrityProtection = NULL;
|
||||
DRB_config->pdcp_Config->drb->statusReportRequired = NULL;
|
||||
DRB_config->pdcp_Config->drb->outOfOrderDelivery = NULL;
|
||||
DRB_config->pdcp_Config->moreThanOneRLC = NULL;
|
||||
|
||||
DRB_config->pdcp_Config->t_Reordering = calloc(1, sizeof(*DRB_config->pdcp_Config->t_Reordering));
|
||||
*DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0;
|
||||
DRB_config->pdcp_Config->ext1 = NULL;
|
||||
|
||||
if (do_drb_integrity) {
|
||||
DRB_config->pdcp_Config->drb->integrityProtection = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->integrityProtection));
|
||||
*DRB_config->pdcp_Config->drb->integrityProtection = NR_PDCP_Config__drb__integrityProtection_enabled;
|
||||
asn1cCallocOne(drb->integrityProtection, NR_PDCP_Config__drb__integrityProtection_enabled);
|
||||
}
|
||||
|
||||
if (!do_drb_ciphering) {
|
||||
DRB_config->pdcp_Config->ext1 = calloc(1, sizeof(*DRB_config->pdcp_Config->ext1));
|
||||
DRB_config->pdcp_Config->ext1->cipheringDisabled = calloc(1, sizeof(*DRB_config->pdcp_Config->ext1->cipheringDisabled));
|
||||
*DRB_config->pdcp_Config->ext1->cipheringDisabled = NR_PDCP_Config__ext1__cipheringDisabled_true;
|
||||
asn1cCalloc(pdcpConfig->ext1, ext1);
|
||||
asn1cCallocOne(ext1->cipheringDisabled, NR_PDCP_Config__ext1__cipheringDisabled_true);
|
||||
}
|
||||
|
||||
ue->DRB_active[drb_id-1] = DRB_ACTIVE;
|
||||
@@ -104,7 +86,7 @@ NR_DRB_ToAddMod_t *generateDRB(gNB_RRC_UE_t *ue, uint8_t drb_id, pdu_session_par
|
||||
return DRB_config;
|
||||
}
|
||||
|
||||
uint8_t next_available_drb(gNB_RRC_UE_t *ue, pdu_session_param_t *pdusession, bool is_gbr)
|
||||
uint8_t next_available_drb(gNB_RRC_UE_t *ue, rrc_pdu_session_param_t *pdusession, bool is_gbr)
|
||||
{
|
||||
uint8_t drb_id;
|
||||
|
||||
|
||||
@@ -35,10 +35,8 @@
|
||||
#define GBR_FLOW (1)
|
||||
#define NONGBR_FLOW (0)
|
||||
|
||||
NR_DRB_ToAddMod_t *generateDRB(gNB_RRC_UE_t *rrc_ue, uint8_t drb_id, pdu_session_param_t *pduSession, bool enable_sdap, int do_drb_integrity, int do_drb_ciphering);
|
||||
|
||||
uint8_t next_available_drb(gNB_RRC_UE_t *ue, pdu_session_param_t *pdusession, bool is_gbr);
|
||||
|
||||
NR_DRB_ToAddMod_t *generateDRB(gNB_RRC_UE_t *rrc_ue, uint8_t drb_id, rrc_pdu_session_param_t *pduSession, bool enable_sdap, int do_drb_integrity, int do_drb_ciphering);
|
||||
uint8_t next_available_drb(gNB_RRC_UE_t *ue, rrc_pdu_session_param_t *pdusession, bool is_gbr);
|
||||
bool drb_is_active(gNB_RRC_UE_t *ue, uint8_t drb_id);
|
||||
|
||||
#endif
|
||||
|
||||
+20
-20
@@ -113,27 +113,27 @@ extern int asn1_xer_print;
|
||||
# define NGAP_DEBUG(x, args...) do { fprintf(stdout, "[NGAP][D]"x, ##args); } while(0)
|
||||
#endif
|
||||
|
||||
#define NGAP_FIND_PROTOCOLIE_BY_ID(IE_TYPE, ie, container, IE_ID, mandatory) \
|
||||
do { \
|
||||
IE_TYPE **ptr; \
|
||||
ie = NULL; \
|
||||
for (ptr = container->protocolIEs.list.array; ptr < &container->protocolIEs.list.array[container->protocolIEs.list.count]; ptr++) { \
|
||||
if ((*ptr)->id == IE_ID) { \
|
||||
ie = *ptr; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (ie == NULL) { \
|
||||
if (mandatory) { \
|
||||
AssertFatal(NGAP, "NGAP_FIND_PROTOCOLIE_BY_ID ie is NULL (searching for ie: %ld)\n", IE_ID); \
|
||||
} else { \
|
||||
NGAP_INFO("NGAP_FIND_PROTOCOLIE_BY_ID ie is NULL (searching for ie: %ld)\n", IE_ID); \
|
||||
} \
|
||||
} \
|
||||
} while (0); \
|
||||
if (mandatory && !ie) \
|
||||
return -1
|
||||
|
||||
#define NGAP_FIND_PROTOCOLIE_BY_ID(IE_TYPE, ie, container, IE_ID, mandatory) \
|
||||
do {\
|
||||
IE_TYPE **ptr; \
|
||||
ie = NULL; \
|
||||
for (ptr = container->protocolIEs.list.array; \
|
||||
ptr < &container->protocolIEs.list.array[container->protocolIEs.list.count]; \
|
||||
ptr++) { \
|
||||
if((*ptr)->id == IE_ID) { \
|
||||
ie = *ptr; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (ie == NULL ) { \
|
||||
if (mandatory) {\
|
||||
NGAP_ERROR("NGAP_FIND_PROTOCOLIE_BY_ID: %s %d: ie is NULL (searching for ie: %ld)\n",__FILE__,__LINE__, IE_ID);\
|
||||
abort();\
|
||||
}\
|
||||
else NGAP_INFO("NGAP_FIND_PROTOCOLIE_BY_ID: %s %d: ie is NULL (searching for ie: %ld)\n",__FILE__,__LINE__, IE_ID);\
|
||||
} \
|
||||
} while(0)
|
||||
/** \brief Function callback prototype.
|
||||
**/
|
||||
typedef int (*ngap_message_decoded_callback)(
|
||||
|
||||
+77
-117
@@ -162,7 +162,6 @@ void ngap_gNB_handle_register_gNB(instance_t instance, ngap_register_gnb_req_t *
|
||||
} else {
|
||||
new_instance = calloc(1, sizeof(ngap_gNB_instance_t));
|
||||
DevAssert(new_instance != NULL);
|
||||
RB_INIT(&new_instance->ngap_ue_head);
|
||||
RB_INIT(&new_instance->ngap_amf_head);
|
||||
/* Copy usefull parameters */
|
||||
new_instance->instance = instance;
|
||||
@@ -276,127 +275,88 @@ void *ngap_gNB_process_itti_msg(void *notUsed) {
|
||||
MessageDef *received_msg = NULL;
|
||||
int result;
|
||||
itti_receive_msg(TASK_NGAP, &received_msg);
|
||||
if (received_msg) {
|
||||
instance_t instance = ITTI_MSG_DESTINATION_INSTANCE(received_msg);
|
||||
LOG_D(RRC, "Received message %s\n", ITTI_MSG_NAME(received_msg));
|
||||
switch (ITTI_MSG_ID(received_msg)) {
|
||||
case TERMINATE_MESSAGE:
|
||||
NGAP_WARN(" *** Exiting NGAP thread\n");
|
||||
itti_exit_task();
|
||||
break;
|
||||
|
||||
switch (ITTI_MSG_ID(received_msg)) {
|
||||
case TERMINATE_MESSAGE:
|
||||
NGAP_WARN(" *** Exiting NGAP thread\n");
|
||||
itti_exit_task();
|
||||
break;
|
||||
case NGAP_REGISTER_GNB_REQ: {
|
||||
/* Register a new gNB.
|
||||
* in Virtual mode gNBs will be distinguished using the mod_id/
|
||||
* Each gNB has to send an NGAP_REGISTER_GNB message with its
|
||||
* own parameters.
|
||||
*/
|
||||
ngap_gNB_handle_register_gNB(instance, &NGAP_REGISTER_GNB_REQ(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_REGISTER_GNB_REQ: {
|
||||
/* Register a new gNB.
|
||||
* in Virtual mode gNBs will be distinguished using the mod_id/
|
||||
* Each gNB has to send an NGAP_REGISTER_GNB message with its
|
||||
* own parameters.
|
||||
*/
|
||||
ngap_gNB_handle_register_gNB(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_REGISTER_GNB_REQ(received_msg));
|
||||
case SCTP_NEW_ASSOCIATION_RESP: {
|
||||
ngap_gNB_handle_sctp_association_resp(instance, &received_msg->ittiMsg.sctp_new_association_resp);
|
||||
} break;
|
||||
|
||||
case SCTP_DATA_IND: {
|
||||
ngap_gNB_handle_sctp_data_ind(&received_msg->ittiMsg.sctp_data_ind);
|
||||
} break;
|
||||
|
||||
case NGAP_NAS_FIRST_REQ: {
|
||||
ngap_gNB_handle_nas_first_req(instance, &NGAP_NAS_FIRST_REQ(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_UPLINK_NAS: {
|
||||
ngap_gNB_nas_uplink(instance, &NGAP_UPLINK_NAS(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_UE_CAPABILITIES_IND: {
|
||||
ngap_gNB_ue_capabilities(instance, &NGAP_UE_CAPABILITIES_IND(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_INITIAL_CONTEXT_SETUP_RESP: {
|
||||
ngap_gNB_initial_ctxt_resp(instance, &NGAP_INITIAL_CONTEXT_SETUP_RESP(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_PDUSESSION_SETUP_RESP: {
|
||||
ngap_gNB_pdusession_setup_resp(instance, &NGAP_PDUSESSION_SETUP_RESP(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_PDUSESSION_MODIFY_RESP: {
|
||||
ngap_gNB_pdusession_modify_resp(instance, &NGAP_PDUSESSION_MODIFY_RESP(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_NAS_NON_DELIVERY_IND: {
|
||||
ngap_gNB_nas_non_delivery_ind(instance, &NGAP_NAS_NON_DELIVERY_IND(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_PATH_SWITCH_REQ: {
|
||||
ngap_gNB_path_switch_req(instance, &NGAP_PATH_SWITCH_REQ(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_PDUSESSION_MODIFICATION_IND: {
|
||||
ngap_gNB_generate_PDUSESSION_Modification_Indication(instance, &NGAP_PDUSESSION_MODIFICATION_IND(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_UE_CONTEXT_RELEASE_COMPLETE: {
|
||||
ngap_ue_context_release_complete(instance, &NGAP_UE_CONTEXT_RELEASE_COMPLETE(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_UE_CONTEXT_RELEASE_REQ: {
|
||||
ngap_ue_context_release_req(instance, &NGAP_UE_CONTEXT_RELEASE_REQ(received_msg));
|
||||
} break;
|
||||
|
||||
case NGAP_PDUSESSION_RELEASE_RESPONSE: {
|
||||
ngap_gNB_pdusession_release_resp(instance, &NGAP_PDUSESSION_RELEASE_RESPONSE(received_msg));
|
||||
} break;
|
||||
|
||||
default:
|
||||
NGAP_ERROR("Received unhandled message: %d:%s\n", ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SCTP_NEW_ASSOCIATION_RESP: {
|
||||
ngap_gNB_handle_sctp_association_resp(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&received_msg->ittiMsg.sctp_new_association_resp);
|
||||
}
|
||||
break;
|
||||
|
||||
case SCTP_DATA_IND: {
|
||||
ngap_gNB_handle_sctp_data_ind(&received_msg->ittiMsg.sctp_data_ind);
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_NAS_FIRST_REQ: {
|
||||
ngap_gNB_handle_nas_first_req(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_NAS_FIRST_REQ(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_UPLINK_NAS: {
|
||||
ngap_gNB_nas_uplink(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_UPLINK_NAS(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_UE_CAPABILITIES_IND: {
|
||||
ngap_gNB_ue_capabilities(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_UE_CAPABILITIES_IND(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_INITIAL_CONTEXT_SETUP_RESP: {
|
||||
ngap_gNB_initial_ctxt_resp(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_INITIAL_CONTEXT_SETUP_RESP(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_PDUSESSION_SETUP_RESP: {
|
||||
ngap_gNB_pdusession_setup_resp(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_PDUSESSION_SETUP_RESP(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_PDUSESSION_MODIFY_RESP: {
|
||||
ngap_gNB_pdusession_modify_resp(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_PDUSESSION_MODIFY_RESP(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_NAS_NON_DELIVERY_IND: {
|
||||
ngap_gNB_nas_non_delivery_ind(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_NAS_NON_DELIVERY_IND(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_PATH_SWITCH_REQ: {
|
||||
ngap_gNB_path_switch_req(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_PATH_SWITCH_REQ(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_PDUSESSION_MODIFICATION_IND: {
|
||||
ngap_gNB_generate_PDUSESSION_Modification_Indication(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_PDUSESSION_MODIFICATION_IND(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_UE_CONTEXT_RELEASE_COMPLETE: {
|
||||
ngap_ue_context_release_complete(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_UE_CONTEXT_RELEASE_COMPLETE(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_UE_CONTEXT_RELEASE_REQ: {
|
||||
ngap_gNB_instance_t *ngap_gNB_instance_p = NULL; // test
|
||||
struct ngap_gNB_ue_context_s *ue_context_p = NULL; // test
|
||||
ngap_ue_context_release_req(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_UE_CONTEXT_RELEASE_REQ(received_msg));
|
||||
ngap_gNB_instance_p = ngap_gNB_get_instance(ITTI_MSG_DESTINATION_INSTANCE(received_msg)); // test
|
||||
DevAssert(ngap_gNB_instance_p != NULL); // test
|
||||
|
||||
if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
|
||||
NGAP_UE_CONTEXT_RELEASE_REQ(received_msg).gNB_ue_ngap_id)) == NULL) { // test
|
||||
/* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
|
||||
NGAP_ERROR("Failed to find ue context associated with gNB ue ngap id: %u\n",
|
||||
NGAP_UE_CONTEXT_RELEASE_REQ(received_msg).gNB_ue_ngap_id); // test
|
||||
} // test
|
||||
}
|
||||
break;
|
||||
|
||||
case NGAP_PDUSESSION_RELEASE_RESPONSE: {
|
||||
ngap_gNB_pdusession_release_resp(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&NGAP_PDUSESSION_RELEASE_RESPONSE(received_msg));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
NGAP_ERROR("Received unhandled message: %d:%s\n",
|
||||
ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg));
|
||||
break;
|
||||
result = itti_free(ITTI_MSG_ORIGIN_ID(received_msg), received_msg);
|
||||
AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
||||
}
|
||||
|
||||
result = itti_free (ITTI_MSG_ORIGIN_ID(received_msg), received_msg);
|
||||
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
||||
received_msg = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,9 +58,7 @@ int ngap_ue_context_release_complete(instance_t instance,
|
||||
|
||||
ngap_gNB_instance_t *ngap_gNB_instance_p = NULL;
|
||||
struct ngap_gNB_ue_context_s *ue_context_p = NULL;
|
||||
NGAP_NGAP_PDU_t pdu;
|
||||
NGAP_UEContextReleaseComplete_t *out;
|
||||
NGAP_UEContextReleaseComplete_IEs_t *ie;
|
||||
NGAP_NGAP_PDU_t pdu = {0};
|
||||
uint8_t *buffer;
|
||||
uint32_t length;
|
||||
|
||||
@@ -70,13 +68,7 @@ int ngap_ue_context_release_complete(instance_t instance,
|
||||
DevAssert(ue_release_complete_p != NULL);
|
||||
DevAssert(ngap_gNB_instance_p != NULL);
|
||||
|
||||
/*RB_FOREACH(ue_context_p, ngap_ue_map, &ngap_gNB_instance_p->ngap_ue_head) {
|
||||
NGAP_WARN("in ngap_ue_map: UE context gNB_ue_ngap_id %u amf_ue_ngap_id %u state %u\n",
|
||||
ue_context_p->gNB_ue_ngap_id, ue_context_p->amf_ue_ngap_id,
|
||||
ue_context_p->ue_state);
|
||||
}*/
|
||||
if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
|
||||
ue_release_complete_p->gNB_ue_ngap_id)) == NULL) {
|
||||
if ((ue_context_p = ngap_get_ue_context(ue_release_complete_p->gNB_ue_ngap_id)) == NULL) {
|
||||
/* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
|
||||
NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %u\n",
|
||||
ue_release_complete_p->gNB_ue_ngap_id);
|
||||
@@ -84,30 +76,30 @@ int ngap_ue_context_release_complete(instance_t instance,
|
||||
}
|
||||
|
||||
/* Prepare the NGAP message to encode */
|
||||
memset(&pdu, 0, sizeof(pdu));
|
||||
pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
|
||||
pdu.choice.successfulOutcome = CALLOC(1, sizeof(struct NGAP_SuccessfulOutcome));
|
||||
pdu.choice.successfulOutcome->procedureCode = NGAP_ProcedureCode_id_UEContextRelease;
|
||||
pdu.choice.successfulOutcome->criticality = NGAP_Criticality_reject;
|
||||
pdu.choice.successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_UEContextReleaseComplete;
|
||||
out = &pdu.choice.successfulOutcome->value.choice.UEContextReleaseComplete;
|
||||
asn1cCalloc(pdu.choice.successfulOutcome, head);
|
||||
head->procedureCode = NGAP_ProcedureCode_id_UEContextRelease;
|
||||
head->criticality = NGAP_Criticality_reject;
|
||||
head->value.present = NGAP_SuccessfulOutcome__value_PR_UEContextReleaseComplete;
|
||||
NGAP_UEContextReleaseComplete_t *out = &head->value.choice.UEContextReleaseComplete;
|
||||
|
||||
/* mandatory */
|
||||
ie = (NGAP_UEContextReleaseComplete_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseComplete_IEs_t));
|
||||
ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
|
||||
ie->criticality = NGAP_Criticality_ignore;
|
||||
ie->value.present = NGAP_UEContextReleaseComplete_IEs__value_PR_AMF_UE_NGAP_ID;
|
||||
asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
|
||||
asn1cSeqAdd(&out->protocolIEs.list, ie);
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UEContextReleaseComplete_IEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
|
||||
ie->criticality = NGAP_Criticality_ignore;
|
||||
ie->value.present = NGAP_UEContextReleaseComplete_IEs__value_PR_AMF_UE_NGAP_ID;
|
||||
asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
|
||||
}
|
||||
|
||||
/* mandatory */
|
||||
ie = (NGAP_UEContextReleaseComplete_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseComplete_IEs_t));
|
||||
ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
|
||||
ie->criticality = NGAP_Criticality_ignore;
|
||||
ie->value.present = NGAP_UEContextReleaseComplete_IEs__value_PR_RAN_UE_NGAP_ID;
|
||||
ie->value.choice.RAN_UE_NGAP_ID = ue_release_complete_p->gNB_ue_ngap_id;
|
||||
asn1cSeqAdd(&out->protocolIEs.list, ie);
|
||||
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UEContextReleaseComplete_IEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
|
||||
ie->criticality = NGAP_Criticality_ignore;
|
||||
ie->value.present = NGAP_UEContextReleaseComplete_IEs__value_PR_RAN_UE_NGAP_ID;
|
||||
ie->value.choice.RAN_UE_NGAP_ID = ue_release_complete_p->gNB_ue_ngap_id;
|
||||
}
|
||||
|
||||
if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
/* Encode procedure has failed... */
|
||||
@@ -123,35 +115,18 @@ int ngap_ue_context_release_complete(instance_t instance,
|
||||
//LG ngap_gNB_itti_send_sctp_close_association(ngap_gNB_instance_p->instance,
|
||||
// ue_context_p->amf_ref->assoc_id);
|
||||
// release UE context
|
||||
struct ngap_gNB_ue_context_s *ue_context2_p = NULL;
|
||||
|
||||
if ((ue_context2_p = RB_REMOVE(ngap_ue_map, &ngap_gNB_instance_p->ngap_ue_head, ue_context_p))
|
||||
!= NULL) {
|
||||
NGAP_WARN("Removed UE context gNB_ue_ngap_id %u\n",
|
||||
ue_context2_p->gNB_ue_ngap_id);
|
||||
ngap_gNB_free_ue_context(ue_context2_p);
|
||||
} else {
|
||||
NGAP_WARN("Removing UE context gNB_ue_ngap_id %u: did not find context\n",
|
||||
ue_context_p->gNB_ue_ngap_id);
|
||||
}
|
||||
/*RB_FOREACH(ue_context_p, ngap_ue_map, &ngap_gNB_instance_p->ngap_ue_head) {
|
||||
NGAP_WARN("in ngap_ue_map: UE context gNB_ue_ngap_id %u amf_ue_ngap_id %u state %u\n",
|
||||
ue_context_p->gNB_ue_ngap_id, ue_context_p->amf_ue_ngap_id,
|
||||
ue_context_p->ue_state);
|
||||
}*/
|
||||
|
||||
ngap_gNB_ue_context_t *tmp = ngap_detach_ue_context(ue_release_complete_p->gNB_ue_ngap_id);
|
||||
if (tmp)
|
||||
free(tmp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int ngap_ue_context_release_req(instance_t instance,
|
||||
ngap_ue_release_req_t *ue_release_req_p)
|
||||
{
|
||||
ngap_gNB_instance_t *ngap_gNB_instance_p = NULL;
|
||||
struct ngap_gNB_ue_context_s *ue_context_p = NULL;
|
||||
NGAP_NGAP_PDU_t pdu;
|
||||
NGAP_UEContextReleaseRequest_t *out;
|
||||
NGAP_UEContextReleaseRequest_IEs_t *ie;
|
||||
NGAP_NGAP_PDU_t pdu = {0};
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t length;
|
||||
/* Retrieve the NGAP gNB instance associated with Mod_id */
|
||||
@@ -160,8 +135,7 @@ int ngap_ue_context_release_req(instance_t instance,
|
||||
DevAssert(ue_release_req_p != NULL);
|
||||
DevAssert(ngap_gNB_instance_p != NULL);
|
||||
|
||||
if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
|
||||
ue_release_req_p->gNB_ue_ngap_id)) == NULL) {
|
||||
if ((ue_context_p = ngap_get_ue_context(ue_release_req_p->gNB_ue_ngap_id)) == NULL) {
|
||||
/* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
|
||||
NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %u\n",
|
||||
ue_release_req_p->gNB_ue_ngap_id);
|
||||
@@ -169,33 +143,34 @@ int ngap_ue_context_release_req(instance_t instance,
|
||||
}
|
||||
|
||||
/* Prepare the NGAP message to encode */
|
||||
memset(&pdu, 0, sizeof(pdu));
|
||||
pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
|
||||
pdu.choice.initiatingMessage = CALLOC(1, sizeof(struct NGAP_InitiatingMessage));
|
||||
pdu.choice.initiatingMessage->procedureCode = NGAP_ProcedureCode_id_UEContextReleaseRequest;
|
||||
pdu.choice.initiatingMessage->criticality = NGAP_Criticality_ignore;
|
||||
pdu.choice.initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_UEContextReleaseRequest;
|
||||
out = &pdu.choice.initiatingMessage->value.choice.UEContextReleaseRequest;
|
||||
asn1cCalloc(pdu.choice.initiatingMessage, head);
|
||||
head->procedureCode = NGAP_ProcedureCode_id_UEContextReleaseRequest;
|
||||
head->criticality = NGAP_Criticality_ignore;
|
||||
head->value.present = NGAP_InitiatingMessage__value_PR_UEContextReleaseRequest;
|
||||
NGAP_UEContextReleaseRequest_t *out = &head->value.choice.UEContextReleaseRequest;
|
||||
|
||||
/* mandatory */
|
||||
ie = (NGAP_UEContextReleaseRequest_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseRequest_IEs_t));
|
||||
ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_AMF_UE_NGAP_ID;
|
||||
asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
|
||||
asn1cSeqAdd(&out->protocolIEs.list, ie);
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UEContextReleaseRequest_IEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_AMF_UE_NGAP_ID;
|
||||
asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
|
||||
}
|
||||
|
||||
/* mandatory */
|
||||
ie = (NGAP_UEContextReleaseRequest_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseRequest_IEs_t));
|
||||
ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_RAN_UE_NGAP_ID;
|
||||
ie->value.choice.RAN_UE_NGAP_ID = ue_release_req_p->gNB_ue_ngap_id;
|
||||
asn1cSeqAdd(&out->protocolIEs.list, ie);
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UEContextReleaseRequest_IEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_RAN_UE_NGAP_ID;
|
||||
ie->value.choice.RAN_UE_NGAP_ID = ue_release_req_p->gNB_ue_ngap_id;
|
||||
}
|
||||
|
||||
/* optional */
|
||||
if (ue_release_req_p->nb_of_pdusessions > 0) {
|
||||
ie = (NGAP_UEContextReleaseRequest_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseRequest_IEs_t));
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UEContextReleaseRequest_IEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceListCxtRelReq;
|
||||
ie->criticality = NGAP_Criticality_reject;
|
||||
ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_PDUSessionResourceListCxtRelReq;
|
||||
@@ -205,51 +180,19 @@ int ngap_ue_context_release_req(instance_t instance,
|
||||
item->pDUSessionID = ue_release_req_p->pdusessions[i].pdusession_id;
|
||||
asn1cSeqAdd(&ie->value.choice.PDUSessionResourceListCxtRelReq.list, item);
|
||||
}
|
||||
asn1cSeqAdd(&out->protocolIEs.list, ie);
|
||||
}
|
||||
|
||||
/* mandatory */
|
||||
ie = (NGAP_UEContextReleaseRequest_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseRequest_IEs_t));
|
||||
ie->id = NGAP_ProtocolIE_ID_id_Cause;
|
||||
ie->criticality = NGAP_Criticality_ignore;
|
||||
ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_Cause;
|
||||
|
||||
switch (ue_release_req_p->cause) {
|
||||
case NGAP_Cause_PR_radioNetwork:
|
||||
ie->value.choice.Cause.present = NGAP_Cause_PR_radioNetwork;
|
||||
ie->value.choice.Cause.choice.radioNetwork = ue_release_req_p->cause_value;
|
||||
break;
|
||||
|
||||
case NGAP_Cause_PR_transport:
|
||||
ie->value.choice.Cause.present = NGAP_Cause_PR_transport;
|
||||
ie->value.choice.Cause.choice.transport = ue_release_req_p->cause_value;
|
||||
break;
|
||||
|
||||
case NGAP_Cause_PR_nas:
|
||||
ie->value.choice.Cause.present = NGAP_Cause_PR_nas;
|
||||
ie->value.choice.Cause.choice.nas = ue_release_req_p->cause_value;
|
||||
break;
|
||||
|
||||
case NGAP_Cause_PR_protocol:
|
||||
ie->value.choice.Cause.present = NGAP_Cause_PR_protocol;
|
||||
ie->value.choice.Cause.choice.protocol = ue_release_req_p->cause_value;
|
||||
break;
|
||||
|
||||
case NGAP_Cause_PR_misc:
|
||||
ie->value.choice.Cause.present = NGAP_Cause_PR_misc;
|
||||
ie->value.choice.Cause.choice.misc = ue_release_req_p->cause_value;
|
||||
break;
|
||||
|
||||
case NGAP_Cause_PR_NOTHING:
|
||||
default:
|
||||
ie->value.choice.Cause.present = NGAP_Cause_PR_NOTHING;
|
||||
break;
|
||||
{
|
||||
asn1cSequenceAdd(out->protocolIEs.list, NGAP_UEContextReleaseRequest_IEs_t, ie);
|
||||
ie->id = NGAP_ProtocolIE_ID_id_Cause;
|
||||
ie->criticality = NGAP_Criticality_ignore;
|
||||
ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_Cause;
|
||||
DevAssert(ue_release_req_p->cause <= NGAP_Cause_PR_choice_Extensions);
|
||||
ie->value.choice.Cause.present = ue_release_req_p->cause;
|
||||
ie->value.choice.Cause.choice.misc = ue_release_req_p->cause_value;
|
||||
}
|
||||
|
||||
asn1cSeqAdd(&out->protocolIEs.list, ie);
|
||||
|
||||
|
||||
|
||||
if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
|
||||
/* Encode procedure has failed... */
|
||||
NGAP_ERROR("Failed to encode UE context release complete\n");
|
||||
|
||||
@@ -156,13 +156,8 @@ int ngap_gNB_decode_pdu(NGAP_NGAP_PDU_t *pdu, const uint8_t *const buffer,
|
||||
asn_dec_rval_t dec_ret;
|
||||
DevAssert(pdu != NULL);
|
||||
DevAssert(buffer != NULL);
|
||||
dec_ret = aper_decode(NULL,
|
||||
&asn_DEF_NGAP_NGAP_PDU,
|
||||
(void **)&pdu,
|
||||
buffer,
|
||||
length,
|
||||
0,
|
||||
0);
|
||||
asn_codec_ctx_t st = {.max_stack_size = 100 * 1000}; // if we enable asn1c debug the stack size become large
|
||||
dec_ret = aper_decode(&st, &asn_DEF_NGAP_NGAP_PDU, (void **)&pdu, buffer, length, 0, 0);
|
||||
|
||||
if (dec_ret.code != RC_OK) {
|
||||
NGAP_ERROR("Failed to decode pdu\n");
|
||||
|
||||
@@ -236,11 +236,6 @@ typedef struct ngap_gNB_instance_s {
|
||||
/* Tree of NGAP AMF associations ordered by association ID */
|
||||
RB_HEAD(ngap_amf_map, ngap_gNB_amf_data_s) ngap_amf_head;
|
||||
|
||||
/* TODO: add a map ordered by relative AMF capacity */
|
||||
|
||||
/* Tree of UE ordered by gNB_ue_ngap_id's */
|
||||
RB_HEAD(ngap_ue_map, ngap_gNB_ue_context_s) ngap_ue_head;
|
||||
|
||||
/* For virtual mode, mod_id as defined in the rest of the L1/L2 stack */
|
||||
instance_t instance;
|
||||
|
||||
|
||||
@@ -38,23 +38,81 @@
|
||||
#include "ngap_common.h"
|
||||
#include "ngap_gNB_encoder.h"
|
||||
|
||||
static inline int ngap_gNB_encode_initiating(NGAP_NGAP_PDU_t *pdu,
|
||||
uint8_t **buffer,
|
||||
uint32_t *len);
|
||||
static inline int ngap_gNB_encode_initiating(NGAP_NGAP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
|
||||
{
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
static inline int ngap_gNB_encode_successfull_outcome(NGAP_NGAP_PDU_t *pdu,
|
||||
uint8_t **buffer, uint32_t *len);
|
||||
const NGAP_ProcedureCode_t tmp[] = {NGAP_ProcedureCode_id_NGSetup,
|
||||
NGAP_ProcedureCode_id_UplinkNASTransport,
|
||||
NGAP_ProcedureCode_id_UERadioCapabilityInfoIndication,
|
||||
NGAP_ProcedureCode_id_InitialUEMessage,
|
||||
NGAP_ProcedureCode_id_NASNonDeliveryIndication,
|
||||
NGAP_ProcedureCode_id_UEContextReleaseRequest,
|
||||
NGAP_ProcedureCode_id_PathSwitchRequest,
|
||||
NGAP_ProcedureCode_id_PDUSessionResourceModifyIndication};
|
||||
int i;
|
||||
for (i = 0; i < sizeofArray(tmp); i++)
|
||||
if (pdu->choice.initiatingMessage->procedureCode == tmp[i])
|
||||
break;
|
||||
if (i == sizeofArray(tmp)) {
|
||||
NGAP_DEBUG("Unknown procedure ID (%d) for initiating message\n", (int)pdu->choice.initiatingMessage->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline int ngap_gNB_encode_unsuccessfull_outcome(NGAP_NGAP_PDU_t *pdu,
|
||||
uint8_t **buffer, uint32_t *len);
|
||||
asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
*buffer = res.buffer;
|
||||
*len = res.result.encoded;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ngap_gNB_encode_pdu(NGAP_NGAP_PDU_t *pdu, uint8_t **buffer, uint32_t *len) {
|
||||
static inline int ngap_gNB_encode_successfull_outcome(NGAP_NGAP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
|
||||
{
|
||||
DevAssert(pdu != NULL);
|
||||
const NGAP_ProcedureCode_t tmp[] = {NGAP_ProcedureCode_id_InitialContextSetup,
|
||||
NGAP_ProcedureCode_id_UEContextRelease,
|
||||
NGAP_ProcedureCode_id_PDUSessionResourceSetup,
|
||||
NGAP_ProcedureCode_id_PDUSessionResourceModify,
|
||||
NGAP_ProcedureCode_id_PDUSessionResourceRelease};
|
||||
int i;
|
||||
for (i = 0; i < sizeofArray(tmp); i++)
|
||||
if (pdu->choice.successfulOutcome->procedureCode == tmp[i])
|
||||
break;
|
||||
if (i == sizeofArray(tmp)) {
|
||||
NGAP_WARN("Unknown procedure ID (%d) for successfull outcome message\n", (int)pdu->choice.successfulOutcome->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
*buffer = res.buffer;
|
||||
*len = res.result.encoded;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int ngap_gNB_encode_unsuccessfull_outcome(NGAP_NGAP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
|
||||
{
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
if (pdu->choice.unsuccessfulOutcome->procedureCode != NGAP_ProcedureCode_id_InitialContextSetup) {
|
||||
NGAP_DEBUG("Unknown procedure ID (%d) for unsuccessfull outcome message\n", (int)pdu->choice.unsuccessfulOutcome->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
*buffer = res.buffer;
|
||||
*len = res.result.encoded;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ngap_gNB_encode_pdu(NGAP_NGAP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
|
||||
{
|
||||
int ret = -1;
|
||||
DevAssert(pdu != NULL);
|
||||
DevAssert(buffer != NULL);
|
||||
DevAssert(len != NULL);
|
||||
|
||||
switch(pdu->present) {
|
||||
if (asn1_xer_print) {
|
||||
xer_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, (void *)pdu);
|
||||
}
|
||||
switch (pdu->present) {
|
||||
case NGAP_NGAP_PDU_PR_initiatingMessage:
|
||||
ret = ngap_gNB_encode_initiating(pdu, buffer, len);
|
||||
break;
|
||||
@@ -68,156 +126,10 @@ int ngap_gNB_encode_pdu(NGAP_NGAP_PDU_t *pdu, uint8_t **buffer, uint32_t *len) {
|
||||
break;
|
||||
|
||||
default:
|
||||
NGAP_DEBUG("Unknown message outcome (%d) or not implemented",
|
||||
(int)pdu->present);
|
||||
NGAP_DEBUG("Unknown message outcome (%d) or not implemented", (int)pdu->present);
|
||||
return -1;
|
||||
}
|
||||
|
||||
//ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline
|
||||
int ngap_gNB_encode_initiating(NGAP_NGAP_PDU_t *pdu,
|
||||
uint8_t **buffer, uint32_t *len) {
|
||||
asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
switch(pdu->choice.initiatingMessage->procedureCode) {
|
||||
case NGAP_ProcedureCode_id_NGSetup:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_UplinkNASTransport:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_UERadioCapabilityInfoIndication:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_InitialUEMessage:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_NASNonDeliveryIndication:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_UEContextReleaseRequest:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_PathSwitchRequest:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_PDUSessionResourceModifyIndication:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
default:
|
||||
NGAP_DEBUG("Unknown procedure ID (%d) for initiating message\n",
|
||||
(int)pdu->choice.initiatingMessage->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (asn1_xer_print) {
|
||||
xer_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, (void *)pdu);
|
||||
}
|
||||
|
||||
memset(&res, 0, sizeof(res));
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
*buffer = res.buffer;
|
||||
*len = res.result.encoded;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
int ngap_gNB_encode_successfull_outcome(NGAP_NGAP_PDU_t *pdu,
|
||||
uint8_t **buffer, uint32_t *len) {
|
||||
asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
switch(pdu->choice.successfulOutcome->procedureCode) {
|
||||
case NGAP_ProcedureCode_id_InitialContextSetup:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_UEContextRelease:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_PDUSessionResourceSetup:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
NGAP_INFO("PDUSESSIONSetup successful message\n");
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_PDUSessionResourceModify:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
NGAP_INFO("PDUSESSIONModify successful message\n");
|
||||
break;
|
||||
|
||||
case NGAP_ProcedureCode_id_PDUSessionResourceRelease:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
NGAP_INFO("PDUSESSION Release successful message\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
NGAP_WARN("Unknown procedure ID (%d) for successfull outcome message\n",
|
||||
(int)pdu->choice.successfulOutcome->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (asn1_xer_print) {
|
||||
xer_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, (void *)pdu);
|
||||
}
|
||||
|
||||
memset(&res, 0, sizeof(res));
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
*buffer = res.buffer;
|
||||
*len = res.result.encoded;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
int ngap_gNB_encode_unsuccessfull_outcome(NGAP_NGAP_PDU_t *pdu,
|
||||
uint8_t **buffer, uint32_t *len) {
|
||||
asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
switch(pdu->choice.unsuccessfulOutcome->procedureCode) {
|
||||
case NGAP_ProcedureCode_id_InitialContextSetup:
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
free(res.buffer);
|
||||
break;
|
||||
|
||||
default:
|
||||
NGAP_DEBUG("Unknown procedure ID (%d) for unsuccessfull outcome message\n",
|
||||
(int)pdu->choice.unsuccessfulOutcome->procedureCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (asn1_xer_print) {
|
||||
xer_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, (void *)pdu);
|
||||
}
|
||||
|
||||
memset(&res, 0, sizeof(res));
|
||||
res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_NGAP_PDU, pdu);
|
||||
*buffer = res.buffer;
|
||||
*len = res.result.encoded;
|
||||
return 0;
|
||||
}
|
||||
|
||||
+269
-809
File diff suppressed because it is too large
Load Diff
@@ -49,11 +49,7 @@ void ngap_gNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uin
|
||||
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
||||
}
|
||||
|
||||
void ngap_gNB_itti_send_nas_downlink_ind(instance_t instance,
|
||||
uint16_t ue_initial_id,
|
||||
uint32_t gNB_ue_ngap_id,
|
||||
uint8_t *nas_pdu,
|
||||
uint32_t nas_pdu_length)
|
||||
void ngap_gNB_itti_send_nas_downlink_ind(instance_t instance, uint32_t gNB_ue_ngap_id, uint8_t *nas_pdu, uint32_t nas_pdu_length)
|
||||
{
|
||||
MessageDef *message_p;
|
||||
ngap_downlink_nas_t *ngap_downlink_nas;
|
||||
@@ -62,7 +58,6 @@ void ngap_gNB_itti_send_nas_downlink_ind(instance_t instance,
|
||||
|
||||
ngap_downlink_nas = &message_p->ittiMsg.ngap_downlink_nas;
|
||||
|
||||
ngap_downlink_nas->ue_initial_id = ue_initial_id;
|
||||
ngap_downlink_nas->gNB_ue_ngap_id = gNB_ue_ngap_id;
|
||||
ngap_downlink_nas->nas_pdu.buffer = malloc(sizeof(uint8_t) * nas_pdu_length);
|
||||
memcpy(ngap_downlink_nas->nas_pdu.buffer, nas_pdu, nas_pdu_length);
|
||||
|
||||
@@ -33,11 +33,7 @@
|
||||
void ngap_gNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
|
||||
uint32_t buffer_length, uint16_t stream);
|
||||
|
||||
void ngap_gNB_itti_send_nas_downlink_ind(instance_t instance,
|
||||
uint16_t ue_initial_id,
|
||||
uint32_t gNB_ue_ngap_id,
|
||||
uint8_t *nas_pdu,
|
||||
uint32_t nas_pdu_length);
|
||||
void ngap_gNB_itti_send_nas_downlink_ind(instance_t instance, uint32_t gNB_ue_ngap_id, uint8_t *nas_pdu, uint32_t nas_pdu_length);
|
||||
|
||||
void ngap_gNB_itti_send_sctp_close_association(instance_t instance,
|
||||
int32_t assoc_id);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -30,23 +30,10 @@
|
||||
#ifndef NGAP_GNB_TRACE_H_
|
||||
#define NGAP_GNB_TRACE_H_
|
||||
|
||||
// int ngap_gNB_generate_trace_failure(sctp_data_t *sctp_data_p,
|
||||
// int32_t stream,
|
||||
// uint32_t gNB_ue_ngap_id,
|
||||
// uint32_t amf_ue_ngap_id,
|
||||
// E_UTRAN_Trace_ID_t *trace_id,
|
||||
// Cause_t *cause_p);
|
||||
|
||||
// int ngap_gNB_handle_trace_start(gNB_amf_desc_t *gNB_desc_p,
|
||||
// sctp_queue_item_t *packet_p,
|
||||
// struct ngap_message_s *message_p);
|
||||
int ngap_gNB_handle_trace_start(uint32_t assoc_id,
|
||||
uint32_t stream,
|
||||
NGAP_NGAP_PDU_t *pdu);
|
||||
|
||||
// int ngap_gNB_handle_deactivate_trace(gNB_amf_desc_t *gNB_desc_p,
|
||||
// sctp_queue_item_t *packet_p,
|
||||
// struct ngap_message_s *message_p);
|
||||
int ngap_gNB_handle_deactivate_trace(uint32_t assoc_id,
|
||||
uint32_t stream,
|
||||
NGAP_NGAP_PDU_t *pdu);
|
||||
|
||||
@@ -40,8 +40,15 @@
|
||||
#include "ngap_gNB_defs.h"
|
||||
#include "ngap_gNB_ue_context.h"
|
||||
|
||||
int ngap_gNB_compare_gNB_ue_ngap_id(
|
||||
struct ngap_gNB_ue_context_s *p1, struct ngap_gNB_ue_context_s *p2)
|
||||
/* Tree of UE ordered by gNB_ue_ngap_id's
|
||||
* NO INSTANCE, the 32 bits id is large enough to handle all UEs, regardless the cell, gNB, ...
|
||||
*/
|
||||
static RB_HEAD(ngap_ue_map, ngap_gNB_ue_context_s) ngap_ue_head = RB_INITIALIZER(root);
|
||||
|
||||
/* Generate the tree management functions prototypes */
|
||||
RB_PROTOTYPE(ngap_ue_map, ngap_gNB_ue_context_s, entries, ngap_gNB_compare_gNB_ue_ngap_id);
|
||||
|
||||
static int ngap_gNB_compare_gNB_ue_ngap_id(struct ngap_gNB_ue_context_s *p1, struct ngap_gNB_ue_context_s *p2)
|
||||
{
|
||||
if (p1->gNB_ue_ngap_id > p2->gNB_ue_ngap_id) {
|
||||
return 1;
|
||||
@@ -58,46 +65,26 @@ int ngap_gNB_compare_gNB_ue_ngap_id(
|
||||
RB_GENERATE(ngap_ue_map, ngap_gNB_ue_context_s, entries,
|
||||
ngap_gNB_compare_gNB_ue_ngap_id);
|
||||
|
||||
struct ngap_gNB_ue_context_s *ngap_gNB_allocate_new_UE_context(void)
|
||||
void ngap_store_ue_context(struct ngap_gNB_ue_context_s *ue_desc_p)
|
||||
{
|
||||
struct ngap_gNB_ue_context_s *new_p;
|
||||
if (!RB_INSERT(ngap_ue_map, &ngap_ue_head, ue_desc_p))
|
||||
LOG_E(NGAP, "Bug in UE uniq number allocation %u, we try to add a existing UE\n", ue_desc_p->gNB_ue_ngap_id);
|
||||
return;
|
||||
}
|
||||
|
||||
new_p = malloc(sizeof(struct ngap_gNB_ue_context_s));
|
||||
struct ngap_gNB_ue_context_s *ngap_get_ue_context(uint32_t gNB_ue_ngap_id)
|
||||
{
|
||||
ngap_gNB_ue_context_t temp = {.gNB_ue_ngap_id = gNB_ue_ngap_id};
|
||||
return RB_FIND(ngap_ue_map, &ngap_ue_head, &temp);
|
||||
}
|
||||
|
||||
if (new_p == NULL) {
|
||||
NGAP_ERROR("Cannot allocate new ue context\n");
|
||||
struct ngap_gNB_ue_context_s *ngap_detach_ue_context(uint32_t gNB_ue_ngap_id)
|
||||
{
|
||||
struct ngap_gNB_ue_context_s *tmp = ngap_get_ue_context(gNB_ue_ngap_id);
|
||||
if (tmp == NULL) {
|
||||
NGAP_ERROR("Trying to free a NULL UE context, %u\n", gNB_ue_ngap_id);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(new_p, 0, sizeof(struct ngap_gNB_ue_context_s));
|
||||
|
||||
return new_p;
|
||||
}
|
||||
|
||||
struct ngap_gNB_ue_context_s *ngap_gNB_get_ue_context(
|
||||
ngap_gNB_instance_t *instance_p,
|
||||
uint32_t gNB_ue_ngap_id)
|
||||
{
|
||||
ngap_gNB_ue_context_t temp;
|
||||
|
||||
memset(&temp, 0, sizeof(struct ngap_gNB_ue_context_s));
|
||||
|
||||
/* gNB ue ngap id = 32 bits wide */
|
||||
temp.gNB_ue_ngap_id = gNB_ue_ngap_id & 0xFFFFFFFF;
|
||||
|
||||
return RB_FIND(ngap_ue_map, &instance_p->ngap_ue_head, &temp);
|
||||
}
|
||||
|
||||
void ngap_gNB_free_ue_context(struct ngap_gNB_ue_context_s *ue_context_p)
|
||||
{
|
||||
if (ue_context_p == NULL) {
|
||||
NGAP_ERROR("Trying to free a NULL context\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* TODO: check that context is currently not in the tree of known
|
||||
* contexts.
|
||||
*/
|
||||
|
||||
free(ue_context_p);
|
||||
RB_REMOVE(ngap_ue_map, &ngap_ue_head, tmp);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
|
||||
// Forward declarations
|
||||
struct ngap_gNB_amf_data_s;
|
||||
struct ngap_ue_map;
|
||||
struct gNB_amf_desc_s;
|
||||
|
||||
typedef enum {
|
||||
@@ -59,9 +58,6 @@ typedef struct ngap_gNB_ue_context_s {
|
||||
*/
|
||||
uint32_t gNB_ue_ngap_id;
|
||||
|
||||
/* UE id for initial connection to NGAP */
|
||||
uint16_t ue_initial_id;
|
||||
|
||||
/* Uniquely identifies the UE within AMF. Encoded on 32 bits. */
|
||||
uint64_t amf_ue_ngap_id:40;
|
||||
|
||||
@@ -84,20 +80,9 @@ typedef struct ngap_gNB_ue_context_s {
|
||||
ngap_gNB_instance_t *gNB_instance;
|
||||
} ngap_gNB_ue_context_t;
|
||||
|
||||
int ngap_gNB_compare_gNB_ue_ngap_id(
|
||||
struct ngap_gNB_ue_context_s *p1, struct ngap_gNB_ue_context_s *p2);
|
||||
|
||||
/* Generate the tree management functions prototypes */
|
||||
RB_PROTOTYPE(ngap_ue_map, ngap_gNB_ue_context_s, entries,
|
||||
ngap_gNB_compare_gNB_ue_ngap_id);
|
||||
|
||||
struct ngap_gNB_ue_context_s *ngap_gNB_allocate_new_UE_context(void);
|
||||
|
||||
struct ngap_gNB_ue_context_s *ngap_gNB_get_ue_context(
|
||||
ngap_gNB_instance_t *instance_p,
|
||||
uint32_t gNB_ue_ngap_id);
|
||||
|
||||
void ngap_gNB_free_ue_context(struct ngap_gNB_ue_context_s *ue_context_p);
|
||||
void ngap_store_ue_context(ngap_gNB_ue_context_t *ue_desc_p);
|
||||
|
||||
ngap_gNB_ue_context_t *ngap_get_ue_context(uint32_t gNB_ue_ngap_id);
|
||||
ngap_gNB_ue_context_t *ngap_detach_ue_context(uint32_t gNB_ue_ngap_id);
|
||||
|
||||
#endif /* NGAP_GNB_UE_CONTEXT_H_ */
|
||||
|
||||
Reference in New Issue
Block a user