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