From 081a2879290d6fa806a4746f7dcfc28cc5e9c255 Mon Sep 17 00:00:00 2001 From: luis_pereira87 <lpereira@allbesmart.pt> Date: Fri, 2 Jul 2021 21:36:02 +0100 Subject: [PATCH] Fix gNB downlink MAC short/long header accordingly with RLC buffer size --- .../LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 45 +++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index f1ad5817e9..18cd8ebde4 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -1102,12 +1102,18 @@ void nr_schedule_ue_spec(module_id_t module_id, if (sched_ctrl->num_total_bytes > 0) { tbs_size_t len = 0; while (size > 3) { - // we do not know how much data we will get from RLC, i.e., whether it - // will be longer than 256B or not. Therefore, reserve space for long header, then - // fetch data, then fill real length - NR_MAC_SUBHEADER_LONG *header = (NR_MAC_SUBHEADER_LONG *) buf; - buf += 3; - size -= 3; + + // Reserve space for short or long header. + // Check if data from RLC is equal or longer than 256B or not. + // Data from RLC was checked before, in function nr_store_dlsch_buffer + uint8_t *header = buf; + if (sched_ctrl->num_total_bytes >= 256) { + buf += sizeof(NR_MAC_SUBHEADER_LONG); + size -= sizeof(NR_MAC_SUBHEADER_LONG); + } else { + buf += sizeof(NR_MAC_SUBHEADER_SHORT); + size -= sizeof(NR_MAC_SUBHEADER_SHORT); + } /* limit requested number of bytes to what preprocessor specified, or * such that TBS is full */ @@ -1137,19 +1143,32 @@ void nr_schedule_ue_spec(module_id_t module_id, if (len == 0) break; - header->R = 0; - header->F = 1; - header->LCID = lcid; - header->L1 = (len >> 8) & 0xff; - header->L2 = len & 0xff; + if (sched_ctrl->num_total_bytes >= 256) { + ((NR_MAC_SUBHEADER_LONG *) header)->R = 0; + ((NR_MAC_SUBHEADER_LONG *) header)->F = 1; + ((NR_MAC_SUBHEADER_LONG *) header)->LCID = lcid; + ((NR_MAC_SUBHEADER_LONG *) header)->L1 = (len >> 8) & 0xff; + ((NR_MAC_SUBHEADER_LONG *) header)->L2 = len & 0xff; + } else { + ((NR_MAC_SUBHEADER_SHORT *) header)->R = 0; + ((NR_MAC_SUBHEADER_SHORT *) header)->F = 0; + ((NR_MAC_SUBHEADER_SHORT *) header)->LCID = lcid; + ((NR_MAC_SUBHEADER_SHORT *) header)->L = len & 0xff; + } + size -= len; buf += len; dlsch_total_bytes += len; } if (len == 0) { /* RLC did not have data anymore, mark buffer as unused */ - buf -= 3; - size += 3; + if (sched_ctrl->num_total_bytes >= 256) { + buf -= sizeof(NR_MAC_SUBHEADER_LONG); + size += sizeof(NR_MAC_SUBHEADER_LONG); + } else { + buf -= sizeof(NR_MAC_SUBHEADER_SHORT); + size += sizeof(NR_MAC_SUBHEADER_SHORT); + } } } else if (get_softmodem_params()->phy_test || get_softmodem_params()->do_ra || get_softmodem_params()->sa) { -- 2.26.2