[GITLAB] - A technical upgrade is planned on Thursday the 1st of July at noon on our GITLAB server.

Commit 92fda18a authored by Xenofon Foukas's avatar Xenofon Foukas

Added brief documentation of agent API functions

parent b6c7909d
......@@ -138,16 +138,12 @@ void *receive_thread(void *args) {
Protocol__FlexranMessage *msg;
while (1) {
//if (enb_agent_msg_recv(d->enb_id, ENB_AGENT_DEFAULT, &data, &size, &priority)) {
// err_code = PROTOCOL__FLEXRAN_ERR__MSG_DEQUEUING;
// goto error;
//}
while (enb_agent_msg_recv(d->enb_id, ENB_AGENT_DEFAULT, &data, &size, &priority) == 0) {
LOG_D(ENB_AGENT,"received message with size %d\n", size);
// Invoke the message handler
msg=enb_agent_handle_message(d->enb_id, data, size);
free(data);
......@@ -317,26 +313,6 @@ error:
}
/* int enb_agent_stop(mid_t mod_id){ */
/* int i=0; */
/* enb_agent_destroy_timers(); */
/* for ( i =0; i < enb_agent_info.nb_modules; i++) { */
/* destroy_link_manager(enb_agent[i].manager); */
/* destroy_message_queue(enb_agent[i].send_queue); */
/* destroy_message_queue(enb_agent[i].receive_queue); */
/* close_link(enb_agent[i].link); */
/* } */
/* } */
Protocol__FlexranMessage *enb_agent_timeout(void* args){
// enb_agent_timer_args_t *timer_args = calloc(1, sizeof(*timer_args));
......
......@@ -41,10 +41,15 @@
#include "enb_config.h" // for enb properties
#include "enb_agent_common.h"
int enb_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties);
/* Initiation and termination of the eNodeB agent */
int enb_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties);
int enb_agent_stop(mid_t mod_id);
/*
* enb agent task mainly wakes up the tx thread for periodic and oneshot messages to the controller
* and can interact with other itti tasks
*/
void *enb_agent_task(void *args);
#endif
......@@ -47,12 +47,16 @@ typedef struct {
link_manager_t *manager;
} enb_agent_async_channel_t;
/* Create a new channel for a given destination ip and destination port */
enb_agent_async_channel_t * enb_agent_async_channel_info(mid_t mod_id, char *dst_ip, uint16_t dst_port);
/* Send a message to the given channel */
int enb_agent_async_msg_send(void *data, int size, int priority, void *channel_info);
/* Receive a message from a given channel */
int enb_agent_async_msg_recv(void **data, int *size, int *priority, void *channel_info);
/* Release a channel */
void enb_agent_async_release(enb_agent_channel_t *channel);
......
This diff is collapsed.
......@@ -73,54 +73,75 @@ typedef int (*enb_agent_message_destruction_callback)(
* functions and generic handlers
**********************************/
/* Helper functions for message (de)serialization */
int enb_agent_serialize_message(Protocol__FlexranMessage *msg, void **buf, int *size);
int enb_agent_deserialize_message(void *data, int size, Protocol__FlexranMessage **msg);
/* Serialize message and then destroy the input flexran msg. Should be called when protocol
message is created dynamically */
void * enb_agent_pack_message(Protocol__FlexranMessage *msg,
uint32_t * size);
/* Calls destructor of the given message */
err_code_t enb_agent_destroy_flexran_message(Protocol__FlexranMessage *msg);
/* Function to create the header for any FlexRAN protocol message */
int flex_create_header(xid_t xid, Protocol__FlexType type, Protocol__FlexHeader **header);
/* Hello protocol message constructor and destructor */
int enb_agent_hello(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
int enb_agent_destroy_hello(Protocol__FlexranMessage *msg);
/* Echo request protocol message constructor and destructor */
int enb_agent_echo_request(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
int enb_agent_destroy_echo_request(Protocol__FlexranMessage *msg);
/* Echo reply protocol message constructor and destructor */
int enb_agent_echo_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
int enb_agent_destroy_echo_reply(Protocol__FlexranMessage *msg);
/* eNodeB configuration reply message constructor and destructor */
int enb_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
int enb_agent_destroy_enb_config_reply(Protocol__FlexranMessage *msg);
/* UE configuration reply message constructor and destructor */
int enb_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
int enb_agent_destroy_ue_config_reply(Protocol__FlexranMessage *msg);
/* Logical channel reply configuration message constructor and destructor */
int enb_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
int enb_agent_destroy_lc_config_reply(Protocol__FlexranMessage *msg);
/* eNodeB configuration request message constructor and destructor */
int enb_agent_enb_config_request(mid_t mod_id, const void* params, Protocol__FlexranMessage **msg);
int enb_agent_destroy_enb_config_request(Protocol__FlexranMessage *msg);
/* UE configuration request message constructor */
/* TODO: Need to define and implement destructor */
int enb_agent_destroy_ue_config_request(Protocol__FlexranMessage *msg);
/* Logical channel configuration request message constructor */
/* TODO: Need to define and implement destructor */
int enb_agent_destroy_lc_config_request(Protocol__FlexranMessage *msg);
/* UE state change message constructor and destructor */
int enb_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_change);
int enb_agent_destroy_ue_state_change(Protocol__FlexranMessage *msg);
/* Control delegation message constructor and destructor */
int enb_agent_control_delegation(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
int enb_agent_destroy_control_delegation(Protocol__FlexranMessage *msg);
/* Policy reconfiguration message constructor and destructor */
int enb_agent_reconfiguration(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
int enb_agent_destroy_agent_reconfiguration(Protocol__FlexranMessage *msg);
/* FlexRAN protocol message dispatcher function */
Protocol__FlexranMessage* enb_agent_handle_message (mid_t mod_id,
uint8_t *data,
uint32_t size);
/* Function to be used to send a message to a dispatcher once the appropriate event is triggered. */
Protocol__FlexranMessage *enb_agent_handle_timed_task(void *args);
......@@ -148,73 +169,113 @@ unsigned int get_current_subframe(mid_t mod_id);
Bits 0-3 subframe, rest for frame. Required by FlexRAN protocol*/
uint16_t get_sfn_sf (mid_t mod_id);
/* Return a future frame and subframe number that is ahead_of_time
subframes later in compact 16-bit format. Bits 0-3 subframe,
rest for frame */
uint16_t get_future_sfn_sf(mid_t mod_id, int ahead_of_time);
/* Return the number of attached UEs */
int get_num_ues(mid_t mod_id);
/* Get the rnti of a UE with id ue_id */
int get_ue_crnti (mid_t mod_id, mid_t ue_id);
/* Get the RLC buffer status report of a ue for a designated
logical channel id */
int get_ue_bsr (mid_t mod_id, mid_t ue_id, lcid_t lcid);
/* Get power headroom of UE with id ue_id */
int get_ue_phr (mid_t mod_id, mid_t ue_id);
/* Get the UE wideband CQI */
int 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 get_tx_queue_size(mid_t mod_id, mid_t ue_id, logical_chan_id_t channel_id);
/* Return timing advance MAC control element for a designated cell and UE */
int get_MAC_CE_bitmap_TA(mid_t mod_id, mid_t ue_id, int CC_id);
/* Get the number of active component carriers for a specific UE */
int get_active_CC(mid_t mod_id, mid_t ue_id);
/* Get the rank indicator for a designated cell and UE */
int get_current_RI(mid_t mod_id, mid_t ue_id, int CC_id);
/* See TS 36.213, section 10.1 */
int get_n1pucch_an(mid_t mod_id, int CC_id);
/* See TS 36.211, section 5.4 */
int get_nRB_CQI(mid_t mod_id, int CC_id);
/* See TS 36.211, section 5.4 */
int get_deltaPUCCH_Shift(mid_t mod_id, int CC_id);
/* See TS 36.211, section 5.7.1 */
int get_prach_ConfigIndex(mid_t mod_id, int CC_id);
/* See TS 36.211, section 5.7.1 */
int get_prach_FreqOffset(mid_t mod_id, int CC_id);
/* See TS 36.321 */
int get_maxHARQ_Msg3Tx(mid_t mod_id, int CC_id);
/* Get the length of the UL cyclic prefix */
int get_ul_cyclic_prefix_length(mid_t mod_id, int CC_id);
/* Get the length of the DL cyclic prefix */
int get_dl_cyclic_prefix_length(mid_t mod_id, int CC_id);
/* Get the physical cell id of a cell */
int get_cell_id(mid_t mod_id, int CC_id);
/* See TS 36.211, section 5.5.3.2 */
int get_srs_BandwidthConfig(mid_t mod_id, int CC_id);
/* See TS 36.211, table 5.5.3.3-1 and 2 */
int get_srs_SubframeConfig(mid_t mod_id, int CC_id);
/* Boolean value. See TS 36.211,
section 5.5.3.2. TDD only */
int get_srs_MaxUpPts(mid_t mod_id, int CC_id);
/* Get number of DL resource blocks */
int get_N_RB_DL(mid_t mod_id, int CC_id);
/* Get number of UL resource blocks */
int get_N_RB_UL(mid_t mod_id, int CC_id);
/* Get DL/UL subframe assignment. TDD only */
int get_subframe_assignment(mid_t mod_id, int CC_id);
/* TDD only. See TS 36.211, table 4.2.1 */
int get_special_subframe_assignment(mid_t mod_id, int CC_id);
/* Get the duration of the random access response window in subframes */
int get_ra_ResponseWindowSize(mid_t mod_id, int CC_id);
/* Get timer used for random access */
int get_mac_ContentionResolutionTimer(mid_t mod_id, int CC_id);
/* Get type of duplex mode (FDD/TDD) */
int get_duplex_mode(mid_t mod_id, int CC_id);
/* Get the SI window length */
long get_si_window_length(mid_t mod_id, int CC_id);
/* Get the number of PDCCH symbols configured for the cell */
int get_num_pdcch_symb(mid_t mod_id, int CC_id);
/* See TS 36.213, sec 5.1.1.1 */
int get_tpc(mid_t mod_id, mid_t ue_id);
/* Get the first available HARQ process for a specific cell and UE during
a designated frame and subframe. Returns 0 for success. The id and the
status of the HARQ process are stored in id and status respectively */
int get_harq(const mid_t mod_id, const uint8_t CC_id, const mid_t ue_id,
const int frame, const uint8_t subframe, int *id, int *status);
/* Reported values for uplink power control */
int get_p0_pucch_dbm(mid_t mod_id, mid_t ue_id, int CC_id);
int get_p0_nominal_pucch(mid_t mod_id, int CC_id);
......@@ -225,54 +286,88 @@ int get_p0_nominal_pucch(mid_t mod_id, int CC_id);
* ************************************
*/
/* Get timer in subframes. Controls the synchronization
status of the UE, not the actual timing
advance procedure. See TS 36.321 */
int get_time_alignment_timer(mid_t mod_id, mid_t ue_id);
/* Get measurement gap configuration. See TS 36.133 */
int get_meas_gap_config(mid_t mod_id, mid_t ue_id);
/* Get measurement gap configuration offset if applicable */
int get_meas_gap_config_offset(mid_t mod_id, mid_t ue_id);
/* DL aggregated bit-rate of non-gbr bearer
per UE. See TS 36.413 */
int get_ue_aggregated_max_bitrate_dl (mid_t mod_id, mid_t ue_id);
/* UL aggregated bit-rate of non-gbr bearer
per UE. See TS 36.413 */
int get_ue_aggregated_max_bitrate_ul (mid_t mod_id, mid_t ue_id);
/* Only half-duplex support. FDD
operation. Boolean value */
int get_half_duplex(mid_t ue_id);
/* Support of intra-subframe hopping.
Boolean value */
int get_intra_sf_hopping(mid_t ue_id);
/* UE support for type 2 hopping with
n_sb>1 */
int get_type2_sb_1(mid_t ue_id);
/* Get the UE category */
int get_ue_category(mid_t ue_id);
/* UE support for resource allocation
type 1 */
int get_res_alloc_type1(mid_t ue_id);
/* Get UE transmission mode */
int get_ue_transmission_mode(mid_t mod_id, mid_t ue_id);
/* Boolean value. See TS 36.321 */
int get_tti_bundling(mid_t mod_id, mid_t ue_id);
/* The max HARQ retransmission for UL.
See TS 36.321 */
int get_maxHARQ_TX(mid_t mod_id, mid_t ue_id);
/* See TS 36.213 */
int get_beta_offset_ack_index(mid_t mod_id, mid_t ue_id);
/* See TS 36.213 */
int get_beta_offset_ri_index(mid_t mod_id, mid_t ue_id);
/* See TS 36.213 */
int get_beta_offset_cqi_index(mid_t mod_id, mid_t ue_id);
/* Boolean. See TS36.213, Section 10.1 */
int get_simultaneous_ack_nack_cqi(mid_t mod_id, mid_t ue_id);
/* Boolean. See TS 36.213, Section 8.2 */
int get_ack_nack_simultaneous_trans(mid_t mod_id,mid_t ue_id);
/* Get aperiodic CQI report mode */
int get_aperiodic_cqi_rep_mode(mid_t mod_id,mid_t ue_id);
/* Get ACK/NACK feedback mode. TDD only */
int get_tdd_ack_nack_feedback(mid_t mod_id, mid_t ue_id);
/* See TS36.213, section 10.1 */
int get_ack_nack_repetition_factor(mid_t mod_id, mid_t ue_id);
/* Boolean. Extended buffer status report size */
int get_extended_bsr_size(mid_t mod_id, mid_t ue_id);
/* Get number of UE transmission antennas */
int get_ue_transmission_antenna(mid_t mod_id, mid_t ue_id);
/* Get logical channel group of a channel with id lc_id */
int get_lcg(mid_t ue_id, mid_t lc_id);
/* Get direction of logical channel with id lc_id */
int get_direction(mid_t ue_id, mid_t lc_id);
/*******************
......@@ -349,8 +444,11 @@ typedef struct enb_agent_timer_instance_s{
RB_HEAD(enb_agent_map, enb_agent_timer_element_s) enb_agent_head;
}enb_agent_timer_instance_t;
err_code_t enb_agent_init_timer(void);
/* Create a timer for some agent related event with id xid. Will store the id
of the generated timer in timer_id */
err_code_t enb_agent_create_timer(uint32_t interval_sec,
uint32_t interval_usec,
agent_id_t agent_id,
......@@ -361,18 +459,28 @@ err_code_t enb_agent_create_timer(uint32_t interval_sec,
void* timer_args,
long *timer_id);
/* Destroy all existing timers */
err_code_t enb_agent_destroy_timers(void);
/* Destroy the timer with the given timer_id */
err_code_t enb_agent_destroy_timer(long timer_id);
/* Destroy the timer for task with id xid */
err_code_t enb_agent_destroy_timer_by_task_id(xid_t xid);
/* Stop a timer */
err_code_t enb_agent_stop_timer(long timer_id);
/* Restart the given timer */
err_code_t enb_agent_restart_timer(long *timer_id);
/* Find the timer with the given timer_id */
struct enb_agent_timer_element_s * get_timer_entry(long timer_id);
/* Obtain the protocol message stored in the given expired timer */
Protocol__FlexranMessage * enb_agent_process_timeout(long timer_id, void* timer_args);
/* Comparator function comparing two timers. Decides the ordering of the timers */
int enb_agent_compare_timer(struct enb_agent_timer_element_s *a, struct enb_agent_timer_element_s *b);
/*Specify a delay in nanoseconds to timespec and sleep until then*/
......@@ -383,10 +491,3 @@ RB_PROTOTYPE(enb_agent_map, enb_agent_timer_element_s, entry, enb_agent_compare_
#endif
......@@ -44,10 +44,13 @@
//extern msg_context_t shared_ctxt[NUM_MAX_ENB][ENB_AGENT_MAX];
/* full path of the local cache for storing VSFs */
extern char local_cache[40];
/* Control module interface for the communication of the MAC Control Module with the agent */
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];
#endif
......@@ -422,62 +422,55 @@ int enb_agent_mac_stats_reply(mid_t mod_id,
/* Check flag for creation of buffer status report */
if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_BSR) {
//TODO: Create a report for each LCG (4 elements). See flex_ue_stats_report of
// FlexRAN specifications for more details
ue_report[i]->n_bsr = 4;
uint32_t *elem;
elem = (uint32_t *) malloc(sizeof(uint32_t)*ue_report[i]->n_bsr);
if (elem == NULL)
goto error;
for (j = 0; j++; j < ue_report[i]->n_bsr) {
// Set the actual BSR for LCG j of the current UE
// NN: we need to know the cc_id here, consider the first one
elem[j] = get_ue_bsr (enb_id, i, j); //eNB_UE_list->UE_template[UE_PCCID(enb_id,i)][i].bsr_info[j];
elem[j] = get_ue_bsr (enb_id, i, j);
}
ue_report[i]->bsr = elem;
}
/* Check flag for creation of PRH report */
if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_PRH) {
// TODO: Fill in the actual power headroom value for the RNTI
ue_report[i]->phr = get_ue_phr (enb_id, i); // eNB_UE_list->UE_template[UE_PCCID(enb_id,i)][i].phr_info;
ue_report[i]->has_phr = 1;
}
/* Check flag for creation of RLC buffer status report */
if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_RLC_BS) {
// TODO: Fill in the actual RLC buffer status reports
ue_report[i]->n_rlc_report = 3; // Set this to the number of LCs for this UE
ue_report[i]->n_rlc_report = 3; // Set this to the number of LCs for this UE. This needs to be generalized for for LCs
Protocol__FlexRlcBsr ** rlc_reports;
rlc_reports = malloc(sizeof(Protocol__FlexRlcBsr *) * 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++) {
rlc_reports[j] = malloc(sizeof(Protocol__FlexRlcBsr));
if (rlc_reports[j] == NULL)
goto error;
protocol__flex_rlc_bsr__init(rlc_reports[j]);
//TODO:Set logical channel id
rlc_reports[j]->lc_id = j+1;
rlc_reports[j]->has_lc_id = 1;
//TODO:Set tx queue size in bytes
rlc_reports[j]->tx_queue_size = 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 = 1;
rlc_reports[j]->has_tx_queue_hol_delay = 0;
//TODO:Set retransmission queue size in bytes
rlc_reports[j]->retransmission_queue_size = 10;
rlc_reports[j]->has_retransmission_queue_size = 1;
rlc_reports[j]->has_retransmission_queue_size = 0;
//TODO:Set retransmission queue head of line delay in ms
rlc_reports[j]->retransmission_queue_hol_delay = 100;
rlc_reports[j]->has_retransmission_queue_hol_delay = 1;
rlc_reports[j]->has_retransmission_queue_hol_delay = 0;
//TODO:Set current size of the pending message in bytes
rlc_reports[j]->status_pdu_size = 100;
rlc_reports[j]->has_status_pdu_size = 1;
rlc_reports[j]->has_status_pdu_size = 0;
}
// Add RLC buffer status reports to the full report
if (ue_report[i]->n_rlc_report > 0)
......@@ -502,12 +495,13 @@ int enb_agent_mac_stats_reply(mid_t mod_id,
if (dl_report == NULL)
goto error;
protocol__flex_dl_cqi_report__init(dl_report);
//TODO:Set the SFN and SF of the last report held in the agent.
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
//Set the number of DL CQI reports for this UE. One for each CC
dl_report->n_csi_report = get_active_CC(enb_id,i);
//TODO:Create the actual CSI reports.
//Create the actual CSI reports.
Protocol__FlexDlCsi **csi_reports;
csi_reports = malloc(sizeof(Protocol__FlexDlCsi *)*dl_report->n_csi_report);
if (csi_reports == NULL)
......@@ -517,14 +511,14 @@ int enb_agent_mac_stats_reply(mid_t mod_id,
if (csi_reports[j] == NULL)
goto error;
protocol__flex_dl_csi__init(csi_reports[j]);
//TODO: the servCellIndex for this report
//The servCellIndex for this report
csi_reports[j]->serv_cell_index = j;
csi_reports[j]->has_serv_cell_index = 1;
//TODO: the rank indicator value for this cc
//The rank indicator value for this cc
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
//For now we only support 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 FlexRAN specifications
csi_reports[j]->type = PROTOCOL__FLEX_CSI_TYPE__FLCSIT_P10;
......@@ -598,16 +592,16 @@ int enb_agent_mac_stats_reply(mid_t mod_id,
//TODO: Set paging index. This index is the same that will be used for the scheduling of the
//paging message by the controller
p_info[j]->paging_index = 10;
p_info[j]->has_paging_index = 1;
p_info[j]->has_paging_index = 0;
//TODO:Set the paging message size
p_info[j]->paging_message_size = 100;
p_info[j]->has_paging_message_size = 1;
p_info[j]->has_paging_message_size = 0;
//TODO: Set the paging subframe
p_info[j]->paging_subframe = 10;
p_info[j]->has_paging_subframe = 1;
p_info[j]->has_paging_subframe = 0;
//TODO: Set the carrier index for the pending paging message
p_info[j]->carrier_index = 0;
p_info[j]->has_carrier_index = 1;
p_info[j]->has_carrier_index = 0;
}
//Add all paging info to the paging buffer rerport
paging_report->paging_info = p_info;
......@@ -645,7 +639,7 @@ int enb_agent_mac_stats_reply(mid_t mod_id,
ul_report[j]->has_type = 1;
//TODO:Set the number of SINR measurements based on the report type
//See struct flex_ul_cqi in FlexRAN specification for more details
ul_report[j]->n_sinr = 100;
ul_report[j]->n_sinr = 0;
uint32_t *sinr_meas;
sinr_meas = (uint32_t *) malloc(sizeof(uint32_t) * ul_report[j]->n_sinr);
if (sinr_meas == NULL)
......@@ -712,12 +706,12 @@ int enb_agent_mac_stats_reply(mid_t mod_id,
// Current frame and subframe number
ni_report->sfn_sf = get_sfn_sf(enb_id);
ni_report->has_sfn_sf = 1;
// Received interference power in dbm
//TODO:Received interference power in dbm
ni_report->rip = 0;
ni_report->has_rip = 1;
// Thermal noise power in dbm
ni_report->has_rip = 0;
//TODO:Thermal noise power in dbm
ni_report->tnp = 0;
ni_report->has_tnp = 1;
ni_report->has_tnp = 0;
ni_report->p0_nominal_pucch = get_p0_nominal_pucch(enb_id, 0);
ni_report->has_p0_nominal_pucch = 1;
......@@ -988,13 +982,13 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Flexran
protocol__flex_dl_info__init(dl_info[i]);
dl_info[i]->rnti = get_ue_crnti(mod_id, i);
dl_info[i]->has_rnti = 1;
/*TODO: fill in the right id of this round's HARQ process for this UE*/
/*Fill in the right id of this round's HARQ process for this UE*/
int harq_id;
int 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]->has_harq_process_id = 1;
/*TODO: fill in the status of the HARQ process (2 TBs)*/
/* 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++) {
......@@ -1004,7 +998,7 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Flexran
else if (harq_status == 1)
dl_info[i]->harq_status[j] = PROTOCOL__FLEX_HARQ_STATUS__FLHS_NACK;
}
/*TODO: fill in the serving cell index for this UE */
/*Fill in the serving cell index for this UE */
dl_info[i]->serv_cell_index = UE_PCCID(mod_id,i);
dl_info[i]->has_serv_cell_index = 1;
}
......@@ -1012,8 +1006,8 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Flexran
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
/* 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);
......@@ -1031,7 +1025,7 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Flexran
protocol__flex_ul_info__init(ul_info[i]);
ul_info[i]->rnti = get_ue_crnti(mod_id, i);
ul_info[i]->has_rnti = 1;
/*TODO: fill in the Tx power control command for this UE (if available)*/
/*Fill in the Tx power control command for this UE (if available)*/
if(get_tpc(mod_id,i) != 1){
ul_info[i]->tpc = get_tpc(mod_id,i);
ul_info[i]->has_tpc = 1;
......@@ -1042,7 +1036,7 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Flexran
}
/*TODO: fill in the amount of data in bytes in the MAC SDU received in this subframe for the