Fixed bug related to the reporting of timing advance to the controller that severely dropped the performance of the remote scheduler
This commit is contained in:
@@ -443,11 +443,11 @@ int flexran_agent_mac_stats_reply(mid_t mod_id,
|
||||
if (rlc_reports[j] == NULL)
|
||||
goto error;
|
||||
protocol__flex_rlc_bsr__init(rlc_reports[j]);
|
||||
rlc_reports[j]->lc_id = j+1;
|
||||
rlc_reports[j]->lc_id = j + 1;
|
||||
rlc_reports[j]->has_lc_id = 1;
|
||||
rlc_reports[j]->tx_queue_size = flexran_get_tx_queue_size(enb_id,i,j+1);
|
||||
rlc_reports[j]->tx_queue_size = flexran_get_tx_queue_size(enb_id,i,j + 1);
|
||||
rlc_reports[j]->has_tx_queue_size = 1;
|
||||
|
||||
|
||||
//TODO:Set tx queue head of line delay in ms
|
||||
rlc_reports[j]->tx_queue_hol_delay = 100;
|
||||
rlc_reports[j]->has_tx_queue_hol_delay = 0;
|
||||
@@ -963,7 +963,7 @@ int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Fle
|
||||
|
||||
sf_trigger_msg->header = header;
|
||||
sf_trigger_msg->has_sfn_sf = 1;
|
||||
sf_trigger_msg->sfn_sf = flexran_get_future_sfn_sf(mod_id, 1);
|
||||
sf_trigger_msg->sfn_sf = flexran_get_future_sfn_sf(mod_id, 3);
|
||||
|
||||
sf_trigger_msg->n_dl_info = 0;
|
||||
|
||||
|
||||
@@ -562,57 +562,63 @@ int flexran_get_ue_wcqi (mid_t mod_id, mid_t ue_id) {
|
||||
int flexran_get_tx_queue_size(mid_t mod_id, mid_t ue_id, logical_chan_id_t channel_id) {
|
||||
rnti_t rnti = flexran_get_ue_crnti(mod_id,ue_id);
|
||||
uint16_t frame = (uint16_t) flexran_get_current_frame(mod_id);
|
||||
mac_rlc_status_resp_t rlc_status = mac_rlc_status_ind(mod_id,rnti, mod_id,frame,ENB_FLAG_YES,MBMS_FLAG_NO,channel_id,0);
|
||||
mac_rlc_status_resp_t rlc_status = mac_rlc_status_ind(mod_id,rnti, mod_id,frame,ENB_FLAG_YES,MBMS_FLAG_NO, channel_id, 0);
|
||||
return rlc_status.bytes_in_buffer;
|
||||
}
|
||||
|
||||
int flexran_update_TA(mid_t mod_id, mid_t ue_id, int CC_id) {
|
||||
short flexran_get_TA(mid_t mod_id, mid_t ue_id, int CC_id) {
|
||||
|
||||
UE_list_t *UE_list=&eNB_mac_inst[mod_id].UE_list;
|
||||
UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[ue_id];
|
||||
int rnti;
|
||||
|
||||
rnti = flexran_get_ue_crnti(mod_id, ue_id);
|
||||
if (ue_sched_ctl->ta_timer == 0) {
|
||||
|
||||
// WE SHOULD PROTECT the eNB_UE_stats with a mutex here ...
|
||||
LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti);
|
||||
ue_sched_ctl->ta_timer = 20; // wait 20 subframes before taking TA measurement from PHY
|
||||
switch (PHY_vars_eNB_g[mod_id][CC_id]->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update;
|
||||
break;
|
||||
|
||||
case 15:
|
||||
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/2;
|
||||
break;
|
||||
|
||||
case 25:
|
||||
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/4;
|
||||
break;
|
||||
|
||||
case 50:
|
||||
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/8;
|
||||
break;
|
||||
|
||||
case 75:
|
||||
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/12;
|
||||
break;
|
||||
|
||||
case 100:
|
||||
ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/16;
|
||||
break;
|
||||
LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti);
|
||||
//ue_sched_ctl->ta_timer = 20; // wait 20 subframes before taking TA measurement from PHY
|
||||
switch (PHY_vars_eNB_g[mod_id][CC_id]->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
return eNB_UE_stats->timing_advance_update;
|
||||
case 15:
|
||||
return eNB_UE_stats->timing_advance_update/2;
|
||||
case 25:
|
||||
return eNB_UE_stats->timing_advance_update/4;
|
||||
case 50:
|
||||
return eNB_UE_stats->timing_advance_update/8;
|
||||
case 75:
|
||||
return eNB_UE_stats->timing_advance_update/12;
|
||||
case 100:
|
||||
if (PHY_vars_eNB_g[mod_id][CC_id]->frame_parms.threequarter_fs == 0) {
|
||||
return eNB_UE_stats->timing_advance_update/16;
|
||||
} else {
|
||||
return eNB_UE_stats->timing_advance_update/12;
|
||||
}
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void flexran_update_TA(mid_t mod_id, mid_t ue_id, int CC_id) {
|
||||
|
||||
UE_list_t *UE_list=&eNB_mac_inst[mod_id].UE_list;
|
||||
UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[ue_id];
|
||||
|
||||
int rnti;
|
||||
|
||||
rnti = flexran_get_ue_crnti(mod_id, ue_id);
|
||||
if (ue_sched_ctl->ta_timer == 0) {
|
||||
|
||||
// WE SHOULD PROTECT the eNB_UE_stats with a mutex here ...
|
||||
// LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti);
|
||||
//ue_sched_ctl->ta_timer = 20; // wait 20 subframes before taking TA measurement from PHY
|
||||
ue_sched_ctl->ta_update = flexran_get_TA(mod_id, ue_id, CC_id);
|
||||
|
||||
// clear the update in case PHY does not have a new measurement after timer expiry
|
||||
eNB_UE_stats->timing_advance_update = 0;
|
||||
}
|
||||
else {
|
||||
// eNB_UE_stats->timing_advance_update = 0;
|
||||
} else {
|
||||
ue_sched_ctl->ta_timer--;
|
||||
ue_sched_ctl->ta_update = 0; // don't trigger a timing advance command
|
||||
ue_sched_ctl->ta_update = 0; // don't trigger a timing advance command
|
||||
}
|
||||
|
||||
return ue_sched_ctl->ta_update = 0;
|
||||
|
||||
}
|
||||
|
||||
int flexran_get_MAC_CE_bitmap_TA(mid_t mod_id, mid_t ue_id,int CC_id) {
|
||||
@@ -627,8 +633,8 @@ int flexran_get_MAC_CE_bitmap_TA(mid_t mod_id, mid_t ue_id,int CC_id) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ue_sched_ctl->ta_update == 0) {
|
||||
return 1;
|
||||
if (flexran_get_TA(mod_id, ue_id, CC_id) != 0) {
|
||||
return PROTOCOL__FLEX_CE_TYPE__FLPCET_TA;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -185,8 +185,11 @@ int flexran_get_ue_wcqi (mid_t mod_id, mid_t ue_id);
|
||||
/* Get the transmission queue size for a UE with a channel_id logical channel id */
|
||||
int flexran_get_tx_queue_size(mid_t mod_id, mid_t ue_id, logical_chan_id_t channel_id);
|
||||
|
||||
/* Check the status of the timing advance for a UE */
|
||||
short flexran_get_TA(mid_t mod_id, mid_t ue_id, int CC_id);
|
||||
|
||||
/* Update the timing advance status (find out whether a timing advance command is required) */
|
||||
int flexran_update_TA(mid_t mod_id, mid_t ue_id, int CC_id);
|
||||
void flexran_update_TA(mid_t mod_id, mid_t ue_id, int CC_id);
|
||||
|
||||
/* Return timing advance MAC control element for a designated cell and UE */
|
||||
int flexran_get_MAC_CE_bitmap_TA(mid_t mod_id, mid_t ue_id, int CC_id);
|
||||
|
||||
@@ -172,7 +172,7 @@ Protocol__FlexranMessage* flexran_agent_process_timeout(long timer_id, void* tim
|
||||
struct flexran_agent_timer_element_s *found = get_timer_entry(timer_id);
|
||||
|
||||
if (found == NULL ) goto error;
|
||||
LOG_I(FLEXRAN_AGENT, "Found the entry (%p): timer_id is 0x%lx 0x%lx\n", found, timer_id, found->timer_id);
|
||||
LOG_D(FLEXRAN_AGENT, "Found the entry (%p): timer_id is 0x%lx 0x%lx\n", found, timer_id, found->timer_id);
|
||||
|
||||
if (timer_args == NULL)
|
||||
LOG_W(FLEXRAN_AGENT,"null timer args\n");
|
||||
|
||||
@@ -152,27 +152,20 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id,
|
||||
//Check if there is TA command and set the length appropriately
|
||||
ta_len = (dl_data->ce_bitmap[0] & PROTOCOL__FLEX_CE_TYPE__FLPCET_TA) ? 2 : 0;
|
||||
}
|
||||
|
||||
|
||||
num_sdus = 0;
|
||||
sdu_length_total = 0;
|
||||
|
||||
if (ta_len > 0) {
|
||||
// Reset the measurement
|
||||
ue_sched_ctl->ta_timer = 20;
|
||||
eNB_UE_stats->timing_advance_update = 0;
|
||||
// header_len = ta_len;
|
||||
//last_sdu_header_len = ta_len;
|
||||
}
|
||||
|
||||
n_lc = dl_data->n_rlc_pdu;
|
||||
// Go through each one of the channel commands and create SDUs
|
||||
header_len = 0;
|
||||
last_sdu_header_len = 0;
|
||||
for (j = 0; j < n_lc; j++) {
|
||||
sdu_lengths[j] = 0;
|
||||
lcid = dl_data->rlc_pdu[j]->rlc_pdu_tb[0]->logical_channel_id;
|
||||
rlc_size = dl_data->rlc_pdu[j]->rlc_pdu_tb[0]->size;
|
||||
LOG_D(MAC,"[TEST] [eNB %d] Frame %d, LCID %d, CC_id %d, Requesting %d bytes from RLC (RRC message)\n",
|
||||
mod_id, frame, lcid, CC_id, rlc_size);
|
||||
LOG_D(MAC,"[TEST] [eNB %d] [Frame %d] [Subframe %d], LCID %d, CC_id %d, Requesting %d bytes from RLC (RRC message)\n",
|
||||
mod_id, frame, subframe, lcid, CC_id, rlc_size);
|
||||
if (rlc_size > 0) {
|
||||
|
||||
rlc_status = mac_rlc_status_ind(mod_id,
|
||||
@@ -186,10 +179,14 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id,
|
||||
|
||||
if (rlc_status.bytes_in_buffer > 0) {
|
||||
|
||||
if (rlc_size <= 2) {
|
||||
rlc_size = 3;
|
||||
if (rlc_status.bytes_in_buffer < rlc_size) {
|
||||
rlc_size = rlc_status.bytes_in_buffer;
|
||||
}
|
||||
|
||||
if (rlc_size <= 2) {
|
||||
rlc_size = 3;
|
||||
}
|
||||
|
||||
rlc_status = mac_rlc_status_ind(mod_id,
|
||||
rnti,
|
||||
mod_id,
|
||||
@@ -199,8 +196,6 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id,
|
||||
lcid,
|
||||
rlc_size); // transport block set size
|
||||
|
||||
sdu_lengths[j] = 0;
|
||||
|
||||
LOG_D(MAC, "[TEST] RLC can give %d bytes for LCID %d during second call\n", rlc_status.bytes_in_buffer, lcid);
|
||||
|
||||
if (rlc_status.bytes_in_buffer > 0) {
|
||||
@@ -257,9 +252,16 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id,
|
||||
header_len = header_len_tmp;
|
||||
post_padding = TBS - sdu_length_total - header_len - ta_len; // 1 is for the postpadding header
|
||||
}
|
||||
|
||||
ta_update = (ta_len > 0) ? ue_sched_ctl->ta_update : 0;
|
||||
|
||||
|
||||
if (ta_len > 0) {
|
||||
// Reset the measurement
|
||||
ta_update = flexran_get_TA(mod_id, UE_id, CC_id);
|
||||
ue_sched_ctl->ta_timer = 20;
|
||||
eNB_UE_stats->timing_advance_update = 0;
|
||||
} else {
|
||||
ta_update = 0;
|
||||
}
|
||||
|
||||
// If there is nothing to schedule, just leave
|
||||
if ((sdu_length_total) <= 0) {
|
||||
harq_pid_updated[UE_id][harq_pid] = 1;
|
||||
@@ -280,6 +282,8 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id,
|
||||
post_padding);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef DEBUG_eNB_SCHEDULER
|
||||
LOG_T(MAC,"[eNB %d] First 16 bytes of DLSCH : \n");
|
||||
@@ -343,6 +347,11 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id,
|
||||
|
||||
//eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]];
|
||||
//eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs);
|
||||
} else {
|
||||
LOG_D(FLEXRAN_AGENT, "No need to schedule a dci after all. Just drop it\n");
|
||||
harq_pid_updated[UE_id][harq_pid] = 1;
|
||||
harq_pid_round[UE_id][harq_pid] = 0;
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
// No need to create anything apart of DCI in case of retransmission
|
||||
|
||||
@@ -1192,7 +1192,7 @@ flexran_schedule_ue_spec_common(mid_t mod_id,
|
||||
// check first for RLC data on DCCH
|
||||
// add the length for all the control elements (timing adv, drx, etc) : header + payload
|
||||
|
||||
ta_len = (ue_sched_ctl->ta_update!=0) ? 2 : 0;
|
||||
ta_len = (ue_sched_ctl->ta_update != 0) ? 2 : 0;
|
||||
|
||||
dl_data[num_ues_added]->n_ce_bitmap = 2;
|
||||
dl_data[num_ues_added]->ce_bitmap = (uint32_t *) calloc(2, sizeof(uint32_t));
|
||||
@@ -1401,7 +1401,6 @@ flexran_schedule_ue_spec_common(mid_t mod_id,
|
||||
if (flexran_get_p0_pucch_status(mod_id, UE_id, CC_id) == 1) {
|
||||
flexran_update_p0_pucch(mod_id, UE_id, CC_id);
|
||||
|
||||
|
||||
UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame = frame;
|
||||
UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe = subframe;
|
||||
if (normalized_rx_power>(target_rx_power+1)) {
|
||||
|
||||
Reference in New Issue
Block a user