From 1372e0220683b8bafc723c4e5d33dedd13619dd6 Mon Sep 17 00:00:00 2001 From: Robert Schmidt <robert.schmidt@eurecom.fr> Date: Sun, 5 Apr 2020 15:59:14 +0200 Subject: [PATCH] Check for CCE allocation in UL PP --- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 2 +- openair2/LAYER2/MAC/mac.h | 3 +++ openair2/LAYER2/MAC/pre_processor.c | 21 ++++++++++++++++++--- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 52c930113f7..656dd885dfd 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -1353,7 +1353,7 @@ schedule_ulsch_rnti(module_id_t module_idP, if (UE_template_ptr->pre_allocated_nb_rb_ul < 1) continue; - int dci_ul_pdu_idx = -1; + int dci_ul_pdu_idx = UE_template_ptr->pre_dci_ul_pdu_idx; if (dci_ul_pdu_idx < 0) { dci_ul_pdu_idx = CCE_try_allocate_ulsch( module_idP, CC_id, subframeP, UE_id, UE_sched_ctrl_ptr->dl_cqi[CC_id]); diff --git a/openair2/LAYER2/MAC/mac.h b/openair2/LAYER2/MAC/mac.h index 91cd447d098..329e262c828 100644 --- a/openair2/LAYER2/MAC/mac.h +++ b/openair2/LAYER2/MAC/mac.h @@ -831,6 +831,9 @@ typedef struct { /// index of Allocated RBs by the ulsch preprocessor int8_t pre_allocated_rb_table_index_ul; + /// index of allocated HI_DCI0 + int pre_dci_ul_pdu_idx; + /// total allocated RBs int8_t total_allocated_rbs; diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index 5e1e6c2fcdb..d649832090d 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -509,6 +509,11 @@ int round_robin_ul(module_id_t Mod_id, UE_info->UE_sched_ctrl[UE_id].round_UL[CC_id][harq_pid]); continue; } + const uint8_t cqi = UE_info->UE_sched_ctrl[UE_id].dl_cqi[CC_id]; + const int idx = CCE_try_allocate_ulsch(Mod_id, CC_id, subframe, UE_id, cqi); + if (idx < 0) + continue; // cannot allocate CCE + UE_template->pre_dci_ul_pdu_idx = idx; if (rbs[0].length >= nb_rb) { // fits in first contiguous region UE_template->pre_first_nb_rb_ul = rbs[0].start; rbs[0].length -= nb_rb; @@ -531,6 +536,8 @@ int round_robin_ul(module_id_t Mod_id, "cannot allocate UL retransmission for UE %d (nb_rb %d)\n", UE_id, nb_rb); + UE_template->pre_dci_ul_pdu_idx = -1; // do not need CCE + RC.mac[Mod_id]->HI_DCI0_req[CC_id][subframe].hi_dci0_request_body.number_of_dci--; continue; } LOG_D(MAC, "%4d.%d UE %d retx %d RBs at start %d\n", @@ -640,8 +647,15 @@ int round_robin_ul(module_id_t Mod_id, while (num_ue_sched < nr[r]) { while (rb_idx_required[sUE_id] == 0) sUE_id = next_ue_list_looped(UE_list, sUE_id); - /* TODO: check that CCE allocated is feasible. If it is not, reduce - * nr[r] by one as this would been one opportunity */ + const int cqi = UE_info->UE_sched_ctrl[sUE_id].dl_cqi[CC_id]; + const int idx = CCE_try_allocate_ulsch(Mod_id, CC_id, subframe, sUE_id, cqi); + if (idx < 0) { + LOG_D(MAC, "cannot allocate CCE for UE %d, skipping\n", sUE_id); + nr[r]--; + sUE_id = next_ue_list_looped(UE_list, sUE_id); // next candidate + continue; + } + UE_info->UE_template[CC_id][sUE_id].pre_dci_ul_pdu_idx = idx; *cur_UE = sUE_id; cur_UE = &UE_sched.next[sUE_id]; rb_idx_given[sUE_id] = min(start_idx, rb_idx_required[sUE_id]); @@ -729,6 +743,7 @@ void ulsch_scheduler_pre_processor(module_id_t Mod_id, UE_template->pre_allocated_nb_rb_ul = 0; UE_template->pre_allocated_rb_table_index_ul = -1; UE_template->pre_first_nb_rb_ul = 0; + UE_template->pre_dci_ul_pdu_idx = -1; const rnti_t rnti = UE_RNTI(Mod_id, UE_id); if (rnti == NOT_A_RNTI) { @@ -775,7 +790,7 @@ void ulsch_scheduler_pre_processor(module_id_t Mod_id, sched_frameP, sched_subframeP, &UE_to_sched, - 3, // max_num_ue + 4, // max_num_ue n_contig, rbs); -- GitLab