diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index cad508c7c225d7bc90d5b6a1316b5a89096d1cc4..755bb5c86885b3a9458e3441b1846d0ff808d0d5 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -92,6 +92,9 @@ extern uint16_t hundred_times_log10_NPRB[100]; unsigned int max_peak_val; int max_sync_pos; +int harq_pid_updated[NUMBER_OF_UE_MAX][8] = {{0}}; +int harq_pid_round[NUMBER_OF_UE_MAX][8] = {{0}}; + //DCI_ALLOC_t dci_alloc[8]; #ifdef EMOS @@ -1444,15 +1447,6 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, eNB->dlsch_ra->active = 0; } -#if defined(FLEXRAN_AGENT_SB_IF) -#ifndef DISABLE_SF_TRIGGER - //Send subframe trigger to the controller - if (mac_agent_registered[eNB->Mod_id]) { - agent_mac_xface[eNB->Mod_id]->flexran_agent_send_sf_trigger(eNB->Mod_id); - } -#endif -#endif - // Now scan UE specific DLSCH for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) { @@ -1553,7 +1547,6 @@ void process_HARQ_feedback(uint8_t UE_id, int subframe = proc->subframe_rx; int harq_pid = subframe2harq_pid( fp,frame,subframe); - if (fp->frame_type == FDD) { //FDD subframe_m4 = (subframe<4) ? subframe+6 : subframe-4; @@ -1681,6 +1674,7 @@ void process_HARQ_feedback(uint8_t UE_id, mp = m; dl_harq_pid[m] = dlsch->harq_ids[dl_subframe]; + harq_pid_updated[UE_id][dl_harq_pid[m]] = 1; if ((pucch_sel != 2)&&(pusch_flag == 0)) { // multiplexing if ((SR_payload == 1)&&(all_ACKed == 1)) @@ -1768,7 +1762,7 @@ void process_HARQ_feedback(uint8_t UE_id, eNB->dlsch[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; */ } - + // Do fine-grain rate-adaptation for DLSCH if (ue_stats->dlsch_NAK_round0 > dlsch->error_threshold) { if (ue_stats->dlsch_mcs_offset == 1) @@ -1781,7 +1775,7 @@ void process_HARQ_feedback(uint8_t UE_id, LOG_D(PHY,"[process_HARQ_feedback] Frame %d Setting round to %d for pid %d (subframe %d)\n",frame, dlsch_harq_proc->round,dl_harq_pid[m],subframe); #endif - + harq_pid_round[UE_id][dl_harq_pid[m]] = dlsch_harq_proc->round; // Clear NAK stats and adjust mcs offset // after measurement window timer expires if (ue_stats->dlsch_sliding_cnt == dlsch->ra_window_size) { @@ -1800,8 +1794,6 @@ void process_HARQ_feedback(uint8_t UE_id, ue_stats->dlsch_NAK_round0 = 0; ue_stats->dlsch_sliding_cnt = 0; } - - } } } @@ -3422,14 +3414,21 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const } #endif - - //} #ifdef EMOS phy_procedures_emos_eNB_RX(subframe,eNB); #endif +#if defined(FLEXRAN_AGENT_SB_IF) +#ifndef DISABLE_SF_TRIGGER + //Send subframe trigger to the controller + if (mac_agent_registered[eNB->Mod_id]) { + agent_mac_xface[eNB->Mod_id]->flexran_agent_send_sf_trigger(eNB->Mod_id); + } +#endif +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC+offset, 0 ); stop_meas(&eNB->phy_proc_rx); diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c index c8c937f3b0d792e702b8501205ff4a4221329267..364a42d35c5248110bf68ee0d9b26c80660a515f 100644 --- a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c @@ -923,9 +923,13 @@ int flexran_agent_mac_destroy_sr_info(Protocol__FlexranMessage *msg) { int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { Protocol__FlexHeader *header; - int i,j; + int i, j, UE_id; + + int available_harq[NUMBER_OF_UE_MAX]; + const int xid = *((int *)params); + Protocol__FlexSfTrigger *sf_trigger_msg; sf_trigger_msg = malloc(sizeof(Protocol__FlexSfTrigger)); if (sf_trigger_msg == NULL) { @@ -939,7 +943,11 @@ int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Fle frame_t frame; sub_frame_t subframe; - int ahead_of_time = 1; + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + available_harq[i] = -1; + } + + int ahead_of_time = 0; frame = (frame_t) flexran_get_current_system_frame_num(mod_id); subframe = (sub_frame_t) flexran_get_current_subframe(mod_id); @@ -957,10 +965,24 @@ int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Fle sf_trigger_msg->has_sfn_sf = 1; sf_trigger_msg->sfn_sf = flexran_get_future_sfn_sf(mod_id, 1); + sf_trigger_msg->n_dl_info = 0; + + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + for (j = 0; j < 8; j++) { + if (harq_pid_updated[i][j] == 1) { + available_harq[i] = j; + sf_trigger_msg->n_dl_info++; + break; + } + } + } + + // LOG_I(FLEXRAN_AGENT, "Sending subframe trigger for frame %d and subframe %d\n", flexran_get_current_frame(mod_id), (flexran_get_current_subframe(mod_id) + 1) % 10); + /*TODO: Fill in the number of dl HARQ related info, based on the number of currently *transmitting UEs */ - sf_trigger_msg->n_dl_info = flexran_get_num_ues(mod_id); + // sf_trigger_msg->n_dl_info = flexran_get_num_ues(mod_id); Protocol__FlexDlInfo **dl_info = NULL; @@ -968,8 +990,14 @@ int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Fle dl_info = malloc(sizeof(Protocol__FlexDlInfo *) * sf_trigger_msg->n_dl_info); if(dl_info == NULL) goto error; + i = -1; //Fill the status of the current HARQ process for each UE - for(i = 0; i < sf_trigger_msg->n_dl_info; i++) { + for(UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (available_harq[UE_id] < 0) { + continue; + } else { + i++; + } dl_info[i] = malloc(sizeof(Protocol__FlexDlInfo)); if(dl_info[i] == NULL) goto error; @@ -977,22 +1005,24 @@ int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Fle dl_info[i]->rnti = flexran_get_ue_crnti(mod_id, i); dl_info[i]->has_rnti = 1; /*Fill in the right id of this round's HARQ process for this UE*/ - uint8_t harq_id; - uint8_t harq_status; - flexran_get_harq(mod_id, UE_PCCID(mod_id,i), i, frame, subframe, &harq_id, &harq_status); - dl_info[i]->harq_process_id = harq_id; + // uint8_t harq_id; + //uint8_t harq_status; + // flexran_get_harq(mod_id, UE_PCCID(mod_id,i), i, frame, subframe, &harq_id, &harq_status); + + + dl_info[i]->harq_process_id = available_harq[UE_id]; + harq_pid_updated[UE_id][available_harq[UE_id]] = 0; dl_info[i]->has_harq_process_id = 1; /* Fill in the status of the HARQ process (2 TBs)*/ dl_info[i]->n_harq_status = 2; dl_info[i]->harq_status = malloc(sizeof(uint32_t) * dl_info[i]->n_harq_status); for (j = 0; j < dl_info[i]->n_harq_status; j++) { - dl_info[i]->harq_status[j] = harq_status; + dl_info[i]->harq_status[j] = harq_pid_round[UE_id][available_harq[UE_id]]; // TODO: This should be different per TB - if(harq_status == 0) { - dl_info[i]->harq_status[j] = PROTOCOL__FLEX_HARQ_STATUS__FLHS_ACK; - } else { - dl_info[i]->harq_status[j] = PROTOCOL__FLEX_HARQ_STATUS__FLHS_NACK; - } + } + // LOG_I(FLEXRAN_AGENT, "Sending subframe trigger for frame %d and subframe %d and harq %d (round %d)\n", flexran_get_current_frame(mod_id), (flexran_get_current_subframe(mod_id) + 1) % 10, dl_info[i]->harq_process_id, dl_info[i]->harq_status[0]); + if(dl_info[i]->harq_status[0] > 0) { + // LOG_I(FLEXRAN_AGENT, "[Frame %d][Subframe %d]Need to make a retransmission for harq %d (round %d)\n", flexran_get_current_frame(mod_id), flexran_get_current_subframe(mod_id), dl_info[i]->harq_process_id, dl_info[i]->harq_status[0]); } /*Fill in the serving cell index for this UE */ dl_info[i]->serv_cell_index = UE_PCCID(mod_id,i); @@ -1237,12 +1267,18 @@ int flexran_agent_mac_handle_dl_mac_config(mid_t mod_id, const void *params, Pro } void flexran_agent_init_mac_agent(mid_t mod_id) { + int i, j; lfds700_misc_library_init_valid_on_current_logical_core(); lfds700_misc_prng_init(&ps[mod_id]); int num_elements = RINGBUFFER_SIZE + 1; //Allow RINGBUFFER_SIZE messages to be stored in the ringbuffer at any time dl_mac_config_array[mod_id] = malloc( sizeof(struct lfds700_ringbuffer_element) * num_elements); lfds700_ringbuffer_init_valid_on_current_logical_core( &ringbuffer_state[mod_id], dl_mac_config_array[mod_id], num_elements, &ps[mod_id], NULL ); + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + for (j = 0; j < 8; j++) { + harq_pid_updated[i][j] = 0; + } + } } /*********************************************** diff --git a/openair2/ENB_APP/flexran_agent_extern.h b/openair2/ENB_APP/flexran_agent_extern.h index 3a03239e6fe5c0845c74e2ac724fe875eaa78404..4a04d5d3a670b290ab8009e6a61adb79a168b27a 100644 --- a/openair2/ENB_APP/flexran_agent_extern.h +++ b/openair2/ENB_APP/flexran_agent_extern.h @@ -45,4 +45,8 @@ extern AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]; /* Flag indicating whether the VSFs for the MAC control module have been registered */ extern unsigned int mac_agent_registered[NUM_MAX_ENB]; +/* Requried to know which UEs had a harq updated over some subframe */ +extern int harq_pid_updated[NUMBER_OF_UE_MAX][8]; +extern int harq_pid_round[NUMBER_OF_UE_MAX][8]; + #endif diff --git a/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c b/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c index 4af45ffea3d111865bc7cef6b521baa9ddd22502..433d8d25dd4ceda6457f84e85ad09ff1329f397e 100644 --- a/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c +++ b/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c @@ -53,6 +53,7 @@ #include "header.pb-c.h" #include "flexran.pb-c.h" +#include "flexran_agent_extern.h" #include "SIMULATION/TOOLS/defs.h" // for taus @@ -137,6 +138,9 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id, round = dl_dci->rv[0]; harq_pid = dl_dci->harq_process; + //LOG_I(FLEXRAN_AGENT, "[Frame %d][Subframe %d] Scheduling harq %d\n", frame, subframe, harq_pid); + // LOG_I(FLEXRAN_AGENT, "[Frame %d][Subframe %d]Now scheduling harq_pid %d (round %d)\n", frame, subframe, harq_pid, round); + // If this is a new transmission if (round == 0) { // First we have to deal with the creation of the PDU based on the message instructions @@ -258,8 +262,12 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id, // If there is nothing to schedule, just leave if ((sdu_length_total) <= 0) { + harq_pid_updated[UE_id][harq_pid] = 1; + harq_pid_round[UE_id][harq_pid] = 0; continue; } + + // LOG_I(FLEXRAN_AGENT, "[Frame %d][Subframe %d] TBS is %d and bytes are %d\n", frame, subframe, TBS, sdu_length_total); offset = generate_dlsch_header((unsigned char*)UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], num_sdus, //num_sdus @@ -338,7 +346,6 @@ void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id, } } else { // No need to create anything apart of DCI in case of retransmission - /*TODO: Must add these */ // eNB_UE_stats->dlsch_trials[round]++; //UE_list->eNB_UE_stats[CC_id][UE_id].num_retransmission+=1;