Added brief documentation of agent API functions
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
|
||||
+189
-267
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
given logical channel*/
|
||||
ul_info[i]->n_ul_reception = 11;
|
||||
ul_info[i]->n_ul_reception = 0;
|
||||
ul_info[i]->ul_reception = malloc(sizeof(uint32_t) * ul_info[i]->n_ul_reception);
|
||||
for (j = 0; j < ul_info[i]->n_ul_reception; j++) {
|
||||
ul_info[i]->ul_reception[j] = 100;
|
||||
@@ -1050,7 +1044,7 @@ int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__Flexran
|
||||
/*TODO: Fill in the reception status for each UEs data*/
|
||||
ul_info[i]->reception_status = PROTOCOL__FLEX_RECEPTION_STATUS__FLRS_OK;
|
||||
ul_info[i]->has_reception_status = 1;
|
||||
/*TODO: fill in the serving cell index for this UE */
|
||||
/*Fill in the serving cell index for this UE */
|
||||
ul_info[i]->serv_cell_index = UE_PCCID(mod_id,i);
|
||||
ul_info[i]->has_serv_cell_index = 1;
|
||||
}
|
||||
|
||||
@@ -81,24 +81,24 @@ void enb_agent_init_mac_agent(mid_t mod_id);
|
||||
|
||||
int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
|
||||
|
||||
/* Statistics request protocol message constructor and destructor */
|
||||
int enb_agent_mac_stats_request(mid_t mod_id, xid_t xid, const stats_request_config_t *report_config, Protocol__FlexranMessage **msg);
|
||||
|
||||
int enb_agent_mac_destroy_stats_request(Protocol__FlexranMessage *msg);
|
||||
|
||||
/* Statistics reply protocol message constructor and destructor */
|
||||
int enb_agent_mac_stats_reply(mid_t mod_id, xid_t xid, const report_config_t *report_config, Protocol__FlexranMessage **msg);
|
||||
|
||||
int enb_agent_mac_destroy_stats_reply(Protocol__FlexranMessage *msg);
|
||||
|
||||
/* Scheduling request information protocol message constructor and estructor */
|
||||
int enb_agent_mac_sr_info(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
|
||||
|
||||
int enb_agent_mac_destroy_sr_info(Protocol__FlexranMessage *msg);
|
||||
|
||||
/* Subframe trigger protocol msssage constructor and destructor */
|
||||
int enb_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
|
||||
|
||||
int enb_agent_mac_destroy_sf_trigger(Protocol__FlexranMessage *msg);
|
||||
|
||||
/*
|
||||
int enb_agent_mac_create_empty_dl_config(mid_t mod_id, Protocol__FlexranMessage **msg);
|
||||
|
||||
int enb_agent_mac_destroy_dl_config(Protocol__FlexranMessage *msg);
|
||||
|
||||
int enb_agent_mac_handle_dl_mac_config(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
|
||||
|
||||
@@ -57,7 +57,6 @@ typedef struct enb_agent_channel_instance_s{
|
||||
|
||||
/*Send and receive messages using the channel registered for a specific agent*/
|
||||
int enb_agent_msg_send(mid_t mod_id, agent_id_t agent_id, void *data, int size, int priority);
|
||||
|
||||
int enb_agent_msg_recv(mid_t mod_id, agent_id_t agent_id, void **data, int *size, int *priority);
|
||||
|
||||
/*Register a channel to an agent. Use ENB_AGENT_MAX to register the
|
||||
|
||||
Reference in New Issue
Block a user