Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
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
Michael Black
OpenXG UE
Commits
b0154541
Commit
b0154541
authored
Mar 19, 2018
by
Cedric Roux
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/bugfixes-2018-w11' into develop
parents
4b9b77ae
fe71b320
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
189 additions
and
47 deletions
+189
-47
openair1/SCHED/phy_procedures_lte_eNb.c
openair1/SCHED/phy_procedures_lte_eNb.c
+54
-34
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+102
-12
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+32
-0
openair2/LAYER2/MAC/pre_processor.c
openair2/LAYER2/MAC/pre_processor.c
+1
-1
No files found.
openair1/SCHED/phy_procedures_lte_eNb.c
View file @
b0154541
...
...
@@ -1451,7 +1451,9 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe)
pthread_mutex_unlock
(
&
eNB
->
UL_INFO_mutex
);
}
void
release_harq
(
PHY_VARS_eNB
*
eNB
,
int
UE_id
,
int
tb
,
uint16_t
frame
,
uint8_t
subframe
,
uint16_t
mask
)
{
/* release the harq if its round is >= 'after_rounds' */
static
void
do_release_harq
(
PHY_VARS_eNB
*
eNB
,
int
UE_id
,
int
tb
,
uint16_t
frame
,
uint8_t
subframe
,
uint16_t
mask
,
int
after_rounds
)
{
LTE_eNB_DLSCH_t
*
dlsch0
=
NULL
,
*
dlsch1
=
NULL
;
LTE_DL_eNB_HARQ_t
*
dlsch0_harq
=
NULL
,
*
dlsch1_harq
=
NULL
;
...
...
@@ -1472,11 +1474,13 @@ void release_harq(PHY_VARS_eNB *eNB,int UE_id,int tb,uint16_t frame,uint8_t subf
dlsch1_harq
=
dlsch1
->
harq_processes
[
harq_pid
];
AssertFatal
(
dlsch0_harq
!=
NULL
,
"dlsch0_harq is null
\n
"
);
if
(
dlsch0_harq
->
round
>=
after_rounds
)
{
dlsch0_harq
->
status
=
SCH_IDLE
;
/*if ((dlsch1_harq == NULL)||
((dlsch1_harq!=NULL)&&
(dlsch1_harq->status == SCH_IDLE)))*/
dlsch0
->
harq_mask
&=
~
(
1
<<
harq_pid
);
}
LOG_D
(
PHY
,
"Frame %d, subframe %d: Releasing harq %d for UE %x
\n
"
,
frame
,
subframe
,
harq_pid
,
dlsch0
->
rnti
);
}
...
...
@@ -1496,6 +1500,7 @@ void release_harq(PHY_VARS_eNB *eNB,int UE_id,int tb,uint16_t frame,uint8_t subf
dlsch1_harq
=
dlsch1
->
harq_processes
[
harq_pid
];
AssertFatal
(
dlsch0_harq
!=
NULL
,
"dlsch0_harq is null
\n
"
);
if
(
dlsch0_harq
->
round
>=
after_rounds
)
{
dlsch0_harq
->
status
=
SCH_IDLE
;
if
((
dlsch1_harq
==
NULL
)
||
((
dlsch1_harq
!=
NULL
)
&&
...
...
@@ -1505,6 +1510,16 @@ void release_harq(PHY_VARS_eNB *eNB,int UE_id,int tb,uint16_t frame,uint8_t subf
}
}
}
}
}
static
void
release_harq
(
PHY_VARS_eNB
*
eNB
,
int
UE_id
,
int
tb
,
uint16_t
frame
,
uint8_t
subframe
,
uint16_t
mask
,
int
is_ack
)
{
/* Maximum number of DL transmissions = 4.
* TODO: get the value from configuration.
* If is_ack is true then we release immediately. The value -1 can be used for that.
*/
do_release_harq
(
eNB
,
UE_id
,
tb
,
frame
,
subframe
,
mask
,
is_ack
?
-
1
:
4
);
}
int
getM
(
PHY_VARS_eNB
*
eNB
,
int
frame
,
int
subframe
)
{
...
...
@@ -1607,7 +1622,7 @@ void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq,
pdu
->
harq_indication_fdd_rel13
.
harq_tb_n
[
i
]
=
2
-
ulsch_harq
->
o_ACK
[
i
];
// release DLSCH if needed
if
(
ulsch_harq
->
o_ACK
[
i
]
==
1
)
release_harq
(
eNB
,
UE_id
,
i
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
i
,
frame
,
subframe
,
0xffff
,
ulsch_harq
->
o_ACK
[
i
]
==
1
);
#if T_TRACER
/* TODO: get correct harq pid */
...
...
@@ -1633,13 +1648,17 @@ void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq,
pdu
->
harq_indication_tdd_rel13
.
harq_data
[
0
].
multiplex
.
value_0
=
2
-
ulsch_harq
->
o_ACK
[
i
];
// release DLSCH if needed
if
(
ulsch_harq
->
o_ACK
[
i
]
==
1
)
release_harq
(
eNB
,
UE_id
,
i
,
frame
,
subframe
,
0xffff
);
if
(
M
==
1
&&
ulsch_harq
->
O_ACK
==
1
&&
ulsch_harq
->
o_ACK
[
i
]
==
1
)
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
else
if
(
M
==
1
&&
ulsch_harq
->
O_ACK
==
2
&&
ulsch_harq
->
o_ACK
[
i
]
==
1
)
release_harq
(
eNB
,
UE_id
,
i
,
frame
,
subframe
,
0xffff
);
/* TODO: review this code, it's most certainly wrong.
* We have to release the proper HARQ in case of ACK or NACK if max retransmission reached.
* Basically, call release_harq with 1 as last argument when ACK and 0 when NACK.
*/
release_harq
(
eNB
,
UE_id
,
i
,
frame
,
subframe
,
0xffff
,
ulsch_harq
->
o_ACK
[
i
]
==
1
);
if
(
M
==
1
&&
ulsch_harq
->
O_ACK
==
1
&&
ulsch_harq
->
o_ACK
[
i
]
==
1
)
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
,
ulsch_harq
->
o_ACK
[
i
]
==
1
);
else
if
(
M
==
1
&&
ulsch_harq
->
O_ACK
==
2
&&
ulsch_harq
->
o_ACK
[
i
]
==
1
)
release_harq
(
eNB
,
UE_id
,
i
,
frame
,
subframe
,
0xffff
,
ulsch_harq
->
o_ACK
[
i
]
==
1
);
else
if
(
M
>
1
&&
ulsch_harq
->
o_ACK
[
i
]
==
1
)
{
// spatial bundling
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
1
<<
i
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
1
<<
i
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
1
<<
i
,
ulsch_harq
->
o_ACK
[
i
]
==
1
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
1
<<
i
,
ulsch_harq
->
o_ACK
[
i
]
==
1
);
}
}
}
...
...
@@ -1701,7 +1720,7 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
AssertFatal
(
harq_ack
[
0
]
==
1
||
harq_ack
[
0
]
==
2
||
harq_ack
[
0
]
==
4
,
"harq_ack[0] is %d, should be 1,2 or 4
\n
"
,
harq_ack
[
0
]);
pdu
->
harq_indication_fdd_rel13
.
harq_tb_n
[
0
]
=
harq_ack
[
0
];
// release DLSCH if needed
if
(
harq_ack
[
0
]
==
1
)
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
,
harq_ack
[
0
]
==
1
);
#if T_TRACER
if
(
harq_ack
[
0
]
!=
1
)
...
...
@@ -1721,8 +1740,8 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
pdu
->
harq_indication_fdd_rel13
.
harq_tb_n
[
0
]
=
harq_ack
[
0
];
pdu
->
harq_indication_fdd_rel13
.
harq_tb_n
[
1
]
=
harq_ack
[
1
];
// release DLSCH if needed
if
(
harq_ack
[
0
]
==
1
)
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
if
(
harq_ack
[
1
]
==
1
)
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
,
harq_ack
[
0
]
==
1
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
,
harq_ack
[
1
]
==
1
);
}
else
AssertFatal
(
1
==
0
,
"only format 1a/b for now, received %d
\n
"
,
uci
->
pucch_fmt
);
}
...
...
@@ -1743,7 +1762,7 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
AssertFatal
(
harq_ack
[
0
]
==
1
||
harq_ack
[
0
]
==
2
||
harq_ack
[
0
]
==
4
,
"harq_ack[0] is %d, should be 1,2 or 4
\n
"
,
harq_ack
[
0
]);
pdu
->
harq_indication_tdd_rel13
.
harq_data
[
0
].
bundling
.
value_0
=
harq_ack
[
0
];
// release all bundled DLSCH if needed
if
(
harq_ack
[
0
]
==
1
)
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
,
harq_ack
[
0
]
==
1
);
}
else
if
(
uci
->
pucch_fmt
==
pucch_format1b
)
{
pdu
->
harq_indication_tdd_rel13
.
number_of_ack_nack
=
2
;
...
...
@@ -1753,8 +1772,8 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
pdu
->
harq_indication_tdd_rel13
.
harq_data
[
0
].
bundling
.
value_0
=
harq_ack
[
0
];
pdu
->
harq_indication_tdd_rel13
.
harq_data
[
1
].
bundling
.
value_0
=
harq_ack
[
1
];
// release all DLSCH if needed
if
(
harq_ack
[
0
]
==
1
)
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
if
(
harq_ack
[
1
]
==
1
)
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
,
harq_ack
[
0
]
==
1
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
,
harq_ack
[
1
]
==
1
);
}
break
;
case
1
:
// multiplexing
...
...
@@ -1766,7 +1785,7 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
AssertFatal
(
harq_ack
[
0
]
==
1
||
harq_ack
[
0
]
==
2
||
harq_ack
[
0
]
==
4
,
"harq_ack[0] is %d, should be 1,2 or 4
\n
"
,
harq_ack
[
0
]);
pdu
->
harq_indication_tdd_rel13
.
harq_data
[
0
].
multiplex
.
value_0
=
harq_ack
[
0
];
// release all DLSCH if needed
if
(
harq_ack
[
0
]
==
1
)
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
,
harq_ack
[
0
]
==
1
);
}
else
if
(
uci
->
num_pucch_resources
==
1
&&
uci
->
pucch_fmt
==
pucch_format1b
)
{
pdu
->
harq_indication_tdd_rel13
.
tl
.
tag
=
NFAPI_HARQ_INDICATION_TDD_REL13_TAG
;
...
...
@@ -1776,8 +1795,8 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
pdu
->
harq_indication_tdd_rel13
.
harq_data
[
0
].
multiplex
.
value_0
=
harq_ack
[
0
];
pdu
->
harq_indication_tdd_rel13
.
harq_data
[
1
].
multiplex
.
value_0
=
harq_ack
[
1
];
// release all DLSCH if needed
if
(
harq_ack
[
0
]
==
1
)
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
if
(
harq_ack
[
1
]
==
1
)
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
,
harq_ack
[
0
]
==
1
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
,
harq_ack
[
1
]
==
1
);
}
else
{
// num_pucch_resources (M) > 1
pdu
->
harq_indication_tdd_rel13
.
tl
.
tag
=
NFAPI_HARQ_INDICATION_TDD_REL13_TAG
;
...
...
@@ -1788,8 +1807,8 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
if
(
uci
->
num_pucch_resources
==
3
)
pdu
->
harq_indication_tdd_rel13
.
harq_data
[
2
].
multiplex
.
value_0
=
harq_ack
[
2
];
if
(
uci
->
num_pucch_resources
==
4
)
pdu
->
harq_indication_tdd_rel13
.
harq_data
[
3
].
multiplex
.
value_0
=
harq_ack
[
3
];
// spatial-bundling in this case so release both HARQ if necessary
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
tdd_multiplexing_mask
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
tdd_multiplexing_mask
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
tdd_multiplexing_mask
,
1
/* force release? previous code was unconditional */
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
tdd_multiplexing_mask
,
1
/* force release? previous code was unconditional */
);
}
break
;
case
2
:
// special bundling (SR collision)
...
...
@@ -1800,26 +1819,27 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
switch
(
harq_ack
[
0
])
{
case
0
:
/* TODO: release_harq here? this whole code looks suspicious */
break
;
case
1
:
// check if M=1,4,7
if
(
uci
->
num_pucch_resources
==
1
||
uci
->
num_pucch_resources
==
4
||
tdd_config5_sf2scheds
==
1
||
tdd_config5_sf2scheds
==
4
||
tdd_config5_sf2scheds
==
7
)
{
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
,
1
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
,
1
);
}
break
;
case
2
:
// check if M=2,5,8
if
(
uci
->
num_pucch_resources
==
2
||
tdd_config5_sf2scheds
==
2
||
tdd_config5_sf2scheds
==
5
||
tdd_config5_sf2scheds
==
8
)
{
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
,
1
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
,
1
);
}
break
;
case
3
:
// check if M=3,6,9
if
(
uci
->
num_pucch_resources
==
3
||
tdd_config5_sf2scheds
==
3
||
tdd_config5_sf2scheds
==
6
||
tdd_config5_sf2scheds
==
9
)
{
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
);
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
,
1
);
release_harq
(
eNB
,
UE_id
,
1
,
frame
,
subframe
,
0xffff
,
1
);
}
break
;
}
...
...
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
View file @
b0154541
...
...
@@ -3268,8 +3268,13 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
if
(
pdu
[
0
]
==
1
)
{
// ACK
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
=
8
;
// release HARQ process
sched_ctl
->
tbcnt
[
CC_idP
][
harq_pid
]
=
0
;
}
else
if
(
pdu
[
0
]
==
2
||
pdu
[
0
]
==
4
)
// NAK (treat DTX as NAK)
}
else
if
(
pdu
[
0
]
==
2
||
pdu
[
0
]
==
4
)
{
// NAK (treat DTX as NAK)
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
++
;
// increment round
if
(
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
=
8
;
// release HARQ process
sched_ctl
->
tbcnt
[
CC_idP
][
harq_pid
]
=
0
;
}
}
}
else
{
// one or two ACK/NAK bits
AssertFatal
(
num_ack_nak
<=
2
,
...
...
@@ -3285,8 +3290,13 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
if
((
num_ack_nak
==
2
)
&&
(
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
<
8
)
&&
(
sched_ctl
->
tbcnt
[
CC_idP
][
harq_pid
]
==
1
)
&&
(
pdu
[
0
]
==
2
)
&&
(
pdu
[
1
]
==
2
))
&&
(
pdu
[
0
]
==
2
)
&&
(
pdu
[
1
]
==
2
))
{
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
=
8
;
// release HARQ process
sched_ctl
->
tbcnt
[
CC_idP
][
harq_pid
]
=
0
;
}
}
else
if
(((
num_ack_nak
==
2
)
&&
(
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
<
8
)
&&
(
sched_ctl
->
tbcnt
[
0
][
harq_pid
]
==
2
)
...
...
@@ -3297,11 +3307,20 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
&&
(
pdu
[
0
]
==
2
)
&&
(
pdu
[
1
]
==
1
)))
{
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
++
;
sched_ctl
->
tbcnt
[
CC_idP
][
harq_pid
]
=
1
;
if
(
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
=
8
;
// release HARQ process
sched_ctl
->
tbcnt
[
CC_idP
][
harq_pid
]
=
0
;
/* TODO: do we have to set it to 0? */
}
}
else
if
((
num_ack_nak
==
2
)
&&
(
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
<
8
)
&&
(
sched_ctl
->
tbcnt
[
CC_idP
][
harq_pid
]
==
2
)
&&
(
pdu
[
0
]
==
2
)
&&
(
pdu
[
1
]
==
2
))
&&
(
pdu
[
0
]
==
2
)
&&
(
pdu
[
1
]
==
2
))
{
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
CC_idP
][
harq_pid
]
=
8
;
// release HARQ process
sched_ctl
->
tbcnt
[
CC_idP
][
harq_pid
]
=
0
;
}
}
else
AssertFatal
(
1
==
0
,
"Illegal ACK/NAK/round combination (%d,%d,%d,%d,%d) for harq_pid %d, UE %d/%x
\n
"
,
...
...
@@ -3327,12 +3346,18 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
pdu
[
1
]);
if
(
pdu
[
0
]
==
1
)
sched_ctl
->
round
[
pCCid
][
harq_pid
]
=
8
;
else
else
{
sched_ctl
->
round
[
pCCid
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
pCCid
][
harq_pid
]
==
4
)
sched_ctl
->
round
[
pCCid
][
harq_pid
]
=
8
;
}
if
(
pdu
[
1
]
==
1
)
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
=
8
;
else
else
{
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
==
4
)
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
=
8
;
}
}
// A=2
else
if
((
num_ack_nak
==
3
)
&&
(
sched_ctl
->
round
[
pCCid
][
harq_pid
]
<
8
)
...
...
@@ -3358,13 +3383,26 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
((
pdu
[
0
]
==
1
)
&&
(
pdu
[
1
]
==
2
)))
{
sched_ctl
->
round
[
pCCid
][
harq_pid
]
++
;
sched_ctl
->
tbcnt
[
pCCid
][
harq_pid
]
=
1
;
}
else
if
(
sched_ctl
->
round
[
pCCid
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
pCCid
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
pCCid
][
harq_pid
]
=
0
;
/* TODO: do we have to set it to 0? */
}
}
else
{
sched_ctl
->
round
[
pCCid
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
pCCid
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
pCCid
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
pCCid
][
harq_pid
]
=
0
;
}
}
if
(
pdu
[
2
]
==
1
)
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
=
8
;
else
else
{
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
=
8
;
}
}
}
// A=3 primary cell has 2 TBs
else
if
((
num_ack_nak
==
3
)
&&
(
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
<
8
)
...
...
@@ -3390,13 +3428,26 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
||
((
pdu
[
0
]
==
1
)
&&
(
pdu
[
1
]
>=
2
)))
{
// one ACK
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
++
;
sched_ctl
->
tbcnt
[
1
-
pCCid
][
harq_pid
]
=
1
;
}
else
// both NAK/DTX
if
(
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
1
-
pCCid
][
harq_pid
]
=
0
;
}
}
else
{
// both NAK/DTX
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
1
-
pCCid
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
1
-
pCCid
][
harq_pid
]
=
0
;
}
}
if
(
pdu
[
2
]
==
1
)
sched_ctl
->
round
[
pCCid
][
harq_pid
]
=
8
;
else
else
{
sched_ctl
->
round
[
pCCid
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
pCCid
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
pCCid
][
harq_pid
]
=
8
;
}
}
}
// A=3 secondary cell has 2 TBs
#if MAX_NUM_CCs>1
else
if
((
num_ack_nak
==
4
)
...
...
@@ -3425,8 +3476,17 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
||
((
pdu
[
0
]
==
1
)
&&
(
pdu
[
1
]
>=
2
)))
{
// one ACK
sched_ctl
->
round
[
0
][
harq_pid
]
++
;
sched_ctl
->
tbcnt
[
0
][
harq_pid
]
=
1
;
}
else
// both NAK/DTX
if
(
sched_ctl
->
round
[
0
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
0
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
0
][
harq_pid
]
=
0
;
}
}
else
{
// both NAK/DTX
sched_ctl
->
round
[
0
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
0
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
0
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
0
][
harq_pid
]
=
0
;
}
}
if
((
pdu
[
2
]
==
1
)
&&
(
pdu
[
3
]
==
1
))
{
// both ACK
sched_ctl
->
round
[
1
][
harq_pid
]
=
8
;
...
...
@@ -3435,8 +3495,17 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
||
((
pdu
[
2
]
==
1
)
&&
(
pdu
[
3
]
>=
2
)))
{
// one ACK
sched_ctl
->
round
[
1
][
harq_pid
]
++
;
sched_ctl
->
tbcnt
[
1
][
harq_pid
]
=
1
;
}
else
// both NAK/DTX
if
(
sched_ctl
->
round
[
1
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
1
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
1
][
harq_pid
]
=
0
;
}
}
else
{
// both NAK/DTX
sched_ctl
->
round
[
1
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
1
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
1
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
1
][
harq_pid
]
=
0
;
}
}
}
// A=4 both serving cells have 2 TBs
#endif
break
;
...
...
@@ -3451,8 +3520,13 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
if
(
pdu
[
j
]
==
1
)
{
sched_ctl
->
round
[
i
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
=
0
;
}
else
if
(
pdu
[
j
]
==
2
)
}
else
if
(
pdu
[
j
]
==
2
)
{
sched_ctl
->
round
[
i
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
i
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
i
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
=
0
;
}
}
else
AssertFatal
(
1
==
0
,
"Illegal harq_ack value for CC %d harq_pid %d (%d) UE %d/%x
\n
"
,
...
...
@@ -3467,13 +3541,25 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
&&
(
pdu
[
j
]
==
1
)
&&
(
pdu
[
j
+
1
]
==
2
))
{
sched_ctl
->
round
[
i
][
harq_pid
]
++
;
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
=
1
;
if
(
sched_ctl
->
round
[
i
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
i
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
=
0
;
}
}
else
if
((
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
==
2
)
&&
(
pdu
[
j
]
==
2
)
&&
(
pdu
[
j
+
1
]
==
1
))
{
sched_ctl
->
round
[
i
][
harq_pid
]
++
;
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
=
1
;
if
(
sched_ctl
->
round
[
i
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
i
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
=
0
;
}
}
else
if
((
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
==
2
)
&&
(
pdu
[
j
]
==
2
)
&&
(
pdu
[
j
+
1
]
==
2
))
{
sched_ctl
->
round
[
i
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
i
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
i
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
=
0
;
}
}
else
AssertFatal
(
1
==
0
,
"Illegal combination for CC %d harq_pid %d (%d,%d,%d) UE %d/%x
\n
"
,
...
...
@@ -3487,6 +3573,10 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
=
0
;
}
else
if
(
pdu
[
j
]
==
2
)
{
sched_ctl
->
round
[
i
][
harq_pid
]
++
;
if
(
sched_ctl
->
round
[
i
][
harq_pid
]
==
4
)
{
sched_ctl
->
round
[
i
][
harq_pid
]
=
8
;
sched_ctl
->
tbcnt
[
i
][
harq_pid
]
=
0
;
}
}
else
AssertFatal
(
1
==
0
,
"Illegal hack_nak value %d for CC %d harq_pid %d UE %d/%x
\n
"
,
...
...
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
View file @
b0154541
...
...
@@ -212,6 +212,30 @@ rx_sdu(const module_id_t enb_mod_idP,
UE_list
->
UE_template
[
CC_idP
][
UE_id
].
scheduled_ul_bytes
=
0
;
}
else
UE_list
->
UE_sched_ctrl
[
UE_id
].
round_UL
[
CC_idP
][
harq_pid
]
++
;
first_rb
=
UE_list
->
UE_template
[
CC_idP
][
UE_id
].
first_rb_ul
[
harq_pid
];
// Program NACK for PHICH
LOG_D
(
MAC
,
"Programming PHICH NACK for rnti %x harq_pid %d (first_rb %d)
\n
"
,
current_rnti
,
harq_pid
,
first_rb
);
nfapi_hi_dci0_request_t
*
hi_dci0_req
=
&
mac
->
HI_DCI0_req
[
CC_idP
];
nfapi_hi_dci0_request_body_t
*
hi_dci0_req_body
=
&
hi_dci0_req
->
hi_dci0_request_body
;
nfapi_hi_dci0_request_pdu_t
*
hi_dci0_pdu
=
&
hi_dci0_req_body
->
hi_dci0_pdu_list
[
hi_dci0_req_body
->
number_of_dci
+
hi_dci0_req_body
->
number_of_hi
];
memset
((
void
*
)
hi_dci0_pdu
,
0
,
sizeof
(
nfapi_hi_dci0_request_pdu_t
));
hi_dci0_pdu
->
pdu_type
=
NFAPI_HI_DCI0_HI_PDU_TYPE
;
hi_dci0_pdu
->
pdu_size
=
2
+
sizeof
(
nfapi_hi_dci0_hi_pdu
);
hi_dci0_pdu
->
hi_pdu
.
hi_pdu_rel8
.
tl
.
tag
=
NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG
;
hi_dci0_pdu
->
hi_pdu
.
hi_pdu_rel8
.
resource_block_start
=
first_rb
;
hi_dci0_pdu
->
hi_pdu
.
hi_pdu_rel8
.
cyclic_shift_2_for_drms
=
0
;
hi_dci0_pdu
->
hi_pdu
.
hi_pdu_rel8
.
hi_value
=
0
;
hi_dci0_req_body
->
number_of_hi
++
;
hi_dci0_req_body
->
sfnsf
=
sfnsf_add_subframe
(
frameP
,
subframeP
,
0
);
hi_dci0_req_body
->
tl
.
tag
=
NFAPI_HI_DCI0_REQUEST_BODY_TAG
;
hi_dci0_req
->
sfn_sf
=
sfnsf_add_subframe
(
frameP
,
subframeP
,
4
);
hi_dci0_req
->
header
.
message_id
=
NFAPI_HI_DCI0_REQUEST
;
return
;
}
...
...
@@ -251,6 +275,9 @@ rx_sdu(const module_id_t enb_mod_idP,
ra
[
RA_id
].
Msg3_subframe
=
(
ra
[
RA_id
].
Msg3_subframe
+
8
)
%
10
;
add_msg3
(
enb_mod_idP
,
CC_idP
,
&
ra
[
RA_id
],
frameP
,
subframeP
);
}
/* TODO: program NACK for PHICH? */
return
;
}
}
else
{
...
...
@@ -1448,6 +1475,10 @@ schedule_ulsch_rnti(module_id_t module_idP,
T_INT
(
first_rb
[
CC_id
]),
T_INT
(
rb_table
[
rb_table_index
]),
T_INT
(
round
));
#if 0
/* This is done in rx_sdu, as it has to.
* Since the code is a bit different, let's keep this version here for review, in case of problem.
*/
// fill in NAK information
hi_dci0_pdu = &hi_dci0_req_body->hi_dci0_pdu_list[hi_dci0_req_body->number_of_dci + hi_dci0_req_body->number_of_hi];
...
...
@@ -1471,6 +1502,7 @@ schedule_ulsch_rnti(module_id_t module_idP,
UE_template->first_rb_ul[harq_pid],
UE_template->nb_rb_ul[harq_pid],
UE_template->TBS_UL[harq_pid], round);
#endif
// Add UL_config PDUs
LOG_D
(
MAC
,
"[PUSCH %d] Frame %d, Subframe %d: Adding UL CONFIG.Request for UE %d/%x, ulsch_frame %d, ulsch_subframe %d
\n
"
,
...
...
openair2/LAYER2/MAC/pre_processor.c
View file @
b0154541
...
...
@@ -734,7 +734,7 @@ void dlsch_scheduler_pre_processor_accounting(module_id_t Mod_id,
// control channel or retransmission
/* TODO: do we have to check for retransmission? */
if
(
mac_eNB_get_rrc_status
(
Mod_id
,
rnti
)
<
RRC_RECONFIGURED
||
round
>
0
)
{
if
(
mac_eNB_get_rrc_status
(
Mod_id
,
rnti
)
<
RRC_RECONFIGURED
||
round
!=
8
)
{
nb_rbs_required_remaining_1
[
CC_id
][
UE_id
]
=
nb_rbs_required
[
CC_id
][
UE_id
];
}
else
{
...
...
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