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
afa984a1
Commit
afa984a1
authored
Oct 28, 2019
by
frtabu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix build_oai, align nr files to lte files (noS1 macros...)
parent
21c6624f
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
305 additions
and
476 deletions
+305
-476
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+1
-5
cmake_targets/build_oai
cmake_targets/build_oai
+15
-16
executables/nr-gnb.c
executables/nr-gnb.c
+57
-100
executables/nr-ru.c
executables/nr-ru.c
+35
-63
executables/nr-softmodem-common.h
executables/nr-softmodem-common.h
+3
-6
executables/nr-softmodem.c
executables/nr-softmodem.c
+62
-90
executables/nr-uesoftmodem.c
executables/nr-uesoftmodem.c
+9
-21
openair2/GNB_APP/gnb_app.c
openair2/GNB_APP/gnb_app.c
+81
-122
openair2/RRC/LTE/rrc_UE.c
openair2/RRC/LTE/rrc_UE.c
+0
-4
targets/COMMON/create_nr_tasks.c
targets/COMMON/create_nr_tasks.c
+42
-49
No files found.
cmake_targets/CMakeLists.txt
View file @
afa984a1
...
...
@@ -594,7 +594,7 @@ Message("CPU_Affinity flag is ${CPU_AFFINITY}")
##############################################################
# ???!!! TO BE DOCUMENTED OPTIONS !!!???
##############################################################
add_boolean_option
(
ENABLE_USE_MME True
"eNB connected to MME (INTERFACE S1-C), not standalone eNB"
)
add_boolean_option
(
NO_RRM True
"DO WE HAVE A RADIO RESSOURCE MANAGER: NO"
)
add_boolean_option
(
RRC_DEFAULT_RAB_IS_AM False
"set the RLC mode to AM for the default bearer"
)
...
...
@@ -604,7 +604,6 @@ add_boolean_option(CPU_AFFINITY False "Enable CPU Affinity of threads (only vali
add_boolean_option
(
NAS_NETLINK False
"useless ??? Must be True to compile nasmesh driver without rtai ????"
)
add_boolean_option
(
OAI_NW_DRIVER_USE_NETLINK True
"????"
)
add_boolean_option
(
USE_MME False
"this flag is used only one time in lte-softmodem.c"
)
add_list_string_option
(
PACKAGE_NAME
"NotDefined"
"As per attribute name"
)
add_boolean_option
(
MESSAGE_CHART_GENERATOR False
"For generating sequence diagrams"
)
add_boolean_option
(
MESSAGE_CHART_GENERATOR_RLC_MAC False
"trace RLC-MAC exchanges in sequence diagrams"
)
...
...
@@ -2401,9 +2400,6 @@ add_executable(lte-uesoftmodem
add_dependencies
(
lte-uesoftmodem rrc_flag s1ap_flag x2_flag
)
if
(
NOT
${
NOS1
}
)
target_compile_definitions
(
lte-uesoftmodem PRIVATE -DPDCP_USE_NETLINK
)
endif
()
target_link_libraries
(
lte-uesoftmodem
-Wl,--start-group
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB F1AP F1AP_LIB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
...
...
cmake_targets/build_oai
100755 → 100644
View file @
afa984a1
...
...
@@ -510,14 +510,17 @@ function main() {
echo_info
"3. building the compilation directives ..."
DIR
=
$OPENAIR_DIR
/cmake_targets
if
[
"
$T_TRACER
"
=
"False"
]
;
then
build_dir
=
ran_build_noLOG
if
[
"
$SIMUS_PHY
"
=
"1"
-o
"
$SIMUS_CORE
"
=
"1"
]
;
then
build_dir
=
phy_simulators
else
build_dir
=
ran_build
if
[
"
$T_TRACER
"
=
"False"
]
;
then
build_dir
=
ran_build_noLOG
else
build_dir
=
ran_build
fi
fi
[
"
$CLEAN
"
=
"1"
]
&&
rm
-rf
$DIR
/
$build_dir
/build
mkdir
-p
$DIR
/
$build_dir
/build
# configuration module libraries, one currently available, using libconfig
config_libconfig_shlib
=
params_libconfig
...
...
@@ -525,8 +528,7 @@ function main() {
if
[
"
$eNB
"
=
"1"
-o
"
$UE
"
=
"1"
-o
"
$gNB
"
=
"1"
-o
"
$nrUE
"
=
"1"
-o
"
$HW
"
=
"EXMIMO"
]
;
then
# softmodem compilation
[
"
$CLEAN
"
=
"1"
]
&&
rm
-rf
$DIR
/
$build_dir
/build
mkdir
-p
$DIR
/
$build_dir
/build
cmake_file
=
$DIR
/
$build_dir
/CMakeLists.txt
echo
"cmake_minimum_required(VERSION 2.8)"
>
$cmake_file
echo
"set ( CMAKE_BUILD_TYPE
$CMAKE_BUILD_TYPE
)"
>>
$cmake_file
...
...
@@ -549,7 +551,7 @@ function main() {
echo
'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)'
>>
$cmake_file
cd
$DIR
/
$build_dir
/build
eval
$CMAKE_CMD
fi
execlist
=
""
if
[
"
$eNB
"
=
"1"
]
;
then
...
...
@@ -634,15 +636,12 @@ function main() {
echo_warning
"not generated UE NAS files: binaries not found"
fi
fi
fi
if
[
"
$SIMUS_PHY
"
=
"1"
-o
"
$SIMUS_CORE
"
=
"1"
]
;
then
cd
$OPENAIR_DIR
/cmake_targets/phy_simulators
[
"
$CLEAN
"
=
"1"
]
&&
rm
-rf
build
mkdir
-p
build
cd
build
rm
-f
*
sim
cd
$DIR
/
$build_dir
/build
eval
$CMAKE_CMD
fi
##################
# PHY simulators #
...
...
@@ -663,7 +662,7 @@ function main() {
# lte-simulators $config_libconfig_shlib \
# lib$config_libconfig_shlib.so $dbin/lib$config_libconfig_shlib.so
fi
fi
###################
# Core simulators #
###################
...
...
executables/nr-gnb.c
View file @
afa984a1
...
...
@@ -80,14 +80,9 @@
#include "UTIL/OTG/otg_extern.h"
#endif
#if defined(ENABLE_ITTI)
#if defined(ENABLE_USE_MME)
#include "s1ap_eNB.h"
#ifdef PDCP_USE_NETLINK
#include "SIMULATION/ETH_TRANSPORT/proto.h"
#endif
#endif
#endif
#include "s1ap_eNB.h"
#include "SIMULATION/ETH_TRANSPORT/proto.h"
#include "T.h"
...
...
@@ -98,10 +93,9 @@
// extern openair0_device openair0;
#if defined(ENABLE_ITTI)
extern
volatile
int
start_gNB
;
extern
volatile
int
start_UE
;
#endif
extern
volatile
int
start_gNB
;
extern
volatile
int
start_UE
;
extern
volatile
int
oai_exit
;
extern
openair0_config_t
openair0_cfg
[
MAX_CARDS
];
...
...
@@ -185,14 +179,14 @@ static inline int rxtx(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int frame_t
// ****************************************
// Common RX procedures subframe n
T
(
T_GNB_PHY_DL_TICK
,
T_INT
(
gNB
->
Mod_id
),
T_INT
(
frame_tx
),
T_INT
(
slot_tx
));
/*
// if this is IF5 or 3GPP_gNB
if (gNB && gNB->RU_list && gNB->RU_list[0] && gNB->RU_list[0]->function < NGFI_RAU_IF4p5) {
wakeup_prach_gNB(gNB,NULL,proc->frame_rx,proc->slot_rx);
}
/*
// if this is IF5 or 3GPP_gNB
if (gNB && gNB->RU_list && gNB->RU_list[0] && gNB->RU_list[0]->function < NGFI_RAU_IF4p5) {
wakeup_prach_gNB(gNB,NULL,proc->frame_rx,proc->slot_rx);
}
// UE-specific RX processing for subframe n
if (nfapi_mode == 0 || nfapi_mode == 1) */
// UE-specific RX processing for subframe n
if (nfapi_mode == 0 || nfapi_mode == 1) */
pthread_mutex_lock
(
&
gNB
->
UL_INFO_mutex
);
gNB
->
UL_INFO
.
frame
=
frame_rx
;
...
...
@@ -269,7 +263,6 @@ static void *gNB_L1_thread_tx(void *param) {
gNB_L1_rxtx_proc_t
*
L1_proc_tx
=
&
gNB_proc
->
L1_proc_tx
;
//PHY_VARS_gNB *gNB = RC.gNB[0][proc->CC_id];
char
thread_name
[
100
];
sprintf
(
thread_name
,
"gNB_L1_thread_tx
\n
"
);
while
(
!
oai_exit
)
{
...
...
@@ -298,8 +291,8 @@ static void *gNB_L1_thread_tx(void *param) {
LOG_E
(
PHY
,
"[gNB] ERROR pthread_cond_signal for gNB TXnp4 thread
\n
"
);
exit_fun
(
"ERROR pthread_cond_signal"
);
}
pthread_mutex_unlock
(
&
L1_proc_tx
->
mutex
);
pthread_mutex_unlock
(
&
L1_proc_tx
->
mutex
);
wakeup_txfh
(
gNB
,
L1_proc_tx
,
frame_tx
,
slot_tx
,
timestamp_tx
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PROC_RXTX1
,
0
);
}
...
...
@@ -320,25 +313,21 @@ static void *gNB_L1_thread( void *param ) {
gNB_L1_rxtx_proc_t
*
L1_proc
=
&
gNB_proc
->
L1_proc
;
//PHY_VARS_gNB *gNB = RC.gNB[0][proc->CC_id];
char
thread_name
[
100
];
// set default return value
gNB_thread_rxtx_status
=
0
;
sprintf
(
thread_name
,
"gNB_L1_thread"
);
while
(
!
oai_exit
)
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PROC_RXTX0
,
0
);
if
(
wait_on_condition
(
&
L1_proc
->
mutex
,
&
L1_proc
->
cond
,
&
L1_proc
->
instance_cnt
,
thread_name
)
<
0
)
break
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PROC_RXTX0
,
1
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PROC_RXTX0
,
1
);
int
frame_rx
=
L1_proc
->
frame_rx
;
int
slot_rx
=
L1_proc
->
slot_rx
;
int
frame_tx
=
L1_proc
->
frame_tx
;
int
slot_tx
=
L1_proc
->
slot_tx
;
uint64_t
timestamp_tx
=
L1_proc
->
timestamp_tx
;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_TX0_GNB
,
slot_tx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_RX0_GNB
,
slot_rx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_GNB
,
frame_tx
);
...
...
@@ -410,44 +399,33 @@ void gNB_top(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, char *string, struct
}
int
wakeup_txfh
(
PHY_VARS_gNB
*
gNB
,
gNB_L1_rxtx_proc_t
*
proc
,
int
frame_tx
,
int
slot_tx
,
uint64_t
timestamp_tx
)
{
RU_t
*
ru
;
RU_proc_t
*
ru_proc
;
int
waitret
,
ret
;
// note this should depend on the numerology used by the TX L1 thread, set here for 500us slot time
// note this should depend on the numerology used by the TX L1 thread, set here for 500us slot time
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL
,
1
);
waitret
=
timedwait_on_condition
(
&
proc
->
mutex_RUs_tx
,
&
proc
->
cond_RUs
,
&
proc
->
instance_cnt_RUs
,
"wakeup_txfh"
,
1000000
);
waitret
=
timedwait_on_condition
(
&
proc
->
mutex_RUs_tx
,
&
proc
->
cond_RUs
,
&
proc
->
instance_cnt_RUs
,
"wakeup_txfh"
,
1000000
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL
,
0
);
AssertFatal
(
release_thread
(
&
proc
->
mutex_RUs_tx
,
&
proc
->
instance_cnt_RUs
,
"wakeup_txfh"
)
==
0
,
"error releaseing gNB lock on RUs
\n
"
);
AssertFatal
(
release_thread
(
&
proc
->
mutex_RUs_tx
,
&
proc
->
instance_cnt_RUs
,
"wakeup_txfh"
)
==
0
,
"error releaseing gNB lock on RUs
\n
"
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_UE
,
proc
->
instance_cnt_RUs
);
if
(
waitret
==
ETIMEDOUT
)
{
LOG_W
(
PHY
,
"Dropping TX slot (%d.%d) because FH is blocked more than 1 slot times (500us)
\n
"
,
frame_tx
,
slot_tx
);
AssertFatal
((
ret
=
pthread_mutex_lock
(
&
gNB
->
proc
.
mutex_RU_tx
))
==
0
,
"mutex_lock returns %d
\n
"
,
ret
);
gNB
->
proc
.
RU_mask_tx
=
0
;
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
gNB
->
proc
.
mutex_RU_tx
))
==
0
,
"mutex_unlock returns %d
\n
"
,
ret
);
AssertFatal
((
ret
=
pthread_mutex_lock
(
&
proc
->
mutex_RUs_tx
))
==
0
,
"mutex_lock returns %d
\n
"
,
ret
);
proc
->
instance_cnt_RUs
=
0
;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_UE
,
proc
->
instance_cnt_RUs
);
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
proc
->
mutex_RUs_tx
))
==
0
,
"mutex_unlock returns %d
\n
"
,
ret
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE
,
1
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE
,
0
);
return
(
-
1
);
}
for
(
int
i
=
0
;
i
<
gNB
->
num_RU
;
i
++
)
{
LOG_W
(
PHY
,
"Dropping TX slot (%d.%d) because FH is blocked more than 1 slot times (500us)
\n
"
,
frame_tx
,
slot_tx
);
AssertFatal
((
ret
=
pthread_mutex_lock
(
&
gNB
->
proc
.
mutex_RU_tx
))
==
0
,
"mutex_lock returns %d
\n
"
,
ret
);
gNB
->
proc
.
RU_mask_tx
=
0
;
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
gNB
->
proc
.
mutex_RU_tx
))
==
0
,
"mutex_unlock returns %d
\n
"
,
ret
);
AssertFatal
((
ret
=
pthread_mutex_lock
(
&
proc
->
mutex_RUs_tx
))
==
0
,
"mutex_lock returns %d
\n
"
,
ret
);
proc
->
instance_cnt_RUs
=
0
;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_UE
,
proc
->
instance_cnt_RUs
);
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
proc
->
mutex_RUs_tx
))
==
0
,
"mutex_unlock returns %d
\n
"
,
ret
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE
,
1
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE
,
0
);
return
(
-
1
);
}
for
(
int
i
=
0
;
i
<
gNB
->
num_RU
;
i
++
)
{
ru
=
gNB
->
RU_list
[
i
];
ru_proc
=
&
ru
->
proc
;
AssertFatal
((
ret
=
pthread_mutex_lock
(
&
ru_proc
->
mutex_gNBs
))
==
0
,
"ERROR pthread_mutex_lock failed on mutex_gNBs L1_thread_tx with ret=%d
\n
"
,
ret
);
if
(
ru_proc
->
instance_cnt_gNBs
==
0
)
{
...
...
@@ -457,7 +435,6 @@ int wakeup_txfh(PHY_VARS_gNB *gNB,gNB_L1_rxtx_proc_t *proc,int frame_tx,int slot
gNB
->
proc
.
RU_mask_tx
=
0
;
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
gNB
->
proc
.
mutex_RU_tx
))
==
0
,
"mutex_unlock returns %d
\n
"
,
ret
);
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
ru_proc
->
mutex_gNBs
))
==
0
,
"mutex_unlock return %d
\n
"
,
ret
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST_UE
,
0
);
return
(
-
1
);
}
...
...
@@ -466,52 +443,37 @@ int wakeup_txfh(PHY_VARS_gNB *gNB,gNB_L1_rxtx_proc_t *proc,int frame_tx,int slot
ru_proc
->
timestamp_tx
=
timestamp_tx
;
ru_proc
->
tti_tx
=
slot_tx
;
ru_proc
->
frame_tx
=
frame_tx
;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_UE
,
ru_proc
->
instance_cnt_gNBs
);
LOG_D
(
PHY
,
"Signaling tx_thread_fh for %d.%d
\n
"
,
frame_tx
,
slot_tx
);
LOG_D
(
PHY
,
"Signaling tx_thread_fh for %d.%d
\n
"
,
frame_tx
,
slot_tx
);
// the thread can now be woken up
AssertFatal
(
pthread_cond_signal
(
&
ru_proc
->
cond_gNBs
)
==
0
,
"[gNB] ERROR pthread_cond_signal for gNB TXnp4 thread
\n
"
);
"[gNB] ERROR pthread_cond_signal for gNB TXnp4 thread
\n
"
);
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
ru_proc
->
mutex_gNBs
))
==
0
,
"mutex_unlock returned %d
\n
"
,
ret
);
}
return
(
0
);
}
int
wakeup_tx
(
PHY_VARS_gNB
*
gNB
,
int
frame_rx
,
int
slot_rx
,
int
frame_tx
,
int
slot_tx
,
uint64_t
timestamp_tx
)
{
gNB_L1_rxtx_proc_t
*
L1_proc_tx
=
&
gNB
->
proc
.
L1_proc_tx
;
int
ret
;
AssertFatal
((
ret
=
pthread_mutex_lock
(
&
L1_proc_tx
->
mutex
))
==
0
,
"mutex_lock returns %d
\n
"
,
ret
);
while
(
L1_proc_tx
->
instance_cnt
==
0
){
while
(
L1_proc_tx
->
instance_cnt
==
0
)
{
pthread_cond_wait
(
&
L1_proc_tx
->
cond
,
&
L1_proc_tx
->
mutex
);
}
L1_proc_tx
->
instance_cnt
=
0
;
L1_proc_tx
->
slot_rx
=
slot_rx
;
L1_proc_tx
->
frame_rx
=
frame_rx
;
L1_proc_tx
->
slot_tx
=
slot_tx
;
L1_proc_tx
->
frame_tx
=
frame_tx
;
L1_proc_tx
->
timestamp_tx
=
timestamp_tx
;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_UE
,
1
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_UE
,
0
);
// the thread can now be woken up
AssertFatal
(
pthread_cond_signal
(
&
L1_proc_tx
->
cond
)
==
0
,
"ERROR pthread_cond_signal for gNB L1 thread
\n
"
);
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
L1_proc_tx
->
mutex
))
==
0
,
"mutex_unlock returns %d
\n
"
,
ret
);
return
(
0
);
}
...
...
@@ -522,42 +484,41 @@ int wakeup_rxtx(PHY_VARS_gNB *gNB,RU_t *ru) {
RU_proc_t
*
ru_proc
=&
ru
->
proc
;
int
ret
;
int
i
;
AssertFatal
((
ret
=
pthread_mutex_lock
(
&
proc
->
mutex_RU
))
==
0
,
"mutex_lock returns %d
\n
"
,
ret
);
for
(
i
=
0
;
i
<
gNB
->
num_RU
;
i
++
)
{
for
(
i
=
0
;
i
<
gNB
->
num_RU
;
i
++
)
{
if
(
ru
==
gNB
->
RU_list
[
i
])
{
if
((
proc
->
RU_mask
&
(
1
<<
i
))
>
0
)
LOG_E
(
PHY
,
"gNB %d frame %d, subframe %d : previous information from RU %d (num_RU %d,mask %x) has not been served yet!
\n
"
,
gNB
->
Mod_id
,
proc
->
frame_rx
,
proc
->
slot_rx
,
ru
->
idx
,
gNB
->
num_RU
,
proc
->
RU_mask
);
LOG_E
(
PHY
,
"gNB %d frame %d, subframe %d : previous information from RU %d (num_RU %d,mask %x) has not been served yet!
\n
"
,
gNB
->
Mod_id
,
proc
->
frame_rx
,
proc
->
slot_rx
,
ru
->
idx
,
gNB
->
num_RU
,
proc
->
RU_mask
);
proc
->
RU_mask
|=
(
1
<<
i
);
}
}
if
(
proc
->
RU_mask
!=
(
1
<<
gNB
->
num_RU
)
-
1
)
{
// not all RUs have provided their information so return
LOG_E
(
PHY
,
"Not all RUs have provided their info
\n
"
);
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
proc
->
mutex_RU
))
==
0
,
"mutex_unlock returns %d
\n
"
,
ret
);
return
(
0
);
}
else
{
// all RUs have provided their information so continue on and wakeup gNB processing
}
else
{
// all RUs have provided their information so continue on and wakeup gNB processing
proc
->
RU_mask
=
0
;
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
proc
->
mutex_RU
))
==
0
,
"muex_unlock returns %d
\n
"
,
ret
);
}
// wake up TX for subframe n+sl_ahead
// lock the TX mutex and make sure the thread is ready
AssertFatal
((
ret
=
pthread_mutex_lock
(
&
L1_proc
->
mutex
))
==
0
,
"mutex_lock returns %d
\n
"
,
ret
);
if
(
L1_proc
->
instance_cnt
==
0
)
{
// L1_thread is busy so abort the subframe
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
L1_proc
->
mutex
))
==
0
,
"muex_unlock return %d
\n
"
,
ret
);
LOG_W
(
PHY
,
"L1_thread isn't ready in %d.%d, aborting RX processing
\n
"
,
ru_proc
->
frame_rx
,
ru_proc
->
tti_rx
);
AssertFatal
((
ret
=
pthread_mutex_unlock
(
&
L1_proc
->
mutex
))
==
0
,
"muex_unlock return %d
\n
"
,
ret
);
LOG_W
(
PHY
,
"L1_thread isn't ready in %d.%d, aborting RX processing
\n
"
,
ru_proc
->
frame_rx
,
ru_proc
->
tti_rx
);
}
++
L1_proc
->
instance_cnt
;
// We have just received and processed the common part of a subframe, say n.
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
// We have just received and processed the common part of a subframe, say n.
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
// transmitted timestamp of the next TX slot (first).
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
// we want to generate subframe (n+sl_ahead), so TS_tx = TX_rx+sl_ahead*samples_per_tti,
// and proc->slot_tx = proc->slot_rx+sl_ahead
L1_proc
->
timestamp_tx
=
ru_proc
->
timestamp_rx
+
(
sl_ahead
*
fp
->
samples_per_slot
);
...
...
@@ -565,9 +526,7 @@ int wakeup_rxtx(PHY_VARS_gNB *gNB,RU_t *ru) {
L1_proc
->
slot_rx
=
ru_proc
->
tti_rx
;
L1_proc
->
frame_tx
=
(
L1_proc
->
slot_rx
>
(
fp
->
slots_per_frame
-
1
-
sl_ahead
))
?
(
L1_proc
->
frame_rx
+
1
)
&
1023
:
L1_proc
->
frame_rx
;
L1_proc
->
slot_tx
=
(
L1_proc
->
slot_rx
+
sl_ahead
)
%
fp
->
slots_per_frame
;
LOG_D
(
PHY
,
"wakeupL1: passing parameter IC = %d, RX: %d.%d, TX: %d.%d to L1 sl_ahead = %d
\n
"
,
L1_proc
->
instance_cnt
,
L1_proc
->
frame_rx
,
L1_proc
->
slot_rx
,
L1_proc
->
frame_tx
,
L1_proc
->
slot_tx
,
sl_ahead
);
pthread_mutex_unlock
(
&
L1_proc
->
mutex
);
// the thread can now be woken up
...
...
@@ -576,7 +535,7 @@ int wakeup_rxtx(PHY_VARS_gNB *gNB,RU_t *ru) {
exit_fun
(
"ERROR pthread_cond_signal"
);
return
(
-
1
);
}
return
(
0
);
}
/*
...
...
@@ -680,23 +639,20 @@ static void* gNB_thread_prach( void* param ) {
extern
void
init_td_thread
(
PHY_VARS_gNB
*
);
extern
void
init_te_thread
(
PHY_VARS_gNB
*
);
static
void
*
process_stats_thread
(
void
*
param
)
{
PHY_VARS_gNB
*
gNB
=
(
PHY_VARS_gNB
*
)
param
;
static
void
*
process_stats_thread
(
void
*
param
)
{
PHY_VARS_gNB
*
gNB
=
(
PHY_VARS_gNB
*
)
param
;
reset_meas
(
&
gNB
->
dlsch_encoding_stats
);
reset_meas
(
&
gNB
->
dlsch_scrambling_stats
);
reset_meas
(
&
gNB
->
dlsch_modulation_stats
);
wait_sync
(
"process_stats_thread"
);
while
(
!
oai_exit
)
{
while
(
!
oai_exit
)
{
sleep
(
1
);
print_meas
(
&
gNB
->
dlsch_encoding_stats
,
"pdsch_encoding"
,
NULL
,
NULL
);
print_meas
(
&
gNB
->
dlsch_scrambling_stats
,
"pdsch_scrambling"
,
NULL
,
NULL
);
print_meas
(
&
gNB
->
dlsch_modulation_stats
,
"pdsch_modulation"
,
NULL
,
NULL
);
}
return
(
NULL
);
}
...
...
@@ -749,6 +705,7 @@ void init_gNB_proc(int inst) {
}
if
(
opp_enabled
==
1
)
threadCreate
(
&
proc
->
L1_stats_thread
,
process_stats_thread
,(
void
*
)
gNB
,
"time_meas"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
//pthread_create( &proc->pthread_prach, attr_prach, gNB_thread_prach, gNB );
char
name
[
16
];
...
...
@@ -886,7 +843,7 @@ void init_eNB_afterRU(void) {
for
(
i
=
0
;
i
<
gNB
->
RU_list
[
ru_id
]
->
nb_rx
;
aa
++
,
i
++
)
{
LOG_I
(
PHY
,
"Attaching RU %d antenna %d to gNB antenna %d
\n
"
,
gNB
->
RU_list
[
ru_id
]
->
idx
,
i
,
aa
);
// gNB->prach_vars.rxsigF[0][aa] = gNB->RU_list[ru_id]->prach_rxsigF[i];
// gNB->prach_vars.rxsigF[0][aa] = gNB->RU_list[ru_id]->prach_rxsigF[i];
gNB
->
common_vars
.
rxdataF
[
aa
]
=
gNB
->
RU_list
[
ru_id
]
->
common
.
rxdataF
[
i
];
}
}
...
...
executables/nr-ru.c
View file @
afa984a1
...
...
@@ -103,14 +103,8 @@ static int DEFENBS[] = {0};
#include "UTIL/OTG/otg_extern.h"
#endif
#if defined(ENABLE_ITTI)
#if defined(ENABLE_USE_MME)
#include "s1ap_eNB.h"
#ifdef PDCP_USE_NETLINK
#include "SIMULATION/ETH_TRANSPORT/proto.h"
#endif
#endif
#endif
#include "s1ap_eNB.h"
#include "SIMULATION/ETH_TRANSPORT/proto.h"
#include "T.h"
#include "nfapi_interface.h"
...
...
@@ -143,8 +137,7 @@ extern int numerology;
extern
void
wait_gNBs
(
void
);
int
attach_rru
(
RU_t
*
ru
)
{
int
attach_rru
(
RU_t
*
ru
)
{
ssize_t
msg_len
,
len
;
RRU_CONFIG_msg_t
rru_config_msg
;
int
received_capabilities
=
0
;
...
...
@@ -201,8 +194,7 @@ int attach_rru(RU_t *ru)
return
0
;
}
int
connect_rau
(
RU_t
*
ru
)
{
int
connect_rau
(
RU_t
*
ru
)
{
RRU_CONFIG_msg_t
rru_config_msg
;
ssize_t
msg_len
;
int
tick_received
=
0
;
...
...
@@ -299,24 +291,21 @@ int connect_rau(RU_t *ru)
/* Southbound Fronthaul functions, RCC/RAU */
// southbound IF5 fronthaul for 16-bit OAI format
static
inline
void
fh_if5_south_out
(
RU_t
*
ru
,
int
frame
,
int
slot
,
uint64_t
timestamp
)
{
static
inline
void
fh_if5_south_out
(
RU_t
*
ru
,
int
frame
,
int
slot
,
uint64_t
timestamp
)
{
if
(
ru
==
RC
.
ru
[
0
])
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST
,
ru
->
proc
.
timestamp_tx
&
0xffffffff
);
send_IF5
(
ru
,
timestamp
,
slot
,
&
ru
->
seqno
,
IF5_RRH_GW_DL
);
}
// southbound IF5 fronthaul for Mobipass packet format
static
inline
void
fh_if5_mobipass_south_out
(
RU_t
*
ru
,
int
frame
,
int
slot
,
uint64_t
timestamp
)
{
static
inline
void
fh_if5_mobipass_south_out
(
RU_t
*
ru
,
int
frame
,
int
slot
,
uint64_t
timestamp
)
{
if
(
ru
==
RC
.
ru
[
0
])
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST
,
ru
->
proc
.
timestamp_tx
&
0xffffffff
);
send_IF5
(
ru
,
timestamp
,
slot
,
&
ru
->
seqno
,
IF5_MOBIPASS
);
}
// southbound IF4p5 fronthaul
static
inline
void
fh_if4p5_south_out
(
RU_t
*
ru
,
int
frame
,
int
slot
,
uint64_t
timestamp
)
{
static
inline
void
fh_if4p5_south_out
(
RU_t
*
ru
,
int
frame
,
int
slot
,
uint64_t
timestamp
)
{
if
(
ru
==
RC
.
ru
[
0
])
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST
,
ru
->
proc
.
timestamp_tx
&
0xffffffff
);
LOG_D
(
PHY
,
"Sending IF4p5 for frame %d subframe %d
\n
"
,
ru
->
proc
.
frame_tx
,
ru
->
proc
.
tti_tx
);
...
...
@@ -330,8 +319,7 @@ static inline void fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t ti
// Synchronous if5 from south
void
fh_if5_south_in
(
RU_t
*
ru
,
int
*
frame
,
int
*
tti
)
{
int
*
tti
)
{
NR_DL_FRAME_PARMS
*
fp
=
ru
->
nr_frame_parms
;
RU_proc_t
*
proc
=
&
ru
->
proc
;
recv_IF5
(
ru
,
&
proc
->
timestamp_rx
,
*
tti
,
IF5_RRH_GW_UL
);
...
...
@@ -360,8 +348,7 @@ void fh_if5_south_in(RU_t *ru,
// Synchronous if4p5 from south
void
fh_if4p5_south_in
(
RU_t
*
ru
,
int
*
frame
,
int
*
slot
)
{
int
*
slot
)
{
NR_DL_FRAME_PARMS
*
fp
=
ru
->
nr_frame_parms
;
RU_proc_t
*
proc
=
&
ru
->
proc
;
int
f
,
sl
;
...
...
@@ -655,7 +642,6 @@ void rx_rf(RU_t *ru,int *frame,int *slot) {
ru
->
nb_rx
);
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ
,
0
);
proc
->
timestamp_rx
=
ts
-
ru
->
ts_offset
;
...
...
@@ -718,7 +704,7 @@ void rx_rf(RU_t *ru,int *frame,int *slot) {
}
void
tx_rf
(
RU_t
*
ru
,
int
frame
,
int
slot
,
uint64_t
timestamp
)
{
void
tx_rf
(
RU_t
*
ru
,
int
frame
,
int
slot
,
uint64_t
timestamp
)
{
RU_proc_t
*
proc
=
&
ru
->
proc
;
NR_DL_FRAME_PARMS
*
fp
=
ru
->
nr_frame_parms
;
//nfapi_nr_config_request_t *cfg = &ru->gNB_list[0]->gNB_config;
...
...
@@ -734,6 +720,7 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
(
slot
==
1
)
||
IS_SOFTMODEM_RFSIM
)
{
int
siglen
=
fp
->
samples_per_slot
;
int
flags
;
if
(
slot
==
0
)
flags
=
2
;
else
if
(
slot
==
1
)
...
...
@@ -1099,16 +1086,15 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
}
}
else
if
(
N_RB
==
106
)
{
if
(
fp
->
threequarter_fs
)
{
cfg
->
sample_rate
=
46.08e6
;
cfg
->
samples_per_frame
=
460800
;
cfg
->
tx_bw
=
40e6
;
cfg
->
rx_bw
=
40e6
;
}
else
{
cfg
->
sample_rate
=
61.44e6
;
cfg
->
samples_per_frame
=
614400
;
cfg
->
tx_bw
=
40e6
;
cfg
->
rx_bw
=
40e6
;
cfg
->
sample_rate
=
46.08e6
;
cfg
->
samples_per_frame
=
460800
;
cfg
->
tx_bw
=
40e6
;
cfg
->
rx_bw
=
40e6
;
}
else
{
cfg
->
sample_rate
=
61.44e6
;
cfg
->
samples_per_frame
=
614400
;
cfg
->
tx_bw
=
40e6
;
cfg
->
rx_bw
=
40e6
;
}
}
else
{
AssertFatal
(
0
==
1
,
"N_RB %d not yet supported for numerology %d
\n
"
,
N_RB
,
mu
);
...
...
@@ -1156,7 +1142,7 @@ int setup_RU_buffers(RU_t *ru) {
frame_parms
=
ru
->
nr_frame_parms
;
printf
(
"setup_RU_buffers: frame_parms = %p
\n
"
,
frame_parms
);
}
else
{
printf
(
"RU
[%d] not initialized
\n
"
,
ru
->
idx
);
printf
(
"RU
not initialized
\n
"
);
return
(
-
1
);
}
...
...
@@ -1237,14 +1223,10 @@ static void *ru_thread_tx( void *param ) {
int
print_frame
=
8
;
int
i
=
0
;
int
ret
;
wait_on_condition
(
&
proc
->
mutex_FH1
,
&
proc
->
cond_FH1
,
&
proc
->
instance_cnt_FH1
,
"ru_thread_tx"
);
printf
(
"ru_thread_tx ready
\n
"
);
if
(
ru
->
rfdevice
.
uhd_set_thread_priority
!=
NULL
)
{
if
(
ru
->
rfdevice
.
uhd_set_thread_priority
!=
NULL
)
{
LOG_I
(
PHY
,
"set ru_thread_tx uhd priority
\n
"
);
ru
->
rfdevice
.
uhd_set_thread_priority
();
}
...
...
@@ -1255,13 +1237,11 @@ static void *ru_thread_tx( void *param ) {
LOG_D
(
PHY
,
"ru_thread_tx: Waiting for TX processing
\n
"
);
// wait until eNBs are finished subframe RX n and TX n+4
wait_on_condition
(
&
proc
->
mutex_gNBs
,
&
proc
->
cond_gNBs
,
&
proc
->
instance_cnt_gNBs
,
"ru_thread_tx"
);
ret
=
pthread_mutex_lock
(
&
proc
->
mutex_gNBs
);
AssertFatal
(
ret
==
0
,
"mutex_lock return %d
\n
"
,
ret
);
int
frame_tx
=
proc
->
frame_tx
;
int
tti_tx
=
proc
->
tti_tx
;
uint64_t
timestamp_tx
=
proc
->
timestamp_tx
;
ret
=
pthread_mutex_unlock
(
&
proc
->
mutex_gNBs
);
AssertFatal
(
ret
==
0
,
"mutex_lock returns %d
\n
"
,
ret
);
...
...
@@ -1334,14 +1314,15 @@ static void *ru_thread_tx( void *param ) {
gNB_proc
->
RU_mask_tx
=
0
;
ret
=
pthread_mutex_unlock
(
&
gNB_proc
->
mutex_RU_tx
);
AssertFatal
(
ret
==
0
,
"mutex_unlock returns %d
\n
"
,
ret
);
ret
=
pthread_mutex_lock
(
&
L1_proc
->
mutex_RUs_tx
);
AssertFatal
(
ret
==
0
,
"mutex_lock returns %d
\n
"
,
ret
);
// the thread can now be woken up
if
(
L1_proc
->
instance_cnt_RUs
==-
1
)
{
AssertFatal
(
pthread_cond_signal
(
&
L1_proc
->
cond_RUs
)
==
0
,
"ERROR pthread_cond_signal for gNB_L1_thread
\n
"
);
AssertFatal
(
pthread_cond_signal
(
&
L1_proc
->
cond_RUs
)
==
0
,
"ERROR pthread_cond_signal for gNB_L1_thread
\n
"
);
}
//else AssertFatal(1==0,"gNB TX thread is not ready\n");
L1_proc
->
instance_cnt_RUs
=
0
;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_UE
,
L1_proc
->
instance_cnt_RUs
);
ret
=
pthread_mutex_unlock
(
&
L1_proc
->
mutex_RUs_tx
);
...
...
@@ -1366,13 +1347,10 @@ static void *ru_thread( void *param ) {
int
print_frame
=
8
;
int
i
=
0
;
int
aa
;
// set default return value
ru_thread_status
=
0
;
// set default return value
sprintf
(
threadname
,
"ru_thread %d"
,
ru
->
idx
);
LOG_I
(
PHY
,
"Starting RU %d (%s,%s),
\n
"
,
ru
->
idx
,
NB_functions
[
ru
->
function
],
NB_timing
[
ru
->
if_timing
]);
if
(
emulate_rf
)
{
...
...
@@ -1460,6 +1438,7 @@ static void *ru_thread( void *param ) {
// synchronization on input FH interface, acquire signals/data and block
LOG_D
(
PHY
,
"[RU_thread] read data: frame_rx = %d, tti_rx = %d
\n
"
,
frame
,
slot
);
if
(
ru
->
fh_south_in
)
ru
->
fh_south_in
(
ru
,
&
frame
,
&
slot
);
else
AssertFatal
(
1
==
0
,
"No fronthaul interface at south port"
);
...
...
@@ -1486,17 +1465,15 @@ static void *ru_thread( void *param ) {
// do RX front-end processing (frequency-shift, dft) if needed
if
(
proc
->
tti_rx
==
NR_UPLINK_SLOT
||
fp
->
frame_type
==
FDD
)
{
if
(
ru
->
feprx
)
ru
->
feprx
(
ru
,
proc
->
tti_rx
);
}
LOG_D
(
PHY
,
"RU proc: frame_rx = %d, tti_rx = %d
\n
"
,
proc
->
frame_rx
,
proc
->
tti_rx
);
LOG_D
(
PHY
,
"Copying rxdataF from RU to gNB
\n
"
);
for
(
aa
=
0
;
aa
<
ru
->
nb_rx
;
aa
++
)
memcpy
((
void
*
)
RC
.
gNB
[
0
][
0
]
->
common_vars
.
rxdataF
[
aa
],
(
void
*
)
ru
->
common
.
rxdataF
[
aa
],
fp
->
symbols_per_slot
*
fp
->
ofdm_symbol_size
*
sizeof
(
int32_t
));
for
(
aa
=
0
;
aa
<
ru
->
nb_rx
;
aa
++
)
memcpy
((
void
*
)
RC
.
gNB
[
0
][
0
]
->
common_vars
.
rxdataF
[
aa
],
(
void
*
)
ru
->
common
.
rxdataF
[
aa
],
fp
->
symbols_per_slot
*
fp
->
ofdm_symbol_size
*
sizeof
(
int32_t
));
// At this point, all information for subframe has been received on FH interface
...
...
@@ -1802,8 +1779,7 @@ void kill_NR_RU_proc(int inst) {
pthread_cond_destroy
(
&
proc
->
cond_gNBs
);
}
int
check_capabilities
(
RU_t
*
ru
,
RRU_capabilities_t
*
cap
)
{
int
check_capabilities
(
RU_t
*
ru
,
RRU_capabilities_t
*
cap
)
{
FH_fmt_options_t
fmt
=
cap
->
FH_fmt
;
int
i
;
int
found_band
=
0
;
...
...
@@ -1859,8 +1835,7 @@ char rru_formats[3][20] = {"OAI_IF5","MBP_IF5","OAI_IF4p5"};
char
ru_if_formats
[
4
][
20
]
=
{
"LOCAL_RF"
,
"REMOTE_OAI_IF5"
,
"REMOTE_MBP_IF5"
,
"REMOTE_OAI_IF4p5"
};
void
configure_ru
(
int
idx
,
void
*
arg
)
{
void
*
arg
)
{
RU_t
*
ru
=
RC
.
ru
[
idx
];
RRU_config_t
*
config
=
(
RRU_config_t
*
)
arg
;
RRU_capabilities_t
*
capabilities
=
(
RRU_capabilities_t
*
)
arg
;
...
...
@@ -2112,8 +2087,7 @@ void set_function_spec_param(RU_t *ru) {
extern
void
RCconfig_RU
(
void
);
void
init_NR_RU
(
char
*
rf_config_file
)
{
void
init_NR_RU
(
char
*
rf_config_file
)
{
int
ru_id
;
RU_t
*
ru
;
PHY_VARS_gNB
*
gNB_RC
;
...
...
@@ -2195,8 +2169,7 @@ void init_NR_RU(char *rf_config_file)
}
void
stop_RU
(
int
nb_ru
)
{
void
stop_RU
(
int
nb_ru
)
{
for
(
int
inst
=
0
;
inst
<
nb_ru
;
inst
++
)
{
LOG_I
(
PHY
,
"Stopping RU %d processing threads
\n
"
,
inst
);
kill_NR_RU_proc
(
inst
);
...
...
@@ -2206,8 +2179,7 @@ void stop_RU(int nb_ru)
/* --------------------------------------------------------*/
/* from here function to use configuration module */
void
RCconfig_RU
(
void
)
{
void
RCconfig_RU
(
void
)
{
int
i
=
0
,
j
=
0
;
paramdef_t
RUParams
[]
=
RUPARAMS_DESC
;
paramlist_def_t
RUParamList
=
{
CONFIG_STRING_RU_LIST
,
NULL
,
0
};
...
...
executables/nr-softmodem-common.h
View file @
afa984a1
...
...
@@ -2,7 +2,7 @@
#define NR_SOFTMODEM_COMMON_H
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <execinfo.h>
...
...
@@ -30,12 +30,9 @@
#include "PHY/types.h"
#include <threadPool/thread-pool.h>
#if defined(ENABLE_USE_MME)
#include "s1ap_eNB.h"
#ifdef PDCP_USE_NETLINK
#include "SIMULATION/ETH_TRANSPORT/proto.h"
#endif
#endif
/* help strings definition for command line options, used in CMDLINE_XXX_DESC macros and printed when -h option is used */
#define CONFIG_HLP_RFCFGF "Configuration file for front-end (e.g. LMS7002M)\n"
...
...
@@ -110,7 +107,7 @@
{"g" , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \
{"G" , CONFIG_HLP_LOGV, 0, uptr:&glog_verbosity, defintval:0, TYPE_UINT16, 0}, \
{"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \
{"msc", CONFIG_HLP_MSC, PARAMFLAG_BOOL, uptr:&START_MSC, defintval:0, TYPE_UINT, 0}, \
{"msc", CONFIG_HLP_MSC, PARAMFLAG_BOOL, uptr:&START_MSC, defintval:0, TYPE_UINT, 0}, \
}
#define CMDLINE_ONLINELOG_IDX 0
...
...
executables/nr-softmodem.c
View file @
afa984a1
...
...
@@ -479,9 +479,6 @@ static void get_options(void) {
paramdef_t
cmdline_params
[]
=
CMDLINE_PARAMS_DESC_GNB
;
paramdef_t
cmdline_logparams
[]
=
CMDLINE_LOGPARAMS_DESC_NR
;
config_process_cmdline
(
cmdline_params
,
sizeof
(
cmdline_params
)
/
sizeof
(
paramdef_t
),
NULL
);
config_process_cmdline
(
cmdline_logparams
,
sizeof
(
cmdline_logparams
)
/
sizeof
(
paramdef_t
),
NULL
);
if
(
config_isparamset
(
cmdline_logparams
,
CMDLINE_ONLINELOG_IDX
))
{
...
...
@@ -513,7 +510,6 @@ static void get_options(void) {
if
(
parallel_config
!=
NULL
)
set_parallel_conf
(
parallel_config
);
if
(
worker_config
!=
NULL
)
set_worker_conf
(
worker_config
);
}
...
...
@@ -526,8 +522,7 @@ static void get_options(void) {
void
set_default_frame_parms
(
nfapi_nr_config_request_t
*
config
[
MAX_NUM_CCs
],
NR_DL_FRAME_PARMS
*
frame_parms
[
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_t
*
)
malloc
(
sizeof
(
nfapi_nr_config_request_t
));
...
...
@@ -836,30 +831,28 @@ static void wait_nfapi_init(char *thread_name) {
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
;
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
);
if
(
IS_SOFTMODEM_NOS1
)
{
printf
(
"IS_SOFTMODEM_NOS1 option enabled
\n
"
);
pdcp_initmask
=
pdcp_initmask
|
ENB_NAS_USE_TUN_BIT
|
SOFTMODEM_NOKRNMOD_BIT
;
}
/*if (NODE_IS_CU(RC.rrc[0]->node_type)) {
pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t)proto_agent_send_rlc_data_req);
} else {*/
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
);
//}
pdcp_module_init
(
pdcp_initmask
);
/*if (NODE_IS_CU(RC.rrc[0]->node_type)) {
pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t)proto_agent_send_rlc_data_req);
} else {*/
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
);
//}
/*} else {
pdcp_set_pdcp_data_ind_func((pdcp_data_ind_func_t) proto_agent_send_pdcp_data_ind);
}*/
}
int
main
(
int
argc
,
char
**
argv
)
{
int
main
(
int
argc
,
char
**
argv
)
{
int
i
,
ru_id
,
CC_id
=
0
;
start_background_system
();
...
...
@@ -887,7 +880,6 @@ int main( int argc, char **argv )
}
openair0_cfg
[
0
].
threequarter_fs
=
threequarter_fs
;
#if T_TRACER
T_Config_Init
();
#endif
...
...
@@ -905,26 +897,8 @@ int main( int argc, char **argv )
// initialize mscgen log after ITTI
MSC_INIT
(
MSC_E_UTRAN
,
THREAD_MAX
+
TASK_MAX
);
#endif
init_opt
();
#ifdef PDCP_USE_NETLINK
netlink_init
();
#if defined(PDCP_USE_NETLINK_QUEUES)
pdcp_netlink_init
();
#endif
#endif
#if !defined(ENABLE_ITTI)
// to make a graceful exit when ctrl-c is pressed
signal
(
SIGSEGV
,
signal_handler
);
signal
(
SIGINT
,
signal_handler
);
#endif
#ifndef PACKAGE_VERSION
# define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL"
#endif
init_opt
();
LOG_I
(
HW
,
"Version: %s
\n
"
,
PACKAGE_VERSION
);
#if defined(ENABLE_ITTI)
if
(
RC
.
nb_nr_inst
>
0
)
{
// don't create if node doesn't connect to RRC/S1/GTP
...
...
@@ -934,7 +908,6 @@ init_opt();
RCconfig_L1
();
}
#endif
/* Start the agent. If it is turned off in the configuration, it won't start */
RCconfig_nr_flexran
();
...
...
@@ -943,7 +916,7 @@ init_opt();
}
if
(
IS_SOFTMODEM_NOS1
)
init_pdcp
();
init_pdcp
();
// init UE_PF_PO and mutex lock
pthread_mutex_init
(
&
ue_pf_po_mutex
,
NULL
);
...
...
@@ -951,37 +924,37 @@ init_opt();
mlockall
(
MCL_CURRENT
|
MCL_FUTURE
);
pthread_cond_init
(
&
sync_cond
,
NULL
);
pthread_mutex_init
(
&
sync_mutex
,
NULL
);
/*#ifdef XFORMS
int UE_id;
if (do_forms==1) {
fl_initialize (&argc, argv, NULL, 0, 0);
form_stats_l2 = create_form_stats_form();
fl_show_form (form_stats_l2->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "l2 stats");
form_stats = create_form_stats_form();
fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
/*#ifdef XFORMS
int UE_id;
for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
form_gnb[CC_id][UE_id] = create_phy_scope_gnb();
sprintf (title, "LTE UL SCOPE eNB for CC_id %d, UE %d",CC_id,UE_id);
fl_show_form (form_gnb[CC_id][UE_id]->phy_scope_gnb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
if (otg_enabled) {
fl_set_button(form_gnb[CC_id][UE_id]->button_0,1);
fl_set_object_label(form_gnb[CC_id][UE_id]->button_0,"DL Traffic ON");
} else {
fl_set_button(form_gnb[CC_id][UE_id]->button_0,0);
fl_set_object_label(form_gnb[CC_id][UE_id]->button_0,"DL Traffic OFF");
}
} // CC_id
} // UE_id
if (do_forms==1) {
fl_initialize (&argc, argv, NULL, 0, 0);
form_stats_l2 = create_form_stats_form();
fl_show_form (form_stats_l2->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "l2 stats");
form_stats = create_form_stats_form();
fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
form_gnb[CC_id][UE_id] = create_phy_scope_gnb();
sprintf (title, "LTE UL SCOPE eNB for CC_id %d, UE %d",CC_id,UE_id);
fl_show_form (form_gnb[CC_id][UE_id]->phy_scope_gnb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
if (otg_enabled) {
fl_set_button(form_gnb[CC_id][UE_id]->button_0,1);
fl_set_object_label(form_gnb[CC_id][UE_id]->button_0,"DL Traffic ON");
} else {
fl_set_button(form_gnb[CC_id][UE_id]->button_0,0);
fl_set_object_label(form_gnb[CC_id][UE_id]->button_0,"DL Traffic OFF");
}
} // CC_id
} // UE_id
threadCreate(&forms_thread, scope_thread, NULL, "scope", -1, OAI_PRIORITY_RT_LOW);
printf("Scope thread created, ret=%d\n",ret);
}
threadCreate(&forms_thread, scope_thread, NULL, "scope", -1, OAI_PRIORITY_RT_LOW);
printf("Scope thread created, ret=%d\n",ret);
}
#endif*/
#endif*/
usleep
(
10
*
1000
);
if
(
nfapi_mode
)
{
...
...
@@ -1086,27 +1059,27 @@ init_opt();
printf
(
"Terminating application - oai_exit=%d
\n
"
,
oai_exit
);
#endif
// stop threads
/*#ifdef XFORMS
/*#ifdef XFORMS
printf("waiting for XFORMS thread\n");
printf("waiting for XFORMS thread\n");
if (do_forms==1) {
pthread_join(forms_thread,&status);
fl_hide_form(form_stats->stats_form);
fl_free_form(form_stats->stats_form);
if (do_forms==1) {
pthread_join(forms_thread,&status);
fl_hide_form(form_stats->stats_form);
fl_free_form(form_stats->stats_form);
fl_hide_form(form_stats_l2->stats_form);
fl_free_form(form_stats_l2->stats_form);
fl_hide_form(form_stats_l2->stats_form);
fl_free_form(form_stats_l2->stats_form);
for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
fl_hide_form(form_enb[CC_id][UE_id]->phy_scope_gNB);
fl_free_form(form_enb[CC_id][UE_id]->phy_scope_gNB);
}
}
}
for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
fl_hide_form(form_enb[CC_id][UE_id]->phy_scope_gNB);
fl_free_form(form_enb[CC_id][UE_id]->phy_scope_gNB);
}
}
}
#endif*/
#endif*/
printf
(
"stopping MODEM threads
\n
"
);
// cleanup
stop_gNB
(
NB_gNB_INST
);
...
...
@@ -1142,7 +1115,6 @@ init_opt();
RC
.
ru
[
ru_id
]
->
ifdevice
.
trx_end_func
(
&
RC
.
ru
[
ru_id
]
->
ifdevice
);
}
logClean
();
printf
(
"Bye.
\n
"
);
return
0
;
...
...
executables/nr-uesoftmodem.c
View file @
afa984a1
...
...
@@ -297,8 +297,8 @@ static void *scope_thread(void *arg) {
while
(
!
oai_exit
)
{
phy_scope_nrUE
(
form_nrue
[
0
],
PHY_vars_UE_g
[
0
][
0
],
0
,
0
,
1
);
PHY_vars_UE_g
[
0
][
0
],
0
,
0
,
1
);
usleep
(
100
*
1000
);
}
...
...
@@ -318,7 +318,6 @@ void init_scope(void) {
fl_show_form
(
form_nrue
[
UE_id
]
->
phy_scope_nrue
,
FL_PLACE_HOTSPOT
,
FL_FULLBORDER
,
title
);
threadCreate
(
&
forms_thread
,
scope_thread
,
NULL
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
}
}
...
...
@@ -379,7 +378,6 @@ static void get_options(void) {
paramdef_t
cmdline_params
[]
=
CMDLINE_PARAMS_DESC_UE
;
paramdef_t
cmdline_logparams
[]
=
CMDLINE_LOGPARAMS_DESC_NR
;
config_process_cmdline
(
cmdline_params
,
sizeof
(
cmdline_params
)
/
sizeof
(
paramdef_t
),
NULL
);
config_process_cmdline
(
cmdline_logparams
,
sizeof
(
cmdline_logparams
)
/
sizeof
(
paramdef_t
),
NULL
);
if
(
config_isparamset
(
cmdline_logparams
,
CMDLINE_ONLINELOG_IDX
))
{
...
...
@@ -543,7 +541,7 @@ void init_openair0(void) {
LOG_E
(
PHY
,
"Unsupported numerology!
\n
"
);
exit
(
-
1
);
}
}
else
if
(
frame_parms
[
0
]
->
N_RB_DL
==
106
)
{
}
else
if
(
frame_parms
[
0
]
->
N_RB_DL
==
106
)
{
if
(
numerology
==
0
)
{
if
(
frame_parms
[
0
]
->
threequarter_fs
)
{
openair0_cfg
[
card
].
sample_rate
=
23.04e6
;
...
...
@@ -552,7 +550,7 @@ void init_openair0(void) {
openair0_cfg
[
card
].
sample_rate
=
30.72e6
;
openair0_cfg
[
card
].
samples_per_frame
=
307200
;
}
}
else
if
(
numerology
==
1
)
{
}
else
if
(
numerology
==
1
)
{
if
(
frame_parms
[
0
]
->
threequarter_fs
)
{
openair0_cfg
[
card
].
sample_rate
=
46.08e6
;
openair0_cfg
[
card
].
samples_per_frame
=
480800
;
...
...
@@ -620,7 +618,6 @@ void init_openair0(void) {
}
if
(
usrp_args
)
openair0_cfg
[
card
].
sdr_addrs
=
usrp_args
;
}
}
...
...
@@ -635,7 +632,7 @@ void init_pdcp(void) {
pdcp_initmask
=
pdcp_initmask
|
UE_NAS_USE_TUN_BIT
;
/*if (rlc_module_init() != 0) {
LOG_I(RLC, "Problem at RLC initiation \n");
LOG_I(RLC, "Problem at RLC initiation \n");
}
pdcp_layer_init();
nr_ip_over_LTE_DRB_preconfiguration();*/
...
...
@@ -672,28 +669,20 @@ int main( int argc, char **argv ) {
set_taus_seed
(
0
);
tpool_t
pool
;
Tpool
=
&
pool
;
char
params
[]
=
"-1,-1"
;
char
params
[]
=
"-1,-1"
;
initTpool
(
params
,
Tpool
,
false
);
cpuf
=
get_cpu_freq_GHz
();
itti_init
(
TASK_MAX
,
THREAD_MAX
,
MESSAGES_ID_MAX
,
tasks_info
,
messages_info
);
init_opt
()
;
if
(
IS_SOFTMODEM_NOS1
)
init_pdcp
();
init_pdcp
();
if
(
ouput_vcd
)
{
vcd_signal_dumper_init
(
"/tmp/openair_dump_nrUE.vcd"
);
}
/*
#ifdef PDCP_USE_NETLINK
netlink_init();
#if defined(PDCP_USE_NETLINK_QUEUES)
pdcp_netlink_init();
#endif
#endif
*/
#ifndef PACKAGE_VERSION
#ifndef PACKAGE_VERSION
# define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL"
#endif
LOG_I
(
HW
,
"Version: %s
\n
"
,
PACKAGE_VERSION
);
...
...
@@ -719,7 +708,6 @@ int main( int argc, char **argv ) {
PHY_vars_UE_g
[
0
][
CC_id
]
=
init_nr_ue_vars
(
frame_parms
[
CC_id
],
0
,
abstraction_flag
);
UE
[
CC_id
]
=
PHY_vars_UE_g
[
0
][
CC_id
];
if
(
phy_test
==
1
)
UE
[
CC_id
]
->
mac_enabled
=
0
;
else
...
...
openair2/GNB_APP/gnb_app.c
View file @
afa984a1
...
...
@@ -37,46 +37,31 @@
#include "common/utils/LOG/log.h"
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
# if defined(ENABLE_USE_MME)
# include "s1ap_eNB.h"
# include "sctp_eNB_task.h"
# include "gtpv1u_eNB_task.h"
# endif
# include "PHY/INIT/phy_init.h"
# include "s1ap_eNB.h"
# include "sctp_eNB_task.h"
# include "gtpv1u_eNB_task.h"
# include "PHY/INIT/phy_init.h"
extern
unsigned
char
NB_gNB_INST
;
#endif
extern
RAN_CONTEXT_t
RC
;
#if defined(ENABLE_ITTI)
extern
RAN_CONTEXT_t
RC
;
/*------------------------------------------------------------------------------*/
# if defined(ENABLE_USE_MME)
# define GNB_REGISTER_RETRY_DELAY 10
# endif
/*------------------------------------------------------------------------------*/
static
void
configure_nr_rrc
(
uint32_t
gnb_id
)
{
static
void
configure_nr_rrc
(
uint32_t
gnb_id
)
{
MessageDef
*
msg_p
=
NULL
;
// int CC_id;
msg_p
=
itti_alloc_new_message
(
TASK_GNB_APP
,
NRRRC_CONFIGURATION_REQ
);
if
(
RC
.
nrrrc
[
gnb_id
])
{
RCconfig_NRRRC
(
msg_p
,
gnb_id
,
RC
.
nrrrc
[
gnb_id
]);
LOG_I
(
GNB_APP
,
"Sending configuration message to NR_RRC task
\n
"
);
itti_send_msg_to_task
(
TASK_RRC_GNB
,
GNB_MODULE_ID_TO_INSTANCE
(
gnb_id
),
msg_p
);
}
else
AssertFatal
(
0
,
"NRRRC context for gNB %d not allocated
\n
"
,
gnb_id
);
}
else
AssertFatal
(
0
,
"NRRRC context for gNB %d not allocated
\n
"
,
gnb_id
);
}
/*------------------------------------------------------------------------------*/
...
...
@@ -93,7 +78,7 @@ static uint32_t gNB_app_register(uint32_t gnb_id_start, uint32_t gnb_id_end)//,
{
s1ap_register_enb_req_t *s1ap_register_gNB; //Type Temporarily reuse
// note: there is an implicit relationship between the data structure and the message name
// note: there is an implicit relationship between the data structure and the message name
msg_p = itti_alloc_new_message (TASK_GNB_APP, S1AP_REGISTER_ENB_REQ); //Message Temporarily reuse
RCconfig_NR_S1(msg_p, gnb_id);
...
...
@@ -115,21 +100,17 @@ static uint32_t gNB_app_register(uint32_t gnb_id_start, uint32_t gnb_id_end)//,
}
# endif
*/
#endif
/*------------------------------------------------------------------------------*/
void
*
gNB_app_task
(
void
*
args_p
)
{
#if defined(ENABLE_ITTI)
uint32_t
gnb_nb
=
RC
.
nb_nr_inst
;
void
*
gNB_app_task
(
void
*
args_p
)
{
uint32_t
gnb_nb
=
RC
.
nb_nr_inst
;
uint32_t
gnb_id_start
=
0
;
uint32_t
gnb_id_end
=
gnb_id_start
+
gnb_nb
;
# if defined(ENABLE_USE_MME)
//uint32_t register_gnb_pending;
//uint32_t registered_gnb;
//long gnb_register_retry_timer_id;
# endif
uint32_t
gnb_id
;
MessageDef
*
msg_p
=
NULL
;
const
char
*
msg_name
=
NULL
;
...
...
@@ -137,15 +118,10 @@ void *gNB_app_task(void *args_p)
int
result
;
/* for no gcc warnings */
(
void
)
instance
;
itti_mark_task_ready
(
TASK_GNB_APP
);
LOG_I
(
PHY
,
"%s() Task ready initialise structures
\n
"
,
__FUNCTION__
);
RCconfig_NR_L1
();
RCconfig_nr_macrlc
();
LOG_I
(
PHY
,
"%s() RC.nb_nr_L1_inst:%d
\n
"
,
__FUNCTION__
,
RC
.
nb_nr_L1_inst
);
if
(
RC
.
nb_nr_L1_inst
>
0
)
AssertFatal
(
l1_north_init_gNB
()
==
0
,
"could not initialize L1 north interface
\n
"
);
...
...
@@ -153,120 +129,103 @@ void *gNB_app_task(void *args_p)
AssertFatal
(
gnb_nb
<=
RC
.
nb_nr_inst
,
"Number of gNB is greater than gNB defined in configuration file (%d/%d)!"
,
gnb_nb
,
RC
.
nb_nr_inst
);
LOG_I
(
GNB_APP
,
"Allocating gNB_RRC_INST for %d instances
\n
"
,
RC
.
nb_nr_inst
);
RC
.
nrrrc
=
(
gNB_RRC_INST
**
)
malloc
(
RC
.
nb_nr_inst
*
sizeof
(
gNB_RRC_INST
*
));
LOG_I
(
PHY
,
"%s() RC.nb_nr_inst:%d RC.nrrrc:%p
\n
"
,
__FUNCTION__
,
RC
.
nb_nr_inst
,
RC
.
nrrrc
);
for
(
gnb_id
=
gnb_id_start
;
(
gnb_id
<
gnb_id_end
)
;
gnb_id
++
)
{
RC
.
nrrrc
[
gnb_id
]
=
(
gNB_RRC_INST
*
)
malloc
(
sizeof
(
gNB_RRC_INST
));
RC
.
nrrrc
[
gnb_id
]
=
(
gNB_RRC_INST
*
)
malloc
(
sizeof
(
gNB_RRC_INST
));
LOG_I
(
PHY
,
"%s() Creating RRC instance RC.nrrrc[%d]:%p (%d of %d)
\n
"
,
__FUNCTION__
,
gnb_id
,
RC
.
nrrrc
[
gnb_id
],
gnb_id
+
1
,
gnb_id_end
);
memset
((
void
*
)
RC
.
nrrrc
[
gnb_id
],
0
,
sizeof
(
gNB_RRC_INST
));
configure_nr_rrc
(
gnb_id
);
}
# if defined(ENABLE_USE_MME)
/* Try to register each gNB */
//registered_gnb = 0;
//register_gnb_pending = gNB_app_register (gnb_id_start, gnb_id_end);//, gnb_properties_p);
# else
/* Start L2L1 task */
msg_p
=
itti_alloc_new_message
(
TASK_GNB_APP
,
INITIALIZE_MESSAGE
);
itti_send_msg_to_task
(
TASK_L2L1
,
INSTANCE_DEFAULT
,
msg_p
);
# endif
do
{
// Wait for a message
itti_receive_msg
(
TASK_GNB_APP
,
&
msg_p
);
msg_name
=
ITTI_MSG_NAME
(
msg_p
);
instance
=
ITTI_MSG_INSTANCE
(
msg_p
);
switch
(
ITTI_MSG_ID
(
msg_p
))
{
case
TERMINATE_MESSAGE
:
LOG_W
(
GNB_APP
,
" *** Exiting GNB_APP thread
\n
"
);
itti_exit_task
();
break
;
case
MESSAGE_TEST
:
LOG_I
(
GNB_APP
,
"Received %s
\n
"
,
ITTI_MSG_NAME
(
msg_p
));
break
;
# if defined(ENABLE_USE_MME)
/*
case S1AP_REGISTER_ENB_CNF:
LOG_I(GNB_APP, "[gNB %d] Received %s: associated MME %d\n", instance, msg_name,
S1AP_REGISTER_ENB_CNF(msg_p).nb_mme);
DevAssert(register_gnb_pending > 0);
register_gnb_pending--;
// Check if at least gNB is registered with one MME
if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) {
registered_gnb++;
}
// Check if all register gNB requests have been processed
if (register_gnb_pending == 0) {
if (registered_gnb == gnb_nb) {
// If all gNB are registered, start L2L1 task
MessageDef *msg_init_p;
msg_init_p = itti_alloc_new_message (TASK_GNB_APP, INITIALIZE_MESSAGE);
itti_send_msg_to_task (TASK_L2L1, INSTANCE_DEFAULT, msg_init_p);
} else {
uint32_t not_associated = gnb_nb - registered_gnb;
LOG_W(GNB_APP, " %d gNB %s not associated with a MME, retrying registration in %d seconds ...\n",
not_associated, not_associated > 1 ? "are" : "is", GNB_REGISTER_RETRY_DELAY);
// Restart the gNB registration process in GNB_REGISTER_RETRY_DELAY seconds
if (timer_setup (GNB_REGISTER_RETRY_DELAY, 0, TASK_GNB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT,
NULL, &gnb_register_retry_timer_id) < 0) {
LOG_E(GNB_APP, " Can not start gNB register retry timer, use \"sleep\" instead!\n");
sleep(GNB_REGISTER_RETRY_DELAY);
// Restart the registration process
registered_gnb = 0;
register_gnb_pending = gNB_app_register (gnb_id_start, gnb_id_end);//, gnb_properties_p);
}
}
}
break;
*/
case
S1AP_DEREGISTERED_ENB_IND
:
LOG_W
(
GNB_APP
,
"[gNB %d] Received %s: associated MME %d
\n
"
,
instance
,
msg_name
,
S1AP_DEREGISTERED_ENB_IND
(
msg_p
).
nb_mme
);
/* TODO handle recovering of registration */
break
;
case
TIMER_HAS_EXPIRED
:
LOG_I
(
GNB_APP
,
" Received %s: timer_id %ld
\n
"
,
msg_name
,
TIMER_HAS_EXPIRED
(
msg_p
).
timer_id
);
//if (TIMER_HAS_EXPIRED (msg_p).timer_id == gnb_register_retry_timer_id) {
case
TERMINATE_MESSAGE
:
LOG_W
(
GNB_APP
,
" *** Exiting GNB_APP thread
\n
"
);
itti_exit_task
();
break
;
case
MESSAGE_TEST
:
LOG_I
(
GNB_APP
,
"Received %s
\n
"
,
ITTI_MSG_NAME
(
msg_p
));
break
;
/*
case S1AP_REGISTER_ENB_CNF:
LOG_I(GNB_APP, "[gNB %d] Received %s: associated MME %d\n", instance, msg_name,
S1AP_REGISTER_ENB_CNF(msg_p).nb_mme);
DevAssert(register_gnb_pending > 0);
register_gnb_pending--;
// Check if at least gNB is registered with one MME
if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) {
registered_gnb++;
}
// Check if all register gNB requests have been processed
if (register_gnb_pending == 0) {
if (registered_gnb == gnb_nb) {
// If all gNB are registered, start L2L1 task
MessageDef *msg_init_p;
msg_init_p = itti_alloc_new_message (TASK_GNB_APP, INITIALIZE_MESSAGE);
itti_send_msg_to_task (TASK_L2L1, INSTANCE_DEFAULT, msg_init_p);
} else {
uint32_t not_associated = gnb_nb - registered_gnb;
LOG_W(GNB_APP, " %d gNB %s not associated with a MME, retrying registration in %d seconds ...\n",
not_associated, not_associated > 1 ? "are" : "is", GNB_REGISTER_RETRY_DELAY);
// Restart the gNB registration process in GNB_REGISTER_RETRY_DELAY seconds
if (timer_setup (GNB_REGISTER_RETRY_DELAY, 0, TASK_GNB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT,
NULL, &gnb_register_retry_timer_id) < 0) {
LOG_E(GNB_APP, " Can not start gNB register retry timer, use \"sleep\" instead!\n");
sleep(GNB_REGISTER_RETRY_DELAY);
// Restart the registration process
registered_gnb = 0;
register_gnb_pending = gNB_app_register (gnb_id_start, gnb_id_end);//, gnb_properties_p);
}
}
}
break;
*/
case
S1AP_DEREGISTERED_ENB_IND
:
LOG_W
(
GNB_APP
,
"[gNB %d] Received %s: associated MME %d
\n
"
,
instance
,
msg_name
,
S1AP_DEREGISTERED_ENB_IND
(
msg_p
).
nb_mme
);
/* TODO handle recovering of registration */
break
;
case
TIMER_HAS_EXPIRED
:
LOG_I
(
GNB_APP
,
" Received %s: timer_id %ld
\n
"
,
msg_name
,
TIMER_HAS_EXPIRED
(
msg_p
).
timer_id
);
//if (TIMER_HAS_EXPIRED (msg_p).timer_id == gnb_register_retry_timer_id) {
/* Restart the registration process */
// registered_gnb = 0;
// register_gnb_pending = gNB_app_register(gnb_id_start, gnb_id_end);//, gnb_properties_p);
//}
break
;
# endif
default:
LOG_E
(
GNB_APP
,
"Received unexpected message %s
\n
"
,
msg_name
);
break
;
// registered_gnb = 0;
// register_gnb_pending = gNB_app_register(gnb_id_start, gnb_id_end);//, gnb_properties_p);
//}
break
;
default:
LOG_E
(
GNB_APP
,
"Received unexpected message %s
\n
"
,
msg_name
);
break
;
}
result
=
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg_p
),
msg_p
);
AssertFatal
(
result
==
EXIT_SUCCESS
,
"Failed to free memory (%d)!
\n
"
,
result
);
}
while
(
1
);
#endif
return
NULL
;
}
openair2/RRC/LTE/rrc_UE.c
View file @
afa984a1
...
...
@@ -2455,9 +2455,7 @@ int decode_BCCH_MBMS_DLSCH_Message(
}
}*/
/*if ((rrc_get_sub_state(ctxt_pP->module_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE)
#if defined(ENABLE_USE_MME)
&& (UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data != NULL)
#endif
) {
rrc_ue_generate_RRCConnectionRequest(ctxt_pP, 0);
rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_CONNECTING );
...
...
@@ -2724,7 +2722,6 @@ int decode_SIB1_MBMS( const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_in
LOG_I
(
RRC
,
"Setting SIStatus bit 0 to 1
\n
"
);
UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
eNB_index
].
SIStatus_MBMS
=
1
;
UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
eNB_index
].
SIB1systemInfoValueTag_MBMS
=
sib1_MBMS
->
systemInfoValueTag_r14
;
#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
/*
{
int cell_valid = 0;
...
...
@@ -2782,7 +2779,6 @@ int decode_SIB1_MBMS( const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_in
}
}
*/
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SIB1
,
VCD_FUNCTION_OUT
);
return
0
;
}
...
...
targets/COMMON/create_nr_tasks.c
View file @
afa984a1
...
...
@@ -19,34 +19,32 @@
* contact@openairinterface.org
*/
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
# include "create_nr_tasks.h"
# include "common/utils/LOG/log.h"
#
ifdef OPENAIR2
#
if defined(ENABLE_USE_MME)
#
include "sctp_eNB_task.h"
#
include "s1ap_eNB.h"
#
include "nas_ue_task.h"
#
include "udp_eNB_task.h"
#
include "gtpv1u_eNB_task.h"
#
endif
#
if ENABLE_RAL
#
include "lteRALue.h"
#
include "lteRALenb.h"
#
endif
#
include "RRC/NR/nr_rrc_defs.h"
#
endif
#ifdef OPENAIR2
#
if defined(ENABLE_USE_MME)
#
include "sctp_eNB_task.h"
#
include "s1ap_eNB.h"
#
include "nas_ue_task.h"
#
include "udp_eNB_task.h"
#
include "gtpv1u_eNB_task.h"
#
endif
#
if ENABLE_RAL
#
include "lteRALue.h"
#
include "lteRALenb.h"
#
endif
#
include "RRC/NR/nr_rrc_defs.h"
#endif
# include "gnb_app.h"
extern
int
emulate_rf
;
int
create_gNB_tasks
(
uint32_t
gnb_nb
)
{
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
(
itti_create_task
(
TASK_L2L1
,
l2l1_task
,
NULL
)
<
0
)
{
LOG_E
(
PDCP
,
"Create task for L2L1 failed
\n
"
);
return
-
1
;
...
...
@@ -60,46 +58,41 @@ int create_gNB_tasks(uint32_t gnb_nb)
}
}
/*
# if defined(ENABLE_USE_MME)
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 (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 (itti_create_task (TASK_S1AP, s1ap_eNB_task, NULL) < 0) {
LOG_E(S1AP, "Create task for S1AP 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");
if (itti_create_task (TASK_S1AP, s1ap_eNB_task, NULL) < 0) {
LOG_E(S1AP, "Create task for S1AP 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, >pv1u_eNB_task, NULL) < 0) {
LOG_E(GTPU, "Create task for GTPV1U failed\n");
return -1;
if (itti_create_task (TASK_GTPV1_U, >pv1u_eNB_task, NULL) < 0) {
LOG_E(GTPU, "Create task for GTPV1U failed\n");
return -1;
}
}
}
# endif
*/
*/
if
(
gnb_nb
>
0
)
{
LOG_I
(
NR_RRC
,
"Creating NR RRC gNB Task
\n
"
);
if
(
gnb_nb
>
0
)
{
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
;
}
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
;
}
}
itti_wait_ready
(
0
);
return
0
;
}
#endif
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