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
常顺宇
OpenXG-RAN
Commits
ff6d41b6
Commit
ff6d41b6
authored
Mar 01, 2017
by
hbilel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[OAI-UE] Mimo feature
parent
5c375d3a
Changes
20
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
560 additions
and
250 deletions
+560
-250
openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
+2
-2
openair1/PHY/LTE_TRANSPORT/dci.c
openair1/PHY/LTE_TRANSPORT/dci.c
+32
-5
openair1/PHY/LTE_TRANSPORT/dci_tools.c
openair1/PHY/LTE_TRANSPORT/dci_tools.c
+59
-24
openair1/PHY/LTE_TRANSPORT/defs.h
openair1/PHY/LTE_TRANSPORT/defs.h
+1
-1
openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
+28
-11
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+72
-15
openair1/PHY/LTE_TRANSPORT/print_stats.c
openair1/PHY/LTE_TRANSPORT/print_stats.c
+11
-11
openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
+2
-2
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+1
-1
openair1/PHY/MODULATION/slot_fep.c
openair1/PHY/MODULATION/slot_fep.c
+1
-1
openair1/PHY/TOOLS/lte_phy_scope.c
openair1/PHY/TOOLS/lte_phy_scope.c
+9
-9
openair1/PHY/TOOLS/lte_phy_scope_tm4.c
openair1/PHY/TOOLS/lte_phy_scope_tm4.c
+14
-14
openair1/PHY/defs.h
openair1/PHY/defs.h
+7
-3
openair1/SCHED/phy_procedures_lte_ue.c
openair1/SCHED/phy_procedures_lte_ue.c
+279
-120
openair1/SCHED/pucch_pc.c
openair1/SCHED/pucch_pc.c
+5
-5
openair2/RRC/LITE/L2_interface.c
openair2/RRC/LITE/L2_interface.c
+4
-4
openair3/NAS/TOOLS/network.h
openair3/NAS/TOOLS/network.h
+1
-1
openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
+4
-4
targets/RT/USER/lte-ue.c
targets/RT/USER/lte-ue.c
+9
-0
targets/SIMU/USER/init_lte.c
targets/SIMU/USER/init_lte.c
+19
-17
No files found.
openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
View file @
ff6d41b6
...
...
@@ -51,7 +51,7 @@ int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue,
int
uespec_pilot
[
300
];
LTE_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_ue
->
frame_parms
;
LTE_UE_DLSCH_t
**
dlsch_ue
=
phy_vars_ue
->
dlsch
[
eNB_id
];
LTE_UE_DLSCH_t
**
dlsch_ue
=
phy_vars_ue
->
dlsch
[
(
Ns
>>
1
)
&
0x1
][
eNB_id
];
LTE_DL_UE_HARQ_t
*
dlsch0_harq
;
harq_pid
=
dlsch_ue
[
0
]
->
current_harq_pid
;
...
...
openair1/PHY/LTE_TRANSPORT/dci.c
View file @
ff6d41b6
...
...
@@ -2893,15 +2893,15 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
break
;
case
2
:
*
CCEmap
|=
(
0x03
<<
(
CCEind
&
0x1f
));
*
CCEmap
|=
(
1
<<
(
CCEind
&
0x1f
));
break
;
case
4
:
*
CCEmap
|=
(
0x0f
<<
(
CCEind
&
0x1f
));
*
CCEmap
|=
(
1
<<
(
CCEind
&
0x1f
));
break
;
case
8
:
*
CCEmap
|=
(
0xff
<<
(
CCEind
&
0x1f
));
*
CCEmap
|=
(
1
<<
(
CCEind
&
0x1f
));
break
;
}
...
...
@@ -3518,7 +3518,9 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
}
else
if
(
tmode
==
3
)
{
LOG_D
(
PHY
,
" Now check UE_SPEC format 2A_2A search aggregation 1
\n
"
);
// Now check UE_SPEC format 2A_2A search spaces at aggregation 1
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3542,14 +3544,18 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
&
CCEmap1
,
&
CCEmap2
);
LOG_D
(
PHY
,
" format 2A_2A search CCEmap0 %x, format0_found %d, format_c_found %d
\n
"
,
CCEmap0
,
format0_found
,
format_c_found
);
if
((
CCEmap0
==
0xffff
)
||
((
format0_found
==
1
)
&&
(
format_c_found
==
1
)))
return
(
dci_cnt
);
LOG_D
(
PHY
,
" format 2A_2A search dci_cnt %d, old_dci_cn t%d
\n
"
,
dci_cnt
,
old_dci_cnt
);
if
(
dci_cnt
>
old_dci_cnt
)
return
(
dci_cnt
);
// Now check UE_SPEC format 2 search spaces at aggregation 2
LOG_D
(
PHY
,
" Now check UE_SPEC format 2A_2A search aggregation 2
\n
"
);
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3577,10 +3583,13 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
((
format0_found
==
1
)
&&
(
format_c_found
==
1
)))
return
(
dci_cnt
);
LOG_D
(
PHY
,
" format 2A_2A search dci_cnt %d, old_dci_cn t%d
\n
"
,
dci_cnt
,
old_dci_cnt
);
if
(
dci_cnt
>
old_dci_cnt
)
return
(
dci_cnt
);
// Now check UE_SPEC format 2_2A search spaces at aggregation 4
LOG_D
(
PHY
,
" Now check UE_SPEC format 2_2A search spaces at aggregation 4
\n
"
);
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3608,11 +3617,14 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
((
format0_found
==
1
)
&&
(
format_c_found
==
1
)))
return
(
dci_cnt
);
LOG_D
(
PHY
,
" format 2A_2A search dci_cnt %d, old_dci_cn t%d
\n
"
,
dci_cnt
,
old_dci_cnt
);
if
(
dci_cnt
>
old_dci_cnt
)
return
(
dci_cnt
);
//#ifdef ALL_AGGREGATION
// Now check UE_SPEC format 2_2A search spaces at aggregation 8
LOG_D
(
PHY
,
" Now check UE_SPEC format 2_2A search spaces at aggregation 8
\n
"
);
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3636,9 +3648,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
&
CCEmap1
,
&
CCEmap2
);
//#endif
if
((
CCEmap0
==
0xffff
)
||
((
format0_found
==
1
)
&&
(
format_c_found
==
1
)))
return
(
dci_cnt
);
LOG_D
(
PHY
,
" format 2A_2A search dci_cnt %d, old_dci_cn t%d
\n
"
,
dci_cnt
,
old_dci_cnt
);
if
(
dci_cnt
>
old_dci_cnt
)
return
(
dci_cnt
);
}
else
if
(
tmode
==
4
)
{
// Now check UE_SPEC format 2_2A search spaces at aggregation 1
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3670,6 +3690,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
return
(
dci_cnt
);
// Now check UE_SPEC format 2 search spaces at aggregation 2
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3701,6 +3722,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
return
(
dci_cnt
);
// Now check UE_SPEC format 2_2A search spaces at aggregation 4
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3733,6 +3755,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
//#ifdef ALL_AGGREGATION
// Now check UE_SPEC format 2_2A search spaces at aggregation 8
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3762,6 +3785,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
#ifdef DEBUG_DCI_DECODING
LOG_I
(
PHY
,
" MU-MIMO check UE_SPEC format 1E_2A_M10PRB
\n
"
);
#endif
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3794,6 +3818,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
return
(
dci_cnt
);
// Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 2
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3825,6 +3850,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
return
(
dci_cnt
);
// Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 4
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
@@ -3858,6 +3884,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
//#ifdef ALL_AGGREGATION
// Now check UE_SPEC format 1E_2A_M10PRB search spaces at aggregation 8
old_dci_cnt
=
dci_cnt
;
dci_decoding_procedure0
(
pdcch_vars
,
0
,
mode
,
subframe
,
dci_alloc
,
...
...
openair1/PHY/LTE_TRANSPORT/dci_tools.c
View file @
ff6d41b6
...
...
@@ -4769,10 +4769,12 @@ int check_dci_format1_1a_coherency(DCI_format_t dci_format,
uint8_t
harq_pid
=
pdci_info_extarcted
->
harq_pid
;
uint32_t
rballoc
=
pdci_info_extarcted
->
rballoc
;
uint8_t
mcs1
=
pdci_info_extarcted
->
mcs1
;
uint8_t
rv1
=
pdci_info_extarcted
->
rv1
;
uint8_t
ndi1
=
pdci_info_extarcted
->
ndi1
;
uint8_t
TPC
=
pdci_info_extarcted
->
TPC
;
uint8_t
rah
=
pdci_info_extarcted
->
rah
;
#ifdef DEBUG_DCI
uint8_t
rv1
=
pdci_info_extarcted
->
rv1
;
uint8_t
ndi1
=
pdci_info_extarcted
->
ndi1
;
#endif
uint8_t
NPRB
=
0
;
long
long
int
RIV_max
=
0
;
...
...
@@ -4983,13 +4985,18 @@ int check_dci_format2_2a_coherency(DCI_format_t dci_format,
uint8_t
rv2
=
pdci_info_extarcted
->
rv2
;
uint8_t
harq_pid
=
pdci_info_extarcted
->
harq_pid
;
uint32_t
rballoc
=
pdci_info_extarcted
->
rballoc
;
#ifdef DEBUG_DCI
uint8_t
ndi1
=
pdci_info_extarcted
->
ndi1
;
uint8_t
ndi2
=
pdci_info_extarcted
->
ndi2
;
#endif
uint8_t
NPRB
=
0
;
long
long
RIV_max
=
0
;
#ifdef DEBUG_DCI
LOG_I
(
PHY
,
"extarcted dci - dci_format %d
\n
"
,
dci_format
);
LOG_I
(
PHY
,
"extarcted dci - rnti %d
\n
"
,
rnti
);
LOG_I
(
PHY
,
"extarcted dci - rah %d
\n
"
,
rah
);
LOG_I
(
PHY
,
"extarcted dci - mcs1 %d
\n
"
,
mcs1
);
LOG_I
(
PHY
,
"extarcted dci - mcs2 %d
\n
"
,
mcs2
);
...
...
@@ -5001,6 +5008,7 @@ int check_dci_format2_2a_coherency(DCI_format_t dci_format,
LOG_I
(
PHY
,
"extarcted dci - harq pif %d
\n
"
,
harq_pid
);
LOG_I
(
PHY
,
"extarcted dci - round0 %d
\n
"
,
pdlsch0_harq
->
round
);
LOG_I
(
PHY
,
"extarcted dci - round1 %d
\n
"
,
pdlsch1_harq
->
round
);
#endif
// I- check dci content minimum coherency
if
(
harq_pid
>
8
)
...
...
@@ -5043,6 +5051,21 @@ int check_dci_format2_2a_coherency(DCI_format_t dci_format,
}*/
if
((
pdlsch0_harq
->
round
==
0
)
&&
(
rv1
>
0
))
{
// DCI false detection
LOG_I
(
PHY
,
"bad rv1
\n
"
);
return
(
0
);
}
if
((
pdlsch1_harq
->
round
==
0
)
&&
(
rv2
>
0
))
{
// DCI false detection
LOG_I
(
PHY
,
"bad rv2
\n
"
);
return
(
0
);
}
switch
(
N_RB_DL
)
{
case
6
:
if
(
rah
==
0
)
...
...
@@ -5606,6 +5629,7 @@ void compute_precoding_info_format2A(uint8_t tpmi,
void
prepare_dl_decoding_format2_2A
(
DCI_format_t
dci_format
,
DCI_INFO_EXTRACTED_t
*
pdci_info_extarcted
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint16_t
rnti
,
uint8_t
subframe
,
LTE_DL_UE_HARQ_t
*
dlsch0_harq
,
LTE_DL_UE_HARQ_t
*
dlsch1_harq
,
...
...
@@ -5672,6 +5696,8 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
dlsch1_harq
->
status
=
ACTIVE
;
pdlsch0
->
active
=
1
;
pdlsch1
->
active
=
1
;
pdlsch0
->
rnti
=
rnti
;
pdlsch1
->
rnti
=
rnti
;
if
(
TB0_active
&&
TB1_active
&&
tbswap
==
1
)
{
...
...
@@ -5690,12 +5716,8 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
if
(
TB1_active
==
0
)
{
dlsch1_harq
->
status
=
SCH_IDLE
;
pdlsch1
->
active
=
0
;
#ifdef DEBUG_HARQ
printf
(
"[DCI UE]: TB1 is deactivated, retransmit TB0 transmit in TM6
\n
"
);
#endif
}
#ifdef DEBUG_HARQ
printf
(
"[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d
\n
"
,
dlsch0_harq
->
status
,
dlsch1_harq
->
status
);
#endif
...
...
@@ -5727,6 +5749,9 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
dlsch1_harq
->
rb_alloc_odd
[
3
]
=
dlsch0_harq
->
rb_alloc_odd
[
3
];
dlsch1_harq
->
nb_rb
=
dlsch0_harq
->
nb_rb
;
//dlsch0_harq->Nl = 1;
//dlsch1_harq->Nl = 1;
}
}
else
if
((
TB0_active
==
0
)
&&
(
TB1_active
==
1
)){
...
...
@@ -5774,24 +5799,28 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
if
((
ndi1
!=
dlsch0_harq
->
DCINdi
)
||
(
dlsch0_harq
->
first_tx
==
1
))
{
dlsch0_harq
->
round
=
0
;
//LOG_I(PHY,"[UE] DLSCH: New Data Indicator CW0 subframe %d (pid %d, round %d)\n",
// subframe,harq_pid,dlsch0_harq->round);
if
(
dlsch0_harq
->
first_tx
==
1
)
{
LOG_D
(
PHY
,
"Format 2 DCI First TX0: Clearing flag
\n
"
);
dlsch0_harq
->
first_tx
=
0
;
}
}
else
{
if
(
dlsch0_harq
->
round
==
0
)
{
#if 0
// skip pdsch decoding and report ack
dlsch0_harq->status = SCH_IDLE;
pdlsch0->active = 0;
pdlsch0->harq_ack[subframe].ack = 1;
pdlsch0->harq_ack[subframe].harq_id = harq_pid;
pdlsch0->harq_ack[subframe].send_harq_status = 1;
#endif
}
}
dlsch0_harq
->
TBS
=
TBStable
[
get_I_TBS
(
dlsch0_harq
->
mcs
)][
dlsch0_harq
->
nb_rb
-
1
];
if
(
dlsch0_harq
->
Nl
==
2
)
dlsch0_harq
->
TBS
=
TBStable
[
get_I_TBS
(
dlsch0_harq
->
mcs
)][(
dlsch0_harq
->
nb_rb
<<
1
)
-
1
];
//
if(dlsch0_harq->Nl == 2)
//
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
if
(
mcs1
<=
28
)
dlsch0_harq
->
Qm
=
get_Qm
(
mcs1
);
else
if
(
mcs1
<=
31
)
...
...
@@ -5801,11 +5830,14 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
if
(
TB1_active
)
{
if
((
ndi2
!=
dlsch1_harq
->
DCINdi
)
||
(
dlsch1_harq
->
first_tx
==
1
))
{
dlsch1_harq
->
round
=
0
;
//LOG_I(PHY,"[UE] DLSCH: New Data Indicator CW1 subframe %d (pid %d, round %d)\n",
// subframe,harq_pid,dlsch0_harq->round);
if
(
dlsch1_harq
->
first_tx
==
1
)
{
LOG_D
(
PHY
,
"Format 2 DCI First TX1: Clearing flag
\n
"
);
dlsch1_harq
->
first_tx
=
0
;
}
}
else
{
#if 0
if(dlsch1_harq->round == 0) {
// skip pdsch decoding and report ack
dlsch1_harq->status = SCH_IDLE;
...
...
@@ -5814,11 +5846,12 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
pdlsch1->harq_ack[subframe].harq_id = harq_pid;
pdlsch1->harq_ack[subframe].send_harq_status = 1;
}
#endif
}
dlsch1_harq
->
TBS
=
TBStable
[
get_I_TBS
(
dlsch1_harq
->
mcs
)][
dlsch1_harq
->
nb_rb
-
1
];
if
(
dlsch0_harq
->
Nl
==
2
)
dlsch0_harq
->
TBS
=
TBStable
[
get_I_TBS
(
dlsch0_harq
->
mcs
)][(
dlsch0_harq
->
nb_rb
<<
1
)
-
1
];
//
if(dlsch0_harq->Nl == 2)
//
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
if
(
mcs2
<=
28
)
dlsch1_harq
->
Qm
=
get_Qm
(
mcs2
);
...
...
@@ -6047,7 +6080,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
case
format2
:
{
// extract dci infomation
LOG_I
(
PHY
,
"[DCI-format2] extract dci infomation
\n
"
);
//LOG_I(PHY,"[DCI-format2] AbsSubframe %d.%d extract dci infomation \n", frame, subframe
);
extract_dci2_info
(
frame_parms
->
N_RB_DL
,
frame_type
,
frame_parms
->
nb_antenna_ports_eNB
,
...
...
@@ -6069,7 +6102,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq
=
dlsch0
->
harq_processes
[
harq_pid
];
dlsch1_harq
=
dlsch1
->
harq_processes
[
harq_pid
];
LOG_I
(
PHY
,
"[DCI-format2] check dci content
\n
"
);
//
LOG_I(PHY,"[DCI-format2] check dci content \n");
status
=
check_dci_format2_2a_coherency
(
format2
,
frame_parms
->
N_RB_DL
,
&
dci_info_extarcted
,
...
...
@@ -6083,10 +6116,11 @@ int generate_ue_dlsch_params_from_dci(int frame,
return
(
-
1
);
// dci is correct ==> update internal structure and prepare dl decoding
LOG_I
(
PHY
,
"[DCI-format2] update internal structure and prepare dl decoding
\n
"
);
//
LOG_I(PHY,"[DCI-format2] update internal structure and prepare dl decoding \n");
prepare_dl_decoding_format2_2A
(
format2
,
&
dci_info_extarcted
,
frame_parms
,
rnti
,
subframe
,
dlsch0_harq
,
dlsch1_harq
,
...
...
@@ -6099,7 +6133,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
case
format2A
:
{
// extract dci infomation
LOG_I
(
PHY
,
"[DCI-format2A] extract dci infomation
\n
"
);
//LOG_I(PHY,"[DCI-format2] AbsSubframe %d.%d extract dci infomation \n", frame%1024, subframe
);
extract_dci2A_info
(
frame_parms
->
N_RB_DL
,
frame_type
,
frame_parms
->
nb_antenna_ports_eNB
,
...
...
@@ -6107,10 +6141,10 @@ int generate_ue_dlsch_params_from_dci(int frame,
&
dci_info_extarcted
);
// check dci content
LOG_I
(
PHY
,
"[DCI-format2A] check dci content
\n
"
);
LOG_I
(
PHY
,
"[DCI-format2A] tb_swap %d harq_pid %d
\n
"
,
dci_info_extarcted
.
tb_swap
,
dci_info_extarcted
.
harq_pid
);
dlsch
[
0
]
->
active
=
0
;
dlsch
[
1
]
->
active
=
0
;
//
LOG_I(PHY,"[DCI-format2A] check dci content \n");
//
LOG_I(PHY,"[DCI-format2A] tb_swap %d harq_pid %d\n", dci_info_extarcted.tb_swap, dci_info_extarcted.harq_pid);
//
dlsch[0]->active = 0;
//
dlsch[1]->active = 0;
if
(
dci_info_extarcted
.
tb_swap
==
0
)
{
dlsch0
=
dlsch
[
0
];
...
...
@@ -6122,7 +6156,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq
=
dlsch0
->
harq_processes
[
dci_info_extarcted
.
harq_pid
];
dlsch1_harq
=
dlsch1
->
harq_processes
[
dci_info_extarcted
.
harq_pid
];
LOG_I
(
PHY
,
"[DCI-format2A] check dci content
\n
"
);
//
LOG_I(PHY,"[DCI-format2A] check dci content \n");
status
=
check_dci_format2_2a_coherency
(
format2A
,
frame_parms
->
N_RB_DL
,
&
dci_info_extarcted
,
...
...
@@ -6136,10 +6170,11 @@ int generate_ue_dlsch_params_from_dci(int frame,
return
(
-
1
);
// dci is correct ==> update internal structure and prepare dl decoding
LOG_I
(
PHY
,
"[DCI-format2A] update internal structure and prepare dl decoding
\n
"
);
//
LOG_I(PHY,"[DCI-format2A] update internal structure and prepare dl decoding \n");
prepare_dl_decoding_format2_2A
(
format2A
,
&
dci_info_extarcted
,
frame_parms
,
rnti
,
subframe
,
dlsch0_harq
,
dlsch1_harq
,
...
...
@@ -7142,7 +7177,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
uint8_t
transmission_mode
=
ue
->
transmission_mode
[
eNB_id
];
ANFBmode_t
AckNackFBMode
;
LTE_UE_ULSCH_t
*
ulsch
=
ue
->
ulsch
[
eNB_id
];
LTE_UE_DLSCH_t
**
dlsch
=
ue
->
dlsch
[
0
];
LTE_UE_DLSCH_t
**
dlsch
=
ue
->
dlsch
[
subframe
&
0x1
][
0
];
PHY_MEASUREMENTS
*
meas
=
&
ue
->
measurements
;
LTE_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
// uint32_t current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
...
...
@@ -7947,7 +7982,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
if
(
frame_parms
->
frame_type
==
FDD
)
{
int
dl_subframe
=
(
subframe
<
4
)
?
(
subframe
+
6
)
:
(
subframe
-
4
);
if
(
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_ack
[
dl_subframe
].
send_harq_status
>
0
)
{
// we have downlink transmission
if
(
ue
->
dlsch
[
dl_subframe
&
0x1
][
eNB_id
][
0
]
->
harq_ack
[
dl_subframe
].
send_harq_status
>
0
)
{
// we have downlink transmission
ulsch
->
harq_processes
[
harq_pid
]
->
O_ACK
=
1
;
}
else
{
ulsch
->
harq_processes
[
harq_pid
]
->
O_ACK
=
0
;
...
...
openair1/PHY/LTE_TRANSPORT/defs.h
View file @
ff6d41b6
...
...
@@ -708,7 +708,7 @@ typedef struct {
int16_t
sqrt_rho_a
;
/// amplitude of PDSCH (compared to RS) in symbols containing pilots
int16_t
sqrt_rho_b
;
/// Current HARQ process id
/// Current HARQ process id
threadRx Odd and threadRx Even
uint8_t
current_harq_pid
;
/// Current subband antenna selection
uint32_t
antenna_alloc
;
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
View file @
ff6d41b6
...
...
@@ -38,6 +38,7 @@
#include "SIMULATION/TOOLS/defs.h"
//#define DEBUG_DLSCH_DECODING
extern
double
cpuf
;
void
free_ue_dlsch
(
LTE_UE_DLSCH_t
*
dlsch
)
{
...
...
@@ -270,7 +271,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
return(max_turbo_iterations);
}*/
/*harq_pid = dlsch->current_harq_pid;
/*harq_pid = dlsch->current_harq_pid
[subframe&0x1]
;
if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_turbo_iterations);
...
...
@@ -341,6 +342,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
printf
(
"Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d
\n
"
,
harq_process
->
C
,
harq_process
->
Cminus
,
harq_process
->
Kminus
,
harq_process
->
Kplus
);
#endif
opp_enabled
=
1
;
for
(
r
=
0
;
r
<
harq_process
->
C
;
r
++
)
{
...
...
@@ -376,7 +379,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
(
r
==
0
)
?
harq_process
->
F
:
0
);
#ifdef DEBUG_DLSCH_DECODING
LOG_
I
(
PHY
,
"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...
\n
"
,
LOG_
D
(
PHY
,
"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...
\n
"
,
harq_pid
,
r
,
G
,
Kr
*
3
,
harq_process
->
TBS
,
...
...
@@ -459,6 +462,10 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
#if 1
if
(
err_flag
==
0
)
{
LOG_D
(
PHY
,
"turbo algo Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d
\n
"
,
Kr
,
r
,
harq_process
->
C
,
harq_process
->
nb_rb
,
A
,
harq_process
->
TBS
,
harq_process
->
B
,
harq_process
->
mcs
,
harq_process
->
Qm
,
harq_process
->
rvidx
,
harq_process
->
round
,
dlsch
->
max_turbo_iterations
);
if
(
llr8_flag
)
{
AssertFatal
(
Kr
>=
256
,
"turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d
\n
"
,
Kr
,
r
,
harq_process
->
C
,
harq_process
->
nb_rb
,
A
,
harq_process
->
TBS
,
harq_process
->
B
,
harq_process
->
mcs
,
harq_process
->
Qm
,
harq_process
->
rvidx
,
harq_process
->
round
);
...
...
@@ -605,6 +612,13 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
stop_meas
(
dlsch_turbo_decoding_stats
);
printf
(
"Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f dlsch_turbo_decoding_stats %5.3f
\n
"
,
harq_process
->
C
,
r
,
dlsch_rate_unmatching_stats
->
p_time
/
(
cpuf
*
1000
.
0
),
dlsch_deinterleaving_stats
->
p_time
/
(
cpuf
*
1000
.
0
),
dlsch_turbo_decoding_stats
->
p_time
/
(
cpuf
*
1000
.
0
));
}
}
}
...
...
@@ -636,25 +650,28 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
harq_process
->
round
++
;
if
(
is_crnti
)
{
LOG_D
(
PHY
,
"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d, TBS %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
subframe
,
harq_pid
,
harq_process
->
round
,
harq_process
->
TBS
);
}
// printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
if
(
harq_process
->
round
>=
dlsch
->
Mdlharq
)
{
harq_process
->
status
=
SCH_IDLE
;
harq_process
->
round
=
0
;
}
if
(
is_crnti
)
{
LOG_D
(
PHY
,
"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, pid status %d, round %d/Max %d, TBS %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
subframe
,
harq_pid
,
harq_process
->
status
,
harq_process
->
round
,
dlsch
->
Mdlharq
,
harq_process
->
TBS
);
}
return
((
1
+
dlsch
->
max_turbo_iterations
));
}
else
{
LOG_D
(
PHY
,
"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, round %d, subframe %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
frame_rx_prev
,
subframe_rx_prev
,
harq_pid
,
harq_process
->
round
,
subframe
);
harq_process
->
status
=
SCH_IDLE
;
harq_process
->
round
=
0
;
dlsch
->
harq_ack
[
subframe
].
ack
=
1
;
dlsch
->
harq_ack
[
subframe
].
harq_id
=
harq_pid
;
dlsch
->
harq_ack
[
subframe
].
send_harq_status
=
1
;
LOG_D
(
PHY
,
"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, pid status %d, round %d, subframe %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
frame_rx_prev
,
subframe_rx_prev
,
harq_pid
,
harq_process
->
status
,
harq_process
->
round
,
subframe
);
if
(
is_crnti
)
{
LOG_D
(
PHY
,
"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
subframe
,
harq_pid
,
harq_process
->
round
,
harq_process
->
TBS
);
...
...
@@ -908,7 +925,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
break
;
case
PDSCH
:
// TB0
dlsch_ue
=
phy_vars_ue
->
dlsch
[
eNB_id
][
0
];
dlsch_ue
=
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
];
harq_pid
=
dlsch_ue
->
current_harq_pid
;
ue_id
=
(
uint32_t
)
find_ue
((
int16_t
)
phy_vars_ue
->
pdcch_vars
[(
uint32_t
)
eNB_id
]
->
crnti
,
PHY_vars_eNB_g
[
eNB_id2
][
CC_id
]);
DevAssert
(
ue_id
!=
(
uint32_t
)
-
1
);
...
...
@@ -954,7 +971,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
break
;
case
PDSCH1
:
{
// TB1
dlsch_ue
=
phy_vars_ue
->
dlsch
[
eNB_id
][
1
];
dlsch_ue
=
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
1
];
harq_pid
=
dlsch_ue
->
current_harq_pid
;
int8_t
UE_id
=
find_ue
(
phy_vars_ue
->
pdcch_vars
[
eNB_id
]
->
crnti
,
PHY_vars_eNB_g
[
eNB_id2
][
CC_id
]
);
DevAssert
(
UE_id
!=
-
1
);
...
...
@@ -1008,7 +1025,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
break
;
default:
dlsch_ue
=
phy_vars_ue
->
dlsch
[
eNB_id
][
0
];
dlsch_ue
=
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
];
LOG_E
(
PHY
,
"dlsch_decoding_emul: FATAL, unknown DLSCH_id %d
\n
"
,
dlsch_id
);
dlsch_ue
->
last_iteration_cnt
=
1
+
dlsch_ue
->
max_turbo_iterations
;
return
(
1
+
dlsch_ue
->
max_turbo_iterations
);
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
View file @
ff6d41b6
...
...
@@ -121,6 +121,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
switch
(
type
)
{
case
SI_PDSCH
:
pdsch_vars
=
&
ue
->
pdsch_vars_SI
[
eNB_id
];
...
...
@@ -138,16 +139,18 @@ int rx_pdsch(PHY_VARS_UE *ue,
case
PDSCH
:
pdsch_vars
=
&
ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
];
dlsch
=
ue
->
dlsch
[
eNB_id
];
dlsch
=
ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
];
LOG_D
(
PHY
,
"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d
\n
"
,
frame
,
subframe
,
symbol
,
harq_pid
,
dlsch
[
0
]
->
harq_processes
[
harq_pid
]
->
status
,
dlsch
[
1
]
->
harq_processes
[
harq_pid
]
->
status
);
if
((
dlsch
[
0
]
->
harq_processes
[
harq_pid
]
->
status
==
ACTIVE
)
&&
(
dlsch
[
1
]
->
harq_processes
[
harq_pid
]
->
status
==
ACTIVE
)){
codeword_TB0
=
dlsch
[
0
]
->
harq_processes
[
harq_pid
]
->
codeword
;
codeword_TB1
=
dlsch
[
1
]
->
harq_processes
[
harq_pid
]
->
codeword
;
dlsch0_harq
=
dlsch
[
codeword_TB0
]
->
harq_processes
[
harq_pid
];
dlsch1_harq
=
dlsch
[
codeword_TB1
]
->
harq_processes
[
harq_pid
];
#ifdef DEBUG_HARQ
printf
(
"I am assuming both CW active
\n
"
);
#endif
}
else
if
((
dlsch
[
0
]
->
harq_processes
[
harq_pid
]
->
status
==
ACTIVE
)
&&
(
dlsch
[
1
]
->
harq_processes
[
harq_pid
]
->
status
!=
ACTIVE
)
)
{
...
...
@@ -230,6 +233,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
}
//LOG_I(PHY,"[rx_pdsch %d] AbsSubframe %d.%d symbol %d rxType %d beamformingMode %d, antennaPorts %d, eNB_id_i %d, n_connected_eNB %d\n",
// harq_pid, frame,subframe, symbol,rx_type, beamforming_mode, frame_parms->nb_antenna_ports_eNB,eNB_id_i,ue->n_connected_eNB);
if
(
frame_parms
->
nb_antenna_ports_eNB
>
1
&&
beamforming_mode
==
0
)
{
#ifdef DEBUG_DLSCH_MOD
LOG_I
(
PHY
,
"dlsch: using pmi %x (%p), rb_alloc %x
\n
"
,
pmi2hex_2Ar1
(
dlsch0_harq
->
pmi_alloc
),
dlsch
[
0
],
dlsch0_harq
->
rb_alloc_even
[
0
]);
...
...
@@ -336,7 +342,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
LOG_W
(
PHY
,
"dlsch_demodulation: beamforming mode not supported yet.
\n
"
);
}
//
printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id);
//printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id);
if
(
nb_rb
==
0
)
{
LOG_D
(
PHY
,
"dlsch_demodulation.c: nb_rb=0
\n
"
);
return
(
-
1
);
...
...
@@ -383,6 +389,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
((
dlsch0_harq
->
mimo_mode
>=
DUALSTREAM_UNIFORM_PRECODING1
)
&&
(
dlsch0_harq
->
mimo_mode
<=
DUALSTREAM_PUSCH_PRECODING
)))
{
//LOG_I(PHY,"Channel Level TM34 !!!!!!!! \n");
dlsch_channel_level_TM34
(
pdsch_vars
[
eNB_id
]
->
dl_ch_estimates_ext
,
frame_parms
,
pdsch_vars
[
eNB_id
]
->
pmi_ext
,
...
...
@@ -392,21 +399,23 @@ int rx_pdsch(PHY_VARS_UE *ue,
nb_rb
,
dlsch0_harq
->
mimo_mode
);
LOG_D
(
PHY
,
"Channel Level TM34 avg_0 %d, avg_1 %d, rx_type %d, rx_standard %d, interf_unaw_shift %d
\n
"
,
avg_0
[
0
],
avg_1
[
0
],
rx_type
,
rx_standard
,
interf_unaw_shift
);
if
(
rx_type
>
rx_standard
)
{
avg_0
[
0
]
=
(
log2_approx
(
avg_0
[
0
])
/
2
)
-
13
+
interf_unaw_shift
;
avg_1
[
0
]
=
(
log2_approx
(
avg_1
[
0
])
/
2
)
-
13
+
interf_unaw_shift
;
avg_0
[
0
]
=
(
log2_approx
(
avg_0
[
0
])
/
2
)
-
5
+
2
;
//+ 2
;
avg_1
[
0
]
=
(
log2_approx
(
avg_1
[
0
])
/
2
)
-
5
+
2
;
//+ 2
;
pdsch_vars
[
eNB_id
]
->
log2_maxh0
=
cmax
(
avg_0
[
0
],
0
);
pdsch_vars
[
eNB_id
]
->
log2_maxh1
=
cmax
(
avg_1
[
0
],
0
);
//printf("TM4 I-A log2_maxh0 = %d\n",
lte_ue_
pdsch_vars[eNB_id]->log2_maxh0);
//printf("TM4 I-A log2_maxh1 = %d\n",
lte_ue_
pdsch_vars[eNB_id]->log2_maxh1);
//printf("TM4 I-A log2_maxh0 = %d\n", pdsch_vars[eNB_id]->log2_maxh0);
//printf("TM4 I-A log2_maxh1 = %d\n", pdsch_vars[eNB_id]->log2_maxh1);
}
else
{
avg_0
[
0
]
=
(
log2_approx
(
avg_0
[
0
])
/
2
)
-
13
+
interf_unaw_shift
;
avg_1
[
0
]
=
(
log2_approx
(
avg_1
[
0
])
/
2
)
-
13
+
interf_unaw_shift
;
pdsch_vars
[
eNB_id
]
->
log2_maxh0
=
cmax
(
avg_0
[
0
],
0
);
pdsch_vars
[
eNB_id
]
->
log2_maxh1
=
cmax
(
avg_1
[
0
],
0
);
//printf("TM4 I-UA log2_maxh0 = %d\n",
lte_ue_
pdsch_vars[eNB_id]->log2_maxh0);
//printf("TM4 I-UA log2_maxh1 = %d\n",
lte_ue_
pdsch_vars[eNB_id]->log2_maxh1);
//printf("TM4 I-UA log2_maxh0 = %d\n", pdsch_vars[eNB_id]->log2_maxh0);
//printf("TM4 I-UA log2_maxh1 = %d\n", pdsch_vars[eNB_id]->log2_maxh1);
}
}
else
if
(
dlsch0_harq
->
mimo_mode
<
DUALSTREAM_UNIFORM_PRECODING1
)
{
// single-layer precoding (TM5, TM6)
...
...
@@ -448,8 +457,11 @@ int rx_pdsch(PHY_VARS_UE *ue,
symbol
,
nb_rb
);
#ifdef DEBUG_PHY
LOG_D
(
PHY
,
"[DLSCH] log2_maxh = %d (%d,%d)
\n
"
,
pdsch_vars
[
eNB_id
]
->
log2_maxh
,
avg
[
0
],
avgs
);
LOG_D
(
PHY
,
"[DLSCH] mimo_mode = %d
\n
"
,
dlsch0_harq
->
mimo_mode
);
LOG_I
(
PHY
,
"[DLSCH] log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)
\n
"
,
pdsch_vars
[
eNB_id
]
->
log2_maxh
,
pdsch_vars
[
eNB_id
]
->
log2_maxh0
,
pdsch_vars
[
eNB_id
]
->
log2_maxh1
,
avg
[
0
],
avgs
);
LOG_I
(
PHY
,
"[DLSCH] mimo_mode = %d
\n
"
,
dlsch0_harq
->
mimo_mode
);
#endif
}
...
...
@@ -511,6 +523,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
}
else
if
((
dlsch0_harq
->
mimo_mode
==
LARGE_CDD
)
||
((
dlsch0_harq
->
mimo_mode
>=
DUALSTREAM_UNIFORM_PRECODING1
)
&&
(
dlsch0_harq
->
mimo_mode
<=
DUALSTREAM_PUSCH_PRECODING
))){
//LOG_I(PHY,"channel compensation TM34 !!!!!!!!!!!!!!!!!\n");
dlsch_channel_compensation_TM34
(
frame_parms
,
pdsch_vars
[
eNB_id
],
measurements
,
...
...
@@ -663,6 +676,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
((
dlsch0_harq
->
mimo_mode
>=
DUALSTREAM_UNIFORM_PRECODING1
)
&&
(
dlsch0_harq
->
mimo_mode
<=
DUALSTREAM_PUSCH_PRECODING
))){
// TM3 or TM4
if
(
frame_parms
->
nb_antenna_ports_eNB
==
2
)
{
//LOG_I(PHY,"MRC Detection TM34 !!!!!!!!!\n");
dlsch_detection_mrc_TM34
(
frame_parms
,
pdsch_vars
[
eNB_id
],
harq_pid
,
...
...
@@ -724,6 +738,10 @@ int rx_pdsch(PHY_VARS_UE *ue,
//i_mod should have been passed as a parameter
}
//LOG_I(PHY,"compute LLRs rx_type dual ? %d rx_standard %d codeword_TB0 %d codeword_TB1 %d\n", rx_type==rx_IC_dual_stream, rx_standard, codeword_TB0, codeword_TB1);
//if (rx_type >= rx_IC_single_stream)
//LOG_I(PHY,"LLR0 Qm ? %d LLR1 Qm \n", dlsch0_harq->Qm, dlsch1_harq->Qm);
switch
(
dlsch0_harq
->
Qm
)
{
case
2
:
if
((
rx_type
==
rx_standard
)
||
(
codeword_TB0
==
-
1
)
||
(
codeword_TB1
==
-
1
))
{
...
...
@@ -805,6 +823,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
break
;
case
4
:
if
((
rx_type
==
rx_standard
)
||
(
codeword_TB0
==
-
1
)
||
(
codeword_TB1
==
-
1
))
{
dlsch_16qam_llr
(
frame_parms
,
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
,
...
...
@@ -978,6 +997,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
return
(
-
1
);
break
;
}
if
(
dlsch1_harq
)
{
switch
(
get_Qm
(
dlsch1_harq
->
mcs
))
{
case
2
:
...
...
@@ -1023,6 +1043,43 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
}
#if 0
if( (symbol == 13) && (dlsch0_harq->mimo_mode == 2) )
{
LOG_E(PHY,"Dump Phy Chan Est \n");
if(subframe&0x1)
{
#if 1
//write_output("rxdataF0.m" , "rxdataF0", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("rxdataF1.m" , "rxdataF1", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("dl_ch_estimates00.m", "dl_ch_estimates00", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("dl_ch_estimates01.m", "dl_ch_estimates01", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("dl_ch_estimates10.m", "dl_ch_estimates10", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("dl_ch_estimates11.m", "dl_ch_estimates11", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("rxdataF_ext00.m" , "rxdataF_ext00", &pdsch_vars[eNB_id]->rxdataF_ext[0][0],14*frame_parms->N_RB_DL*12,1,1);
//write_output("rxdataF_ext01.m" , "rxdataF_ext01", &pdsch_vars[eNB_id]->rxdataF_ext[1][0],14*frame_parms->N_RB_DL*12,1,1);
//write_output("rxdataF_ext10.m" , "rxdataF_ext10", &pdsch_vars[eNB_id]->rxdataF_ext[2][0],14*frame_parms->N_RB_DL*12,1,1);
//write_output("rxdataF_ext11.m" , "rxdataF_ext11", &pdsch_vars[eNB_id]->rxdataF_ext[3][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext00.m", "dl_ch_estimates_ext00", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext01.m", "dl_ch_estimates_ext01", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[1][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext10.m", "dl_ch_estimates_ext10", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[2][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext11.m", "dl_ch_estimates_ext11", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[3][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp00.m","rxdataF_comp00", &pdsch_vars[eNB_id]->rxdataF_comp0[0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp01.m","rxdataF_comp01", &pdsch_vars[eNB_id]->rxdataF_comp0[0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp10.m","rxdataF_comp10", &pdsch_vars[eNB_id]->rxdataF_comp0[0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp11.m","rxdataF_comp11", &pdsch_vars[eNB_id]->rxdataF_comp0[0][0],14*frame_parms->N_RB_DL*12,1,1);
#endif
write_output("llr0.m","llr0", &pdsch_vars[eNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
write_output("llr1.m","llr1", &pdsch_vars[eNB_id]->llr[1][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
AssertFatal(0," ");
}
}
#endif
#if T_TRACER
T
(
T_UE_PHY_PDSCH_IQ
,
T_INT
(
eNB_id
),
T_INT
(
ue
->
Mod_id
),
T_INT
(
frame
%
1024
),
...
...
openair1/PHY/LTE_TRANSPORT/print_stats.c
View file @
ff6d41b6
...
...
@@ -107,9 +107,9 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
len
+=
sprintf
(
&
buffer
[
len
],
"[UE PROC] Po_PUCCH = %d dBm (Po_NOMINAL_PUCCH %d dBm, g_pucch %d dB)
\n
"
,
get_PL
(
ue
->
Mod_id
,
ue
->
CC_id
,
0
)
+
ue
->
frame_parms
.
ul_power_control_config_common
.
p0_NominalPUCCH
+
ue
->
dlsch
[
0
][
0
]
->
g_pucch
,
ue
->
dlsch
[
0
][
0
]
[
0
]
->
g_pucch
,
ue
->
frame_parms
.
ul_power_control_config_common
.
p0_NominalPUCCH
,
ue
->
dlsch
[
0
][
0
]
->
g_pucch
);
ue
->
dlsch
[
0
][
0
]
[
0
]
->
g_pucch
);
}
//for (eNB=0;eNB<NUMBER_OF_eNB_MAX;eNB++) {
for
(
eNB
=
0
;
eNB
<
1
;
eNB
++
)
{
...
...
@@ -482,24 +482,24 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
len
+=
sprintf
(
&
buffer
[
len
],
"[UE PROC] Mode 6 Wideband CQI eNB %d : %d dB
\n
"
,
eNB
,
ue
->
measurements
.
precoded_cqi_dB
[
eNB
][
0
]);
for
(
harq_pid
=
0
;
harq_pid
<
8
;
harq_pid
++
)
{
len
+=
sprintf
(
&
buffer
[
len
],
"[UE PROC] eNB %d: CW 0 harq_pid %d, mcs %d:"
,
eNB
,
harq_pid
,
ue
->
dlsch
[
0
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
);
len
+=
sprintf
(
&
buffer
[
len
],
"[UE PROC] eNB %d: CW 0 harq_pid %d, mcs %d:"
,
eNB
,
harq_pid
,
ue
->
dlsch
[
0
][
0
]
[
0
]
->
harq_processes
[
harq_pid
]
->
mcs
);
for
(
round
=
0
;
round
<
8
;
round
++
)
len
+=
sprintf
(
&
buffer
[
len
],
"%d/%d "
,
ue
->
dlsch
[
0
][
0
]
->
harq_processes
[
harq_pid
]
->
errors
[
round
],
ue
->
dlsch
[
0
][
0
]
->
harq_processes
[
harq_pid
]
->
trials
[
round
]);
ue
->
dlsch
[
0
][
0
]
[
0
]
->
harq_processes
[
harq_pid
]
->
errors
[
round
],
ue
->
dlsch
[
0
][
0
]
[
0
]
->
harq_processes
[
harq_pid
]
->
trials
[
round
]);
len
+=
sprintf
(
&
buffer
[
len
],
"
\n
"
);
}
if
(
ue
->
dlsch
[
0
]
&&
ue
->
dlsch
[
0
][
0
]
&&
ue
->
dlsch
[
0
][
1
])
{
len
+=
sprintf
(
&
buffer
[
len
],
"[UE PROC] Saved PMI for DLSCH eNB %d : %jx (%p)
\n
"
,
eNB
,
pmi2hex_2Ar1
(
ue
->
dlsch
[
0
][
0
]
->
pmi_alloc
),
ue
->
dlsch
[
0
][
0
]);
if
(
ue
->
dlsch
[
0
]
[
0
]
&&
ue
->
dlsch
[
0
][
0
][
0
]
&&
ue
->
dlsch
[
0
]
[
0
][
1
])
{
len
+=
sprintf
(
&
buffer
[
len
],
"[UE PROC] Saved PMI for DLSCH eNB %d : %jx (%p)
\n
"
,
eNB
,
pmi2hex_2Ar1
(
ue
->
dlsch
[
0
][
0
]
[
0
]
->
pmi_alloc
),
ue
->
dlsch
[
0
]
[
0
][
0
]);
len
+=
sprintf
(
&
buffer
[
len
],
"[UE PROC] eNB %d: dl_power_off = %d
\n
"
,
eNB
,
ue
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
dl_power_off
);
len
+=
sprintf
(
&
buffer
[
len
],
"[UE PROC] eNB %d: dl_power_off = %d
\n
"
,
eNB
,
ue
->
dlsch
[
0
][
0
]
[
0
]
->
harq_processes
[
0
]
->
dl_power_off
);
for
(
harq_pid
=
0
;
harq_pid
<
8
;
harq_pid
++
)
{
len
+=
sprintf
(
&
buffer
[
len
],
"[UE PROC] eNB %d: CW 1 harq_pid %d, mcs %d:"
,
eNB
,
harq_pid
,
ue
->
dlsch
[
0
][
1
]
->
harq_processes
[
0
]
->
mcs
);
len
+=
sprintf
(
&
buffer
[
len
],
"[UE PROC] eNB %d: CW 1 harq_pid %d, mcs %d:"
,
eNB
,
harq_pid
,
ue
->
dlsch
[
0
][
0
][
1
]
->
harq_processes
[
0
]
->
mcs
);
for
(
round
=
0
;
round
<
8
;
round
++
)
len
+=
sprintf
(
&
buffer
[
len
],
"%d/%d "
,
ue
->
dlsch
[
0
][
1
]
->
harq_processes
[
harq_pid
]
->
errors
[
round
],
ue
->
dlsch
[
0
][
1
]
->
harq_processes
[
harq_pid
]
->
trials
[
round
]);
ue
->
dlsch
[
0
][
0
][
1
]
->
harq_processes
[
harq_pid
]
->
errors
[
round
],
ue
->
dlsch
[
0
][
0
][
1
]
->
harq_processes
[
harq_pid
]
->
trials
[
round
]);
len
+=
sprintf
(
&
buffer
[
len
],
"
\n
"
);
}
}
...
...
openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
View file @
ff6d41b6
...
...
@@ -233,7 +233,7 @@ uint32_t ulsch_encoding(uint8_t *a,
LTE_DL_FRAME_PARMS
*
frame_parms
=&
ue
->
frame_parms
;
PHY_MEASUREMENTS
*
meas
=
&
ue
->
measurements
;
LTE_UE_ULSCH_t
*
ulsch
=
ue
->
ulsch
[
eNB_id
];
LTE_UE_DLSCH_t
**
dlsch
=
ue
->
dlsch
[
eNB_id
];
LTE_UE_DLSCH_t
**
dlsch
=
ue
->
dlsch
[
0
][
eNB_id
];
uint16_t
rnti
=
0xffff
;
if
(
!
ulsch
)
{
...
...
@@ -966,7 +966,7 @@ int ulsch_encoding_emul(uint8_t *ulsch_buffer,
{
LTE_UE_ULSCH_t
*
ulsch
=
ue
->
ulsch
[
eNB_id
];
LTE_UE_DLSCH_t
**
dlsch
=
ue
->
dlsch
[
eNB_id
];
LTE_UE_DLSCH_t
**
dlsch
=
ue
->
dlsch
[
0
][
eNB_id
];
PHY_MEASUREMENTS
*
meas
=
&
ue
->
measurements
;
uint8_t
tmode
=
ue
->
transmission_mode
[
eNB_id
];
uint16_t
rnti
=
ue
->
pdcch_vars
[
eNB_id
]
->
crnti
;
...
...
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
View file @
ff6d41b6
...
...
@@ -2066,7 +2066,7 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc,
// get local ue's ack
if
((
UE_index
>=
oai_emulation
.
info
.
first_ue_local
)
||
(
UE_index
<
(
oai_emulation
.
info
.
first_ue_local
+
oai_emulation
.
info
.
nb_ue_local
)))
{
get_ack
(
&
eNB
->
frame_parms
,
PHY_vars_UE_g
[
UE_id
][
CC_id
]
->
dlsch
[
0
][
0
]
->
harq_ack
,
PHY_vars_UE_g
[
UE_id
][
CC_id
]
->
dlsch
[
0
][
0
]
[
0
]
->
harq_ack
,
subframe
,
eNB
->
ulsch
[
UE_index
]
->
harq_processes
[
harq_pid
]
->
o_ACK
,
0
);
}
else
{
// get remote UEs' ack
...
...
openair1/PHY/MODULATION/slot_fep.c
View file @
ff6d41b6
openair1/PHY/TOOLS/lte_phy_scope.c
View file @
ff6d41b6
...
...
@@ -510,16 +510,16 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
int
beamforming_mode
=
phy_vars_ue
->
transmission_mode
[
eNB_id
]
>
6
?
phy_vars_ue
->
transmission_mode
[
eNB_id
]
:
0
;
if
(
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
!=
NULL
)
{
harq_pid
=
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
;
if
(
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
!=
NULL
)
{
harq_pid
=
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
current_harq_pid
;
if
(
harq_pid
>=
8
)
return
;
mcs
=
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
;
mcs
=
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
;
// Button 0
if
(
!
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
dl_power_off
)
{
if
(
!
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
dl_power_off
)
{
// we are in TM5
fl_show_object
(
form
->
button_0
);
}
...
...
@@ -530,12 +530,12 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
}
// coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
if
(
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
!=
NULL
)
{
if
(
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
!=
NULL
)
{
coded_bits_per_codeword
=
get_G
(
frame_parms
,
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
nb_rb
,
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rb_alloc_even
,
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
nb_rb
,
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rb_alloc_even
,
get_Qm
(
mcs
),
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
Nl
,
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
Nl
,
num_pdcch_symbols
,
frame
,
subframe
,
...
...
openair1/PHY/TOOLS/lte_phy_scope_tm4.c
View file @
ff6d41b6
...
...
@@ -448,11 +448,11 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
int
mcs1
=
0
;
unsigned
char
harq_pid
=
0
;
int
beamforming_mode
=
phy_vars_ue
->
transmission_mode
[
eNB_id
]
>
6
?
phy_vars_ue
->
transmission_mode
[
eNB_id
]
:
0
;
if
(
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
!=
NULL
)
{
harq_pid
=
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
;
if
(
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
!=
NULL
)
{
harq_pid
=
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
current_harq_pid
;
if
(
harq_pid
>=
8
)
return
;
mcs0
=
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
;
mcs0
=
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
mcs
;
// Button 0
/*
if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
...
...
@@ -461,23 +461,23 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
}
*/
}
if
(
phy_vars_ue
->
dlsch
[
eNB_id
][
1
]
!=
NULL
)
{
harq_pid
=
phy_vars_ue
->
dlsch
[
eNB_id
][
1
]
->
current_harq_pid
;
if
(
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
1
]
!=
NULL
)
{
harq_pid
=
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
1
]
->
current_harq_pid
;
if
(
harq_pid
>=
8
)
return
;
mcs1
=
phy_vars_ue
->
dlsch
[
eNB_id
][
1
]
->
harq_processes
[
harq_pid
]
->
mcs
;
mcs1
=
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
1
]
->
harq_processes
[
harq_pid
]
->
mcs
;
}
if
(
phy_vars_ue
->
pdcch_vars
[
eNB_id
]
!=
NULL
)
{
num_pdcch_symbols
=
phy_vars_ue
->
pdcch_vars
[
eNB_id
]
->
num_pdcch_symbols
;
}
// coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
if
(
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
!=
NULL
)
{
if
(
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
!=
NULL
)
{
mod0
=
get_Qm
(
mcs0
);
coded_bits_per_codeword0
=
get_G
(
frame_parms
,
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
nb_rb
,
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rb_alloc_even
,
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
nb_rb
,
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rb_alloc_even
,
get_Qm
(
mcs0
),
phy_vars_ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
Nl
,
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
Nl
,
num_pdcch_symbols
,
frame
,
subframe
,
...
...
@@ -486,13 +486,13 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
coded_bits_per_codeword0
=
0
;
//frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
mod0
=
0
;
}
if
(
phy_vars_ue
->
dlsch
[
eNB_id
][
1
]
!=
NULL
)
{
if
(
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
1
]
!=
NULL
)
{
mod1
=
get_Qm
(
mcs1
);
coded_bits_per_codeword1
=
get_G
(
frame_parms
,
phy_vars_ue
->
dlsch
[
eNB_id
][
1
]
->
harq_processes
[
harq_pid
]
->
nb_rb
,
phy_vars_ue
->
dlsch
[
eNB_id
][
1
]
->
harq_processes
[
harq_pid
]
->
rb_alloc_even
,
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
1
]
->
harq_processes
[
harq_pid
]
->
nb_rb
,
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
1
]
->
harq_processes
[
harq_pid
]
->
rb_alloc_even
,
get_Qm
(
mcs1
),
phy_vars_ue
->
dlsch
[
eNB_id
][
1
]
->
harq_processes
[
harq_pid
]
->
Nl
,
phy_vars_ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
1
]
->
harq_processes
[
harq_pid
]
->
Nl
,
num_pdcch_symbols
,
frame
,
subframe
,
...
...
openair1/PHY/defs.h
View file @
ff6d41b6
...
...
@@ -706,7 +706,7 @@ typedef struct {
LTE_DL_FRAME_PARMS
frame_parms_before_ho
;
LTE_UE_COMMON
common_vars
;
LTE_UE_PDSCH
*
pdsch_vars
[
2
][
NUMBER_OF_CONNECTED_eNB_MAX
+
1
];
LTE_UE_PDSCH
*
pdsch_vars
[
2
][
NUMBER_OF_CONNECTED_eNB_MAX
+
1
];
// two RxTx Threads
LTE_UE_PDSCH_FLP
*
pdsch_vars_flp
[
NUMBER_OF_CONNECTED_eNB_MAX
+
1
];
LTE_UE_PDSCH
*
pdsch_vars_SI
[
NUMBER_OF_CONNECTED_eNB_MAX
+
1
];
LTE_UE_PDSCH
*
pdsch_vars_ra
[
NUMBER_OF_CONNECTED_eNB_MAX
+
1
];
...
...
@@ -715,7 +715,7 @@ typedef struct {
LTE_UE_PBCH
*
pbch_vars
[
NUMBER_OF_CONNECTED_eNB_MAX
];
LTE_UE_PDCCH
*
pdcch_vars
[
NUMBER_OF_CONNECTED_eNB_MAX
];
LTE_UE_PRACH
*
prach_vars
[
NUMBER_OF_CONNECTED_eNB_MAX
];
LTE_UE_DLSCH_t
*
dlsch
[
NUMBER_OF_CONNECTED_eNB_MAX
][
2
];
LTE_UE_DLSCH_t
*
dlsch
[
2
][
NUMBER_OF_CONNECTED_eNB_MAX
][
2
];
// two RxTx Threads
LTE_UE_ULSCH_t
*
ulsch
[
NUMBER_OF_CONNECTED_eNB_MAX
];
LTE_UE_DLSCH_t
*
dlsch_SI
[
NUMBER_OF_CONNECTED_eNB_MAX
];
LTE_UE_DLSCH_t
*
dlsch_ra
[
NUMBER_OF_CONNECTED_eNB_MAX
];
...
...
@@ -872,7 +872,7 @@ typedef struct {
time_stats_t
phy_proc
;
time_stats_t
phy_proc_tx
;
time_stats_t
phy_proc_rx
;
time_stats_t
phy_proc_rx
[
2
]
;
uint32_t
use_ia_receiver
;
...
...
@@ -885,6 +885,10 @@ typedef struct {
time_stats_t
ulsch_interleaving_stats
;
time_stats_t
ulsch_multiplexing_stats
;
time_stats_t
generic_stat
;
time_stats_t
pdsch_procedures_stat
;
time_stats_t
dlsch_procedures_stat
;
time_stats_t
ofdm_demod_stats
;
time_stats_t
dlsch_rx_pdcch_stats
;
time_stats_t
rx_dft_stats
;
...
...
openair1/SCHED/phy_procedures_lte_ue.c
View file @
ff6d41b6
...
...
@@ -75,6 +75,7 @@ fifo_dump_emos_UE emos_dump_UE;
extern
int
oai_exit
;
extern
double
cpuf
;
...
...
@@ -90,10 +91,10 @@ void dump_dlsch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subf
uint8_t
nsymb
=
(
ue
->
frame_parms
.
Ncp
==
0
)
?
14
:
12
;
coded_bits_per_codeword
=
get_G
(
&
ue
->
frame_parms
,
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
nb_rb
,
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rb_alloc_even
,
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
Qm
,
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
Nl
,
ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
nb_rb
,
ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
rb_alloc_even
,
ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
Qm
,
ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
harq_pid
]
->
Nl
,
ue
->
pdcch_vars
[
eNB_id
]
->
num_pdcch_symbols
,
proc
->
frame_rx
,
subframe
,
...
...
@@ -268,19 +269,20 @@ void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
uint8_t
i
,
j
,
k
,
s
;
PHY_VARS_UE
*
ue
=
PHY_vars_UE_g
[
Mod_id
][
CC_id
];
//[NUMBER_OF_CONNECTED_eNB_MAX][2];
//[NUMBER_OF_RX_THREAD=2][NUMBER_OF_CONNECTED_eNB_MAX][2];
for
(
int
l
=
0
;
l
<
2
;
l
++
)
{
for
(
i
=
0
;
i
<
NUMBER_OF_CONNECTED_eNB_MAX
;
i
++
)
{
for
(
j
=
0
;
j
<
2
;
j
++
)
{
//DL HARQ
if
(
ue
->
dlsch
[
i
][
j
])
{
for
(
k
=
0
;
k
<
NUMBER_OF_HARQ_PID_MAX
&&
ue
->
dlsch
[
i
][
j
]
->
harq_processes
[
k
];
k
++
)
{
ue
->
dlsch
[
i
][
j
]
->
harq_processes
[
k
]
->
status
=
SCH_IDLE
;
if
(
ue
->
dlsch
[
l
]
[
i
][
j
])
{
for
(
k
=
0
;
k
<
NUMBER_OF_HARQ_PID_MAX
&&
ue
->
dlsch
[
l
]
[
i
][
j
]
->
harq_processes
[
k
];
k
++
)
{
ue
->
dlsch
[
l
]
[
i
][
j
]
->
harq_processes
[
k
]
->
status
=
SCH_IDLE
;
for
(
s
=
0
;
s
<
10
;
s
++
)
{
// reset ACK/NACK bit to DTX for all subframes s = 0..9
ue
->
dlsch
[
i
][
j
]
->
harq_ack
[
s
].
ack
=
2
;
ue
->
dlsch
[
i
][
j
]
->
harq_ack
[
s
].
send_harq_status
=
0
;
ue
->
dlsch
[
i
][
j
]
->
harq_ack
[
s
].
vDAI_UL
=
0xff
;
ue
->
dlsch
[
i
][
j
]
->
harq_ack
[
s
].
vDAI_DL
=
0xff
;
ue
->
dlsch
[
l
]
[
i
][
j
]
->
harq_ack
[
s
].
ack
=
2
;
ue
->
dlsch
[
l
]
[
i
][
j
]
->
harq_ack
[
s
].
send_harq_status
=
0
;
ue
->
dlsch
[
l
]
[
i
][
j
]
->
harq_ack
[
s
].
vDAI_UL
=
0xff
;
ue
->
dlsch
[
l
]
[
i
][
j
]
->
harq_ack
[
s
].
vDAI_DL
=
0xff
;
}
}
}
...
...
@@ -300,6 +302,7 @@ void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
ue
->
ulsch_Msg3_active
[
i
]
=
0
;
}
}
}
void
ra_failed
(
uint8_t
Mod_id
,
uint8_t
CC_id
,
uint8_t
eNB_index
)
...
...
@@ -327,7 +330,8 @@ void ra_succeeded(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
PHY_vars_UE_g
[
Mod_id
][
CC_id
]
->
ulsch
[
eNB_index
]
->
harq_processes
[
i
])
{
PHY_vars_UE_g
[
Mod_id
][
CC_id
]
->
ulsch
[
eNB_index
]
->
harq_processes
[
i
]
->
status
=
IDLE
;
PHY_vars_UE_g
[
Mod_id
][
CC_id
]
->
dlsch
[
eNB_index
][
0
]
->
harq_processes
[
i
]
->
round
=
0
;
PHY_vars_UE_g
[
Mod_id
][
CC_id
]
->
dlsch
[
0
][
eNB_index
][
0
]
->
harq_processes
[
i
]
->
round
=
0
;
PHY_vars_UE_g
[
Mod_id
][
CC_id
]
->
dlsch
[
1
][
eNB_index
][
0
]
->
harq_processes
[
i
]
->
round
=
0
;
}
}
...
...
@@ -364,7 +368,7 @@ void process_timing_advance(uint8_t Mod_id,uint8_t CC_id,int16_t timing_advance)
PHY_vars_UE_g
[
Mod_id
][
CC_id
]
->
timing_advance
=
PHY_vars_UE_g
[
Mod_id
][
CC_id
]
->
timing_advance
+
timing_advance
*
4
;
//this is for 25RB only!!!
LOG_
D
(
PHY
,
"[UE %d] Got timing advance %d from MAC, new value %d
\n
"
,
Mod_id
,
timing_advance
,
PHY_vars_UE_g
[
Mod_id
][
CC_id
]
->
timing_advance
);
LOG_
I
(
PHY
,
"[UE %d] Got timing advance %d from MAC, new value %d
\n
"
,
Mod_id
,
timing_advance
,
PHY_vars_UE_g
[
Mod_id
][
CC_id
]
->
timing_advance
);
}
...
...
@@ -638,7 +642,7 @@ void ue_compute_srs_occasion(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id
uint8_t
pucch_ack_payload
[
2
];
if
(
get_ack
(
&
ue
->
frame_parms
,
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_ack
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
harq_ack
,
subframe_tx
,
pucch_ack_payload
,
0
)
>
0
)
{
is_sr_an_subframe
=
1
;
...
...
@@ -790,6 +794,7 @@ PUCCH_FMT_t get_pucch_format(lte_frame_type_t frame_type,
return
pucch_format2
;
}
}
return
pucch_format1a
;
}
uint16_t
get_n1_pucch
(
PHY_VARS_UE
*
ue
,
UE_rxtx_proc_t
*
proc
,
...
...
@@ -929,11 +934,11 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue,
n1_pucch1
=
get_Np
(
frame_parms
->
N_RB_DL
,
nCCE1
,
1
)
+
nCCE1
+
frame_parms
->
pucch_config_common
.
n1PUCCH_AN
;
// set ACK/NAK to values if not DTX
if
(
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_ack
[(
6
+
last_dl
)
%
10
].
send_harq_status
>
0
)
// n-6 // subframe 6 is to be ACK/NAKed
harq_ack1
=
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_ack
[(
6
+
last_dl
)
%
10
].
ack
;
if
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
harq_ack
[(
6
+
last_dl
)
%
10
].
send_harq_status
>
0
)
// n-6 // subframe 6 is to be ACK/NAKed
harq_ack1
=
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
harq_ack
[(
6
+
last_dl
)
%
10
].
ack
;
if
(
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_ack
[
5
+
last_dl
].
send_harq_status
>
0
)
// n-6 // subframe 5 is to be ACK/NAKed
harq_ack0
=
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_ack
[
5
+
last_dl
].
ack
;
if
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
harq_ack
[
5
+
last_dl
].
send_harq_status
>
0
)
// n-6 // subframe 5 is to be ACK/NAKed
harq_ack0
=
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
harq_ack
[
5
+
last_dl
].
ack
;
if
(
harq_ack1
!=
2
)
{
// n-6 // subframe 6,8,0 and maybe 5,7,9 is to be ACK/NAKed
...
...
@@ -1040,10 +1045,10 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt
int
subframe_tx
=
proc
->
subframe_tx
;
int
frame_tx
=
proc
->
frame_tx
;
int
ulsch_start
;
int
overflow
=
0
;
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
int
overflow
=
0
;
int
k
,
l
;
int
dummy_tx_buffer
[
frame_parms
->
samples_per_tti
]
__attribute__
((
aligned
(
16
)));
int
dummy_tx_buffer
[
3840
*
4
]
__attribute__
((
aligned
(
16
)));
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_COMMON
,
VCD_FUNCTION_IN
);
...
...
@@ -1069,23 +1074,19 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt
ulsch_start
=
(
frame_parms
->
samples_per_tti
*
subframe_tx
)
-
ue
->
N_TA_offset
;
//-ue->timing_advance;
#endif //else EXMIMO
//
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
if
(
empty_subframe
)
{
//#if 1
overflow
=
ulsch_start
-
9
*
frame_parms
->
samples_per_tti
;
for
(
aa
=
0
;
aa
<
frame_parms
->
nb_antennas_tx
;
aa
++
)
{
if
(
overflow
>
0
)
{
memset
(
&
ue
->
common_vars
.
txdata
[
aa
][
ulsch_start
],
0
,
4
*
(
frame_parms
->
samples_per_tti
-
overflow
));
memset
(
&
ue
->
common_vars
.
txdata
[
aa
][
ulsch_start
],
0
,
4
*
cmin
(
frame_parms
->
samples_per_tti
-
overflow
,
frame_parms
->
samples_per_tti
));
if
(
overflow
>
0
)
memset
(
&
ue
->
common_vars
.
txdata
[
aa
][
0
],
0
,
4
*
overflow
);
}
else
{
memset
(
&
ue
->
common_vars
.
txdata
[
aa
][
ulsch_start
],
0
,
4
*
frame_parms
->
samples_per_tti
);
}
}
/*#else
overflow = ulsch_start - 9*frame_parms->samples_per_tti;
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
...
...
@@ -1102,7 +1103,7 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt
#endif*/
return
;
}
//
#endif
#endif
if
((
frame_tx
%
100
)
==
0
)
LOG_D
(
PHY
,
"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d
\n
"
,
...
...
@@ -1336,7 +1337,8 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
uint8_t
ulsch_input_buffer
[
5477
]
__attribute__
((
aligned
(
32
)));
uint8_t
access_mode
;
uint8_t
Nbundled
=
0
;
uint8_t
ack_status
=
0
;
uint8_t
ack_status_cw0
=
0
;
uint8_t
ack_status_cw1
=
0
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
,
VCD_FUNCTION_IN
);
...
...
@@ -1437,11 +1439,16 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
round
=
0
;
}
ack_status
=
reset_ack
(
&
ue
->
frame_parms
,
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_ack
,
ack_status
_cw0
=
reset_ack
(
&
ue
->
frame_parms
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
]
[
eNB_id
][
0
]
->
harq_ack
,
subframe_tx
,
ue
->
ulsch
[
eNB_id
]
->
o_ACK
,
0
);
Nbundled
=
ack_status
;
ack_status_cw1
=
reset_ack
(
&
ue
->
frame_parms
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
1
]
->
harq_ack
,
subframe_tx
,
ue
->
ulsch
[
eNB_id
]
->
o_ACK
,
1
);
Nbundled
=
ack_status_cw0
;
first_rb
=
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
first_rb
;
nb_rb
=
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
nb_rb
;
...
...
@@ -1449,31 +1456,31 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
if
(
ack_status
>
0
)
{
if
(
ack_status
_cw0
>
0
)
{
// check if we received a PDSCH at subframe_tx - 4
// ==> send ACK/NACK on PUSCH
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
O_ACK
=
1
;
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
O_ACK
=
ack_status_cw0
+
ack_status_cw
1
;
#if T_TRACER
if
(
ue
->
ulsch
[
eNB_id
]
->
o_ACK
[
0
])
{
LOG_I
(
PHY
,
"PUSCH ACK
\n
"
);
T
(
T_UE_PHY_DLSCH_UE_ACK
,
T_INT
(
eNB_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
Mod_id
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
));
T
(
T_UE_PHY_DLSCH_UE_ACK
,
T_INT
(
eNB_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
Mod_id
),
T_INT
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
),
T_INT
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
current_harq_pid
));
}
else
{
LOG_I
(
PHY
,
"PUSCH NACK
\n
"
);
T
(
T_UE_PHY_DLSCH_UE_NACK
,
T_INT
(
eNB_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
Mod_id
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
));
T
(
T_UE_PHY_DLSCH_UE_NACK
,
T_INT
(
eNB_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
Mod_id
),
T_INT
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
),
T_INT
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
current_harq_pid
));
}
#endif
LOG_
D
(
PHY
,
"[UE %d][PDSCH %x] AbsSubFrame %d.%d Generating ACK (%d,%d) for %d bits on PUSCH
\n
"
,
LOG_
I
(
PHY
,
"[UE %d][PDSCH %x] AbsSubFrame %d.%d Generating ACK (%d,%d) for %d bits on PUSCH
\n
"
,
Mod_id
,
ue
->
ulsch
[
eNB_id
]
->
rnti
,
frame_tx
%
1024
,
subframe_tx
,
frame_tx
,
subframe_tx
,
ue
->
ulsch
[
eNB_id
]
->
o_ACK
[
0
],
ue
->
ulsch
[
eNB_id
]
->
o_ACK
[
1
],
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
O_ACK
);
}
...
...
@@ -1530,6 +1537,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
mac_xface
->
macphy_exit
(
"Error in ulsch_coding"
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX
,
VCD_FUNCTION_OUT
);
stop_meas
(
&
ue
->
phy_proc_tx
);
printf
(
"------FULL TX PROC : %5.2f ------
\n
"
,
ue
->
phy_proc_tx
.
p_time
/
(
cpuf
*
1000
.
0
));
return
;
}
}
...
...
@@ -1636,8 +1644,8 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
T
(
T_UE_PHY_PUSCH_TX_POWER
,
T_INT
(
eNB_id
),
T_INT
(
Mod_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
ue
->
tx_power_dBm
[
subframe_tx
]),
T_INT
(
tx_amp
),
T_INT
(
ue
->
ulsch
[
eNB_id
]
->
f_pusch
),
T_INT
(
get_PL
(
Mod_id
,
0
,
eNB_id
)),
T_INT
(
nb_rb
));
#endif
LOG_D
(
PHY
,
"[UE %d][PUSCH %d]
AbsSubFrame %d.
%d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d
\n
"
,
Mod_id
,
harq_pid
,
frame_tx
%
1024
,
subframe_tx
,
ue
->
tx_power_dBm
[
subframe_tx
],
ue
->
tx_power_max_dBm
,
tx_amp
);
LOG_D
(
PHY
,
"[UE %d][PUSCH %d]
Frame %d subframe
%d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d
\n
"
,
Mod_id
,
harq_pid
,
frame_tx
,
subframe_tx
,
ue
->
tx_power_dBm
[
subframe_tx
],
ue
->
tx_power_max_dBm
,
tx_amp
);
start_meas
(
&
ue
->
ulsch_modulation_stats
);
ulsch_modulation
(
ue
->
common_vars
.
txdataF
,
tx_amp
,
...
...
@@ -1770,13 +1778,13 @@ void get_pucch_param(PHY_VARS_UE *ue,
{
pucch_resource
[
0
]
=
get_n1_pucch
(
ue
,
proc
,
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_ack
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
harq_ack
,
eNB_id
,
ack_payload
,
SR
);
pucch_payload
[
0
]
=
ack_payload
[
0
];
//
pucch_payload[1] = ack_payload[1];
pucch_payload
[
1
]
=
1
;
pucch_payload
[
1
]
=
ack_payload
[
1
];
//
pucch_payload[1] = 1;
}
break
;
...
...
@@ -1785,7 +1793,7 @@ void get_pucch_param(PHY_VARS_UE *ue,
pucch_resource
[
0
]
=
ue
->
cqi_report_config
[
eNB_id
].
CQI_ReportPeriodic
.
cqi_PUCCH_ResourceIndex
;
if
(
cqi_report
)
{
pucch_payload
[
0
]
=
get_pucch2_cqi
(
ue
,
eNB_id
,
plength
);
pucch_payload
[
0
]
=
get_pucch2_cqi
(
ue
,
eNB_id
,
(
int
*
)
plength
);
}
else
{
...
...
@@ -1806,14 +1814,12 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
uint8_t
pucch_ack_payload
[
2
];
uint8_t
n
1_pucch
,
n
2_pucch
;
uint8_t
n2_pucch
;
uint16_t
pucch_resource
;
ANFBmode_t
bundling_flag
;
PUCCH_FMT_t
format
;
uint8_t
SR_payload
;
uint16_t
CQI_payload
;
uint16_t
RI_payload
;
uint8_t
pucch_payload
[
2
];
uint16_t
len
;
...
...
@@ -1824,13 +1830,11 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
int
CC_id
=
ue
->
CC_id
;
int
tx_amp
;
int16_t
Po_PUCCH
;
uint8_t
ack_status
=
0
;
uint8_t
ack_status_cw0
=
0
;
uint8_t
ack_status_cw1
=
0
;
uint8_t
nb_cw
=
0
;
uint8_t
cqi_status
=
0
;
uint8_t
ri_status
=
0
;
uint8_t
ack_sr_generated
=
0
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PUCCH
,
VCD_FUNCTION_IN
);
...
...
@@ -1891,13 +1895,13 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
}
ack_status_cw0
=
reset_ack
(
&
ue
->
frame_parms
,
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_ack
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
harq_ack
,
subframe_tx
,
pucch_ack_payload
,
0
);
ack_status_cw1
=
reset_ack
(
&
ue
->
frame_parms
,
ue
->
dlsch
[
eNB_id
][
1
]
->
harq_ack
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
1
]
->
harq_ack
,
subframe_tx
,
pucch_ack_payload
,
1
);
...
...
@@ -1936,11 +1940,10 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
SR_payload
,
cqi_status
,
&
pucch_resource
,
&
pucch_payload
,
(
uint8_t
*
)
&
pucch_payload
,
&
len
);
LOG_D
(
PHY
,
"PUCCH feedback AbsSubframe %d.%d SR %d NbCW %d AckNack %d.%d CQI %d RI %d format %d pucch_resource %d pucch_payload %d %d
\n
"
,
frame_tx
%
1024
,
subframe_tx
,
SR_payload
,
nb_cw
,
pucch_ack_payload
[
0
],
pucch_ack_payload
[
1
],
cqi_status
,
ri_status
,
format
,
pucch_resource
,
pucch_payload
[
0
],
pucch_payload
[
1
]);
LOG_D
(
PHY
,
"PUCCH feedback AbsSubframe %d.%d SR %d NbCW %d AckNack %d.%d CQI %d RI %d format %d pucch_resource %d pucch_payload %d %d
\n
"
,
frame_tx
,
subframe_tx
,
SR_payload
,
nb_cw
,
pucch_ack_payload
[
0
],
pucch_ack_payload
[
1
],
cqi_status
,
ri_status
,
format
,
pucch_resource
,
pucch_payload
[
0
],
pucch_payload
[
1
]);
// Part - IV
...
...
@@ -1971,13 +1974,13 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
#endif
#if T_TRACER
T
(
T_UE_PHY_PUCCH_TX_POWER
,
T_INT
(
eNB_id
),
T_INT
(
Mod_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
ue
->
tx_power_dBm
[
subframe_tx
]),
T_INT
(
tx_amp
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
g_pucch
),
T_INT
(
get_PL
(
ue
->
Mod_id
,
ue
->
CC_id
,
eNB_id
)));
T_INT
(
tx_amp
),
T_INT
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
g_pucch
),
T_INT
(
get_PL
(
ue
->
Mod_id
,
ue
->
CC_id
,
eNB_id
)));
#endif
if
(
format
==
pucch_format1
)
{
LOG_D
(
PHY
,
"[UE %d][SR %x] AbsSubframe %d.%d Generating PUCCH 1 (SR for PUSCH), an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, Po_PUCCH %d
\n
"
,
Mod_id
,
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
,
frame_tx
,
subframe_tx
,
frame_parms
->
soundingrs_ul_config_common
.
ackNackSRS_SimultaneousTransmission
,
isShortenPucch
,
...
...
@@ -1989,7 +1992,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
if
(
SR_payload
>
0
)
{
LOG_D
(
PHY
,
"[UE %d][SR %x] AbsSubFrame %d.%d Generating PUCCH %s payload %d,%d (with SR for PUSCH), an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, Po_PUCCH %d, amp %d
\n
"
,
Mod_id
,
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
,
frame_tx
%
1024
,
subframe_tx
,
(
format
==
pucch_format1a
?
"1a"
:
(
format
==
pucch_format1b
?
"1b"
:
"??"
)),
...
...
@@ -2002,7 +2005,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
}
else
{
LOG_D
(
PHY
,
"[UE %d][PDSCH %x] AbsSubFrame %d.%d rx_offset_diff: %d, Generating PUCCH %s, an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d
\n
"
,
Mod_id
,
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
,
frame_tx
%
1024
,
subframe_tx
,
ue
->
rx_offset_diff
,
(
format
==
pucch_format1a
?
"1a"
:
(
format
==
pucch_format1b
?
"1b"
:
"??"
)),
...
...
@@ -2017,13 +2020,13 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
#if T_TRACER
if
(
pucch_payload
[
0
])
{
T
(
T_UE_PHY_DLSCH_UE_ACK
,
T_INT
(
eNB_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
Mod_id
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
));
T
(
T_UE_PHY_DLSCH_UE_ACK
,
T_INT
(
eNB_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
Mod_id
),
T_INT
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
),
T_INT
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
current_harq_pid
));
}
else
{
T
(
T_UE_PHY_DLSCH_UE_NACK
,
T_INT
(
eNB_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
Mod_id
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
));
T
(
T_UE_PHY_DLSCH_UE_NACK
,
T_INT
(
eNB_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
Mod_id
),
T_INT
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
),
T_INT
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
current_harq_pid
));
}
#endif
...
...
@@ -2076,12 +2079,12 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
#endif
#if T_TRACER
T
(
T_UE_PHY_PUCCH_TX_POWER
,
T_INT
(
eNB_id
),
T_INT
(
Mod_id
),
T_INT
(
frame_tx
%
1024
),
T_INT
(
subframe_tx
),
T_INT
(
ue
->
tx_power_dBm
[
subframe_tx
]),
T_INT
(
tx_amp
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
g_pucch
),
T_INT
(
get_PL
(
ue
->
Mod_id
,
ue
->
CC_id
,
eNB_id
)));
T_INT
(
tx_amp
),
T_INT
(
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
g_pucch
),
T_INT
(
get_PL
(
ue
->
Mod_id
,
ue
->
CC_id
,
eNB_id
)));
#endif
LOG_
D
(
PHY
,
"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2 (RI or CQI), n2_pucch %d, Po_PUCCH %d, isShortenPucch %d, amp %d
\n
"
,
LOG_
I
(
PHY
,
"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2 (RI or CQI), n2_pucch %d, Po_PUCCH %d, isShortenPucch %d, amp %d
\n
"
,
Mod_id
,
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
,
frame_tx
%
1024
,
subframe_tx
,
n2_pucch
,
Po_PUCCH
,
...
...
@@ -2106,13 +2109,13 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
case
pucch_format2a
:
LOG_I
(
PHY
,
"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2a (RI or CQI) Ack/Nack 1bit
\n
"
,
Mod_id
,
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
,
frame_tx
%
1024
,
subframe_tx
);
break
;
case
pucch_format2b
:
LOG_I
(
PHY
,
"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2b (RI or CQI) Ack/Nack 2bits
\n
"
,
Mod_id
,
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
,
frame_tx
%
1024
,
subframe_tx
);
break
;
default:
...
...
@@ -2254,7 +2257,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui
// reset DL ACK/NACK status
reset_ack
(
&
ue
->
frame_parms
,
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_ack
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
harq_ack
,
subframe_tx
,
ue
->
ulsch
[
eNB_id
]
->
o_ACK
,
0
);
...
...
@@ -2451,8 +2454,8 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id)
emos_dump_UE
.
total_TBS_last
=
ue
->
total_TBS_last
[
eNB_id
];
emos_dump_UE
.
bitrate
=
ue
->
bitrate
[
eNB_id
];
emos_dump_UE
.
total_received_bits
=
ue
->
total_received_bits
[
eNB_id
];
emos_dump_UE
.
pmi_saved
=
ue
->
dlsch
[
eNB_id
][
0
]
->
pmi_alloc
;
emos_dump_UE
.
mcs
=
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
]
->
mcs
;
emos_dump_UE
.
pmi_saved
=
ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
pmi_alloc
;
emos_dump_UE
.
mcs
=
ue
->
dlsch
[
subframe
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
ue
->
dlsch
[
subframe
&
0x1
]
[
eNB_id
][
0
]
->
current_harq_pid
]
->
mcs
;
emos_dump_UE
.
use_ia_receiver
=
openair_daq_vars
.
use_ia_receiver
;
bytes
=
rtf_put
(
CHANSOUNDER_FIFO_MINOR
,
&
emos_dump_UE
,
sizeof
(
fifo_dump_emos_UE
));
...
...
@@ -2859,7 +2862,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
(
void
*
)
&
dci_alloc_rx
[
i
].
dci_pdu
,
ue
->
pdcch_vars
[
eNB_id
]
->
crnti
,
dci_alloc_rx
[
i
].
format
,
ue
->
dlsch
[
eNB_id
],
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
],
&
ue
->
frame_parms
,
ue
->
pdsch_config_dedicated
,
SI_RNTI
,
...
...
@@ -2876,7 +2879,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
(
dci_alloc_rx
[
i
].
format
==
format2A
)
||
(
dci_alloc_rx
[
i
].
format
==
format2B
))
{
ue
->
dlsch
[
eNB_id
][
0
]
->
g_pucch
+=
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
]
->
delta_PUCCH
;
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
g_pucch
+=
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
harq_processes
[
ue
->
dlsch
[
subframe_rx
&
0x1
]
[
eNB_id
][
0
]
->
current_harq_pid
]
->
delta_PUCCH
;
}
ue
->
dlsch_received
[
eNB_id
]
++
;
...
...
@@ -2884,7 +2887,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
#ifdef DEBUG_PHY_PROC
LOG_D
(
PHY
,
"[UE %d] Generated UE DLSCH C_RNTI format %d
\n
"
,
ue
->
Mod_id
,
dci_alloc_rx
[
i
].
format
);
dump_dci
(
&
ue
->
frame_parms
,
&
dci_alloc_rx
[
i
]);
LOG_D
(
PHY
,
"[UE %d] *********** dlsch->active in subframe %d=> %d
\n
"
,
ue
->
Mod_id
,
subframe_rx
,
ue
->
dlsch
[
eNB_id
][
0
]
->
active
);
LOG_D
(
PHY
,
"[UE %d] *********** dlsch->active in subframe %d=> %d
\n
"
,
ue
->
Mod_id
,
subframe_rx
,
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
active
);
#endif
// we received a CRNTI, so we're in PUSCH
...
...
@@ -3262,7 +3265,14 @@ void ue_pdsch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, PDSC
dual_stream_UE
=
1
;
eNB_id_i
=
ue
->
n_connected_eNB
;
i_mod
=
dlsch0
->
harq_processes
[
harq_pid
]
->
Qm
;
}
else
{
}
else
if
((
pdsch
==
PDSCH
)
&&
(
ue
->
transmission_mode
[
eNB_id
]
==
3
))
{
dual_stream_UE
=
rx_IC_dual_stream
;
eNB_id_i
=
eNB_id
;
i_mod
=
0
;
}
else
{
dual_stream_UE
=
0
;
eNB_id_i
=
eNB_id
+
1
;
i_mod
=
0
;
...
...
@@ -3401,11 +3411,34 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
int
harq_pid
;
int
frame_rx
=
proc
->
frame_rx
;
int
subframe_rx
=
proc
->
subframe_rx
;
int
ret
=
0
;
int
ret
=
0
,
ret1
=
0
;
int
CC_id
=
ue
->
CC_id
;
LTE_UE_PDSCH
*
pdsch_vars
;
uint8_t
is_cw0_active
=
0
;
uint8_t
is_cw1_active
=
0
;
if
(
dlsch0
&&
(
!
dlsch1
))
{
if
(
dlsch0
==
NULL
)
AssertFatal
(
0
,
"dlsch0 should be defined at this level
\n
"
);
harq_pid
=
dlsch0
->
current_harq_pid
;
is_cw0_active
=
dlsch0
->
harq_processes
[
harq_pid
]
->
status
;
if
(
dlsch1
)
is_cw1_active
=
dlsch1
->
harq_processes
[
harq_pid
]
->
status
;
LOG_D
(
PHY
,
"AbsSubframe %d.%d Start Turbo Decoder for CW0 [harq_pid %d] ? %d
\n
"
,
frame_rx
%
1024
,
subframe_rx
,
harq_pid
,
is_cw0_active
);
LOG_D
(
PHY
,
"AbsSubframe %d.%d Start Turbo Decoder for CW1 [harq_pid %d] ? %d
\n
"
,
frame_rx
%
1024
,
subframe_rx
,
harq_pid
,
is_cw1_active
);
if
(
is_cw0_active
&&
is_cw1_active
)
{
dlsch0
->
Kmimo
=
2
;
dlsch1
->
Kmimo
=
2
;
}
else
{
dlsch0
->
Kmimo
=
1
;
}
if
(
1
)
{
switch
(
pdsch
)
{
case
SI_PDSCH
:
pdsch_vars
=
ue
->
pdsch_vars_SI
[
eNB_id
];
...
...
@@ -3432,8 +3465,6 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
}
harq_pid
=
dlsch0
->
current_harq_pid
;
if
(
frame_rx
<
*
dlsch_errors
)
*
dlsch_errors
=
0
;
...
...
@@ -3449,6 +3480,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
if
(
abstraction_flag
==
0
)
{
// start turbo decode for CW 0
dlsch0
->
harq_processes
[
harq_pid
]
->
G
=
get_G
(
&
ue
->
frame_parms
,
dlsch0
->
harq_processes
[
harq_pid
]
->
nb_rb
,
dlsch0
->
harq_processes
[
harq_pid
]
->
rb_alloc_even
,
...
...
@@ -3468,6 +3500,13 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
subframe_rx
<<
1
);
stop_meas
(
&
ue
->
dlsch_unscrambling_stats
);
//LOG_I(PHY,"start turbo decode for CW 0 --> nb_rb %d \n", dlsch0->harq_processes[harq_pid]->nb_rb);
//LOG_I(PHY,"start turbo decode for CW 0 --> rb_alloc_even %x \n", dlsch0->harq_processes[harq_pid]->rb_alloc_even);
//LOG_I(PHY,"start turbo decode for CW 0 --> Qm %d \n", dlsch0->harq_processes[harq_pid]->Qm);
//LOG_I(PHY,"start turbo decode for CW 0 --> Nl %d \n", dlsch0->harq_processes[harq_pid]->Nl);
//LOG_I(PHY,"start turbo decode for CW 0 --> G %d \n", dlsch0->harq_processes[harq_pid]->G);
//LOG_I(PHY,"start turbo decode for CW 0 --> Kmimo %d \n", dlsch0->Kmimo);
start_meas
(
&
ue
->
dlsch_decoding_stats
);
ret
=
dlsch_decoding
(
ue
,
pdsch_vars
->
llr
[
0
],
...
...
@@ -3480,6 +3519,60 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
pdsch
==
PDSCH
?
1
:
0
,
dlsch0
->
harq_processes
[
harq_pid
]
->
TBS
>
256
?
1
:
0
);
stop_meas
(
&
ue
->
dlsch_decoding_stats
);
printf
(
" --> Unscrambling for CW0 %5.3f
\n
"
,
(
ue
->
dlsch_unscrambling_stats
.
p_time
)
/
(
cpuf
*
1000
.
0
));
printf
(
" --> Turbo Decoding for CW0 %5.3f
\n
"
,
(
ue
->
dlsch_decoding_stats
.
p_time
)
/
(
cpuf
*
1000
.
0
));
if
(
is_cw1_active
)
{
// start turbo decode for CW 1
dlsch1
->
harq_processes
[
harq_pid
]
->
G
=
get_G
(
&
ue
->
frame_parms
,
dlsch1
->
harq_processes
[
harq_pid
]
->
nb_rb
,
dlsch1
->
harq_processes
[
harq_pid
]
->
rb_alloc_even
,
dlsch1
->
harq_processes
[
harq_pid
]
->
Qm
,
dlsch1
->
harq_processes
[
harq_pid
]
->
Nl
,
ue
->
pdcch_vars
[
eNB_id
]
->
num_pdcch_symbols
,
frame_rx
,
subframe_rx
,
ue
->
transmission_mode
[
eNB_id
]
<
7
?
0
:
ue
->
transmission_mode
[
eNB_id
]);
start_meas
(
&
ue
->
dlsch_unscrambling_stats
);
dlsch_unscrambling
(
&
ue
->
frame_parms
,
0
,
dlsch1
,
dlsch1
->
harq_processes
[
harq_pid
]
->
G
,
pdsch_vars
->
llr
[
1
],
1
,
subframe_rx
<<
1
);
stop_meas
(
&
ue
->
dlsch_unscrambling_stats
);
//LOG_I(PHY,"start turbo decode for CW 1 --> nb_rb %d \n", dlsch1->harq_processes[harq_pid]->nb_rb);
//LOG_I(PHY,"start turbo decode for CW 1 --> rb_alloc_even %x \n", dlsch1->harq_processes[harq_pid]->rb_alloc_even);
//LOG_I(PHY,"start turbo decode for CW 1 --> Qm %d \n", dlsch1->harq_processes[harq_pid]->Qm);
//LOG_I(PHY,"start turbo decode for CW 1 --> Nl %d \n", dlsch1->harq_processes[harq_pid]->Nl);
//LOG_I(PHY,"start turbo decode for CW 1 --> G %d \n", dlsch1->harq_processes[harq_pid]->G);
//LOG_I(PHY,"start turbo decode for CW 1 --> Kmimo %d \n", dlsch1->Kmimo);
start_meas
(
&
ue
->
dlsch_decoding_stats
);
ret1
=
dlsch_decoding
(
ue
,
pdsch_vars
->
llr
[
1
],
&
ue
->
frame_parms
,
dlsch1
,
dlsch1
->
harq_processes
[
harq_pid
],
frame_rx
,
subframe_rx
,
harq_pid
,
pdsch
==
PDSCH
?
1
:
0
,
dlsch1
->
harq_processes
[
harq_pid
]
->
TBS
>
256
?
1
:
0
);
stop_meas
(
&
ue
->
dlsch_decoding_stats
);
printf
(
" --> Unscrambling for CW1 %5.3f
\n
"
,
(
ue
->
dlsch_unscrambling_stats
.
p_time
)
/
(
cpuf
*
1000
.
0
));
printf
(
" --> Turbo Decoding for CW1 %5.3f
\n
"
,
(
ue
->
dlsch_decoding_stats
.
p_time
)
/
(
cpuf
*
1000
.
0
));
}
}
else
{
...
...
@@ -3492,12 +3585,13 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
#endif
}
// Check CRC for CW 0
if
(
ret
==
(
1
+
dlsch0
->
max_turbo_iterations
))
{
*
dlsch_errors
=*
dlsch_errors
+
1
;
if
(
dlsch0
->
rnti
!=
0xffff
)
{
LOG_
D
(
PHY
,
"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH
in error (rv %d,mcs %d,TBS %d)
\n
"
,
LOG_
I
(
PHY
,
"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH CW0
in error (rv %d,mcs %d,TBS %d)
\n
"
,
ue
->
Mod_id
,
dlsch0
->
rnti
,
harq_pid
,
frame_rx
,
subframe_rx
,
dlsch0
->
harq_processes
[
harq_pid
]
->
rvidx
,
...
...
@@ -3509,7 +3603,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
}
else
{
if
(
dlsch0
->
rnti
!=
0xffff
)
{
LOG_
D
(
PHY
,
"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH
(rv %d,mcs %d,TBS %d)
\n
"
,
LOG_
I
(
PHY
,
"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH CW0
(rv %d,mcs %d,TBS %d)
\n
"
,
ue
->
Mod_id
,
dlsch0
->
rnti
,
harq_pid
,
frame_rx
,
subframe_rx
,
dlsch0
->
harq_processes
[
harq_pid
]
->
rvidx
,
...
...
@@ -3574,6 +3668,49 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
dlsch0
->
harq_processes
[
dlsch0
->
current_harq_pid
]
->
TBS
;
}
// Check CRC for CW 1
if
(
is_cw1_active
)
{
if
(
ret1
==
(
1
+
dlsch0
->
max_turbo_iterations
))
{
LOG_I
(
PHY
,
"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH CW1 in error (rv %d,mcs %d,TBS %d)
\n
"
,
ue
->
Mod_id
,
dlsch0
->
rnti
,
harq_pid
,
frame_rx
,
subframe_rx
,
dlsch0
->
harq_processes
[
harq_pid
]
->
rvidx
,
dlsch0
->
harq_processes
[
harq_pid
]
->
mcs
,
dlsch0
->
harq_processes
[
harq_pid
]
->
TBS
);
}
else
{
LOG_I
(
PHY
,
"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH CW1 (rv %d,mcs %d,TBS %d)
\n
"
,
ue
->
Mod_id
,
dlsch0
->
rnti
,
harq_pid
,
frame_rx
,
subframe_rx
,
dlsch0
->
harq_processes
[
harq_pid
]
->
rvidx
,
dlsch0
->
harq_processes
[
harq_pid
]
->
mcs
,
dlsch0
->
harq_processes
[
harq_pid
]
->
TBS
);
if
(
ue
->
mac_enabled
==
1
)
{
switch
(
pdsch
)
{
case
PDSCH
:
if
(
is_cw1_active
)
mac_xface
->
ue_send_sdu
(
ue
->
Mod_id
,
CC_id
,
frame_rx
,
subframe_rx
,
dlsch1
->
harq_processes
[
dlsch1
->
current_harq_pid
]
->
b
,
dlsch1
->
harq_processes
[
dlsch1
->
current_harq_pid
]
->
TBS
>>
3
,
eNB_id
);
break
;
case
SI_PDSCH
:
case
P_PDSCH
:
case
RA_PDSCH
:
case
PDSCH1
:
case
PMCH
:
AssertFatal
(
0
,
"exiting"
);
break
;
}
}
}
}
#ifdef DEBUG_PHY_PROC
...
...
@@ -3622,16 +3759,18 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
T_BUFFER
(
&
ue
->
common_vars
.
rxdata
[
0
][
subframe_rx
*
ue
->
frame_parms
.
samples_per_tti
],
ue
->
frame_parms
.
samples_per_tti
*
4
));
start_meas
(
&
ue
->
phy_proc_rx
);
// start timers
start_meas
(
&
ue
->
phy_proc_rx
[
subframe_rx
&
0x1
]);
start_meas
(
&
ue
->
generic_stat
);
pmch_flag
=
is_pmch_subframe
(
frame_rx
,
subframe_rx
,
&
ue
->
frame_parms
)
?
1
:
0
;
// deactivate reception until we scan pdcch
if
(
ue
->
dlsch
[
eNB_id
][
0
])
ue
->
dlsch
[
eNB_id
][
0
]
->
active
=
0
;
if
(
ue
->
dlsch
[
eNB_id
][
1
])
ue
->
dlsch
[
eNB_id
][
1
]
->
active
=
0
;
if
(
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
])
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
active
=
0
;
if
(
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
1
])
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
1
]
->
active
=
0
;
if
(
ue
->
dlsch_SI
[
eNB_id
])
ue
->
dlsch_SI
[
eNB_id
]
->
active
=
0
;
...
...
@@ -3717,15 +3856,18 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
0
);
// first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH)
stop_meas
(
&
ue
->
generic_stat
);
printf
(
"[SFN %d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f
\n
"
,
subframe_rx
,
ue
->
generic_stat
.
p_time
/
(
cpuf
*
1000
.
0
));
start_meas
(
&
ue
->
generic_stat
);
// do procedures for C-RNTI
if
(
ue
->
dlsch
[
eNB_id
][
0
]
->
active
==
1
)
{
if
(
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
active
==
1
)
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures
(
ue
,
proc
,
eNB_id
,
PDSCH
,
ue
->
dlsch
[
eNB_id
][
0
],
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
],
NULL
,
ue
->
pdcch_vars
[
eNB_id
]
->
num_pdcch_symbols
,
ue
->
frame_parms
.
symbols_per_tti
>>
1
,
...
...
@@ -3809,35 +3951,48 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
}
}
// not an S-subframe
stop_meas
(
&
ue
->
generic_stat
);
printf
(
"[SFN %d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f
\n
"
,
subframe_rx
,
ue
->
generic_stat
.
p_time
/
(
cpuf
*
1000
.
0
));
// run pbch procedures if subframe is 0
if
(
subframe_rx
==
0
)
ue_pbch_procedures
(
eNB_id
,
ue
,
proc
,
abstraction_flag
);
// do procedures for C-RNTI
if
(
ue
->
dlsch
[
eNB_id
][
0
]
->
active
==
1
)
{
if
(
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
active
==
1
)
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_IN
);
start_meas
(
&
ue
->
pdsch_procedures_stat
);
ue_pdsch_procedures
(
ue
,
proc
,
eNB_id
,
PDSCH
,
ue
->
dlsch
[
eNB_id
][
0
],
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
],
NULL
,
1
+
(
ue
->
frame_parms
.
symbols_per_tti
>>
1
),
ue
->
frame_parms
.
symbols_per_tti
-
1
,
abstraction_flag
);
stop_meas
(
&
ue
->
pdsch_procedures_stat
);
start_meas
(
&
ue
->
dlsch_procedures_stat
);
ue_dlsch_procedures
(
ue
,
proc
,
eNB_id
,
PDSCH
,
ue
->
dlsch
[
eNB_id
][
0
],
NULL
,
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
],
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
1
]
,
&
ue
->
dlsch_errors
[
eNB_id
],
mode
,
abstraction_flag
);
stop_meas
(
&
ue
->
dlsch_procedures_stat
);
printf
(
"[SFN %d] Slot1: Pdsch Proc %5.2f
\n
"
,
subframe_rx
,
ue
->
pdsch_procedures_stat
.
p_time
/
(
cpuf
*
1000
.
0
));
printf
(
"[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f
\n
"
,
subframe_rx
,
ue
->
dlsch_procedures_stat
.
p_time
/
(
cpuf
*
1000
.
0
));
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_OUT
);
}
start_meas
(
&
ue
->
generic_stat
);
// do procedures for SI-RNTI
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
ue_pdsch_procedures
(
ue
,
...
...
@@ -3932,7 +4087,8 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
}
stop_meas
(
&
ue
->
generic_stat
);
//printf("after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0));
#ifdef EMOS
phy_procedures_emos_UE_RX
(
ue
,
slot
,
eNB_id
);
...
...
@@ -3940,7 +4096,10 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX
,
VCD_FUNCTION_OUT
);
stop_meas
(
&
ue
->
phy_proc_rx
);
stop_meas
(
&
ue
->
phy_proc_rx
[
subframe_rx
&
0x1
]);
printf
(
"------FULL RX PROC [SFN %d]: %5.2f ------
\n
"
,
subframe_rx
,
ue
->
phy_proc_rx
[
subframe_rx
&
0x1
].
p_time
/
(
cpuf
*
1000
.
0
));
return
(
0
);
}
...
...
openair1/SCHED/pucch_pc.c
View file @
ff6d41b6
...
...
@@ -51,7 +51,7 @@ int16_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,u
Po_PUCCH
=
get_PL
(
ue
->
Mod_id
,
ue
->
CC_id
,
eNB_id
)
+
ue
->
frame_parms
.
ul_power_control_config_common
.
p0_NominalPUCCH
+
ue
->
dlsch
[
eNB_id
][
0
]
->
g_pucch
;
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
g_pucch
;
switch
(
pucch_fmt
)
{
case
pucch_format1
:
...
...
@@ -90,19 +90,19 @@ int16_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,u
if
(
pucch_fmt
!=
pucch_format1
)
{
LOG_D
(
PHY
,
"[UE %d][PDSCH %x] AbsSubframe %d.%d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB, g_pucch %d dB
\n
"
,
ue
->
Mod_id
,
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
,
proc
->
frame_tx
%
1024
,
subframe
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
,
proc
->
frame_tx
%
1024
,
subframe
,
Po_PUCCH
,
ue
->
frame_parms
.
ul_power_control_config_common
.
p0_NominalPUCCH
,
get_PL
(
ue
->
Mod_id
,
ue
->
CC_id
,
eNB_id
),
ue
->
dlsch
[
eNB_id
][
0
]
->
g_pucch
);
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
g_pucch
);
}
else
{
LOG_D
(
PHY
,
"[UE %d][SR %x] AbsSubframe %d.%d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB g_pucch %d dB
\n
"
,
ue
->
Mod_id
,
ue
->
dlsch
[
eNB_id
][
0
]
->
rnti
,
proc
->
frame_tx
%
1024
,
subframe
,
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
rnti
,
proc
->
frame_tx
%
1024
,
subframe
,
Po_PUCCH
,
ue
->
frame_parms
.
ul_power_control_config_common
.
p0_NominalPUCCH
,
get_PL
(
ue
->
Mod_id
,
ue
->
CC_id
,
eNB_id
),
ue
->
dlsch
[
eNB_id
][
0
]
->
g_pucch
);
ue
->
dlsch
[
proc
->
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
g_pucch
);
}
return
(
Po_PUCCH
);
...
...
openair2/RRC/LITE/L2_interface.c
View file @
ff6d41b6
...
...
@@ -199,7 +199,7 @@ mac_rrc_data_req(
int
sdu_size
=
sizeof
(
RRC_MAC_CCCH_DATA_REQ
(
message_p
).
sdu
);
if
(
ccch_size
>
sdu_size
)
{
LOG_E
(
RRC
,
"SDU larger than CCCH SDU buffer size (%d, %d)"
,
ccch_size
,
sdu_size
);
LOG_E
(
RRC
,
"SDU larger than CCCH SDU buffer size
0
(%d, %d)"
,
ccch_size
,
sdu_size
);
ccch_size
=
sdu_size
;
}
...
...
@@ -297,7 +297,7 @@ mac_rrc_data_req(
int
sdu_size
=
sizeof
(
RRC_MAC_CCCH_DATA_REQ
(
message_p
).
sdu
);
if
(
ccch_size
>
sdu_size
)
{
LOG_E
(
RRC
,
"SDU larger than CCCH SDU buffer size (%d, %d)"
,
ccch_size
,
sdu_size
);
LOG_E
(
RRC
,
"SDU larger than CCCH SDU buffer size
1
(%d, %d)"
,
ccch_size
,
sdu_size
);
ccch_size
=
sdu_size
;
}
...
...
@@ -403,7 +403,7 @@ mac_rrc_data_ind(
int
msg_sdu_size
=
CCCH_SDU_SIZE
;
if
(
sdu_lenP
>
msg_sdu_size
)
{
LOG_E
(
RRC
,
"SDU larger than CCCH SDU buffer size (%d, %d)"
,
sdu_size
,
msg_sdu_size
);
LOG_E
(
RRC
,
"SDU larger than CCCH SDU buffer size
2
(%d, %d)"
,
sdu_size
,
msg_sdu_size
);
sdu_size
=
msg_sdu_size
;
}
else
{
sdu_size
=
sdu_lenP
;
...
...
@@ -471,7 +471,7 @@ mac_rrc_data_ind(
int
msg_sdu_size
=
sizeof
(
RRC_MAC_CCCH_DATA_IND
(
message_p
).
sdu
);
if
(
sdu_lenP
>
msg_sdu_size
)
{
LOG_E
(
RRC
,
"SDU larger than CCCH SDU buffer size (%d, %d)"
,
sdu_lenP
,
msg_sdu_size
);
LOG_E
(
RRC
,
"SDU larger than CCCH SDU buffer size
3
(%d, %d)"
,
sdu_lenP
,
msg_sdu_size
);
sdu_size
=
msg_sdu_size
;
}
else
{
sdu_size
=
sdu_lenP
;
...
...
openair3/NAS/TOOLS/network.h
View file @
ff6d41b6
...
...
@@ -61,7 +61,7 @@ Description Defines a list of PLMN network operators
#define VDF5 11
#define SELECTED_PLMN
OAI_LTEBOX
//SFR1
#define SELECTED_PLMN
TEST1
//SFR1
#define TEST_PLMN {0,0,0x0f,1,1,0} // 00101
#define SFR_PLMN_1 {0,2,0x0f,8,0,1} // 20810
...
...
openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
View file @
ff6d41b6
...
...
@@ -86,14 +86,14 @@ UE0:
};
SIM
: {
MSIN
=
"0
100001111
"
;
USIM_API_K
=
"
fec86ba6eb707ed08905757b1bb44b8f
"
;
MSIN
=
"0
00001234
"
;
USIM_API_K
=
"
000102030405060708090A0B0C0D0E0F
"
;
OPC
=
"C42449363BBAD02B66D16BC975D77CC1"
;
MSISDN
=
"33611123456"
;
MSISDN
=
"
000000000000"
;//
"
33611123456"
;
};
# Home PLMN Selector with Access Technology
HPLMN
=
"
20893
"
;
HPLMN
=
"
00101
"
;
# User controlled PLMN Selector with Access Technology
UCPLMN_LIST
= ();
...
...
targets/RT/USER/lte-ue.c
View file @
ff6d41b6
...
...
@@ -56,6 +56,8 @@
#include "T.h"
extern
double
cpuf
;
#define FRAME_PERIOD 100000000ULL
#define DAQ_PERIOD 66667ULL
#define FIFO_PRIORITY 40
...
...
@@ -538,6 +540,9 @@ static void *UE_thread_rxn_txnp4(void *arg) {
}
phy_procedures_UE_RX
(
UE
,
proc
,
0
,
0
,
UE
->
mode
,
no_relay
,
NULL
);
}
start_meas
(
&
UE
->
generic_stat
);
if
(
UE
->
mac_enabled
==
1
)
{
ret
=
mac_xface
->
ue_scheduler
(
UE
->
Mod_id
,
...
...
@@ -567,6 +572,10 @@ static void *UE_thread_rxn_txnp4(void *arg) {
UE
->
Mod_id
,
proc
->
frame_rx
,
proc
->
subframe_tx
,
txt
);
}
}
stop_meas
(
&
UE
->
generic_stat
);
printf
(
"mac_xface->ue_scheduler %5.2f
\n
"
,
UE
->
generic_stat
.
p_time
/
(
cpuf
*
1000
.
0
));
// Prepare the future Tx data
if
((
subframe_select
(
&
UE
->
frame_parms
,
proc
->
subframe_tx
)
==
SF_UL
)
||
...
...
targets/SIMU/USER/init_lte.c
View file @
ff6d41b6
...
...
@@ -161,15 +161,16 @@ PHY_VARS_UE* init_lte_UE(LTE_DL_FRAME_PARMS *frame_parms,
memcpy
(
&
(
PHY_vars_UE
->
frame_parms
),
frame_parms
,
sizeof
(
LTE_DL_FRAME_PARMS
));
phy_init_lte_ue
(
PHY_vars_UE
,
1
,
abstraction_flag
);
for
(
int
l
=
0
;
l
<
2
;
l
++
)
{
for
(
i
=
0
;
i
<
NUMBER_OF_CONNECTED_eNB_MAX
;
i
++
)
{
for
(
j
=
0
;
j
<
2
;
j
++
)
{
PHY_vars_UE
->
dlsch
[
i
][
j
]
=
new_ue_dlsch
(
1
,
NUMBER_OF_HARQ_PID_MAX
,
NSOFT
,
MAX_TURBO_ITERATIONS
,
frame_parms
->
N_RB_DL
,
abstraction_flag
);
PHY_vars_UE
->
dlsch
[
l
]
[
i
][
j
]
=
new_ue_dlsch
(
1
,
NUMBER_OF_HARQ_PID_MAX
,
NSOFT
,
MAX_TURBO_ITERATIONS
,
frame_parms
->
N_RB_DL
,
abstraction_flag
);
if
(
!
PHY_vars_UE
->
dlsch
[
i
][
j
])
{
if
(
!
PHY_vars_UE
->
dlsch
[
l
]
[
i
][
j
])
{
LOG_E
(
PHY
,
"Can't get ue dlsch structures
\n
"
);
exit
(
-
1
);
}
else
LOG_D
(
PHY
,
"dlsch[%d][%d] => %p
\n
"
,
UE_id
,
i
,
PHY_vars_UE
->
dlsch
[
i
][
j
]);
LOG_D
(
PHY
,
"dlsch[%d][%d] => %p
\n
"
,
UE_id
,
i
,
PHY_vars_UE
->
dlsch
[
l
]
[
i
][
j
]);
}
...
...
@@ -186,6 +187,7 @@ PHY_VARS_UE* init_lte_UE(LTE_DL_FRAME_PARMS *frame_parms,
PHY_vars_UE
->
transmission_mode
[
i
]
=
frame_parms
->
nb_antenna_ports_eNB
==
1
?
1
:
2
;
}
}
PHY_vars_UE
->
frame_parms
.
pucch_config_common
.
deltaPUCCH_Shift
=
1
;
...
...
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