Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lizhongxiao
OpenXG-RAN
Commits
f5b5c7d2
Commit
f5b5c7d2
authored
Feb 04, 2024
by
francescomani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
remove pointer to logicalChannelConfig in LC ordered info and store actual values in the list
parent
05281ded
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
95 additions
and
122 deletions
+95
-122
openair2/LAYER2/NR_MAC_UE/config_ue.c
openair2/LAYER2/NR_MAC_UE/config_ue.c
+50
-76
openair2/LAYER2/NR_MAC_UE/mac_defs.h
openair2/LAYER2/NR_MAC_UE/mac_defs.h
+8
-8
openair2/LAYER2/NR_MAC_UE/mac_proto.h
openair2/LAYER2/NR_MAC_UE/mac_proto.h
+2
-2
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+2
-5
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+33
-31
No files found.
openair2/LAYER2/NR_MAC_UE/config_ue.c
View file @
f5b5c7d2
...
@@ -42,32 +42,6 @@
...
@@ -42,32 +42,6 @@
#include "SCHED_NR/phy_frame_config_nr.h"
#include "SCHED_NR/phy_frame_config_nr.h"
#include "oai_asn1.h"
#include "oai_asn1.h"
const
long
logicalChannelGroup0_NR
=
0
;
typedef
struct
NR_LogicalChannelConfig__ul_SpecificParameters
LcConfig_UlParamas_t
;
const
LcConfig_UlParamas_t
NR_LCSRB1
=
{
.
priority
=
1
,
.
prioritisedBitRate
=
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
,
.
logicalChannelGroup
=
(
long
*
)
&
logicalChannelGroup0_NR
};
const
LcConfig_UlParamas_t
NR_LCSRB2
=
{
.
priority
=
3
,
.
prioritisedBitRate
=
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
,
.
logicalChannelGroup
=
(
long
*
)
&
logicalChannelGroup0_NR
};
const
LcConfig_UlParamas_t
NR_LCSRB3
=
{
.
priority
=
1
,
.
prioritisedBitRate
=
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
,
.
logicalChannelGroup
=
(
long
*
)
&
logicalChannelGroup0_NR
};
// these are the default values for SRB configurations(SRB1 and SRB2) as mentioned in 36.331 pg 258-259
const
NR_LogicalChannelConfig_t
NR_SRB1_logicalChannelConfig_defaultValue
=
{.
ul_SpecificParameters
=
(
LcConfig_UlParamas_t
*
)
&
NR_LCSRB1
};
const
NR_LogicalChannelConfig_t
NR_SRB2_logicalChannelConfig_defaultValue
=
{.
ul_SpecificParameters
=
(
LcConfig_UlParamas_t
*
)
&
NR_LCSRB2
};
const
NR_LogicalChannelConfig_t
NR_SRB3_logicalChannelConfig_defaultValue
=
{.
ul_SpecificParameters
=
(
LcConfig_UlParamas_t
*
)
&
NR_LCSRB3
};
void
set_tdd_config_nr_ue
(
fapi_nr_tdd_table_t
*
tdd_table
,
void
set_tdd_config_nr_ue
(
fapi_nr_tdd_table_t
*
tdd_table
,
int
mu
,
int
mu
,
NR_TDD_UL_DL_Pattern_t
*
pattern
)
NR_TDD_UL_DL_Pattern_t
*
pattern
)
...
@@ -650,14 +624,11 @@ static void configure_ss_coreset(NR_BWP_PDCCH_t *pdcch, NR_PDCCH_Config_t *pdcch
...
@@ -650,14 +624,11 @@ static void configure_ss_coreset(NR_BWP_PDCCH_t *pdcch, NR_PDCCH_Config_t *pdcch
static
int
lcid_cmp
(
const
void
*
a
,
const
void
*
b
)
static
int
lcid_cmp
(
const
void
*
a
,
const
void
*
b
)
{
{
long
pa
,
pb
;
long
priority_a
=
(
*
((
nr_lcordered_info_t
**
)
a
))
->
priority
;
memcpy
(
&
pa
,
&
((
nr_lcordered_info_t
*
)
a
)
->
logicalChannelConfig
->
ul_SpecificParameters
->
priority
,
sizeof
(
pa
));
AssertFatal
(
priority_a
>
0
&&
priority_a
<
17
,
"Invalid priority value %ld
\n
"
,
priority_a
);
memcpy
(
&
pb
,
&
((
nr_lcordered_info_t
*
)
b
)
->
logicalChannelConfig
->
ul_SpecificParameters
->
priority
,
sizeof
(
pb
));
long
priority_b
=
(
*
((
nr_lcordered_info_t
**
)
b
))
->
priority
;
if
(
pa
<
pb
)
AssertFatal
(
priority_b
>
0
&&
priority_b
<
17
,
"Invalid priority value %ld
\n
"
,
priority_b
);
return
-
1
;
return
priority_a
-
priority_b
;
else
if
(
pa
>
pb
)
return
1
;
return
0
;
}
}
static
int
nr_get_ms_bucketsizeduration
(
long
bucketsizeduration
)
static
int
nr_get_ms_bucketsizeduration
(
long
bucketsizeduration
)
...
@@ -686,28 +657,47 @@ static int nr_get_ms_bucketsizeduration(long bucketsizeduration)
...
@@ -686,28 +657,47 @@ static int nr_get_ms_bucketsizeduration(long bucketsizeduration)
}
}
}
}
void
nr_configure_sched_info
(
NR_UE_MAC_INST_t
*
mac
,
long
channel_identity
,
NR_LogicalChannelConfig_t
*
lc_config
)
static
uint32_t
get_lc_bucket_size
(
long
prioritisedBitRate
,
long
bucketSizeDuration
)
{
{
LOG_D
(
NR_MAC
,
"Applying RRC Logical Channel Config to lcid %li
\n
"
,
channel_identity
);
int
pbr
=
nr_get_pbr
(
prioritisedBitRate
);
// in infinite pbr, the bucket is saturated by pbr
int
bsd
=
0
;
if
(
prioritisedBitRate
==
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
)
bsd
=
1
;
else
bsd
=
nr_get_ms_bucketsizeduration
(
bucketSizeDuration
);
// initialize the variable Bj for every LCID
return
pbr
*
bsd
;
mac
->
scheduling_info
.
lc_sched_info
[
channel_identity
-
1
].
Bj
=
0
;
}
// store the bucket size
static
void
set_default_logicalchannelconfig
(
nr_lcordered_info_t
*
lc_info
,
NR_SRB_Identity_t
srb_id
)
int
pbr
=
nr_get_pbr
(
lc_config
->
ul_SpecificParameters
->
prioritisedBitRate
);
{
int
bsd
=
nr_get_ms_bucketsizeduration
(
lc_config
->
ul_SpecificParameters
->
bucketSizeDuration
);
lc_info
->
lcid
=
srb_id
;
lc_info
->
priority
=
srb_id
==
2
?
3
:
1
;
lc_info
->
prioritisedBitRate
=
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
;
lc_info
->
bucket_size
=
get_lc_bucket_size
(
lc_info
->
prioritisedBitRate
,
0
);
lc_info
->
Bj
=
0
;
}
// in infinite pbr, the bucket is saturated by pbr
static
void
nr_configure_lc_config
(
NR_UE_MAC_INST_t
*
mac
,
if
(
lc_config
->
ul_SpecificParameters
->
prioritisedBitRate
nr_lcordered_info_t
*
lc_info
,
==
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
)
{
NR_LogicalChannelConfig_t
*
mac_lc_config
,
bsd
=
1
;
NR_SRB_Identity_t
srb_id
)
{
if
(
srb_id
>
0
&&
!
mac_lc_config
->
ul_SpecificParameters
)
{
// release configuration and reset to default
set_default_logicalchannelconfig
(
lc_info
,
srb_id
);
mac
->
scheduling_info
.
lc_sched_info
[
lc_info
->
lcid
-
1
].
LCGID
=
0
;
return
;
}
}
mac
->
scheduling_info
.
lc_sched_info
[
channel_identity
-
1
].
bucket_size
=
pbr
*
bsd
;
AssertFatal
(
mac_lc_config
->
ul_SpecificParameters
,
"UL parameters shouldn't be NULL for DRBs
\n
"
);
struct
NR_LogicalChannelConfig__ul_SpecificParameters
*
ul_parm
=
mac_lc_config
->
ul_SpecificParameters
;
if
(
lc_config
->
ul_SpecificParameters
->
logicalChannelGroup
!=
NULL
)
lc_info
->
priority
=
ul_parm
->
priority
;
mac
->
scheduling_info
.
lc_sched_info
[
channel_identity
-
1
].
LCGID
=
*
lc_config
->
ul_SpecificParameters
->
logicalChannelGroup
;
lc_info
->
prioritisedBitRate
=
ul_parm
->
prioritisedBitRate
;
else
// TODO Verify setting to 0 is ok, 331 just says need R (release if NULL)
mac
->
scheduling_info
.
lc_sched_info
[
channel_identity
-
1
].
LCGID
=
0
;
mac
->
scheduling_info
.
lc_sched_info
[
lc_info
->
lcid
-
1
].
LCGID
=
ul_parm
->
logicalChannelGroup
?
*
ul_parm
->
logicalChannelGroup
:
0
;
lc_info
->
bucket_size
=
get_lc_bucket_size
(
ul_parm
->
prioritisedBitRate
,
ul_parm
->
bucketSizeDuration
);
lc_info
->
Bj
=
0
;
}
}
static
void
configure_logicalChannelBearer
(
module_id_t
module_id
,
static
void
configure_logicalChannelBearer
(
module_id_t
module_id
,
...
@@ -726,7 +716,6 @@ static void configure_logicalChannelBearer(module_id_t module_id,
...
@@ -726,7 +716,6 @@ static void configure_logicalChannelBearer(module_id_t module_id,
}
}
if
(
j
<
mac
->
lc_ordered_list
.
count
)
{
if
(
j
<
mac
->
lc_ordered_list
.
count
)
{
nr_lcordered_info_t
*
lc_info
=
mac
->
lc_ordered_list
.
array
[
j
];
nr_lcordered_info_t
*
lc_info
=
mac
->
lc_ordered_list
.
array
[
j
];
free
(
lc_info
->
logicalChannelConfig
);
asn_sequence_del
(
&
mac
->
lc_ordered_list
,
j
,
0
);
asn_sequence_del
(
&
mac
->
lc_ordered_list
,
j
,
0
);
free
(
lc_info
);
free
(
lc_info
);
}
}
...
@@ -748,10 +737,10 @@ static void configure_logicalChannelBearer(module_id_t module_id,
...
@@ -748,10 +737,10 @@ static void configure_logicalChannelBearer(module_id_t module_id,
if
(
j
<
mac
->
lc_ordered_list
.
count
)
{
if
(
j
<
mac
->
lc_ordered_list
.
count
)
{
LOG_D
(
NR_MAC
,
"Logical channel %d is already established, Reconfiguring now
\n
"
,
lc_identity
);
LOG_D
(
NR_MAC
,
"Logical channel %d is already established, Reconfiguring now
\n
"
,
lc_identity
);
if
(
mac_lc_config
!=
NULL
)
{
if
(
mac_lc_config
!=
NULL
)
{
nr_configure_sched_info
(
mac
,
lc_identity
,
mac_lc_config
)
;
NR_SRB_Identity_t
srb_id
=
0
;
UPDATE_MAC_IE
(
mac
->
lc_ordered_list
.
array
[
j
]
->
logicalChannelConfig
,
if
(
rlc_bearer
->
servedRadioBearer
->
present
==
NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity
)
rlc_bearer
->
mac_LogicalChannelConfig
,
srb_id
=
rlc_bearer
->
servedRadioBearer
->
choice
.
srb_Identity
;
NR_LogicalChannelConfig_t
);
nr_configure_lc_config
(
mac
,
mac
->
lc_ordered_list
.
array
[
j
],
mac_lc_config
,
srb_id
);
}
}
}
}
else
{
else
{
...
@@ -762,29 +751,14 @@ static void configure_logicalChannelBearer(module_id_t module_id,
...
@@ -762,29 +751,14 @@ static void configure_logicalChannelBearer(module_id_t module_id,
AssertFatal
(
rlc_bearer
->
servedRadioBearer
,
"servedRadioBearer should be present for LCID establishment
\n
"
);
AssertFatal
(
rlc_bearer
->
servedRadioBearer
,
"servedRadioBearer should be present for LCID establishment
\n
"
);
if
(
rlc_bearer
->
servedRadioBearer
->
present
==
NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity
)
{
/* SRB */
if
(
rlc_bearer
->
servedRadioBearer
->
present
==
NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity
)
{
/* SRB */
NR_SRB_Identity_t
srb_id
=
rlc_bearer
->
servedRadioBearer
->
choice
.
srb_Identity
;
NR_SRB_Identity_t
srb_id
=
rlc_bearer
->
servedRadioBearer
->
choice
.
srb_Identity
;
if
(
mac_lc_config
!=
NULL
)
{
if
(
mac_lc_config
!=
NULL
)
UPDATE_MAC_IE
(
lc_info
->
logicalChannelConfig
,
rlc_bearer
->
mac_LogicalChannelConfig
,
NR_LogicalChannelConfig_t
);
nr_configure_lc_config
(
mac
,
lc_info
,
mac_lc_config
,
srb_id
);
}
else
{
else
LOG_D
(
NR_RRC
,
"Applying the default logicalChannelConfig for SRB
\n
"
);
set_default_logicalchannelconfig
(
lc_info
,
srb_id
);
switch
(
srb_id
)
{
case
1
:
lc_info
->
logicalChannelConfig
=
(
NR_LogicalChannelConfig_t
*
)
&
NR_SRB1_logicalChannelConfig_defaultValue
;
break
;
case
2
:
lc_info
->
logicalChannelConfig
=
(
NR_LogicalChannelConfig_t
*
)
&
NR_SRB2_logicalChannelConfig_defaultValue
;
break
;
case
3
:
lc_info
->
logicalChannelConfig
=
(
NR_LogicalChannelConfig_t
*
)
&
NR_SRB3_logicalChannelConfig_defaultValue
;
break
;
default
:
AssertFatal
(
false
,
"The logical id %d is not a valid SRB id %li
\n
"
,
lc_identity
,
srb_id
);
}
}
}
else
{
/* DRB */
}
else
{
/* DRB */
AssertFatal
(
mac_lc_config
,
"When establishing a DRB, LogicalChannelConfig should be mandatorily present
\n
"
);
AssertFatal
(
mac_lc_config
,
"When establishing a DRB, LogicalChannelConfig should be mandatorily present
\n
"
);
UPDATE_MAC_IE
(
lc_info
->
logicalChannelConfig
,
rlc_bearer
->
mac_LogicalChannelConfig
,
NR_LogicalChannelConfig_t
);
nr_configure_lc_config
(
mac
,
lc_info
,
mac_lc_config
,
0
);
}
}
nr_configure_sched_info
(
mac
,
lc_identity
,
lc_info
->
logicalChannelConfig
);
ASN_SEQUENCE_ADD
(
&
mac
->
lc_ordered_list
,
lc_info
);
ASN_SEQUENCE_ADD
(
&
mac
->
lc_ordered_list
,
lc_info
);
}
}
}
}
...
...
openair2/LAYER2/NR_MAC_UE/mac_defs.h
View file @
f5b5c7d2
...
@@ -181,12 +181,8 @@ typedef struct {
...
@@ -181,12 +181,8 @@ typedef struct {
int32_t
LCID_buffer_remain
;
int32_t
LCID_buffer_remain
;
// buffer status for each lcid
// buffer status for each lcid
uint8_t
LCID_status
;
uint8_t
LCID_status
;
// Bj bucket usage per lcid
// logical channel group id of this LCID
int32_t
Bj
;
long
LCGID
;
// Bucket size per lcid
int32_t
bucket_size
;
// logical channel group id for each LCID
uint8_t
LCGID
;
}
NR_LC_SCHEDULING_INFO
;
}
NR_LC_SCHEDULING_INFO
;
typedef
struct
{
typedef
struct
{
...
@@ -433,8 +429,12 @@ typedef struct ssb_list_info {
...
@@ -433,8 +429,12 @@ typedef struct ssb_list_info {
typedef
struct
nr_lcordered_info_s
{
typedef
struct
nr_lcordered_info_s
{
// logical channels ids ordered as per priority
// logical channels ids ordered as per priority
NR_LogicalChannelIdentity_t
lcid
;
NR_LogicalChannelIdentity_t
lcid
;
// logical channel configurations reordered as per priority
long
priority
;
NR_LogicalChannelConfig_t
*
logicalChannelConfig
;
long
prioritisedBitRate
;
// Bucket size per lcid
uint32_t
bucket_size
;
// Bj bucket usage per lcid
int32_t
Bj
;
}
nr_lcordered_info_t
;
}
nr_lcordered_info_t
;
typedef
struct
{
typedef
struct
{
...
...
openair2/LAYER2/NR_MAC_UE/mac_proto.h
View file @
f5b5c7d2
...
@@ -239,12 +239,12 @@ bool nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t
...
@@ -239,12 +239,12 @@ bool nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t
uint8_t
nr_locate_BsrIndexByBufferSize
(
const
uint32_t
*
table
,
int
size
,
uint8_t
nr_locate_BsrIndexByBufferSize
(
const
uint32_t
*
table
,
int
size
,
int
value
);
int
value
);
/*! \fn int nr_get_pbr(
uint8_t
prioritizedbitrate)
/*! \fn int nr_get_pbr(
long
prioritizedbitrate)
\brief get the rate in kbps from the rate configured by the higher layer
\brief get the rate in kbps from the rate configured by the higher layer
\param[in] prioritizedbitrate
\param[in] prioritizedbitrate
\return the rate in kbps
\return the rate in kbps
*/
*/
uint32_t
nr_get_pbr
(
uint8_t
prioritizedbitrate
);
uint32_t
nr_get_pbr
(
long
prioritizedbitrate
);
/*! \fn int nr_get_sf_periodicBSRTimer(uint8_t periodicBSR_Timer)
/*! \fn int nr_get_sf_periodicBSRTimer(uint8_t periodicBSR_Timer)
\brief get the number of subframe from the periodic BSR timer configured by the higher layers
\brief get the number of subframe from the periodic BSR timer configured by the higher layers
...
...
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
View file @
f5b5c7d2
...
@@ -95,9 +95,6 @@ void nr_ue_mac_default_configs(NR_UE_MAC_INST_t *mac)
...
@@ -95,9 +95,6 @@ void nr_ue_mac_default_configs(NR_UE_MAC_INST_t *mac)
for
(
int
i
=
0
;
i
<
NR_MAX_NUM_LCID
;
i
++
)
{
for
(
int
i
=
0
;
i
<
NR_MAX_NUM_LCID
;
i
++
)
{
LOG_D
(
NR_MAC
,
"Applying default logical channel config for LCGID %d
\n
"
,
i
);
LOG_D
(
NR_MAC
,
"Applying default logical channel config for LCGID %d
\n
"
,
i
);
mac
->
scheduling_info
.
lc_sched_info
[
i
].
Bj
=
-
1
;
mac
->
scheduling_info
.
lc_sched_info
[
i
].
bucket_size
=
-
1
;
mac
->
scheduling_info
.
lc_sched_info
[
i
].
LCGID
=
0
;
// defaults to 0 irrespective of SRB or DRB
mac
->
scheduling_info
.
lc_sched_info
[
i
].
LCID_status
=
LCID_EMPTY
;
mac
->
scheduling_info
.
lc_sched_info
[
i
].
LCID_status
=
LCID_EMPTY
;
mac
->
scheduling_info
.
lc_sched_info
[
i
].
LCID_buffer_remain
=
0
;
mac
->
scheduling_info
.
lc_sched_info
[
i
].
LCID_buffer_remain
=
0
;
for
(
int
k
=
0
;
k
<
NR_MAX_HARQ_PROCESSES
;
k
++
)
for
(
int
k
=
0
;
k
<
NR_MAX_HARQ_PROCESSES
;
k
++
)
...
@@ -143,7 +140,8 @@ void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac)
...
@@ -143,7 +140,8 @@ void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac)
nr_ue_mac_default_configs
(
nr_mac
);
nr_ue_mac_default_configs
(
nr_mac
);
// initialize Bj for each logical channel to zero
// initialize Bj for each logical channel to zero
// Done in default config but to -1 (is that correct?)
for
(
int
i
=
0
;
i
<
nr_mac
->
lc_ordered_list
.
count
;
i
++
)
nr_mac
->
lc_ordered_list
.
array
[
i
]
->
Bj
=
0
;
// stop all running timers
// stop all running timers
// TODO
// TODO
...
@@ -219,7 +217,6 @@ void release_mac_configuration(NR_UE_MAC_INST_t *mac)
...
@@ -219,7 +217,6 @@ void release_mac_configuration(NR_UE_MAC_INST_t *mac)
for
(
int
i
=
0
;
i
<
mac
->
lc_ordered_list
.
count
;
i
++
)
{
for
(
int
i
=
0
;
i
<
mac
->
lc_ordered_list
.
count
;
i
++
)
{
nr_lcordered_info_t
*
lc_info
=
mac
->
lc_ordered_list
.
array
[
i
];
nr_lcordered_info_t
*
lc_info
=
mac
->
lc_ordered_list
.
array
[
i
];
free
(
lc_info
->
logicalChannelConfig
);
asn_sequence_del
(
&
mac
->
lc_ordered_list
,
i
,
0
);
asn_sequence_del
(
&
mac
->
lc_ordered_list
,
i
,
0
);
free
(
lc_info
);
free
(
lc_info
);
}
}
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
View file @
f5b5c7d2
...
@@ -1097,11 +1097,10 @@ void nr_ue_ul_scheduler(nr_uplink_indication_t *ul_info)
...
@@ -1097,11 +1097,10 @@ void nr_ue_ul_scheduler(nr_uplink_indication_t *ul_info)
// update Bj for all active lcids before LCP procedure
// update Bj for all active lcids before LCP procedure
LOG_D
(
NR_MAC
,
"====================[Frame %d][Slot %d]Logical Channel Prioritization===========
\n
"
,
frame_tx
,
slot_tx
);
LOG_D
(
NR_MAC
,
"====================[Frame %d][Slot %d]Logical Channel Prioritization===========
\n
"
,
frame_tx
,
slot_tx
);
for
(
int
i
=
0
;
i
<
mac
->
lc_ordered_list
.
count
;
i
++
)
{
for
(
int
i
=
0
;
i
<
mac
->
lc_ordered_list
.
count
;
i
++
)
{
int
lcid
=
mac
->
lc_ordered_list
.
array
[
i
]
->
lcid
;
nr_lcordered_info_t
*
lc_info
=
mac
->
lc_ordered_list
.
array
[
i
];
NR_LogicalChannelConfig_t
*
lcconfig
=
mac
->
lc_ordered_list
.
array
[
i
]
->
logicalChannelConfig
;
int
lcid
=
lc_info
->
lcid
;
NR_LC_SCHEDULING_INFO
*
sched_lc
=
&
mac
->
scheduling_info
.
lc_sched_info
[
lcid
-
1
];
// max amount of data that can be buffered/accumulated in a logical channel buffer
// max amount of data that can be buffered/accumulated in a logical channel buffer
int32_t
bucketSize_max
=
sched_lc
->
bucket_size
;
int32_t
bucketSize_max
=
lc_info
->
bucket_size
;
AssertFatal
(
bucketSize_max
>=
0
,
"negative bucketSize_max %d, will never schedule UE: lcid %d
\n
"
,
bucketSize_max
,
lcid
);
AssertFatal
(
bucketSize_max
>=
0
,
"negative bucketSize_max %d, will never schedule UE: lcid %d
\n
"
,
bucketSize_max
,
lcid
);
/*
/*
...
@@ -1109,15 +1108,13 @@ void nr_ue_ul_scheduler(nr_uplink_indication_t *ul_info)
...
@@ -1109,15 +1108,13 @@ void nr_ue_ul_scheduler(nr_uplink_indication_t *ul_info)
increment the value of Bj by product PBR * T
increment the value of Bj by product PBR * T
*/
*/
int
T
=
1
;
// time elapsed since Bj was last incremented
int
T
=
1
;
// time elapsed since Bj was last incremented
int32_t
bj
=
sched_lc
->
Bj
;
int32_t
bj
=
lc_info
->
Bj
;
bj
+=
nr_get_pbr
(
lcconfig
->
ul_SpecificParameters
->
prioritisedBitRate
)
*
T
;
bj
+=
nr_get_pbr
(
lc_info
->
prioritisedBitRate
)
*
T
;
if
(
lcconfig
->
ul_SpecificParameters
->
prioritisedBitRate
if
(
lc_info
->
prioritisedBitRate
==
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
)
==
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
)
{
bj
=
nr_get_pbr
(
lc_info
->
prioritisedBitRate
);
bj
=
nr_get_pbr
(
lcconfig
->
ul_SpecificParameters
->
prioritisedBitRate
);
}
// bj > max bucket size, set bj to max bucket size, as in ts38.321 5.4.3.1 Logical Channel Prioritization
// bj > max bucket size, set bj to max bucket size, as in ts38.321 5.4.3.1 Logical Channel Prioritization
sched_lc
->
Bj
=
min
(
bj
,
bucketSize_max
);
lc_info
->
Bj
=
min
(
bj
,
bucketSize_max
);
}
}
// Call BSR procedure as described in Section 5.4.5 in 38.321
// Call BSR procedure as described in Section 5.4.5 in 38.321
...
@@ -1253,7 +1250,7 @@ bool nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t
...
@@ -1253,7 +1250,7 @@ bool nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t
{
{
bsr_regular_triggered
=
true
;
bsr_regular_triggered
=
true
;
LOG_D
(
NR_MAC
,
LOG_D
(
NR_MAC
,
"[UE %d] PDCCH Tick : MAC BSR Triggered LCID
%d LCGID%
d data become available at frame %d slot %d
\n
"
,
"[UE %d] PDCCH Tick : MAC BSR Triggered LCID
%d LCGID %l
d data become available at frame %d slot %d
\n
"
,
module_idP
,
module_idP
,
lcid
,
lcid
,
mac
->
scheduling_info
.
lc_sched_info
[
lcid
-
1
].
LCGID
,
mac
->
scheduling_info
.
lc_sched_info
[
lcid
-
1
].
LCGID
,
...
@@ -2901,8 +2898,7 @@ uint32_t get_count_lcids_same_priority(uint8_t start, uint8_t total_active_lcids
...
@@ -2901,8 +2898,7 @@ uint32_t get_count_lcids_same_priority(uint8_t start, uint8_t total_active_lcids
uint8_t
same_priority_count
=
0
;
uint8_t
same_priority_count
=
0
;
uint8_t
curr_lcid
=
lcid_ordered_array
[
start
].
lcid
;
uint8_t
curr_lcid
=
lcid_ordered_array
[
start
].
lcid
;
for
(
uint8_t
index
=
start
;
index
<
total_active_lcids
;
index
++
)
{
for
(
uint8_t
index
=
start
;
index
<
total_active_lcids
;
index
++
)
{
if
(
lcid_ordered_array
[
start
].
logicalChannelConfig
->
ul_SpecificParameters
->
priority
==
if
(
lcid_ordered_array
[
start
].
priority
==
lcid_ordered_array
[
index
].
priority
)
{
lcid_ordered_array
[
index
].
logicalChannelConfig
->
ul_SpecificParameters
->
priority
)
{
same_priority_count
++
;
same_priority_count
++
;
}
}
}
}
...
@@ -2920,15 +2916,15 @@ long get_num_bytes_to_reqlc(NR_UE_MAC_INST_t *mac,
...
@@ -2920,15 +2916,15 @@ long get_num_bytes_to_reqlc(NR_UE_MAC_INST_t *mac,
long
*
target
)
long
*
target
)
{
{
/* Calculates the number of bytes the logical channel should request from the correcponding RLC buffer*/
/* Calculates the number of bytes the logical channel should request from the correcponding RLC buffer*/
NR_LogicalChannelConfig_t
*
lc_config
=
NULL
;
long
found_pbr
=
-
1
;
for
(
int
i
=
0
;
i
<
mac
->
lc_ordered_list
.
count
;
i
++
)
{
for
(
int
i
=
0
;
i
<
mac
->
lc_ordered_list
.
count
;
i
++
)
{
if
(
mac
->
lc_ordered_list
.
array
[
i
]
->
lcid
==
lc_num
)
{
if
(
mac
->
lc_ordered_list
.
array
[
i
]
->
lcid
==
lc_num
)
{
lc_config
=
mac
->
lc_ordered_list
.
array
[
i
]
->
logicalChannelConfig
;
found_pbr
=
mac
->
lc_ordered_list
.
array
[
i
]
->
prioritisedBitRate
;
break
;
break
;
}
}
}
}
AssertFatal
(
lc_config
,
"Couldn't find LC config for ID %d
\n
"
,
lc_num
);
AssertFatal
(
found_pbr
>=
0
,
"Couldn't find LC config for ID %d
\n
"
,
lc_num
);
long
pbr
=
nr_get_pbr
(
lc_config
->
ul_SpecificParameters
->
prioritisedBitRate
);
uint32_t
pbr
=
nr_get_pbr
(
found_pbr
);
int32_t
lcid_remain_buffer
=
mac
->
scheduling_info
.
lc_sched_info
[
lc_num
-
1
].
LCID_buffer_remain
;
int32_t
lcid_remain_buffer
=
mac
->
scheduling_info
.
lc_sched_info
[
lc_num
-
1
].
LCID_buffer_remain
;
*
target
=
(
same_priority_count
>
1
)
?
min
(
buflen_remain_ep
,
pbr
)
:
pbr
;
*
target
=
(
same_priority_count
>
1
)
?
min
(
buflen_remain_ep
,
pbr
)
:
pbr
;
...
@@ -2974,10 +2970,8 @@ static void select_logical_channels(NR_UE_MAC_INST_t *mac, int *num_active_lcids
...
@@ -2974,10 +2970,8 @@ static void select_logical_channels(NR_UE_MAC_INST_t *mac, int *num_active_lcids
// selection of logical channels with Bj > 0
// selection of logical channels with Bj > 0
for
(
int
i
=
0
;
i
<
mac
->
lc_ordered_list
.
count
;
i
++
)
{
for
(
int
i
=
0
;
i
<
mac
->
lc_ordered_list
.
count
;
i
++
)
{
int
lcid
=
mac
->
lc_ordered_list
.
array
[
i
]
->
lcid
;
int
lcid
=
mac
->
lc_ordered_list
.
array
[
i
]
->
lcid
;
NR_LogicalChannelConfig_t
*
logicalChannelConfig
=
mac
->
lc_ordered_list
.
array
[
i
]
->
logicalChannelConfig
;
if
(
mac
->
lc_ordered_list
.
array
[
i
]
->
Bj
>
0
)
{
if
(
mac
->
scheduling_info
.
lc_sched_info
[
lcid
-
1
].
Bj
>
0
)
{
active_lcids
[
*
num_active_lcids
]
=
*
mac
->
lc_ordered_list
.
array
[
i
];
active_lcids
[
*
num_active_lcids
].
lcid
=
lcid
;
active_lcids
[
*
num_active_lcids
].
logicalChannelConfig
=
logicalChannelConfig
;
(
*
num_active_lcids
)
++
;
(
*
num_active_lcids
)
++
;
LOG_D
(
NR_MAC
,
"The available lcid is %d with total active channels count = %d
\n
"
,
lcid
,
*
num_active_lcids
);
LOG_D
(
NR_MAC
,
"The available lcid is %d with total active channels count = %d
\n
"
,
lcid
,
*
num_active_lcids
);
}
}
...
@@ -3051,13 +3045,21 @@ static bool fill_mac_sdu(module_id_t module_idP,
...
@@ -3051,13 +3045,21 @@ static bool fill_mac_sdu(module_id_t module_idP,
// currently the Bj is drecremented by size of MAC SDus everytime it is served to logical channel, so by this approach there
// currently the Bj is drecremented by size of MAC SDus everytime it is served to logical channel, so by this approach there
// will be more chance for lower priority logical channels to be served in the next TTI
// will be more chance for lower priority logical channels to be served in the next TTI
// second approach can also be followed where Bj is decremented only in the first round but not in the subsequent rounds
// second approach can also be followed where Bj is decremented only in the first round but not in the subsequent rounds
sched_info
->
lc_sched_info
[
lcid
-
1
].
Bj
-=
sdu_length
;
bool
found
=
false
;
for
(
int
i
=
0
;
i
<
mac
->
lc_ordered_list
.
count
;
i
++
)
{
if
(
lcid
==
mac
->
lc_ordered_list
.
array
[
i
]
->
lcid
)
{
found
=
true
;
mac
->
lc_ordered_list
.
array
[
i
]
->
Bj
-=
sdu_length
;
LOG_D
(
NR_MAC
,
LOG_D
(
NR_MAC
,
"decrement Bj of the lcid %d by size of sdu length = %d and new Bj for lcid %d is %d
\n
"
,
"decrement Bj of the lcid %d by size of sdu length = %d and new Bj for lcid %d is %d
\n
"
,
lcid
,
lcid
,
sdu_length
,
sdu_length
,
lcid
,
lcid
,
sched_info
->
lc_sched_info
[
lcid
-
1
].
Bj
);
mac
->
lc_ordered_list
.
array
[
i
]
->
Bj
);
break
;
}
}
AssertFatal
(
found
,
"Couldn't find LCID %d in lc_ordered_list
\n
"
,
lcid
);
if
(
sdu_length
>
0
)
{
if
(
sdu_length
>
0
)
{
LOG_D
(
NR_MAC
,
LOG_D
(
NR_MAC
,
...
@@ -3105,7 +3107,7 @@ static bool fill_mac_sdu(module_id_t module_idP,
...
@@ -3105,7 +3107,7 @@ static bool fill_mac_sdu(module_id_t module_idP,
lc_info
->
LCID_buffer_remain
-=
sdu_length
;
lc_info
->
LCID_buffer_remain
-=
sdu_length
;
(
lcg_info
+
lc_info
->
LCGID
)
->
BSR_bytes
-=
sdu_length
;
(
lcg_info
+
lc_info
->
LCGID
)
->
BSR_bytes
-=
sdu_length
;
LOG_D
(
NR_MAC
,
LOG_D
(
NR_MAC
,
"[UE %d] Update BSR [%d.%d] BSR_bytes for LCG
%
d = %d
\n
"
,
"[UE %d] Update BSR [%d.%d] BSR_bytes for LCG
%l
d = %d
\n
"
,
module_idP
,
module_idP
,
frameP
,
frameP
,
subframe
,
subframe
,
...
@@ -3352,7 +3354,7 @@ void schedule_ta_command(fapi_nr_dl_config_request_t *dl_config, NR_UL_TIME_ALIG
...
@@ -3352,7 +3354,7 @@ void schedule_ta_command(fapi_nr_dl_config_request_t *dl_config, NR_UL_TIME_ALIG
ul_time_alignment
->
ta_apply
=
false
;
ul_time_alignment
->
ta_apply
=
false
;
}
}
uint32_t
nr_get_pbr
(
uint8_t
prioritizedbitrate
)
uint32_t
nr_get_pbr
(
long
prioritizedbitrate
)
{
{
int32_t
pbr
=
-
1
;
int32_t
pbr
=
-
1
;
switch
(
prioritizedbitrate
)
{
switch
(
prioritizedbitrate
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment