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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user