Commit 6c71775e authored by Robert Schmidt's avatar Robert Schmidt

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.
parent ee957099
...@@ -3143,7 +3143,8 @@ void prepare_initial_ul_rrc_message(gNB_MAC_INST *mac, NR_UE_info_t *UE) ...@@ -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); DevAssert(bearer->servedRadioBearer->choice.srb_Identity == srb_id);
nr_rlc_add_srb(UE->rnti, bearer->servedRadioBearer->choice.srb_Identity, bearer); 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); nr_mac_add_lcid(&UE->UE_sched_ctrl, &c);
} }
...@@ -3255,6 +3256,18 @@ static bool eq_lcid_config(const void *vval, const void *vit) ...@@ -3255,6 +3256,18 @@ static bool eq_lcid_config(const void *vval, const void *vit)
return it->lcid == val->lcid; 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) 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); 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) ...@@ -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); LOG_D(NR_MAC, "Add LCID %d\n", c->lcid);
seq_arr_push_back(&sched_ctrl->lc_config, (void*) c, sizeof(*c)); 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; return true;
} }
......
...@@ -142,7 +142,7 @@ void gnb_du_configuration_update_acknowledge(const f1ap_gnb_du_configuration_upd ...@@ -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) 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 = e_NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration bucket =
NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5; NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5;
return get_SRB_RLC_BearerConfig(get_lcid_from_srbid(srb->srb_id), priority, bucket); 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, ...@@ -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_BearerConfig_t *rlc_BearerConfig = get_bearerconfig_from_srb(srb);
nr_rlc_add_srb(UE->rnti, srb->srb_id, rlc_BearerConfig); 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); nr_mac_add_lcid(&UE->UE_sched_ctrl, &c);
(*resp_srbs)[i] = *srb; (*resp_srbs)[i] = *srb;
...@@ -229,8 +230,12 @@ static int handle_ue_context_drbs_setup(NR_UE_info_t *UE, ...@@ -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_rlc_add_drb(UE->rnti, drb->drb_id, rlc_BearerConfig);
nr_lc_config_t c = {.lcid = rlc_BearerConfig->logicalChannelIdentity, .nssai = drb->nssai}; 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); 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); nr_mac_add_lcid(&UE->UE_sched_ctrl, &c);
*resp_drb = *drb; *resp_drb = *drb;
......
...@@ -522,6 +522,8 @@ typedef struct NR_QoS_config_s { ...@@ -522,6 +522,8 @@ typedef struct NR_QoS_config_s {
typedef struct nr_lc_config { typedef struct nr_lc_config {
uint8_t lcid; uint8_t lcid;
/// priority as specified in 38.321
int priority;
/// associated NSSAI for DRB /// associated NSSAI for DRB
nssai_t nssai; nssai_t nssai;
/// QoS config for DRB /// QoS config for DRB
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment