From b64cb5b2501c8ee09c8417d66a935ca8b16722ca Mon Sep 17 00:00:00 2001 From: Xenofon Foukas <x.foukas@sms.ed.ac.uk> Date: Wed, 10 Feb 2016 18:07:35 +0000 Subject: [PATCH] Added rank indication and timing advance indication support --- openair2/ENB_APP/enb_agent_common.c | 25 ++++ openair2/ENB_APP/enb_agent_common.h | 5 + openair2/ENB_APP/enb_agent_mac.c | 194 ++++++++++++++++------------ 3 files changed, 140 insertions(+), 84 deletions(-) diff --git a/openair2/ENB_APP/enb_agent_common.c b/openair2/ENB_APP/enb_agent_common.c index 5ddcb39868..eb08107dff 100644 --- a/openair2/ENB_APP/enb_agent_common.c +++ b/openair2/ENB_APP/enb_agent_common.c @@ -400,6 +400,31 @@ int get_tx_queue_size(mid_t mod_id, mid_t ue_id, logical_chan_id_t channel_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); return rlc_status.bytes_in_buffer; } + +int get_MAC_CE_bitmap_TA(mid_t mod_id, mid_t ue_id) +{ + if((((UE_list_t *)enb_ue[mod_id])->UE_sched_ctrl[ue_id].ta_update) > 0) + return 1; + else + return 0; +} + +int get_active_CC(mid_t mod_id, mid_t ue_id) +{ + return ((UE_list_t *)enb_ue[mod_id])->numactiveCCs[ue_id]; +} + +int get_current_RI(mid_t mod_id, mid_t ue_id, int CC_id) +{ + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + + int pCCid = UE_PCCID(mod_id,ue_id); + rnti_t rnti = get_ue_crnti(mod_id,ue_id); + + eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id,CC_id,rnti); + return eNB_UE_stats[CC_id].rank; +} + /* * timer primitives */ diff --git a/openair2/ENB_APP/enb_agent_common.h b/openair2/ENB_APP/enb_agent_common.h index 784c86bf6a..37d3829354 100644 --- a/openair2/ENB_APP/enb_agent_common.h +++ b/openair2/ENB_APP/enb_agent_common.h @@ -150,6 +150,11 @@ int get_ue_wcqi (mid_t mod_id, mid_t ue_id); int get_tx_queue_size(mid_t mod_id, mid_t ue_id, logical_chan_id_t channel_id); +int get_MAC_CE_bitmap_TA(mid_t mod_id, mid_t ue_id); + +int get_active_CC(mid_t mod_id, mid_t ue_id); + +int get_current_RI(mid_t mod_id, mid_t ue_id, int CC_id); diff --git a/openair2/ENB_APP/enb_agent_mac.c b/openair2/ENB_APP/enb_agent_mac.c index 4a62c9dcbb..cb5aac1a95 100644 --- a/openair2/ENB_APP/enb_agent_mac.c +++ b/openair2/ENB_APP/enb_agent_mac.c @@ -52,25 +52,25 @@ unsigned int mac_agent_registered[NUM_MAX_ENB]; AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]; int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__ProgranMessage **msg){ - + // TODO: Must deal with sanitization of input // TODO: Must check if RNTIs and cell ids of the request actually exist // TODO: Must resolve conflicts among stats requests - + int i; void *buffer; int size; err_code_t err_code; xid_t xid; uint32_t usec_interval, sec_interval; - - //TODO: We do not deal with multiple CCs at the moment and eNB id is 0 + + //TODO: We do not deal with multiple CCs at the moment and eNB id is 0 int cc_id = 0; int enb_id = mod_id; //eNB_MAC_INST *eNB = &eNB_mac_inst[enb_id]; //UE_list_t *eNB_UE_list= &eNB->UE_list; - + report_config_t report_config; uint32_t ue_flags = 0; @@ -96,7 +96,7 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr ue_flags = comp_req->ue_report_flags; c_flags = comp_req->cell_report_flags; //Create a list of all eNB RNTIs and cells - + //Set the number of UEs and create list with their RNTIs stats configs report_config.nr_ue = get_num_ues(mod_id); //eNB_UE_list->num_UEs report_config.ue_report_type = (ue_report_type_t *) malloc(sizeof(ue_report_type_t) * report_config.nr_ue); @@ -129,7 +129,7 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr stats_request_config_t request_config; request_config.report_type = PROTOCOL__PRP_STATS_TYPE__PRST_COMPLETE_STATS; request_config.report_frequency = PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_ONCE; - request_config.period = 0; + request_config.period = 0; request_config.config = &report_config; enb_agent_mac_stats_request(enb_id, xid, &request_config, &timer_msg); /* Create a timer */ @@ -137,7 +137,7 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr enb_agent_timer_args_t *timer_args; timer_args = malloc(sizeof(enb_agent_timer_args_t)); memset (timer_args, 0, sizeof(enb_agent_timer_args_t)); - timer_args->mod_id = enb_id; + timer_args->mod_id = enb_id; timer_args->msg = timer_msg; /*Convert subframes to usec time*/ usec_interval = 1000*comp_req->sf; @@ -155,7 +155,7 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr stats_request_config_t request_config; request_config.report_type = PROTOCOL__PRP_STATS_TYPE__PRST_COMPLETE_STATS; request_config.report_frequency = PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_ONCE; - request_config.period = 0; + request_config.period = 0; request_config.config = &report_config; enb_agent_enable_cont_mac_stats_update(enb_id, xid, &request_config); } @@ -219,14 +219,14 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr int enb_agent_mac_stats_request(mid_t mod_id, xid_t xid, - const stats_request_config_t *report_config, + const stats_request_config_t *report_config, Protocol__ProgranMessage **msg) { Protocol__PrpHeader *header; int i; - + if (prp_create_header(xid, PROTOCOL__PRP_TYPE__PRPT_STATS_REQUEST, &header) != 0) goto error; - + Protocol__PrpStatsRequest *stats_request_msg; stats_request_msg = malloc(sizeof(Protocol__PrpStatsRequest)); if(stats_request_msg == NULL) @@ -234,10 +234,10 @@ int enb_agent_mac_stats_request(mid_t mod_id, protocol__prp_stats_request__init(stats_request_msg); stats_request_msg->header = header; - + stats_request_msg->type = report_config->report_type; stats_request_msg->has_type = 1; - + switch (report_config->report_type) { case PROTOCOL__PRP_STATS_TYPE__PRST_COMPLETE_STATS: stats_request_msg->body_case = PROTOCOL__PRP_STATS_REQUEST__BODY_COMPLETE_STATS_REQUEST; @@ -311,7 +311,7 @@ int enb_agent_mac_stats_request(mid_t mod_id, (*msg)->msg_dir = PROTOCOL__PROGRAN_DIRECTION__INITIATING_MESSAGE; (*msg)->stats_request_msg = stats_request_msg; return 0; - + error: // TODO: Need to make proper error handling if (header != NULL) @@ -337,7 +337,7 @@ int enb_agent_mac_destroy_stats_request(Protocol__ProgranMessage *msg) { free(msg->stats_request_msg); free(msg); return 0; - + error: //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); return -1; @@ -345,7 +345,7 @@ int enb_agent_mac_destroy_stats_request(Protocol__ProgranMessage *msg) { int enb_agent_mac_stats_reply(mid_t mod_id, xid_t xid, - const report_config_t *report_config, + const report_config_t *report_config, Protocol__ProgranMessage **msg) { Protocol__PrpHeader *header; int i, j, k; @@ -353,8 +353,8 @@ int enb_agent_mac_stats_reply(mid_t mod_id, int enb_id = mod_id; //eNB_MAC_INST *eNB = &eNB_mac_inst[enb_id]; //UE_list_t *eNB_UE_list= &eNB->UE_list; - - + + if (prp_create_header(xid, PROTOCOL__PRP_TYPE__PRPT_STATS_REPLY, &header) != 0) goto error; @@ -371,7 +371,7 @@ int enb_agent_mac_stats_reply(mid_t mod_id, Protocol__PrpUeStatsReport **ue_report; Protocol__PrpCellStatsReport **cell_report; - + /* Allocate memory for list of UE reports */ if (report_config->nr_ue > 0) { ue_report = malloc(sizeof(Protocol__PrpUeStatsReport *) * report_config->nr_ue); @@ -402,7 +402,7 @@ int enb_agent_mac_stats_reply(mid_t mod_id, } ue_report[i]->bsr = elem; } - + /* Check flag for creation of PRH report */ if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__PRP_UE_STATS_TYPE__PRUST_PRH) { // TODO: Fill in the actual power headroom value for the RNTI @@ -418,7 +418,7 @@ int enb_agent_mac_stats_reply(mid_t mod_id, rlc_reports = malloc(sizeof(Protocol__PrpRlcBsr *) * ue_report[i]->n_rlc_report); if (rlc_reports == NULL) goto error; - + // Fill the buffer status report for each logical channel of the UE // NN: see LAYER2/openair2_proc.c for rlc status for (j = 0; j < ue_report[i]->n_rlc_report; j++) { @@ -453,13 +453,13 @@ int enb_agent_mac_stats_reply(mid_t mod_id, /* Check flag for creation of MAC CE buffer status report */ if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__PRP_UE_STATS_TYPE__PRUST_MAC_CE_BS) { // TODO: Fill in the actual MAC CE buffer status report - ue_report[i]->pending_mac_ces = -1; /* Use as bitmap. Set one or more of the + ue_report[i]->pending_mac_ces = (get_MAC_CE_bitmap_TA(enb_id,i) | (0 << 1) | (0 << 2) | (0 << 3)) & 15; /* Use as bitmap. Set one or more of the; /* Use as bitmap. Set one or more of the PROTOCOL__PRP_CE_TYPE__PRPCET_ values found in stats_common.pb-c.h. See prp_ce_type in progRAN specification */ ue_report[i]->has_pending_mac_ces = 1; } - + /* Check flag for creation of DL CQI report */ if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__PRP_UE_STATS_TYPE__PRUST_DL_CQI) { // TODO: Fill in the actual DL CQI report for the UE based on its configuration @@ -472,7 +472,7 @@ int enb_agent_mac_stats_reply(mid_t mod_id, dl_report->sfn_sn = get_sfn_sf(enb_id); dl_report->has_sfn_sn = 1; //TODO:Set the number of DL CQI reports for this UE. One for each CC - dl_report->n_csi_report = 1; + dl_report->n_csi_report = get_active_CC(enb_id,i); //TODO:Create the actual CSI reports. Protocol__PrpDlCsi **csi_reports; csi_reports = malloc(sizeof(Protocol__PrpDlCsi *)*dl_report->n_csi_report); @@ -484,36 +484,62 @@ int enb_agent_mac_stats_reply(mid_t mod_id, goto error; protocol__prp_dl_csi__init(csi_reports[j]); //TODO: the servCellIndex for this report - csi_reports[j]->serv_cell_index = 0; + csi_reports[j]->serv_cell_index = j; csi_reports[j]->has_serv_cell_index = 1; //TODO: the rank indicator value for this cc - csi_reports[j]->ri = 1; + csi_reports[j]->ri = get_current_RI(enb_id,i,j); csi_reports[j]->has_ri = 1; //TODO: the type of CSI report based on the configuration of the UE //For this example we use type P10, which only needs a wideband value //The full set of types can be found in stats_common.pb-c.h and //in the progRAN specifications - csi_reports[j]->type = PROTOCOL__PRP_CSI_TYPE__PRCSIT_P10; - csi_reports[j]->has_type = 1; - csi_reports[j]->report_case = PROTOCOL__PRP_DL_CSI__REPORT_P10CSI; - Protocol__PrpCsiP10 *csi10; - csi10 = malloc(sizeof(Protocol__PrpCsiP10)); - if (csi10 == NULL) - goto error; - protocol__prp_csi_p10__init(csi10); - //TODO: set the wideband value - // NN: this is also depends on cc_id - csi10->wb_cqi = get_ue_wcqi (enb_id, i); //eNB_UE_list->eNB_UE_stats[UE_PCCID(enb_id,i)][i].dl_cqi; - csi10->has_wb_cqi = 1; - //Add the type of measurements to the csi report in the proper union type - csi_reports[j]->p10csi = csi10; - } + csi_reports[j]->type = PROTOCOL__PRP_CSI_TYPE__PRCSIT_P10; + csi_reports[j]->has_type = 1; + csi_reports[j]->report_case = PROTOCOL__PRP_DL_CSI__REPORT_P10CSI; + if(csi_reports[j]->report_case == PROTOCOL__PRP_DL_CSI__REPORT_P10CSI){ + Protocol__PrpCsiP10 *csi10; + csi10 = malloc(sizeof(Protocol__PrpCsiP10)); + if (csi10 == NULL) + goto error; + protocol__prp_csi_p10__init(csi10); + //TODO: set the wideband value + // NN: this is also depends on cc_id + csi10->wb_cqi = get_ue_wcqi (enb_id, i); //eNB_UE_list->eNB_UE_stats[UE_PCCID(enb_id,i)][i].dl_cqi; + csi10->has_wb_cqi = 1; + //Add the type of measurements to the csi report in the proper union type + csi_reports[j]->p10csi = csi10; + } + else if(csi_reports[j]->report_case == PROTOCOL__PRP_DL_CSI__REPORT_P11CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__PRP_DL_CSI__REPORT_P20CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__PRP_DL_CSI__REPORT_P21CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__PRP_DL_CSI__REPORT_A12CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__PRP_DL_CSI__REPORT_A22CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__PRP_DL_CSI__REPORT_A20CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__PRP_DL_CSI__REPORT_A30CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__PRP_DL_CSI__REPORT_A31CSI){ + + } + } //Add the csi reports to the full DL CQI report dl_report->csi_report = csi_reports; //Add the DL CQI report to the stats report ue_report[i]->dl_cqi_report = dl_report; } - + /* Check flag for creation of paging buffer status report */ if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__PRP_UE_STATS_TYPE__PRUST_PBS) { //TODO: Fill in the actual paging buffer status report. For this field to be valid, the RNTI @@ -554,7 +580,7 @@ int enb_agent_mac_stats_reply(mid_t mod_id, //Add the paging report to the UE report ue_report[i]->pbr = paging_report; } - + /* Check flag for creation of UL CQI report */ if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__PRP_UE_STATS_TYPE__PRUST_UL_CQI) { //Fill in the full UL CQI report of the UE @@ -648,7 +674,7 @@ int enb_agent_mac_stats_reply(mid_t mod_id, /* Add list of all cell reports to the message */ stats_reply_msg->cell_report = cell_report; } - + *msg = malloc(sizeof(Protocol__ProgranMessage)); if(*msg == NULL) goto error; @@ -657,7 +683,7 @@ int enb_agent_mac_stats_reply(mid_t mod_id, (*msg)->msg_dir = PROTOCOL__PROGRAN_DIRECTION__SUCCESSFUL_OUTCOME; (*msg)->stats_reply_msg = stats_reply_msg; return 0; - + error: // TODO: Need to make proper error handling if (header != NULL) @@ -676,7 +702,7 @@ int enb_agent_mac_destroy_stats_reply(Protocol__ProgranMessage *msg) { goto error; free(msg->stats_reply_msg->header); int i, j, k; - + Protocol__PrpStatsReply *reply = msg->stats_reply_msg; Protocol__PrpDlCqiReport *dl_report; Protocol__PrpUlCqiReport *ul_report; @@ -737,8 +763,8 @@ int enb_agent_mac_destroy_stats_reply(Protocol__ProgranMessage *msg) { } free(dl_report->csi_report[j]->a31csi->sb_cqi); break; - } - + } + free(dl_report->csi_report[j]); } free(dl_report->csi_report); @@ -773,11 +799,11 @@ int enb_agent_mac_destroy_stats_reply(Protocol__ProgranMessage *msg) { free(reply->cell_report[i]); } free(reply->cell_report); - + free(reply); free(msg); return 0; - + error: //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); return -1; @@ -796,7 +822,7 @@ int enb_agent_mac_sr_info(mid_t mod_id, const void *params, Protocol__ProgranMes goto error; } protocol__prp_ul_sr_info__init(ul_sr_info_msg); - + ul_sr_info_msg->header = header; ul_sr_info_msg->has_sfn_sf = 1; ul_sr_info_msg->sfn_sf = get_sfn_sf(mod_id); @@ -811,7 +837,7 @@ int enb_agent_mac_sr_info(mid_t mod_id, const void *params, Protocol__ProgranMes for (i = 0; i < ul_sr_info_msg->n_rnti; i++) { ul_sr_info_msg->rnti[i] = 1; } - + *msg = malloc(sizeof(Protocol__ProgranMessage)); if(*msg == NULL) goto error; @@ -820,7 +846,7 @@ int enb_agent_mac_sr_info(mid_t mod_id, const void *params, Protocol__ProgranMes (*msg)->msg_dir = PROTOCOL__PROGRAN_DIRECTION__INITIATING_MESSAGE; (*msg)->ul_sr_info_msg = ul_sr_info_msg; return 0; - + error: // TODO: Need to make proper error handling if (header != NULL) @@ -863,7 +889,7 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Progran goto error; } protocol__prp_sf_trigger__init(sf_trigger_msg); - + sf_trigger_msg->header = header; sf_trigger_msg->has_sfn_sf = 1; sf_trigger_msg->sfn_sf = get_sfn_sf(mod_id); @@ -872,7 +898,7 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Progran *transmitting UEs */ sf_trigger_msg->n_dl_info = get_num_ues(mod_id); - + Protocol__PrpDlInfo **dl_info = NULL; if (sf_trigger_msg->n_dl_info > 0) { @@ -901,14 +927,14 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Progran dl_info[i]->has_serv_cell_index = 1; } } - + sf_trigger_msg->dl_info = dl_info; /*TODO: Fill in the number of UL reception status related info, based on the number of currently *transmitting UEs */ sf_trigger_msg->n_ul_info = get_num_ues(mod_id); - + Protocol__PrpUlInfo **ul_info = NULL; if (sf_trigger_msg->n_ul_info > 0) { @@ -926,7 +952,7 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Progran /*TODO: fill in the Tx power control command for this UE (if available)*/ ul_info[i]->tpc = 1; ul_info[i]->has_tpc = 0; - /*TODO: fill in the amount of data in bytes in the MAC SDU received in this subframe for the + /*TODO: fill in the amount of data in bytes in the MAC SDU received in this subframe for the given logical channel*/ ul_info[i]->n_ul_reception = 11; ul_info[i]->ul_reception = malloc(sizeof(uint32_t) * ul_info[i]->n_ul_reception); @@ -941,7 +967,7 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Progran ul_info[i]->has_serv_cell_index = 1; } } - + sf_trigger_msg->ul_info = ul_info; *msg = malloc(sizeof(Protocol__ProgranMessage)); @@ -952,7 +978,7 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Progran (*msg)->msg_dir = PROTOCOL__PROGRAN_DIRECTION__INITIATING_MESSAGE; (*msg)->sf_trigger_msg = sf_trigger_msg; return 0; - + error: if (header != NULL) free(header); @@ -977,7 +1003,7 @@ int enb_agent_mac_destroy_sf_trigger(Protocol__ProgranMessage *msg) { int i; if(msg->msg_case != PROTOCOL__PROGRAN_MESSAGE__MSG_SF_TRIGGER_MSG) goto error; - + free(msg->sf_trigger_msg->header); for (i = 0; i < msg->sf_trigger_msg->n_dl_info; i++) { free(msg->sf_trigger_msg->dl_info[i]->harq_status); @@ -989,7 +1015,7 @@ int enb_agent_mac_destroy_sf_trigger(Protocol__ProgranMessage *msg) { free(msg->sf_trigger_msg->ul_info); free(msg->sf_trigger_msg); free(msg); - + return 0; error: @@ -1010,11 +1036,11 @@ int enb_agent_mac_create_empty_dl_config(mid_t mod_id, Protocol__ProgranMessage goto error; } protocol__prp_dl_mac_config__init(dl_mac_config_msg); - + dl_mac_config_msg->header = header; dl_mac_config_msg->has_sfn_sf = 1; dl_mac_config_msg->sfn_sf = get_sfn_sf(mod_id); - + *msg = malloc(sizeof(Protocol__ProgranMessage)); if(*msg == NULL) goto error; @@ -1056,7 +1082,7 @@ int enb_agent_mac_destroy_dl_config(Protocol__ProgranMessage *msg) { free(msg->dl_mac_config_msg->dl_ue_data[i]); } free(msg->dl_mac_config_msg->dl_ue_data); - + for (i = 0; i < msg->dl_mac_config_msg->n_dl_rar; i++) { dl_dci = msg->dl_mac_config_msg->dl_rar[i]->rar_dci; free(dl_dci->tbs_size); @@ -1132,7 +1158,7 @@ void enb_agent_send_sf_trigger(mid_t mod_id) { err_code_t err_code; int xid = 0; - + /*TODO: Must use a proper xid*/ err_code = enb_agent_mac_sf_trigger(mod_id, (void *) &xid, &msg); if (err_code < 0) { @@ -1161,20 +1187,20 @@ void enb_agent_send_update_mac_stats(mid_t mod_id) { int size; err_code_t err_code; int priority; - + mac_stats_updates_context_t stats_context = mac_stats_context[mod_id]; if (pthread_mutex_lock(mac_stats_context[mod_id].mutex)) { goto error; } - + /*Create a fresh report with the required flags*/ err_code = enb_agent_mac_handle_stats(mod_id, (void *) mac_stats_context[mod_id].stats_req, ¤t_report); if (err_code < 0) { goto error; } - /*TODO:Check if a previous reports exists and if yes, generate a report + /*TODO:Check if a previous reports exists and if yes, generate a report *that is the diff between the old and the new report, *respecting the thresholds. Otherwise send the new report*/ if (mac_stats_context[mod_id].prev_stats_reply != NULL) { @@ -1186,12 +1212,12 @@ void enb_agent_send_update_mac_stats(mid_t mod_id) { } /*Use the current report for future comparissons*/ mac_stats_context[mod_id].prev_stats_reply = current_report; - - + + if (pthread_mutex_unlock(mac_stats_context[mod_id].mutex)) { goto error; } - + if (msg != NULL){ data=enb_agent_pack_message(msg, &size); /*Send any stats updates using the MAC channel of the eNB*/ @@ -1219,7 +1245,7 @@ int enb_agent_register_mac_xface(mid_t mod_id, AGENT_MAC_xface *xface) { xface->enb_agent_send_update_mac_stats = enb_agent_send_update_mac_stats; xface->enb_agent_schedule_ue_spec = schedule_ue_spec_default; - + mac_agent_registered[mod_id] = 1; agent_mac_xface[mod_id] = xface; @@ -1227,7 +1253,7 @@ int enb_agent_register_mac_xface(mid_t mod_id, AGENT_MAC_xface *xface) { } int enb_agent_unregister_mac_xface(mid_t mod_id, AGENT_MAC_xface *xface) { - + //xface->agent_ctxt = NULL; xface->enb_agent_send_sr_info = NULL; xface->enb_agent_send_sf_trigger = NULL; @@ -1236,7 +1262,7 @@ int enb_agent_unregister_mac_xface(mid_t mod_id, AGENT_MAC_xface *xface) { mac_agent_registered[mod_id] = 0; agent_mac_xface[mod_id] = NULL; - + return 0; } @@ -1246,7 +1272,7 @@ int enb_agent_unregister_mac_xface(mid_t mod_id, AGENT_MAC_xface *xface) { ******************************************************/ err_code_t enb_agent_init_cont_mac_stats_update(mid_t mod_id) { - + /*Initialize the Mac stats update structure*/ /*Initially the continuous update is set to false*/ mac_stats_context[mod_id].cont_update = 0; @@ -1258,9 +1284,9 @@ err_code_t enb_agent_init_cont_mac_stats_update(mid_t mod_id) { goto error; if (pthread_mutex_init(mac_stats_context[mod_id].mutex, NULL)) goto error;; - + return 0; - + error: return -1; } @@ -1272,7 +1298,7 @@ err_code_t enb_agent_destroy_cont_mac_stats_update(mid_t mod_id) { enb_agent_destroy_progran_message(mac_stats_context[mod_id].stats_req); enb_agent_destroy_progran_message(mac_stats_context[mod_id].prev_stats_reply); free(mac_stats_context[mod_id].mutex); - + mac_agent_registered[mod_id] = NULL; return 1; } @@ -1290,15 +1316,15 @@ err_code_t enb_agent_enable_cont_mac_stats_update(mid_t mod_id, enb_agent_mac_stats_request(mod_id, xid, stats_req, &req_msg); mac_stats_context[mod_id].stats_req = req_msg; mac_stats_context[mod_id].prev_stats_reply = NULL; - + mac_stats_context[mod_id].cont_update = 1; mac_stats_context[mod_id].xid = xid; - + if (pthread_mutex_unlock(mac_stats_context[mod_id].mutex)) { goto error; } return 0; - + error: LOG_E(ENB_AGENT, "mac_stats_context for eNB %d is not initialized\n", mod_id); return -1; @@ -1325,5 +1351,5 @@ err_code_t enb_agent_disable_cont_mac_stats_update(mid_t mod_id) { error: LOG_E(ENB_AGENT, "mac_stats_context for eNB %d is not initialized\n", mod_id); return -1; - + } -- GitLab