From 6c71775ea1f0633e55b660c6f19e4db9d3231ed5 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 6 May 2024 16:50:37 +0200 Subject: [PATCH] Sort LCs by priority Introduce new LC configuration "priority", as specified in 38.321, and use to sort LCs by priority. We set the priority of an SRB according to 38.331 Section 9.2.1, and for a DRB to be the minimum priority of the QoS flows associated to this DRB. --- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 19 ++++++++++++++++++- .../LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c | 11 ++++++++--- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 2 ++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index a2d55580dd..004a48f6bd 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -3143,7 +3143,8 @@ void prepare_initial_ul_rrc_message(gNB_MAC_INST *mac, NR_UE_info_t *UE) DevAssert(bearer->servedRadioBearer->choice.srb_Identity == srb_id); nr_rlc_add_srb(UE->rnti, bearer->servedRadioBearer->choice.srb_Identity, bearer); - nr_lc_config_t c = {.lcid = bearer->logicalChannelIdentity}; + int priority = bearer->mac_LogicalChannelConfig->ul_SpecificParameters->priority; + nr_lc_config_t c = {.lcid = bearer->logicalChannelIdentity, .priority = priority}; nr_mac_add_lcid(&UE->UE_sched_ctrl, &c); } @@ -3255,6 +3256,18 @@ static bool eq_lcid_config(const void *vval, const void *vit) return it->lcid == val->lcid; } +static int cmp_lc_config(const void *va, const void *vb) +{ + const nr_lc_config_t *a = (const nr_lc_config_t *)va; + const nr_lc_config_t *b = (const nr_lc_config_t *)vb; + + if (a->priority < b->priority) + return -1; + if (a->priority == b->priority) + return 0; + return 1; +} + bool nr_mac_add_lcid(NR_UE_sched_ctrl_t* sched_ctrl, const nr_lc_config_t *c) { elm_arr_t elm = find_if(&sched_ctrl->lc_config, (void *) c, eq_lcid_config); @@ -3266,6 +3279,10 @@ bool nr_mac_add_lcid(NR_UE_sched_ctrl_t* sched_ctrl, const nr_lc_config_t *c) LOG_D(NR_MAC, "Add LCID %d\n", c->lcid); seq_arr_push_back(&sched_ctrl->lc_config, (void*) c, sizeof(*c)); } + void *base = seq_arr_front(&sched_ctrl->lc_config); + size_t nmemb = seq_arr_size(&sched_ctrl->lc_config); + size_t size = sizeof(*c); + qsort(base, nmemb, size, cmp_lc_config); return true; } diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c index ed2c270eea..7353e61711 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c @@ -142,7 +142,7 @@ void gnb_du_configuration_update_acknowledge(const f1ap_gnb_du_configuration_upd static NR_RLC_BearerConfig_t *get_bearerconfig_from_srb(const f1ap_srb_to_be_setup_t *srb) { - long priority = srb->srb_id; // high priority for SRB + long priority = srb->srb_id == 2 ? 3 : 1; // see 38.331 sec 9.2.1 e_NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration bucket = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5; return get_SRB_RLC_BearerConfig(get_lcid_from_srbid(srb->srb_id), priority, bucket); @@ -163,7 +163,8 @@ static int handle_ue_context_srbs_setup(NR_UE_info_t *UE, NR_RLC_BearerConfig_t *rlc_BearerConfig = get_bearerconfig_from_srb(srb); nr_rlc_add_srb(UE->rnti, srb->srb_id, rlc_BearerConfig); - nr_lc_config_t c = {.lcid = rlc_BearerConfig->logicalChannelIdentity}; + int priority = rlc_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->priority; + nr_lc_config_t c = {.lcid = rlc_BearerConfig->logicalChannelIdentity, .priority = priority}; nr_mac_add_lcid(&UE->UE_sched_ctrl, &c); (*resp_srbs)[i] = *srb; @@ -229,8 +230,12 @@ static int handle_ue_context_drbs_setup(NR_UE_info_t *UE, nr_rlc_add_drb(UE->rnti, drb->drb_id, rlc_BearerConfig); nr_lc_config_t c = {.lcid = rlc_BearerConfig->logicalChannelIdentity, .nssai = drb->nssai}; - for (int q = 0; q < drb->drb_info.flows_to_be_setup_length; ++q) + int prio = 100; + for (int q = 0; q < drb->drb_info.flows_to_be_setup_length; ++q) { c.qos_config[q] = get_qos_config(&drb->drb_info.flows_mapped_to_drb[q].qos_params.qos_characteristics); + prio = min(prio, c.qos_config[q].priority); + } + c.priority = prio; nr_mac_add_lcid(&UE->UE_sched_ctrl, &c); *resp_drb = *drb; diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index fd7728532c..23b3a9d682 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -522,6 +522,8 @@ typedef struct NR_QoS_config_s { typedef struct nr_lc_config { uint8_t lcid; + /// priority as specified in 38.321 + int priority; /// associated NSSAI for DRB nssai_t nssai; /// QoS config for DRB