Fixed HARQ reporting to agent and changed sf trigger to report the upcoming subframe
This commit is contained in:
@@ -67,6 +67,12 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//Agent-related headers
|
||||||
|
#include "ENB_APP/enb_agent_extern.h"
|
||||||
|
#include "ENB_APP/enb_agent_mac.h"
|
||||||
|
#include "LAYER2/MAC/enb_agent_mac_proto.h"
|
||||||
|
|
||||||
//#define DIAG_PHY
|
//#define DIAG_PHY
|
||||||
|
|
||||||
#define NS_PER_SLOT 500000
|
#define NS_PER_SLOT 500000
|
||||||
@@ -1411,6 +1417,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
if (abstraction_flag == 0) {
|
if (abstraction_flag == 0) {
|
||||||
|
|
||||||
start_meas(&phy_vars_eNB->dlsch_encoding_stats);
|
start_meas(&phy_vars_eNB->dlsch_encoding_stats);
|
||||||
@@ -1603,6 +1610,13 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
|
|||||||
phy_vars_eNB->dlsch_eNB_ra->active = 0;
|
phy_vars_eNB->dlsch_eNB_ra->active = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef DISABLE_SF_TRIGGER
|
||||||
|
//Send subframe trigger to the controller
|
||||||
|
if (mac_agent_registered[phy_vars_eNB->Mod_id]) {
|
||||||
|
agent_mac_xface[phy_vars_eNB->Mod_id]->enb_agent_send_sf_trigger(phy_vars_eNB->Mod_id);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Now scan UE specific DLSCH
|
// Now scan UE specific DLSCH
|
||||||
for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++)
|
for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -180,6 +180,13 @@ pthread_t new_thread(void *(*f)(void *), void *b) {
|
|||||||
fprintf(stderr, "pthread_attr_init err\n");
|
fprintf(stderr, "pthread_attr_init err\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct sched_param sched_param_recv_thread;
|
||||||
|
|
||||||
|
sched_param_recv_thread.sched_priority = sched_get_priority_max(SCHED_FIFO) - 1;
|
||||||
|
pthread_attr_setschedparam(&att, &sched_param_recv_thread);
|
||||||
|
pthread_attr_setschedpolicy(&att, SCHED_FIFO);
|
||||||
|
|
||||||
if (pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED)) {
|
if (pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED)) {
|
||||||
fprintf(stderr, "pthread_attr_setdetachstate err\n");
|
fprintf(stderr, "pthread_attr_setdetachstate err\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|||||||
@@ -514,6 +514,32 @@ uint16_t get_sfn_sf (mid_t mod_id) {
|
|||||||
return sfn_sf;
|
return sfn_sf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t get_future_sfn_sf (mid_t mod_id, int ahead_of_time) {
|
||||||
|
|
||||||
|
frame_t frame;
|
||||||
|
sub_frame_t subframe;
|
||||||
|
uint16_t sfn_sf, frame_mask, sf_mask;
|
||||||
|
|
||||||
|
frame = (frame_t) get_current_system_frame_num(mod_id);
|
||||||
|
subframe = (sub_frame_t) get_current_subframe(mod_id);
|
||||||
|
|
||||||
|
subframe = ((subframe + ahead_of_time) % 10);
|
||||||
|
|
||||||
|
int full_frames_ahead = ((ahead_of_time / 10) % 10);
|
||||||
|
|
||||||
|
frame = frame + full_frames_ahead;
|
||||||
|
|
||||||
|
if (subframe < get_current_subframe(mod_id)) {
|
||||||
|
frame++;
|
||||||
|
}
|
||||||
|
|
||||||
|
frame_mask = ((1<<12) - 1);
|
||||||
|
sf_mask = ((1<<4) - 1);
|
||||||
|
sfn_sf = (subframe & sf_mask) | ((frame & frame_mask) << 4);
|
||||||
|
|
||||||
|
return sfn_sf;
|
||||||
|
}
|
||||||
|
|
||||||
int get_num_ues (mid_t mod_id){
|
int get_num_ues (mid_t mod_id){
|
||||||
|
|
||||||
return ((UE_list_t *)enb_ue[mod_id])->num_UEs;
|
return ((UE_list_t *)enb_ue[mod_id])->num_UEs;
|
||||||
|
|||||||
@@ -145,6 +145,8 @@ unsigned int get_current_subframe(mid_t mod_id);
|
|||||||
Bits 0-3 subframe, rest for frame. Required by progRAN protocol*/
|
Bits 0-3 subframe, rest for frame. Required by progRAN protocol*/
|
||||||
uint16_t get_sfn_sf (mid_t mod_id);
|
uint16_t get_sfn_sf (mid_t mod_id);
|
||||||
|
|
||||||
|
uint16_t get_future_sfn_sf(mid_t mod_id, int ahead_of_time);
|
||||||
|
|
||||||
int get_num_ues(mid_t mod_id);
|
int get_num_ues(mid_t mod_id);
|
||||||
|
|
||||||
int get_ue_crnti (mid_t mod_id, mid_t ue_id);
|
int get_ue_crnti (mid_t mod_id, mid_t ue_id);
|
||||||
|
|||||||
@@ -947,9 +947,27 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Progran
|
|||||||
}
|
}
|
||||||
protocol__prp_sf_trigger__init(sf_trigger_msg);
|
protocol__prp_sf_trigger__init(sf_trigger_msg);
|
||||||
|
|
||||||
|
frame_t frame;
|
||||||
|
sub_frame_t subframe;
|
||||||
|
|
||||||
|
int ahead_of_time = 1;
|
||||||
|
|
||||||
|
frame = (frame_t) get_current_system_frame_num(mod_id);
|
||||||
|
subframe = (sub_frame_t) get_current_subframe(mod_id);
|
||||||
|
|
||||||
|
subframe = ((subframe + ahead_of_time) % 10);
|
||||||
|
|
||||||
|
int full_frames_ahead = ((ahead_of_time / 10) % 10);
|
||||||
|
|
||||||
|
frame = frame + full_frames_ahead;
|
||||||
|
|
||||||
|
if (subframe < get_current_subframe(mod_id)) {
|
||||||
|
frame++;
|
||||||
|
}
|
||||||
|
|
||||||
sf_trigger_msg->header = header;
|
sf_trigger_msg->header = header;
|
||||||
sf_trigger_msg->has_sfn_sf = 1;
|
sf_trigger_msg->has_sfn_sf = 1;
|
||||||
sf_trigger_msg->sfn_sf = get_sfn_sf(mod_id);
|
sf_trigger_msg->sfn_sf = get_future_sfn_sf(mod_id, 1);
|
||||||
|
|
||||||
/*TODO: Fill in the number of dl HARQ related info, based on the number of currently
|
/*TODO: Fill in the number of dl HARQ related info, based on the number of currently
|
||||||
*transmitting UEs
|
*transmitting UEs
|
||||||
@@ -973,7 +991,7 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Progran
|
|||||||
/*TODO: fill in the right id of this round's HARQ process for this UE*/
|
/*TODO: fill in the right id of this round's HARQ process for this UE*/
|
||||||
int harq_id;
|
int harq_id;
|
||||||
int harq_status;
|
int harq_status;
|
||||||
get_harq(mod_id,UE_PCCID(mod_id,i),i,get_current_frame(mod_id),get_current_subframe(mod_id),&harq_id, &harq_status);
|
get_harq(mod_id, UE_PCCID(mod_id,i), i, frame, subframe, &harq_id, &harq_status);
|
||||||
dl_info[i]->harq_process_id = harq_id;
|
dl_info[i]->harq_process_id = harq_id;
|
||||||
dl_info[i]->has_harq_process_id = 1;
|
dl_info[i]->has_harq_process_id = 1;
|
||||||
/*TODO: fill in the status of the HARQ process (2 TBs)*/
|
/*TODO: fill in the status of the HARQ process (2 TBs)*/
|
||||||
@@ -1369,8 +1387,8 @@ int enb_agent_register_mac_xface(mid_t mod_id, AGENT_MAC_xface *xface) {
|
|||||||
xface->enb_agent_send_sr_info = enb_agent_send_sr_info;
|
xface->enb_agent_send_sr_info = enb_agent_send_sr_info;
|
||||||
xface->enb_agent_send_sf_trigger = enb_agent_send_sf_trigger;
|
xface->enb_agent_send_sf_trigger = enb_agent_send_sf_trigger;
|
||||||
xface->enb_agent_send_update_mac_stats = enb_agent_send_update_mac_stats;
|
xface->enb_agent_send_update_mac_stats = enb_agent_send_update_mac_stats;
|
||||||
xface->enb_agent_schedule_ue_spec = schedule_ue_spec_default;
|
//xface->enb_agent_schedule_ue_spec = schedule_ue_spec_default;
|
||||||
//xface->enb_agent_schedule_ue_spec = schedule_ue_spec_remote;
|
xface->enb_agent_schedule_ue_spec = schedule_ue_spec_remote;
|
||||||
xface->enb_agent_get_pending_dl_mac_config = enb_agent_get_pending_dl_mac_config;
|
xface->enb_agent_get_pending_dl_mac_config = enb_agent_get_pending_dl_mac_config;
|
||||||
xface->enb_agent_notify_ue_state_change = enb_agent_ue_state_change;
|
xface->enb_agent_notify_ue_state_change = enb_agent_ue_state_change;
|
||||||
|
|
||||||
|
|||||||
@@ -216,12 +216,12 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef DISABLE_SF_TRIGGER
|
/* #ifndef DISABLE_SF_TRIGGER */
|
||||||
//Send subframe trigger to the controller
|
/* //Send subframe trigger to the controller */
|
||||||
if (mac_agent_registered[module_idP]) {
|
/* if (mac_agent_registered[module_idP]) { */
|
||||||
agent_mac_xface[module_idP]->enb_agent_send_sf_trigger(module_idP);
|
/* agent_mac_xface[module_idP]->enb_agent_send_sf_trigger(module_idP); */
|
||||||
}
|
/* } */
|
||||||
#endif
|
/* #endif */
|
||||||
|
|
||||||
//if (subframeP%5 == 0)
|
//if (subframeP%5 == 0)
|
||||||
//#ifdef EXMIMO
|
//#ifdef EXMIMO
|
||||||
@@ -971,6 +971,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
|
for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
|
||||||
allocate_CCEs(module_idP,CC_id,subframeP,0);
|
allocate_CCEs(module_idP,CC_id,subframeP,0);
|
||||||
|
|
||||||
|
|
||||||
#ifndef DISABLE_CONT_STATS
|
#ifndef DISABLE_CONT_STATS
|
||||||
//Send subframe trigger to the controller
|
//Send subframe trigger to the controller
|
||||||
if (mac_agent_registered[module_idP]) {
|
if (mac_agent_registered[module_idP]) {
|
||||||
@@ -978,6 +979,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
|
LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
|
||||||
|
|
||||||
stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
|
stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
|
||||||
|
|||||||
Reference in New Issue
Block a user