Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
canghaiwuhen
OpenXG-RAN
Commits
c6753606
Commit
c6753606
authored
Nov 24, 2016
by
Florian Kaltenberger
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' of
https://gitlab.eurecom.fr/oai/openairinterface5g
into develop
parents
933dc966
03231dd1
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
277 additions
and
300 deletions
+277
-300
openair1/SCHED/phy_procedures_lte_eNb.c
openair1/SCHED/phy_procedures_lte_eNb.c
+277
-300
No files found.
openair1/SCHED/phy_procedures_lte_eNb.c
View file @
c6753606
...
@@ -2016,11 +2016,11 @@ void prach_procedures(PHY_VARS_eNB *eNB) {
...
@@ -2016,11 +2016,11 @@ void prach_procedures(PHY_VARS_eNB *eNB) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX
,
0
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX
,
0
);
}
}
void
pucch_procedures
(
PHY_VARS_eNB
*
eNB
,
eNB_rxtx_proc_t
*
proc
,
int
UE_id
,
int
harq_pid
)
{
void
pucch_procedures
(
PHY_VARS_eNB
*
eNB
,
eNB_rxtx_proc_t
*
proc
,
int
UE_id
,
int
harq_pid
)
{
LTE_DL_FRAME_PARMS
*
fp
=&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=&
eNB
->
frame_parms
;
uint8_t
SR_payload
=
0
,
*
pucch_payload
=
NULL
,
pucch_payload0
[
2
]
=
{
0
,
0
},
pucch_payload1
[
2
]
=
{
0
,
0
};
uint8_t
SR_payload
=
0
,
*
pucch_payload
=
NULL
,
pucch_payload0
[
2
]
=
{
0
,
0
},
pucch_payload1
[
2
]
=
{
0
,
0
};
int16_t
n1_pucch0
,
n1_pucch1
,
n1_pucch2
,
n1_pucch3
;
int16_t
n1_pucch0
=
-
1
,
n1_pucch1
=
-
1
,
n1_pucch2
=
-
1
,
n1_pucch3
=
-
1
;
uint8_t
do_SR
=
0
;
uint8_t
do_SR
=
0
;
uint8_t
pucch_sel
=
0
;
uint8_t
pucch_sel
=
0
;
int32_t
metric0
=
0
,
metric1
=
0
,
metric0_SR
=
0
;
int32_t
metric0
=
0
,
metric1
=
0
,
metric0_SR
=
0
;
...
@@ -2031,352 +2031,329 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq
...
@@ -2031,352 +2031,329 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq
if
((
eNB
->
dlsch
[
UE_id
][
0
])
&&
if
((
eNB
->
dlsch
[
UE_id
][
0
])
&&
(
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
>
0
)
&&
(
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
>
0
)
&&
(
eNB
->
ulsch
[
UE_id
]
->
harq_processes
[
harq_pid
]
->
subframe_scheduling_flag
==
0
))
{
(
eNB
->
ulsch
[
UE_id
]
->
harq_processes
[
harq_pid
]
->
subframe_scheduling_flag
==
0
))
{
// check SR availability
// check SR availability
do_SR
=
is_SR_subframe
(
eNB
,
proc
,
UE_id
);
do_SR
=
is_SR_subframe
(
eNB
,
proc
,
UE_id
);
// do_SR = 0;
// do_SR = 0;
// Now ACK/NAK
// Now ACK/NAK
// First check subframe_tx flag for earlier subframes
// First check subframe_tx flag for earlier subframes
get_n1_pucch_eNB
(
eNB
,
get_n1_pucch_eNB
(
eNB
,
proc
,
proc
,
UE_id
,
UE_id
,
&
n1_pucch0
,
&
n1_pucch0
,
&
n1_pucch1
,
&
n1_pucch1
,
&
n1_pucch2
,
&
n1_pucch2
,
&
n1_pucch3
);
&
n1_pucch3
);
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d
\n
"
,
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d
\n
"
,
eNB
->
Mod_id
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
eNB
->
Mod_id
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
frame
,
subframe
,
frame
,
subframe
,
n1_pucch0
,
n1_pucch1
,
n1_pucch2
,
n1_pucch3
,
do_SR
);
n1_pucch0
,
n1_pucch1
,
n1_pucch2
,
n1_pucch3
,
do_SR
);
if
((
n1_pucch0
==-
1
)
&&
(
n1_pucch1
==-
1
)
&&
(
do_SR
==
0
))
{
// no TX PDSCH that have to be checked and no SR for this UE_id
if
((
n1_pucch0
==-
1
)
&&
(
n1_pucch1
==-
1
)
&&
(
do_SR
==
0
))
{
// no TX PDSCH that have to be checked and no SR for this UE_id
}
else
{
}
else
{
// otherwise we have some PUCCH detection to do
// otherwise we have some PUCCH detection to do
// Null out PUCCH PRBs for noise measurement
// Null out PUCCH PRBs for noise measurement
switch
(
fp
->
N_RB_UL
)
{
switch
(
fp
->
N_RB_UL
)
{
case
6
:
case
6
:
eNB
->
rb_mask_ul
[
0
]
|=
(
0x1
|
(
1
<<
5
));
//position 5
eNB
->
rb_mask_ul
[
0
]
|=
(
0x1
|
(
1
<<
5
));
//position 5
break
;
break
;
case
15
:
case
15
:
eNB
->
rb_mask_ul
[
0
]
|=
(
0x1
|
(
1
<<
14
));
// position 14
eNB
->
rb_mask_ul
[
0
]
|=
(
0x1
|
(
1
<<
14
));
// position 14
break
;
break
;
case
25
:
case
25
:
eNB
->
rb_mask_ul
[
0
]
|=
(
0x1
|
(
1
<<
24
));
// position 24
eNB
->
rb_mask_ul
[
0
]
|=
(
0x1
|
(
1
<<
24
));
// position 24
break
;
break
;
case
50
:
case
50
:
eNB
->
rb_mask_ul
[
0
]
|=
0x1
;
eNB
->
rb_mask_ul
[
0
]
|=
0x1
;
eNB
->
rb_mask_ul
[
1
]
|=
(
1
<<
17
);
// position 49 (49-32)
eNB
->
rb_mask_ul
[
1
]
|=
(
1
<<
17
);
// position 49 (49-32)
break
;
break
;
case
75
:
case
75
:
eNB
->
rb_mask_ul
[
0
]
|=
0x1
;
eNB
->
rb_mask_ul
[
0
]
|=
0x1
;
eNB
->
rb_mask_ul
[
2
]
|=
(
1
<<
10
);
// position 74 (74-64)
eNB
->
rb_mask_ul
[
2
]
|=
(
1
<<
10
);
// position 74 (74-64)
break
;
break
;
case
100
:
case
100
:
eNB
->
rb_mask_ul
[
0
]
|=
0x1
;
eNB
->
rb_mask_ul
[
0
]
|=
0x1
;
eNB
->
rb_mask_ul
[
3
]
|=
(
1
<<
3
);
// position 99 (99-96)
eNB
->
rb_mask_ul
[
3
]
|=
(
1
<<
3
);
// position 99 (99-96)
break
;
break
;
default:
default:
LOG_E
(
PHY
,
"Unknown number for N_RB_UL %d
\n
"
,
fp
->
N_RB_UL
);
LOG_E
(
PHY
,
"Unknown number for N_RB_UL %d
\n
"
,
fp
->
N_RB_UL
);
break
;
break
;
}
}
if
(
do_SR
==
1
)
{
if
(
do_SR
==
1
)
{
eNB
->
UE_stats
[
UE_id
].
sr_total
++
;
eNB
->
UE_stats
[
UE_id
].
sr_total
++
;
if
(
eNB
->
abstraction_flag
==
0
)
if
(
eNB
->
abstraction_flag
==
0
)
{
metric0_SR
=
rx_pucch
(
eNB
,
metric0_SR
=
rx_pucch
(
eNB
,
pucch_format1
,
pucch_format1
,
UE_id
,
UE_id
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
,
0
,
// n2_pucch
0
,
// n2_pucch
0
,
// shortened format, should be use_srs flag, later
0
,
// shortened format, should be use_srs flag, later
&
SR_payload
,
&
SR_payload
,
frame
,
frame
,
subframe
,
subframe
,
PUCCH1_THRES
);
PUCCH1_THRES
);
LOG_D
(
PHY
,
"[eNB %d][SR %x] Frame %d subframe %d Checking SR is %d (SR n1pucch is %d)
\n
"
,
eNB
->
Mod_id
,
eNB
->
ulsch
[
UE_id
]
->
rnti
,
frame
,
subframe
,
SR_payload
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
);
}
#ifdef PHY_ABSTRACTION
#ifdef PHY_ABSTRACTION
else
{
else
{
metric0_SR
=
rx_pucch_emul
(
eNB
,
metric0_SR
=
rx_pucch_emul
(
eNB
,
proc
,
proc
,
UE_id
,
UE_id
,
pucch_format1
,
pucch_format1
,
0
,
0
,
&
SR_payload
);
&
SR_payload
);
LOG_D
(
PHY
,
"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)
\n
"
,
eNB
->
Mod_id
,
LOG_D
(
PHY
,
"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)
\n
"
,
eNB
->
Mod_id
,
eNB
->
ulsch
[
UE_id
]
->
rnti
,
frame
,
subframe
,
SR_payload
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
);
eNB
->
ulsch
[
UE_id
]
->
rnti
,
frame
,
subframe
,
SR_payload
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
);
}
}
#endif
#endif
if
(
SR_payload
==
1
)
{
LOG_D
(
PHY
,
"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC
\n
"
,
eNB
->
Mod_id
,
eNB
->
ulsch
[
UE_id
]
->
rnti
,
frame
,
subframe
);
eNB
->
UE_stats
[
UE_id
].
sr_received
++
;
if
(
eNB
->
first_sr
[
UE_id
]
==
1
)
{
// this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
eNB
->
first_sr
[
UE_id
]
=
0
;
eNB
->
dlsch
[
UE_id
][
0
]
->
harq_processes
[
0
]
->
round
=
0
;
eNB
->
dlsch
[
UE_id
][
0
]
->
harq_processes
[
0
]
->
status
=
SCH_IDLE
;
LOG_D
(
PHY
,
"[eNB %d][SR %x] Frame %d subframe %d First SR
\n
"
,
eNB
->
Mod_id
,
eNB
->
ulsch
[
UE_id
]
->
rnti
,
frame
,
subframe
);
}
if
(
eNB
->
mac_enabled
==
1
)
{
mac_xface
->
SR_indication
(
eNB
->
Mod_id
,
eNB
->
CC_id
,
frame
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
subframe
);
}
}
}
// do_SR==1
}
// do_SR==1
if
((
n1_pucch0
==-
1
)
&&
(
n1_pucch1
==-
1
))
{
// just check for SR
if
((
n1_pucch0
==-
1
)
&&
(
n1_pucch1
==-
1
))
{
// just check for SR
}
else
if
(
eNB
->
frame_parms
.
frame_type
==
FDD
)
{
// FDD
}
else
if
(
fp
->
frame_type
==
FDD
)
{
// FDD
// if SR was detected, use the n1_pucch from SR, else use n1_pucch0
// if SR was detected, use the n1_pucch from SR, else use n1_pucch0
// n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0;
// n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0;
LOG_D
(
PHY
,
"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d
\n
"
,
n1_pucch0
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
,
SR_payload
);
LOG_D
(
PHY
,
"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d
\n
"
,
n1_pucch0
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
,
SR_payload
);
if
(
eNB
->
abstraction_flag
==
0
)
{
if
(
eNB
->
abstraction_flag
==
0
)
{
metric0
=
rx_pucch
(
eNB
,
pucch_format1a
,
UE_id
,
metric0
=
rx_pucch
(
eNB
,
(
uint16_t
)
n1_pucch0
,
pucch_format1a
,
0
,
//n2_pucch
UE_id
,
0
,
// shortened format
(
uint16_t
)
n1_pucch0
,
pucch_payload0
,
0
,
//n2_pucch
frame
,
0
,
// shortened format
subframe
,
pucch_payload0
,
PUCCH1a_THRES
);
frame
,
}
subframe
,
PUCCH1a_THRES
);
if
(
metric0
<
metric0_SR
)
metric0
=
rx_pucch
(
eNB
,
pucch_format1a
,
UE_id
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
,
0
,
//n2_pucch
0
,
// shortened format
pucch_payload0
,
frame
,
subframe
,
PUCCH1a_THRES
);
}
if
(
eNB
->
mac_enabled
==
1
)
{
mac_xface
->
SR_indication
(
eNB
->
Mod_id
,
eNB
->
CC_id
,
frame
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
subframe
);
}
}
}
// do_SR==1
if
((
n1_pucch0
==-
1
)
&&
(
n1_pucch1
==-
1
))
{
// just check for SR
}
else
if
(
fp
->
frame_type
==
FDD
)
{
// FDD
// if SR was detected, use the n1_pucch from SR, else use n1_pucch0
// n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0;
LOG_D
(
PHY
,
"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d
\n
"
,
n1_pucch0
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
,
SR_payload
);
if
(
eNB
->
abstraction_flag
==
0
)
{
metric0
=
rx_pucch
(
eNB
,
pucch_format1a
,
UE_id
,
(
uint16_t
)
n1_pucch0
,
0
,
//n2_pucch
0
,
// shortened format
pucch_payload0
,
frame
,
subframe
,
PUCCH1a_THRES
);
if
(
metric0
<
metric0_SR
)
metric0
=
rx_pucch
(
eNB
,
pucch_format1a
,
UE_id
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
,
0
,
//n2_pucch
0
,
// shortened format
pucch_payload0
,
frame
,
subframe
,
PUCCH1a_THRES
);
}
else
{
#ifdef PHY_ABSTRACTION
#ifdef PHY_ABSTRACTION
metric0
=
rx_pucch_emul
(
eNB
,
else
{
proc
,
metric0
=
rx_pucch_emul
(
eNB
,
UE_id
,
proc
,
pucch_format1a
,
UE_id
,
0
,
pucch_format1a
,
pucch_payload0
);
0
,
pucch_payload0
);
}
#endif
#endif
}
/* cancel SR detection if reception on n1_pucch0 is better than on SR PUCCH resource index */
if
(
do_SR
&&
metric0
>
metric0_SR
)
SR_payload
=
0
;
if
(
do_SR
&&
metric0
<=
metric0_SR
)
{
/* when transmitting ACK/NACK on SR PUCCH resource index, SR payload is always 1 */
SR_payload
=
1
;
if
(
eNB
->
abstraction_flag
==
0
)
{
metric0
=
rx_pucch
(
eNB
,
pucch_format1a
,
UE_id
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
,
0
,
//n2_pucch
0
,
// shortened format
pucch_payload0
,
frame
,
subframe
,
PUCCH1a_THRES
);
}
#ifdef PHY_ABSTRACTION
else
{
metric0
=
rx_pucch_emul
(
eNB
,
proc
,
UE_id
,
pucch_format1a
,
0
,
pucch_payload0
);
}
#endif
}
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_PHY_PROC
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)
\n
"
,
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)
\n
"
,
eNB
->
Mod_id
,
eNB
->
Mod_id
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
frame
,
subframe
,
frame
,
subframe
,
pucch_payload0
[
0
],
metric0
);
pucch_payload0
[
0
],
metric0
);
#endif
#endif
process_HARQ_feedback
(
UE_id
,
eNB
,
proc
,
0
,
// pusch_flag
pucch_payload0
,
2
,
SR_payload
);
}
// FDD
process_HARQ_feedback
(
UE_id
,
eNB
,
proc
,
else
{
//TDD
0
,
// pusch_flag
pucch_payload0
,
2
,
SR_payload
);
}
// FDD
else
{
//TDD
bundling_flag
=
eNB
->
pucch_config_dedicated
[
UE_id
].
tdd_AckNackFeedbackMode
;
bundling_flag
=
eNB
->
pucch_config_dedicated
[
UE_id
].
tdd_AckNackFeedbackMode
;
// fix later for 2 TB case and format1b
// fix later for 2 TB case and format1b
if
((
fp
->
frame_type
==
FDD
)
||
if
((
fp
->
frame_type
==
FDD
)
||
(
bundling_flag
==
bundling
)
||
(
bundling_flag
==
bundling
)
||
((
fp
->
frame_type
==
TDD
)
&&
(
fp
->
tdd_config
==
1
)
&&
((
subframe
!=
2
)
||
(
subframe
!=
7
))))
{
((
fp
->
frame_type
==
TDD
)
&&
(
fp
->
tdd_config
==
1
)
&&
((
subframe
!=
2
)
||
(
subframe
!=
7
))))
{
format
=
pucch_format1a
;
format
=
pucch_format1a
;
}
else
{
}
else
{
format
=
pucch_format1b
;
format
=
pucch_format1b
;
}
}
// if SR was detected, use the n1_pucch from SR
// if SR was detected, use the n1_pucch from SR
if
(
SR_payload
==
1
)
{
if
(
SR_payload
==
1
)
{
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_PHY_PROC
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR
\n
"
,
eNB
->
Mod_id
,
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR
\n
"
,
eNB
->
Mod_id
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
frame
,
subframe
,
frame
,
subframe
,
n1_pucch0
,
n1_pucch1
,
n1_pucch2
,
n1_pucch3
,
format
);
n1_pucch0
,
n1_pucch1
,
n1_pucch2
,
n1_pucch3
,
format
);
#endif
#endif
if
(
eNB
->
abstraction_flag
==
0
)
if
(
eNB
->
abstraction_flag
==
0
)
metric0_SR
=
rx_pucch
(
eNB
,
metric0
=
rx_pucch
(
eNB
,
format
,
format
,
UE_id
,
UE_id
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
,
eNB
->
scheduling_request_config
[
UE_id
].
sr_PUCCH_ResourceIndex
,
0
,
//n2_pucch
0
,
//n2_pucch
0
,
// shortened format
0
,
// shortened format
pucch_payload0
,
pucch_payload0
,
frame
,
frame
,
subframe
,
subframe
,
PUCCH1a_THRES
);
PUCCH1a_THRES
);
else
{
else
{
#ifdef PHY_ABSTRACTION
#ifdef PHY_ABSTRACTION
metric0
=
rx_pucch_emul
(
eNB
,
proc
,
metric0
=
rx_pucch_emul
(
eNB
,
proc
,
UE_id
,
UE_id
,
format
,
format
,
0
,
0
,
pucch_payload0
);
pucch_payload0
);
#endif
#endif
}
}
}
else
{
//using n1_pucch0/n1_pucch1 resources
}
else
{
//using n1_pucch0/n1_pucch1 resources
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_PHY_PROC
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d
\n
"
,
eNB
->
Mod_id
,
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d
\n
"
,
eNB
->
Mod_id
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
frame
,
subframe
,
frame
,
subframe
,
n1_pucch0
,
n1_pucch1
,
n1_pucch2
,
n1_pucch3
,
format
);
n1_pucch0
,
n1_pucch1
,
n1_pucch2
,
n1_pucch3
,
format
);
#endif
#endif
metric0
=
0
;
metric0
=
0
;
metric1
=
0
;
metric1
=
0
;
// Check n1_pucch0 metric
// Check n1_pucch0 metric
if
(
n1_pucch0
!=
-
1
)
{
if
(
n1_pucch0
!=
-
1
)
{
if
(
eNB
->
abstraction_flag
==
0
)
if
(
eNB
->
abstraction_flag
==
0
)
metric0
=
rx_pucch
(
eNB
,
metric0
=
rx_pucch
(
eNB
,
format
,
format
,
UE_id
,
UE_id
,
(
uint16_t
)
n1_pucch0
,
(
uint16_t
)
n1_pucch0
,
0
,
// n2_pucch
0
,
// n2_pucch
0
,
// shortened format
0
,
// shortened format
pucch_payload0
,
pucch_payload0
,
frame
,
frame
,
subframe
,
subframe
,
PUCCH1a_THRES
);
PUCCH1a_THRES
);
else
{
else
{
#ifdef PHY_ABSTRACTION
#ifdef PHY_ABSTRACTION
metric0
=
rx_pucch_emul
(
eNB
,
metric0
=
rx_pucch_emul
(
eNB
,
proc
,
proc
,
UE_id
,
UE_id
,
format
,
format
,
0
,
0
,
pucch_payload0
);
pucch_payload0
);
#endif
#endif
}
}
}
}
// Check n1_pucch1 metric
// Check n1_pucch1 metric
if
(
n1_pucch1
!=
-
1
)
{
if
(
n1_pucch1
!=
-
1
)
{
if
(
eNB
->
abstraction_flag
==
0
)
if
(
eNB
->
abstraction_flag
==
0
)
metric1
=
rx_pucch
(
eNB
,
metric1
=
rx_pucch
(
eNB
,
format
,
format
,
UE_id
,
UE_id
,
(
uint16_t
)
n1_pucch1
,
(
uint16_t
)
n1_pucch1
,
0
,
//n2_pucch
0
,
//n2_pucch
0
,
// shortened format
0
,
// shortened format
pucch_payload1
,
pucch_payload1
,
frame
,
frame
,
subframe
,
subframe
,
PUCCH1a_THRES
);
PUCCH1a_THRES
);
else
{
else
{
#ifdef PHY_ABSTRACTION
#ifdef PHY_ABSTRACTION
metric1
=
rx_pucch_emul
(
eNB
,
metric1
=
rx_pucch_emul
(
eNB
,
proc
,
proc
,
UE_id
,
UE_id
,
format
,
format
,
1
,
1
,
pucch_payload1
);
pucch_payload1
);
#endif
#endif
}
}
}
}
}
}
if
(
SR_payload
==
1
)
{
if
(
SR_payload
==
1
)
{
pucch_payload
=
pucch_payload0
;
pucch_payload
=
pucch_payload0
;
if
(
bundling_flag
==
bundling
)
if
(
bundling_flag
==
bundling
)
pucch_sel
=
2
;
pucch_sel
=
2
;
}
else
if
(
bundling_flag
==
multiplexing
)
{
// multiplexing + no SR
}
else
if
(
bundling_flag
==
multiplexing
)
{
// multiplexing + no SR
pucch_payload
=
(
metric1
>
metric0
)
?
pucch_payload1
:
pucch_payload0
;
pucch_payload
=
(
metric1
>
metric0
)
?
pucch_payload1
:
pucch_payload0
;
pucch_sel
=
(
metric1
>
metric0
)
?
1
:
0
;
pucch_sel
=
(
metric1
>
metric0
)
?
1
:
0
;
}
else
{
// bundling + no SR
}
else
{
// bundling + no SR
if
(
n1_pucch1
!=
-
1
)
if
(
n1_pucch1
!=
-
1
)
pucch_payload
=
pucch_payload1
;
pucch_payload
=
pucch_payload1
;
else
if
(
n1_pucch0
!=
-
1
)
else
if
(
n1_pucch0
!=
-
1
)
pucch_payload
=
pucch_payload0
;
pucch_payload
=
pucch_payload0
;
pucch_sel
=
2
;
// indicate that this is a bundled ACK/NAK
pucch_sel
=
2
;
// indicate that this is a bundled ACK/NAK
}
}
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_PHY_PROC
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)
\n
"
,
eNB
->
Mod_id
,
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)
\n
"
,
eNB
->
Mod_id
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
frame
,
subframe
,
frame
,
subframe
,
metric0
,
metric1
,
pucch_sel
,
pucch_payload
[
0
],
pucch_payload
[
1
]);
metric0
,
metric1
,
pucch_sel
,
pucch_payload
[
0
],
pucch_payload
[
1
]);
#endif
#endif
process_HARQ_feedback
(
UE_id
,
eNB
,
proc
,
process_HARQ_feedback
(
UE_id
,
eNB
,
proc
,
0
,
// pusch_flag
0
,
// pusch_flag
pucch_payload
,
pucch_payload
,
pucch_sel
,
pucch_sel
,
SR_payload
);
SR_payload
);
}
// TDD
}
}
}
if
(
SR_payload
==
1
)
{
LOG_D
(
PHY
,
"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC
\n
"
,
eNB
->
Mod_id
,
eNB
->
ulsch
[
UE_id
]
->
rnti
,
frame
,
subframe
);
eNB
->
UE_stats
[
UE_id
].
sr_received
++
;
if
(
eNB
->
first_sr
[
UE_id
]
==
1
)
{
// this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
eNB
->
first_sr
[
UE_id
]
=
0
;
eNB
->
dlsch
[
UE_id
][
0
]
->
harq_processes
[
0
]
->
round
=
0
;
eNB
->
dlsch
[
UE_id
][
0
]
->
harq_processes
[
0
]
->
status
=
SCH_IDLE
;
LOG_D
(
PHY
,
"[eNB %d][SR %x] Frame %d subframe %d First SR
\n
"
,
eNB
->
Mod_id
,
eNB
->
ulsch
[
UE_id
]
->
rnti
,
frame
,
subframe
);
}
if
(
eNB
->
mac_enabled
==
1
)
{
mac_xface
->
SR_indication
(
eNB
->
Mod_id
,
eNB
->
CC_id
,
frame
,
eNB
->
dlsch
[
UE_id
][
0
]
->
rnti
,
subframe
);
}
}
}
}
}
...
...
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