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
5bef665b
Commit
5bef665b
authored
Sep 22, 2022
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/fix-lte-mbms' into integration_2022_wk38
parents
e2d9bfcb
28224159
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
104 additions
and
216 deletions
+104
-216
common/utils/telnetsrv/telnetsrv_cpumeasur_def.h
common/utils/telnetsrv/telnetsrv_cpumeasur_def.h
+0
-5
openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+33
-64
openair1/PHY/LTE_TRANSPORT/transport_proto.h
openair1/PHY/LTE_TRANSPORT/transport_proto.h
+0
-37
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+1
-6
openair1/PHY/defs_eNB.h
openair1/PHY/defs_eNB.h
+1
-8
openair1/SCHED/phy_procedures_lte_eNb.c
openair1/SCHED/phy_procedures_lte_eNb.c
+1
-25
openair1/SIMULATION/LTE_PHY/dlsim.c
openair1/SIMULATION/LTE_PHY/dlsim.c
+1
-3
openair1/SIMULATION/LTE_PHY/ulsim.c
openair1/SIMULATION/LTE_PHY/ulsim.c
+2
-4
openair2/LAYER2/MAC/eNB_scheduler_mch.c
openair2/LAYER2/MAC/eNB_scheduler_mch.c
+62
-51
targets/RT/USER/lte-enb.c
targets/RT/USER/lte-enb.c
+0
-6
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+3
-7
No files found.
common/utils/telnetsrv/telnetsrv_cpumeasur_def.h
View file @
5bef665b
...
...
@@ -50,11 +50,6 @@
{"dlsch_turbo_encod_prep", &(phyvars->dlsch_turbo_encoding_preperation_stats),0,1},\
{"dlsch_turbo_encod_segm", &(phyvars->dlsch_turbo_encoding_segmentation_stats),0,1},\
{"dlsch_turbo_encod", &(phyvars->dlsch_turbo_encoding_stats),0,1},\
{"dlsch_turbo_encod_waiting", &(phyvars->dlsch_turbo_encoding_waiting_stats),0,1},\
{"dlsch_turbo_encod_signal", &(phyvars->dlsch_turbo_encoding_signal_stats),0,1},\
{"dlsch_turbo_encod_main", &(phyvars->dlsch_turbo_encoding_main_stats),0,1},\
{"dlsch_turbo_encod_wakeup0", &(phyvars->dlsch_turbo_encoding_wakeup_stats0),0,1},\
{"dlsch_turbo_encod_wakeup1", &(phyvars->dlsch_turbo_encoding_wakeup_stats1),0,1},\
{"dlsch_interleaving", &(phyvars->dlsch_interleaving_stats),0,1},\
{"rx_dft", &(phyvars->rx_dft_stats),0,1},\
{"ulsch_channel_estimation", &(phyvars->ulsch_channel_estimation_stats),0,1},\
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
View file @
5bef665b
...
...
@@ -245,43 +245,6 @@ void *te_thread(void *param) {
return
(
NULL
);
}
int
dlsch_encoding_all
(
PHY_VARS_eNB
*
eNB
,
L1_rxtx_proc_t
*
proc
,
unsigned
char
*
a
,
uint8_t
num_pdcch_symbols
,
LTE_eNB_DLSCH_t
*
dlsch
,
int
frame
,
uint8_t
subframe
,
time_stats_t
*
rm_stats
,
time_stats_t
*
te_stats
,
time_stats_t
*
te_wait_stats
,
time_stats_t
*
te_main_stats
,
time_stats_t
*
te_wakeup_stats0
,
time_stats_t
*
te_wakeup_stats1
,
time_stats_t
*
i_stats
)
{
uint8_t
harq_pid
=
dlsch
->
harq_ids
[
frame
%
2
][
subframe
];
if
(
harq_pid
>=
dlsch
->
Mdlharq
)
{
LOG_E
(
PHY
,
"dlsch_encoding_all illegal harq_pid %d
\n
"
,
harq_pid
);
return
(
-
1
);
}
LOG_D
(
PHY
,
"B %d, harq_pid %d
\n
"
,
dlsch
->
harq_processes
[
harq_pid
]
->
B
,
dlsch
->
harq_ids
[
frame
%
2
][
subframe
]);
return
dlsch_encoding
(
eNB
,
proc
,
a
,
num_pdcch_symbols
,
dlsch
,
frame
,
subframe
,
rm_stats
,
te_stats
,
i_stats
);
}
static
void
TPencode
(
void
*
arg
)
{
turboEncode_t
*
rdata
=
(
turboEncode_t
*
)
arg
;
unsigned
char
harq_pid
=
rdata
->
harq_pid
;
...
...
@@ -358,8 +321,7 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
num_pdcch_symbols
,
frame
,
subframe
,
beamforming_mode
);
proc
->
nbEncode
=
0
;
int
nbEncode
=
0
;
// if (hadlsch->Ndi == 1) { // this is a new packet
if
(
hadlsch
->
round
==
0
)
{
// this is a new packet
...
...
@@ -386,11 +348,13 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
&
hadlsch
->
F
)
<
0
)
return
(
-
1
);
}
notifiedFIFO_t
respEncode
;
initNotifiedFIFO
(
&
respEncode
);
for
(
int
r
=
0
,
r_offset
=
0
;
r
<
hadlsch
->
C
;
r
++
)
{
union
turboReqUnion
id
=
{.
s
=
{
dlsch
->
rnti
,
frame
,
subframe
,
r
,
0
}};
notifiedFIFO_elt_t
*
req
=
newNotifiedFIFO_elt
(
sizeof
(
turboEncode_t
),
id
.
p
,
proc
->
respEncode
,
TPencode
);
notifiedFIFO_elt_t
*
req
=
newNotifiedFIFO_elt
(
sizeof
(
turboEncode_t
),
id
.
p
,
&
respEncode
,
TPencode
);
turboEncode_t
*
rdata
=
(
turboEncode_t
*
)
NotifiedFifoData
(
req
);
rdata
->
input
=
hadlsch
->
c
[
r
];
rdata
->
Kr_bytes
=
(
r
<
hadlsch
->
Cminus
?
hadlsch
->
Kminus
:
hadlsch
->
Kplus
)
>>
3
;
...
...
@@ -404,15 +368,10 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
rdata
->
round
=
hadlsch
->
round
;
rdata
->
r_offset
=
r_offset
;
rdata
->
G
=
G
;
if
(
proc
->
threadPool
->
activated
)
{
pushTpool
(
proc
->
threadPool
,
req
);
proc
->
nbEncode
++
;
}
else
{
TPencode
(
rdata
);
delNotifiedFIFO_elt
(
req
);
}
pushTpool
(
proc
->
threadPool
,
req
);
nbEncode
++
;
int
Qm
=
hadlsch
->
Qm
;
int
C
=
hadlsch
->
C
;
int
Nl
=
hadlsch
->
Nl
;
...
...
@@ -423,6 +382,14 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
else
r_offset
+=
Nl
*
Qm
*
((
GpmodC
==
0
?
0
:
1
)
+
(
Gp
/
C
));
}
// Wait all other threads finish to process
while
(
nbEncode
)
{
notifiedFIFO_elt_t
*
res
=
pullTpool
(
&
respEncode
,
proc
->
threadPool
);
if
(
res
==
NULL
)
break
;
// Tpool has been stopped
delNotifiedFIFO_elt
(
res
);
nbEncode
--
;
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING
,
VCD_FUNCTION_OUT
);
return
(
0
);
}
...
...
@@ -462,8 +429,6 @@ int dlsch_encoding_fembms_pmch(PHY_VARS_eNB *eNB,
num_pdcch_symbols
,
frame
,
subframe
,
beamforming_mode
);
proc
->
nbEncode
=
0
;
// if (hadlsch->Ndi == 1) { // this is a new packet
if
(
hadlsch
->
round
==
0
)
{
// this is a new packet
// Add 24-bit crc (polynomial A) to payload
...
...
@@ -489,11 +454,13 @@ int dlsch_encoding_fembms_pmch(PHY_VARS_eNB *eNB,
&
hadlsch
->
F
)
<
0
)
return
(
-
1
);
}
int
nbEncode
=
0
;
notifiedFIFO_t
respEncode
;
initNotifiedFIFO
(
&
respEncode
);
for
(
int
r
=
0
,
r_offset
=
0
;
r
<
hadlsch
->
C
;
r
++
)
{
union
turboReqUnion
id
=
{.
s
=
{
dlsch
->
rnti
,
frame
,
subframe
,
r
,
0
}};
notifiedFIFO_elt_t
*
req
=
newNotifiedFIFO_elt
(
sizeof
(
turboEncode_t
),
id
.
p
,
proc
->
respEncode
,
TPencode
);
notifiedFIFO_elt_t
*
req
=
newNotifiedFIFO_elt
(
sizeof
(
turboEncode_t
),
id
.
p
,
&
respEncode
,
TPencode
);
turboEncode_t
*
rdata
=
(
turboEncode_t
*
)
NotifiedFifoData
(
req
);
rdata
->
input
=
hadlsch
->
c
[
r
];
rdata
->
Kr_bytes
=
(
r
<
hadlsch
->
Cminus
?
hadlsch
->
Kminus
:
hadlsch
->
Kplus
)
>>
3
;
...
...
@@ -507,15 +474,10 @@ int dlsch_encoding_fembms_pmch(PHY_VARS_eNB *eNB,
rdata
->
round
=
hadlsch
->
round
;
rdata
->
r_offset
=
r_offset
;
rdata
->
G
=
G
;
if
(
proc
->
threadPool
->
activated
)
{
pushTpool
(
proc
->
threadPool
,
req
);
proc
->
nbEncode
++
;
}
else
{
TPencode
(
rdata
);
delNotifiedFIFO_elt
(
req
);
}
pushTpool
(
proc
->
threadPool
,
req
);
nbEncode
++
;
int
Qm
=
hadlsch
->
Qm
;
int
C
=
hadlsch
->
C
;
int
Nl
=
hadlsch
->
Nl
;
...
...
@@ -526,7 +488,14 @@ int dlsch_encoding_fembms_pmch(PHY_VARS_eNB *eNB,
else
r_offset
+=
Nl
*
Qm
*
((
GpmodC
==
0
?
0
:
1
)
+
(
Gp
/
C
));
}
// Wait all other threads finish to process
while
(
nbEncode
)
{
notifiedFIFO_elt_t
*
res
=
pullTpool
(
&
respEncode
,
proc
->
threadPool
);
if
(
res
==
NULL
)
break
;
// Tpool has been stopped
delNotifiedFIFO_elt
(
res
);
nbEncode
--
;
}
return
(
0
);
}
...
...
openair1/PHY/LTE_TRANSPORT/transport_proto.h
View file @
5bef665b
...
...
@@ -72,21 +72,6 @@ void free_eNB_ulsch(LTE_eNB_ULSCH_t *ulsch);
LTE_eNB_ULSCH_t
*
new_eNB_ulsch
(
uint8_t
max_turbo_iterations
,
uint8_t
N_RB_UL
,
uint8_t
abstraction_flag
);
int
dlsch_encoding_all
(
PHY_VARS_eNB
*
eNB
,
L1_rxtx_proc_t
*
proc
,
unsigned
char
*
a
,
uint8_t
num_pdcch_symbols
,
LTE_eNB_DLSCH_t
*
dlsch
,
int
frame
,
uint8_t
subframe
,
time_stats_t
*
rm_stats
,
time_stats_t
*
te_stats
,
time_stats_t
*
te_wait_stats
,
time_stats_t
*
te_main_stats
,
time_stats_t
*
te_wakeup_stats0
,
time_stats_t
*
te_wakeup_stats1
,
time_stats_t
*
i_stats
);
/** \fn dlsch_encoding(PHY_VARS_eNB *eNB,
uint8_t *input_buffer,
LTE_DL_FRAME_PARMS *frame_parms,
...
...
@@ -543,15 +528,6 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
L1_rxtx_proc_t
*
proc
,
uint8_t
UE_id
);
int
ulsch_decoding_data_all
(
PHY_VARS_eNB
*
eNB
,
L1_rxtx_proc_t
*
proc
,
int
UE_id
,
int
harq_pid
,
int
llr8_flag
);
/*!
\brief Decoding of PUSCH/ACK/RI/ACK from 36-212.
@param phy_vars_eNB Pointer to eNB top-level descriptor
...
...
@@ -570,19 +546,6 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
uint8_t
Nbundled
,
uint8_t
llr8_flag
);
/*!
\brief Decoding of ULSCH data component from 36-212. This one spawns 1 worker thread in parallel,half of the segments in each thread.
@param phy_vars_eNB Pointer to eNB top-level descriptor
@param UE_id ID of UE transmitting this PUSCH
@param harq_pid HARQ process ID
@param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used
@returns 0 on success
*/
int
ulsch_decoding_data_2thread
(
PHY_VARS_eNB
*
eNB
,
int
UE_id
,
int
harq_pid
,
int
llr8_flag
);
/*!
\brief Decoding of ULSCH data component from 36-212. This one is single thread.
@param phy_vars_eNB Pointer to eNB top-level descriptor
...
...
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
View file @
5bef665b
...
...
@@ -367,11 +367,6 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc,
return
(
ret
);
}
int
ulsch_decoding_data_all
(
PHY_VARS_eNB
*
eNB
,
L1_rxtx_proc_t
*
proc
,
int
UE_id
,
int
harq_pid
,
int
llr8_flag
)
{
return
ulsch_decoding_data
(
eNB
,
proc
,
UE_id
,
harq_pid
,
llr8_flag
);
}
static
inline
unsigned
int
lte_gold_unscram
(
unsigned
int
*
x1
,
unsigned
int
*
x2
,
unsigned
char
reset
)
__attribute__
((
always_inline
));
static
inline
unsigned
int
lte_gold_unscram
(
unsigned
int
*
x1
,
unsigned
int
*
x2
,
unsigned
char
reset
)
{
int
n
;
...
...
@@ -1116,7 +1111,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
LOG_D
(
PHY
,
"frame %d subframe %d O_ACK:%d o_ACK[]=%d:%d:%d:%d
\n
"
,
frame
,
subframe
,
ulsch_harq
->
O_ACK
,
ulsch_harq
->
o_ACK
[
0
],
ulsch_harq
->
o_ACK
[
1
],
ulsch_harq
->
o_ACK
[
2
],
ulsch_harq
->
o_ACK
[
3
]);
// Do ULSCH Decoding for data portion
ret
=
ulsch_decoding_data
_all
(
eNB
,
proc
,
UE_id
,
harq_pid
,
llr8_flag
);
ret
=
ulsch_decoding_data
(
eNB
,
proc
,
UE_id
,
harq_pid
,
llr8_flag
);
return
(
ret
);
}
...
...
openair1/PHY/defs_eNB.h
View file @
5bef665b
...
...
@@ -253,11 +253,9 @@ typedef struct {
/// mutex for RXn-TXnp4 processing thread
pthread_mutex_t
mutex_RUs
;
tpool_t
*
threadPool
;
int
nbEncode
;
int
nbDecode
;
notifiedFIFO_t
*
respEncode
;
notifiedFIFO_t
*
respDecode
;
pthread_mutex_t
mutex_emulateRF
;
pthread_mutex_t
mutex_emulateRF
;
int
instance_cnt_emulateRF
;
pthread_t
pthread_emulateRF
;
pthread_attr_t
attr_emulateRF
;
...
...
@@ -731,11 +729,6 @@ typedef struct PHY_VARS_eNB_s {
time_stats_t
dlsch_turbo_encoding_preperation_stats
;
time_stats_t
dlsch_turbo_encoding_segmentation_stats
;
time_stats_t
dlsch_turbo_encoding_stats
;
time_stats_t
dlsch_turbo_encoding_waiting_stats
;
time_stats_t
dlsch_turbo_encoding_signal_stats
;
time_stats_t
dlsch_turbo_encoding_main_stats
;
time_stats_t
dlsch_turbo_encoding_wakeup_stats0
;
time_stats_t
dlsch_turbo_encoding_wakeup_stats1
;
time_stats_t
dlsch_interleaving_stats
;
time_stats_t
rx_dft_stats
;
...
...
openair1/SCHED/phy_procedures_lte_eNb.c
View file @
5bef665b
...
...
@@ -413,33 +413,9 @@ bool dlsch_procedures(PHY_VARS_eNB *eNB,
}
start_meas
(
&
eNB
->
dlsch_encoding_stats
);
dlsch_encoding_all
(
eNB
,
proc
,
dlsch_harq
->
pdu
,
dlsch_harq
->
pdsch_start
,
dlsch
,
frame
,
subframe
,
&
eNB
->
dlsch_rate_matching_stats
,
&
eNB
->
dlsch_turbo_encoding_stats
,
&
eNB
->
dlsch_turbo_encoding_waiting_stats
,
&
eNB
->
dlsch_turbo_encoding_main_stats
,
&
eNB
->
dlsch_turbo_encoding_wakeup_stats0
,
&
eNB
->
dlsch_turbo_encoding_wakeup_stats1
,
&
eNB
->
dlsch_interleaving_stats
);
dlsch_encoding
(
eNB
,
proc
,
dlsch_harq
->
pdu
,
dlsch_harq
->
pdsch_start
,
dlsch
,
frame
,
subframe
,
&
eNB
->
dlsch_rate_matching_stats
,
&
eNB
->
dlsch_turbo_encoding_stats
,
&
eNB
->
dlsch_interleaving_stats
);
stop_meas
(
&
eNB
->
dlsch_encoding_stats
);
if
(
proc
->
threadPool
->
activated
)
{
// Wait all other threads finish to process
while
(
proc
->
nbEncode
)
{
notifiedFIFO_elt_t
*
res
=
pullTpool
(
proc
->
respEncode
,
proc
->
threadPool
);
if
(
res
==
NULL
)
break
;
// Tpool has been stopped
delNotifiedFIFO_elt
(
res
);
proc
->
nbEncode
--
;
}
}
if
(
eNB
->
dlsch_encoding_stats
.
p_time
>
500
*
3000
&&
opp_enabled
==
1
)
{
print_meas_now
(
&
eNB
->
dlsch_encoding_stats
,
"total coding"
,
stderr
);
}
...
...
openair1/SIMULATION/LTE_PHY/dlsim.c
View file @
5bef665b
...
...
@@ -1306,11 +1306,9 @@ int main(int argc, char **argv) {
}
L1_rxtx_proc_t
*
proc_eNB
=
&
eNB
->
proc
.
L1_proc
;
proc_eNB
->
threadPool
=
(
tpool_t
*
)
malloc
(
sizeof
(
tpool_t
));
proc_eNB
->
respEncode
=
(
notifiedFIFO_t
*
)
malloc
(
sizeof
(
notifiedFIFO_t
));
proc_eNB
->
threadPool
=
(
tpool_t
*
)
malloc
(
sizeof
(
tpool_t
));
proc_eNB
->
respDecode
=
(
notifiedFIFO_t
*
)
malloc
(
sizeof
(
notifiedFIFO_t
));
initTpool
(
"n"
,
proc_eNB
->
threadPool
,
true
);
initNotifiedFIFO
(
proc_eNB
->
respEncode
);
initNotifiedFIFO
(
proc_eNB
->
respDecode
);
proc_eNB
->
frame_tx
=
0
;
...
...
openair1/SIMULATION/LTE_PHY/ulsim.c
View file @
5bef665b
...
...
@@ -814,11 +814,9 @@ int main(int argc, char **argv) {
proc_rxtx_ue
->
frame_rx
=
(
subframe
<
4
)
?
(
proc_rxtx
->
frame_tx
-
1
)
:
(
proc_rxtx
->
frame_tx
);
proc_rxtx_ue
->
subframe_tx
=
proc_rxtx
->
subframe_rx
;
proc_rxtx_ue
->
subframe_rx
=
(
proc_rxtx
->
subframe_tx
+
6
)
%
10
;
proc_rxtx
->
threadPool
=
(
tpool_t
*
)
malloc
(
sizeof
(
tpool_t
));
proc_rxtx
->
respEncode
=
(
notifiedFIFO_t
*
)
malloc
(
sizeof
(
notifiedFIFO_t
));
proc_rxtx
->
threadPool
=
(
tpool_t
*
)
malloc
(
sizeof
(
tpool_t
));
proc_rxtx
->
respDecode
=
(
notifiedFIFO_t
*
)
malloc
(
sizeof
(
notifiedFIFO_t
));
initTpool
(
"n"
,
proc_rxtx
->
threadPool
,
true
);
initNotifiedFIFO
(
proc_rxtx
->
respEncode
);
initTpool
(
"n"
,
proc_rxtx
->
threadPool
,
true
);
initNotifiedFIFO
(
proc_rxtx
->
respDecode
);
printf
(
"Init UL hopping UE
\n
"
);
...
...
openair2/LAYER2/MAC/eNB_scheduler_mch.c
View file @
5bef665b
...
...
@@ -708,12 +708,12 @@ schedule_MBMS_NFAPI(module_id_t module_idP, uint8_t CC_id, frame_t frameP,
uint16_t
msi_control_element
[
29
],
*
msi_ptr
;
// MSI buffer pointer
char
*
buffer_pointer
=
NULL
;
if
(
msi_flag
==
1
)
{
// Create MSI here
msi_ptr
=
&
msi_control_element
[
0
];
if
(
msi_flag
==
1
&&
cc
->
mbms_SessionList
)
{
// Create MSI here
msi_ptr
=
&
msi_control_element
[
0
];
//
Header for MTCHs
num_mtch
=
cc
->
mbms_SessionList
[
mbms_mch_i
]
->
list
.
count
;
//
Header for MTCHs
num_mtch
=
cc
->
mbms_SessionList
[
mbms_mch_i
]
->
list
.
count
;
TBS
=
get_TBS_DL
(
cc
->
MCH_pdu
.
mcs
,
to_prb
(
cc
->
mib
->
message
.
dl_Bandwidth
));
...
...
@@ -867,52 +867,63 @@ schedule_MBMS_NFAPI(module_id_t module_idP, uint8_t CC_id, frame_t frameP,
//if ((i == 0) && ((RC.mac[module_idP]->MBMS_flag != multicast_relay) || (RC.mac[module_idP]->mcch_active==0))) {
// there is MTCHs, loop if there are more than 1
if
(
mtch_flag
==
1
)
{
// Calculate TBS
// get MTCH data from RLC (like for DTCH)
LOG_D
(
MAC
,
"[eNB %d] CC_id %d Frame %d subframeP %d: Schedule MTCH (area %d, sfAlloc %d)
\n
"
,
module_idP
,
CC_id
,
frameP
,
subframeP
,
i
,
j
);
header_len_mtch
=
3
;
LOG_D
(
MAC
,
"[eNB %d], CC_id %d, Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)
\n
"
,
module_idP
,
CC_id
,
frameP
,
MTCH
,
TBS
,
TBS
-
header_len_mcch
-
header_len_msi
-
sdu_length_total
-
header_len_mtch
);
//TODO
mbms_rab_id
=
cc
->
mbms_SessionList
[
0
/*mbms_mch_i*/
]
->
list
.
array
[
0
]
->
logicalChannelIdentity_r9
;
rlc_status
=
mac_rlc_status_ind
(
module_idP
,
0xfffd
,
frameP
,
subframeP
,
module_idP
,
ENB_FLAG_YES
,
MBMS_FLAG_YES
,
cc
->
mbms_SessionList
[
mbms_mch_i
]
->
list
.
array
[
0
]
->
logicalChannelIdentity_r9
,
//MTCH,
0
,
0
);
bytes_in_buffer
=
rlc_status
.
bytes_in_buffer
;
//TOCHECK is this really neede?
if
(
!
(
mcch_flag
==
1
||
msi_flag
==
1
)
)
msi_sfs
=
rlc_status
.
bytes_in_buffer
/
(
TBS
-
header_len_mcch
-
header_len_msi
-
sdu_length_total
-
header_len_mtch
)
+
(
rlc_status
.
bytes_in_buffer
%
(
TBS
-
header_len_mcch
-
header_len_msi
-
sdu_length_total
-
header_len_mtch
)
?
1
:
0
);
uint16_t
TBS_MTCH
=
get_TBS_DL
(
cc
->
pmch_Config
[
mbms_mch_i
]
->
dataMCS_r9
,
to_prb
(
cc
->
mib
->
message
.
dl_Bandwidth
));
if
(
msi_flag
==
1
&&
buffer_pointer
!=
NULL
){
// msi_ptr = &msi_control_element[0];
msi_pmch_stop
=
(
rlc_status
.
bytes_in_buffer
-
header_len_mcch
-
header_len_msi
-
sdu_length_total
-
header_len_mtch
)
/
(
TBS_MTCH
/*- header_len_mcch - header_len_msi -sdu_length_total*/
-
header_len_mtch
)
+
((
rlc_status
.
bytes_in_buffer
-
TBS
-
header_len_mcch
-
header_len_msi
-
sdu_length_total
)
%
(
TBS_MTCH
/*- header_len_mcch - header_len_msi -sdu_length_total*/
-
header_len_mtch
)
?
0
:
0
);
for
(
k
=
0
;
k
<
num_mtch
;
k
++
)
{
// loop for all session in this MCH (MCH[0]) at this moment
msi_ptr
=
&
msi_control_element
[
k
];
((
MSI_ELEMENT
*
)
msi_ptr
)
->
lcid
=
cc
->
mbms_SessionList
[
mbms_mch_i
]
->
list
.
array
[
k
]
->
logicalChannelIdentity_r9
;
//mtch_lcid;
if
(
msi_pmch_stop
>
cc
->
pmch_Config
[
mbms_mch_i
]
->
sf_AllocEnd_r9
)
LOG_E
(
MAC
,
"e-MBMS Buffer Overflow
\n
"
);
if
(
msi_pmch_stop
>=
num_sf_alloc
/*&& msi_pmch_stop <=cc->pmch_Config[0]->sf_AllocEnd_r9*/
)
{
// BAd race condition: all this struct is filled by another thread, no mutex or any code to make it coherent
if
(
mtch_flag
==
1
&&
cc
->
mbms_SessionList
&&
cc
->
mbms_SessionList
[
0
]
&&
cc
->
mbms_SessionList
[
0
]
->
list
.
array
[
0
])
{
// Calculate TBS
// get MTCH data from RLC (like for DTCH)
LOG_D
(
MAC
,
"[eNB %d] CC_id %d Frame %d subframeP %d: Schedule MTCH (area %d, sfAlloc %d)
\n
"
,
module_idP
,
CC_id
,
frameP
,
subframeP
,
i
,
j
);
header_len_mtch
=
3
;
LOG_D
(
MAC
,
"[eNB %d], CC_id %d, Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)
\n
"
,
module_idP
,
CC_id
,
frameP
,
MTCH
,
TBS
,
TBS
-
header_len_mcch
-
header_len_msi
-
sdu_length_total
-
header_len_mtch
);
// TODO
mbms_rab_id
=
cc
->
mbms_SessionList
[
0
/*mbms_mch_i*/
]
->
list
.
array
[
0
]
->
logicalChannelIdentity_r9
;
rlc_status
=
mac_rlc_status_ind
(
module_idP
,
0xfffd
,
frameP
,
subframeP
,
module_idP
,
ENB_FLAG_YES
,
MBMS_FLAG_YES
,
cc
->
mbms_SessionList
[
mbms_mch_i
]
->
list
.
array
[
0
]
->
logicalChannelIdentity_r9
,
// MTCH,
0
,
0
);
bytes_in_buffer
=
rlc_status
.
bytes_in_buffer
;
// TOCHECK is this really neede?
if
(
!
(
mcch_flag
==
1
||
msi_flag
==
1
))
msi_sfs
=
rlc_status
.
bytes_in_buffer
/
(
TBS
-
header_len_mcch
-
header_len_msi
-
sdu_length_total
-
header_len_mtch
)
+
(
rlc_status
.
bytes_in_buffer
%
(
TBS
-
header_len_mcch
-
header_len_msi
-
sdu_length_total
-
header_len_mtch
)
?
1
:
0
);
uint16_t
TBS_MTCH
=
get_TBS_DL
(
cc
->
pmch_Config
[
mbms_mch_i
]
->
dataMCS_r9
,
to_prb
(
cc
->
mib
->
message
.
dl_Bandwidth
));
if
(
msi_flag
==
1
&&
buffer_pointer
!=
NULL
)
{
// msi_ptr = &msi_control_element[0];
msi_pmch_stop
=
(
rlc_status
.
bytes_in_buffer
-
header_len_mcch
-
header_len_msi
-
sdu_length_total
-
header_len_mtch
)
/
(
TBS_MTCH
/*- header_len_mcch - header_len_msi -sdu_length_total*/
-
header_len_mtch
)
+
((
rlc_status
.
bytes_in_buffer
-
TBS
-
header_len_mcch
-
header_len_msi
-
sdu_length_total
)
%
(
TBS_MTCH
/*- header_len_mcch - header_len_msi -sdu_length_total*/
-
header_len_mtch
)
?
0
:
0
);
for
(
k
=
0
;
k
<
num_mtch
;
k
++
)
{
// loop for all session in this MCH (MCH[0]) at this moment
msi_ptr
=
&
msi_control_element
[
k
];
((
MSI_ELEMENT
*
)
msi_ptr
)
->
lcid
=
cc
->
mbms_SessionList
[
mbms_mch_i
]
->
list
.
array
[
k
]
->
logicalChannelIdentity_r9
;
// mtch_lcid;
if
(
msi_pmch_stop
>
cc
->
pmch_Config
[
mbms_mch_i
]
->
sf_AllocEnd_r9
)
LOG_E
(
MAC
,
"e-MBMS Buffer Overflow
\n
"
);
if
(
msi_pmch_stop
>=
num_sf_alloc
/*&& msi_pmch_stop <=cc->pmch_Config[0]->sf_AllocEnd_r9*/
)
{
((
MSI_ELEMENT
*
)
msi_ptr
)
->
stop_sf_MSB
=
(((
msi_pmch_stop
<=
cc
->
pmch_Config
[
mbms_mch_i
]
->
sf_AllocEnd_r9
?
msi_pmch_stop
:
cc
->
pmch_Config
[
mbms_mch_i
]
->
sf_AllocEnd_r9
)
>>
8
)
&
0x7f
);
((
MSI_ELEMENT
*
)
msi_ptr
)
->
stop_sf_LSB
=
((
msi_pmch_stop
<=
cc
->
pmch_Config
[
mbms_mch_i
]
->
sf_AllocEnd_r9
?
msi_pmch_stop
:
cc
->
pmch_Config
[
mbms_mch_i
]
->
sf_AllocEnd_r9
)
&
0xff
);
msi_pmch_stop
=
(
msi_pmch_stop
<=
cc
->
pmch_Config
[
mbms_mch_i
]
->
sf_AllocEnd_r9
?
msi_pmch_stop
:
cc
->
pmch_Config
[
mbms_mch_i
]
->
sf_AllocEnd_r9
);
...
...
targets/RT/USER/lte-enb.c
View file @
5bef665b
...
...
@@ -325,7 +325,6 @@ static void *L1_thread_tx(void *param) {
//wait_sync("tx_thread");
proc
->
respEncode
=
eNB
->
proc
.
L1_proc
.
respEncode
;
while
(
!
oai_exit
)
{
LOG_D
(
PHY
,
"Waiting for TX (IC %d)
\n
"
,
proc
->
instance_cnt
);
...
...
@@ -834,14 +833,9 @@ static void *process_stats_thread(void *param) {
print_meas
(
&
eNB
->
dlsch_turbo_encoding_preperation_stats
,
"dlsch_coding_crc"
,
NULL
,
NULL
);
print_meas
(
&
eNB
->
dlsch_turbo_encoding_segmentation_stats
,
"dlsch_segmentation"
,
NULL
,
NULL
);
print_meas
(
&
eNB
->
dlsch_encoding_stats
,
"dlsch_encoding"
,
NULL
,
NULL
);
print_meas
(
&
eNB
->
dlsch_turbo_encoding_signal_stats
,
"coding_signal"
,
NULL
,
NULL
);
print_meas
(
&
eNB
->
dlsch_turbo_encoding_main_stats
,
"coding_main"
,
NULL
,
NULL
);
print_meas
(
&
eNB
->
dlsch_turbo_encoding_stats
,
"turbo_encoding"
,
NULL
,
NULL
);
print_meas
(
&
eNB
->
dlsch_interleaving_stats
,
"turbo_interleaving"
,
NULL
,
NULL
);
print_meas
(
&
eNB
->
dlsch_rate_matching_stats
,
"turbo_rate_matching"
,
NULL
,
NULL
);
print_meas
(
&
eNB
->
dlsch_turbo_encoding_waiting_stats
,
"coding_wait"
,
NULL
,
NULL
);
print_meas
(
&
eNB
->
dlsch_turbo_encoding_wakeup_stats0
,
"coding_worker_0"
,
NULL
,
NULL
);
print_meas
(
&
eNB
->
dlsch_turbo_encoding_wakeup_stats1
,
"coding_worker_1"
,
NULL
,
NULL
);
}
print_meas
(
&
eNB
->
dlsch_modulation_stats
,
"dlsch_modulation"
,
NULL
,
NULL
);
...
...
targets/RT/USER/lte-softmodem.c
View file @
5bef665b
...
...
@@ -645,18 +645,14 @@ int main ( int argc, char **argv )
for
(
int
CC_id
=
0
;
CC_id
<
RC
.
nb_L1_CC
[
x
];
CC_id
++
)
{
L1_rxtx_proc_t
*
L1proc
=
&
RC
.
eNB
[
x
][
CC_id
]
->
proc
.
L1_proc
;
L1_rxtx_proc_t
*
L1proctx
=
&
RC
.
eNB
[
x
][
CC_id
]
->
proc
.
L1_proc_tx
;
L1proc
->
threadPool
=
(
tpool_t
*
)
malloc
(
sizeof
(
tpool_t
));
L1proc
->
respEncode
=
(
notifiedFIFO_t
*
)
malloc
(
sizeof
(
notifiedFIFO_t
));
L1proc
->
threadPool
=
(
tpool_t
*
)
malloc
(
sizeof
(
tpool_t
));
L1proc
->
respDecode
=
(
notifiedFIFO_t
*
)
malloc
(
sizeof
(
notifiedFIFO_t
));
if
(
strlen
(
get_softmodem_params
()
->
threadPoolConfig
)
>
0
)
initTpool
(
get_softmodem_params
()
->
threadPoolConfig
,
L1proc
->
threadPool
,
true
);
else
initTpool
(
"n"
,
L1proc
->
threadPool
,
true
);
initNotifiedFIFO
(
L1proc
->
respEncode
);
initTpool
(
"n"
,
L1proc
->
threadPool
,
true
);
initNotifiedFIFO
(
L1proc
->
respDecode
);
L1proctx
->
threadPool
=
L1proc
->
threadPool
;
L1proctx
->
respEncode
=
L1proc
->
respEncode
;
L1proctx
->
nbEncode
=
L1proc
->
nbEncode
;
L1proctx
->
threadPool
=
L1proc
->
threadPool
;
}
...
...
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