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
lizhongxiao
OpenXG-RAN
Commits
b1d07fb3
Commit
b1d07fb3
authored
Jun 04, 2022
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
print_meas_log(): do not write beyond memory end
parent
bea2ec5c
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
98 additions
and
66 deletions
+98
-66
common/utils/time_meas.c
common/utils/time_meas.c
+43
-22
common/utils/time_meas.h
common/utils/time_meas.h
+6
-1
executables/nr-gnb.c
executables/nr-gnb.c
+23
-19
executables/nr-ue.c
executables/nr-ue.c
+17
-16
openair2/LAYER2/NR_MAC_gNB/main.c
openair2/LAYER2/NR_MAC_gNB/main.c
+9
-8
No files found.
common/utils/time_meas.c
View file @
b1d07fb3
...
...
@@ -111,13 +111,15 @@ void print_meas(time_stats_t *ts,
}
}
int
print_meas_log
(
time_stats_t
*
ts
,
const
char
*
name
,
time_stats_t
*
total_exec_time
,
time_stats_t
*
sf_exec_time
,
char
*
output
)
size_t
print_meas_log
(
time_stats_t
*
ts
,
const
char
*
name
,
time_stats_t
*
total_exec_time
,
time_stats_t
*
sf_exec_time
,
char
*
output
,
size_t
outputlen
)
{
int
stroff
=
0
;
const
char
*
begin
=
output
;
const
char
*
end
=
output
+
outputlen
;
static
int
first_time
=
0
;
static
double
cpu_freq_GHz
=
0
.
0
;
...
...
@@ -128,30 +130,49 @@ int print_meas_log(time_stats_t *ts,
first_time
=
1
;
if
((
total_exec_time
==
NULL
)
||
(
sf_exec_time
==
NULL
))
stroff
+=
sprintf
(
output
,
"%25s %25s %25s %25s %25s %6f
\n
"
,
"Name"
,
"Total"
,
"Per Trials"
,
"Num Trials"
,
"CPU_F_GHz"
,
cpu_freq_GHz
);
output
+=
snprintf
(
output
,
end
-
output
,
"%25s %25s %25s %25s %25s %6f
\n
"
,
"Name"
,
"Total"
,
"Per Trials"
,
"Num Trials"
,
"CPU_F_GHz"
,
cpu_freq_GHz
);
else
stroff
+=
sprintf
(
output
+
stroff
,
"%25s %25s %25s %20s %15s %6f
\n
"
,
"Name"
,
"Total"
,
"Average/Frame"
,
"Trials"
,
"CPU_F_GHz"
,
cpu_freq_GHz
);
output
+=
snprintf
(
output
,
end
-
output
,
"%25s %25s %25s %20s %15s %6f
\n
"
,
"Name"
,
"Total"
,
"Average/Frame"
,
"Trials"
,
"CPU_F_GHz"
,
cpu_freq_GHz
);
}
if
(
ts
->
trials
>
0
)
{
//printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials);
if
((
total_exec_time
==
NULL
)
||
(
sf_exec_time
==
NULL
))
{
stroff
+=
sprintf
(
output
+
stroff
,
"%25s: %15.3f us; %15d; %15.3f us;
\n
"
,
name
,
(
ts
->
diff
/
ts
->
trials
/
cpu_freq_GHz
/
1000
.
0
),
ts
->
trials
,
ts
->
max
/
cpu_freq_GHz
/
1000
.
0
);
output
+=
snprintf
(
output
,
end
-
output
,
"%25s: %15.3f us; %15d; %15.3f us;
\n
"
,
name
,
ts
->
diff
/
ts
->
trials
/
cpu_freq_GHz
/
1000
.
0
,
ts
->
trials
,
ts
->
max
/
cpu_freq_GHz
/
1000
.
0
);
}
else
{
stroff
+=
sprintf
(
output
+
stroff
,
"%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;
\n
"
,
name
,
(
ts
->
diff
/
cpu_freq_GHz
/
1000000
.
0
),
((
ts
->
diff
/
cpu_freq_GHz
/
1000000
.
0
)
/
(
total_exec_time
->
diff
/
cpu_freq_GHz
/
1000000
.
0
))
*
100
,
// percentage
(
ts
->
diff
/
ts
->
trials
/
cpu_freq_GHz
/
1000
.
0
),
((
ts
->
diff
/
ts
->
trials
/
cpu_freq_GHz
/
1000
.
0
)
/
(
sf_exec_time
->
diff
/
sf_exec_time
->
trials
/
cpu_freq_GHz
/
1000
.
0
))
*
100
,
// percentage
ts
->
trials
);
output
+=
snprintf
(
output
,
end
-
output
,
"%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;
\n
"
,
name
,
ts
->
diff
/
cpu_freq_GHz
/
1000000
.
0
,
((
ts
->
diff
/
cpu_freq_GHz
/
1000000
.
0
)
/
(
total_exec_time
->
diff
/
cpu_freq_GHz
/
1000000
.
0
))
*
100
,
// percentage
ts
->
diff
/
ts
->
trials
/
cpu_freq_GHz
/
1000
.
0
,
((
ts
->
diff
/
ts
->
trials
/
cpu_freq_GHz
/
1000
.
0
)
/
(
sf_exec_time
->
diff
/
sf_exec_time
->
trials
/
cpu_freq_GHz
/
1000
.
0
))
*
100
,
// percentage
ts
->
trials
);
}
}
return
stroff
;
return
output
-
begin
;
}
double
get_time_meas_us
(
time_stats_t
*
ts
)
...
...
common/utils/time_meas.h
View file @
b1d07fb3
...
...
@@ -83,7 +83,12 @@ static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline));
void
print_meas_now
(
time_stats_t
*
ts
,
const
char
*
name
,
FILE
*
file_name
);
void
print_meas
(
time_stats_t
*
ts
,
const
char
*
name
,
time_stats_t
*
total_exec_time
,
time_stats_t
*
sf_exec_time
);
int
print_meas_log
(
time_stats_t
*
ts
,
const
char
*
name
,
time_stats_t
*
total_exec_time
,
time_stats_t
*
sf_exec_time
,
char
*
output
);
size_t
print_meas_log
(
time_stats_t
*
ts
,
const
char
*
name
,
time_stats_t
*
total_exec_time
,
time_stats_t
*
sf_exec_time
,
char
*
output
,
size_t
outputlen
);
double
get_time_meas_us
(
time_stats_t
*
ts
);
double
get_cpu_freq_GHz
(
void
);
...
...
executables/nr-gnb.c
View file @
b1d07fb3
...
...
@@ -304,32 +304,36 @@ void rx_func(void *param) {
);
#endif
}
static
void
dump_L1_meas_stats
(
PHY_VARS_gNB
*
gNB
,
RU_t
*
ru
,
char
*
output
)
{
int
stroff
=
0
;
stroff
+=
print_meas_log
(
&
gNB
->
phy_proc_tx
,
"L1 Tx processing"
,
NULL
,
NULL
,
output
);
stroff
+=
print_meas_log
(
&
gNB
->
dlsch_encoding_stats
,
"DLSCH encoding"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
gNB
->
phy_proc_rx
,
"L1 Rx processing"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
gNB
->
ul_indication_stats
,
"UL Indication"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
gNB
->
rx_pusch_stats
,
"PUSCH inner-receiver"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
gNB
->
ulsch_decoding_stats
,
"PUSCH decoding"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
gNB
->
schedule_response_stats
,
"Schedule Response"
,
NULL
,
NULL
,
output
+
stroff
);
if
(
ru
->
feprx
)
stroff
+=
print_meas_log
(
&
ru
->
ofdm_demod_stats
,
"feprx"
,
NULL
,
NULL
,
output
+
stroff
);
static
size_t
dump_L1_meas_stats
(
PHY_VARS_gNB
*
gNB
,
RU_t
*
ru
,
char
*
output
,
size_t
outputlen
)
{
const
char
*
begin
=
output
;
const
char
*
end
=
output
+
outputlen
;
output
+=
print_meas_log
(
&
gNB
->
phy_proc_tx
,
"L1 Tx processing"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
gNB
->
dlsch_encoding_stats
,
"DLSCH encoding"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
gNB
->
phy_proc_rx
,
"L1 Rx processing"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
gNB
->
ul_indication_stats
,
"UL Indication"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
gNB
->
rx_pusch_stats
,
"PUSCH inner-receiver"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
gNB
->
ulsch_decoding_stats
,
"PUSCH decoding"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
gNB
->
schedule_response_stats
,
"Schedule Response"
,
NULL
,
NULL
,
output
,
end
-
output
);
if
(
ru
->
feprx
)
output
+=
print_meas_log
(
&
ru
->
ofdm_demod_stats
,
"feprx"
,
NULL
,
NULL
,
output
,
end
-
output
);
if
(
ru
->
feptx_ofdm
)
{
stroff
+=
print_meas_log
(
&
ru
->
precoding_stats
,
"feptx_prec"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ru
->
txdataF_copy_stats
,
"txdataF_copy"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ru
->
ofdm_mod_stats
,
"feptx_ofdm"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ru
->
ofdm_total_stats
,
"feptx_total"
,
NULL
,
NULL
,
output
+
stroff
);
output
+=
print_meas_log
(
&
ru
->
precoding_stats
,
"feptx_prec"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ru
->
txdataF_copy_stats
,
"txdataF_copy"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ru
->
ofdm_mod_stats
,
"feptx_ofdm"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ru
->
ofdm_total_stats
,
"feptx_total"
,
NULL
,
NULL
,
output
,
end
-
output
);
}
if
(
ru
->
fh_north_asynch_in
)
stroff
+=
print_meas_log
(
&
ru
->
rx_fhaul
,
"rx_fhaul"
,
NULL
,
NULL
,
output
+
stroff
);
if
(
ru
->
fh_north_asynch_in
)
output
+=
print_meas_log
(
&
ru
->
rx_fhaul
,
"rx_fhaul"
,
NULL
,
NULL
,
output
,
end
-
output
);
stroff
+=
print_meas_log
(
&
ru
->
tx_fhaul
,
"tx_fhaul"
,
NULL
,
NULL
,
output
+
stroff
);
output
+=
print_meas_log
(
&
ru
->
tx_fhaul
,
"tx_fhaul"
,
NULL
,
NULL
,
output
,
end
-
output
);
if
(
ru
->
fh_north_out
)
{
stroff
+=
print_meas_log
(
&
ru
->
compression
,
"compression"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ru
->
transport
,
"transport"
,
NULL
,
NULL
,
output
+
stroff
);
output
+=
print_meas_log
(
&
ru
->
compression
,
"compression"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ru
->
transport
,
"transport"
,
NULL
,
NULL
,
output
,
end
-
output
);
}
return
output
-
begin
;
}
void
*
nrL1_stats_thread
(
void
*
param
)
{
...
...
@@ -355,7 +359,7 @@ void *nrL1_stats_thread(void *param) {
dump_nr_I0_stats
(
fd
,
gNB
);
dump_pdsch_stats
(
fd
,
gNB
);
dump_pusch_stats
(
fd
,
gNB
);
dump_L1_meas_stats
(
gNB
,
ru
,
output
);
dump_L1_meas_stats
(
gNB
,
ru
,
output
,
L1STATSSTRLEN
);
fprintf
(
fd
,
"%s
\n
"
,
output
);
fflush
(
fd
);
fseek
(
fd
,
0
,
SEEK_SET
);
...
...
executables/nr-ue.c
View file @
b1d07fb3
...
...
@@ -106,23 +106,24 @@ queue_t nr_rach_ind_queue;
static
void
*
NRUE_phy_stub_standalone_pnf_task
(
void
*
arg
);
static
int
dump_L1_UE_meas_stats
(
PHY_VARS_NR_UE
*
ue
,
char
*
output
,
in
t
max_len
)
static
size_t
dump_L1_UE_meas_stats
(
PHY_VARS_NR_UE
*
ue
,
char
*
output
,
size_
t
max_len
)
{
int
stroff
=
0
;
stroff
+=
print_meas_log
(
&
ue
->
phy_proc_tx
,
"L1 TX processing"
,
NULL
,
NULL
,
output
);
stroff
+=
print_meas_log
(
&
ue
->
ulsch_encoding_stats
,
"ULSCH encoding"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
phy_proc_rx
[
0
],
"L1 RX processing t0"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
phy_proc_rx
[
1
],
"L1 RX processing t1"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
ue_ul_indication_stats
,
"UL Indication"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
rx_pdsch_stats
,
"PDSCH receiver"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
dlsch_decoding_stats
[
0
],
"PDSCH decoding t0"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
dlsch_decoding_stats
[
1
],
"PDSCH decoding t1"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
dlsch_deinterleaving_stats
,
" -> Deinterleive"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
dlsch_rate_unmatching_stats
,
" -> Rate Unmatch"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
dlsch_ldpc_decoding_stats
,
" -> LDPC Decode"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
dlsch_unscrambling_stats
,
"PDSCH unscrambling"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
ue
->
dlsch_rx_pdcch_stats
,
"PDCCH handling"
,
NULL
,
NULL
,
output
+
stroff
);
return
stroff
;
const
char
*
begin
=
output
;
const
char
*
end
=
output
+
max_len
;
output
+=
print_meas_log
(
&
ue
->
phy_proc_tx
,
"L1 TX processing"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
ulsch_encoding_stats
,
"ULSCH encoding"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
phy_proc_rx
[
0
],
"L1 RX processing t0"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
phy_proc_rx
[
1
],
"L1 RX processing t1"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
ue_ul_indication_stats
,
"UL Indication"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
rx_pdsch_stats
,
"PDSCH receiver"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
dlsch_decoding_stats
[
0
],
"PDSCH decoding t0"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
dlsch_decoding_stats
[
1
],
"PDSCH decoding t1"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
dlsch_deinterleaving_stats
,
" -> Deinterleive"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
dlsch_rate_unmatching_stats
,
" -> Rate Unmatch"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
dlsch_ldpc_decoding_stats
,
" -> LDPC Decode"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
dlsch_unscrambling_stats
,
"PDSCH unscrambling"
,
NULL
,
NULL
,
output
,
end
-
output
);
output
+=
print_meas_log
(
&
ue
->
dlsch_rx_pdcch_stats
,
"PDCCH handling"
,
NULL
,
NULL
,
output
,
end
-
output
);
return
output
-
begin
;
}
static
void
*
nrL1_UE_stats_thread
(
void
*
param
)
...
...
openair2/LAYER2/NR_MAC_gNB/main.c
View file @
b1d07fb3
...
...
@@ -52,18 +52,19 @@ void *nrmac_stats_thread(void *arg) {
gNB_MAC_INST
*
gNB
=
(
gNB_MAC_INST
*
)
arg
;
char
output
[
MACSTATSSTRLEN
]
=
{
0
};
const
char
*
end
=
output
+
MACSTATSSTRLEN
;
FILE
*
file
=
fopen
(
"nrMAC_stats.log"
,
"w"
);
AssertFatal
(
file
!=
NULL
,
"Cannot open nrMAC_stats.log, error %s
\n
"
,
strerror
(
errno
));
while
(
oai_exit
==
0
)
{
size_t
stroff
=
0
;
stroff
+=
dump_mac_stats
(
gNB
,
output
,
MACSTATSSTRLEN
,
false
);
stroff
+=
snprintf
(
output
+
stroff
,
MACSTATSSTRLEN
-
stroff
,
"
\n
"
);
stroff
+=
print_meas_log
(
&
gNB
->
eNB_scheduler
,
"DL & UL scheduling timing"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
gNB
->
schedule_dlsch
,
"dlsch scheduler"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
gNB
->
rlc_data_req
,
"rlc_data_req"
,
NULL
,
NULL
,
output
+
stroff
);
stroff
+=
print_meas_log
(
&
gNB
->
rlc_status_ind
,
"rlc_status_ind"
,
NULL
,
NULL
,
output
+
stroff
);
fwrite
(
output
,
stroff
,
1
,
file
);
char
*
p
=
output
;
p
+=
dump_mac_stats
(
gNB
,
p
,
end
-
p
,
false
);
p
+=
snprintf
(
p
,
end
-
p
,
"
\n
"
);
p
+=
print_meas_log
(
&
gNB
->
eNB_scheduler
,
"DL & UL scheduling timing"
,
NULL
,
NULL
,
p
,
end
-
p
);
p
+=
print_meas_log
(
&
gNB
->
schedule_dlsch
,
"dlsch scheduler"
,
NULL
,
NULL
,
p
,
end
-
p
);
p
+=
print_meas_log
(
&
gNB
->
rlc_data_req
,
"rlc_data_req"
,
NULL
,
NULL
,
p
,
end
-
p
);
p
+=
print_meas_log
(
&
gNB
->
rlc_status_ind
,
"rlc_status_ind"
,
NULL
,
NULL
,
p
,
end
-
p
);
fwrite
(
output
,
p
-
output
,
1
,
file
);
fflush
(
file
);
sleep
(
1
);
fseek
(
file
,
0
,
SEEK_SET
);
...
...
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