Merge branch 'L2_Stabilization-22-BSR_fertilization' into 'develop1B'
L2 stabilization 22 bsr fertilization merge BSRfertilization branch to develop1B See merge request !13
This commit is contained in:
@@ -69,6 +69,7 @@ void ue_mac_reset(module_id_t module_idP,uint8_t eNB_index)
|
|||||||
// cancel all pending SRs
|
// cancel all pending SRs
|
||||||
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;
|
||||||
|
|
||||||
// stop ongoing RACH procedure
|
// stop ongoing RACH procedure
|
||||||
|
|
||||||
@@ -225,12 +226,33 @@ rrc_mac_config_req(
|
|||||||
if (mac_MainConfig->ext1 && mac_MainConfig->ext1->sr_ProhibitTimer_r9) {
|
if (mac_MainConfig->ext1 && mac_MainConfig->ext1->sr_ProhibitTimer_r9) {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = (uint16_t) *mac_MainConfig->ext1->sr_ProhibitTimer_r9;
|
UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = (uint16_t) *mac_MainConfig->ext1->sr_ProhibitTimer_r9;
|
||||||
} else {
|
} else {
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = (uint16_t) 0;
|
UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mac_MainConfig->ext2 && mac_MainConfig->ext2->mac_MainConfig_v1020) {
|
||||||
|
if (mac_MainConfig->ext2->mac_MainConfig_v1020->extendedBSR_Sizes_r10) {
|
||||||
|
UE_mac_inst[Mod_idP].scheduling_info.extendedBSR_Sizes_r10 = (uint16_t) *mac_MainConfig->ext2->mac_MainConfig_v1020->extendedBSR_Sizes_r10;
|
||||||
|
} else {
|
||||||
|
UE_mac_inst[Mod_idP].scheduling_info.extendedBSR_Sizes_r10 = (uint16_t)0;
|
||||||
|
}
|
||||||
|
if (mac_MainConfig->ext2->mac_MainConfig_v1020->extendedPHR_r10) {
|
||||||
|
UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 = (uint16_t) *mac_MainConfig->ext2->mac_MainConfig_v1020->extendedPHR_r10;
|
||||||
|
} else {
|
||||||
|
UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 = (uint16_t)0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
UE_mac_inst[Mod_idP].scheduling_info.extendedBSR_Sizes_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 = get_sf_periodicBSRTimer(UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer);
|
||||||
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 = get_sf_retxBSRTimer(UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer);
|
||||||
|
UE_mac_inst[Mod_idP].BSR_reporting_active = 0;
|
||||||
|
|
||||||
|
LOG_D(MAC,"[UE %d]: periodic BSR %d (SF), retx BSR %d (SF)\n",
|
||||||
|
Mod_idP,
|
||||||
|
UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_SF,
|
||||||
|
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_SF);
|
||||||
|
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.drx_config = mac_MainConfig->drx_Config;
|
UE_mac_inst[Mod_idP].scheduling_info.drx_config = mac_MainConfig->drx_Config;
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.phr_config = mac_MainConfig->phr_Config;
|
UE_mac_inst[Mod_idP].scheduling_info.phr_config = mac_MainConfig->phr_Config;
|
||||||
@@ -252,6 +274,7 @@ rrc_mac_config_req(
|
|||||||
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer);
|
UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer);
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer);
|
UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer);
|
||||||
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[Mod_idP].scheduling_info.PathlossChange);
|
UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[Mod_idP].scheduling_info.PathlossChange);
|
||||||
|
UE_mac_inst[Mod_idP].PHR_reporting_active = 0;
|
||||||
LOG_D(MAC,"[UE %d] config PHR (%d): periodic %d (SF) prohibit %d (SF) pathlosschange %d (db) \n",
|
LOG_D(MAC,"[UE %d] config PHR (%d): periodic %d (SF) prohibit %d (SF) pathlosschange %d (db) \n",
|
||||||
Mod_idP,
|
Mod_idP,
|
||||||
(mac_MainConfig->phr_Config)?mac_MainConfig->phr_Config->present:-1,
|
(mac_MainConfig->phr_Config)?mac_MainConfig->phr_Config->present:-1,
|
||||||
|
|||||||
@@ -945,8 +945,12 @@ typedef enum {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
/// buffer status for each lcgid
|
/// buffer status for each lcgid
|
||||||
uint8_t BSR[MAX_NUM_LCGID]; // should be more for mesh topology
|
uint8_t BSR[MAX_NUM_LCGID]; // should be more for mesh topology
|
||||||
/// keep the number of bytes in rlc buffer for each lcid
|
/// keep the number of bytes in rlc buffer for each lcgid
|
||||||
uint16_t BSR_bytes[MAX_NUM_LCGID];
|
uint16_t BSR_bytes[MAX_NUM_LCGID];
|
||||||
|
#if 0 //calvin for BSR test,current buffer greater then previous one, or buffer from 0 to !0
|
||||||
|
/// after multiplexing buffer remain for each lcid
|
||||||
|
uint16_t LCID_buffer_remain[MAX_NUM_LCID];
|
||||||
|
#endif
|
||||||
/// buffer status for each lcid
|
/// buffer status for each lcid
|
||||||
uint8_t LCID_status[MAX_NUM_LCID];
|
uint8_t LCID_status[MAX_NUM_LCID];
|
||||||
/// SR pending as defined in 36.321
|
/// SR pending as defined in 36.321
|
||||||
@@ -987,6 +991,12 @@ typedef struct {
|
|||||||
int16_t prohibitPHR_SF;
|
int16_t prohibitPHR_SF;
|
||||||
///DL Pathloss Change in db
|
///DL Pathloss Change in db
|
||||||
uint16_t PathlossChange_db;
|
uint16_t PathlossChange_db;
|
||||||
|
|
||||||
|
/// default value is false
|
||||||
|
uint16_t extendedBSR_Sizes_r10;
|
||||||
|
/// default value is false
|
||||||
|
uint16_t extendedPHR_r10;
|
||||||
|
|
||||||
//Bj bucket usage per lcid
|
//Bj bucket usage per lcid
|
||||||
int16_t Bj[MAX_NUM_LCID];
|
int16_t Bj[MAX_NUM_LCID];
|
||||||
// Bucket size per lcid
|
// Bucket size per lcid
|
||||||
@@ -1074,6 +1084,8 @@ typedef struct {
|
|||||||
uint8_t PHR_reporting_active;
|
uint8_t PHR_reporting_active;
|
||||||
/// power backoff due to power management (as allowed by P-MPRc) for this cell
|
/// power backoff due to power management (as allowed by P-MPRc) for this cell
|
||||||
uint8_t power_backoff_db[NUMBER_OF_eNB_MAX];
|
uint8_t power_backoff_db[NUMBER_OF_eNB_MAX];
|
||||||
|
/// BSR report falg management
|
||||||
|
uint8_t BSR_reporting_active;
|
||||||
/// MBSFN_Subframe Configuration
|
/// MBSFN_Subframe Configuration
|
||||||
struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8]; // FIXME replace 8 by MAX_MBSFN_AREA?
|
struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8]; // FIXME replace 8 by MAX_MBSFN_AREA?
|
||||||
/// number of subframe allocation pattern available for MBSFN sync area
|
/// number of subframe allocation pattern available for MBSFN sync area
|
||||||
|
|||||||
@@ -46,6 +46,8 @@
|
|||||||
|
|
||||||
extern const uint32_t BSR_TABLE[BSR_TABLE_SIZE];
|
extern const uint32_t BSR_TABLE[BSR_TABLE_SIZE];
|
||||||
//extern uint32_t EBSR_Level[63];
|
//extern uint32_t EBSR_Level[63];
|
||||||
|
extern const uint32_t Extended_BSR_TABLE[BSR_TABLE_SIZE];
|
||||||
|
//extern uint32_t Extended_BSR_TABLE[63]; ----currently not used
|
||||||
|
|
||||||
extern UE_MAC_INST *UE_mac_inst;
|
extern UE_MAC_INST *UE_mac_inst;
|
||||||
extern eNB_MAC_INST *eNB_mac_inst;
|
extern eNB_MAC_INST *eNB_mac_inst;
|
||||||
|
|||||||
@@ -551,7 +551,7 @@ int get_bsr_lcgid (module_id_t module_idP);
|
|||||||
\param[in] bufflen size of phy transport block
|
\param[in] bufflen size of phy transport block
|
||||||
\param[out] bsr_len size of bsr control element
|
\param[out] bsr_len size of bsr control element
|
||||||
*/
|
*/
|
||||||
uint8_t get_bsr_len (module_id_t module_idP, uint16_t buflen);
|
uint8_t get_bsr_len (module_id_t module_idP, uint8_t eNB_index,frame_t frameP,uint16_t buflen);
|
||||||
|
|
||||||
/*! \fn BSR_SHORT * get_bsr_short(module_id_t module_idP, uint8_t bsr_len)
|
/*! \fn BSR_SHORT * get_bsr_short(module_id_t module_idP, uint8_t bsr_len)
|
||||||
\brief get short bsr level
|
\brief get short bsr level
|
||||||
@@ -577,14 +577,14 @@ BSR_LONG * get_bsr_long(module_id_t module_idP, uint8_t bsr_len);
|
|||||||
*/
|
*/
|
||||||
boolean_t update_bsr(module_id_t module_idP, frame_t frameP, eNB_index_t eNB_index, uint8_t lcid, uint8_t lcgid);
|
boolean_t update_bsr(module_id_t module_idP, frame_t frameP, eNB_index_t eNB_index, uint8_t lcid, uint8_t lcgid);
|
||||||
|
|
||||||
/*! \fn locate (int *table, int size, int value)
|
/*! \fn locate_BsrIndexByBufferSize (int *table, int size, int value)
|
||||||
\brief locate the BSR level in the table as defined in 36.321. This function requires that he values in table to be monotonic, either increasing or decreasing. The returned value is not less than 0, nor greater than n-1, where n is the size of table.
|
\brief locate the BSR level in the table as defined in 36.321. This function requires that he values in table to be monotonic, either increasing or decreasing. The returned value is not less than 0, nor greater than n-1, where n is the size of table.
|
||||||
\param[in] *table Pointer to BSR table
|
\param[in] *table Pointer to BSR table
|
||||||
\param[in] size Size of the table
|
\param[in] size Size of the table
|
||||||
\param[in] value Value of the buffer
|
\param[in] value Value of the buffer
|
||||||
\return the index in the BSR_LEVEL table
|
\return the index in the BSR_LEVEL table
|
||||||
*/
|
*/
|
||||||
uint8_t locate (const uint32_t *table, int size, int value);
|
uint8_t locate_BsrIndexByBufferSize (const uint32_t *table, int size, int value);
|
||||||
|
|
||||||
|
|
||||||
/*! \fn int get_sf_periodicBSRTimer(uint8_t periodicBSR_Timer)
|
/*! \fn int get_sf_periodicBSRTimer(uint8_t periodicBSR_Timer)
|
||||||
|
|||||||
@@ -391,7 +391,7 @@ PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP,int CC_id,frame_t frameP,
|
|||||||
1); //post_padding
|
1); //post_padding
|
||||||
return(&UE_mac_inst[module_idP].RA_prach_resources);
|
return(&UE_mac_inst[module_idP].RA_prach_resources);
|
||||||
|
|
||||||
} else if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DCCH] > 0) {
|
} else if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[UE_mac_inst[module_idP].scheduling_info.LCGID[DCCH]] > 0) {
|
||||||
// This is for triggering a transmission on DCCH using PRACH (during handover, or sending SR for example)
|
// This is for triggering a transmission on DCCH using PRACH (during handover, or sending SR for example)
|
||||||
dcch_header_len = 2 + 2; /// SHORT Subheader + C-RNTI control element
|
dcch_header_len = 2 + 2; /// SHORT Subheader + C-RNTI control element
|
||||||
rlc_status = mac_rlc_status_ind(module_idP,UE_mac_inst[module_idP].crnti, eNB_indexP,frameP,ENB_FLAG_NO,MBMS_FLAG_NO,
|
rlc_status = mac_rlc_status_ind(module_idP,UE_mac_inst[module_idP].crnti, eNB_indexP,frameP,ENB_FLAG_NO,MBMS_FLAG_NO,
|
||||||
|
|||||||
@@ -102,13 +102,17 @@ void ue_init_mac(module_id_t module_idP)
|
|||||||
UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running=0;
|
UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running=0;
|
||||||
UE_mac_inst[module_idP].scheduling_info.maxHARQ_Tx=MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5;
|
UE_mac_inst[module_idP].scheduling_info.maxHARQ_Tx=MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5;
|
||||||
UE_mac_inst[module_idP].scheduling_info.ttiBundling=0;
|
UE_mac_inst[module_idP].scheduling_info.ttiBundling=0;
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.extendedBSR_Sizes_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 = 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);
|
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].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);
|
||||||
UE_mac_inst[module_idP].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[module_idP].scheduling_info.PathlossChange);
|
UE_mac_inst[module_idP].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[module_idP].scheduling_info.PathlossChange);
|
||||||
|
UE_mac_inst[module_idP].PHR_reporting_active = 0;
|
||||||
|
|
||||||
for (i=0; i < MAX_NUM_LCID; i++) {
|
for (i=0; i < MAX_NUM_LCID; i++) {
|
||||||
LOG_D(MAC,"[UE%d] Applying default logical channel config for LCGID %d\n",module_idP,i);
|
LOG_D(MAC,"[UE%d] Applying default logical channel config for LCGID %d\n",module_idP,i);
|
||||||
@@ -121,7 +125,7 @@ void ue_init_mac(module_id_t module_idP)
|
|||||||
UE_mac_inst[module_idP].scheduling_info.LCGID[i]=1;
|
UE_mac_inst[module_idP].scheduling_info.LCGID[i]=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
UE_mac_inst[module_idP].scheduling_info.LCID_status[i]=0;
|
UE_mac_inst[module_idP].scheduling_info.LCID_status[i]=LCID_EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CBA
|
#ifdef CBA
|
||||||
@@ -306,18 +310,28 @@ uint32_t ue_get_SR(module_id_t module_idP,int CC_id,frame_t frameP,uint8_t eNB_i
|
|||||||
// initiate RA
|
// initiate RA
|
||||||
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;
|
||||||
|
// release all pucch resource
|
||||||
|
UE_mac_inst[module_idP].physicalConfigDedicated = NULL;
|
||||||
|
UE_mac_inst[module_idP].ul_active=0;
|
||||||
|
UE_mac_inst[module_idP].BSR_reporting_active=0;
|
||||||
|
|
||||||
|
LOG_T(MAC,"[UE %d] Release all SRs \n", module_idP);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
void
|
void
|
||||||
ue_send_sdu(module_id_t module_idP,
|
ue_send_sdu(
|
||||||
uint8_t CC_id,
|
module_id_t module_idP,
|
||||||
frame_t frameP,
|
uint8_t CC_id,
|
||||||
uint8_t* sdu,
|
frame_t frameP,
|
||||||
uint16_t sdu_len,
|
uint8_t* sdu,
|
||||||
uint8_t eNB_index) {
|
uint16_t sdu_len,
|
||||||
|
uint8_t eNB_index
|
||||||
|
)
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
{
|
||||||
|
|
||||||
unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr;
|
unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr;
|
||||||
unsigned char rx_lcids[NB_RB_MAX];
|
unsigned char rx_lcids[NB_RB_MAX];
|
||||||
@@ -1244,10 +1258,11 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
BSR_LONG *bsr_l=&bsr_long;
|
BSR_LONG *bsr_l=&bsr_long;
|
||||||
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;
|
unsigned short short_padding=0, post_padding=0, padding_len=0;
|
||||||
int lcgid;
|
int lcgid;
|
||||||
int j; // used for padding
|
int j; // used for padding
|
||||||
// Compute header length
|
// Compute header length
|
||||||
|
int all_pdu_len;
|
||||||
|
|
||||||
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");
|
||||||
@@ -1282,19 +1297,10 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
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 = 1;//sizeof(SCH_SUBHEADER_FIXED);
|
||||||
phr_header_len = 1;//sizeof(SCH_SUBHEADER_FIXED);
|
phr_header_len = 1;//sizeof(SCH_SUBHEADER_FIXED);
|
||||||
phr_ce_len = (UE_mac_inst[module_idP].PHR_reporting_active == 1) ? 1 /* sizeof(POWER_HEADROOM_CMD)*/: 0;
|
|
||||||
|
|
||||||
if (phr_ce_len > 0) {
|
bsr_ce_len = get_bsr_len (module_idP, eNB_index, frameP, buflen);
|
||||||
phr_len = phr_ce_len + phr_header_len;
|
// retxBSR-Timer expires or periodicBSR-Timer expires and Regular BSR trigger
|
||||||
LOG_D(MAC,"[UE %d] header size info: PHR len %d (ce%d,hdr%d) buff_len %d\n",
|
if ((bsr_ce_len > 0 ) && (UE_mac_inst[module_idP].BSR_reporting_active > 0)) {
|
||||||
module_idP, phr_len, phr_ce_len, phr_header_len, buflen);
|
|
||||||
} else {
|
|
||||||
phr_len=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bsr_ce_len = get_bsr_len (module_idP, buflen-phr_len);
|
|
||||||
|
|
||||||
if (bsr_ce_len > 0 ) {
|
|
||||||
bsr_len = bsr_ce_len + bsr_header_len;
|
bsr_len = bsr_ce_len + bsr_header_len;
|
||||||
LOG_D(MAC,"[UE %d] header size info: dcch %d, dcch1 %d, dtch %d, bsr (ce%d,hdr%d) buff_len %d\n",
|
LOG_D(MAC,"[UE %d] header size info: dcch %d, dcch1 %d, dtch %d, bsr (ce%d,hdr%d) buff_len %d\n",
|
||||||
module_idP, dcch_header_len,dcch1_header_len,dtch_header_len, bsr_ce_len, bsr_header_len, buflen);
|
module_idP, dcch_header_len,dcch1_header_len,dtch_header_len, bsr_ce_len, bsr_header_len, buflen);
|
||||||
@@ -1305,6 +1311,15 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
//bsr_len = bsr_ce_len + bsr_header_len;
|
//bsr_len = bsr_ce_len + bsr_header_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
phr_ce_len = (UE_mac_inst[module_idP].PHR_reporting_active == 1) ? 1 /* sizeof(POWER_HEADROOM_CMD)*/: 0;
|
||||||
|
if (phr_ce_len > 0) {
|
||||||
|
phr_len = phr_ce_len + phr_header_len;
|
||||||
|
LOG_D(MAC,"[UE %d] header size info: PHR len %d (ce%d,hdr%d) buff_len %d\n",
|
||||||
|
module_idP, phr_len, phr_ce_len, phr_header_len, buflen);
|
||||||
|
} else {
|
||||||
|
phr_len=0;
|
||||||
|
}
|
||||||
|
|
||||||
// check for UL bandwidth requests and add SR control element
|
// check for UL bandwidth requests and add SR control element
|
||||||
|
|
||||||
// check for UL bandwidth requests and add SR control element
|
// check for UL bandwidth requests and add SR control element
|
||||||
@@ -1338,8 +1353,12 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
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 Got %d bytes for DCCH\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;
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.LCID_status[DCCH] = LCID_EMPTY;
|
||||||
|
#if 0 //calvin for BSR test,current buffer greater then previous one, or buffer from 0 to !0
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.LCID_buffer_remain[DCCH] = rlc_status.bytes_in_buffer-sdu_lengths[0];
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
dcch_header_len=0;
|
dcch_header_len=0;
|
||||||
num_sdus = 0;
|
num_sdus = 0;
|
||||||
@@ -1375,9 +1394,13 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
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 Got %d bytes for DCCH1\n",module_idP,sdu_lengths[num_sdus]);
|
||||||
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;
|
||||||
|
#if 0 //calvin for BSR test,current buffer greater then previous one, or buffer from 0 to !0
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.LCID_buffer_remain[DCCH1] = rlc_status.bytes_in_buffer-sdu_lengths[num_sdus];
|
||||||
|
#endif
|
||||||
|
num_sdus++;
|
||||||
} else {
|
} else {
|
||||||
dcch1_header_len =0;
|
dcch1_header_len =0;
|
||||||
}
|
}
|
||||||
@@ -1388,8 +1411,9 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
dtch_header_len+=3;
|
dtch_header_len+=3;
|
||||||
dtch_header_len_last=3;
|
dtch_header_len_last=3;
|
||||||
|
|
||||||
|
all_pdu_len = bsr_len+phr_len+dcch_header_len+dcch1_header_len+dtch_header_len+sdu_length_total;
|
||||||
if ((UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == LCID_NOT_EMPTY) &&
|
if ((UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == LCID_NOT_EMPTY) &&
|
||||||
((bsr_len+phr_len+dcch_header_len+dcch1_header_len+dtch_header_len+sdu_length_total) <= buflen)) {
|
(all_pdu_len <= buflen)) {
|
||||||
|
|
||||||
// optimize the dtch header lenght
|
// optimize the dtch header lenght
|
||||||
//if ((UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH] > 128) &&
|
//if ((UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH] > 128) &&
|
||||||
@@ -1407,11 +1431,11 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
ENB_FLAG_NO,
|
ENB_FLAG_NO,
|
||||||
MBMS_FLAG_NO, // eNB_index
|
MBMS_FLAG_NO, // eNB_index
|
||||||
lcid,
|
lcid,
|
||||||
buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total);
|
buflen-all_pdu_len);
|
||||||
|
|
||||||
LOG_D(MAC,"[UE %d] Frame %d : UL-DTCH -> ULSCH%d, %d bytes to send (Transport Block size %d, mac header len %d, BSR byte[%d] %d)\n",
|
LOG_D(MAC,"[UE %d] Frame %d : UL-DTCH -> ULSCH%d, %d bytes to send (Transport Block size %d, mac header len %d, BSR byte[%d] %d)\n",
|
||||||
module_idP,frameP, lcid, rlc_status.bytes_in_buffer,buflen,dtch_header_len,
|
module_idP,frameP, lcid, rlc_status.bytes_in_buffer,buflen,dtch_header_len,
|
||||||
lcid, UE_mac_inst[module_idP].scheduling_info.BSR_bytes[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) {
|
||||||
sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,
|
sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,
|
||||||
@@ -1431,11 +1455,15 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
dtch_header_len --;
|
dtch_header_len --;
|
||||||
dtch_header_len_last --;
|
dtch_header_len_last --;
|
||||||
}
|
}
|
||||||
|
#if 0 //calvin for BSR test,current buffer greater then previous one, or buffer from 0 to !0
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.LCID_buffer_remain[lcid] = rlc_status.bytes_in_buffer-sdu_lengths[num_sdus];
|
||||||
|
#endif
|
||||||
num_sdus++;
|
num_sdus++;
|
||||||
UE_mac_inst[module_idP].ul_active = update_bsr(module_idP, frameP, eNB_index,lcid, UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]);
|
//UE_mac_inst[module_idP].ul_active = update_bsr(module_idP, frameP, eNB_index,lcid, UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]);
|
||||||
} else {
|
} else {
|
||||||
dtch_header_len -= 3;
|
dtch_header_len -= 3;
|
||||||
}
|
}
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] = LCID_EMPTY;
|
||||||
} else { // no rlc pdu : generate the dummy header
|
} else { // no rlc pdu : generate the dummy header
|
||||||
dtch_header_len -= 3;
|
dtch_header_len -= 3;
|
||||||
}
|
}
|
||||||
@@ -1452,15 +1480,29 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
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];
|
||||||
bsr_l->Buffer_size2 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2];
|
bsr_l->Buffer_size2 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2];
|
||||||
bsr_l->Buffer_size3 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3];
|
bsr_l->Buffer_size3 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3];
|
||||||
|
|
||||||
LOG_D(MAC, "[UE %d] Frame %d report long BSR (level LCGID0 %d,level LCGID1 %d,level LCGID2 %d,level LCGID3 %d)\n", module_idP,frameP,
|
LOG_D(MAC, "[UE %d] Frame %d report long BSR (level LCGID0 %d,level LCGID1 %d,level LCGID2 %d,level LCGID3 %d)\n", module_idP,frameP,
|
||||||
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0],
|
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0],
|
||||||
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1],
|
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1],
|
||||||
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2],
|
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2],
|
||||||
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]);
|
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]);
|
||||||
|
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.BSR_bytes[LCGID0] = 0;
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.BSR_bytes[LCGID1] = 0;
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.BSR_bytes[LCGID2] = 0;
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.BSR_bytes[LCGID3] = 0;
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0] = 0;
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1] = 0;
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2] = 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 = lcgid;
|
bsr_s->LCGID = lcgid;
|
||||||
bsr_s->Buffer_size = UE_mac_inst[module_idP].scheduling_info.BSR[lcgid];
|
bsr_s->Buffer_size = UE_mac_inst[module_idP].scheduling_info.BSR[lcgid];
|
||||||
|
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] = 0;
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.BSR[lcgid] = 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[lcgid],lcgid);
|
module_idP, frameP, UE_mac_inst[module_idP].scheduling_info.BSR[lcgid],lcgid);
|
||||||
} else {
|
} else {
|
||||||
@@ -1494,12 +1536,14 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
dtch_header_len_last-=1;
|
dtch_header_len_last-=1;
|
||||||
dtch_header_len= (dtch_header_len >0)? dtch_header_len - dtch_header_len_last : dtch_header_len;
|
dtch_header_len= (dtch_header_len >0)? dtch_header_len - dtch_header_len_last : dtch_header_len;
|
||||||
}
|
}
|
||||||
|
// 1-bit padding or 2-bit padding special padding subheader
|
||||||
if ((buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total) <= 2) {
|
padding_len = buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total;
|
||||||
short_padding = buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total;
|
if (padding_len <= 2) {
|
||||||
|
short_padding = padding_len;
|
||||||
|
// only add padding header
|
||||||
post_padding = 0;
|
post_padding = 0;
|
||||||
} else {
|
} else {
|
||||||
if ((buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total) == buflen) {
|
if (padding_len == buflen) {// nona mac pdu
|
||||||
*access_mode=CANCELED_ACCESS;
|
*access_mode=CANCELED_ACCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1544,6 +1588,9 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
|||||||
module_idP,payload_offset, sdu_length_total);
|
module_idP,payload_offset, sdu_length_total);
|
||||||
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].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);
|
||||||
|
|
||||||
@@ -1705,10 +1752,25 @@ 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
|
||||||
// Put this in another function
|
// Call BSR procedure as described in Section 5.4.5 in 36.321
|
||||||
|
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;
|
||||||
|
} else if (UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF <= 0 ){
|
||||||
|
// trigger BSR and reset the timer later when the BSR report is sent
|
||||||
|
UE_mac_inst[module_idP].BSR_reporting_active = 1;
|
||||||
|
} else if (UE_mac_inst[module_idP].BSR_reporting_active == 0 ) {
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UE_mac_inst[module_idP].scheduling_info.retxBSR_SF <= 0){
|
||||||
|
// trigger BSR and reset the timer later when the BSR report is sent
|
||||||
|
UE_mac_inst[module_idP].BSR_reporting_active = 1;
|
||||||
|
} else if (UE_mac_inst[module_idP].BSR_reporting_active == 0 ) {
|
||||||
|
UE_mac_inst[module_idP].scheduling_info.retxBSR_SF--;
|
||||||
|
}
|
||||||
|
|
||||||
// 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 <= DTCH; lcid++ ) {
|
for (lcid=DCCH; lcid < MAX_NUM_LCID; lcid++ ) {
|
||||||
if ((lcid == 0) ||(UE_mac_inst[module_idP].logicalChannelConfig[lcid])) {
|
if ((lcid == 0) ||(UE_mac_inst[module_idP].logicalChannelConfig[lcid])) {
|
||||||
// meausre the Bj
|
// meausre the Bj
|
||||||
if ((directionP == SF_UL)&& (UE_mac_inst[module_idP].scheduling_info.Bj[lcid] >= 0)) {
|
if ((directionP == SF_UL)&& (UE_mac_inst[module_idP].scheduling_info.Bj[lcid] >= 0)) {
|
||||||
@@ -1729,6 +1791,8 @@ ue_scheduler(
|
|||||||
|
|
||||||
if (update_bsr(module_idP,frameP, eNB_indexP, lcid, UE_mac_inst[module_idP].scheduling_info.LCGID[lcid])) {
|
if (update_bsr(module_idP,frameP, eNB_indexP, lcid, UE_mac_inst[module_idP].scheduling_info.LCGID[lcid])) {
|
||||||
UE_mac_inst[module_idP].scheduling_info.SR_pending= 1;
|
UE_mac_inst[module_idP].scheduling_info.SR_pending= 1;
|
||||||
|
// Regular BSR trigger
|
||||||
|
UE_mac_inst[module_idP].BSR_reporting_active = 1;
|
||||||
LOG_D(MAC,"[UE %d][SR] Frame %d subframe %d SR for PUSCH is pending for LCGID %d with BSR level %d (%d bytes in RLC)\n",
|
LOG_D(MAC,"[UE %d][SR] Frame %d subframe %d SR for PUSCH is pending for LCGID %d with BSR level %d (%d bytes in RLC)\n",
|
||||||
module_idP, frameP,subframeP,UE_mac_inst[module_idP].scheduling_info.LCGID[lcid],
|
module_idP, frameP,subframeP,UE_mac_inst[module_idP].scheduling_info.LCGID[lcid],
|
||||||
UE_mac_inst[module_idP].scheduling_info.BSR[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]],
|
UE_mac_inst[module_idP].scheduling_info.BSR[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]],
|
||||||
@@ -1970,31 +2034,26 @@ int get_bsr_lcgid (module_id_t module_idP)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t get_bsr_len (module_id_t module_idP, uint16_t buflen)
|
uint8_t get_bsr_len (module_id_t module_idP, uint8_t eNB_index,frame_t frameP,uint16_t buflen)
|
||||||
{
|
{
|
||||||
|
int lcid;
|
||||||
int lcgid=0;
|
uint8_t bsr_len=0, num_lcid=0;
|
||||||
uint8_t bsr_len=0, num_lcgid=0;
|
|
||||||
int pdu = 0;
|
int pdu = 0;
|
||||||
|
mac_rlc_status_resp_t rlc_status;
|
||||||
|
|
||||||
|
for (lcid=DCCH; lcid<NB_RB_MAX ; lcid++){
|
||||||
for (lcgid=0; lcgid < MAX_NUM_LCGID; lcgid++ ) {
|
rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti,eNB_index,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, lcid, 0);
|
||||||
if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] > 0 ) {
|
if (rlc_status.bytes_in_buffer > 0 ) {
|
||||||
pdu += (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] + bsr_len + 2); //2 = sizeof(SCH_SUBHEADER_SHORT)
|
pdu += rlc_status.bytes_in_buffer + sizeof(SCH_SUBHEADER_SHORT) + bsr_len;
|
||||||
|
if (rlc_status.bytes_in_buffer > 128 ) {
|
||||||
|
pdu += 1; //sizeof(SCH_SUBHEADER_LONG)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if ( (pdu > buflen) && (rlc_status.bytes_in_buffer > 0 ) ) {
|
||||||
if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] > 128 ) { // long header size: adjust the header size
|
num_lcid +=1;
|
||||||
pdu += 1;
|
bsr_len = (num_lcid >= 2 ) ? sizeof(BSR_LONG) : sizeof(BSR_SHORT) ;
|
||||||
}
|
}
|
||||||
|
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);
|
||||||
// current phy buff can not transport all sdu for this lcgid -> transmit a bsr for this lcgid
|
|
||||||
|
|
||||||
if ( (pdu > buflen) && (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] > 0 ) ) {
|
|
||||||
num_lcgid +=1;
|
|
||||||
bsr_len = (num_lcgid >= 2 ) ? sizeof(BSR_LONG) : sizeof(BSR_SHORT) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_D(MAC,"BSR Bytes %d for lcgid %d bsr len %d num lcgid %d\n", UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid], lcgid, bsr_len, num_lcgid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( bsr_len > 0 )
|
if ( bsr_len > 0 )
|
||||||
@@ -2004,7 +2063,6 @@ uint8_t get_bsr_len (module_id_t module_idP, uint16_t buflen)
|
|||||||
return bsr_len;
|
return bsr_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
boolean_t update_bsr(module_id_t module_idP, frame_t frameP, eNB_index_t eNB_index, uint8_t lcid, uint8_t lcg_id)
|
boolean_t update_bsr(module_id_t module_idP, frame_t frameP, eNB_index_t eNB_index, uint8_t lcid, uint8_t lcg_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -2028,11 +2086,17 @@ boolean_t update_bsr(module_id_t module_idP, frame_t frameP, eNB_index_t eNB_in
|
|||||||
lcid,
|
lcid,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
if (rlc_status.bytes_in_buffer > 0 ) {
|
if ((rlc_status.bytes_in_buffer > 0 )
|
||||||
|
#if 0 //calvin for BSR test,current buffer greater then previous one, or buffer from 0 to !0
|
||||||
|
&& (rlc_status.bytes_in_buffer > UE_mac_inst[module_idP].scheduling_info.LCID_buffer_remain[lcid])
|
||||||
|
#endif
|
||||||
|
){
|
||||||
|
//BSR trigger SR
|
||||||
sr_pending = TRUE;
|
sr_pending = TRUE;
|
||||||
UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] = LCID_NOT_EMPTY;
|
UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] = LCID_NOT_EMPTY;
|
||||||
UE_mac_inst[module_idP].scheduling_info.BSR[lcg_id] += locate (BSR_TABLE,BSR_TABLE_SIZE, rlc_status.bytes_in_buffer);
|
// sum lcid buffer which has same lcgid
|
||||||
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_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] BSR level %d (LCGID %d, rlc buffer %d byte)\n",
|
||||||
module_idP, UE_mac_inst[module_idP].scheduling_info.BSR[lcg_id],lcg_id, UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcg_id]);
|
module_idP, UE_mac_inst[module_idP].scheduling_info.BSR[lcg_id],lcg_id, UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcg_id]);
|
||||||
@@ -2045,7 +2109,7 @@ boolean_t update_bsr(module_id_t module_idP, frame_t frameP, eNB_index_t eNB_in
|
|||||||
return sr_pending;
|
return sr_pending;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t locate (const uint32_t *table, int size, int value)
|
uint8_t locate_BsrIndexByBufferSize (const uint32_t *table, int size, int value)
|
||||||
{
|
{
|
||||||
|
|
||||||
uint8_t ju, jm, jl;
|
uint8_t ju, jm, jl;
|
||||||
@@ -2076,7 +2140,7 @@ uint8_t locate (const uint32_t *table, int size, int value)
|
|||||||
|
|
||||||
if (value == table[jl]) {
|
if (value == table[jl]) {
|
||||||
return jl;
|
return jl;
|
||||||
} else {
|
} else {
|
||||||
return jl+1; //equally ju
|
return jl+1; //equally ju
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,15 @@ const uint32_t BSR_TABLE[BSR_TABLE_SIZE]= {0,10,12,14,17,19,22,26,31,36,42,49,57
|
|||||||
1326,1552,1817,2127,2490,2915,3413,3995,4677,5467,6411,7505,8787,10287,12043,14099,
|
1326,1552,1817,2127,2490,2915,3413,3995,4677,5467,6411,7505,8787,10287,12043,14099,
|
||||||
16507,19325,22624,26487,31009,36304,42502,49759,58255,68201,79846,93479,109439, 128125,150000, 300000
|
16507,19325,22624,26487,31009,36304,42502,49759,58255,68201,79846,93479,109439, 128125,150000, 300000
|
||||||
};
|
};
|
||||||
|
// extended bsr table--currently not used
|
||||||
|
const uint32_t Extended_BSR_TABLE[BSR_TABLE_SIZE] = {0,10,13,16,19,23,29,35,43,53,65,80,98,120,147,
|
||||||
|
181,223,274,337,414,509,625,769,945,1162,1429,
|
||||||
|
1757,2161,2657,3267,4017,4940,6074,7469,9185,
|
||||||
|
11294,13888,17077,20999,25822,31752,39045,48012,
|
||||||
|
59039,72598,89272,109774,134986,165989,204111,
|
||||||
|
250990,308634,379519,466683,573866,705666,867737,
|
||||||
|
1067031,1312097,1613447,1984009,2439678,3000000,
|
||||||
|
6000000};
|
||||||
|
|
||||||
//uint32_t EBSR_Level[63]={0,10,13,16,19,23,29,35,43,53,65,80,98,120,147,181};
|
//uint32_t EBSR_Level[63]={0,10,13,16,19,23,29,35,43,53,65,80,98,120,147,181};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user