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
Michael Black
OpenXG-RAN
Commits
f0f34c02
Commit
f0f34c02
authored
Nov 15, 2016
by
hbilel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
BSR fixes with CMW500
parent
d56c6510
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
191 additions
and
37 deletions
+191
-37
openair2/LAYER2/MAC/config.c
openair2/LAYER2/MAC/config.c
+2
-2
openair2/LAYER2/MAC/defs.h
openair2/LAYER2/MAC/defs.h
+3
-2
openair2/LAYER2/MAC/ue_procedures.c
openair2/LAYER2/MAC/ue_procedures.c
+186
-33
No files found.
openair2/LAYER2/MAC/config.c
View file @
f0f34c02
...
@@ -245,8 +245,8 @@ rrc_mac_config_req(
...
@@ -245,8 +245,8 @@ rrc_mac_config_req(
UE_mac_inst
[
Mod_idP
].
scheduling_info
.
extendedPHR_r10
=
(
uint16_t
)
0
;
UE_mac_inst
[
Mod_idP
].
scheduling_info
.
extendedPHR_r10
=
(
uint16_t
)
0
;
}
}
#endif
#endif
UE_mac_inst
[
Mod_idP
].
scheduling_info
.
periodicBSR_SF
=
get_sf_periodicBSRTimer
(
UE_mac_inst
[
Mod_idP
].
scheduling_info
.
periodicBSR_Timer
)
;
UE_mac_inst
[
Mod_idP
].
scheduling_info
.
periodicBSR_SF
=
MAC_UE_BSR_TIMER_NOT_RUNNING
;
UE_mac_inst
[
Mod_idP
].
scheduling_info
.
retxBSR_SF
=
get_sf_retxBSRTimer
(
UE_mac_inst
[
Mod_idP
].
scheduling_info
.
retxBSR_Timer
)
;
UE_mac_inst
[
Mod_idP
].
scheduling_info
.
retxBSR_SF
=
MAC_UE_BSR_TIMER_NOT_RUNNING
;
UE_mac_inst
[
Mod_idP
].
BSR_reporting_active
=
0
;
UE_mac_inst
[
Mod_idP
].
BSR_reporting_active
=
0
;
LOG_D
(
MAC
,
"[UE %d]: periodic BSR %d (SF), retx BSR %d (SF)
\n
"
,
LOG_D
(
MAC
,
"[UE %d]: periodic BSR %d (SF), retx BSR %d (SF)
\n
"
,
...
...
openair2/LAYER2/MAC/defs.h
View file @
f0f34c02
...
@@ -133,6 +133,7 @@
...
@@ -133,6 +133,7 @@
/*!\brief maximum value for channel quality indicator */
/*!\brief maximum value for channel quality indicator */
#define MAX_CQI_VALUE 15
#define MAX_CQI_VALUE 15
#define MAC_UE_BSR_TIMER_NOT_RUNNING (0xFFFF)
#define LCID_EMPTY 0
#define LCID_EMPTY 0
#define LCID_NOT_EMPTY 1
#define LCID_NOT_EMPTY 1
...
@@ -962,11 +963,11 @@ typedef struct {
...
@@ -962,11 +963,11 @@ typedef struct {
/// retxBSR-Timer, default value is sf2560
/// retxBSR-Timer, default value is sf2560
uint16_t
retxBSR_Timer
;
uint16_t
retxBSR_Timer
;
/// retxBSR_SF, number of subframe before triggering a regular BSR
/// retxBSR_SF, number of subframe before triggering a regular BSR
int16_t
retxBSR_SF
;
u
int16_t
retxBSR_SF
;
/// periodicBSR-Timer, default to infinity
/// periodicBSR-Timer, default to infinity
uint16_t
periodicBSR_Timer
;
uint16_t
periodicBSR_Timer
;
/// periodicBSR_SF, number of subframe before triggering a periodic BSR
/// periodicBSR_SF, number of subframe before triggering a periodic BSR
int16_t
periodicBSR_SF
;
u
int16_t
periodicBSR_SF
;
/// default value is 0: not configured
/// default value is 0: not configured
uint16_t
sr_ProhibitTimer
;
uint16_t
sr_ProhibitTimer
;
/// sr ProhibitTime running
/// sr ProhibitTime running
...
...
openair2/LAYER2/MAC/ue_procedures.c
View file @
f0f34c02
...
@@ -91,7 +91,7 @@ void ue_init_mac(module_id_t module_idP)
...
@@ -91,7 +91,7 @@ void ue_init_mac(module_id_t module_idP)
// default values as deined in 36.331 sec 9.2.2
// default values as deined in 36.331 sec 9.2.2
LOG_I
(
MAC
,
"[UE%d] Applying default macMainConfig
\n
"
,
module_idP
);
LOG_I
(
MAC
,
"[UE%d] Applying default macMainConfig
\n
"
,
module_idP
);
//UE_mac_inst[module_idP].scheduling_info.macConfig=NULL;
//UE_mac_inst[module_idP].scheduling_info.macConfig=NULL;
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_Timer
=
MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf
256
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_Timer
=
MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf
1024
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_Timer
=
MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_Timer
=
MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicPHR_Timer
=
MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicPHR_Timer
=
MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
prohibitPHR_Timer
=
MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
prohibitPHR_Timer
=
MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20
;
...
@@ -106,8 +106,8 @@ void ue_init_mac(module_id_t module_idP)
...
@@ -106,8 +106,8 @@ void ue_init_mac(module_id_t module_idP)
UE_mac_inst
[
module_idP
].
scheduling_info
.
extendedPHR_r10
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
extendedPHR_r10
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
drx_config
=
NULL
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
drx_config
=
NULL
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
phr_config
=
NULL
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
phr_config
=
NULL
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
=
get_sf_periodicBSRTimer
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_Timer
)
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
=
MAC_UE_BSR_TIMER_NOT_RUNNING
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
=
get_sf_retxBSRTimer
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_Timer
)
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
=
MAC_UE_BSR_TIMER_NOT_RUNNING
;
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
0
;
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicPHR_SF
=
get_sf_perioidicPHR_Timer
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicPHR_Timer
);
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicPHR_SF
=
get_sf_perioidicPHR_Timer
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicPHR_Timer
);
UE_mac_inst
[
module_idP
].
scheduling_info
.
prohibitPHR_SF
=
get_sf_prohibitPHR_Timer
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
prohibitPHR_Timer
);
UE_mac_inst
[
module_idP
].
scheduling_info
.
prohibitPHR_SF
=
get_sf_prohibitPHR_Timer
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
prohibitPHR_Timer
);
...
@@ -308,14 +308,16 @@ uint32_t ue_get_SR(module_id_t module_idP,int CC_id,frame_t frameP,uint8_t eNB_i
...
@@ -308,14 +308,16 @@ uint32_t ue_get_SR(module_id_t module_idP,int CC_id,frame_t frameP,uint8_t eNB_i
// notify RRC to relase PUCCH/SRS
// notify RRC to relase PUCCH/SRS
// clear any configured dl/ul
// clear any configured dl/ul
// initiate RA
// initiate RA
UE_mac_inst
[
module_idP
].
scheduling_info
.
SR_pending
=
0
;
if
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
SR_pending
){
UE_mac_inst
[
module_idP
].
scheduling_info
.
SR_COUNTER
=
0
;
// release all pucch resource
// release all pucch resource
UE_mac_inst
[
module_idP
].
physicalConfigDedicated
=
NULL
;
UE_mac_inst
[
module_idP
].
physicalConfigDedicated
=
NULL
;
UE_mac_inst
[
module_idP
].
ul_active
=
0
;
UE_mac_inst
[
module_idP
].
ul_active
=
0
;
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
0
;
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
0
;
LOG_T
(
MAC
,
"[UE %d] Release all SRs
\n
"
,
module_idP
);
LOG_I
(
MAC
,
"[UE %d] Release all SRs
\n
"
,
module_idP
);
}
UE_mac_inst
[
module_idP
].
scheduling_info
.
SR_pending
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
SR_COUNTER
=
0
;
return
(
0
);
return
(
0
);
}
}
}
}
...
@@ -1259,10 +1261,16 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1259,10 +1261,16 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
POWER_HEADROOM_CMD
phr
;
POWER_HEADROOM_CMD
phr
;
POWER_HEADROOM_CMD
*
phr_p
=&
phr
;
POWER_HEADROOM_CMD
*
phr_p
=&
phr
;
unsigned
short
short_padding
=
0
,
post_padding
=
0
,
padding_len
=
0
;
unsigned
short
short_padding
=
0
,
post_padding
=
0
,
padding_len
=
0
;
int
lcgid
;
int
j
;
// used for padding
int
j
;
// used for padding
// Compute header length
// Compute header length
int
all_pdu_len
;
int
all_pdu_len
;
int
lcg_id
=
0
;
int
lcg_id_bsr_short
=
0
;
int
num_lcg_id_with_data
=
0
;
LOG_D
(
MAC
,
"[UE %d] MAC PROCESS UL TRANSPORT BLOCK at frame%d subframe %d TBS=%d
\n
"
,
module_idP
,
frameP
,
subframe
,
buflen
);
if
(
CC_id
>
0
)
{
if
(
CC_id
>
0
)
{
LOG_E
(
MAC
,
"Transmission on secondary CCs is not supported yet
\n
"
);
LOG_E
(
MAC
,
"Transmission on secondary CCs is not supported yet
\n
"
);
...
@@ -1295,10 +1303,83 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1295,10 +1303,83 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
dcch1_header_len
=
2
;
//sizeof(SCH_SUBHEADER_SHORT);
dcch1_header_len
=
2
;
//sizeof(SCH_SUBHEADER_SHORT);
// hypo length,in case of long header skip the padding byte
// hypo length,in case of long header skip the padding byte
dtch_header_len
=
(
buflen
>
128
)
?
3
:
2
;
//sizeof(SCH_SUBHEADER_LONG)-1 : sizeof(SCH_SUBHEADER_SHORT);
dtch_header_len
=
(
buflen
>
128
)
?
3
:
2
;
//sizeof(SCH_SUBHEADER_LONG)-1 : sizeof(SCH_SUBHEADER_SHORT);
bsr_header_len
=
1
;
//sizeof(SCH_SUBHEADER_FIXED)
;
bsr_header_len
=
0
;
phr_header_len
=
1
;
//sizeof(SCH_SUBHEADER_FIXED);
phr_header_len
=
1
;
//sizeof(SCH_SUBHEADER_FIXED);
while
(
lcg_id
<
MAX_NUM_LCGID
)
{
if
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
lcg_id
]){
num_lcg_id_with_data
++
;
lcg_id_bsr_short
=
lcg_id
;
}
lcg_id
++
;
}
if
(
num_lcg_id_with_data
){
LOG_I
(
MAC
,
"[UE %d] MAC Tx data pending at frame%d subframe %d nb LCG =%d LCG0 bytes=%d BSR Trigger status =%d TBS=%d
\n
"
,
module_idP
,
frameP
,
subframe
,
num_lcg_id_with_data
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
0
],
UE_mac_inst
[
module_idP
].
BSR_reporting_active
,
buflen
);
}
// ReTxBSR-Timer expires, trigger BSR
if
((
num_lcg_id_with_data
)
&&
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
==
0
)){
// If the UE has data to transmit, trigger a BSR
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
1
;
LOG_I
(
MAC
,
"[UE %d] MAC BSR Triggered ReTxBSR Timer expiry at frame%d subframe %d TBS=%d
\n
"
,
module_idP
,
frameP
,
subframe
,
buflen
);
}
// periodicBSR-Timer expires, trigger BSR
if
((
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_Timer
!=
MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity
)
&&
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
==
0
)){
// Trigger BSR
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
1
;
LOG_I
(
MAC
,
"[UE %d] MAC BSR Triggered PeriodicBSR Timer expiry at frame%d subframe %d TBS=%d
\n
"
,
module_idP
,
frameP
,
subframe
,
buflen
);
}
//Compute BSR Length
if
(
UE_mac_inst
[
module_idP
].
BSR_reporting_active
){
if
(
buflen
>=
4
){
if
(
num_lcg_id_with_data
<=
1
){
bsr_ce_len
=
sizeof
(
BSR_SHORT
);
//1 byte
}
else
{
bsr_ce_len
=
sizeof
(
BSR_LONG
);
//3 bytes
}
bsr_header_len
=
1
;
//sizeof(SCH_SUBHEADER_FIXED);
// Reset Periodic and ReTx BSR Timer
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
=
get_sf_retxBSRTimer
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_Timer
);
LOG_I
(
MAC
,
"[UE %d] MAC ReTx BSR Timer Reset =%d
\n
"
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
);
if
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_Timer
!=
MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity
){
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
=
get_sf_periodicBSRTimer
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_Timer
);
LOG_I
(
MAC
,
"[UE %d] MAC Periodic BSR Timer Reset =%d
\n
"
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
);
}
LOG_I
(
MAC
,
"[UE %d] MAC BSR Triggered !! bsr (ce%d,hdr%d) buff_len %d
\n
"
,
module_idP
,
bsr_ce_len
,
bsr_header_len
,
buflen
);
}
else
{
// Cancel Regular and Periodic BSR if Grant is smaller than 4 bytes
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
0
;
bsr_header_len
=
0
;
}
}
bsr_len
=
bsr_ce_len
+
bsr_header_len
;
#if 0
bsr_ce_len = get_bsr_len (module_idP, eNB_index, frameP, buflen);
bsr_ce_len = get_bsr_len (module_idP, eNB_index, frameP, buflen);
// retxBSR-Timer expires or periodicBSR-Timer expires and Regular BSR trigger
// retxBSR-Timer expires or periodicBSR-Timer expires and Regular BSR trigger
if ((bsr_ce_len > 0 ) && (UE_mac_inst[module_idP].BSR_reporting_active > 0)) {
if ((bsr_ce_len > 0 ) && (UE_mac_inst[module_idP].BSR_reporting_active > 0)) {
bsr_len = bsr_ce_len + bsr_header_len;
bsr_len = bsr_ce_len + bsr_header_len;
...
@@ -1310,6 +1391,7 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1310,6 +1391,7 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
// bsr_ce_len = sizeof(BSR_LONG);
// bsr_ce_len = sizeof(BSR_LONG);
//bsr_len = bsr_ce_len + bsr_header_len;
//bsr_len = bsr_ce_len + bsr_header_len;
}
}
#endif
phr_ce_len
=
(
UE_mac_inst
[
module_idP
].
PHR_reporting_active
==
1
)
?
1
/* sizeof(POWER_HEADROOM_CMD)*/
:
0
;
phr_ce_len
=
(
UE_mac_inst
[
module_idP
].
PHR_reporting_active
==
1
)
?
1
/* sizeof(POWER_HEADROOM_CMD)*/
:
0
;
if
(
phr_ce_len
>
0
)
{
if
(
phr_ce_len
>
0
)
{
...
@@ -1336,9 +1418,22 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1336,9 +1418,22 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
MBMS_FLAG_NO
,
// eNB_index
MBMS_FLAG_NO
,
// eNB_index
DCCH
,
DCCH
,
(
buflen
-
dcch_header_len
-
bsr_len
-
phr_len
));
(
buflen
-
dcch_header_len
-
bsr_len
-
phr_len
));
LOG_D
(
MAC
,
"[UE %d] Frame %d : UL-DCCH -> ULSCH, RRC message has %d bytes to "
LOG_D
(
MAC
,
"[UE %d] Frame %d : UL-DCCH -> ULSCH, RLC SRB1 has %d bytes to "
"send (Transport Block size %d, mac header len %d)
\n
"
,
"send (Transport Block size %d BSR size=%d PHR=%d SDU Length Total %d , mac header len %d)
\n
"
,
module_idP
,
frameP
,
rlc_status
.
bytes_in_buffer
,
buflen
,
dcch_header_len
);
module_idP
,
frameP
,
rlc_status
.
bytes_in_buffer
,
buflen
,
bsr_len
,
phr_len
,
sdu_length_total
,
dcch_header_len
);
/* Update BSR : substract transmitted data */
if
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
DCCH
]]
>=
rlc_status
.
bytes_in_buffer
){
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
DCCH
]]
-=
rlc_status
.
bytes_in_buffer
;
}
else
if
(
rlc_status
.
bytes_in_buffer
){
LOG_I
(
MAC
,
"[UE %d] Frame %d Subframe%d: WARNING Buffer occupancy =%d for LCGID%d is lower than data to transmit=%d for LCID%d
\n
"
,
module_idP
,
frameP
,
subframe
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
DCCH
]],
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
DCCH
],
rlc_status
.
bytes_in_buffer
,
DCCH
);
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
DCCH
]]
=
0
;
}
sdu_lengths
[
0
]
+=
mac_rlc_data_req
(
module_idP
,
sdu_lengths
[
0
]
+=
mac_rlc_data_req
(
module_idP
,
UE_mac_inst
[
module_idP
].
crnti
,
UE_mac_inst
[
module_idP
].
crnti
,
...
@@ -1351,7 +1446,7 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1351,7 +1446,7 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
sdu_length_total
+=
sdu_lengths
[
0
];
sdu_length_total
+=
sdu_lengths
[
0
];
sdu_lcids
[
0
]
=
DCCH
;
sdu_lcids
[
0
]
=
DCCH
;
LOG_D
(
MAC
,
"[UE %d] TX
Got %d bytes for DCCH
\n
"
,
module_idP
,
sdu_lengths
[
0
]);
LOG_D
(
MAC
,
"[UE %d] TX
Multiplex RLC PDU TX Got %d bytes for SRB1
\n
"
,
module_idP
,
sdu_lengths
[
0
]);
num_sdus
=
1
;
num_sdus
=
1
;
//update_bsr(module_idP, frameP, eNB_index, DCCH, UE_mac_inst[module_idP].scheduling_info.LCGID[DCCH]);
//update_bsr(module_idP, frameP, eNB_index, DCCH, UE_mac_inst[module_idP].scheduling_info.LCGID[DCCH]);
//header_len +=2;
//header_len +=2;
...
@@ -1379,9 +1474,22 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1379,9 +1474,22 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
DCCH1
,
DCCH1
,
(
buflen
-
bsr_len
-
phr_len
-
dcch_header_len
-
dcch1_header_len
-
sdu_length_total
));
(
buflen
-
bsr_len
-
phr_len
-
dcch_header_len
-
dcch1_header_len
-
sdu_length_total
));
LOG_D
(
MAC
,
"[UE %d] Frame %d : UL-DCCH1 -> ULSCH, RRC message has %d bytes to"
LOG_D
(
MAC
,
"[UE %d] Frame %d subframe %d: UL-DCCH1 -> ULSCH, RLC SRB2 has %d bytes to"
" send (Transport Block size %d, mac header len %d)
\n
"
,
" send (Transport Block size %d BSR size=%d PHR=%d SRB1 Hdr %d SDU Length Total %d , mac header len %d)
\n
"
,
module_idP
,
frameP
,
rlc_status
.
bytes_in_buffer
,
buflen
,
dcch1_header_len
);
module_idP
,
frameP
,
subframe
,
rlc_status
.
bytes_in_buffer
,
buflen
,
bsr_len
,
phr_len
,
dcch_header_len
,
sdu_length_total
,
dcch1_header_len
);
/* Update BSR : substract transmitted data */
if
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
DCCH1
]]
>=
rlc_status
.
bytes_in_buffer
){
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
DCCH1
]]
-=
rlc_status
.
bytes_in_buffer
;
}
else
if
(
rlc_status
.
bytes_in_buffer
){
LOG_I
(
MAC
,
"[UE %d] Frame %d Subframe%d: WARNING Buffer occupancy =%d for LCGID%d is lower than data to transmit=%d for LCID%d
\n
"
,
module_idP
,
frameP
,
subframe
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
DCCH1
]],
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
DCCH1
],
rlc_status
.
bytes_in_buffer
,
DCCH1
);
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
DCCH1
]]
=
0
;
}
sdu_lengths
[
num_sdus
]
=
mac_rlc_data_req
(
module_idP
,
sdu_lengths
[
num_sdus
]
=
mac_rlc_data_req
(
module_idP
,
UE_mac_inst
[
module_idP
].
crnti
,
UE_mac_inst
[
module_idP
].
crnti
,
...
@@ -1393,7 +1501,7 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1393,7 +1501,7 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
(
char
*
)
&
ulsch_buff
[
sdu_lengths
[
num_sdus
]]);
(
char
*
)
&
ulsch_buff
[
sdu_lengths
[
num_sdus
]]);
sdu_length_total
+=
sdu_lengths
[
num_sdus
];
sdu_length_total
+=
sdu_lengths
[
num_sdus
];
sdu_lcids
[
num_sdus
]
=
DCCH1
;
sdu_lcids
[
num_sdus
]
=
DCCH1
;
LOG_D
(
MAC
,
"[UE %d] TX
Got %d bytes for DCCH1
\n
"
,
module_idP
,
sdu_lengths
[
num_sdus
]);
LOG_D
(
MAC
,
"[UE %d] TX
Multiplex RLC PDU Got %d bytes for SRB2
\n
"
,
module_idP
,
sdu_lengths
[
num_sdus
]);
//update_bsr(module_idP, frameP, DCCH1);
//update_bsr(module_idP, frameP, DCCH1);
//dcch_header_len +=2; // include dcch1
//dcch_header_len +=2; // include dcch1
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCID_status
[
DCCH1
]
=
LCID_EMPTY
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCID_status
[
DCCH1
]
=
LCID_EMPTY
;
...
@@ -1438,6 +1546,19 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1438,6 +1546,19 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
lcid
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
lcid
]]);
lcid
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
lcid
]]);
if
(
rlc_status
.
bytes_in_buffer
>
0
)
{
if
(
rlc_status
.
bytes_in_buffer
>
0
)
{
/* Update BSR : substract transmitted data */
if
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
lcid
]]
>=
rlc_status
.
bytes_in_buffer
){
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
lcid
]]
-=
rlc_status
.
bytes_in_buffer
;
}
else
{
LOG_I
(
MAC
,
"[UE %d] Frame %d Subframe%d: WARNING Buffer occupancy =%d for LCGID%d is lower than data to transmit=%d for LCID%d
\n
"
,
module_idP
,
frameP
,
subframe
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
lcid
]],
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
lcid
],
rlc_status
.
bytes_in_buffer
,
lcid
);
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCGID
[
lcid
]]
=
0
;
}
sdu_lengths
[
num_sdus
]
=
mac_rlc_data_req
(
module_idP
,
sdu_lengths
[
num_sdus
]
=
mac_rlc_data_req
(
module_idP
,
UE_mac_inst
[
module_idP
].
crnti
,
UE_mac_inst
[
module_idP
].
crnti
,
eNB_index
,
eNB_index
,
...
@@ -1469,12 +1590,18 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1469,12 +1590,18 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
}
}
}
}
lcgid
=
get_bsr_lcgid
(
module_idP
);
//
lcgid= get_bsr_lcgid(module_idP);
if
(
lcgid
<
0
)
{
// Compute BSR Values
for
(
lcg_id
=
0
;
lcg_id
<
MAX_NUM_LCGID
;
lcg_id
++
){
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg_id
]
=
locate_BsrIndexByBufferSize
(
BSR_TABLE
,
BSR_TABLE_SIZE
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
lcg_id
]);
}
if
(
bsr_ce_len
==
0
)
{
bsr_s
=
NULL
;
bsr_s
=
NULL
;
bsr_l
=
NULL
;
bsr_l
=
NULL
;
}
else
if
((
lcgid
==
MAX_NUM_LCGID
)
&&
(
bsr_ce_len
==
sizeof
(
BSR_LONG
)))
{
//TO DO : compute padding or truncated BSR
}
else
if
(
bsr_ce_len
==
sizeof
(
BSR_LONG
))
{
bsr_s
=
NULL
;
bsr_s
=
NULL
;
bsr_l
->
Buffer_size0
=
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
LCGID0
];
bsr_l
->
Buffer_size0
=
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
LCGID0
];
bsr_l
->
Buffer_size1
=
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
LCGID1
];
bsr_l
->
Buffer_size1
=
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
LCGID1
];
...
@@ -1497,14 +1624,14 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1497,14 +1624,14 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
LCGID3
]
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
LCGID3
]
=
0
;
}
else
if
(
bsr_ce_len
==
sizeof
(
BSR_SHORT
))
{
}
else
if
(
bsr_ce_len
==
sizeof
(
BSR_SHORT
))
{
bsr_l
=
NULL
;
bsr_l
=
NULL
;
bsr_s
->
LCGID
=
lcg
id
;
bsr_s
->
LCGID
=
lcg
_id_bsr_short
;
bsr_s
->
Buffer_size
=
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg
id
];
bsr_s
->
Buffer_size
=
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg
_id_bsr_short
];
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
lcg
id
]
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
lcg
_id_bsr_short
]
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg
id
]
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg
_id_bsr_short
]
=
0
;
LOG_D
(
MAC
,
"[UE %d] Frame %d report SHORT BSR with level %d for LCGID %d
\n
"
,
LOG_D
(
MAC
,
"[UE %d] Frame %d report SHORT BSR with level %d for LCGID %d
\n
"
,
module_idP
,
frameP
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg
id
],
lcgid
);
module_idP
,
frameP
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg
_id_bsr_short
],
lcg_id_bsr_short
);
}
else
{
}
else
{
bsr_s
=
NULL
;
bsr_s
=
NULL
;
bsr_l
=
NULL
;
bsr_l
=
NULL
;
...
@@ -1589,8 +1716,6 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
...
@@ -1589,8 +1716,6 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
UE_mac_inst
[
module_idP
].
scheduling_info
.
SR_pending
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
SR_pending
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
SR_COUNTER
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
SR_COUNTER
=
0
;
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
0
;
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
0
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
=
get_sf_periodicBSRTimer
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_Timer
);
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
=
get_sf_retxBSRTimer
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_Timer
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU
,
VCD_FUNCTION_OUT
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU
,
VCD_FUNCTION_OUT
);
stop_meas
(
&
UE_mac_inst
[
module_idP
].
tx_ulsch_sdu
);
stop_meas
(
&
UE_mac_inst
[
module_idP
].
tx_ulsch_sdu
);
...
@@ -1753,6 +1878,23 @@ ue_scheduler(
...
@@ -1753,6 +1878,23 @@ ue_scheduler(
// call SR procedure to generate pending SR and BSR for next PUCCH/PUSCH TxOp. This should implement the procedures
// call SR procedure to generate pending SR and BSR for next PUCCH/PUSCH TxOp. This should implement the procedures
// outlined in Sections 5.4.4 an 5.4.5 of 36.321
// outlined in Sections 5.4.4 an 5.4.5 of 36.321
// Call BSR procedure as described in Section 5.4.5 in 36.321
// Call BSR procedure as described in Section 5.4.5 in 36.321
// TODO : Fix Periodic and ReTx BSR Timers
// First check ReTxBSR Timer because it is always configured
#if 1
// Decrement ReTxBSR Timer if it is running and not null
if
((
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
!=
MAC_UE_BSR_TIMER_NOT_RUNNING
)
&&
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
!=
0
)){
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
--
;
}
// Decrement Periodic Timer if it is running and not null
if
((
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
!=
MAC_UE_BSR_TIMER_NOT_RUNNING
)
&&
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
!=
0
)){
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
--
;
}
#else
if
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
==
get_sf_periodicBSRTimer
(
MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity
))
{
if
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
==
get_sf_periodicBSRTimer
(
MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity
))
{
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
1
;
UE_mac_inst
[
module_idP
].
BSR_reporting_active
=
1
;
}
else
if
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
<=
0
){
}
else
if
(
UE_mac_inst
[
module_idP
].
scheduling_info
.
periodicBSR_SF
<=
0
){
...
@@ -1768,6 +1910,7 @@ ue_scheduler(
...
@@ -1768,6 +1910,7 @@ ue_scheduler(
}
else
if
(
UE_mac_inst
[
module_idP
].
BSR_reporting_active
==
0
)
{
}
else
if
(
UE_mac_inst
[
module_idP
].
BSR_reporting_active
==
0
)
{
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
--
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
retxBSR_SF
--
;
}
}
#endif
// Get RLC status info and update Bj for all lcids that are active
// Get RLC status info and update Bj for all lcids that are active
for
(
lcid
=
DCCH
;
lcid
<
MAX_NUM_LCID
;
lcid
++
)
{
for
(
lcid
=
DCCH
;
lcid
<
MAX_NUM_LCID
;
lcid
++
)
{
...
@@ -2053,12 +2196,22 @@ uint8_t get_bsr_len (module_id_t module_idP, uint8_t eNB_index,frame_t frameP,ui
...
@@ -2053,12 +2196,22 @@ uint8_t get_bsr_len (module_id_t module_idP, uint8_t eNB_index,frame_t frameP,ui
num_lcid
+=
1
;
num_lcid
+=
1
;
bsr_len
=
(
num_lcid
>=
2
)
?
sizeof
(
BSR_LONG
)
:
sizeof
(
BSR_SHORT
)
;
bsr_len
=
(
num_lcid
>=
2
)
?
sizeof
(
BSR_LONG
)
:
sizeof
(
BSR_SHORT
)
;
}
}
else
if
(
rlc_status
.
bytes_in_buffer
)
{
LOG_I
(
MAC
,
"pdu smaller than TBS! pdu=%d TBS=%d lcid=%d rlc buffer=%d bsr len=%d num lcid=%d
\n
"
,
pdu
,
buflen
,
lcid
,
rlc_status
.
bytes_in_buffer
,
bsr_len
,
num_lcid
);
}
LOG_D
(
MAC
,
"LC buffer Bytes %d for lcid %d bsr len %d num lcid %d
\n
"
,
rlc_status
.
bytes_in_buffer
,
lcid
,
bsr_len
,
num_lcid
);
LOG_D
(
MAC
,
"LC buffer Bytes %d for lcid %d bsr len %d num lcid %d
\n
"
,
rlc_status
.
bytes_in_buffer
,
lcid
,
bsr_len
,
num_lcid
);
}
}
if
(
bsr_len
>
0
)
if
(
bsr_len
>
0
)
{
LOG_D
(
MAC
,
"[UE %d] Prepare a %s (Transport Block Size %d, MAC pdu Size %d)
\n
"
,
LOG_D
(
MAC
,
"[UE %d] Prepare a %s (Transport Block Size %d, MAC pdu Size %d)
\n
"
,
module_idP
,
map_int_to_str
(
BSR_names
,
bsr_len
),
buflen
,
pdu
);
module_idP
,
map_int_to_str
(
BSR_names
,
bsr_len
),
buflen
,
pdu
);
}
else
if
(
rlc_status
.
bytes_in_buffer
){
LOG_I
(
MAC
,
"[UE %d] UL Transport Block size is 0 while RLC has pending data=%d pdu=%d
\n
"
,
module_idP
,
rlc_status
.
bytes_in_buffer
,
pdu
);
}
return
bsr_len
;
return
bsr_len
;
}
}
...
@@ -2098,8 +2251,8 @@ boolean_t update_bsr(module_id_t module_idP, frame_t frameP, eNB_index_t eNB_in
...
@@ -2098,8 +2251,8 @@ boolean_t update_bsr(module_id_t module_idP, frame_t frameP, eNB_index_t eNB_in
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
lcg_id
]
+=
rlc_status
.
bytes_in_buffer
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
lcg_id
]
+=
rlc_status
.
bytes_in_buffer
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg_id
]
=
locate_BsrIndexByBufferSize
(
BSR_TABLE
,
BSR_TABLE_SIZE
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
lcg_id
]);
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg_id
]
=
locate_BsrIndexByBufferSize
(
BSR_TABLE
,
BSR_TABLE_SIZE
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
lcg_id
]);
// UE_mac_inst[module_idP].scheduling_info.BSR_short_lcid = lcid; // only applicable to short bsr
// UE_mac_inst[module_idP].scheduling_info.BSR_short_lcid = lcid; // only applicable to short bsr
LOG_D
(
MAC
,
"[UE %d]
BSR level %d (LCGID %d, rlc buffer %d byte
)
\n
"
,
LOG_D
(
MAC
,
"[UE %d]
SR Triggered BSR level %d (LCID %d LCGID %d, rlc buffer=%d byte Total BO=%d
)
\n
"
,
module_idP
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg_id
],
lc
g_id
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
lcg_id
]);
module_idP
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR
[
lcg_id
],
lc
id
,
lcg_id
,
rlc_status
.
bytes_in_buffer
,
UE_mac_inst
[
module_idP
].
scheduling_info
.
BSR_bytes
[
lcg_id
]);
}
else
{
}
else
{
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCID_status
[
lcid
]
=
LCID_EMPTY
;
UE_mac_inst
[
module_idP
].
scheduling_info
.
LCID_status
[
lcid
]
=
LCID_EMPTY
;
}
}
...
...
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