Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
canghaiwuhen
OpenXG-RAN
Commits
fa8e7d9f
Commit
fa8e7d9f
authored
Oct 15, 2020
by
masayuki.harada
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'remotes/origin/develop_SA_SIM' into develop_SA_L3
parents
d626d4b2
1fd1853c
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
1919 additions
and
109 deletions
+1919
-109
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+57
-2
cmake_targets/build_oai
cmake_targets/build_oai
+14
-1
common/utils/ocp_itti/all_msg.h
common/utils/ocp_itti/all_msg.h
+4
-0
common/utils/ocp_itti/intertask_interface.h
common/utils/ocp_itti/intertask_interface.h
+6
-0
openair2/COMMON/itti_sim_messages_def.h
openair2/COMMON/itti_sim_messages_def.h
+17
-0
openair2/COMMON/itti_sim_messages_types.h
openair2/COMMON/itti_sim_messages_types.h
+32
-0
openair2/COMMON/mac_messages_def.h
openair2/COMMON/mac_messages_def.h
+6
-3
openair2/COMMON/mac_messages_types.h
openair2/COMMON/mac_messages_types.h
+10
-0
openair2/COMMON/tasks_def.h
openair2/COMMON/tasks_def.h
+6
-0
openair2/RRC/LTE/defs_NB_IoT.h
openair2/RRC/LTE/defs_NB_IoT.h
+3
-0
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+7
-0
openair2/RRC/NR_UE/rrc_UE.c
openair2/RRC/NR_UE/rrc_UE.c
+1099
-102
openair2/RRC/NR_UE/rrc_defs.h
openair2/RRC/NR_UE/rrc_defs.h
+23
-1
openair2/SIMULATION/NR_RRC/itti_sim.c
openair2/SIMULATION/NR_RRC/itti_sim.c
+635
-0
No files found.
cmake_targets/CMakeLists.txt
View file @
fa8e7d9f
...
@@ -879,6 +879,7 @@ add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION w
...
@@ -879,6 +879,7 @@ add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION w
add_boolean_option
(
PHY_TX_THREAD False
"enable UE_EXPANSION with max 256 UE"
)
add_boolean_option
(
PHY_TX_THREAD False
"enable UE_EXPANSION with max 256 UE"
)
add_boolean_option
(
PRE_SCD_THREAD False
"enable UE_EXPANSION with max 256 UE"
)
add_boolean_option
(
PRE_SCD_THREAD False
"enable UE_EXPANSION with max 256 UE"
)
add_boolean_option
(
UESIM_EXPANSION False
"enable UESIM_EXPANSION with max 256 UE"
)
add_boolean_option
(
UESIM_EXPANSION False
"enable UESIM_EXPANSION with max 256 UE"
)
add_boolean_option
(
ITTI_SIM False
"enable itti simulator"
)
########################
########################
# Include order
# Include order
...
@@ -2911,7 +2912,7 @@ add_executable(nr-uesoftmodem
...
@@ -2911,7 +2912,7 @@ add_executable(nr-uesoftmodem
target_link_libraries
(
nr-uesoftmodem
target_link_libraries
(
nr-uesoftmodem
-Wl,--start-group
-Wl,--start-group
RRC_LIB NR_RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
RRC_LIB NR_RRC_LIB
NGAP_LIB NGAP_GNB
SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
${
MSC_LIB
}
${
RAL_LIB
}
${
NAS_UE_LIB
}
${
ITTI_LIB
}
${
FLPT_MSG_LIB
}
${
ASYNC_IF_LIB
}
LFDS7
${
ATLAS_LIBRARIES
}
${
MSC_LIB
}
${
RAL_LIB
}
${
NAS_UE_LIB
}
${
ITTI_LIB
}
${
FLPT_MSG_LIB
}
${
ASYNC_IF_LIB
}
LFDS7
${
ATLAS_LIBRARIES
}
...
@@ -3211,7 +3212,7 @@ if (${T_TRACER})
...
@@ -3211,7 +3212,7 @@ if (${T_TRACER})
foreach
(
i
foreach
(
i
#all "add_executable" definitions (except tests, rb_tool, updatefw)
#all "add_executable" definitions (except tests, rb_tool, updatefw)
lte-softmodem lte-uesoftmodem nr-softmodem
lte-softmodem lte-uesoftmodem nr-softmodem
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7
nr-ittisim
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
...
@@ -3298,6 +3299,60 @@ add_executable(rb_tool
...
@@ -3298,6 +3299,60 @@ add_executable(rb_tool
)
)
target_include_directories
(
rb_tool PRIVATE
${
OPENAIR2_DIR
}
/NETWORK_DRIVER/MESH/
)
target_include_directories
(
rb_tool PRIVATE
${
OPENAIR2_DIR
}
/NETWORK_DRIVER/MESH/
)
# nr-ittisim
###################################################
add_executable
(
nr-ittisim
${
rrc_h
}
${
nr_rrc_h
}
${
OPENAIR2_DIR
}
/GNB_APP/gnb_app.c
${
OPENAIR2_DIR
}
/GNB_APP/gnb_config.c
${
OPENAIR_DIR
}
/executables/nr-gnb.c
${
OPENAIR_DIR
}
/executables/nr-ru.c
${
OPENAIR2_DIR
}
/SIMULATION/NR_RRC/itti_sim.c
${
OPENAIR_DIR
}
/executables/softmodem-common.c
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/taus.c
${
OPENAIR_TARGETS
}
/ARCH/COMMON/common_lib.c
${
OPENAIR_TARGETS
}
/ARCH/COMMON/record_player.c
${
OPENAIR2_DIR
}
/RRC/NAS/nas_config.c
${
OPENAIR2_DIR
}
/RRC/NAS/rb_config.c
${
OPENAIR3_DIR
}
/GTPV1-U/gtpv1u_gNB.c
${
OPENAIR1_DIR
}
/SIMULATION/ETH_TRANSPORT/netlink_init.c
${
OPENAIR3_DIR
}
/NAS/UE/nas_ue_task.c
${
OPENAIR_DIR
}
/common/utils/utils.c
${
OPENAIR_DIR
}
/common/utils/system.c
${
OPENAIR_DIR
}
/common/utils/nr/nr_common.c
${
GTPU_need_ITTI
}
${
XFORMSINTERFACE_SOURCE
}
${
T_SOURCE
}
${
CONFIG_SOURCES
}
${
SHLIB_LOADER_SOURCES
}
)
#target_link_libraries (nr-ittisim
# -Wl,--start-group
# UTIL HASHTABLE SCTP_CLIENT UDP LFDS NR_GTPV1U SECU_CN SECU_OSA
# ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
# NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB
# X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
# -Wl,--end-group z dl)
target_link_libraries
(
nr-ittisim
-Wl,--start-group
UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
${
ITTI_LIB
}
${
FLPT_MSG_LIB
}
${
ASYNC_IF_LIB
}
${
FLEXRAN_AGENT_LIB
}
LFDS7
${
MSC_LIB
}
${
RAL_LIB
}
${
NAS_UE_LIB
}
RRC_LIB NR_RRC_LIB
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB
${
PROTO_AGENT_LIB
}
${
FSPT_MSG_LIB
}
NR_L2_UE
-Wl,--end-group z dl
)
target_link_libraries
(
nr-ittisim
${
LIBXML2_LIBRARIES
}
)
target_link_libraries
(
nr-ittisim pthread m
${
CONFIG_LIB
}
rt crypt
${
CRYPTO_LIBRARIES
}
${
OPENSSL_LIBRARIES
}
${
NETTLE_LIBRARIES
}
sctp
${
XFORMS_LIBRARIES
}
${
PROTOBUF_LIB
}
${
CMAKE_DL_LIBS
}
${
LIBYAML_LIBRARIES
}
${
ATLAS_LIBRARIES
}
)
target_link_libraries
(
nr-ittisim
${
LIB_LMS_LIBRARIES
}
)
target_link_libraries
(
nr-ittisim
${
T_LIB
}
)
add_dependencies
(
nr-ittisim ldpc_orig ldpc_optim ldpc_optim8seg ldpc
)
# ???
# ???
####################
####################
list
(
APPEND oai_nw_drv_src device.c common.c ioctl.c classifier.c tool.c
)
list
(
APPEND oai_nw_drv_src device.c common.c ioctl.c classifier.c tool.c
)
...
...
cmake_targets/build_oai
View file @
fa8e7d9f
...
@@ -67,6 +67,7 @@ UE_TIMING_TRACE="False"
...
@@ -67,6 +67,7 @@ UE_TIMING_TRACE="False"
USRP_REC_PLAY
=
"False"
USRP_REC_PLAY
=
"False"
BUILD_ECLIPSE
=
0
BUILD_ECLIPSE
=
0
NR
=
"False"
NR
=
"False"
ITTI_SIM
=
"False"
OPTIONAL_LIBRARIES
=
"telnetsrv enbscope uescope nrscope msc"
OPTIONAL_LIBRARIES
=
"telnetsrv enbscope uescope nrscope msc"
trap
handle_ctrl_c INT
trap
handle_ctrl_c INT
...
@@ -160,6 +161,8 @@ Options
...
@@ -160,6 +161,8 @@ Options
Build for I/Q record-playback modes
Build for I/Q record-playback modes
-k | --skip-shared-libraries
-k | --skip-shared-libraries
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
--ittiSIM
Makes the itti simulator
-h | --help
-h | --help
Print this help
Print this help
...
@@ -418,6 +421,11 @@ function main() {
...
@@ -418,6 +421,11 @@ function main() {
CMAKE_CMD
=
"
$CMAKE_CMD
-GNinja"
CMAKE_CMD
=
"
$CMAKE_CMD
-GNinja"
MAKE_CMD
=
ninja
MAKE_CMD
=
ninja
shift
;;
shift
;;
--ittiSIM
)
ittiSIM
=
1
ITTI_SIM
=
"True"
echo_info
"Will compile itti simulator"
shift
;;
-h
|
--help
)
-h
|
--help
)
print_help
print_help
exit
1
;;
exit
1
;;
...
@@ -580,7 +588,7 @@ function main() {
...
@@ -580,7 +588,7 @@ function main() {
config_libconfig_shlib
=
params_libconfig
config_libconfig_shlib
=
params_libconfig
# first generate the CMakefile in the right directory
# first generate the CMakefile in the right directory
if
[
"
$eNB
"
=
"1"
-o
"
$eNBocp
"
=
"1"
-o
"
$UE
"
=
"1"
-o
"
$gNB
"
=
"1"
-o
"
$nrUE
"
=
"1"
-o
"
$HW
"
=
"EXMIMO"
]
;
then
if
[
"
$eNB
"
=
"1"
-o
"
$eNBocp
"
=
"1"
-o
"
$UE
"
=
"1"
-o
"
$gNB
"
=
"1"
-o
"
$nrUE
"
=
"1"
-o
"
$HW
"
=
"EXMIMO"
-o
"
$ittiSIM
"
=
"1"
]
;
then
# softmodem compilation
# softmodem compilation
...
@@ -605,6 +613,7 @@ function main() {
...
@@ -605,6 +613,7 @@ function main() {
echo
"set ( UE_TIMING_TRACE
$UE_TIMING_TRACE
)"
>>
$cmake_file
echo
"set ( UE_TIMING_TRACE
$UE_TIMING_TRACE
)"
>>
$cmake_file
echo
"set ( USRP_REC_PLAY
$USRP_REC_PLAY
)"
>>
$cmake_file
echo
"set ( USRP_REC_PLAY
$USRP_REC_PLAY
)"
>>
$cmake_file
echo
"set ( SKIP_SHARED_LIB_FLAG
$SKIP_SHARED_LIB_FLAG
)"
>>
$cmake_file
echo
"set ( SKIP_SHARED_LIB_FLAG
$SKIP_SHARED_LIB_FLAG
)"
>>
$cmake_file
echo
"set ( ITTI_SIM
$ITTI_SIM
)"
>>
$cmake_file
echo
'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)'
>>
$cmake_file
echo
'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)'
>>
$cmake_file
cd
$DIR
/
$build_dir
/build
cd
$DIR
/
$build_dir
/build
eval
$CMAKE_CMD
eval
$CMAKE_CMD
...
@@ -626,6 +635,10 @@ function main() {
...
@@ -626,6 +635,10 @@ function main() {
execlist
=
"
$execlist
nr-uesoftmodem"
execlist
=
"
$execlist
nr-uesoftmodem"
fi
fi
if
[
"
$ittiSIM
"
=
"1"
]
;
then
execlist
=
"
$execlist
nr-ittisim"
fi
for
f
in
$execlist
;
do
for
f
in
$execlist
;
do
echo_info
"Compiling
$f
..."
echo_info
"Compiling
$f
..."
compilations
\
compilations
\
...
...
common/utils/ocp_itti/all_msg.h
View file @
fa8e7d9f
...
@@ -17,3 +17,7 @@
...
@@ -17,3 +17,7 @@
#include "openair2/COMMON/flexran_messages_def.h"
#include "openair2/COMMON/flexran_messages_def.h"
#include "openair2/COMMON/f1ap_messages_def.h"
#include "openair2/COMMON/f1ap_messages_def.h"
#include "openair2/COMMON/ngap_messages_def.h"
#include "openair2/COMMON/ngap_messages_def.h"
#if ITTI_SIM
#include "openair2/COMMON/itti_sim_messages_def.h"
#endif
common/utils/ocp_itti/intertask_interface.h
View file @
fa8e7d9f
...
@@ -262,6 +262,10 @@ void *rrc_enb_process_itti_msg(void *);
...
@@ -262,6 +262,10 @@ void *rrc_enb_process_itti_msg(void *);
#include <openair3/SCTP/sctp_eNB_task.h>
#include <openair3/SCTP/sctp_eNB_task.h>
#include <openair3/NGAP/ngap_gNB.h>
#include <openair3/NGAP/ngap_gNB.h>
#ifdef ITTI_SIM
#include <openair2/COMMON/itti_sim_messages_types.h>
#endif
/*
/*
static const char *const messages_definition_xml = {
static const char *const messages_definition_xml = {
#include <messages_xml.h>
#include <messages_xml.h>
...
@@ -339,6 +343,8 @@ void * rrc_enb_process_msg(void*);
...
@@ -339,6 +343,8 @@ void * rrc_enb_process_msg(void*);
TASK_DEF(TASK_UDP, TASK_PRIORITY_MED, 1000, NULL, NULL)\
TASK_DEF(TASK_UDP, TASK_PRIORITY_MED, 1000, NULL, NULL)\
TASK_DEF(TASK_CU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_CU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_DU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_DU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_RRC_UE_SIM, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_RRC_GNB_SIM, TASK_PRIORITY_MED, 200, NULL, NULL) \
TASK_DEF(TASK_MAX, TASK_PRIORITY_MED, 200, NULL, NULL)
TASK_DEF(TASK_MAX, TASK_PRIORITY_MED, 200, NULL, NULL)
#define TASK_DEF(TaskID, pRIO, qUEUEsIZE, FuNc, ThreadFunc) { pRIO, qUEUEsIZE, #TaskID, FuNc, ThreadFunc },
#define TASK_DEF(TaskID, pRIO, qUEUEsIZE, FuNc, ThreadFunc) { pRIO, qUEUEsIZE, #TaskID, FuNc, ThreadFunc },
...
...
openair2/COMMON/itti_sim_messages_def.h
0 → 100644
View file @
fa8e7d9f
/*!
\file itti_sim_messages_def.h
\brief itti message for itti simulator
\author Yoshio INOUE, Masayuki HARADA
\email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
\date 2020
\version 0.1
*/
MESSAGE_DEF
(
GNB_RRC_BCCH_DATA_IND
,
MESSAGE_PRIORITY_MED
,
itti_sim_rrc_ch_t
,
GNBBCCHind
)
MESSAGE_DEF
(
GNB_RRC_CCCH_DATA_IND
,
MESSAGE_PRIORITY_MED
,
itti_sim_rrc_ch_t
,
GNBCCCHind
)
MESSAGE_DEF
(
GNB_RRC_DCCH_DATA_IND
,
MESSAGE_PRIORITY_MED
,
itti_sim_rrc_ch_t
,
GNBDCCHind
)
MESSAGE_DEF
(
UE_RRC_CCCH_DATA_IND
,
MESSAGE_PRIORITY_MED
,
itti_sim_rrc_ch_t
,
UECCCHind
)
MESSAGE_DEF
(
UE_RRC_DCCH_DATA_IND
,
MESSAGE_PRIORITY_MED
,
itti_sim_rrc_ch_t
,
UEDCCHind
)
openair2/COMMON/itti_sim_messages_types.h
0 → 100644
View file @
fa8e7d9f
/*!
\file itti_sim_messages_types.h
\brief itti message for itti simulator
\author Yoshio INOUE, Masayuki HARADA
\email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
\date 2020
\version 0.1
*/
#ifndef ITTI_SIM_MESSAGES_TYPES_H_
#define ITTI_SIM_MESSAGES_TYPES_H_
#include "LTE_asn_constant.h"
#define GNB_RRC_BCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.GNBBCCHind
#define GNB_RRC_CCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.GNBCCCHind
#define GNB_RRC_DCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.GNBDCCHind
#define UE_RRC_CCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.UECCCHind
#define UE_RRC_DCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.UEDCCHind
typedef
struct
itti_sim_rrc_ch_s
{
const
rb_id_t
rbid
;
uint8_t
*
sdu
;
int
size
;
}
itti_sim_rrc_ch_t
;
#endif
/* ITTI_SIM_MESSAGES_TYPES_H_ */
openair2/COMMON/mac_messages_def.h
View file @
fa8e7d9f
...
@@ -41,8 +41,6 @@ MESSAGE_DEF(RRC_MAC_CCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcMacCcchDat
...
@@ -41,8 +41,6 @@ MESSAGE_DEF(RRC_MAC_CCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcMacCcchDat
MESSAGE_DEF
(
RRC_MAC_CCCH_DATA_CNF
,
MESSAGE_PRIORITY_MED_PLUS
,
RrcMacCcchDataCnf
,
rrc_mac_ccch_data_cnf
)
MESSAGE_DEF
(
RRC_MAC_CCCH_DATA_CNF
,
MESSAGE_PRIORITY_MED_PLUS
,
RrcMacCcchDataCnf
,
rrc_mac_ccch_data_cnf
)
MESSAGE_DEF
(
RRC_MAC_CCCH_DATA_IND
,
MESSAGE_PRIORITY_MED_PLUS
,
RrcMacCcchDataInd
,
rrc_mac_ccch_data_ind
)
MESSAGE_DEF
(
RRC_MAC_CCCH_DATA_IND
,
MESSAGE_PRIORITY_MED_PLUS
,
RrcMacCcchDataInd
,
rrc_mac_ccch_data_ind
)
// gNB
MESSAGE_DEF
(
NR_RRC_MAC_CCCH_DATA_IND
,
MESSAGE_PRIORITY_MED_PLUS
,
NRRrcMacCcchDataInd
,
nr_rrc_mac_ccch_data_ind
)
MESSAGE_DEF
(
RRC_MAC_MCCH_DATA_REQ
,
MESSAGE_PRIORITY_MED_PLUS
,
RrcMacMcchDataReq
,
rrc_mac_mcch_data_req
)
MESSAGE_DEF
(
RRC_MAC_MCCH_DATA_REQ
,
MESSAGE_PRIORITY_MED_PLUS
,
RrcMacMcchDataReq
,
rrc_mac_mcch_data_req
)
MESSAGE_DEF
(
RRC_MAC_MCCH_DATA_IND
,
MESSAGE_PRIORITY_MED_PLUS
,
RrcMacMcchDataInd
,
rrc_mac_mcch_data_ind
)
MESSAGE_DEF
(
RRC_MAC_MCCH_DATA_IND
,
MESSAGE_PRIORITY_MED_PLUS
,
RrcMacMcchDataInd
,
rrc_mac_mcch_data_ind
)
...
@@ -50,4 +48,9 @@ MESSAGE_DEF(RRC_MAC_MCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, RrcMacMcchDat
...
@@ -50,4 +48,9 @@ MESSAGE_DEF(RRC_MAC_MCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, RrcMacMcchDat
MESSAGE_DEF
(
RRC_MAC_PCCH_DATA_REQ
,
MESSAGE_PRIORITY_MED_PLUS
,
RrcMacPcchDataReq
,
rrc_mac_pcch_data_req
)
MESSAGE_DEF
(
RRC_MAC_PCCH_DATA_REQ
,
MESSAGE_PRIORITY_MED_PLUS
,
RrcMacPcchDataReq
,
rrc_mac_pcch_data_req
)
/* RRC configures DRX context (MAC timers) of a UE */
/* RRC configures DRX context (MAC timers) of a UE */
MESSAGE_DEF
(
RRC_MAC_DRX_CONFIG_REQ
,
MESSAGE_PRIORITY_MED
,
rrc_mac_drx_config_req_t
,
rrc_mac_drx_config_req
)
MESSAGE_DEF
(
RRC_MAC_DRX_CONFIG_REQ
,
MESSAGE_PRIORITY_MED
,
rrc_mac_drx_config_req_t
,
rrc_mac_drx_config_req
)
\ No newline at end of file
// gNB
MESSAGE_DEF
(
NR_RRC_MAC_CCCH_DATA_IND
,
MESSAGE_PRIORITY_MED_PLUS
,
NRRrcMacCcchDataInd
,
nr_rrc_mac_ccch_data_ind
)
MESSAGE_DEF
(
NR_RRC_MAC_BCCH_DATA_IND
,
MESSAGE_PRIORITY_MED_PLUS
,
NRRrcMacBcchDataInd
,
nr_rrc_mac_bcch_data_ind
)
openair2/COMMON/mac_messages_types.h
View file @
fa8e7d9f
...
@@ -38,6 +38,7 @@
...
@@ -38,6 +38,7 @@
#define RRC_MAC_BCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_data_req
#define RRC_MAC_BCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_data_req
#define RRC_MAC_BCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_data_ind
#define RRC_MAC_BCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_data_ind
#define NR_RRC_MAC_BCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.nr_rrc_mac_bcch_data_ind
#define RRC_MAC_BCCH_MBMS_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_mbms_data_req
#define RRC_MAC_BCCH_MBMS_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_mbms_data_req
#define RRC_MAC_BCCH_MBMS_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_mbms_data_ind
#define RRC_MAC_BCCH_MBMS_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_mbms_data_ind
...
@@ -87,6 +88,15 @@ typedef struct RrcMacBcchDataInd_s {
...
@@ -87,6 +88,15 @@ typedef struct RrcMacBcchDataInd_s {
uint8_t
rsrp
;
uint8_t
rsrp
;
}
RrcMacBcchDataInd
;
}
RrcMacBcchDataInd
;
typedef
struct
NRRrcMacBcchDataInd_s
{
uint32_t
frame
;
uint8_t
sub_frame
;
uint32_t
sdu_size
;
uint8_t
sdu
[
BCCH_SDU_SIZE
];
uint8_t
gnb_index
;
uint8_t
rsrq
;
uint8_t
rsrp
;
}
NRRrcMacBcchDataInd
;
typedef
struct
RrcMacBcchMbmsDataReq_s
{
typedef
struct
RrcMacBcchMbmsDataReq_s
{
uint32_t
frame
;
uint32_t
frame
;
...
...
openair2/COMMON/tasks_def.h
View file @
fa8e7d9f
...
@@ -74,6 +74,7 @@ TASK_DEF(TASK_PROTO_AGENT, TASK_PRIORITY_MED, 200)
...
@@ -74,6 +74,7 @@ TASK_DEF(TASK_PROTO_AGENT, TASK_PRIORITY_MED, 200)
/// Radio Resource Control task
/// Radio Resource Control task
TASK_DEF
(
TASK_RRC_UE
,
TASK_PRIORITY_MED
,
200
)
TASK_DEF
(
TASK_RRC_UE
,
TASK_PRIORITY_MED
,
200
)
TASK_DEF
(
TASK_RRC_NRUE
,
TASK_PRIORITY_MED
,
200
)
/// Non Access Stratum task
/// Non Access Stratum task
TASK_DEF
(
TASK_NAS_UE
,
TASK_PRIORITY_MED
,
200
)
TASK_DEF
(
TASK_NAS_UE
,
TASK_PRIORITY_MED
,
200
)
TASK_DEF
(
TASK_RAL_UE
,
TASK_PRIORITY_MED
,
200
)
TASK_DEF
(
TASK_RAL_UE
,
TASK_PRIORITY_MED
,
200
)
...
@@ -81,3 +82,8 @@ TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200)
...
@@ -81,3 +82,8 @@ TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200)
//MESSAGE GENERATOR TASK
//MESSAGE GENERATOR TASK
TASK_DEF
(
TASK_MSC
,
TASK_PRIORITY_MED
,
200
)
TASK_DEF
(
TASK_MSC
,
TASK_PRIORITY_MED
,
200
)
#ifdef ITTI_SIM
TASK_DEF
(
TASK_RRC_GNB_SIM
,
TASK_PRIORITY_MED
,
200
)
TASK_DEF
(
TASK_RRC_UE_SIM
,
TASK_PRIORITY_MED
,
200
)
#endif
openair2/RRC/LTE/defs_NB_IoT.h
View file @
fa8e7d9f
...
@@ -37,6 +37,9 @@
...
@@ -37,6 +37,9 @@
#include "COMMON/s1ap_messages_types.h"
#include "COMMON/s1ap_messages_types.h"
#include "COMMON/rrc_messages_types.h"
#include "COMMON/rrc_messages_types.h"
#if ITTI_SIM
#include "COMMON/itti_sim_messages_types.h"
#endif
#include "collection/tree.h"
#include "collection/tree.h"
#include "rrc_types_NB_IoT.h"
#include "rrc_types_NB_IoT.h"
...
...
openair2/RRC/NR/rrc_gNB.c
View file @
fa8e7d9f
...
@@ -420,6 +420,13 @@ rrc_gNB_generate_RRCSetup(
...
@@ -420,6 +420,13 @@ rrc_gNB_generate_RRCSetup(
ue_context_pP
->
ue_context
.
ue_release_timer_thres
=
1000
;
ue_context_pP
->
ue_context
.
ue_release_timer_thres
=
1000
;
/* init timers */
/* init timers */
// ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0;
// ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0;
#ifdef ITTI_SIM
MessageDef
*
message_p
;
message_p
=
itti_alloc_new_message
(
TASK_RRC_UE_SIM
,
GNB_RRC_CCCH_DATA_IND
);
GNB_RRC_CCCH_DATA_IND
(
message_p
).
sdu
=
(
uint8_t
*
)
ue_p
->
Srb0
.
Tx_buffer
.
Payload
;
GNB_RRC_CCCH_DATA_IND
(
message_p
).
size
=
ue_p
->
Srb0
.
Tx_buffer
.
payload_size
;
itti_send_msg_to_task
(
TASK_RRC_UE_SIM
,
ctxt_pP
->
instance
,
message_p
);
#endif
}
}
void
void
...
...
openair2/RRC/NR_UE/rrc_UE.c
View file @
fa8e7d9f
...
@@ -33,10 +33,14 @@
...
@@ -33,10 +33,14 @@
#define RRC_UE
#define RRC_UE
#define RRC_UE_C
#define RRC_UE_C
#include "NR_DL-DCCH-Message.h" //asn_DEF_NR_DL_DCCH_Message
#include "asn1_conversions.h"
#include "NR_BCCH-BCH-Message.h" //asn_DEF_NR_BCCH_BCH_Message
#include "NR_CellGroupConfig.h" //asn_DEF_NR_CellGroupConfig
#include "NR_DL-DCCH-Message.h" //asn_DEF_NR_DL_DCCH_Message
#include "NR_BWP-Downlink.h" //asn_DEF_NR_BWP_Downlink
#include "NR_DL-CCCH-Message.h" //asn_DEF_NR_DL_CCCH_Message
#include "NR_BCCH-BCH-Message.h" //asn_DEF_NR_BCCH_BCH_Message
#include "NR_BCCH-DL-SCH-Message.h" //asn_DEF_NR_BCCH_DL_SCH_Message
#include "NR_CellGroupConfig.h" //asn_DEF_NR_CellGroupConfig
#include "NR_BWP-Downlink.h" //asn_DEF_NR_BWP_Downlink
#include "NR_RRCReconfiguration.h"
#include "NR_RRCReconfiguration.h"
#include "NR_MeasConfig.h"
#include "NR_MeasConfig.h"
#include "NR_UL-DCCH-Message.h"
#include "NR_UL-DCCH-Message.h"
...
@@ -47,12 +51,66 @@
...
@@ -47,12 +51,66 @@
#include "rrc_vars.h"
#include "rrc_vars.h"
#include "LAYER2/NR_MAC_UE/mac_proto.h"
#include "LAYER2/NR_MAC_UE/mac_proto.h"
#include "intertask_interface.h"
#include "executables/softmodem-common.h"
#include "executables/softmodem-common.h"
#include "plmn_data.h"
#include "pdcp.h"
#include "pdcp.h"
#include "UTIL/OSA/osa_defs.h"
#include "UTIL/OSA/osa_defs.h"
#include "common/utils/LOG/log.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
mui_t
nr_rrc_mui
=
0
;
mui_t
nr_rrc_mui
=
0
;
static
Rrc_State_t
nr_rrc_get_state
(
module_id_t
ue_mod_idP
)
{
return
NR_UE_rrc_inst
[
ue_mod_idP
].
nrRrcState
;
}
static
Rrc_Sub_State_t
nr_rrc_get_sub_state
(
module_id_t
ue_mod_idP
)
{
return
NR_UE_rrc_inst
[
ue_mod_idP
].
nrRrcSubState
;
}
static
int
nr_rrc_set_state
(
module_id_t
ue_mod_idP
,
Rrc_State_t
state
)
{
AssertFatal
((
RRC_STATE_FIRST
<=
state
)
&&
(
state
<=
RRC_STATE_LAST
),
"Invalid state %d!
\n
"
,
state
);
if
(
NR_UE_rrc_inst
[
ue_mod_idP
].
nrRrcState
!=
state
)
{
NR_UE_rrc_inst
[
ue_mod_idP
].
nrRrcState
=
state
;
return
(
1
);
}
return
(
0
);
}
static
int
nr_rrc_set_sub_state
(
module_id_t
ue_mod_idP
,
Rrc_Sub_State_NR_t
subState
)
{
if
(
AMF_MODE_ENABLED
)
{
switch
(
NR_UE_rrc_inst
[
ue_mod_idP
].
nrRrcState
)
{
case
RRC_STATE_INACTIVE_NR
:
AssertFatal
((
RRC_SUB_STATE_INACTIVE_FIRST_NR
<=
subState
)
&&
(
subState
<=
RRC_SUB_STATE_INACTIVE_LAST_NR
),
"Invalid nr sub state %d for state %d!
\n
"
,
subState
,
NR_UE_rrc_inst
[
ue_mod_idP
].
nrRrcState
);
break
;
case
RRC_STATE_IDLE_NR
:
AssertFatal
((
RRC_SUB_STATE_IDLE_FIRST_NR
<=
subState
)
&&
(
subState
<=
RRC_SUB_STATE_IDLE_LAST_NR
),
"Invalid nr sub state %d for state %d!
\n
"
,
subState
,
NR_UE_rrc_inst
[
ue_mod_idP
].
nrRrcState
);
break
;
case
RRC_STATE_CONNECTED_NR
:
AssertFatal
((
RRC_SUB_STATE_CONNECTED_FIRST_NR
<=
subState
)
&&
(
subState
<=
RRC_SUB_STATE_CONNECTED_LAST_NR
),
"Invalid nr sub state %d for state %d!
\n
"
,
subState
,
NR_UE_rrc_inst
[
ue_mod_idP
].
nrRrcState
);
break
;
}
}
if
(
NR_UE_rrc_inst
[
ue_mod_idP
].
nrRrcSubState
!=
subState
)
{
NR_UE_rrc_inst
[
ue_mod_idP
].
nrRrcSubState
=
subState
;
return
(
1
);
}
return
(
0
);
}
extern
boolean_t
nr_rrc_pdcp_config_asn1_req
(
extern
boolean_t
nr_rrc_pdcp_config_asn1_req
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
protocol_ctxt_t
*
const
ctxt_pP
,
NR_SRB_ToAddModList_t
*
const
srb2add_list
,
NR_SRB_ToAddModList_t
*
const
srb2add_list
,
...
@@ -412,6 +470,42 @@ int8_t nr_ue_process_spcell_config(NR_SpCellConfig_t *spcell_config){
...
@@ -412,6 +470,42 @@ int8_t nr_ue_process_spcell_config(NR_SpCellConfig_t *spcell_config){
return
0
;
return
0
;
}
}
//-----------------------------------------------------------------------------
void
rrc_ue_generate_RRCSetupRequest
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
uint8_t
gNB_index
)
{
uint8_t
i
=
0
,
rv
[
6
];
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
payload_size
==
0
)
{
// Get RRCConnectionRequest, fill random for now
// Generate random byte stream for contention resolution
for
(
i
=
0
;
i
<
6
;
i
++
)
{
#ifdef SMBV
// if SMBV is configured the contention resolution needs to be fix for the connection procedure to succeed
rv
[
i
]
=
i
;
#else
rv
[
i
]
=
taus
()
&
0xff
;
#endif
LOG_T
(
RRC
,
"%x."
,
rv
[
i
]);
}
LOG_T
(
RRC
,
"
\n
"
);
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
payload_size
=
do_RRCSetupRequest
(
ctxt_pP
->
module_id
,
(
uint8_t
*
)
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
Payload
,
rv
);
LOG_I
(
RRC
,
"[UE %d] : Frame %d, Logical Channel UL-CCCH (SRB0), Generating RRCSetupRequest (bytes %d, gNB %d)
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
payload_size
,
gNB_index
);
for
(
i
=
0
;
i
<
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
payload_size
;
i
++
)
{
LOG_T
(
RRC
,
"%x."
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
Payload
[
i
]);
}
LOG_T
(
RRC
,
"
\n
"
);
/*UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.Payload[i] = taus()&0xff;
UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.payload_size =i; */
}
}
/*brief decode BCCH-BCH (MIB) message*/
/*brief decode BCCH-BCH (MIB) message*/
int8_t
nr_rrc_ue_decode_NR_BCCH_BCH_Message
(
int8_t
nr_rrc_ue_decode_NR_BCCH_BCH_Message
(
const
module_id_t
module_id
,
const
module_id_t
module_id
,
...
@@ -460,6 +554,896 @@ int8_t nr_rrc_ue_decode_NR_BCCH_BCH_Message(
...
@@ -460,6 +554,896 @@ int8_t nr_rrc_ue_decode_NR_BCCH_BCH_Message(
return
0
;
return
0
;
}
}
static
const
char
siWindowLength
[
10
][
5
]
=
{
"5s"
,
"10s"
,
"20s"
,
"40s"
,
"80s"
,
"160s"
,
"320s"
,
"640s"
,
"1280s"
,
"ERR"
};
// {"1ms","2ms","5ms","10ms","15ms","20ms","40ms","80ms","ERR"};
static
const
char
siWindowLength_int
[
9
]
=
{
5
,
10
,
20
,
40
,
80
,
160
,
320
,
640
,
1280
};
//{1,2,5,10,15,20,40,80};
static
const
char
SIBType
[
12
][
6
]
=
{
"SIB3"
,
"SIB4"
,
"SIB5"
,
"SIB6"
,
"SIB7"
,
"SIB8"
,
"SIB9"
,
"SIB10"
,
"SIB11"
,
"SIB12"
,
"SIB13"
,
"Spare"
};
static
const
char
SIBPeriod
[
8
][
6
]
=
{
"rf8"
,
"rf16"
,
"rf32"
,
"rf64"
,
"rf128"
,
"rf256"
,
"rf512"
,
"ERR"
};
static
int
siPeriod_int
[
7
]
=
{
80
,
160
,
320
,
640
,
1280
,
2560
,
5120
};
const
char
*
nr_SIBreserved
(
long
value
)
{
if
(
value
<
0
||
value
>
1
)
return
"ERR"
;
if
(
value
)
return
"notReserved"
;
return
"reserved"
;
}
void
nr_dump_sib2
(
NR_SIB2_t
*
sib2
){
//cellReselectionInfoCommon
//nrofSS_BlocksToAverage
if
(
sib2
->
cellReselectionInfoCommon
.
nrofSS_BlocksToAverage
)
LOG_I
(
RRC
,
"cellReselectionInfoCommon.nrofSS_BlocksToAverage : %ld
\n
"
,
*
sib2
->
cellReselectionInfoCommon
.
nrofSS_BlocksToAverage
);
else
LOG_I
(
RRC
,
"cellReselectionInfoCommon->nrofSS_BlocksToAverage : not defined
\n
"
);
//absThreshSS_BlocksConsolidation
if
(
sib2
->
cellReselectionInfoCommon
.
absThreshSS_BlocksConsolidation
){
LOG_I
(
RRC
,
"absThreshSS_BlocksConsolidation.thresholdRSRP : %ld
\n
"
,
*
sib2
->
cellReselectionInfoCommon
.
absThreshSS_BlocksConsolidation
->
thresholdRSRP
);
LOG_I
(
RRC
,
"absThreshSS_BlocksConsolidation.thresholdRSRQ : %ld
\n
"
,
*
sib2
->
cellReselectionInfoCommon
.
absThreshSS_BlocksConsolidation
->
thresholdRSRQ
);
LOG_I
(
RRC
,
"absThreshSS_BlocksConsolidation.thresholdSINR : %ld
\n
"
,
*
sib2
->
cellReselectionInfoCommon
.
absThreshSS_BlocksConsolidation
->
thresholdSINR
);
}
else
LOG_I
(
RRC
,
"cellReselectionInfoCommon->absThreshSS_BlocksConsolidation : not defined
\n
"
);
//q_Hyst
LOG_I
(
RRC
,
"cellReselectionInfoCommon.q_Hyst : %ld
\n
"
,
sib2
->
cellReselectionInfoCommon
.
q_Hyst
);
//speedStateReselectionPars
if
(
sib2
->
cellReselectionInfoCommon
.
speedStateReselectionPars
){
LOG_I
(
RRC
,
"speedStateReselectionPars->mobilityStateParameters.t_Evaluation : %ld
\n
"
,
sib2
->
cellReselectionInfoCommon
.
speedStateReselectionPars
->
mobilityStateParameters
.
t_Evaluation
);
LOG_I
(
RRC
,
"speedStateReselectionPars->mobilityStateParameters.t_HystNormal : %ld
\n
"
,
sib2
->
cellReselectionInfoCommon
.
speedStateReselectionPars
->
mobilityStateParameters
.
t_HystNormal
);
LOG_I
(
RRC
,
"speedStateReselectionPars->mobilityStateParameters.n_CellChangeMedium : %ld
\n
"
,
sib2
->
cellReselectionInfoCommon
.
speedStateReselectionPars
->
mobilityStateParameters
.
n_CellChangeMedium
);
LOG_I
(
RRC
,
"speedStateReselectionPars->mobilityStateParameters.n_CellChangeHigh : %ld
\n
"
,
sib2
->
cellReselectionInfoCommon
.
speedStateReselectionPars
->
mobilityStateParameters
.
n_CellChangeHigh
);
LOG_I
(
RRC
,
"speedStateReselectionPars->q_HystSF.sf_Medium : %ld
\n
"
,
sib2
->
cellReselectionInfoCommon
.
speedStateReselectionPars
->
q_HystSF
.
sf_Medium
);
LOG_I
(
RRC
,
"speedStateReselectionPars->q_HystSF.sf_High : %ld
\n
"
,
sib2
->
cellReselectionInfoCommon
.
speedStateReselectionPars
->
q_HystSF
.
sf_High
);
}
else
LOG_I
(
RRC
,
"cellReselectionInfoCommon->speedStateReselectionPars : not defined
\n
"
);
//cellReselectionServingFreqInfo
if
(
sib2
->
cellReselectionServingFreqInfo
.
s_NonIntraSearchP
)
LOG_I
(
RRC
,
"cellReselectionServingFreqInfo.s_NonIntraSearchP : %ld
\n
"
,
*
sib2
->
cellReselectionServingFreqInfo
.
s_NonIntraSearchP
);
else
LOG_I
(
RRC
,
"cellReselectionServingFreqInfo->s_NonIntraSearchP : not defined
\n
"
);
if
(
sib2
->
cellReselectionServingFreqInfo
.
s_NonIntraSearchQ
)
LOG_I
(
RRC
,
"cellReselectionServingFreqInfo.s_NonIntraSearchQ : %ld
\n
"
,
*
sib2
->
cellReselectionServingFreqInfo
.
s_NonIntraSearchQ
);
else
LOG_I
(
RRC
,
"cellReselectionServingFreqInfo->s_NonIntraSearchQ : not defined
\n
"
);
LOG_I
(
RRC
,
"cellReselectionServingFreqInfo.threshServingLowP : %ld
\n
"
,
sib2
->
cellReselectionServingFreqInfo
.
threshServingLowP
);
if
(
sib2
->
cellReselectionServingFreqInfo
.
threshServingLowQ
)
LOG_I
(
RRC
,
"cellReselectionServingFreqInfo.threshServingLowQ : %ld
\n
"
,
*
sib2
->
cellReselectionServingFreqInfo
.
threshServingLowQ
);
else
LOG_I
(
RRC
,
"cellReselectionServingFreqInfo->threshServingLowQ : not defined
\n
"
);
LOG_I
(
RRC
,
"cellReselectionServingFreqInfo.cellReselectionPriority : %ld
\n
"
,
sib2
->
cellReselectionServingFreqInfo
.
cellReselectionPriority
);
if
(
sib2
->
cellReselectionServingFreqInfo
.
cellReselectionSubPriority
)
LOG_I
(
RRC
,
"cellReselectionServingFreqInfo.cellReselectionSubPriority : %ld
\n
"
,
*
sib2
->
cellReselectionServingFreqInfo
.
cellReselectionSubPriority
);
else
LOG_I
(
RRC
,
"cellReselectionServingFreqInfo->cellReselectionSubPriority : not defined
\n
"
);
//intraFreqCellReselectionInfo
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.q_RxLevMin : %ld
\n
"
,
sib2
->
intraFreqCellReselectionInfo
.
q_RxLevMin
);
if
(
sib2
->
intraFreqCellReselectionInfo
.
q_RxLevMinSUL
)
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.q_RxLevMinSUL : %ld
\n
"
,
*
sib2
->
intraFreqCellReselectionInfo
.
q_RxLevMinSUL
);
else
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo->q_RxLevMinSUL : not defined
\n
"
);
if
(
sib2
->
intraFreqCellReselectionInfo
.
q_QualMin
)
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.q_QualMin : %ld
\n
"
,
*
sib2
->
intraFreqCellReselectionInfo
.
q_QualMin
);
else
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo->q_QualMin : not defined
\n
"
);
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.s_IntraSearchP : %ld
\n
"
,
sib2
->
intraFreqCellReselectionInfo
.
s_IntraSearchP
);
if
(
sib2
->
intraFreqCellReselectionInfo
.
s_IntraSearchQ
)
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.s_IntraSearchQ : %ld
\n
"
,
*
sib2
->
intraFreqCellReselectionInfo
.
s_IntraSearchQ
);
else
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo->s_IntraSearchQ : not defined
\n
"
);
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.t_ReselectionNR : %ld
\n
"
,
sib2
->
intraFreqCellReselectionInfo
.
t_ReselectionNR
);
if
(
sib2
->
intraFreqCellReselectionInfo
.
frequencyBandList
)
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.frequencyBandList : %p
\n
"
,
sib2
->
intraFreqCellReselectionInfo
.
frequencyBandList
);
else
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo->frequencyBandList : not defined
\n
"
);
if
(
sib2
->
intraFreqCellReselectionInfo
.
frequencyBandListSUL
)
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.frequencyBandListSUL : %p
\n
"
,
sib2
->
intraFreqCellReselectionInfo
.
frequencyBandListSUL
);
else
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo->frequencyBandListSUL : not defined
\n
"
);
if
(
sib2
->
intraFreqCellReselectionInfo
.
p_Max
)
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.p_Max : %ld
\n
"
,
*
sib2
->
intraFreqCellReselectionInfo
.
p_Max
);
else
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo->p_Max : not defined
\n
"
);
if
(
sib2
->
intraFreqCellReselectionInfo
.
smtc
)
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.smtc : %p
\n
"
,
sib2
->
intraFreqCellReselectionInfo
.
smtc
);
else
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo->smtc : not defined
\n
"
);
if
(
sib2
->
intraFreqCellReselectionInfo
.
ss_RSSI_Measurement
)
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.ss_RSSI_Measurement : %p
\n
"
,
sib2
->
intraFreqCellReselectionInfo
.
ss_RSSI_Measurement
);
else
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo->ss_RSSI_Measurement : not defined
\n
"
);
if
(
sib2
->
intraFreqCellReselectionInfo
.
ssb_ToMeasure
)
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.ssb_ToMeasure : %p
\n
"
,
sib2
->
intraFreqCellReselectionInfo
.
ssb_ToMeasure
);
else
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo->ssb_ToMeasure : not defined
\n
"
);
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo.deriveSSB_IndexFromCell : %d
\n
"
,
sib2
->
intraFreqCellReselectionInfo
.
deriveSSB_IndexFromCell
);
}
void
nr_dump_sib3
(
NR_SIB3_t
*
sib3
)
{
//intraFreqNeighCellList
if
(
sib3
->
intraFreqNeighCellList
){
LOG_I
(
RRC
,
"intraFreqNeighCellList : %p
\n
"
,
sib3
->
intraFreqNeighCellList
);
const
int
n
=
sib3
->
intraFreqNeighCellList
->
list
.
count
;
for
(
int
i
=
0
;
i
<
n
;
++
i
){
LOG_I
(
RRC
,
"intraFreqNeighCellList->physCellId : %ld
\n
"
,
sib3
->
intraFreqNeighCellList
->
list
.
array
[
i
]
->
physCellId
);
LOG_I
(
RRC
,
"intraFreqNeighCellList->q_OffsetCell : %ld
\n
"
,
sib3
->
intraFreqNeighCellList
->
list
.
array
[
i
]
->
q_OffsetCell
);
if
(
sib3
->
intraFreqNeighCellList
->
list
.
array
[
i
]
->
q_RxLevMinOffsetCell
)
LOG_I
(
RRC
,
"intraFreqNeighCellList->q_RxLevMinOffsetCell : %ld
\n
"
,
*
sib3
->
intraFreqNeighCellList
->
list
.
array
[
i
]
->
q_RxLevMinOffsetCell
);
else
LOG_I
(
RRC
,
"intraFreqNeighCellList->q_RxLevMinOffsetCell : not defined
\n
"
);
if
(
sib3
->
intraFreqNeighCellList
->
list
.
array
[
i
]
->
q_RxLevMinOffsetCellSUL
)
LOG_I
(
RRC
,
"intraFreqNeighCellList->q_RxLevMinOffsetCellSUL : %ld
\n
"
,
*
sib3
->
intraFreqNeighCellList
->
list
.
array
[
i
]
->
q_RxLevMinOffsetCellSUL
);
else
LOG_I
(
RRC
,
"intraFreqNeighCellList->q_RxLevMinOffsetCellSUL : not defined
\n
"
);
if
(
sib3
->
intraFreqNeighCellList
->
list
.
array
[
i
]
->
q_QualMinOffsetCell
)
LOG_I
(
RRC
,
"intraFreqNeighCellList->q_QualMinOffsetCell : %ld
\n
"
,
*
sib3
->
intraFreqNeighCellList
->
list
.
array
[
i
]
->
q_QualMinOffsetCell
);
else
LOG_I
(
RRC
,
"intraFreqNeighCellList->q_QualMinOffsetCell : not defined
\n
"
);
}
}
else
{
LOG_I
(
RRC
,
"intraFreqCellReselectionInfo : not defined
\n
"
);
}
//intraFreqBlackCellList
if
(
sib3
->
intraFreqBlackCellList
){
LOG_I
(
RRC
,
"intraFreqBlackCellList : %p
\n
"
,
sib3
->
intraFreqBlackCellList
);
const
int
n
=
sib3
->
intraFreqBlackCellList
->
list
.
count
;
for
(
int
i
=
0
;
i
<
n
;
++
i
){
LOG_I
(
RRC
,
"intraFreqBlackCellList->start : %ld
\n
"
,
sib3
->
intraFreqBlackCellList
->
list
.
array
[
i
]
->
start
);
if
(
sib3
->
intraFreqBlackCellList
->
list
.
array
[
i
]
->
range
)
LOG_I
(
RRC
,
"intraFreqBlackCellList->range : %ld
\n
"
,
*
sib3
->
intraFreqBlackCellList
->
list
.
array
[
i
]
->
range
);
else
LOG_I
(
RRC
,
"intraFreqBlackCellList->range : not defined
\n
"
);
}
}
else
{
LOG_I
(
RRC
,
"intraFreqBlackCellList : not defined
\n
"
);
}
//lateNonCriticalExtension
if
(
sib3
->
lateNonCriticalExtension
)
LOG_I
(
RRC
,
"lateNonCriticalExtension : %p
\n
"
,
sib3
->
lateNonCriticalExtension
);
else
LOG_I
(
RRC
,
"lateNonCriticalExtension : not defined
\n
"
);
}
int
nr_decode_SI
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
uint8_t
gNB_index
)
{
NR_SystemInformation_t
**
si
=
&
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
si
[
gNB_index
];
int
new_sib
=
0
;
NR_SIB1_t
*
sib1
=
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib1
[
gNB_index
];
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI
,
VCD_FUNCTION_IN
);
// Dump contents
if
((
*
si
)
->
criticalExtensions
.
present
==
NR_SystemInformation__criticalExtensions_PR_systemInformation
||
(
*
si
)
->
criticalExtensions
.
present
==
NR_SystemInformation__criticalExtensions_PR_criticalExtensionsFuture_r16
)
{
LOG_D
(
RRC
,
"[UE] (*si)->criticalExtensions.choice.NR_SystemInformation_t->sib_TypeAndInfo.list.count %d
\n
"
,
(
*
si
)
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
count
);
}
else
{
LOG_D
(
RRC
,
"[UE] Unknown criticalExtension version (not Rel16)
\n
"
);
return
-
1
;
}
for
(
int
i
=
0
;
i
<
(
*
si
)
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
count
;
i
++
)
{
SystemInformation_IEs__sib_TypeAndInfo__Member
*
typeandinfo
;
typeandinfo
=
(
*
si
)
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
array
[
i
];
switch
(
typeandinfo
->
present
)
{
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib2
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
2
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
2
;
//new_sib=1;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib2
[
gNB_index
],
&
typeandinfo
->
choice
.
sib2
,
sizeof
(
NR_SIB2_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB2 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
nr_dump_sib2
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib2
[
gNB_index
]
);
LOG_I
(
RRC
,
"[FRAME %05"
PRIu32
"][RRC_UE][MOD %02"
PRIu8
"][][--- MAC_CONFIG_REQ (SIB2 params gNB %"
PRIu8
") --->][MAC_UE][MOD %02"
PRIu8
"][]
\n
"
,
ctxt_pP
->
frame
,
ctxt_pP
->
module_id
,
gNB_index
,
ctxt_pP
->
module_id
);
//TODO rrc_mac_config_req_ue
// After SI is received, prepare RRCConnectionRequest
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
MBMS_flag
<
3
)
// see -Q option
if
(
AMF_MODE_ENABLED
)
{
rrc_ue_generate_RRCSetupRequest
(
ctxt_pP
,
gNB_index
);
}
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
State
==
NR_RRC_IDLE
)
{
LOG_I
(
RRC
,
"[UE %d] Received SIB1/SIB2/SIB3 Switching to RRC_SI_RECEIVED
\n
"
,
ctxt_pP
->
module_id
);
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
State
=
NR_RRC_SI_RECEIVED
;
#if ENABLE_RAL
/* TODO {
MessageDef *message_ral_p = NULL;
rrc_ral_system_information_ind_t ral_si_ind;
message_ral_p = itti_alloc_new_message (TASK_RRC_UE, RRC_RAL_SYSTEM_INFORMATION_IND);
memset(&ral_si_ind, 0, sizeof(rrc_ral_system_information_ind_t));
ral_si_ind.plmn_id.MCCdigit2 = '0';
ral_si_ind.plmn_id.MCCdigit1 = '2';
ral_si_ind.plmn_id.MNCdigit3 = '0';
ral_si_ind.plmn_id.MCCdigit3 = '8';
ral_si_ind.plmn_id.MNCdigit2 = '9';
ral_si_ind.plmn_id.MNCdigit1 = '9';
ral_si_ind.cell_id = 1;
ral_si_ind.dbm = 0;
//ral_si_ind.dbm = fifo_dump_emos_UE.PHY_measurements->rx_rssi_dBm[gNB_index];
// TO DO
ral_si_ind.sinr = 0;
//ral_si_ind.sinr = fifo_dump_emos_UE.PHY_measurements->subband_cqi_dB[gNB_index][phy_vars_ue->lte_frame_parms.nb_antennas_rx][0];
// TO DO
ral_si_ind.link_data_rate = 0;
memcpy (&message_ral_p->ittiMsg, (void *) &ral_si_ind, sizeof(rrc_ral_system_information_ind_t));
#warning "ue_mod_idP ? for instance ?"
itti_send_msg_to_task (TASK_RAL_UE, UE_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), message_ral_p);
}*/
#endif
}
}
break
;
// case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib3
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
4
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
4
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib3
[
gNB_index
],
&
typeandinfo
->
choice
.
sib3
,
sizeof
(
LTE_SystemInformationBlockType3_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB3 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
nr_dump_sib3
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib3
[
gNB_index
]
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib4
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
8
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
8
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib4
[
gNB_index
],
typeandinfo
->
choice
.
sib4
,
sizeof
(
NR_SIB4_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB4 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib5
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
16
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
16
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib5
[
gNB_index
],
typeandinfo
->
choice
.
sib5
,
sizeof
(
NR_SIB5_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB5 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
//dump_sib5(NR_UE_rrc_inst[ctxt_pP->module_id].sib5[gNB_index]);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib6
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
32
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
32
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib6
[
gNB_index
],
typeandinfo
->
choice
.
sib6
,
sizeof
(
NR_SIB6_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB6 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib7
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
64
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
64
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib7
[
gNB_index
],
typeandinfo
->
choice
.
sib7
,
sizeof
(
NR_SIB7_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB7 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib8
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
128
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
128
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib8
[
gNB_index
],
typeandinfo
->
choice
.
sib8
,
sizeof
(
NR_SIB8_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB8 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib9
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
256
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
256
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib9
[
gNB_index
],
typeandinfo
->
choice
.
sib9
,
sizeof
(
NR_SIB9_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB9 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib10_v1610
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
512
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
512
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib10
[
gNB_index
],
typeandinfo
->
choice
.
sib10_v1610
,
sizeof
(
NR_SIB10_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB10 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib11_v1610
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
1024
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
1024
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib11
[
gNB_index
],
typeandinfo
->
choice
.
sib11_v1610
,
sizeof
(
NR_SIB11_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB11 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib12_v1610
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
2048
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
2048
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib12
[
gNB_index
],
typeandinfo
->
choice
.
sib12_v1610
,
sizeof
(
NR_SIB12_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB12 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib13_v1610
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
4096
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
4096
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib13
[
gNB_index
],
typeandinfo
->
choice
.
sib13_v1610
,
sizeof
(
NR_SIB13_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB13 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
//dump_sib13( NR_UE_rrc_inst[ctxt_pP->module_id].sib13[gNB_index] );
// adding here function to store necessary parameters for using in decode_MCCH_Message + maybe transfer to PHY layer
LOG_I
(
RRC
,
"[FRAME %05"
PRIu32
"][RRC_UE][MOD %02"
PRIu8
"][][--- MAC_CONFIG_REQ (SIB13 params gNB %"
PRIu8
") --->][MAC_UE][MOD %02"
PRIu8
"][]
\n
"
,
ctxt_pP
->
frame
,
ctxt_pP
->
module_id
,
gNB_index
,
ctxt_pP
->
module_id
);
// TODO rrc_mac_config_req_ue
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib14_v1610
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
8192
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
8192
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib12
[
gNB_index
],
typeandinfo
->
choice
.
sib14_v1610
,
sizeof
(
NR_SIB14_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB14 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
default:
break
;
}
if
(
new_sib
==
1
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIcnt
++
;
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIcnt
==
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
)
nr_rrc_set_sub_state
(
ctxt_pP
->
module_id
,
RRC_SUB_STATE_IDLE_SIB_COMPLETE
);
LOG_I
(
RRC
,
"SIStatus %x, SIcnt %d/%d
\n
"
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIcnt
,
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
);
}
}
//if (new_sib == 1) {
// NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIcnt++;
// if (NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIcnt == sib1->schedulingInfoList.list.count)
// rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_SIB_COMPLETE );
// LOG_I(RRC,"SIStatus %x, SIcnt %d/%d\n",
// NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIStatus,
// NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIcnt,
// sib1->schedulingInfoList.list.count);
//}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI
,
VCD_FUNCTION_OUT
);
return
0
;
}
int
nr_decode_SIB1
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
uint8_t
gNB_index
,
const
uint8_t
rsrq
,
const
uint8_t
rsrp
)
{
NR_SIB1_t
*
sib1
=
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib1
[
gNB_index
];
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SIB1
,
VCD_FUNCTION_IN
);
LOG_I
(
RRC
,
"[UE %d] : Dumping SIB 1
\n
"
,
ctxt_pP
->
module_id
);
const
int
n
=
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
count
;
for
(
int
i
=
0
;
i
<
n
;
++
i
)
{
NR_PLMN_Identity_t
*
PLMN_identity
=
&
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
i
]
->
plmn_IdentityList
.
list
.
array
[
0
];
int
mccdigits
=
PLMN_identity
->
mcc
->
list
.
count
;
int
mncdigits
=
PLMN_identity
->
mnc
.
list
.
count
;
int
mcc
;
if
(
mccdigits
==
2
)
{
mcc
=
*
PLMN_identity
->
mcc
->
list
.
array
[
0
]
*
10
+
*
PLMN_identity
->
mcc
->
list
.
array
[
1
];
}
else
{
mcc
=
*
PLMN_identity
->
mcc
->
list
.
array
[
0
]
*
100
+
*
PLMN_identity
->
mcc
->
list
.
array
[
1
]
*
10
+
*
PLMN_identity
->
mcc
->
list
.
array
[
2
];
}
int
mnc
;
if
(
mncdigits
==
2
)
{
mnc
=
*
PLMN_identity
->
mnc
.
list
.
array
[
0
]
*
10
+
*
PLMN_identity
->
mnc
.
list
.
array
[
1
];
}
else
{
mnc
=
*
PLMN_identity
->
mnc
.
list
.
array
[
0
]
*
100
+
*
PLMN_identity
->
mnc
.
list
.
array
[
1
]
*
10
+
*
PLMN_identity
->
mnc
.
list
.
array
[
2
];
}
LOG_I
(
RRC
,
"PLMN %d MCC %0*d, MNC %0*d
\n
"
,
i
+
1
,
mccdigits
,
mcc
,
mncdigits
,
mnc
);
// search internal table for provider name
int
plmn_ind
=
0
;
while
(
plmn_data
[
plmn_ind
].
mcc
>
0
)
{
if
((
plmn_data
[
plmn_ind
].
mcc
==
mcc
)
&&
(
plmn_data
[
plmn_ind
].
mnc
==
mnc
))
{
LOG_I
(
RRC
,
"Found %s (name from internal table)
\n
"
,
plmn_data
[
plmn_ind
].
oper_short
);
break
;
}
plmn_ind
++
;
}
}
LOG_I
(
RRC
,
"TAC 0x%04x
\n
"
,
((
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
trackingAreaCode
->
size
==
2
)
?
((
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
trackingAreaCode
->
buf
[
0
]
<<
8
)
+
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
trackingAreaCode
->
buf
[
1
])
:
0
));
LOG_I
(
RRC
,
"cellReservedForOperatorUse : raw:%ld decoded:%s
\n
"
,
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
cellReservedForOperatorUse
,
nr_SIBreserved
(
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
cellReservedForOperatorUse
)
);
LOG_I
(
RRC
,
"cellAccessRelatedInfo.cellIdentity : raw:%"
PRIu32
" decoded:%02x.%02x.%02x.%02x
\n
"
,
BIT_STRING_to_uint32
(
&
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
cellIdentity
),
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
cellIdentity
.
buf
[
0
],
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
cellIdentity
.
buf
[
1
],
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
cellIdentity
.
buf
[
2
],
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
cellIdentity
.
buf
[
3
]
>>
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
cellIdentity
.
bits_unused
);
//LOG_I( RRC, "cellAccessRelatedInfo.cellBarred : raw:%ld decoded:%s\n", sib1->cellAccessRelatedInfo.cellBarred, SIBbarred(sib1->cellAccessRelatedInfo.cellBarred) );
//LOG_I( RRC, "cellAccessRelatedInfo.intraFreqReselection : raw:%ld decoded:%s\n", sib1->cellAccessRelatedInfo.intraFreqReselection, SIBallowed(sib1->cellAccessRelatedInfo.intraFreqReselection) );
//LOG_I( RRC, "cellAccessRelatedInfo.csg_Indication : %d\n", sib1->cellAccessRelatedInfo.csg_Indication );
//if (sib1->cellAccessRelatedInfo.csg_Identity)
// LOG_I( RRC, "cellAccessRelatedInfo.csg_Identity : %"PRIu32"\n", BIT_STRING_to_uint32(sib1->cellAccessRelatedInfo.csg_Identity) );
//else
// LOG_I( RRC, "cellAccessRelatedInfo.csg_Identity : not defined\n" );
LOG_I
(
RRC
,
"cellSelectionInfo.q_RxLevMin : %ld
\n
"
,
sib1
->
cellSelectionInfo
->
q_RxLevMin
);
if
(
sib1
->
cellSelectionInfo
->
q_RxLevMinOffset
)
LOG_I
(
RRC
,
"cellSelectionInfo.q_RxLevMinOffset : %ld
\n
"
,
*
sib1
->
cellSelectionInfo
->
q_RxLevMinOffset
);
else
LOG_I
(
RRC
,
"cellSelectionInfo.q_RxLevMinOffset : not defined
\n
"
);
//if (sib1->p_Max)
// LOG_I( RRC, "p_Max : %ld\n", *sib1->p_Max );
//else
// LOG_I( RRC, "p_Max : not defined\n" );
//LOG_I( RRC, "freqBandIndicator : %ld\n", sib1->freqBandIndicator );
if
(
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
>
0
)
{
for
(
int
i
=
0
;
i
<
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
;
i
++
)
{
LOG_I
(
RRC
,
"si_Periodicity[%d] : %s
\n
"
,
i
,
SIBPeriod
[
min
(
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
array
[
i
]
->
si_Periodicity
,
7
)]);
if
(
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
array
[
i
]
->
sib_MappingInfo
.
list
.
count
>
0
)
{
char
temp
[
32
*
sizeof
(
SIBType
[
0
])]
=
{
0
};
// maxSIB==32
for
(
int
j
=
0
;
j
<
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
array
[
i
]
->
sib_MappingInfo
.
list
.
count
;
j
++
)
{
sprintf
(
temp
+
j
*
sizeof
(
SIBType
[
0
]),
"%*s "
,
(
int
)
sizeof
(
SIBType
[
0
])
-
1
,
SIBType
[
min
(
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
array
[
i
]
->
sib_MappingInfo
.
list
.
array
[
0
]
->
type
,
11
)]
);
}
LOG_I
(
RRC
,
"siSchedulingInfoSIBType[%d] : %s
\n
"
,
i
,
temp
);
}
else
{
LOG_I
(
RRC
,
"mapping list %d is null
\n
"
,
i
);
}
}
}
else
{
LOG_E
(
RRC
,
"siSchedulingInfoPeriod[0] : PROBLEM!!!
\n
"
);
return
-
1
;
}
if
(
sib1
->
servingCellConfigCommon
->
tdd_UL_DL_ConfigurationCommon
)
{
//TODO
}
LOG_I
(
RRC
,
"siWindowLength : %s
\n
"
,
siWindowLength
[
min
(
sib1
->
si_SchedulingInfo
->
si_WindowLength
,
8
)]
);
//LOG_I( RRC, "systemInfoValueTag : %ld\n", sib1->systemInfoValueTag );
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIperiod
=
siPeriod_int
[
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
array
[
0
]
->
si_Periodicity
];
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIwindowsize
=
siWindowLength_int
[
sib1
->
si_SchedulingInfo
->
si_WindowLength
];
LOG_I
(
RRC
,
"[FRAME unknown][RRC_UE][MOD %02"
PRIu8
"][][--- MAC_CONFIG_REQ (SIB1 params gNB %"
PRIu8
") --->][MAC_UE][MOD %02"
PRIu8
"][]
\n
"
,
ctxt_pP
->
module_id
,
gNB_index
,
ctxt_pP
->
module_id
);
//rrc_mac_config_req_ue
LOG_I
(
RRC
,
"Setting SIStatus bit 0 to 1
\n
"
);
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
=
1
;
//NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIB1systemInfoValueTag = sib1->systemInfoValueTag;
if
(
AMF_MODE_ENABLED
)
{
int
cell_valid
=
0
;
//if (sib1->cellAccessRelatedInfo.cellBarred == LTE_SystemInformationBlockType1__cellAccessRelatedInfo__cellBarred_notBarred) {
/* Cell is not barred */
int
plmn
;
int
plmn_number
;
plmn_number
=
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
count
;
/* Compare requested PLMN and PLMNs from SIB1*/
for
(
plmn
=
0
;
plmn
<
plmn_number
;
plmn
++
)
{
NR_PLMN_Identity_t
*
plmn_Identity
;
plmn_Identity
=
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
plmn
]
->
plmn_IdentityList
.
list
.
array
[
0
];
if
(
(
(
plmn_Identity
->
mcc
==
NULL
)
||
(
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
plmnID
.
MCCdigit1
==
*
(
plmn_Identity
->
mcc
->
list
.
array
[
0
]))
&&
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
plmnID
.
MCCdigit2
==
*
(
plmn_Identity
->
mcc
->
list
.
array
[
1
]))
&&
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
plmnID
.
MCCdigit3
==
*
(
plmn_Identity
->
mcc
->
list
.
array
[
2
]))
)
)
&&
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
plmnID
.
MNCdigit1
==
*
(
plmn_Identity
->
mnc
.
list
.
array
[
0
]))
&&
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
plmnID
.
MNCdigit2
==
*
(
plmn_Identity
->
mnc
.
list
.
array
[
1
]))
&&
(
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
plmnID
.
MNCdigit3
==
0xf
)
&&
(
plmn_Identity
->
mnc
.
list
.
count
==
2
))
||
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
plmnID
.
MNCdigit3
==
*
(
plmn_Identity
->
mnc
.
list
.
array
[
2
]))
)
)
{
/* PLMN match, send a confirmation to NAS */
MessageDef
*
msg_p
;
msg_p
=
itti_alloc_new_message
(
TASK_RRC_UE
,
NAS_CELL_SELECTION_CNF
);
NAS_CELL_SELECTION_CNF
(
msg_p
).
errCode
=
AS_SUCCESS
;
NAS_CELL_SELECTION_CNF
(
msg_p
).
cellID
=
BIT_STRING_to_uint32
(
&
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
cellIdentity
);
NAS_CELL_SELECTION_CNF
(
msg_p
).
tac
=
BIT_STRING_to_uint16
(
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
trackingAreaCode
);
NAS_CELL_SELECTION_CNF
(
msg_p
).
rat
=
0xFF
;
NAS_CELL_SELECTION_CNF
(
msg_p
).
rsrq
=
rsrq
;
NAS_CELL_SELECTION_CNF
(
msg_p
).
rsrp
=
rsrp
;
itti_send_msg_to_task
(
TASK_NAS_UE
,
ctxt_pP
->
instance
,
msg_p
);
cell_valid
=
1
;
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
selected_plmn_identity
=
plmn
+
1
;
break
;
}
}
//}
if
(
cell_valid
==
0
)
{
/* Cell can not be used, ask PHY to try the next one */
MessageDef
*
msg_p
;
msg_p
=
itti_alloc_new_message
(
TASK_RRC_UE
,
PHY_FIND_NEXT_CELL_REQ
);
itti_send_msg_to_task
(
TASK_PHY_UE
,
ctxt_pP
->
instance
,
msg_p
);
LOG_E
(
RRC
,
"Synched with a cell, but PLMN doesn't match our SIM "
"(selected_plmn_identity %d), the message PHY_FIND_NEXT_CELL_REQ "
"is sent but lost in current UE implementation!
\n
"
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
selected_plmn_identity
);
}
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SIB1
,
VCD_FUNCTION_OUT
);
return
0
;
}
int
nr_decode_BCCH_DLSCH_Message
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
uint8_t
gNB_index
,
uint8_t
*
const
Sdu
,
const
uint8_t
Sdu_len
,
const
uint8_t
rsrq
,
const
uint8_t
rsrp
)
{
NR_BCCH_DL_SCH_Message_t
*
bcch_message
=
NULL
;
NR_SIB1_t
*
sib1
=
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib1
[
gNB_index
];
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH
,
VCD_FUNCTION_IN
);
if
(((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
1
)
==
1
)
&&
// SIB1 received
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIcnt
==
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
))
{
// to prevent memory bloating
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH
,
VCD_FUNCTION_OUT
);
return
0
;
}
nr_rrc_set_sub_state
(
ctxt_pP
->
module_id
,
RRC_SUB_STATE_IDLE_RECEIVING_SIB_NR
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_BCCH_DL_SCH_Message
,(
void
*
)
bcch_message
);
}
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_BCCH_DL_SCH_Message
,
(
void
**
)
&
bcch_message
,
(
const
void
*
)
Sdu
,
Sdu_len
);
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
LOG_E
(
RRC
,
"[UE %"
PRIu8
"] Failed to decode BCCH_DLSCH_MESSAGE (%zu bits)
\n
"
,
ctxt_pP
->
module_id
,
dec_rval
.
consumed
);
log_dump
(
RRC
,
Sdu
,
Sdu_len
,
LOG_DUMP_CHAR
,
" Received bytes:
\n
"
);
// free the memory
SEQUENCE_free
(
&
asn_DEF_LTE_BCCH_DL_SCH_Message
,
(
void
*
)
bcch_message
,
1
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH
,
VCD_FUNCTION_OUT
);
return
-
1
;
}
if
(
bcch_message
->
message
.
present
==
NR_BCCH_DL_SCH_MessageType_PR_c1
)
{
switch
(
bcch_message
->
message
.
choice
.
c1
->
present
)
{
case
NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1
:
if
((
ctxt_pP
->
frame
%
2
)
==
0
)
{
// even frame
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
1
)
==
0
)
{
NR_SIB1_t
*
sib1
=
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib1
[
gNB_index
];
memcpy
(
(
void
*
)
sib1
,
(
void
*
)
bcch_message
->
message
.
choice
.
c1
->
choice
.
systemInformationBlockType1
,
sizeof
(
NR_SIB1_t
)
);
LOG_D
(
RRC
,
"[UE %"
PRIu8
"] Decoding First SIB1
\n
"
,
ctxt_pP
->
module_id
);
nr_decode_SIB1
(
ctxt_pP
,
gNB_index
,
rsrq
,
rsrp
);
}
}
break
;
case
NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformation
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
1
)
==
1
)
{
// SIB1 with schedulingInfoList is available
NR_SystemInformation_t
*
si
=
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
si
[
gNB_index
];
memcpy
(
si
,
bcch_message
->
message
.
choice
.
c1
->
choice
.
systemInformation
,
sizeof
(
NR_SystemInformation_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Decoding SI for frameP %"
PRIu32
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
);
nr_decode_SI
(
ctxt_pP
,
gNB_index
);
//if (nfapi_mode == 3)
//UE_mac_inst[ctxt_pP->module_id].SI_Decoded = 1;
}
break
;
case
NR_BCCH_DL_SCH_MessageType__c1_PR_NOTHING
:
default:
break
;
}
}
if
(
nr_rrc_get_sub_state
(
ctxt_pP
->
module_id
)
==
RRC_SUB_STATE_IDLE_SIB_COMPLETE_NR
)
{
//if ( (NR_UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data != NULL) || (!AMF_MODE_ENABLED)) {
rrc_ue_generate_RRCSetupRequest
(
ctxt_pP
,
0
);
nr_rrc_set_sub_state
(
ctxt_pP
->
module_id
,
RRC_SUB_STATE_IDLE_CONNECTING
);
//}
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH
,
VCD_FUNCTION_OUT
);
return
0
;
}
//-----------------------------------------------------------------------------
void
nr_rrc_ue_process_masterCellGroup
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
uint8_t
gNB_index
,
OCTET_STRING_t
*
masterCellGroup
)
//-----------------------------------------------------------------------------
{
NR_CellGroupConfig_t
*
cellGroupConfig
=
(
NR_CellGroupConfig_t
*
)
masterCellGroup
;
if
(
cellGroupConfig
->
spCellConfig
!=
NULL
&&
cellGroupConfig
->
spCellConfig
->
reconfigurationWithSync
!=
NULL
){
//TODO (perform Reconfiguration with sync according to 5.3.5.5.2)
//TODO (resume all suspended radio bearers and resume SCG transmission for all radio bearers, if suspended)
}
if
(
cellGroupConfig
->
rlc_BearerToReleaseList
!=
NULL
){
//TODO (perform RLC bearer release as specified in 5.3.5.5.3)
}
if
(
cellGroupConfig
->
rlc_BearerToAddModList
!=
NULL
){
//TODO (perform the RLC bearer addition/modification as specified in 5.3.5.5.4)
}
if
(
cellGroupConfig
->
mac_CellGroupConfig
!=
NULL
){
//TODO (configure the MAC entity of this cell group as specified in 5.3.5.5.5)
}
if
(
cellGroupConfig
->
sCellToReleaseList
!=
NULL
){
//TODO (perform SCell release as specified in 5.3.5.5.8)
}
if
(
cellGroupConfig
->
spCellConfig
!=
NULL
){
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
cell_group_config
->
spCellConfig
)
{
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
cell_group_config
->
spCellConfig
,
cellGroupConfig
->
spCellConfig
,
sizeof
(
struct
NR_SpCellConfig
));
}
else
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
cell_group_config
->
spCellConfig
=
cellGroupConfig
->
spCellConfig
;
}
//TODO (configure the SpCell as specified in 5.3.5.5.7)
}
if
(
cellGroupConfig
->
sCellToAddModList
!=
NULL
){
//TODO (perform SCell addition/modification as specified in 5.3.5.5.9)
}
if
(
cellGroupConfig
->
ext2
->
bh_RLC_ChannelToReleaseList_r16
!=
NULL
){
//TODO (perform the BH RLC channel addition/modification as specified in 5.3.5.5.11)
}
if
(
cellGroupConfig
->
ext2
->
bh_RLC_ChannelToAddModList_r16
!=
NULL
){
//TODO (perform the BH RLC channel addition/modification as specified in 5.3.5.5.11)
}
}
/*--------------------------------------------------*/
static
void
rrc_ue_generate_RRCSetupComplete
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
uint8_t
gNB_index
,
const
uint8_t
Transaction_id
,
uint8_t
sel_plmn_id
){
uint8_t
buffer
[
100
];
uint8_t
size
;
const
char
*
nas_msg
;
int
nas_msg_length
;
/*
if (EPC_MODE_ENABLED) {
nas_msg = (char *) UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data;
nas_msg_length = UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.length;
} else {
nas_msg = nas_attach_req_imsi;
nas_msg_length = sizeof(nas_attach_req_imsi);
}
*/
size
=
do_RRCSetupComplete
(
ctxt_pP
->
module_id
,
buffer
,
Transaction_id
,
sel_plmn_id
,
nas_msg_length
,
nas_msg
);
LOG_I
(
RRC
,
"[UE %d][RAPROC] Frame %d : Logical Channel UL-DCCH (SRB1), Generating RRCConnectionSetupComplete (bytes%d, gNB %d)
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
size
,
gNB_index
);
LOG_D
(
RLC
,
"[FRAME %05d][RRC_UE][MOD %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCConnectionSetupComplete to gNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]
\n
"
,
ctxt_pP
->
frame
,
ctxt_pP
->
module_id
+
NB_RN_INST
,
size
,
gNB_index
,
nr_rrc_mui
,
ctxt_pP
->
module_id
+
NB_eNB_INST
,
DCCH
);
// ctxt_pP_local.rnti = ctxt_pP->rnti;
rrc_data_req_ue
(
ctxt_pP
,
DCCH
,
nr_rrc_mui
++
,
SDU_CONFIRM_NO
,
size
,
buffer
,
PDCP_TRANSMISSION_MODE_CONTROL
);
}
int8_t
nr_rrc_ue_decode_ccch
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
SRB_INFO
*
const
Srb_info
,
const
uint8_t
gNB_index
){
NR_DL_CCCH_Message_t
*
dl_ccch_msg
=
NULL
;
asn_dec_rval_t
dec_rval
;
int
rval
=
0
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH
,
VCD_FUNCTION_IN
);
// LOG_D(RRC,"[UE %d] Decoding DL-CCCH message (%d bytes), State %d\n",ue_mod_idP,Srb_info->Rx_buffer.payload_size,
// NR_UE_rrc_inst[ue_mod_idP].Info[gNB_index].State);
dec_rval
=
uper_decode
(
NULL
,
&
asn_DEF_NR_DL_CCCH_Message
,
(
void
**
)
&
dl_ccch_msg
,
(
uint8_t
*
)
Srb_info
->
Rx_buffer
.
Payload
,
100
,
0
,
0
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_DL_CCCH_Message
,(
void
*
)
dl_ccch_msg
);
}
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
LOG_E
(
RRC
,
"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%zu bytes)
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
dec_rval
.
consumed
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH
,
VCD_FUNCTION_OUT
);
return
-
1
;
}
if
(
dl_ccch_msg
->
message
.
present
==
NR_DL_CCCH_MessageType_PR_c1
)
{
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
State
==
RRC_SI_RECEIVED
)
{
switch
(
dl_ccch_msg
->
message
.
choice
.
c1
->
present
)
{
case
NR_DL_CCCH_MessageType__c1_PR_NOTHING
:
LOG_I
(
RRC
,
"[UE%d] Frame %d : Received PR_NOTHING on DL-CCCH-Message
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
);
rval
=
0
;
break
;
case
NR_DL_CCCH_MessageType__c1_PR_rrcReject
:
LOG_I
(
RRC
,
"[UE%d] Frame %d : Logical Channel DL-CCCH (SRB0), Received RRCConnectionReject
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
);
rval
=
0
;
break
;
case
NR_DL_CCCH_MessageType__c1_PR_rrcSetup
:
LOG_I
(
RRC
,
"[UE%d][RAPROC] Frame %d : Logical Channel DL-CCCH (SRB0), Received NR_RRCSetup RNTI %x
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
ctxt_pP
->
rnti
);
// Get configuration
// Release T300 timer
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
T300_active
=
0
;
nr_rrc_ue_process_masterCellGroup
(
ctxt_pP
,
gNB_index
,
&
dl_ccch_msg
->
message
.
choice
.
c1
->
choice
.
rrcSetup
->
criticalExtensions
.
choice
.
rrcSetup
->
masterCellGroup
);
nr_sa_rrc_ue_process_radioBearerConfig
(
ctxt_pP
,
gNB_index
,
&
dl_ccch_msg
->
message
.
choice
.
c1
->
choice
.
rrcSetup
->
criticalExtensions
.
choice
.
rrcSetup
->
radioBearerConfig
);
nr_rrc_set_state
(
ctxt_pP
->
module_id
,
RRC_STATE_CONNECTED
);
nr_rrc_set_sub_state
(
ctxt_pP
->
module_id
,
RRC_SUB_STATE_CONNECTED
);
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
rnti
=
ctxt_pP
->
rnti
;
rrc_ue_generate_RRCSetupComplete
(
ctxt_pP
,
gNB_index
,
dl_ccch_msg
->
message
.
choice
.
c1
->
choice
.
rrcSetup
->
rrc_TransactionIdentifier
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
selected_plmn_identity
);
rval
=
0
;
break
;
default:
LOG_E
(
RRC
,
"[UE%d] Frame %d : Unknown message
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
);
rval
=
-
1
;
break
;
}
}
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH
,
VCD_FUNCTION_OUT
);
return
rval
;
}
// from NR SRB3
// from NR SRB3
int8_t
nr_rrc_ue_decode_NR_DL_DCCH_Message
(
int8_t
nr_rrc_ue_decode_NR_DL_DCCH_Message
(
...
@@ -550,7 +1534,7 @@ nr_rrc_ue_process_securityModeCommand(
...
@@ -550,7 +1534,7 @@ nr_rrc_ue_process_securityModeCommand(
NR_UL_DCCH_Message_t
ul_dcch_msg
;
NR_UL_DCCH_Message_t
ul_dcch_msg
;
uint8_t
buffer
[
200
];
uint8_t
buffer
[
200
];
int
i
,
securityMode
;
int
i
,
securityMode
;
LOG_I
(
RRC
,
"[UE %d] SFN/SF %d/%d: Receiving from SRB1 (DL-DCCH), Processing securityModeCommand (
e
NB %d)
\n
"
,
LOG_I
(
RRC
,
"[UE %d] SFN/SF %d/%d: Receiving from SRB1 (DL-DCCH), Processing securityModeCommand (
g
NB %d)
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
ctxt_pP
->
subframe
,
gNB_index
);
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
ctxt_pP
->
subframe
,
gNB_index
);
switch
(
securityModeCommand
->
criticalExtensions
.
choice
.
securityModeCommand
->
securityConfigSMC
.
securityAlgorithmConfig
.
cipheringAlgorithm
)
{
switch
(
securityModeCommand
->
criticalExtensions
.
choice
.
securityModeCommand
->
securityConfigSMC
.
securityAlgorithmConfig
.
cipheringAlgorithm
)
{
...
@@ -663,7 +1647,7 @@ memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
...
@@ -663,7 +1647,7 @@ memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
ul_dcch_msg
.
message
.
choice
.
c1
->
choice
.
securityModeComplete
->
rrc_TransactionIdentifier
=
securityModeCommand
->
rrc_TransactionIdentifier
;
ul_dcch_msg
.
message
.
choice
.
c1
->
choice
.
securityModeComplete
->
rrc_TransactionIdentifier
=
securityModeCommand
->
rrc_TransactionIdentifier
;
ul_dcch_msg
.
message
.
choice
.
c1
->
choice
.
securityModeComplete
->
criticalExtensions
.
present
=
NR_SecurityModeComplete__criticalExtensions_PR_securityModeComplete
;
ul_dcch_msg
.
message
.
choice
.
c1
->
choice
.
securityModeComplete
->
criticalExtensions
.
present
=
NR_SecurityModeComplete__criticalExtensions_PR_securityModeComplete
;
ul_dcch_msg
.
message
.
choice
.
c1
->
choice
.
securityModeComplete
->
criticalExtensions
.
choice
.
securityModeComplete
->
nonCriticalExtension
=
NULL
;
ul_dcch_msg
.
message
.
choice
.
c1
->
choice
.
securityModeComplete
->
criticalExtensions
.
choice
.
securityModeComplete
->
nonCriticalExtension
=
NULL
;
LOG_I
(
RRC
,
"[UE %d] SFN/SF %d/%d: Receiving from SRB1 (DL-DCCH), encoding securityModeComplete (
e
NB %d), rrc_TransactionIdentifier: %ld
\n
"
,
LOG_I
(
RRC
,
"[UE %d] SFN/SF %d/%d: Receiving from SRB1 (DL-DCCH), encoding securityModeComplete (
g
NB %d), rrc_TransactionIdentifier: %ld
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
ctxt_pP
->
subframe
,
gNB_index
,
securityModeCommand
->
rrc_TransactionIdentifier
);
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
ctxt_pP
->
subframe
,
gNB_index
,
securityModeCommand
->
rrc_TransactionIdentifier
);
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_UL_DCCH_Message
,
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_UL_DCCH_Message
,
NULL
,
NULL
,
...
@@ -696,42 +1680,6 @@ memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
...
@@ -696,42 +1680,6 @@ memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
securityModeCommand
->
criticalExtensions
.
present
);
securityModeCommand
->
criticalExtensions
.
present
);
}
}
//-----------------------------------------------------------------------------
void
rrc_ue_generate_RRCSetupRequest
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
uint8_t
gNB_index
)
{
uint8_t
i
=
0
,
rv
[
6
];
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
payload_size
==
0
)
{
// Get RRCConnectionRequest, fill random for now
// Generate random byte stream for contention resolution
for
(
i
=
0
;
i
<
6
;
i
++
)
{
#ifdef SMBV
// if SMBV is configured the contention resolution needs to be fix for the connection procedure to succeed
rv
[
i
]
=
i
;
#else
rv
[
i
]
=
taus
()
&
0xff
;
#endif
LOG_T
(
RRC
,
"%x."
,
rv
[
i
]);
}
LOG_T
(
RRC
,
"
\n
"
);
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
payload_size
=
do_RRCSetupRequest
(
ctxt_pP
->
module_id
,
(
uint8_t
*
)
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
Payload
,
rv
);
LOG_I
(
RRC
,
"[UE %d] : Frame %d, Logical Channel UL-CCCH (SRB0), Generating RRCSetupRequest (bytes %d, eNB %d)
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
payload_size
,
gNB_index
);
for
(
i
=
0
;
i
<
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
payload_size
;
i
++
)
{
LOG_T
(
RRC
,
"%x."
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Srb0
[
gNB_index
].
Tx_buffer
.
Payload
[
i
]);
}
LOG_T
(
RRC
,
"
\n
"
);
/*UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.Payload[i] = taus()&0xff;
UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.payload_size =i; */
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
int32_t
int32_t
nr_rrc_ue_establish_srb1
(
nr_rrc_ue_establish_srb1
(
...
@@ -746,13 +1694,7 @@ nr_rrc_ue_establish_srb1(
...
@@ -746,13 +1694,7 @@ nr_rrc_ue_establish_srb1(
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb1
[
gNB_index
].
Active
=
1
;
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb1
[
gNB_index
].
Active
=
1
;
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb1
[
gNB_index
].
Status
=
RADIO_CONFIG_OK
;
//RADIO CFG
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb1
[
gNB_index
].
Status
=
RADIO_CONFIG_OK
;
//RADIO CFG
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb1
[
gNB_index
].
Srb_info
.
Srb_id
=
1
;
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb1
[
gNB_index
].
Srb_info
.
Srb_id
=
1
;
// copy default configuration for now
// memcpy(&UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Srb_info.Lchan_desc[0],&DCCH_LCHAN_DESC,LCHAN_DESC_SIZE);
// memcpy(&UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Srb_info.Lchan_desc[1],&DCCH_LCHAN_DESC,LCHAN_DESC_SIZE);
LOG_I
(
NR_RRC
,
"[UE %d], CONFIG_SRB1 %d corresponding to gNB_index %d
\n
"
,
ue_mod_idP
,
DCCH
,
gNB_index
);
LOG_I
(
NR_RRC
,
"[UE %d], CONFIG_SRB1 %d corresponding to gNB_index %d
\n
"
,
ue_mod_idP
,
DCCH
,
gNB_index
);
//rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD, lchan_id,UNDEF_SECURITY_MODE);
// rrc_rlc_config_req(ue_mod_idP+NB_eNB_INST,frameP,0,CONFIG_ACTION_ADD,lchan_id,SIGNALLING_RADIO_BEARER,Rlc_info_am_config);
// UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Srb_info.Tx_buffer.payload_size=DEFAULT_MEAS_IND_SIZE+1;
return
(
0
);
return
(
0
);
}
}
...
@@ -770,13 +1712,7 @@ nr_rrc_ue_establish_srb2(
...
@@ -770,13 +1712,7 @@ nr_rrc_ue_establish_srb2(
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb2
[
gNB_index
].
Active
=
1
;
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb2
[
gNB_index
].
Active
=
1
;
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb2
[
gNB_index
].
Status
=
RADIO_CONFIG_OK
;
//RADIO CFG
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb2
[
gNB_index
].
Status
=
RADIO_CONFIG_OK
;
//RADIO CFG
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb2
[
gNB_index
].
Srb_info
.
Srb_id
=
2
;
NR_UE_rrc_inst
[
ue_mod_idP
].
Srb2
[
gNB_index
].
Srb_info
.
Srb_id
=
2
;
// copy default configuration for now
// memcpy(&UE_rrc_inst[ue_mod_idP].Srb2[eNB_index].Srb_info.Lchan_desc[0],&DCCH_LCHAN_DESC,LCHAN_DESC_SIZE);
// memcpy(&UE_rrc_inst[ue_mod_idP].Srb2[eNB_index].Srb_info.Lchan_desc[1],&DCCH_LCHAN_DESC,LCHAN_DESC_SIZE);
LOG_I
(
NR_RRC
,
"[UE %d], CONFIG_SRB2 %d corresponding to gNB_index %d
\n
"
,
ue_mod_idP
,
DCCH1
,
gNB_index
);
LOG_I
(
NR_RRC
,
"[UE %d], CONFIG_SRB2 %d corresponding to gNB_index %d
\n
"
,
ue_mod_idP
,
DCCH1
,
gNB_index
);
//rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD, lchan_id, UNDEF_SECURITY_MODE);
// rrc_rlc_config_req(ue_mod_idP+NB_eNB_INST,frameP,0,CONFIG_ACTION_ADD,lchan_id,SIGNALLING_RADIO_BEARER,Rlc_info_am_config);
// UE_rrc_inst[ue_mod_idP].Srb1[eNB_index].Srb_info.Tx_buffer.payload_size=DEFAULT_MEAS_IND_SIZE+1;
return
(
0
);
return
(
0
);
}
}
...
@@ -799,7 +1735,7 @@ nr_rrc_ue_establish_drb(
...
@@ -799,7 +1735,7 @@ nr_rrc_ue_establish_drb(
LOG_I
(
NR_RRC
,
"[UE %d] Frame %d: processing RRCReconfiguration: reconfiguring DRB %ld
\n
"
,
LOG_I
(
NR_RRC
,
"[UE %d] Frame %d: processing RRCReconfiguration: reconfiguring DRB %ld
\n
"
,
ue_mod_idP
,
frameP
,
DRB_config
->
drb_Identity
);
ue_mod_idP
,
frameP
,
DRB_config
->
drb_Identity
);
//
if(!AMF_MODE_ENABLED) {
if
(
!
AMF_MODE_ENABLED
)
{
ip_addr_offset3
=
0
;
ip_addr_offset3
=
0
;
ip_addr_offset4
=
1
;
ip_addr_offset4
=
1
;
LOG_I
(
OIP
,
"[UE %d] trying to bring up the OAI interface %d, IP X.Y.%d.%d
\n
"
,
ue_mod_idP
,
ip_addr_offset3
+
ue_mod_idP
,
LOG_I
(
OIP
,
"[UE %d] trying to bring up the OAI interface %d, IP X.Y.%d.%d
\n
"
,
ue_mod_idP
,
ip_addr_offset3
+
ue_mod_idP
,
...
@@ -823,7 +1759,7 @@ nr_rrc_ue_establish_drb(
...
@@ -823,7 +1759,7 @@ nr_rrc_ue_establish_drb(
ipv4_address
(
ip_addr_offset3
+
ue_mod_idP
+
1
,
gNB_index
+
1
));
//daddr
ipv4_address
(
ip_addr_offset3
+
ue_mod_idP
+
1
,
gNB_index
+
1
));
//daddr
LOG_D
(
NR_RRC
,
"[UE %d] State = Attached (gNB %d)
\n
"
,
ue_mod_idP
,
gNB_index
);
LOG_D
(
NR_RRC
,
"[UE %d] State = Attached (gNB %d)
\n
"
,
ue_mod_idP
,
gNB_index
);
}
}
//
}
}
return
(
0
);
return
(
0
);
}
}
...
@@ -954,7 +1890,7 @@ nr_rrc_ue_process_measConfig(
...
@@ -954,7 +1890,7 @@ nr_rrc_ue_process_measConfig(
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void
void
nr_rrc_ue_process_radioBearerConfig
(
nr_
sa_
rrc_ue_process_radioBearerConfig
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
uint8_t
gNB_index
,
const
uint8_t
gNB_index
,
NR_RadioBearerConfig_t
*
const
radioBearerConfig
NR_RadioBearerConfig_t
*
const
radioBearerConfig
...
@@ -964,16 +1900,23 @@ nr_rrc_ue_process_radioBearerConfig(
...
@@ -964,16 +1900,23 @@ nr_rrc_ue_process_radioBearerConfig(
long
SRB_id
,
DRB_id
;
long
SRB_id
,
DRB_id
;
int
i
,
cnt
;
int
i
,
cnt
;
if
(
radioBearerConfig
->
securityConfig
!=
NULL
)
{
if
(
radioBearerConfig
->
srb3_ToRelease
!=
NULL
){
if
(
*
radioBearerConfig
->
securityConfig
->
keyToUse
==
NR_SecurityConfig__keyToUse_master
)
{
if
(
*
radioBearerConfig
->
srb3_ToRelease
==
TRUE
){
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
cipheringAlgorithm
=
//TODO (release the PDCP entity and the srb-Identity of the SRB3.)
radioBearerConfig
->
securityConfig
->
securityAlgorithmConfig
->
cipheringAlgorithm
;
}
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
integrityProtAlgorithm
=
*
radioBearerConfig
->
securityConfig
->
securityAlgorithmConfig
->
integrityProtAlgorithm
;
}
}
}
if
(
radioBearerConfig
->
srb_ToAddModList
!=
NULL
)
{
if
(
radioBearerConfig
->
srb_ToAddModList
!=
NULL
)
{
if
(
radioBearerConfig
->
securityConfig
!=
NULL
)
{
if
(
*
radioBearerConfig
->
securityConfig
->
keyToUse
==
NR_SecurityConfig__keyToUse_master
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
cipheringAlgorithm
=
radioBearerConfig
->
securityConfig
->
securityAlgorithmConfig
->
cipheringAlgorithm
;
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
integrityProtAlgorithm
=
*
radioBearerConfig
->
securityConfig
->
securityAlgorithmConfig
->
integrityProtAlgorithm
;
}
}
uint8_t
*
kRRCenc
=
NULL
;
uint8_t
*
kRRCenc
=
NULL
;
uint8_t
*
kRRCint
=
NULL
;
uint8_t
*
kRRCint
=
NULL
;
derive_key_rrc_enc
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
cipheringAlgorithm
,
derive_key_rrc_enc
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
cipheringAlgorithm
,
...
@@ -1103,7 +2046,7 @@ nr_rrc_ue_process_radioBearerConfig(
...
@@ -1103,7 +2046,7 @@ nr_rrc_ue_process_radioBearerConfig(
}
}
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
State
=
NR_RRC_CONNECTED
;
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
State
=
NR_RRC_CONNECTED
;
LOG_I
(
NR_RRC
,
"[UE %d] State = NR_RRC_CONNECTED (
e
NB %d)
\n
"
,
ctxt_pP
->
module_id
,
gNB_index
);
LOG_I
(
NR_RRC
,
"[UE %d] State = NR_RRC_CONNECTED (
g
NB %d)
\n
"
,
ctxt_pP
->
module_id
,
gNB_index
);
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
...
@@ -1130,7 +2073,7 @@ rrc_ue_process_rrcReconfiguration(
...
@@ -1130,7 +2073,7 @@ rrc_ue_process_rrcReconfiguration(
if
(
ie
->
radioBearerConfig
!=
NULL
)
{
if
(
ie
->
radioBearerConfig
!=
NULL
)
{
LOG_I
(
NR_RRC
,
"radio Bearer Configuration is present
\n
"
);
LOG_I
(
NR_RRC
,
"radio Bearer Configuration is present
\n
"
);
nr_rrc_ue_process_radioBearerConfig
(
ctxt_pP
,
gNB_index
,
ie
->
radioBearerConfig
);
nr_
sa_
rrc_ue_process_radioBearerConfig
(
ctxt_pP
,
gNB_index
,
ie
->
radioBearerConfig
);
}
}
/* Check if there is dedicated NAS information to forward to NAS */
/* Check if there is dedicated NAS information to forward to NAS */
...
@@ -1193,6 +2136,7 @@ nr_rrc_ue_decode_dcch(
...
@@ -1193,6 +2136,7 @@ nr_rrc_ue_decode_dcch(
{
{
asn_dec_rval_t
dec_rval
;
asn_dec_rval_t
dec_rval
;
NR_DL_DCCH_Message_t
*
dl_dcch_msg
=
NULL
;
NR_DL_DCCH_Message_t
*
dl_dcch_msg
=
NULL
;
MessageDef
*
msg_p
;
if
(
Srb_id
!=
1
)
{
if
(
Srb_id
!=
1
)
{
LOG_E
(
NR_RRC
,
"[UE %d] Frame %d: Received message on DL-DCCH (SRB%ld), should not have ...
\n
"
,
LOG_E
(
NR_RRC
,
"[UE %d] Frame %d: Received message on DL-DCCH (SRB%ld), should not have ...
\n
"
,
...
@@ -1237,6 +2181,18 @@ nr_rrc_ue_decode_dcch(
...
@@ -1237,6 +2181,18 @@ nr_rrc_ue_decode_dcch(
case
NR_DL_DCCH_MessageType__c1_PR_rrcResume
:
case
NR_DL_DCCH_MessageType__c1_PR_rrcResume
:
case
NR_DL_DCCH_MessageType__c1_PR_rrcRelease
:
case
NR_DL_DCCH_MessageType__c1_PR_rrcRelease
:
msg_p
=
itti_alloc_new_message
(
TASK_RRC_UE
,
NAS_CONN_RELEASE_IND
);
if
((
dl_dcch_msg
->
message
.
choice
.
c1
->
choice
.
rrcRelease
->
criticalExtensions
.
present
==
NR_RRCRelease__criticalExtensions_PR_rrcRelease
)
&&
(
dl_dcch_msg
->
message
.
choice
.
c1
->
present
==
NR_DL_DCCH_MessageType__c1_PR_rrcRelease
)){
dl_dcch_msg
->
message
.
choice
.
c1
->
choice
.
rrcRelease
->
criticalExtensions
.
choice
.
rrcRelease
->
deprioritisationReq
->
deprioritisationTimer
=
NR_RRCRelease_IEs__deprioritisationReq__deprioritisationTimer_min5
;
dl_dcch_msg
->
message
.
choice
.
c1
->
choice
.
rrcRelease
->
criticalExtensions
.
choice
.
rrcRelease
->
deprioritisationReq
->
deprioritisationType
=
NR_RRCRelease_IEs__deprioritisationReq__deprioritisationType_frequency
;
}
itti_send_msg_to_task
(
TASK_NAS_UE
,
ctxt_pP
->
instance
,
msg_p
);
break
;
case
NR_DL_DCCH_MessageType__c1_PR_rrcReestablishment
:
case
NR_DL_DCCH_MessageType__c1_PR_rrcReestablishment
:
case
NR_DL_DCCH_MessageType__c1_PR_dlInformationTransfer
:
case
NR_DL_DCCH_MessageType__c1_PR_dlInformationTransfer
:
case
NR_DL_DCCH_MessageType__c1_PR_ueCapabilityEnquiry
:
case
NR_DL_DCCH_MessageType__c1_PR_ueCapabilityEnquiry
:
...
@@ -1256,48 +2212,14 @@ nr_rrc_ue_decode_dcch(
...
@@ -1256,48 +2212,14 @@ nr_rrc_ue_decode_dcch(
return
0
;
return
0
;
}
}
/*--------------------------------------------------*/
static
void
rrc_ue_generate_RRCSetupComplete
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
uint8_t
gNB_index
,
const
uint8_t
Transaction_id
,
uint8_t
sel_plmn_id
){
uint8_t
buffer
[
100
];
uint8_t
size
;
const
char
*
nas_msg
;
int
nas_msg_length
;
/*
if (EPC_MODE_ENABLED) {
nas_msg = (char *) UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data;
nas_msg_length = UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.length;
} else {
nas_msg = nas_attach_req_imsi;
nas_msg_length = sizeof(nas_attach_req_imsi);
}
*/
size
=
do_RRCSetupComplete
(
ctxt_pP
->
module_id
,
buffer
,
Transaction_id
,
sel_plmn_id
,
nas_msg_length
,
nas_msg
);
LOG_I
(
RRC
,
"[UE %d][RAPROC] Frame %d : Logical Channel UL-DCCH (SRB1), Generating RRCConnectionSetupComplete (bytes%d, gNB %d)
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
size
,
gNB_index
);
LOG_D
(
RLC
,
"[FRAME %05d][RRC_UE][MOD %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCConnectionSetupComplete to gNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]
\n
"
,
ctxt_pP
->
frame
,
ctxt_pP
->
module_id
+
NB_RN_INST
,
size
,
gNB_index
,
nr_rrc_mui
,
ctxt_pP
->
module_id
+
NB_eNB_INST
,
DCCH
);
// ctxt_pP_local.rnti = ctxt_pP->rnti;
rrc_data_req_ue
(
ctxt_pP
,
DCCH
,
nr_rrc_mui
++
,
SDU_CONFIRM_NO
,
size
,
buffer
,
PDCP_TRANSMISSION_MODE_CONTROL
);
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void
*
rrc_nrue_task
(
void
*
args_p
)
{
void
*
rrc_nrue_task
(
void
*
args_p
)
{
MessageDef
*
msg_p
;
MessageDef
*
msg_p
;
instance_t
instance
;
instance_t
instance
;
unsigned
int
ue_mod_id
;
unsigned
int
ue_mod_id
;
int
result
;
int
result
;
NR_SRB_INFO
*
srb_info_p
;
protocol_ctxt_t
ctxt
;
itti_mark_task_ready
(
TASK_RRC_NRUE
);
itti_mark_task_ready
(
TASK_RRC_NRUE
);
while
(
1
)
{
while
(
1
)
{
...
@@ -1316,6 +2238,60 @@ void *rrc_nrue_task( void *args_p ) {
...
@@ -1316,6 +2238,60 @@ void *rrc_nrue_task( void *args_p ) {
LOG_D
(
RRC
,
"[UE %d] Received %s
\n
"
,
ue_mod_id
,
ITTI_MSG_NAME
(
msg_p
));
LOG_D
(
RRC
,
"[UE %d] Received %s
\n
"
,
ue_mod_id
,
ITTI_MSG_NAME
(
msg_p
));
break
;
break
;
case
NR_RRC_MAC_BCCH_DATA_IND
:
LOG_D
(
RRC
,
"[UE %d] Received %s: frameP %d, gNB %d
\n
"
,
ue_mod_id
,
ITTI_MSG_NAME
(
msg_p
),
NR_RRC_MAC_BCCH_DATA_IND
(
msg_p
).
frame
,
NR_RRC_MAC_BCCH_DATA_IND
(
msg_p
).
gnb_index
);
// PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, NOT_A_RNTI, RRC_MAC_BCCH_DATA_IND (msg_p).frame, 0);
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
ue_mod_id
,
GNB_FLAG_NO
,
NOT_A_RNTI
,
NR_RRC_MAC_BCCH_DATA_IND
(
msg_p
).
frame
,
0
,
NR_RRC_MAC_BCCH_DATA_IND
(
msg_p
).
gnb_index
);
nr_decode_BCCH_DLSCH_Message
(
&
ctxt
,
NR_RRC_MAC_BCCH_DATA_IND
(
msg_p
).
gnb_index
,
NR_RRC_MAC_BCCH_DATA_IND
(
msg_p
).
sdu
,
NR_RRC_MAC_BCCH_DATA_IND
(
msg_p
).
sdu_size
,
NR_RRC_MAC_BCCH_DATA_IND
(
msg_p
).
rsrq
,
NR_RRC_MAC_BCCH_DATA_IND
(
msg_p
).
rsrp
);
case
NR_RRC_MAC_CCCH_DATA_IND
:
LOG_D
(
RRC
,
"[UE %d] RNTI %x Received %s: frameP %d, gNB %d
\n
"
,
ue_mod_id
,
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
rnti
,
ITTI_MSG_NAME
(
msg_p
),
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
frame
,
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
gnb_index
);
srb_info_p
=
&
NR_UE_rrc_inst
[
ue_mod_id
].
Srb0
[
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
gnb_index
];
memcpy
(
srb_info_p
->
Rx_buffer
.
Payload
,
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
sdu
,
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
sdu_size
);
srb_info_p
->
Rx_buffer
.
payload_size
=
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
sdu_size
;
// PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, RRC_MAC_CCCH_DATA_IND (msg_p).rnti, RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0);
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
ue_mod_id
,
GNB_FLAG_NO
,
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
rnti
,
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
frame
,
0
,
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
gnb_index
);
nr_rrc_ue_decode_ccch
(
&
ctxt
,
srb_info_p
,
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
).
gnb_index
);
break
;
/* PDCP messages */
case
NR_RRC_DCCH_DATA_IND
:
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
module_id
,
GNB_FLAG_NO
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
rnti
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
frame
,
0
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
gNB_index
);
LOG_D
(
NR_RRC
,
"[UE %d] Received %s: frameP %d, DCCH %d, gNB %d
\n
"
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
module_id
,
ITTI_MSG_NAME
(
msg_p
),
NR_RRC_DCCH_DATA_IND
(
msg_p
).
frame
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
dcch_index
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
gNB_index
);
LOG_D
(
NR_RRC
,
PROTOCOL_RRC_CTXT_UE_FMT
"Received %s DCCH %d, gNB %d
\n
"
,
PROTOCOL_NR_RRC_CTXT_UE_ARGS
(
&
ctxt
),
ITTI_MSG_NAME
(
msg_p
),
NR_RRC_DCCH_DATA_IND
(
msg_p
).
dcch_index
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
gNB_index
);
nr_rrc_ue_decode_dcch
(
&
ctxt
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
dcch_index
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
sdu_p
,
NR_RRC_DCCH_DATA_IND
(
msg_p
).
gNB_index
);
// Message buffer has been processed, free it now.
result
=
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg_p
),
NR_RRC_DCCH_DATA_IND
(
msg_p
).
sdu_p
);
AssertFatal
(
result
==
EXIT_SUCCESS
,
"Failed to free memory (%d)!
\n
"
,
result
);
break
;
default:
default:
LOG_E
(
RRC
,
"[UE %d] Received unexpected message %s
\n
"
,
ue_mod_id
,
ITTI_MSG_NAME
(
msg_p
));
LOG_E
(
RRC
,
"[UE %d] Received unexpected message %s
\n
"
,
ue_mod_id
,
ITTI_MSG_NAME
(
msg_p
));
break
;
break
;
...
@@ -1326,3 +2302,24 @@ void *rrc_nrue_task( void *args_p ) {
...
@@ -1326,3 +2302,24 @@ void *rrc_nrue_task( void *args_p ) {
msg_p
=
NULL
;
msg_p
=
NULL
;
}
}
}
}
void
*
nr_rrc_ue_process_sidelink_radioResourceConfig
(
module_id_t
Mod_idP
,
uint8_t
gNB_index
,
NR_SetupRelease_SL_ConfigDedicatedNR_r16_t
*
sl_ConfigDedicatedNR
)
{
//process sl_CommConfig, configure MAC/PHY for transmitting SL communication (RRC_CONNECTED)
if
(
sl_ConfigDedicatedNR
!=
NULL
)
{
switch
(
sl_ConfigDedicatedNR
->
present
){
case
NR_SetupRelease_SL_ConfigDedicatedNR_r16_PR_setup
:
//TODO
break
;
case
NR_SetupRelease_SL_ConfigDedicatedNR_r16_PR_release
:
break
;
case
NR_SetupRelease_SL_ConfigDedicatedNR_r16_PR_NOTHING
:
break
;
default:
break
;
}
}
}
openair2/RRC/NR_UE/rrc_defs.h
View file @
fa8e7d9f
...
@@ -91,6 +91,25 @@ typedef struct NR_UE_RRC_INST_s {
...
@@ -91,6 +91,25 @@ typedef struct NR_UE_RRC_INST_s {
NR_SRB_INFO_TABLE_ENTRY
Srb1
[
NB_CNX_UE
];
NR_SRB_INFO_TABLE_ENTRY
Srb1
[
NB_CNX_UE
];
NR_SRB_INFO_TABLE_ENTRY
Srb2
[
NB_CNX_UE
];
NR_SRB_INFO_TABLE_ENTRY
Srb2
[
NB_CNX_UE
];
uint8_t
MBMS_flag
;
NR_SystemInformation_t
*
si
[
NB_CNX_UE
];
NR_SIB1_t
*
sib1
[
NB_CNX_UE
];
NR_SIB2_t
*
sib2
[
NB_CNX_UE
];
NR_SIB3_t
*
sib3
[
NB_CNX_UE
];
NR_SIB4_t
*
sib4
[
NB_CNX_UE
];
NR_SIB5_t
*
sib5
[
NB_CNX_UE
];
NR_SIB6_t
*
sib6
[
NB_CNX_UE
];
NR_SIB7_t
*
sib7
[
NB_CNX_UE
];
NR_SIB8_t
*
sib8
[
NB_CNX_UE
];
NR_SIB9_t
*
sib9
[
NB_CNX_UE
];
NR_SIB10_r16_t
*
sib10
[
NB_CNX_UE
];
NR_SIB11_r16_t
*
sib11
[
NB_CNX_UE
];
NR_SIB12_r16_t
*
sib12
[
NB_CNX_UE
];
NR_SIB13_r16_t
*
sib13
[
NB_CNX_UE
];
NR_SIB14_r16_t
*
sib14
[
NB_CNX_UE
];
plmn_t
plmnID
;
NR_UE_RRC_INFO
Info
[
NB_SIG_CNX_UE
];
NR_UE_RRC_INFO
Info
[
NB_SIG_CNX_UE
];
NR_MIB_t
*
mib
;
NR_MIB_t
*
mib
;
...
@@ -150,7 +169,10 @@ typedef struct NR_UE_RRC_INST_s {
...
@@ -150,7 +169,10 @@ typedef struct NR_UE_RRC_INST_s {
RRC_LIST_TYPE
(
NR_CSI_ResourceConfig_t
,
NR_maxNrofCSI_ResourceConfigurations
)
CSI_ResourceConfig_list
;
RRC_LIST_TYPE
(
NR_CSI_ResourceConfig_t
,
NR_maxNrofCSI_ResourceConfigurations
)
CSI_ResourceConfig_list
;
// CellGroupConfig.spCellConfig.spCellConfigDedicated
// CellGroupConfig.spCellConfig.spCellConfigDedicated
RRC_LIST_TYPE
(
NR_CSI_ReportConfig_t
,
NR_maxNrofCSI_ReportConfigurations
)
CSI_ReportConfig_list
;
RRC_LIST_TYPE
(
NR_CSI_ReportConfig_t
,
NR_maxNrofCSI_ReportConfigurations
)
CSI_ReportConfig_list
;
long
selected_plmn_identity
;
Rrc_State_NR_t
nrRrcState
;
Rrc_Sub_State_NR_t
nrRrcSubState
;
}
NR_UE_RRC_INST_t
;
}
NR_UE_RRC_INST_t
;
#endif
#endif
...
...
openair2/SIMULATION/NR_RRC/itti_sim.c
0 → 100644
View file @
fa8e7d9f
/*!
\file itti_sim.c
\brief simulator for itti message from node to UE
\author Yoshio INOUE, Masayuki HARADA
\email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
\date 2020
\version 0.1
*/
#include <sched.h>
#include "T.h"
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
#include <common/utils/assertions.h>
#include "msc.h"
#include "common/ran_context.h"
#include "common/config/config_userapi.h"
#include "common/utils/load_module_shlib.h"
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
#include "PHY/phy_vars.h"
#include "SCHED/sched_common_vars.h"
#include "LAYER2/MAC/mac_vars.h"
#include "RRC/LTE/rrc_vars.h"
#include "gnb_config.h"
#include "SIMULATION/TOOLS/sim.h"
#ifdef SMBV
#include "PHY/TOOLS/smbv.h"
unsigned
short
config_frames
[
4
]
=
{
2
,
9
,
11
,
13
};
#endif
#include "common/utils/LOG/log.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "UTIL/OPT/opt.h"
#ifndef OPENAIR2
#include "UTIL/OTG/otg_vars.h"
#endif
#include "intertask_interface.h"
#include "system.h"
#include <openair2/GNB_APP/gnb_app.h>
#include "PHY/TOOLS/phy_scope_interface.h"
#include "PHY/TOOLS/nr_phy_scope.h"
#include "stats.h"
#include "nr-softmodem.h"
#include "executables/softmodem-common.h"
#include "executables/thread-common.h"
#include "NB_IoT_interface.h"
#include "x2ap_eNB.h"
#include "ngap_gNB.h"
#include "RRC/NR_UE/rrc_proto.h"
#include "openair3/NAS/UE/nas_ue_task.h"
pthread_cond_t
nfapi_sync_cond
;
pthread_mutex_t
nfapi_sync_mutex
;
int
nfapi_sync_var
=-
1
;
//!< protected by mutex \ref nfapi_sync_mutex
uint8_t
nfapi_mode
=
0
;
// Default to monolithic mode
uint32_t
target_dl_mcs
=
28
;
uint32_t
target_ul_mcs
=
20
;
uint32_t
timing_advance
=
0
;
uint64_t
num_missed_slots
=
0
;
int
split73
=
0
;
void
sendFs6Ul
(
PHY_VARS_eNB
*
eNB
,
int
UE_id
,
int
harq_pid
,
int
segmentID
,
int16_t
*
data
,
int
dataLen
,
int
r_offset
)
{
AssertFatal
(
false
,
"Must not be called in this context
\n
"
);
}
pthread_cond_t
sync_cond
;
pthread_mutex_t
sync_mutex
;
int
sync_var
=-
1
;
//!< protected by mutex \ref sync_mutex.
int
config_sync_var
=-
1
;
openair0_config_t
openair0_cfg
[
MAX_CARDS
];
volatile
int
start_gNB
=
0
;
volatile
int
oai_exit
=
0
;
//static int wait_for_sync = 0;
unsigned
int
mmapped_dma
=
0
;
int
single_thread_flag
=
1
;
int8_t
threequarter_fs
=
0
;
uint64_t
downlink_frequency
[
MAX_NUM_CCs
][
4
];
int32_t
uplink_frequency_offset
[
MAX_NUM_CCs
][
4
];
//Temp fix for inexistent NR upper layer
unsigned
char
NB_gNB_INST
=
1
;
static
char
*
itti_dump_file
=
NULL
;
int
UE_scan
=
1
;
int
UE_scan_carrier
=
0
;
runmode_t
mode
=
normal_txrx
;
static
double
snr_dB
=
20
;
FILE
*
input_fd
=
NULL
;
int
chain_offset
=
0
;
uint8_t
dci_Format
=
0
;
uint8_t
agregation_Level
=
0xFF
;
uint8_t
nb_antenna_tx
=
1
;
uint8_t
nb_antenna_rx
=
1
;
char
ref
[
128
]
=
"internal"
;
char
channels
[
128
]
=
"0"
;
int
otg_enabled
;
extern
void
*
udp_eNB_task
(
void
*
args_p
);
int
transmission_mode
=
1
;
int
emulate_rf
=
0
;
int
numerology
=
0
;
int
usrp_tx_thread
=
0
;
double
cpuf
;
extern
char
uecap_xer
[
1024
];
char
uecap_xer_in
=
0
;
/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
* this is very hackish - find a proper solution
*/
uint8_t
abstraction_flag
=
0
;
/* forward declarations */
void
set_default_frame_parms
(
nfapi_nr_config_request_scf_t
*
config
[
MAX_NUM_CCs
],
NR_DL_FRAME_PARMS
*
frame_parms
[
MAX_NUM_CCs
]);
/*---------------------BMC: timespec helpers -----------------------------*/
struct
timespec
min_diff_time
=
{
.
tv_sec
=
0
,
.
tv_nsec
=
0
};
struct
timespec
max_diff_time
=
{
.
tv_sec
=
0
,
.
tv_nsec
=
0
};
struct
timespec
clock_difftime
(
struct
timespec
start
,
struct
timespec
end
)
{
struct
timespec
temp
;
if
((
end
.
tv_nsec
-
start
.
tv_nsec
)
<
0
)
{
temp
.
tv_sec
=
end
.
tv_sec
-
start
.
tv_sec
-
1
;
temp
.
tv_nsec
=
1000000000
+
end
.
tv_nsec
-
start
.
tv_nsec
;
}
else
{
temp
.
tv_sec
=
end
.
tv_sec
-
start
.
tv_sec
;
temp
.
tv_nsec
=
end
.
tv_nsec
-
start
.
tv_nsec
;
}
return
temp
;
}
#define KNRM "\x1B[0m"
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define KBLU "\x1B[34m"
#define RESET "\033[0m"
void
exit_function
(
const
char
*
file
,
const
char
*
function
,
const
int
line
,
const
char
*
s
)
{
int
ru_id
;
if
(
s
!=
NULL
)
{
printf
(
"%s:%d %s() Exiting OAI softmodem: %s
\n
"
,
file
,
line
,
function
,
s
);
}
oai_exit
=
1
;
if
(
RC
.
ru
==
NULL
)
exit
(
-
1
);
// likely init not completed, prevent crash or hang, exit now...
for
(
ru_id
=
0
;
ru_id
<
RC
.
nb_RU
;
ru_id
++
)
{
if
(
RC
.
ru
[
ru_id
]
&&
RC
.
ru
[
ru_id
]
->
rfdevice
.
trx_end_func
)
{
RC
.
ru
[
ru_id
]
->
rfdevice
.
trx_end_func
(
&
RC
.
ru
[
ru_id
]
->
rfdevice
);
RC
.
ru
[
ru_id
]
->
rfdevice
.
trx_end_func
=
NULL
;
}
if
(
RC
.
ru
[
ru_id
]
&&
RC
.
ru
[
ru_id
]
->
ifdevice
.
trx_end_func
)
{
RC
.
ru
[
ru_id
]
->
ifdevice
.
trx_end_func
(
&
RC
.
ru
[
ru_id
]
->
ifdevice
);
RC
.
ru
[
ru_id
]
->
ifdevice
.
trx_end_func
=
NULL
;
}
}
sleep
(
1
);
//allow lte-softmodem threads to exit first
exit
(
1
);
}
void
wait_gNBs
(
void
)
{
int
i
;
int
waiting
=
1
;
while
(
waiting
==
1
)
{
printf
(
"Waiting for gNB L1 instances to all get configured ... sleeping 50ms (nb_nr_sL1_inst %d)
\n
"
,
RC
.
nb_nr_L1_inst
);
usleep
(
50
*
1000
);
waiting
=
0
;
for
(
i
=
0
;
i
<
RC
.
nb_nr_L1_inst
;
i
++
)
{
if
(
RC
.
gNB
[
i
]
->
configured
==
0
)
{
waiting
=
1
;
break
;
}
}
}
printf
(
"gNB L1 are configured
\n
"
);
}
void
wait_RUs
(
void
)
{
LOG_I
(
PHY
,
"Waiting for RUs to be configured ... RC.ru_mask:%02lx
\n
"
,
RC
.
ru_mask
);
// wait for all RUs to be configured over fronthaul
pthread_mutex_lock
(
&
RC
.
ru_mutex
);
while
(
RC
.
ru_mask
>
0
)
{
pthread_cond_wait
(
&
RC
.
ru_cond
,
&
RC
.
ru_mutex
);
printf
(
"RC.ru_mask:%02lx
\n
"
,
RC
.
ru_mask
);
}
pthread_mutex_unlock
(
&
RC
.
ru_mutex
);
LOG_I
(
PHY
,
"RUs configured
\n
"
);
}
int
stop_L1L2
(
module_id_t
gnb_id
)
{
return
0
;
}
int
restart_L1L2
(
module_id_t
gnb_id
)
{
return
0
;
}
int
create_gNB_tasks
(
uint32_t
gnb_nb
)
{
LOG_D
(
GNB_APP
,
"%s(gnb_nb:%d)
\n
"
,
__FUNCTION__
,
gnb_nb
);
itti_wait_ready
(
1
);
if
(
gnb_nb
>
0
)
{
if
(
itti_create_task
(
TASK_SCTP
,
sctp_eNB_task
,
NULL
)
<
0
){
LOG_E
(
SCTP
,
"Create task for SCTP failed
\n
"
);
return
-
1
;
}
if
(
is_x2ap_enabled
())
{
if
(
itti_create_task
(
TASK_X2AP
,
x2ap_task
,
NULL
)
<
0
){
LOG_E
(
X2AP
,
"Create task for X2AP failed
\n
"
);
}
}
else
{
LOG_I
(
X2AP
,
"X2AP is disabled.
\n
"
);
}
}
if
(
AMF_MODE_ENABLED
&&
(
get_softmodem_params
()
->
phy_test
==
0
&&
get_softmodem_params
()
->
do_ra
==
0
))
{
if
(
gnb_nb
>
0
)
{
if
(
itti_create_task
(
TASK_NGAP
,
ngap_gNB_task
,
NULL
)
<
0
)
{
LOG_E
(
S1AP
,
"Create task for NGAP failed
\n
"
);
return
-
1
;
}
if
(
!
emulate_rf
){
if
(
itti_create_task
(
TASK_UDP
,
udp_eNB_task
,
NULL
)
<
0
)
{
LOG_E
(
UDP_
,
"Create task for UDP failed
\n
"
);
return
-
1
;
}
}
if
(
itti_create_task
(
TASK_GTPV1_U
,
&
gtpv1u_gNB_task
,
NULL
)
<
0
)
{
LOG_E
(
GTPU
,
"Create task for GTPV1U failed
\n
"
);
return
-
1
;
}
}
}
if
(
gnb_nb
>
0
)
{
if
(
itti_create_task
(
TASK_GNB_APP
,
gNB_app_task
,
NULL
)
<
0
)
{
LOG_E
(
GNB_APP
,
"Create task for gNB APP failed
\n
"
);
return
-
1
;
}
LOG_I
(
NR_RRC
,
"Creating NR RRC gNB Task
\n
"
);
if
(
itti_create_task
(
TASK_RRC_GNB
,
rrc_gnb_task
,
NULL
)
<
0
)
{
LOG_E
(
NR_RRC
,
"Create task for NR RRC gNB failed
\n
"
);
return
-
1
;
}
}
return
0
;
}
static
void
get_options
(
void
)
{
paramdef_t
cmdline_params
[]
=
CMDLINE_PARAMS_DESC_GNB
;
CONFIG_SETRTFLAG
(
CONFIG_NOEXITONHELP
);
get_common_options
(
SOFTMODEM_GNB_BIT
);
config_process_cmdline
(
cmdline_params
,
sizeof
(
cmdline_params
)
/
sizeof
(
paramdef_t
),
NULL
);
CONFIG_CLEARRTFLAG
(
CONFIG_NOEXITONHELP
);
if
(
!
(
CONFIG_ISFLAGSET
(
CONFIG_ABORT
))
)
{
memset
((
void
*
)
&
RC
,
0
,
sizeof
(
RC
));
/* Read RC configuration file */
NRRCConfig
();
NB_gNB_INST
=
RC
.
nb_nr_inst
;
NB_RU
=
RC
.
nb_RU
;
printf
(
"Configuration: nb_rrc_inst %d, nb_nr_L1_inst %d, nb_ru %hhu
\n
"
,
NB_gNB_INST
,
RC
.
nb_nr_L1_inst
,
NB_RU
);
}
}
void
set_default_frame_parms
(
nfapi_nr_config_request_scf_t
*
config
[
MAX_NUM_CCs
],
NR_DL_FRAME_PARMS
*
frame_parms
[
MAX_NUM_CCs
])
{
for
(
int
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
frame_parms
[
CC_id
]
=
(
NR_DL_FRAME_PARMS
*
)
malloc
(
sizeof
(
NR_DL_FRAME_PARMS
));
config
[
CC_id
]
=
(
nfapi_nr_config_request_scf_t
*
)
malloc
(
sizeof
(
nfapi_nr_config_request_scf_t
));
config
[
CC_id
]
->
ssb_config
.
scs_common
.
value
=
1
;
config
[
CC_id
]
->
cell_config
.
frame_duplex_type
.
value
=
1
;
//FDD
config
[
CC_id
]
->
carrier_config
.
dl_grid_size
[
1
].
value
=
106
;
config
[
CC_id
]
->
carrier_config
.
ul_grid_size
[
1
].
value
=
106
;
config
[
CC_id
]
->
cell_config
.
phy_cell_id
.
value
=
0
;
}
}
/*
* helper function to terminate a certain ITTI task
*/
void
terminate_task
(
task_id_t
task_id
,
module_id_t
mod_id
)
{
LOG_I
(
GNB_APP
,
"sending TERMINATE_MESSAGE to task %s (%d)
\n
"
,
itti_get_task_name
(
task_id
),
task_id
);
MessageDef
*
msg
;
msg
=
itti_alloc_new_message
(
ENB_APP
,
TERMINATE_MESSAGE
);
itti_send_msg_to_task
(
task_id
,
ENB_MODULE_ID_TO_INSTANCE
(
mod_id
),
msg
);
}
//extern void free_transport(PHY_VARS_gNB *);
extern
void
nr_phy_free_RU
(
RU_t
*
);
void
init_pdcp
(
void
)
{
//if (!NODE_IS_DU(RC.rrc[0]->node_type)) {
pdcp_layer_init
();
uint32_t
pdcp_initmask
=
(
IS_SOFTMODEM_NOS1
)
?
(
PDCP_USE_NETLINK_BIT
|
LINK_ENB_PDCP_TO_IP_DRIVER_BIT
)
:
LINK_ENB_PDCP_TO_GTPV1U_BIT
;
if
(
IS_SOFTMODEM_NOS1
)
{
printf
(
"IS_SOFTMODEM_NOS1 option enabled
\n
"
);
pdcp_initmask
=
pdcp_initmask
|
ENB_NAS_USE_TUN_BIT
|
SOFTMODEM_NOKRNMOD_BIT
;
}
pdcp_module_init
(
pdcp_initmask
);
pdcp_set_rlc_data_req_func
((
send_rlc_data_req_func_t
)
rlc_data_req
);
pdcp_set_pdcp_data_ind_func
((
pdcp_data_ind_func_t
)
pdcp_data_ind
);
}
int
create_tasks_nrue
(
uint32_t
ue_nb
)
{
LOG_D
(
ENB_APP
,
"%s(ue_nb:%d)
\n
"
,
__FUNCTION__
,
ue_nb
);
itti_wait_ready
(
1
);
if
(
ue_nb
>
0
)
{
printf
(
"create TASK_RRC_NRUE
\n
"
);
if
(
itti_create_task
(
TASK_RRC_NRUE
,
rrc_nrue_task
,
NULL
)
<
0
)
{
LOG_E
(
RRC
,
"Create task for RRC UE failed
\n
"
);
return
-
1
;
}
}
itti_wait_ready
(
0
);
return
0
;
}
void
*
itti_sim_ue_rrc_task
(
void
*
args_p
)
{
MessageDef
*
msg_p
,
*
message_p
;
instance_t
instance
;
unsigned
int
ue_mod_id
;
int
result
;
itti_mark_task_ready
(
TASK_RRC_UE_SIM
);
while
(
1
)
{
// Wait for a message
itti_receive_msg
(
TASK_RRC_UE_SIM
,
&
msg_p
);
instance
=
ITTI_MSG_INSTANCE
(
msg_p
);
ue_mod_id
=
UE_INSTANCE_TO_MODULE_ID
(
instance
);
switch
(
ITTI_MSG_ID
(
msg_p
))
{
case
TERMINATE_MESSAGE
:
LOG_W
(
RRC
,
" *** Exiting RRC thread
\n
"
);
itti_exit_task
();
break
;
case
MESSAGE_TEST
:
LOG_D
(
RRC
,
"[UE %d] Received %s
\n
"
,
ue_mod_id
,
ITTI_MSG_NAME
(
msg_p
));
break
;
case
GNB_RRC_BCCH_DATA_IND
:
message_p
=
itti_alloc_new_message
(
TASK_RRC_NRUE
,
NR_RRC_MAC_BCCH_DATA_IND
);
memset
(
NR_RRC_MAC_BCCH_DATA_IND
(
message_p
).
sdu
,
0
,
BCCH_SDU_SIZE
);
NR_RRC_MAC_BCCH_DATA_IND
(
message_p
).
sdu_size
=
GNB_RRC_BCCH_DATA_IND
(
msg_p
).
size
;
memcpy
(
NR_RRC_MAC_BCCH_DATA_IND
(
message_p
).
sdu
,
GNB_RRC_BCCH_DATA_IND
(
msg_p
).
sdu
,
GNB_RRC_BCCH_DATA_IND
(
msg_p
).
size
);
itti_send_msg_to_task
(
TASK_RRC_NRUE
,
instance
,
message_p
);
break
;
case
GNB_RRC_CCCH_DATA_IND
:
message_p
=
itti_alloc_new_message
(
TASK_RRC_NRUE
,
NR_RRC_MAC_CCCH_DATA_IND
);
printf
(
"receive GNB_RRC_CCCH_DATA_IND
\n
"
);
memset
(
NR_RRC_MAC_CCCH_DATA_IND
(
message_p
).
sdu
,
0
,
CCCH_SDU_SIZE
);
memcpy
(
NR_RRC_MAC_CCCH_DATA_IND
(
message_p
).
sdu
,
GNB_RRC_CCCH_DATA_IND
(
msg_p
).
sdu
,
GNB_RRC_CCCH_DATA_IND
(
msg_p
).
size
);
NR_RRC_MAC_CCCH_DATA_IND
(
message_p
).
sdu_size
=
GNB_RRC_CCCH_DATA_IND
(
msg_p
).
size
;
itti_send_msg_to_task
(
TASK_RRC_NRUE
,
instance
,
message_p
);
break
;
case
GNB_RRC_DCCH_DATA_IND
:
printf
(
"receive GNB_RRC_DCCH_DATA_IND
\n
"
);
message_p
=
itti_alloc_new_message
(
TASK_RRC_NRUE
,
NR_RRC_DCCH_DATA_IND
);
NR_RRC_DCCH_DATA_IND
(
message_p
).
dcch_index
=
GNB_RRC_DCCH_DATA_IND
(
msg_p
).
rbid
;
NR_RRC_DCCH_DATA_IND
(
message_p
).
sdu_size
=
GNB_RRC_DCCH_DATA_IND
(
msg_p
).
size
;
memset
(
NR_RRC_DCCH_DATA_IND
(
message_p
).
sdu_p
,
0
,
GNB_RRC_DCCH_DATA_IND
(
msg_p
).
size
);
memcpy
(
NR_RRC_DCCH_DATA_IND
(
message_p
).
sdu_p
,
GNB_RRC_DCCH_DATA_IND
(
msg_p
).
sdu
,
GNB_RRC_DCCH_DATA_IND
(
msg_p
).
size
);
itti_send_msg_to_task
(
TASK_RRC_NRUE
,
instance
,
message_p
);
break
;
default:
LOG_E
(
RRC
,
"[UE %d] Received unexpected message %s
\n
"
,
ue_mod_id
,
ITTI_MSG_NAME
(
msg_p
));
break
;
}
result
=
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg_p
),
msg_p
);
AssertFatal
(
result
==
EXIT_SUCCESS
,
"Failed to free memory (%d)!
\n
"
,
result
);
msg_p
=
NULL
;
}
}
void
*
itti_sim_gnb_rrc_task
(
void
*
args_p
)
{
MessageDef
*
msg_p
,
*
message_p
;
instance_t
instance
;
unsigned
int
ue_mod_id
;
int
result
;
itti_mark_task_ready
(
TASK_RRC_GNB_SIM
);
while
(
1
)
{
// Wait for a message
itti_receive_msg
(
TASK_RRC_GNB_SIM
,
&
msg_p
);
instance
=
ITTI_MSG_INSTANCE
(
msg_p
);
ue_mod_id
=
UE_INSTANCE_TO_MODULE_ID
(
instance
);
switch
(
ITTI_MSG_ID
(
msg_p
))
{
case
TERMINATE_MESSAGE
:
LOG_W
(
RRC
,
" *** Exiting RRC thread
\n
"
);
itti_exit_task
();
break
;
case
MESSAGE_TEST
:
LOG_D
(
RRC
,
"[UE %d] Received %s
\n
"
,
ue_mod_id
,
ITTI_MSG_NAME
(
msg_p
));
break
;
case
UE_RRC_CCCH_DATA_IND
:
message_p
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
NR_RRC_MAC_CCCH_DATA_IND
);
RRC_MAC_CCCH_DATA_IND
(
message_p
).
sdu_size
=
UE_RRC_CCCH_DATA_IND
(
msg_p
).
size
;
memset
(
RRC_MAC_CCCH_DATA_IND
(
message_p
).
sdu
,
0
,
CCCH_SDU_SIZE
);
memcpy
(
RRC_MAC_CCCH_DATA_IND
(
message_p
).
sdu
,
UE_RRC_CCCH_DATA_IND
(
msg_p
).
sdu
,
UE_RRC_CCCH_DATA_IND
(
msg_p
).
size
);
itti_send_msg_to_task
(
TASK_RRC_GNB
,
instance
,
message_p
);
break
;
case
UE_RRC_DCCH_DATA_IND
:
message_p
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
NR_RRC_DCCH_DATA_IND
);
RRC_DCCH_DATA_IND
(
message_p
).
sdu_size
=
UE_RRC_DCCH_DATA_IND
(
msg_p
).
size
;
memset
(
RRC_MAC_CCCH_DATA_IND
(
message_p
).
sdu
,
0
,
UE_RRC_DCCH_DATA_IND
(
msg_p
).
size
);
memcpy
(
RRC_MAC_CCCH_DATA_IND
(
message_p
).
sdu
,
UE_RRC_DCCH_DATA_IND
(
msg_p
).
sdu
,
UE_RRC_DCCH_DATA_IND
(
msg_p
).
size
);
itti_send_msg_to_task
(
TASK_RRC_GNB
,
instance
,
message_p
);
break
;
default:
LOG_E
(
RRC
,
"[UE %d] Received unexpected message %s
\n
"
,
ue_mod_id
,
ITTI_MSG_NAME
(
msg_p
));
break
;
}
result
=
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg_p
),
msg_p
);
AssertFatal
(
result
==
EXIT_SUCCESS
,
"Failed to free memory (%d)!
\n
"
,
result
);
msg_p
=
NULL
;
}
}
int
main
(
int
argc
,
char
**
argv
)
{
start_background_system
();
///static configuration for NR at the moment
if
(
load_configmodule
(
argc
,
argv
,
CONFIG_ENABLECMDLINEONLY
)
==
NULL
)
{
exit_fun
(
"[SOFTMODEM] Error, configuration module init failed
\n
"
);
}
set_softmodem_sighandler
();
#ifdef DEBUG_CONSOLE
setvbuf
(
stdout
,
NULL
,
_IONBF
,
0
);
setvbuf
(
stderr
,
NULL
,
_IONBF
,
0
);
#endif
logInit
();
//configure_linux();
printf
(
"Reading in command-line options
\n
"
);
get_options
();
if
(
CONFIG_ISFLAGSET
(
CONFIG_ABORT
)
)
{
fprintf
(
stderr
,
"Getting configuration failed
\n
"
);
exit
(
-
1
);
}
AMF_MODE_ENABLED
=
!
IS_SOFTMODEM_NOS1
;
#if T_TRACER
T_Config_Init
();
#endif
//randominit (0);
set_taus_seed
(
0
);
printf
(
"configuring for RAU/RRU
\n
"
);
if
(
opp_enabled
==
1
)
{
reset_opp_meas
();
}
cpuf
=
get_cpu_freq_GHz
();
itti_init
(
TASK_MAX
,
THREAD_MAX
,
MESSAGES_ID_MAX
,
tasks_info
,
messages_info
);
// initialize mscgen log after ITTI
MSC_INIT
(
MSC_E_UTRAN
,
THREAD_MAX
+
TASK_MAX
);
init_opt
();
LOG_I
(
HW
,
"Version: %s
\n
"
,
PACKAGE_VERSION
);
if
(
IS_SOFTMODEM_NOS1
)
init_pdcp
();
if
(
RC
.
nb_nr_inst
>
0
)
{
// don't create if node doesn't connect to RRC/S1/GTP
AssertFatal
(
create_gNB_tasks
(
1
)
==
0
,
"cannot create ITTI tasks
\n
"
);
}
else
{
printf
(
"No ITTI, Initializing L1
\n
"
);
return
0
;
}
if
(
itti_create_task
(
TASK_RRC_GNB_SIM
,
itti_sim_gnb_rrc_task
,
NULL
)
<
0
){
printf
(
"cannot create ITTI tasks
\n
"
);
exit
(
-
1
);
// need a softer mode
}
openair_rrc_top_init_ue_nr
(
"./"
);
if
(
create_tasks_nrue
(
1
)
<
0
)
{
printf
(
"cannot create ITTI tasks
\n
"
);
exit
(
-
1
);
// need a softer mode
}
if
(
itti_create_task
(
TASK_RRC_UE_SIM
,
itti_sim_ue_rrc_task
,
NULL
)
<
0
){
printf
(
"cannot create ITTI tasks
\n
"
);
exit
(
-
1
);
// need a softer mode
}
pthread_cond_init
(
&
sync_cond
,
NULL
);
pthread_mutex_init
(
&
sync_mutex
,
NULL
);
printf
(
"Sending sync to all threads
\n
"
);
pthread_mutex_lock
(
&
sync_mutex
);
sync_var
=
0
;
pthread_cond_broadcast
(
&
sync_cond
);
pthread_mutex_unlock
(
&
sync_mutex
);
// wait for end of program
printf
(
"TYPE <CTRL-C> TO TERMINATE
\n
"
);
#if 0
// test itti sim
usleep(10000);
protocol_ctxt_t ctxt;
struct rrc_gNB_ue_context_s *ue_context_p = NULL;
ue_context_p = rrc_gNB_allocate_new_UE_context(RC.nrrrc[0]);
if(ue_context_p == NULL){
printf("ue_context_p == NULL");
}
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
0,
ENB_FLAG_YES,
0,
0,
0);
rrc_gNB_generate_RRCSetup(&ctxt,
ue_context_p,
0);
// end test itti sim
#endif
printf
(
"Entering ITTI signals handler
\n
"
);
itti_wait_tasks_end
();
printf
(
"Returned from ITTI signal handler
\n
"
);
oai_exit
=
1
;
printf
(
"oai_exit=%d
\n
"
,
oai_exit
);
printf
(
"stopping MODEM threads
\n
"
);
/* release memory used by the RU/gNB threads (incomplete), after all
* threads have been stopped (they partially use the same memory) */
pthread_cond_destroy
(
&
sync_cond
);
pthread_mutex_destroy
(
&
sync_mutex
);
logClean
();
printf
(
"Bye.
\n
"
);
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment