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
zzha zzha
OpenXG-RAN
Commits
264725c5
Commit
264725c5
authored
May 21, 2019
by
yilmazt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Changes to fix errors #1
parent
ccd60195
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
93 additions
and
651 deletions
+93
-651
ci-scripts/main.py
ci-scripts/main.py
+11
-131
openair1/PHY/defs_RU.h
openair1/PHY/defs_RU.h
+36
-38
openair1/PHY/defs_eNB.h
openair1/PHY/defs_eNB.h
+16
-452
openair1/PHY/defs_gNB.h
openair1/PHY/defs_gNB.h
+22
-22
targets/RT/USER/nr-ru.c
targets/RT/USER/nr-ru.c
+8
-8
No files found.
ci-scripts/main.py
View file @
264725c5
...
...
@@ -2471,19 +2471,14 @@ class SSHConnection():
if
(
not
os
.
path
.
isfile
(
'./'
+
UElogFile
)):
return
-
1
ue_log_file
=
open
(
'./'
+
UElogFile
,
'r'
)
<<<<<<<
HEAD
exitSignalReceived
=
False
=======
>>>>>>>
origin
/
develop
-
nr
foundAssertion
=
False
msgAssertion
=
''
msgLine
=
0
foundSegFault
=
False
foundRealTimeIssue
=
False
<<<<<<<
HEAD
uciStatMsgCount
=
0
pdcpDataReqFailedCount
=
0
badDciCount
=
0
rrcConnectionRecfgComplete
=
0
no_cell_sync_found
=
False
mib_found
=
False
...
...
@@ -2505,35 +2500,11 @@ class SSHConnection():
foundAssertion
=
True
result
=
re
.
search
(
'LLL'
,
str
(
line
))
if
result
is
not
None
and
not
exitSignalReceived
:
=======
rlcDiscardBuffer
=
0
rachCanceledProcedure
=
0
uciStatMsgCount
=
0
pdcpFailure
=
0
ulschFailure
=
0
no_cell_sync_found
=
False
mib_found
=
False
frequency_found
=
False
self
.
htmlUEFailureMsg
=
''
for
line
in
ue_log_file
.
readlines
():
result
=
re
.
search
(
'[Ss]egmentation [Ff]ault'
,
str
(
line
))
if
result
is
not
None
:
foundSegFault
=
True
result
=
re
.
search
(
'[Cc]ore [dD]ump'
,
str
(
line
))
if
result
is
not
None
:
foundSegFault
=
True
result
=
re
.
search
(
'[Aa]ssertion'
,
str
(
line
))
if
result
is
not
None
:
foundAssertion
=
True
result
=
re
.
search
(
'LLL'
,
str
(
line
))
if
result
is
not
None
:
>>>>>>>
origin
/
develop
-
nr
foundRealTimeIssue
=
True
if
foundAssertion
and
(
msgLine
<
3
):
msgLine
+=
1
msgAssertion
+=
str
(
line
)
result
=
re
.
search
(
'uci->stat'
,
str
(
line
))
<<<<<<<
HEAD
if
result
is
not
None
and
not
exitSignalReceived
:
uciStatMsgCount
+=
1
result
=
re
.
search
(
'PDCP data request failed'
,
str
(
line
))
...
...
@@ -2545,10 +2516,6 @@ class SSHConnection():
result
=
re
.
search
(
'Generating RRCConnectionReconfigurationComplete'
,
str
(
line
))
if
result
is
not
None
:
rrcConnectionRecfgComplete
+=
1
=======
if
result
is
not
None
:
uciStatMsgCount
+=
1
>>>>>>>
origin
/
develop
-
nr
# No cell synchronization found, abandoning
result
=
re
.
search
(
'No cell synchronization found, abandoning'
,
str
(
line
))
if
result
is
not
None
:
...
...
@@ -2586,7 +2553,6 @@ class SSHConnection():
frequency_found
=
True
except
Exception
as
e
:
logging
.
error
(
'
\033
[91m'
+
"Measured Carrier Frequency not found"
+
'
\033
[0m'
)
<<<<<<<
HEAD
result
=
re
.
search
(
"PLMN MCC (?P<mcc>\d{1,3}), MNC (?P<mnc>\d{1,3}), TAC"
,
str
(
line
))
if
result
is
not
None
and
(
not
plmn_found
):
try
:
...
...
@@ -2596,8 +2562,6 @@ class SSHConnection():
plmn_found
=
True
except
Exception
as
e
:
logging
.
error
(
'
\033
[91m'
+
"PLMN not found"
+
'
\033
[0m'
)
=======
>>>>>>>
origin
/
develop
-
nr
result
=
re
.
search
(
"Found (?P<operator>[\w,\s]{1,15}) \(name from internal table\)"
,
str
(
line
))
if
result
is
not
None
:
try
:
...
...
@@ -2633,18 +2597,14 @@ class SSHConnection():
except
Exception
as
e
:
logging
.
error
(
'
\033
[91m'
+
" AllowedMeasBandwidth not found"
+
'
\033
[0m'
)
ue_log_file
.
close
()
<<<<<<<
HEAD
if
rrcConnectionRecfgComplete
>
0
:
statMsg
=
'UE connected to eNB ('
+
str
(
rrcConnectionRecfgComplete
)
+
' RRCConnectionReconfigurationComplete message(s) generated)'
logging
.
debug
(
'
\033
[94m'
+
statMsg
+
'
\033
[0m'
)
self
.
htmlUEFailureMsg
+=
statMsg
+
'
\n
'
=======
>>>>>>>
origin
/
develop
-
nr
if
uciStatMsgCount
>
0
:
statMsg
=
'UE showed '
+
str
(
uciStatMsgCount
)
+
' "uci->stat" message(s)'
logging
.
debug
(
'
\u001B
[1;30;43m '
+
statMsg
+
'
\u001B
[0m'
)
self
.
htmlUEFailureMsg
+=
statMsg
+
'
\n
'
<<<<<<<
HEAD
if
pdcpDataReqFailedCount
>
0
:
statMsg
=
'UE showed '
+
str
(
pdcpDataReqFailedCount
)
+
' "PDCP data request failed" message(s)'
logging
.
debug
(
'
\u001B
[1;30;43m '
+
statMsg
+
'
\u001B
[0m'
)
...
...
@@ -2653,20 +2613,6 @@ class SSHConnection():
statMsg
=
'UE showed '
+
str
(
badDciCount
)
+
' "bad DCI 1A" message(s)'
logging
.
debug
(
'
\u001B
[1;30;43m '
+
statMsg
+
'
\u001B
[0m'
)
self
.
htmlUEFailureMsg
+=
statMsg
+
'
\n
'
=======
if
pdcpFailure
>
0
:
statMsg
=
'UE showed '
+
str
(
pdcpFailure
)
+
' "PDCP Out of Resources" message(s)'
logging
.
debug
(
'
\u001B
[1;30;43m '
+
statMsg
+
'
\u001B
[0m'
)
self
.
htmlUEFailureMsg
+=
statMsg
+
'
\n
'
if
ulschFailure
>
0
:
statMsg
=
'UE showed '
+
str
(
ulschFailure
)
+
' "ULSCH in error in round" message(s)'
logging
.
debug
(
'
\u001B
[1;30;43m '
+
statMsg
+
'
\u001B
[0m'
)
self
.
htmlUEFailureMsg
+=
statMsg
+
'
\n
'
if
rachCanceledProcedure
>
0
:
rachMsg
=
'UE cancelled '
+
str
(
rachCanceledProcedure
)
+
' RA procedure(s)'
logging
.
debug
(
'
\u001B
[1;30;43m '
+
rachMsg
+
'
\u001B
[0m'
)
self
.
htmlUEFailureMsg
+=
rachMsg
+
'
\n
'
>>>>>>>
origin
/
develop
-
nr
if
foundSegFault
:
logging
.
debug
(
'
\u001B
[1;37;41m UE ended with a Segmentation Fault!
\u001B
[0m'
)
return
ENB_PROCESS_SEG_FAULT
...
...
@@ -2684,48 +2630,22 @@ class SSHConnection():
if
no_cell_sync_found
and
not
mib_found
:
logging
.
debug
(
'
\u001B
[1;37;41m UE could not synchronize !
\u001B
[0m'
)
self
.
htmlUEFailureMsg
+=
'UE could not synchronize!
\n
'
<<<<<<<
HEAD
return
UE_PROCESS_COULD_NOT_SYNC
=======
return
UE_PROCESS_COULD_NOT_SYNC
if
rlcDiscardBuffer
>
0
:
rlcMsg
=
'UE RLC discarded '
+
str
(
rlcDiscardBuffer
)
+
' buffer(s)'
logging
.
debug
(
'
\u001B
[1;37;41m '
+
rlcMsg
+
'
\u001B
[0m'
)
self
.
htmlUEFailureMsg
+=
rlcMsg
+
'
\n
'
return
ENB_PROCESS_REALTIME_ISSUE
>>>>>>>
origin
/
develop
-
nr
return
0
def
TerminateeNB
(
self
):
self
.
open
(
self
.
eNBIPAddress
,
self
.
eNBUserName
,
self
.
eNBPassword
)
self
.
command
(
'cd '
+
self
.
eNBSourceCodePath
+
'/cmake_targets'
,
'\$'
,
5
)
<<<<<<<
HEAD
self
.
command
(
'stdbuf -o0 ps -aux | grep --color=never softmodem | grep -v grep'
,
'\$'
,
5
)
result
=
re
.
search
(
'lte-softmodem'
,
str
(
self
.
ssh
.
before
))
if
result
is
not
None
:
self
.
command
(
'echo '
+
self
.
eNBPassword
+
' | sudo -S daemon --name=enb'
+
str
(
self
.
eNB_instance
)
+
'_daemon --stop'
,
'\$'
,
5
)
self
.
command
(
'echo '
+
self
.
eNBPassword
+
' | sudo -S killall --signal SIGINT lte-softmodem || true'
,
'\$'
,
5
)
=======
#to use daemon on CentOS we need to source the function
#linux_distro = platform.linux_distribution()[0]
#if re.match('(.*)CentOS(.*)', linux_distro, re.IGNORECASE):
#self.command('source /etc/init.d/functions', '\$', 5)
#use nohup instead of daemon
self
.
command
(
'echo '
+
self
.
eNBPassword
+
' | sudo -S daemon --name=enb'
+
str
(
self
.
eNB_instance
)
+
'_daemon --stop'
,
'\$'
,
5
)
self
.
command
(
'rm -f my-lte-softmodem-run'
+
str
(
self
.
eNB_instance
)
+
'.sh'
,
'\$'
,
5
)
self
.
command
(
'echo '
+
self
.
eNBPassword
+
' | sudo -S killall --signal SIGINT -r .*-softmodem || true'
,
'\$'
,
5
)
time
.
sleep
(
5
)
self
.
command
(
'stdbuf -o0 ps -aux | grep softmodem | grep -v grep'
,
'\$'
,
5
)
result
=
re
.
search
(
'-softmodem'
,
str
(
self
.
ssh
.
before
))
if
result
is
not
None
:
self
.
command
(
'echo '
+
self
.
eNBPassword
+
' | sudo -S
killall --signal SIGKILL -r .*-softmodem || true
'
,
'\$'
,
5
)
>>>>>>>
origin
/
develop
-
nr
self
.
command
(
'echo '
+
self
.
eNBPassword
+
' | sudo -S
daemon --name=enb'
+
str
(
self
.
eNB_instance
)
+
'_daemon --stop
'
,
'\$'
,
5
)
self
.
command
(
'echo '
+
self
.
eNBPassword
+
' | sudo -S killall --signal SIGINT -r .*-softmodem || true'
,
'\$'
,
5
)
time
.
sleep
(
5
)
self
.
command
(
'stdbuf -o0 ps -aux | grep
--color=never
softmodem | grep -v grep'
,
'\$'
,
5
)
result
=
re
.
search
(
'
lte
-softmodem'
,
str
(
self
.
ssh
.
before
))
self
.
command
(
'stdbuf -o0 ps -aux | grep softmodem | grep -v grep'
,
'\$'
,
5
)
result
=
re
.
search
(
'-softmodem'
,
str
(
self
.
ssh
.
before
))
if
result
is
not
None
:
self
.
command
(
'echo '
+
self
.
eNBPassword
+
' | sudo -S killall --signal SIGKILL lte-softmodem || true'
,
'\$'
,
5
)
time
.
sleep
(
2
)
self
.
command
(
'echo '
+
self
.
eNBPassword
+
' | sudo -S killall --signal SIGKILL -r .*-softmodem || true'
,
'\$'
,
5
)
self
.
command
(
'rm -f my-lte-softmodem-run'
+
str
(
self
.
eNB_instance
)
+
'.sh'
,
'\$'
,
5
)
self
.
close
()
# If tracer options is on, stopping tshark on EPC side
...
...
@@ -2871,52 +2791,29 @@ class SSHConnection():
def
TerminateOAIUE
(
self
):
self
.
open
(
self
.
UEIPAddress
,
self
.
UEUserName
,
self
.
UEPassword
)
self
.
command
(
'cd '
+
self
.
UESourceCodePath
+
'/cmake_targets'
,
'\$'
,
5
)
<<<<<<<
HEAD
self
.
command
(
'ps -aux | grep --color=never softmodem | grep -v grep'
,
'\$'
,
5
)
result
=
re
.
search
(
'
lte
-uesoftmodem'
,
str
(
self
.
ssh
.
before
))
result
=
re
.
search
(
'-uesoftmodem'
,
str
(
self
.
ssh
.
before
))
if
result
is
not
None
:
self
.
command
(
'echo '
+
self
.
UEPassword
+
' | sudo -S daemon --name=ue'
+
str
(
self
.
UE_instance
)
+
'_daemon --stop'
,
'\$'
,
5
)
self
.
command
(
'echo '
+
self
.
UEPassword
+
' | sudo -S killall --signal SIGINT lte-uesoftmodem || true'
,
'\$'
,
5
)
self
.
command
(
'echo '
+
self
.
UEPassword
+
' | sudo -S killall --signal SIGINT -r .*-uesoftmodem || true'
,
'\$'
,
5
)
time
.
sleep
(
5
)
self
.
command
(
'
ps -aux | grep --color=never
softmodem | grep -v grep'
,
'\$'
,
5
)
result
=
re
.
search
(
'
lte
-uesoftmodem'
,
str
(
self
.
ssh
.
before
))
self
.
command
(
'
stdbuf -o0 ps -aux | grep ue
softmodem | grep -v grep'
,
'\$'
,
5
)
result
=
re
.
search
(
'-uesoftmodem'
,
str
(
self
.
ssh
.
before
))
if
result
is
not
None
:
self
.
command
(
'echo '
+
self
.
UEPassword
+
' | sudo -S killall --signal SIGKILL lte-uesoftmodem || true'
,
'\$'
,
5
)
time
.
sleep
(
2
)
self
.
command
(
'rm -f my-lte-uesoftmodem-run'
+
str
(
self
.
UE_instance
)
+
'.sh'
,
'\$'
,
5
)
=======
#to use daemon on CentOS we need to source the function
#linux_distro = platform.linux_distribution()[0]
#if re.match('(.*)CentOS(.*)', linux_distro, re.IGNORECASE):
#self.command('source /etc/init.d/functions', '\$', 5)
#self.command('echo ' + self.UEPassword + ' | sudo -S daemon --name=ue' + str(self.UE_instance) + '_daemon --stop', '\$', 5)
self
.
command
(
'echo '
+
self
.
UEPassword
+
' | sudo -S killall --signal SIGKILL -r .*-uesoftmodem || true'
,
'\$'
,
5
)
time
.
sleep
(
5
)
self
.
command
(
'rm -f my-lte-uesoftmodem-run'
+
str
(
self
.
UE_instance
)
+
'.sh'
,
'\$'
,
5
)
self
.
command
(
'echo '
+
self
.
UEPassword
+
' | sudo -S killall --signal SIGINT -r .*-uesoftmodem || true'
,
'\$'
,
5
)
time
.
sleep
(
5
)
self
.
command
(
'stdbuf -o0 ps -aux | grep uesoftmodem | grep -v grep'
,
'\$'
,
5
)
result
=
re
.
search
(
'-uesoftmodem'
,
str
(
self
.
ssh
.
before
))
if
result
is
not
None
:
self
.
command
(
'echo '
+
self
.
UEPassword
+
' | sudo -S killall --signal SIGKILL -r .*-uesoftmodem || true'
,
'\$'
,
5
)
time
.
sleep
(
5
)
>>>>>>>
origin
/
develop
-
nr
self
.
close
()
result
=
re
.
search
(
'ue_'
,
str
(
self
.
UELogFile
))
if
result
is
not
None
:
copyin_res
=
self
.
copyin
(
self
.
UEIPAddress
,
self
.
UEUserName
,
self
.
UEPassword
,
self
.
UESourceCodePath
+
'/cmake_targets/'
+
self
.
UELogFile
,
'.'
)
if
(
copyin_res
==
-
1
):
logging
.
debug
(
'
\u001B
[1;37;41m Could not copy UE logfile to analyze it!
\u001B
[0m'
)
<<<<<<<
HEAD
self
.
htmlUEFailureMsg
=
'Could not copy UE logfile to analyze it!'
self
.
CreateHtmlTestRow
(
'N/A'
,
'KO'
,
UE_PROCESS_NOLOGFILE_TO_ANALYZE
,
'UE'
)
=======
optionsMsg
=
'<pre style="background-color:white">Could not copy UE logfile to analyze it!</pre>'
self
.
CreateHtmlTestRow
(
optionsMsg
,
'KO'
,
UE_PROCESS_NOLOGFILE_TO_ANALYZE
,
'UE'
)
>>>>>>>
origin
/
develop
-
nr
self
.
UELogFile
=
''
return
logging
.
debug
(
'
\u001B
[1m Analyzing UE logfile
\u001B
[0m'
)
logStatus
=
self
.
AnalyzeLogFile_UE
(
self
.
UELogFile
)
<<<<<<<
HEAD
result
=
re
.
search
(
'--no-L2-connect'
,
str
(
self
.
Initialize_OAI_UE_args
))
if
result
is
not
None
:
ueAction
=
'Sniffing'
...
...
@@ -2941,23 +2838,6 @@ class SSHConnection():
else
:
self
.
htmlUEFailureMsg
=
'No Log File to analyze!'
self
.
CreateHtmlTestRow
(
'N/A'
,
'OK'
,
ALL_PROCESSES_OK
)
=======
if
(
logStatus
<
0
):
optionsMsg
=
'<pre style="background-color:white"><b>Sniffing Unsuccessful</b>
\n
'
optionsMsg
+=
self
.
htmlUEFailureMsg
optionsMsg
+=
'</pre>'
self
.
CreateHtmlTestRow
(
optionsMsg
,
'KO'
,
logStatus
,
'UE'
)
self
.
CreateHtmlTabFooter
(
False
)
sys
.
exit
(
1
)
else
:
optionsMsg
=
'<pre style="background-color:white"><b>Sniffing Successful</b>
\n
'
optionsMsg
+=
self
.
htmlUEFailureMsg
optionsMsg
+=
'</pre>'
self
.
CreateHtmlTestRow
(
optionsMsg
,
'OK'
,
ALL_PROCESSES_OK
)
self
.
UELogFile
=
''
else
:
self
.
CreateHtmlTestRow
(
'<pre style="background-color:white">No Log File to analyze</pre>'
,
'OK'
,
ALL_PROCESSES_OK
)
>>>>>>>
origin
/
develop
-
nr
def
AutoTerminateUEandeNB
(
self
):
if
(
self
.
ADBIPAddress
!=
'none'
):
...
...
openair1/PHY/defs_RU.h
View file @
264725c5
...
...
@@ -35,6 +35,7 @@
#define MAX_BANDS_PER_RRU 4
#define MAX_RRU_CONFIG_SIZE 1024
#ifdef OCP_FRAMEWORK
...
...
@@ -272,9 +273,9 @@ typedef struct RU_proc_t_s {
/// symbol mask for IF4p5 reception per subframe
uint32_t
symbol_mask
[
10
];
/// number of slave threads
int
num_slaves
;
int
num_slaves
;
/// array of pointers to slaves
struct
RU_proc_t_s
**
slave_proc
;
struct
RU_proc_t_s
**
slave_proc
;
#ifdef PHY_TX_THREAD
/// pthread structure for PRACH thread
pthread_t
pthread_phy_tx
;
...
...
@@ -323,7 +324,7 @@ typedef enum {
typedef
struct
RU_t_s
{
/// index of this ru
uint32_t
idx
;
/// Pointer to configuration file
/// Pointer to configuration file
char
*
rf_config_file
;
/// southbound interface
RU_if_south_t
if_south
;
...
...
@@ -340,7 +341,7 @@ typedef struct RU_t_s{
/// flag to indicate the RU is a slave to another source
int
is_slave
;
/// Total gain of receive chain
uint32_t
rx_total_gain_dB
;
uint32_t
rx_total_gain_dB
;
/// number of bands that this device can support
int
num_bands
;
/// band list
...
...
@@ -363,7 +364,11 @@ typedef struct RU_t_s{
struct
LTE_DL_FRAME_PARMS
*
frame_parms
;
struct
NR_DL_FRAME_PARMS
*
nr_frame_parms
;
///timing offset used in TDD
int
N_TA_offset
;
int
N_TA_offset
;
/// SF extension used in TDD (unit: number of samples at 30.72MHz) (this is an expert option)
int
sf_extension
;
/// "end of burst delay" used in TDD (unit: number of samples at 30.72MHz) (this is an expert option)
int
end_of_burst_delay
;
/// RF device descriptor
openair0_device
rfdevice
;
/// HW configuration
...
...
@@ -373,49 +378,49 @@ typedef struct RU_t_s{
int
num_gNB
;
/// list of NBs using this RU
struct
PHY_VARS_eNB_s
*
eNB_list
[
NUMBER_OF_eNB_MAX
];
struct
PHY_VARS_gNB_s
*
gNB_list
[
NUMBER_OF_
e
NB_MAX
];
struct
PHY_VARS_gNB_s
*
gNB_list
[
NUMBER_OF_
g
NB_MAX
];
/// Mapping of antenna ports to RF chain index
openair0_rf_map
rf_map
;
openair0_rf_map
rf_map
;
/// IF device descriptor
openair0_device
ifdevice
;
/// Pointer for ifdevice buffer struct
if_buffer_t
ifbuffer
;
/// if prach processing is to be performed in RU
int
do_prach
;
int
do_prach
;
/// function pointer to synchronous RX fronthaul function (RRU,3GPP_eNB/3GPP_gNB)
void
(
*
fh_south_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
void
(
*
fh_south_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
/// function pointer to synchronous TX fronthaul function
void
(
*
fh_south_out
)(
struct
RU_t_s
*
ru
);
void
(
*
fh_south_out
)(
struct
RU_t_s
*
ru
);
/// function pointer to synchronous RX fronthaul function (RRU)
void
(
*
fh_north_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
void
(
*
fh_north_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
/// function pointer to synchronous RX fronthaul function (RRU)
void
(
*
fh_north_out
)(
struct
RU_t_s
*
ru
);
void
(
*
fh_north_out
)(
struct
RU_t_s
*
ru
);
/// function pointer to asynchronous fronthaul interface
void
(
*
fh_north_asynch_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
void
(
*
fh_north_asynch_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
/// function pointer to asynchronous fronthaul interface
void
(
*
fh_south_asynch_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
void
(
*
fh_south_asynch_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
/// function pointer to initialization function for radio interface
int
(
*
start_rf
)(
struct
RU_t_s
*
ru
);
int
(
*
start_rf
)(
struct
RU_t_s
*
ru
);
/// function pointer to release function for radio interface
int
(
*
stop_rf
)(
struct
RU_t_s
*
ru
);
int
(
*
stop_rf
)(
struct
RU_t_s
*
ru
);
/// function pointer to initialization function for radio interface
int
(
*
start_if
)(
struct
RU_t_s
*
ru
,
struct
PHY_VARS_gNB_s
*
gNB
);
int
(
*
start_if
)(
struct
RU_t_s
*
ru
,
struct
PHY_VARS_eNB_s
*
eNB
);
int
(
*
nr_start_if
)(
struct
RU_t_s
*
ru
,
struct
PHY_VARS_gNB_s
*
gNB
);
/// function pointer to RX front-end processing routine (DFTs/prefix removal or NULL)
void
(
*
feprx
)(
struct
RU_t_s
*
ru
);
void
(
*
feprx
)(
struct
RU_t_s
*
ru
);
/// function pointer to TX front-end processing routine (IDFTs and prefix removal or NULL)
void
(
*
feptx_ofdm
)(
struct
RU_t_s
*
ru
);
void
(
*
feptx_ofdm
)(
struct
RU_t_s
*
ru
);
/// function pointer to TX front-end processing routine (PRECODING)
void
(
*
feptx_prec
)(
struct
RU_t_s
*
ru
);
void
(
*
feptx_prec
)(
struct
RU_t_s
*
ru
);
/// function pointer to wakeup routine in lte-enb/nr-gnb.
int
(
*
wakeup_rxtx
)(
struct
PHY_VARS_eNB_s
*
eNB
,
struct
RU_t_s
*
ru
);
int
(
*
nr_wakeup_rxtx
)(
struct
PHY_VARS_gNB_s
*
gNB
,
struct
RU_t_s
*
ru
);
/// function pointer to wakeup routine in lte-enb/nr-gnb.
void
(
*
wakeup_prach_eNB
)(
struct
PHY_VARS_eNB_s
*
eNB
,
struct
RU_t_s
*
ru
,
int
frame
,
int
subframe
);
void
(
*
wakeup_prach_gNB
)(
struct
PHY_VARS_gNB_s
*
gNB
,
struct
RU_t_s
*
ru
,
int
frame
,
int
subframe
);
void
(
*
wakeup_prach_eNB
)(
struct
PHY_VARS_eNB_s
*
eNB
,
struct
RU_t_s
*
ru
,
int
frame
,
int
subframe
);
void
(
*
wakeup_prach_gNB
)(
struct
PHY_VARS_gNB_s
*
gNB
,
struct
RU_t_s
*
ru
,
int
frame
,
int
subframe
);
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
/// function pointer to wakeup routine in lte-enb.
void
(
*
wakeup_prach_eNB_br
)(
struct
PHY_VARS_eNB_s
*
eNB
,
struct
RU_t_s
*
ru
,
int
frame
,
int
subframe
);
void
(
*
wakeup_prach_eNB_br
)(
struct
PHY_VARS_eNB_s
*
eNB
,
struct
RU_t_s
*
ru
,
int
frame
,
int
subframe
);
#endif
/// function pointer to NB entry routine
...
...
@@ -443,29 +448,25 @@ typedef struct RU_t_s{
/// Timing statistics (Fronthaul transport)
time_stats_t
transport
;
/// RX and TX buffers for precoder output
RU_COMMON
common
;
RU_COMMON
common
;
/// beamforming weight vectors per eNB
int32_t
**
beam_weights
[
NUMBER_OF_eNB_MAX
+
1
][
15
];
/// beamforming weight vectors per
e
NB
/// beamforming weight vectors per
g
NB
int32_t
**
nrbeam_weights
[
NUMBER_OF_gNB_MAX
+
1
][
16
];
/// received frequency-domain signal for PRACH (IF4p5 RRU)
int16_t
**
prach_rxsigF
;
int16_t
**
prach_rxsigF
;
/// received frequency-domain signal for PRACH BR (IF4p5 RRU)
int16_t
**
prach_rxsigF_br
[
4
];
int16_t
**
prach_rxsigF_br
[
4
];
/// sequence number for IF5
uint8_t
seqno
;
/// initial timestamp used as an offset make first real timestamp 0
openair0_timestamp
ts_offset
;
openair0_timestamp
ts_offset
;
/// process scheduling variables
RU_proc_t
proc
;
RU_proc_t
proc
;
/// stats thread pthread descriptor
pthread_t
ru_stats_thread
;
pthread_t
ru_stats_thread
;
}
RU_t
;
#define MAX_RRU_CONFIG_SIZE 1024
typedef
enum
{
RAU_tick
=
0
,
RRU_capabilities
=
1
,
...
...
@@ -487,8 +488,6 @@ typedef enum {
MAX_FH_FMTs
=
4
}
FH_fmt_options_t
;
#define MAX_BANDS_PER_RRU 4
typedef
struct
RRU_capabilities_s
{
/// Fronthaul format
FH_fmt_options_t
FH_fmt
;
...
...
@@ -513,7 +512,6 @@ typedef struct RRU_capabilities_s {
}
RRU_capabilities_t
;
typedef
struct
RRU_config_s
{
/// Fronthaul format
RU_if_south_t
FH_fmt
;
/// number of EUTRA bands (<=4) configured in RRU
...
...
openair1/PHY/defs_eNB.h
View file @
264725c5
...
...
@@ -34,30 +34,26 @@
#define _GNU_SOURCE
#include <execinfo.h>
#include <getopt.h>
#include <malloc.h>
#include <math.h>
#include <pthread.h>
#include <sched.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <unistd.h>
#include <linux/sched.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <linux/sched.h>
#include <signal.h>
#include <execinfo.h>
#include <getopt.h>
#include <sys/sysinfo.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
#include "common_lib.h"
#include "msc.h"
#include "defs_common.h"
#include "impl_defs_top.h"
#include "PHY/TOOLS/time_meas.h"
...
...
@@ -66,445 +62,19 @@
#include "platform_types.h"
#include "PHY/LTE_TRANSPORT/transport_common.h"
#include "PHY/LTE_TRANSPORT/transport_eNB.h"
#include <pthread.h>
#include "openair2/PHY_INTERFACE/IF_Module.h"
#define MAX_NUM_RU_PER_eNB 64
typedef
struct
RU_proc_t_s
{
/// Pointer to associated RU descriptor
struct
RU_t_s
*
ru
;
/// timestamp received from HW
openair0_timestamp
timestamp_rx
;
/// timestamp to send to "slave rru"
openair0_timestamp
timestamp_tx
;
/// subframe to act upon for reception
int
subframe_rx
;
/// subframe to act upon for transmission
int
subframe_tx
;
/// subframe to act upon for reception of prach
int
subframe_prach
;
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
/// subframe to act upon for reception of prach BL/CE UEs
int
subframe_prach_br
;
#endif
/// frame to act upon for reception
int
frame_rx
;
/// frame to act upon for transmission
int
frame_tx
;
/// unwrapped frame count
int
frame_tx_unwrap
;
/// frame to act upon for reception of prach
int
frame_prach
;
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
/// frame to act upon for reception of prach
int
frame_prach_br
;
#endif
/// frame offset for slave RUs (to correct for frame asynchronism at startup)
int
frame_offset
;
/// \brief Instance count for FH processing thread.
/// \internal This variable is protected by \ref mutex_FH.
int
instance_cnt_FH
;
int
instance_cnt_FH1
;
/// \internal This variable is protected by \ref mutex_prach.
int
instance_cnt_prach
;
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
/// \internal This variable is protected by \ref mutex_prach.
int
instance_cnt_prach_br
;
#endif
/// \internal This variable is protected by \ref mutex_synch.
int
instance_cnt_synch
;
/// \internal This variable is protected by \ref mutex_eNBs.
int
instance_cnt_eNBs
;
/// \brief Instance count for rx processing thread.
/// \internal This variable is protected by \ref mutex_asynch_rxtx.
int
instance_cnt_asynch_rxtx
;
/// \internal This variable is protected by \ref mutex_fep
int
instance_cnt_fep
;
/// \internal This variable is protected by \ref mutex_feptx
int
instance_cnt_feptx
;
/// This varible is protected by \ref mutex_emulatedRF
int
instance_cnt_emulateRF
;
/// pthread structure for RU FH processing thread
pthread_t
pthread_FH
;
pthread_t
pthread_FH1
;
/// pthread structure for RU prach processing thread
pthread_t
pthread_prach
;
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
/// pthread structure for RU prach processing thread BL/CE UEs
pthread_t
pthread_prach_br
;
#endif
/// pthread struct for RU synch thread
pthread_t
pthread_synch
;
/// pthread struct for RU RX FEP worker thread
pthread_t
pthread_fep
;
/// pthread struct for RU TX FEP worker thread
pthread_t
pthread_feptx
;
/// pthread struct for emulated RF
pthread_t
pthread_emulateRF
;
/// pthread structure for asychronous RX/TX processing thread
pthread_t
pthread_asynch_rxtx
;
/// flag to indicate first RX acquisition
int
first_rx
;
/// flag to indicate first TX transmission
int
first_tx
;
/// pthread attributes for RU FH processing thread
pthread_attr_t
attr_FH
;
pthread_attr_t
attr_FH1
;
/// pthread attributes for RU prach
pthread_attr_t
attr_prach
;
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
/// pthread attributes for RU prach BL/CE UEs
pthread_attr_t
attr_prach_br
;
#endif
/// pthread attributes for RU synch thread
pthread_attr_t
attr_synch
;
/// pthread attributes for asynchronous RX thread
pthread_attr_t
attr_asynch_rxtx
;
/// pthread attributes for worker fep thread
pthread_attr_t
attr_fep
;
/// pthread attributes for worker feptx thread
pthread_attr_t
attr_feptx
;
/// pthread attributes for emulated RF
pthread_attr_t
attr_emulateRF
;
/// scheduling parameters for RU FH thread
struct
sched_param
sched_param_FH
;
struct
sched_param
sched_param_FH1
;
/// scheduling parameters for RU prach thread
struct
sched_param
sched_param_prach
;
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
/// scheduling parameters for RU prach thread BL/CE UEs
struct
sched_param
sched_param_prach_br
;
#endif
/// scheduling parameters for RU synch thread
struct
sched_param
sched_param_synch
;
/// scheduling parameters for asynch_rxtx thread
struct
sched_param
sched_param_asynch_rxtx
;
/// condition variable for RU FH thread
pthread_cond_t
cond_FH
;
pthread_cond_t
cond_FH1
;
/// condition variable for RU prach thread
pthread_cond_t
cond_prach
;
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
/// condition variable for RU prach thread BL/CE UEs
pthread_cond_t
cond_prach_br
;
#endif
/// condition variable for RU synch thread
pthread_cond_t
cond_synch
;
/// condition variable for asynch RX/TX thread
pthread_cond_t
cond_asynch_rxtx
;
/// condition variable for RU RX FEP thread
pthread_cond_t
cond_fep
;
/// condition variable for RU TX FEP thread
pthread_cond_t
cond_feptx
;
/// condition variable for emulated RF
pthread_cond_t
cond_emulateRF
;
/// condition variable for eNB signal
pthread_cond_t
cond_eNBs
;
/// mutex for RU FH
pthread_mutex_t
mutex_FH
;
pthread_mutex_t
mutex_FH1
;
/// mutex for RU prach
pthread_mutex_t
mutex_prach
;
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
/// mutex for RU prach BL/CE UEs
pthread_mutex_t
mutex_prach_br
;
#endif
/// mutex for RU synch
pthread_mutex_t
mutex_synch
;
/// mutex for eNB signal
pthread_mutex_t
mutex_eNBs
;
/// mutex for asynch RX/TX thread
pthread_mutex_t
mutex_asynch_rxtx
;
/// mutex for fep RX worker thread
pthread_mutex_t
mutex_fep
;
/// mutex for fep TX worker thread
pthread_mutex_t
mutex_feptx
;
/// mutex for emulated RF thread
pthread_mutex_t
mutex_emulateRF
;
/// symbol mask for IF4p5 reception per subframe
uint32_t
symbol_mask
[
10
];
/// number of slave threads
int
num_slaves
;
/// array of pointers to slaves
struct
RU_proc_t_s
**
slave_proc
;
#ifdef PHY_TX_THREAD
/// pthread structure for PRACH thread
pthread_t
pthread_phy_tx
;
pthread_mutex_t
mutex_phy_tx
;
pthread_cond_t
cond_phy_tx
;
/// \internal This variable is protected by \ref mutex_phy_tx.
int
instance_cnt_phy_tx
;
/// frame to act upon for transmission
int
frame_phy_tx
;
/// subframe to act upon for transmission
int
subframe_phy_tx
;
/// timestamp to send to "slave rru"
openair0_timestamp
timestamp_phy_tx
;
/// pthread structure for RF TX thread
pthread_t
pthread_rf_tx
;
pthread_mutex_t
mutex_rf_tx
;
pthread_cond_t
cond_rf_tx
;
/// \internal This variable is protected by \ref mutex_rf_tx.
int
instance_cnt_rf_tx
;
#endif
#if defined(PRE_SCD_THREAD)
pthread_t
pthread_pre_scd
;
/// condition variable for time processing thread
pthread_cond_t
cond_pre_scd
;
/// mutex for time thread
pthread_mutex_t
mutex_pre_scd
;
int
instance_pre_scd
;
#endif
int
emulate_rf_busy
;
}
RU_proc_t
;
typedef
enum
{
LOCAL_RF
=
0
,
REMOTE_IF5
=
1
,
REMOTE_MBP_IF5
=
2
,
REMOTE_IF4p5
=
3
,
REMOTE_IF1pp
=
4
,
MAX_RU_IF_TYPES
=
5
}
RU_if_south_t
;
typedef
struct
RU_t_s
{
/// index of this ru
uint32_t
idx
;
/// Pointer to configuration file
char
*
rf_config_file
;
/// southbound interface
RU_if_south_t
if_south
;
/// timing
node_timing_t
if_timing
;
/// function
node_function_t
function
;
/// Ethernet parameters for fronthaul interface
eth_params_t
eth_params
;
/// flag to indicate the RU is in synch with a master reference
int
in_synch
;
/// timing offset
int
rx_offset
;
/// flag to indicate the RU is a slave to another source
int
is_slave
;
/// Total gain of receive chain
uint32_t
rx_total_gain_dB
;
/// number of bands that this device can support
int
num_bands
;
/// band list
int
band
[
MAX_BANDS_PER_RRU
];
/// number of RX paths on device
int
nb_rx
;
/// number of TX paths on device
int
nb_tx
;
/// maximum PDSCH RS EPRE
int
max_pdschReferenceSignalPower
;
/// maximum RX gain
int
max_rxgain
;
/// Attenuation of RX paths on device
int
att_rx
;
/// Attenuation of TX paths on device
int
att_tx
;
/// flag to indicate precoding operation in RU
int
do_precoding
;
/// Frame parameters
LTE_DL_FRAME_PARMS
frame_parms
;
///timing offset used in TDD
int
N_TA_offset
;
/// SF extension used in TDD (unit: number of samples at 30.72MHz) (this is an expert option)
int
sf_extension
;
/// "end of burst delay" used in TDD (unit: number of samples at 30.72MHz) (this is an expert option)
int
end_of_burst_delay
;
/// RF device descriptor
openair0_device
rfdevice
;
/// HW configuration
openair0_config_t
openair0_cfg
;
/// Number of eNBs using this RU
int
num_eNB
;
/// list of eNBs using this RU
struct
PHY_VARS_eNB_s
*
eNB_list
[
NUMBER_OF_eNB_MAX
];
/// Mapping of antenna ports to RF chain index
openair0_rf_map
rf_map
;
/// IF device descriptor
openair0_device
ifdevice
;
/// Pointer for ifdevice buffer struct
if_buffer_t
ifbuffer
;
/// if prach processing is to be performed in RU
int
do_prach
;
/// function pointer to synchronous RX fronthaul function (RRU,3GPP_eNB)
void
(
*
fh_south_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
/// function pointer to synchronous TX fronthaul function
void
(
*
fh_south_out
)(
struct
RU_t_s
*
ru
);
/// function pointer to synchronous RX fronthaul function (RRU)
void
(
*
fh_north_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
/// function pointer to synchronous RX fronthaul function (RRU)
void
(
*
fh_north_out
)(
struct
RU_t_s
*
ru
);
/// function pointer to asynchronous fronthaul interface
void
(
*
fh_north_asynch_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
/// function pointer to asynchronous fronthaul interface
void
(
*
fh_south_asynch_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
/// function pointer to initialization function for radio interface
int
(
*
start_rf
)(
struct
RU_t_s
*
ru
);
/// function pointer to release function for radio interface
int
(
*
stop_rf
)(
struct
RU_t_s
*
ru
);
/// function pointer to initialization function for radio interface
int
(
*
start_if
)(
struct
RU_t_s
*
ru
,
struct
PHY_VARS_eNB_s
*
eNB
);
/// function pointer to RX front-end processing routine (DFTs/prefix removal or NULL)
void
(
*
feprx
)(
struct
RU_t_s
*
ru
);
/// function pointer to TX front-end processing routine (IDFTs and prefix removal or NULL)
void
(
*
feptx_ofdm
)(
struct
RU_t_s
*
ru
);
/// function pointer to TX front-end processing routine (PRECODING)
void
(
*
feptx_prec
)(
struct
RU_t_s
*
ru
);
/// function pointer to wakeup routine in lte-enb.
int
(
*
wakeup_rxtx
)(
struct
PHY_VARS_eNB_s
*
eNB
,
struct
RU_t_s
*
ru
);
/// function pointer to wakeup routine in lte-enb.
void
(
*
wakeup_prach_eNB
)(
struct
PHY_VARS_eNB_s
*
eNB
,
struct
RU_t_s
*
ru
,
int
frame
,
int
subframe
);
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
/// function pointer to wakeup routine in lte-enb.
void
(
*
wakeup_prach_eNB_br
)(
struct
PHY_VARS_eNB_s
*
eNB
,
struct
RU_t_s
*
ru
,
int
frame
,
int
subframe
);
#endif
/// function pointer to eNB entry routine
void
(
*
eNB_top
)(
struct
PHY_VARS_eNB_s
*
eNB
,
int
frame_rx
,
int
subframe_rx
,
char
*
string
,
struct
RU_t_s
*
ru
);
/// Timing statistics
time_stats_t
ofdm_demod_stats
;
/// Timing statistics (TX)
time_stats_t
ofdm_mod_stats
;
/// Timing wait statistics
time_stats_t
ofdm_demod_wait_stats
;
/// Timing wakeup statistics
time_stats_t
ofdm_demod_wakeup_stats
;
/// Timing wait statistics (TX)
time_stats_t
ofdm_mod_wait_stats
;
/// Timing wakeup statistics (TX)
time_stats_t
ofdm_mod_wakeup_stats
;
/// Timing statistics (RX Fronthaul + Compression)
time_stats_t
rx_fhaul
;
/// Timing statistics (TX Fronthaul + Compression)
time_stats_t
tx_fhaul
;
/// Timong statistics (Compression)
time_stats_t
compression
;
/// Timing statistics (Fronthaul transport)
time_stats_t
transport
;
/// RX and TX buffers for precoder output
RU_COMMON
common
;
/// beamforming weight vectors per eNB
int32_t
**
beam_weights
[
NUMBER_OF_eNB_MAX
+
1
][
15
];
/// received frequency-domain signal for PRACH (IF4p5 RRU)
int16_t
**
prach_rxsigF
;
/// received frequency-domain signal for PRACH BR (IF4p5 RRU)
int16_t
**
prach_rxsigF_br
[
4
];
/// sequence number for IF5
uint8_t
seqno
;
/// initial timestamp used as an offset make first real timestamp 0
openair0_timestamp
ts_offset
;
/// process scheduling variables
RU_proc_t
proc
;
/// stats thread pthread descriptor
pthread_t
ru_stats_thread
;
}
RU_t
;
#define MAX_RRU_CONFIG_SIZE 1024
typedef
enum
{
RAU_tick
=
0
,
RRU_capabilities
=
1
,
RRU_config
=
2
,
RRU_MSG_max_num
=
3
}
rru_config_msg_type_t
;
typedef
struct
RRU_CONFIG_msg_s
{
rru_config_msg_type_t
type
;
ssize_t
len
;
uint8_t
msg
[
MAX_RRU_CONFIG_SIZE
];
}
RRU_CONFIG_msg_t
;
typedef
enum
{
OAI_IF5_only
=
0
,
OAI_IF4p5_only
=
1
,
OAI_IF5_and_IF4p5
=
2
,
MBP_IF5
=
3
,
MAX_FH_FMTs
=
4
}
FH_fmt_options_t
;
#define MAX_BANDS_PER_RRU 4
typedef
struct
RRU_capabilities_s
{
/// Fronthaul format
FH_fmt_options_t
FH_fmt
;
/// number of EUTRA bands (<=4) supported by RRU
uint8_t
num_bands
;
/// EUTRA band list supported by RRU
uint8_t
band_list
[
MAX_BANDS_PER_RRU
];
/// Number of concurrent bands (component carriers)
uint8_t
num_concurrent_bands
;
/// Maximum TX EPRE of each band
int8_t
max_pdschReferenceSignalPower
[
MAX_BANDS_PER_RRU
];
/// Maximum RX gain of each band
uint8_t
max_rxgain
[
MAX_BANDS_PER_RRU
];
/// Number of RX ports of each band
uint8_t
nb_rx
[
MAX_BANDS_PER_RRU
];
/// Number of TX ports of each band
uint8_t
nb_tx
[
MAX_BANDS_PER_RRU
];
/// max DL bandwidth (1,6,15,25,50,75,100)
uint8_t
N_RB_DL
[
MAX_BANDS_PER_RRU
];
/// max UL bandwidth (1,6,15,25,50,75,100)
uint8_t
N_RB_UL
[
MAX_BANDS_PER_RRU
];
}
RRU_capabilities_t
;
typedef
struct
RRU_config_s
{
/// Fronthaul format
RU_if_south_t
FH_fmt
;
/// number of EUTRA bands (<=4) configured in RRU
uint8_t
num_bands
;
/// EUTRA band list configured in RRU
uint8_t
band_list
[
MAX_BANDS_PER_RRU
];
/// TDD configuration (0-6)
uint8_t
tdd_config
[
MAX_BANDS_PER_RRU
];
/// TDD special subframe configuration (0-10)
uint8_t
tdd_config_S
[
MAX_BANDS_PER_RRU
];
/// TX frequency
uint32_t
tx_freq
[
MAX_BANDS_PER_RRU
];
/// RX frequency
uint32_t
rx_freq
[
MAX_BANDS_PER_RRU
];
/// TX attenation w.r.t. max
uint8_t
att_tx
[
MAX_BANDS_PER_RRU
];
/// RX attenuation w.r.t. max
uint8_t
att_rx
[
MAX_BANDS_PER_RRU
];
/// DL bandwidth
uint8_t
N_RB_DL
[
MAX_BANDS_PER_RRU
];
/// UL bandwidth
uint8_t
N_RB_UL
[
MAX_BANDS_PER_RRU
];
/// 3/4 sampling rate
uint8_t
threequarter_fs
[
MAX_BANDS_PER_RRU
];
/// prach_FreqOffset for IF4p5
int
prach_FreqOffset
[
MAX_BANDS_PER_RRU
];
/// prach_ConfigIndex for IF4p5
int
prach_ConfigIndex
[
MAX_BANDS_PER_RRU
];
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
int
emtc_prach_CElevel_enable
[
MAX_BANDS_PER_RRU
][
4
];
/// emtc_prach_FreqOffset for IF4p5 per CE Level
int
emtc_prach_FreqOffset
[
MAX_BANDS_PER_RRU
][
4
];
/// emtc_prach_ConfigIndex for IF4p5 per CE Level
int
emtc_prach_ConfigIndex
[
MAX_BANDS_PER_RRU
][
4
];
#endif
}
RRU_config_t
;
#include <pthread.h>
#include "common_lib.h"
#include "openairinterface5g_limits.h"
#define PBCH_A 24
#define NUMBER_OF_SUBBANDS_MAX 13
#define NUMBER_OF_HARQ_PID_MAX 8
#define MAX_BANDS_PER_RRU 4
#define MAX_FRAME_NUMBER 0x400
#define MAX_NUM_RU_PER_eNB 64
#define MAX_NUM_RX_PRACH_PREAMBLES 4
#define MAX_RRU_CONFIG_SIZE 1024
typedef
struct
{
/// \brief Pointers (dynamic) to the received data in the time domain.
...
...
@@ -606,14 +176,13 @@ typedef struct {
int16_t
*
llr
;
}
LTE_eNB_PUSCH
;
#define PBCH_A 24
typedef
struct
{
uint8_t
pbch_d
[
96
+
(
3
*
(
16
+
PBCH_A
))];
uint8_t
pbch_w
[
3
*
3
*
(
16
+
PBCH_A
)];
uint8_t
pbch_e
[
1920
];
}
LTE_eNB_PBCH
;
#define MAX_NUM_RX_PRACH_PREAMBLES 4
typedef
struct
{
/// \brief ?.
...
...
@@ -639,11 +208,6 @@ typedef struct {
#endif
}
LTE_eNB_PRACH
;
#include "PHY/TOOLS/time_meas.h"
#include "PHY/CODING/coding_defs.h"
#include "PHY/TOOLS/tools_defs.h"
#include "PHY/LTE_TRANSPORT/transport_eNB.h"
/// Context data structure for RX/TX portion of subframe processing
typedef
struct
{
/// Component Carrier index
...
...
openair1/PHY/defs_gNB.h
View file @
264725c5
...
...
@@ -531,7 +531,7 @@ typedef struct PHY_VARS_gNB_s {
module_id_t
Mod_id
;
uint8_t
CC_id
;
uint8_t
configured
;
gNB_L1_proc_t
proc
;
gNB_L1_proc_t
proc
;
int
single_thread_flag
;
int
abstraction_flag
;
int
num_RU
;
...
...
@@ -541,13 +541,13 @@ typedef struct PHY_VARS_gNB_s {
/// Ethernet parameters for fronthaul interface
eth_params_t
eth_params
;
int
rx_total_gain_dB
;
int
(
*
start_if
)(
struct
RU_t_s
*
ru
,
struct
PHY_VARS_gNB_s
*
gNB
);
int
(
*
nr_start_if
)(
struct
RU_t_s
*
ru
,
struct
PHY_VARS_gNB_s
*
gNB
);
uint8_t
local_flag
;
nfapi_nr_config_request_t
gNB_config
;
NR_DL_FRAME_PARMS
frame_parms
;
NR_DL_FRAME_PARMS
frame_parms
;
PHY_MEASUREMENTS_gNB
measurements
;
NR_IF_Module_t
*
if_inst
;
NR_UL_IND_t
UL_INFO
;
NR_IF_Module_t
*
if_inst
;
NR_UL_IND_t
UL_INFO
;
pthread_mutex_t
UL_INFO_mutex
;
/// NFAPI RX ULSCH information
nfapi_rx_indication_pdu_t
rx_pdu_list
[
NFAPI_RX_IND_MAX_PDU
];
...
...
@@ -564,24 +564,24 @@ typedef struct PHY_VARS_gNB_s {
/// NFAPI PRACH information
nfapi_preamble_pdu_t
preamble_list
[
MAX_NUM_RX_PRACH_PREAMBLES
];
Sched_Rsp_t
Sched_INFO
;
NR_gNB_PDCCH
pdcch_vars
;
NR_gNB_PBCH
pbch
;
LTE_eNB_PHICH
phich_vars
[
2
];
NR_gNB_COMMON
common_vars
;
LTE_eNB_UCI
uci_vars
[
NUMBER_OF_UE_MAX
];
LTE_eNB_SRS
srs_vars
[
NUMBER_OF_UE_MAX
];
LTE_eNB_PUSCH
*
pusch_vars
[
NUMBER_OF_UE_MAX
];
LTE_eNB_PRACH
prach_vars
;
NR_gNB_DLSCH_t
*
dlsch
[
NUMBER_OF_UE_MAX
][
2
];
// Nusers times two spatial streams
NR_gNB_ULSCH_t
*
ulsch
[
NUMBER_OF_UE_MAX
+
1
][
2
];
// [Nusers times + number of RA][2 codewords], index 0 in [NUMBER_OF_UE_MAX+1] is for RA
Sched_Rsp_t
Sched_INFO
;
NR_gNB_PDCCH
pdcch_vars
;
NR_gNB_PBCH
pbch
;
LTE_eNB_PHICH
phich_vars
[
2
];
NR_gNB_COMMON
common_vars
;
LTE_eNB_UCI
uci_vars
[
NUMBER_OF_UE_MAX
];
LTE_eNB_SRS
srs_vars
[
NUMBER_OF_UE_MAX
];
LTE_eNB_PUSCH
*
pusch_vars
[
NUMBER_OF_UE_MAX
];
LTE_eNB_PRACH
prach_vars
;
NR_gNB_DLSCH_t
*
dlsch
[
NUMBER_OF_UE_MAX
][
2
];
// Nusers times two spatial streams
NR_gNB_ULSCH_t
*
ulsch
[
NUMBER_OF_UE_MAX
+
1
][
2
];
// [Nusers times + number of RA][2 codewords], index 0 in [NUMBER_OF_UE_MAX+1] is for RA
// LTE_eNB_ULSCH_t *ulsch[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA
NR_gNB_DLSCH_t
*
dlsch_SI
,
*
dlsch_ra
,
*
dlsch_p
;
NR_gNB_DLSCH_t
*
dlsch_MCH
;
NR_gNB_DLSCH_t
*
dlsch_PCH
;
LTE_eNB_UE_stats
UE_stats
[
NUMBER_OF_UE_MAX
];
LTE_eNB_UE_stats
*
UE_stats_ptr
[
NUMBER_OF_UE_MAX
];
NR_gNB_DLSCH_t
*
dlsch_SI
,
*
dlsch_ra
,
*
dlsch_p
;
NR_gNB_DLSCH_t
*
dlsch_MCH
;
NR_gNB_DLSCH_t
*
dlsch_PCH
;
LTE_eNB_UE_stats
UE_stats
[
NUMBER_OF_UE_MAX
];
LTE_eNB_UE_stats
*
UE_stats_ptr
[
NUMBER_OF_UE_MAX
];
uint8_t
pbch_configured
;
uint8_t
pbch_pdu
[
4
];
//PBCH_PDU_SIZE
...
...
targets/RT/USER/nr-ru.c
View file @
264725c5
...
...
@@ -1428,9 +1428,9 @@ static void* ru_thread( void* param ) {
}
else
{
// Start IF device if any
if
(
ru
->
start_if
)
{
if
(
ru
->
nr_
start_if
)
{
LOG_I
(
PHY
,
"Starting IF interface for RU %d
\n
"
,
ru
->
idx
);
AssertFatal
(
ru
->
start_if
(
ru
,
NULL
)
==
0
,
"Could not start the IF device
\n
"
);
AssertFatal
(
ru
->
nr_
start_if
(
ru
,
NULL
)
==
0
,
"Could not start the IF device
\n
"
);
if
(
ru
->
if_south
==
LOCAL_RF
)
ret
=
connect_rau
(
ru
);
else
ret
=
attach_rru
(
ru
);
AssertFatal
(
ret
==
0
,
"Cannot connect to remote radio
\n
"
);
...
...
@@ -1671,7 +1671,7 @@ void *ru_thread_synch(void *arg) {
}
*/
int
start_if
(
struct
RU_t_s
*
ru
,
struct
PHY_VARS_gNB_s
*
gNB
)
{
int
nr_
start_if
(
struct
RU_t_s
*
ru
,
struct
PHY_VARS_gNB_s
*
gNB
)
{
return
(
ru
->
ifdevice
.
trx_start_func
(
&
ru
->
ifdevice
));
}
...
...
@@ -2067,7 +2067,7 @@ void set_function_spec_param(RU_t *ru)
ru
->
feprx
=
NULL
;
// nothing (this is a time-domain signal)
ru
->
feptx_ofdm
=
NULL
;
// nothing (this is a time-domain signal)
ru
->
feptx_prec
=
NULL
;
// nothing (this is a time-domain signal)
ru
->
start_if
=
start_if
;
// need to start the if interface for if5
ru
->
nr_start_if
=
nr_start_if
;
// need to start the if interface for if5
ru
->
ifdevice
.
host_type
=
RRU_HOST
;
ru
->
rfdevice
.
host_type
=
RRU_HOST
;
ru
->
ifdevice
.
eth_params
=
&
ru
->
eth_params
;
...
...
@@ -2092,7 +2092,7 @@ void set_function_spec_param(RU_t *ru)
ru
->
feprx
=
(
get_nprocs
()
<=
2
)
?
fep_full
:
ru_fep_full_2thread
;
// RX DFTs
ru
->
feptx_ofdm
=
(
get_nprocs
()
<=
2
)
?
nr_feptx_ofdm
:
nr_feptx_ofdm_2thread
;
// this is fep with idft only (no precoding in RRU)
ru
->
feptx_prec
=
NULL
;
ru
->
start_if
=
start_if
;
// need to start the if interface for if4p5
ru
->
nr_start_if
=
nr_start_if
;
// need to start the if interface for if4p5
ru
->
ifdevice
.
host_type
=
RRU_HOST
;
ru
->
rfdevice
.
host_type
=
RRU_HOST
;
ru
->
ifdevice
.
eth_params
=
&
ru
->
eth_params
;
...
...
@@ -2116,7 +2116,7 @@ void set_function_spec_param(RU_t *ru)
ru
->
feptx_prec
=
feptx_prec
;
// this is fep with idft and precoding
ru
->
fh_north_in
=
NULL
;
// no incoming fronthaul from north
ru
->
fh_north_out
=
NULL
;
// no outgoing fronthaul to north
ru
->
start_if
=
NULL
;
// no if interface
ru
->
nr_start_if
=
NULL
;
// no if interface
ru
->
rfdevice
.
host_type
=
RAU_HOST
;
}
ru
->
fh_south_in
=
rx_rf
;
// local synchronous RF RX
...
...
@@ -2149,7 +2149,7 @@ void set_function_spec_param(RU_t *ru)
ru
->
fh_south_asynch_in
=
NULL
;
// no asynchronous UL
ru
->
start_rf
=
NULL
;
// no local RF
ru
->
stop_rf
=
NULL
;
ru
->
start_if
=
start_if
;
// need to start if interface for IF5
ru
->
nr_start_if
=
nr_start_if
;
// need to start if interface for IF5
ru
->
ifdevice
.
host_type
=
RAU_HOST
;
ru
->
ifdevice
.
eth_params
=
&
ru
->
eth_params
;
ru
->
ifdevice
.
configure_rru
=
configure_ru
;
...
...
@@ -2174,7 +2174,7 @@ void set_function_spec_param(RU_t *ru)
ru
->
fh_north_asynch_in
=
NULL
;
ru
->
start_rf
=
NULL
;
// no local RF
ru
->
stop_rf
=
NULL
;
ru
->
start_if
=
start_if
;
// need to start if interface for IF4p5
ru
->
nr_start_if
=
nr_start_if
;
// need to start if interface for IF4p5
ru
->
ifdevice
.
host_type
=
RAU_HOST
;
ru
->
ifdevice
.
eth_params
=
&
ru
->
eth_params
;
ru
->
ifdevice
.
configure_rru
=
configure_ru
;
...
...
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