Commit 97a1bd10 authored by Robert Schmidt's avatar Robert Schmidt

store_dlsch_buffer() works per CC, checks only active LCs

store_dlsch_buffer() puts the RLC buffer status results in the
UE_TEMPLATE, which is per-CC. Since the DLSCH scheduler works per-CC,
too, we pass the right CC. However, this is not strictly necessary, as
we could do this once before every CC, and it might be updated.
parent 2e9f391a
...@@ -947,8 +947,8 @@ void dlsch_scheduler_pre_processor_fairRR (module_id_t Mod_id, ...@@ -947,8 +947,8 @@ void dlsch_scheduler_pre_processor_fairRR (module_id_t Mod_id,
} }
#if (!defined(PRE_SCD_THREAD)) #if (!defined(PRE_SCD_THREAD))
// Store the DLSCH buffer for each logical channel // Store the DLSCH buffer for each logical channel and for PCCID (assume 0)
store_dlsch_buffer(Mod_id, frameP, subframeP); store_dlsch_buffer(Mod_id, 0, frameP, subframeP);
// Calculate the number of RBs required by each UE on the basis of logical channel's buffer // Calculate the number of RBs required by each UE on the basis of logical channel's buffer
assign_rbs_required_fairRR(Mod_id, frameP, subframeP, nb_rbs_required); assign_rbs_required_fairRR(Mod_id, frameP, subframeP, nb_rbs_required);
#else #else
......
...@@ -682,7 +682,7 @@ int mac_init(void); ...@@ -682,7 +682,7 @@ int mac_init(void);
int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti, int harq_pid, uint8_t rach_resource_type); int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti, int harq_pid, uint8_t rach_resource_type);
int rrc_mac_remove_ue(module_id_t Mod_id, rnti_t rntiP); int rrc_mac_remove_ue(module_id_t Mod_id, rnti_t rntiP);
void store_dlsch_buffer(module_id_t Mod_id, frame_t frameP, sub_frame_t subframeP); void store_dlsch_buffer(module_id_t Mod_id, int CC_id, frame_t frameP, sub_frame_t subframeP);
void assign_rbs_required(module_id_t Mod_id, int CC_id, uint16_t nb_rbs_required[MAX_MOBILES_PER_ENB]); void assign_rbs_required(module_id_t Mod_id, int CC_id, uint16_t nb_rbs_required[MAX_MOBILES_PER_ENB]);
int prev(UE_list_t *listP, int nodeP); int prev(UE_list_t *listP, int nodeP);
......
...@@ -63,24 +63,23 @@ sort_ue_ul(module_id_t module_idP, ...@@ -63,24 +63,23 @@ sort_ue_ul(module_id_t module_idP,
// This function stores the downlink buffer for all the logical channels // This function stores the downlink buffer for all the logical channels
void void
store_dlsch_buffer(module_id_t Mod_id, store_dlsch_buffer(module_id_t Mod_id,
int CC_id,
frame_t frameP, frame_t frameP,
sub_frame_t subframeP) { sub_frame_t subframeP) {
UE_info_t *UE_info = &RC.mac[Mod_id]->UE_info; UE_info_t *UE_info = &RC.mac[Mod_id]->UE_info;
for (int UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
if (UE_info->active[UE_id] != TRUE)
continue;
/* TODO why UE_template per CC? */ UE_TEMPLATE *UE_template = &UE_info->UE_template[CC_id][UE_id];
UE_TEMPLATE *UE_template = &UE_info->UE_template[UE_PCCID(Mod_id, UE_id)][UE_id]; UE_sched_ctrl_t *UE_sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
UE_template->dl_buffer_total = 0; UE_template->dl_buffer_total = 0;
UE_template->dl_pdus_total = 0; UE_template->dl_pdus_total = 0;
const rnti_t rnti = UE_RNTI(Mod_id, UE_id); /* loop over all activated logical channels */
for (int i = 0; i < UE_sched_ctrl->dl_lc_num; ++i) {
for (int lcid = 0; lcid < MAX_NUM_LCID; ++lcid) { // loop over all the logical channels const int lcid = UE_sched_ctrl->dl_lc_ids[i];
const mac_rlc_status_resp_t rlc_status = mac_rlc_status_ind(Mod_id, const mac_rlc_status_resp_t rlc_status = mac_rlc_status_ind(Mod_id,
rnti, UE_template->rnti,
Mod_id, Mod_id,
frameP, frameP,
subframeP, subframeP,
...@@ -91,16 +90,21 @@ store_dlsch_buffer(module_id_t Mod_id, ...@@ -91,16 +90,21 @@ store_dlsch_buffer(module_id_t Mod_id,
0, 0,
0 0
); );
UE_template->dl_buffer_info[lcid] = rlc_status.bytes_in_buffer; //storing the dlsch buffer for each logical channel UE_template->dl_buffer_info[lcid] = rlc_status.bytes_in_buffer;
UE_template->dl_pdus_in_buffer[lcid] = rlc_status.pdus_in_buffer; UE_template->dl_pdus_in_buffer[lcid] = rlc_status.pdus_in_buffer;
UE_template->dl_buffer_head_sdu_creation_time[lcid] = rlc_status.head_sdu_creation_time; UE_template->dl_buffer_head_sdu_creation_time[lcid] = rlc_status.head_sdu_creation_time;
UE_template->dl_buffer_head_sdu_creation_time_max = UE_template->dl_buffer_head_sdu_creation_time_max =
cmax(UE_template->dl_buffer_head_sdu_creation_time_max, rlc_status.head_sdu_creation_time); cmax(UE_template->dl_buffer_head_sdu_creation_time_max, rlc_status.head_sdu_creation_time);
UE_template->dl_buffer_head_sdu_remaining_size_to_send[lcid] = rlc_status.head_sdu_remaining_size_to_send; UE_template->dl_buffer_head_sdu_remaining_size_to_send[lcid] = rlc_status.head_sdu_remaining_size_to_send;
UE_template->dl_buffer_head_sdu_is_segmented[lcid] = rlc_status.head_sdu_is_segmented; UE_template->dl_buffer_head_sdu_is_segmented[lcid] = rlc_status.head_sdu_is_segmented;
UE_template->dl_buffer_total += UE_template->dl_buffer_info[lcid]; //storing the total dlsch buffer UE_template->dl_buffer_total += UE_template->dl_buffer_info[lcid];
UE_template->dl_pdus_total += UE_template->dl_pdus_in_buffer[lcid]; UE_template->dl_pdus_total += UE_template->dl_pdus_in_buffer[lcid];
/* update the number of bytes in the UE_sched_ctrl. The DLSCH will use
* this to request the corresponding data from the RLC, and this might be
* limited in the preprocessor */
UE_sched_ctrl->dl_lc_bytes[i] = rlc_status.bytes_in_buffer;
#ifdef DEBUG_eNB_SCHEDULER #ifdef DEBUG_eNB_SCHEDULER
/* note for dl_buffer_head_sdu_remaining_size_to_send[lcid] : /* note for dl_buffer_head_sdu_remaining_size_to_send[lcid] :
* 0 if head SDU has not been segmented (yet), else remaining size not already segmented and sent * 0 if head SDU has not been segmented (yet), else remaining size not already segmented and sent
...@@ -285,9 +289,8 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id, ...@@ -285,9 +289,8 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
CC_id, CC_id,
rballoc_sub); rballoc_sub);
store_dlsch_buffer(Mod_id, /* update all buffers. TODO move before CC scheduling */
frameP, store_dlsch_buffer(Mod_id, CC_id, frameP, subframeP);
subframeP);
// Calculate the number of RBs required by each UE on the basis of logical channel's buffer // Calculate the number of RBs required by each UE on the basis of logical channel's buffer
uint16_t nb_rbs_required[MAX_MOBILES_PER_ENB]; uint16_t nb_rbs_required[MAX_MOBILES_PER_ENB];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment