diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index 214df87dcc08d44969601e6d14610185abb6a7a3..df4381a551dc88ae1a29fc1c827db4431cabcb9f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -426,7 +426,6 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id, if (sched_ctrl->dl_harq_pid >= 0) { /* retransmission */ NR_UE_ret_info_t *retInfo = &sched_ctrl->retInfo[sched_ctrl->dl_harq_pid]; - sched_ctrl->time_domain_allocation = retInfo->time_domain_allocation; /* ensure that there is a free place for RB allocation */ int rbSize = 0; @@ -436,16 +435,27 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id, while (rbStart < bwpSize && vrb_map[rbStart]) rbStart++; if (rbStart >= bwpSize) { LOG_E(MAC, - "cannot allocate retransmission for UE %d/RNTI %04x: no resources\n", + "%4d.%2d cannot allocate retransmission for UE %d/RNTI %04x: no resources\n", + frame, + slot, UE_id, rnti); - return; + /* not enough resources: drop retransmission attempt and make a new + * transmission instead */ + sched_ctrl->dl_harq_pid = -1; + break; } while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize] && rbSize < retInfo->rbSize) rbSize++; } + } + + if (sched_ctrl->dl_harq_pid >= 0) { + /* this retransmission can be allocated (i.e., enough resources) */ + NR_UE_ret_info_t *retInfo = &sched_ctrl->retInfo[sched_ctrl->dl_harq_pid]; + sched_ctrl->time_domain_allocation = retInfo->time_domain_allocation; sched_ctrl->rbSize = retInfo->rbSize; sched_ctrl->rbStart = rbStart;