Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
oai
openairinterface5G
Commits
663b1d8b
Commit
663b1d8b
authored
Dec 27, 2017
by
Xu Bo
Browse files
fix bugs for hundreds_of_ues(UE SCD)
parent
741c87c0
Changes
18
Hide whitespace changes
Inline
Side-by-side
common/utils/itti/intertask_interface.c
View file @
663b1d8b
...
...
@@ -63,6 +63,9 @@
#include
"signals.h"
#include
"timer.h"
#ifdef UE_EXPANSION
#include
"log.h"
#endif
#ifdef RTAI
# include <rtai.h>
...
...
@@ -455,7 +458,21 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
/* Enqueue message in destination task queue */
if
(
lfds611_queue_enqueue
(
itti_desc
.
tasks
[
destination_task_id
].
message_queue
,
new
)
==
0
)
{
#ifdef UE_EXPANSION
LOG_I
(
UDP_
,
" Assertion Message %s(id:%d), number %lu with priority %d can not be sent from (%u:%s) to queue (%u:%s). discarding...
\n
"
,
itti_desc
.
messages_info
[
message_id
].
name
,
message_id
,
message_number
,
priority
,
origin_task_id
,
itti_get_task_name
(
origin_task_id
),
destination_task_id
,
itti_get_task_name
(
destination_task_id
));
int
result
=
itti_free
(
origin_task_id
,
message
);
AssertFatal
(
result
==
EXIT_SUCCESS
,
"Failed to free memory (%d)!
\n
"
,
result
);
#else
AssertFatal
(
0
,
"Error: lfds611_queue_enqueue returns 0, queue is full, exiting
\n
"
);
#endif
}
#if defined(OAI_EMU) || defined(RTAI)
...
...
@@ -625,7 +642,14 @@ static inline void itti_receive_msg_internal_event_fd(task_id_t task_id, uint8_t
if
(
lfds611_queue_dequeue
(
itti_desc
.
tasks
[
task_id
].
message_queue
,
(
void
**
)
&
message
)
==
0
)
{
/* No element in list -> this should not happen */
#ifdef UE_EXPANSION
LOG_I
(
UDP_
,
"Assertion No message in queue for task %d while there are %d events and some for the messages queue!
\n
"
,
task_id
,
epoll_ret
);
/* Mark that the event has been processed */
itti_desc
.
threads
[
thread_id
].
events
[
i
].
events
&=
~
EPOLLIN
;
return
;
#else
AssertFatal
(
0
,
"No message in queue for task %d while there are %d events and some for the messages queue!
\n
"
,
task_id
,
epoll_ret
);
#endif
}
AssertFatal
(
message
!=
NULL
,
"Message from message queue is NULL!
\n
"
);
...
...
openair1/PHY/LTE_TRANSPORT/dci_tools.c
View file @
663b1d8b
...
...
@@ -2639,8 +2639,15 @@ void fill_ulsch(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_ulsch_pdu *ulsch_pdu
ulsch
->
harq_processes
[
harq_pid
]
->
Or1
=
0
;
ulsch
->
harq_processes
[
harq_pid
]
->
Or2
=
0
;
}
#ifndef UE_EXPANSION
else
ulsch
->
harq_processes
[
harq_pid
]
->
round
++
;
#else
else
{
ulsch
->
harq_processes
[
harq_pid
]
->
round
++
;
ulsch
->
harq_processes
[
harq_pid
]
->
TBS
=
ulsch_pdu
->
ulsch_pdu_rel8
.
size
<<
3
;
ulsch
->
harq_processes
[
harq_pid
]
->
Msc_initial
=
12
*
ulsch_pdu
->
ulsch_pdu_rel8
.
number_of_resource_blocks
;
}
#endif
ulsch
->
rnti
=
ulsch_pdu
->
ulsch_pdu_rel8
.
rnti
;
LOG_D
(
PHY
,
"Filling ULSCH %x (UE_id %d) (new_ulsch %d) for Frame %d, Subframe %d : harq_pid %d, first_rb %d, nb_rb %d, rvidx %d, Qm %d, TBS %d, round %d
\n
"
,
ulsch
->
rnti
,
...
...
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
View file @
663b1d8b
...
...
@@ -916,8 +916,9 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
G
);
//#endif
#ifndef UE_EXPANSION
if
(
ulsch_harq
->
round
==
0
)
{
#endif
// This is a new packet, so compute quantities regarding segmentation
ulsch_harq
->
B
=
A
+
24
;
lte_segmentation
(
NULL
,
...
...
@@ -930,8 +931,9 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
&
ulsch_harq
->
Kminus
,
&
ulsch_harq
->
F
);
// CLEAR LLR's HERE for first packet in process
#ifndef UE_EXPANSION
}
#endif
// printf("after segmentation c[%d] = %p\n",0,ulsch_harq->c[0]);
sumKr
=
0
;
...
...
openair2/LAYER2/MAC/eNB_scheduler.c
View file @
663b1d8b
...
...
@@ -549,7 +549,7 @@ check_ul_failure(module_id_t module_idP, int CC_id, int UE_id,
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_failure_timer
++
;
// check threshold
if
(
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_failure_timer
>
200
)
{
if
(
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_failure_timer
>
200
00
)
{
// inform RRC of failure and clear timer
LOG_I
(
MAC
,
"UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC
\n
"
,
...
...
@@ -724,7 +724,9 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP,
}
#endif
#ifdef UE_EXPANSION
memset
(
dlsch_ue_select
,
0
,
sizeof
(
dlsch_ue_select
));
#endif
// This schedules MIB
if
((
subframeP
==
0
)
&&
(
frameP
&
3
)
==
0
)
schedule_mib
(
module_idP
,
frameP
,
subframeP
);
...
...
openair2/LAYER2/MAC/eNB_scheduler_RA.c
View file @
663b1d8b
...
...
@@ -507,6 +507,13 @@ generate_Msg2(module_id_t module_idP, int CC_idP, frame_t frameP,
TX_req
->
segments
[
0
].
segment_data
=
cc
[
CC_idP
].
RAR_pdu
.
payload
;
mac
->
TX_req
[
CC_idP
].
tx_request_body
.
number_of_pdus
++
;
#ifdef UE_EXPANSION
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
ue_priority
=
SCH_DL_MSG2
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
nb_rb
=
4
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
UE_id
=
-
1
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
rnti
=
ra
->
rnti
;
dlsch_ue_select
[
CC_idP
].
ue_num
++
;
#endif
}
}
...
...
@@ -634,6 +641,13 @@ generate_Msg2(module_id_t module_idP, int CC_idP, frame_t frameP,
TX_req
->
segments
[
0
].
segment_data
=
cc
[
CC_idP
].
RAR_pdu
.
payload
;
mac
->
TX_req
[
CC_idP
].
tx_request_body
.
number_of_pdus
++
;
#ifdef UE_EXPANSION
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
ue_priority
=
SCH_DL_MSG2
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
nb_rb
=
4
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
UE_id
=
-
1
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
rnti
=
ra
->
rnti
;
dlsch_ue_select
[
CC_idP
].
ue_num
++
;
#endif
}
// PDCCH CCE allocation is feasible
}
// Msg2 frame/subframe condition
}
// else BL/CE
...
...
@@ -1092,6 +1106,13 @@ generate_Msg4(module_id_t module_idP, int CC_idP, frame_t frameP,
UE_id
),
rrc_sdu_length
);
}
#ifdef UE_EXPANSION
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
ue_priority
=
SCH_DL_MSG4
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
nb_rb
=
4
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
UE_id
=
UE_id
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
rnti
=
ra
->
rnti
;
dlsch_ue_select
[
CC_idP
].
ue_num
++
;
#endif
}
// Msg4 frame/subframe
}
// msg4_mpdcch_repetition_count
}
// rach_resource_type > 0
...
...
@@ -1293,7 +1314,13 @@ generate_Msg4(module_id_t module_idP, int CC_idP, frame_t frameP,
UE_id
),
rrc_sdu_length
);
}
#ifdef UE_EXPANSION
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
ue_priority
=
SCH_DL_MSG4
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
nb_rb
=
4
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
UE_id
=
UE_id
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
rnti
=
ra
->
rnti
;
dlsch_ue_select
[
CC_idP
].
ue_num
++
;
#endif
}
// CCE Allocation feasible
}
// msg4 frame/subframe
}
// else rach_resource_type
...
...
@@ -1431,6 +1458,13 @@ check_Msg4_retransmission(module_id_t module_idP, int CC_idP,
(
cc
->
p_eNB
==
1
)
?
1
:
2
,
// transmission mode
1
,
// num_bf_prb_per_subband
1
);
// num_bf_vector
#ifdef UE_EXPANSION
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
ue_priority
=
SCH_DL_MSG4
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
nb_rb
=
4
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
UE_id
=
UE_id
;
dlsch_ue_select
[
CC_idP
].
list
[
dlsch_ue_select
[
CC_idP
].
ue_num
].
rnti
=
ra
->
rnti
;
dlsch_ue_select
[
CC_idP
].
ue_num
++
;
#endif
}
else
LOG_D
(
MAC
,
"msg4 retransmission for rnti %x (round %d) fsf %d/%d CCE allocation failed!
\n
"
,
...
...
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
View file @
663b1d8b
...
...
@@ -511,10 +511,6 @@ schedule_ue_spec(module_id_t module_idP,
}
}
#ifdef UE_EXPANSION
DLSCH_UE_SELECT
dlsch_ue_select
[
MAX_NUM_CCs
];
memset
(
dlsch_ue_select
,
0
,
sizeof
(
dlsch_ue_select
));
#endif
//weight = get_ue_weight(module_idP,UE_id);
aggregation
=
2
;
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
...
...
@@ -546,11 +542,7 @@ schedule_ue_spec(module_id_t module_idP,
frameP
,
subframeP
,
N_RBG
,
mbsfn_flag
#ifdef UE_EXPANSION
,
dlsch_ue_select
#endif
);
mbsfn_flag
);
stop_meas
(
&
eNB
->
schedule_dlsch_preprocessor
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR
,
VCD_FUNCTION_OUT
);
...
...
@@ -564,11 +556,52 @@ schedule_ue_spec(module_id_t module_idP,
#ifdef UE_EXPANSION
for
(
i
=
0
;
i
<
dlsch_ue_select
[
CC_id
].
ue_num
;
i
++
)
{
if
(
dlsch_ue_select
[
CC_id
].
list
[
i
].
ue_priority
==
SCH_DL_MSG2
){
continue
;
}
if
(
dlsch_ue_select
[
CC_id
].
list
[
i
].
ue_priority
==
SCH_DL_MSG4
){
continue
;
}
UE_id
=
dlsch_ue_select
[
CC_id
].
list
[
i
].
UE_id
;
rnti
=
UE_RNTI
(
module_idP
,
UE_id
);
if
(
rnti
==
NOT_A_RNTI
)
{
LOG_E
(
MAC
,
"Cannot find rnti for UE_id %d (num_UEs %d)
\n
"
,
UE_id
,
UE_list
->
num_UEs
);
continue
;
}
eNB_UE_stats
=
&
UE_list
->
eNB_UE_stats
[
CC_id
][
UE_id
];
ue_sched_ctl
=
&
UE_list
->
UE_sched_ctrl
[
UE_id
];
switch
(
get_tmode
(
module_idP
,
CC_id
,
UE_id
)){
case
1
:
case
2
:
case
7
:
aggregation
=
get_aggregation
(
get_bw_index
(
module_idP
,
CC_id
),
ue_sched_ctl
->
dl_cqi
[
CC_id
],
format1
);
break
;
case
3
:
aggregation
=
get_aggregation
(
get_bw_index
(
module_idP
,
CC_id
),
ue_sched_ctl
->
dl_cqi
[
CC_id
],
format2A
);
break
;
default:
LOG_W
(
MAC
,
"Unsupported transmission mode %d
\n
"
,
get_tmode
(
module_idP
,
CC_id
,
UE_id
));
aggregation
=
2
;
break
;
}
if
(
cc
[
CC_id
].
tdd_Config
!=
NULL
)
{
//TDD
set_ue_dai
(
subframeP
,
UE_id
,
CC_id
,
cc
[
CC_id
].
tdd_Config
->
subframeAssignment
,
UE_list
);
// update UL DAI after DLSCH scheduling
set_ul_DAI
(
module_idP
,
UE_id
,
CC_id
,
frameP
,
subframeP
);
}
#else
for
(
UE_id
=
UE_list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
#endif
continue_flag
=
0
;
// reset the flag to allow allocation for the remaining UEs
rnti
=
UE_RNTI
(
module_idP
,
UE_id
);
...
...
@@ -632,6 +665,7 @@ schedule_ue_spec(module_id_t module_idP,
CC_id
,
UE_id
,
subframeP
,
S_DL_NONE
);
continue
;
}
#endif
#warning RK->CR This old API call has to be revisited for FAPI, or logic must be changed
#if 0
/* add "fake" DCI to have CCE_allocation_infeasible work properly for next allocations */
...
...
@@ -1415,7 +1449,9 @@ schedule_ue_spec(module_id_t module_idP,
eNB
->
pdu_index
[
CC_id
]
++
;
program_dlsch_acknak
(
module_idP
,
CC_id
,
UE_id
,
frameP
,
subframeP
,
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
cce_idx
);
#ifdef UE_EXPANSION
last_dlsch_ue_id
[
CC_id
]
=
UE_id
;
#endif
}
else
{
LOG_W
(
MAC
,
"Frame %d, Subframe %d: Dropping DLSCH allocation for UE %d/%x, infeasible CCE allocations
\n
"
,
...
...
@@ -1434,11 +1470,7 @@ schedule_ue_spec(module_id_t module_idP,
}
// CC_id loop
#ifndef UE_EXPANSION
fill_DLSCH_dci
(
module_idP
,
frameP
,
subframeP
,
mbsfn_flag
);
#else
fill_DLSCH_dci
(
module_idP
,
frameP
,
subframeP
,
mbsfn_flag
,
dlsch_ue_select
);
#endif
stop_meas
(
&
eNB
->
schedule_dlsch
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH
,
VCD_FUNCTION_OUT
);
...
...
@@ -1451,11 +1483,7 @@ fill_DLSCH_dci(
module_id_t
module_idP
,
frame_t
frameP
,
sub_frame_t
subframeP
,
int
*
mbsfn_flagP
#ifdef UE_EXPANSION
,
DLSCH_UE_SELECT
dlsch_ue_select
[
MAX_NUM_CCs
]
#endif
)
int
*
mbsfn_flagP
)
//------------------------------------------------------------------------------
{
...
...
@@ -1495,7 +1523,13 @@ fill_DLSCH_dci(
// UE specific DCIs
#ifdef UE_EXPANSION
for
(
j
=
0
;
j
<
dlsch_ue_select
[
CC_id
].
ue_num
;
j
++
)
{
UE_id
=
dlsch_ue_select
[
CC_id
].
list
[
j
].
UE_id
;
if
(
dlsch_ue_select
[
CC_id
].
list
[
j
].
ue_priority
==
SCH_DL_MSG2
){
continue
;
}
if
(
dlsch_ue_select
[
CC_id
].
list
[
j
].
ue_priority
==
SCH_DL_MSG4
){
continue
;
}
UE_id
=
dlsch_ue_select
[
CC_id
].
list
[
j
].
UE_id
;
#else
for
(
UE_id
=
UE_list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
#endif
...
...
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
View file @
663b1d8b
...
...
@@ -933,10 +933,12 @@ schedule_ulsch(module_id_t module_idP, frame_t frameP,
int
CC_id
;
eNB_MAC_INST
*
mac
=
RC
.
mac
[
module_idP
];
COMMON_channels_t
*
cc
;
int
sched_frame
=
frameP
;
start_meas
(
&
mac
->
schedule_ulsch
);
int
sched_subframe
=
(
subframeP
+
4
)
%
10
;
if
(
sched_subframe
<
subframeP
)
sched_frame
++
;
cc
=
&
mac
->
common_channels
[
0
];
int
tdd_sfa
;
...
...
@@ -1051,7 +1053,7 @@ schedule_ulsch(module_id_t module_idP, frame_t frameP,
}
//PRACH
if
(
is_prach_subframe
(
frame_parms
,
frame
P
,
subframe
P
)
==
1
)
{
if
(
is_prach_subframe
(
frame_parms
,
sched_
frame
,
sched_
subframe
)
==
1
)
{
ulsch_ue_select
[
CC_id
].
list
[
ulsch_ue_select
[
CC_id
].
ue_num
].
ue_priority
=
SCH_UL_PRACH
;
ulsch_ue_select
[
CC_id
].
list
[
ulsch_ue_select
[
CC_id
].
ue_num
].
start_rb
=
get_prach_prb_offset
(
frame_parms
,
...
...
openair2/LAYER2/MAC/extern.h
View file @
663b1d8b
...
...
@@ -102,6 +102,7 @@ extern DCI2_5MHz_2A_TDD_t DLSCH_alloc_pdu2;
extern
DCI1E_5MHz_2A_M10PRB_TDD_t
DLSCH_alloc_pdu1E
;
#ifdef UE_EXPANSION
extern
DLSCH_UE_SELECT
dlsch_ue_select
[
MAX_NUM_CCs
];
extern
int
last_dlsch_ue_id
[
MAX_NUM_CCs
];
extern
int
last_ulsch_ue_id
[
MAX_NUM_CCs
];
#endif
...
...
openair2/LAYER2/MAC/pre_processor.c
View file @
663b1d8b
...
...
@@ -117,13 +117,6 @@ store_dlsch_buffer(module_id_t Mod_id, frame_t frameP,
UE_template
->
dl_buffer_total
=
0
;
UE_template
->
dl_pdus_total
=
0
;
for
(
i
=
0
;
i
<
MAX_NUM_LCID
;
i
++
)
{
UE_template
->
dl_buffer_info
[
i
]
=
0
;
UE_template
->
dl_pdus_in_buffer
[
i
]
=
0
;
UE_template
->
dl_buffer_head_sdu_creation_time
[
i
]
=
0
;
UE_template
->
dl_buffer_head_sdu_remaining_size_to_send
[
i
]
=
0
;
}
rnti
=
UE_RNTI
(
Mod_id
,
UE_id
);
for
(
i
=
0
;
i
<
MAX_NUM_LCID
;
i
++
)
{
// loop over all the logical channels
...
...
@@ -551,6 +544,18 @@ void sort_UEs(module_id_t Mod_idP, int frameP, sub_frame_t subframeP)
}
#ifdef UE_EXPANSION
int
cc_id_end
(
uint8_t
*
cc_id_flag
)
{
int
end_flag
=
1
;
for
(
int
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
if
(
cc_id_flag
[
CC_id
]
==
0
)
{
end_flag
=
0
;
break
;
}
}
return
end_flag
;
}
void
dlsch_scheduler_pre_ue_select
(
module_id_t
module_idP
,
frame_t
frameP
,
...
...
@@ -559,43 +564,31 @@ void dlsch_scheduler_pre_ue_select(
uint16_t
nb_rbs_required
[
MAX_NUM_CCs
][
NUMBER_OF_UE_MAX
],
DLSCH_UE_SELECT
dlsch_ue_select
[
MAX_NUM_CCs
])
{
uint8_t
CC_id
;
int
UE_id
;
// uint16_t nb_rb;
unsigned
char
round
=
0
;
unsigned
char
harq_pid
=
0
;
eNB_MAC_INST
*
eNB
=
RC
.
mac
[
module_idP
];
COMMON_channels_t
*
cc
=
eNB
->
common_channels
;
UE_list_t
*
UE_list
=
&
eNB
->
UE_list
;
UE_sched_ctrl
*
ue_sched_ctl
;
uint8_t
CC_id
;
int
UE_id
;
unsigned
char
round
=
0
;
unsigned
char
harq_pid
=
0
;
rnti_t
rnti
;
uint16_t
i
;
unsigned
char
aggregation
;
// int i;
// int N_RB_DL[MAX_NUM_CCs];
uint16_t
used_dlsch_rbs_num
[
MAX_NUM_CCs
]
=
{
0
};
uint16_t
available_dlsch_rbs_num
[
MAX_NUM_CCs
]
=
{
0
};
uint16_t
dl_ue_max_num
[
MAX_NUM_CCs
]
=
{
0
};
uint16_t
dlsch_ue_max_num
[
MAX_NUM_CCs
]
=
{
0
};
int
format_flag
;
nfapi_dl_config_request_body_t
*
DL_req
;
nfapi_dl_config_request_pdu_t
*
dl_config_pdu
;
uint16_t
dlsch_ue_max_num
[
MAX_NUM_CCs
]
=
{
0
};
uint16_t
saved_dlsch_dci
[
MAX_NUM_CCs
]
=
{
0
};
int
continue_flag
=
0
;
int
old_last_dlsch_ue_id
[
MAX_NUM_CCs
];
u
int
8_t
end_flag
[
MAX_NUM_CCs
]
=
{
0
}
;
// Initialization
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
// get maximum UE number of DLSCH
dl_ue_max_num
[
CC_id
]
=
NUMBER_OF_UE_MAX
;
dlsch_ue_max_num
[
CC_id
]
=
(
uint16_t
)
RC
.
rrc
[
module_idP
]
->
configuration
.
ue_multiple_max
[
CC_id
];
// save origin DL PDU number
DL_req
=
&
eNB
->
DL_req
[
CC_id
].
dl_config_request_body
;
saved_dlsch_dci
[
CC_id
]
=
DL_req
->
number_pdu
;
// set available_dlsch_rbs
available_dlsch_rbs_num
[
CC_id
]
=
eNB
->
eNB_stats
[
CC_id
].
available_prbs
;
// get last DLSCH ue_id
old_last_dlsch_ue_id
[
CC_id
]
=
last_dlsch_ue_id
[
CC_id
];
}
// Insert DLSCH(retransmission) UE into selected UE list
...
...
@@ -605,7 +598,7 @@ void dlsch_scheduler_pre_ue_select(
}
DL_req
=
&
eNB
->
DL_req
[
CC_id
].
dl_config_request_body
;
for
(
UE_id
=
0
;
UE_id
<
dl_ue_max_num
[
CC_id
]
/*
NUMBER_OF_UE_MAX
*/
;
UE_id
++
)
{
for
(
UE_id
=
0
;
UE_id
<
NUMBER_OF_UE_MAX
;
UE_id
++
)
{
if
(
UE_list
->
active
[
UE_id
]
==
FALSE
)
{
continue
;
}
...
...
@@ -620,15 +613,14 @@ void dlsch_scheduler_pre_ue_select(
continue
;
}
if
(
nb_rbs_required
[
CC_id
][
UE_id
]
==
0
)
{
continue
;
}
if
(
cc
[
CC_id
].
tdd_Config
)
harq_pid
=
((
frameP
*
10
)
+
subframeP
)
%
10
;
else
harq_pid
=
((
frameP
*
10
)
+
subframeP
)
&
7
;
round
=
ue_sched_ctl
->
round
[
CC_id
][
harq_pid
];
if
(
round
!=
8
)
{
// retransmission
if
(
UE_list
->
UE_template
[
CC_id
][
UE_id
].
nb_rb
[
harq_pid
]
==
0
){
continue
;
}
switch
(
get_tmode
(
module_idP
,
CC_id
,
UE_id
))
{
case
1
:
case
2
:
...
...
@@ -667,12 +659,8 @@ void dlsch_scheduler_pre_ue_select(
dlsch_ue_select
[
CC_id
].
list
[
dlsch_ue_select
[
CC_id
].
ue_num
].
rnti
=
rnti
;
dlsch_ue_select
[
CC_id
].
list
[
dlsch_ue_select
[
CC_id
].
ue_num
].
nb_rb
=
nb_rbs_required
[
CC_id
][
UE_id
];
dlsch_ue_select
[
CC_id
].
ue_num
++
;
used_dlsch_rbs_num
[
CC_id
]
+=
nb_rbs_required
[
CC_id
][
UE_id
];
if
(
dlsch_ue_select
[
CC_id
].
ue_num
==
dlsch_ue_max_num
[
CC_id
])
{
break
;
}
if
(
used_dlsch_rbs_num
[
CC_id
]
>
available_dlsch_rbs_num
[
CC_id
])
{
dlsch_ue_select
[
CC_id
].
ue_num
--
;
// roll back
end_flag
[
CC_id
]
=
1
;
break
;
}
}
else
{
...
...
@@ -691,22 +679,29 @@ void dlsch_scheduler_pre_ue_select(
UE_id
,
subframeP
,
S_DL_NONE
);
end_flag
[
CC_id
]
=
1
;
break
;
}
}
}
}
if
(
cc_id_end
(
end_flag
)
==
1
){
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
DL_req
=
&
eNB
->
DL_req
[
CC_id
].
dl_config_request_body
;
DL_req
->
number_pdu
=
saved_dlsch_dci
[
CC_id
];
}
return
;
}
// Insert DLSCH(first transmission) UE into selected UE list (UE_id > last_dlsch_ue_id[CC_id])
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
if
(
mbsfn_flag
[
CC_id
]
>
0
)
{
continue
;
}
if
(
mbsfn_flag
[
CC_id
]
>
0
)
{
continue
;
}
if
(
dlsch_ue_select
[
CC_id
].
ue_num
<
dlsch_ue_max_num
[
CC_id
]
&&
used_dlsch_rbs_num
[
CC_id
]
<
available_dlsch_rbs_num
[
CC_id
])
{
DL_req
=
&
eNB
->
DL_req
[
CC_id
].
dl_config_request_body
;
for
(
UE_id
=
(
old_
last_dlsch_ue_id
[
CC_id
]
+
1
);
UE_id
<
dl_ue_max_num
[
CC_id
]
;
UE_id
++
)
{
if
(
dlsch_ue_select
[
CC_id
].
ue_num
>=
dlsch_ue_max_num
[
CC_id
])
{
for
(
UE_id
=
(
last_dlsch_ue_id
[
CC_id
]
+
1
);
UE_id
<
NUMBER_OF_UE_MAX
;
UE_id
++
)
{
if
(
end_flag
[
CC_id
]
==
1
)
{
break
;
}
...
...
@@ -723,16 +718,22 @@ void dlsch_scheduler_pre_ue_select(
continue
;
}
continue_flag
=
0
;
if
(
nb_rbs_required
[
CC_id
][
UE_id
]
==
0
)
{
continue_flag
=
1
;
}
else
{
if
(
cc
[
CC_id
].
tdd_Config
)
harq_pid
=
((
frameP
*
10
)
+
subframeP
)
%
10
;
else
harq_pid
=
((
frameP
*
10
)
+
subframeP
)
&
7
;
for
(
i
=
0
;
i
<
dlsch_ue_select
[
CC_id
].
ue_num
;
i
++
){
if
(
dlsch_ue_select
[
CC_id
].
list
[
i
].
UE_id
==
UE_id
){
break
;
}
}
if
(
i
<
dlsch_ue_select
[
CC_id
].
ue_num
)
continue
;
round
=
ue_sched_ctl
->
round
[
CC_id
][
harq_pid
];
if
(
round
==
8
)
{
ue_sched_ctl
=
&
UE_list
->
UE_sched_ctrl
[
UE_id
];
if
(
cc
[
CC_id
].
tdd_Config
)
harq_pid
=
((
frameP
*
10
)
+
subframeP
)
%
10
;
else
harq_pid
=
((
frameP
*
10
)
+
subframeP
)
&
7
;
round
=
ue_sched_ctl
->
round
[
CC_id
][
harq_pid
];
if
(
round
==
8
)
{
if
(
nb_rbs_required
[
CC_id
][
UE_id
]
==
0
)
{
continue
;
}
switch
(
get_tmode
(
module_idP
,
CC_id
,
UE_id
))
{
case
1
:
case
2
:
...
...
@@ -749,6 +750,7 @@ void dlsch_scheduler_pre_ue_select(
default:
LOG_W
(
MAC
,
"Unsupported transmission mode %d
\n
"
,
get_tmode
(
module_idP
,
CC_id
,
UE_id
));
aggregation
=
2
;
break
;
}
format_flag
=
1
;
if
(
!
CCE_allocation_infeasible
(
module_idP
,
...
...
@@ -770,45 +772,49 @@ void dlsch_scheduler_pre_ue_select(
dlsch_ue_select
[
CC_id
].
list
[
dlsch_ue_select
[
CC_id
].
ue_num
].
UE_id
=
UE_id
;
dlsch_ue_select
[
CC_id
].
list
[
dlsch_ue_select
[
CC_id
].
ue_num
].
rnti
=
rnti
;
dlsch_ue_select
[
CC_id
].
ue_num
++
;
last_dlsch_ue_id
[
CC_id
]
=
UE_id
;
}
else
{
continue_flag
=
1
;
}
}
}
if
(
continue_flag
==
1
)
{
if
(
cc
[
CC_id
].
tdd_Config
!=
NULL
)
{
//TDD
set_ue_dai
(
subframeP
,
UE_id
,
CC_id
,
cc
[
CC_id
].
tdd_Config
->
subframeAssignment
,
UE_list
);
// update UL DAI after DLSCH scheduling
set_ul_DAI
(
module_idP
,
UE_id
,
CC_id
,
frameP
,
subframeP
);
}
add_ue_dlsch_info
(
module_idP
,
if
(
dlsch_ue_select
[
CC_id
].
ue_num
==
dlsch_ue_max_num
[
CC_id
])
{
end_flag
[
CC_id
]
=
1
;
break
;
}
}
else
{
if
(
cc
[
CC_id
].
tdd_Config
!=
NULL
)
{
//TDD
set_ue_dai
(
subframeP
,
UE_id
,
CC_id
,
cc
[
CC_id
].
tdd_Config
->
subframeAssignment
,
UE_list
);
// update UL DAI after DLSCH scheduling
set_ul_DAI
(
module_idP
,
UE_id
,
CC_id
,
frameP
,
subframeP
);
}
add_ue_dlsch_info
(
module_idP
,
CC_id
,
UE_id
,
subframeP
,
S_DL_NONE
);
}
end_flag
[
CC_id
]
=
1
;
break
;
}
}
}
}
if
(
cc_id_end
(
end_flag
)
==
1
){
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
DL_req
=
&
eNB
->
DL_req
[
CC_id
].
dl_config_request_body
;
DL_req
->
number_pdu
=
saved_dlsch_dci
[
CC_id
];
}
return
;
}
// Insert DLSCH(first transmission) UE into selected UE list (UE_id <= last_dlsch_ue_id[CC_id])