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);
......
......@@ -51,6 +51,7 @@
void * enb[NUM_MAX_ENB];
void * enb_ue[NUM_MAX_ENB];
void * enb_rrc[NUM_MAX_ENB];
/*
* message primitives
*/
......@@ -446,6 +447,7 @@ int enb_agent_destroy_agent_reconfiguration(Protocol__FlexranMessage *msg) {
/*TODO: Dealocate memory for a dynamically allocated agent reconfiguration message*/
}
/*
* get generic info from RAN
*/
......@@ -541,7 +543,7 @@ int get_num_ues (mid_t mod_id){
return ((UE_list_t *)enb_ue[mod_id])->num_UEs;
}
int get_ue_crnti (mid_t mod_id, mid_t ue_id){
int get_ue_crnti (mid_t mod_id, mid_t ue_id) {
return UE_RNTI(mod_id, ue_id);
}
......@@ -608,13 +610,12 @@ int get_MAC_CE_bitmap_TA(mid_t mod_id, mid_t ue_id,int CC_id)
else
return 0;
}
int get_active_CC(mid_t mod_id, mid_t ue_id)
{
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)
{
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);
......@@ -629,8 +630,7 @@ int get_current_RI(mid_t mod_id, mid_t ue_id, int CC_id)
return eNB_UE_stats[CC_id].rank;
}
int get_tpc(mid_t mod_id, mid_t ue_id)
{
int get_tpc(mid_t mod_id, mid_t ue_id) {
LTE_eNB_UE_stats *eNB_UE_stats = NULL;
int32_t normalized_rx_power, target_rx_power;
int tpc = 1;
......@@ -660,8 +660,7 @@ int get_tpc(mid_t mod_id, mid_t ue_id)
return tpc;
}
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) //flag_id_status = 0 then id, else status
{
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) { //flag_id_status = 0 then id, else status
/*TODO: Add int TB in function parameters to get the status of the second TB. This can be done to by editing in
* get_ue_active_harq_pid function in line 272 file: phy_procedures_lte_eNB.c to add
* DLSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->dlsch_eNB[(uint32_t)UE_id][1];*/
......@@ -684,8 +683,7 @@ int get_harq(const mid_t mod_id, const uint8_t CC_id, const mid_t ue_id, const i
return 0;
}
int get_p0_pucch_dbm(mid_t mod_id, mid_t ue_id, int CC_id)
{
int get_p0_pucch_dbm(mid_t mod_id, mid_t ue_id, int CC_id) {
LTE_eNB_UE_stats *eNB_UE_stats = NULL;
uint32_t rnti = get_ue_crnti(mod_id,ue_id);
......@@ -703,8 +701,7 @@ int get_p0_pucch_dbm(mid_t mod_id, mid_t ue_id, int CC_id)
return -1;
}
int get_p0_nominal_pucch(mid_t mod_id, int CC_id)
{
int get_p0_nominal_pucch(mid_t mod_id, int CC_id) {
int32_t pucch_rx_received = mac_xface->get_target_pucch_rx_power(mod_id, CC_id);
return pucch_rx_received;
}
......@@ -716,43 +713,42 @@ int get_p0_nominal_pucch(mid_t mod_id, int CC_id)
* ************************************
*/
int get_hopping_offset(mid_t mod_id, int CC_id)
{
int get_hopping_offset(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->pusch_config_common.pusch_HoppingOffset;
}
int get_hopping_mode(mid_t mod_id, int CC_id)
{
int get_hopping_mode(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->pusch_config_common.hoppingMode;
}
int get_n_SB(mid_t mod_id, int CC_id)
{
int get_n_SB(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->pusch_config_common.n_SB;
}
int get_enable64QAM(mid_t mod_id, int CC_id)
{
int get_enable64QAM(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->pusch_config_common.enable64QAM;
}
int get_phich_duration(mid_t mod_id, int CC_id)
{
int get_phich_duration(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->phich_config_common.phich_duration;
}
int get_phich_resource(mid_t mod_id, int CC_id)
{
int get_phich_resource(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
......@@ -767,132 +763,132 @@ int get_phich_resource(mid_t mod_id, int CC_id)
return -1;
}
int get_n1pucch_an(mid_t mod_id, int CC_id)
{
int get_n1pucch_an(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->pucch_config_common.n1PUCCH_AN;
}
int get_nRB_CQI(mid_t mod_id, int CC_id)
{
int get_nRB_CQI(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->pucch_config_common.nRB_CQI;
}
int get_deltaPUCCH_Shift(mid_t mod_id, int CC_id)
{
int get_deltaPUCCH_Shift(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->pucch_config_common.deltaPUCCH_Shift;
}
int get_prach_ConfigIndex(mid_t mod_id, int CC_id)
{
int get_prach_ConfigIndex(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
}
int get_prach_FreqOffset(mid_t mod_id, int CC_id)
{
int get_prach_FreqOffset(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset;
}
int get_maxHARQ_Msg3Tx(mid_t mod_id, int CC_id)
{
int get_maxHARQ_Msg3Tx(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->maxHARQ_Msg3Tx;
}
int get_ul_cyclic_prefix_length(mid_t mod_id, int CC_id)
{
int get_ul_cyclic_prefix_length(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->Ncp_UL;
}
int get_dl_cyclic_prefix_length(mid_t mod_id, int CC_id)
{
int get_dl_cyclic_prefix_length(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->Ncp;
}
int get_cell_id(mid_t mod_id, int CC_id)
{
int get_cell_id(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->Nid_cell;
}
int get_srs_BandwidthConfig(mid_t mod_id, int CC_id)
{
int get_srs_BandwidthConfig(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig;
}
int get_srs_SubframeConfig(mid_t mod_id, int CC_id)
{
int get_srs_SubframeConfig(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->soundingrs_ul_config_common.srs_SubframeConfig;
}
int get_srs_MaxUpPts(mid_t mod_id, int CC_id)
{
int get_srs_MaxUpPts(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->soundingrs_ul_config_common.srs_MaxUpPts;
}
int get_N_RB_DL(mid_t mod_id, int CC_id)
{
int get_N_RB_DL(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->N_RB_DL;
}
int get_N_RB_UL(mid_t mod_id, int CC_id)
{
int get_N_RB_UL(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->N_RB_UL;
}
int get_subframe_assignment(mid_t mod_id, int CC_id)
{
int get_subframe_assignment(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->tdd_config;
}
int get_special_subframe_assignment(mid_t mod_id, int CC_id)
{
int get_special_subframe_assignment(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
return frame_parms->tdd_config_S;
}
int get_ra_ResponseWindowSize(mid_t mod_id, int CC_id)
{
int get_ra_ResponseWindowSize(mid_t mod_id, int CC_id) {
Enb_properties_array_t *enb_properties;
enb_properties = enb_config_get();
return enb_properties->properties[mod_id]->rach_raResponseWindowSize[CC_id];
}
int get_mac_ContentionResolutionTimer(mid_t mod_id, int CC_id)
{
int get_mac_ContentionResolutionTimer(mid_t mod_id, int CC_id) {
Enb_properties_array_t *enb_properties;
enb_properties = enb_config_get();
return enb_properties->properties[mod_id]->rach_macContentionResolutionTimer[CC_id];
}
int get_duplex_mode(mid_t mod_id, int CC_id)
{
int get_duplex_mode(mid_t mod_id, int CC_id) {
LTE_DL_FRAME_PARMS *frame_parms;
frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id);
......@@ -903,21 +899,23 @@ int get_duplex_mode(mid_t mod_id, int CC_id)
return -1;
}
long get_si_window_length(mid_t mod_id, int CC_id)
{
long get_si_window_length(mid_t mod_id, int CC_id) {
return ((eNB_RRC_INST *)enb_rrc[mod_id])->carrier[CC_id].sib1->si_WindowLength;
}
int get_sib1_length(mid_t mod_id, int CC_id)
{
int get_sib1_length(mid_t mod_id, int CC_id) {
return ((eNB_RRC_INST *)enb_rrc[mod_id])->carrier[CC_id].sizeof_SIB1;
}
int get_num_pdcch_symb(mid_t mod_id, int CC_id)
{
int get_num_pdcch_symb(mid_t mod_id, int CC_id) {
/* TODO: This should return the number of PDCCH symbols initially used by the cell CC_id */
return 0;
//(PHY_vars_UE_g[mod_id][CC_id]->lte_ue_pdcch_vars[mod_id]->num_pdcch_symbols);
}
/*
* ************************************
* Get Messages for UE Configuration Reply
......@@ -925,8 +923,7 @@ int get_num_pdcch_symb(mid_t mod_id, int CC_id)
*/
int get_time_alignment_timer(mid_t mod_id, mid_t ue_id)
{
int get_time_alignment_timer(mid_t mod_id, mid_t ue_id) {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint32_t rntiP = get_ue_crnti(mod_id,ue_id);
......@@ -982,18 +979,16 @@ int get_meas_gap_config_offset(mid_t mod_id, mid_t ue_id) {
return -1;
}
int get_ue_aggregated_max_bitrate_dl (mid_t mod_id, mid_t ue_id)
{
int get_ue_aggregated_max_bitrate_dl (mid_t mod_id, mid_t ue_id) {
return ((UE_list_t *)enb_ue[mod_id])->UE_sched_ctrl[ue_id].ue_AggregatedMaximumBitrateDL;
}
int get_ue_aggregated_max_bitrate_ul (mid_t mod_id, mid_t ue_id)
{
int get_ue_aggregated_max_bitrate_ul (mid_t mod_id, mid_t ue_id) {
return ((UE_list_t *)enb_ue[mod_id])->UE_sched_ctrl[ue_id].ue_AggregatedMaximumBitrateUL;
}
int get_half_duplex(mid_t ue_id)
{
int get_half_duplex(mid_t ue_id) {
// TODO
//int halfduplex = 0;
//int bands_to_scan = ((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.count;
//for (int i =0; i < bands_to_scan; i++){
......@@ -1003,37 +998,32 @@ int get_half_duplex(mid_t ue_id)
//return halfduplex;
}
int get_intra_sf_hopping(mid_t ue_id)
{
int get_intra_sf_hopping(mid_t ue_id) {
//TODO:Get proper value
//temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf);
//return (0 & ( 1 << (31)));
}
int get_type2_sb_1(mid_t ue_id)
{
int get_type2_sb_1(mid_t ue_id) {
//TODO:Get proper value
//uint8_t temp = 0;
//temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf);
//return (temp & ( 1 << (11)));
}
int get_ue_category(mid_t ue_id)
{
int get_ue_category(mid_t ue_id) {
//TODO:Get proper value
//return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->ue_Category);
}
int get_res_alloc_type1(mid_t ue_id)
{
int get_res_alloc_type1(mid_t ue_id) {
//TODO:Get proper value
//uint8_t temp = 0;
//temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf);
//return (temp & ( 1 << (30)));
}
int get_ue_transmission_mode(mid_t mod_id, mid_t ue_id)
{
int get_ue_transmission_mode(mid_t mod_id, mid_t ue_id) {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint32_t rntiP = get_ue_crnti(mod_id,ue_id);
......@@ -1049,8 +1039,7 @@ int get_ue_transmission_mode(mid_t mod_id, mid_t ue_id)
return -1;
}
int get_tti_bundling(mid_t mod_id, mid_t ue_id)
{
int get_tti_bundling(mid_t mod_id, mid_t ue_id) {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint32_t rntiP = get_ue_crnti(mod_id,ue_id);
......@@ -1078,8 +1067,7 @@ int get_maxHARQ_TX(mid_t mod_id, mid_t ue_id) {
return -1;
}
int get_beta_offset_ack_index(mid_t mod_id, mid_t ue_id)
{
int get_beta_offset_ack_index(mid_t mod_id, mid_t ue_id) {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint32_t rntiP = get_ue_crnti(mod_id,ue_id);
......@@ -1094,8 +1082,7 @@ int get_beta_offset_ack_index(mid_t mod_id, mid_t ue_id)
return -1;
}
int get_beta_offset_ri_index(mid_t mod_id, mid_t ue_id)
{
int get_beta_offset_ri_index(mid_t mod_id, mid_t ue_id) {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint32_t rntiP = get_ue_crnti(mod_id,ue_id);
......@@ -1110,8 +1097,7 @@ int get_beta_offset_ri_index(mid_t mod_id, mid_t ue_id)
return -1;
}
int get_beta_offset_cqi_index(mid_t mod_id, mid_t ue_id)
{
int get_beta_offset_cqi_index(mid_t mod_id, mid_t ue_id) {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint32_t rntiP = get_ue_crnti(mod_id,ue_id);
......@@ -1126,8 +1112,7 @@ int get_beta_offset_cqi_index(mid_t mod_id, mid_t ue_id)
return -1;
}
int get_simultaneous_ack_nack_cqi(mid_t mod_id, mid_t ue_id)
{
int get_simultaneous_ack_nack_cqi(mid_t mod_id, mid_t ue_id) {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint32_t rntiP = get_ue_crnti(mod_id,ue_id);
......@@ -1142,8 +1127,7 @@ int get_simultaneous_ack_nack_cqi(mid_t mod_id, mid_t ue_id)
return -1;
}
int get_ack_nack_simultaneous_trans(mid_t mod_id,mid_t ue_id)
{
int get_ack_nack_simultaneous_trans(mid_t mod_id,mid_t ue_id) {
return (&eNB_rrc_inst[mod_id])->carrier[0].sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission;
}
......@@ -1161,8 +1145,7 @@ int get_aperiodic_cqi_rep_mode(mid_t mod_id,mid_t ue_id) {
return -1;
}
int get_tdd_ack_nack_feedback(mid_t mod_id, mid_t ue_id)
{
int get_tdd_ack_nack_feedback(mid_t mod_id, mid_t ue_id) {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint32_t rntiP = get_ue_crnti(mod_id,ue_id);
......@@ -1178,8 +1161,7 @@ int get_tdd_ack_nack_feedback(mid_t mod_id, mid_t ue_id)
return -1;
}
int get_ack_nack_repetition_factor(mid_t mod_id, mid_t ue_id)
{
int get_ack_nack_repetition_factor(mid_t mod_id, mid_t ue_id) {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint32_t rntiP = get_ue_crnti(mod_id,ue_id);
......@@ -1213,8 +1195,7 @@ int get_extended_bsr_size(mid_t mod_id, mid_t ue_id) {
return -1;
}
int get_ue_transmission_antenna(mid_t mod_id, mid_t ue_id)
{
int get_ue_transmission_antenna(mid_t mod_id, mid_t ue_id) {
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
uint32_t rntiP = get_ue_crnti(mod_id,ue_id);
......@@ -1235,8 +1216,7 @@ int get_ue_transmission_antenna(mid_t mod_id, mid_t ue_id)
return -1;
}
int get_lcg(mid_t ue_id, mid_t lc_id)
{
int get_lcg(mid_t ue_id, mid_t lc_id) {
if (UE_mac_inst == NULL) {
return -1;
}
......@@ -1247,8 +1227,7 @@ int get_lcg(mid_t ue_id, mid_t lc_id)
}
}
int get_direction(mid_t ue_id, mid_t lc_id)
{
int get_direction(mid_t ue_id, mid_t lc_id) {
/*TODO: fill with the value for the rest of LCID*/
if(lc_id == DCCH | lc_id == DCCH1)
return 2;
......@@ -1293,43 +1272,37 @@ int enb_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_change)
int i =find_UE_id(mod_id,rnti);
config->has_rnti = 1;
config->rnti = rnti;
//TODO: Set the time_alignment_timer
if(get_time_alignment_timer(mod_id,i) != -1){
config->time_alignment_timer = get_time_alignment_timer(mod_id,i);
config->has_time_alignment_timer = 1;
}
//TODO: Set the measurement gap configuration pattern
if(get_meas_gap_config(mod_id,i) != -1){
config->meas_gap_config_pattern = get_meas_gap_config(mod_id,i);
config->has_meas_gap_config_pattern = 1;
}
//TODO: Set the measurement gap offset if applicable
if(config->has_meas_gap_config_pattern == 1 &&
config->meas_gap_config_pattern != PROTOCOL__FLEX_MEAS_GAP_CONFIG_PATTERN__FLMGCP_OFF) {
config->meas_gap_config_sf_offset = get_meas_gap_config_offset(mod_id,i);
config->has_meas_gap_config_sf_offset = 1;
}
//TODO: Set the SPS configuration (Optional)
//Not supported for noe, so we do not set it
//Not supported for now, so we do not set it
//TODO: Set the SR configuration (Optional)
//We do not set it for now
//TODO: Set the CQI configuration (Optional)
//We do not set it for now
//TODO: Set the transmission mode
if(get_ue_transmission_mode(mod_id,i) != -1){
if(get_ue_transmission_mode(mod_id,i) != -1){
config->transmission_mode = get_ue_transmission_mode(mod_id,i);
config->has_transmission_mode = 1;
}
//TODO: Set the aggregated bit-rate of the non-gbr bearer (UL)
config->ue_aggregated_max_bitrate_ul = get_ue_aggregated_max_bitrate_ul(mod_id,i);
config->ue_aggregated_max_bitrate_ul = get_ue_aggregated_max_bitrate_ul(mod_id,i);
config->has_ue_aggregated_max_bitrate_ul = 1;
//TODO: Set the aggregated bit-rate of the non-gbr bearer (DL)
config->ue_aggregated_max_bitrate_dl = get_ue_aggregated_max_bitrate_dl(mod_id,i);
config->ue_aggregated_max_bitrate_dl = get_ue_aggregated_max_bitrate_dl(mod_id,i);
config->has_ue_aggregated_max_bitrate_dl = 1;
//TODO: Set the UE capabilities
......@@ -1337,63 +1310,63 @@ int enb_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_change)
c_capabilities = malloc(sizeof(Protocol__FlexUeCapabilities));
protocol__flex_ue_capabilities__init(c_capabilities);
//TODO: Set half duplex (FDD operation)
c_capabilities->has_half_duplex = 1;
c_capabilities->has_half_duplex = 0;
c_capabilities->half_duplex = 1;//get_half_duplex(i);
//TODO: Set intra-frame hopping flag
c_capabilities->has_intra_sf_hopping = 1;
c_capabilities->has_intra_sf_hopping = 0;
c_capabilities->intra_sf_hopping = 1;//get_intra_sf_hopping(i);
//TODO: Set support for type 2 hopping with n_sb > 1
c_capabilities->has_type2_sb_1 = 1;
c_capabilities->has_type2_sb_1 = 0;
c_capabilities->type2_sb_1 = 1;//get_type2_sb_1(i);
//TODO: Set ue category
c_capabilities->has_ue_category = 1;
c_capabilities->has_ue_category = 0;
c_capabilities->ue_category = 1;//get_ue_category(i);
//TODO: Set UE support for resource allocation type 1
c_capabilities->has_res_alloc_type1 = 1;
c_capabilities->has_res_alloc_type1 = 0;
c_capabilities->res_alloc_type1 = 1;//get_res_alloc_type1(i);
//Set the capabilites to the message
config->capabilities = c_capabilities;
//TODO: Set UE transmission antenna. One of the FLUTA_* values
if(get_ue_transmission_antenna(mod_id,i) != -1){
config->has_ue_transmission_antenna = 1;
config->ue_transmission_antenna = get_ue_transmission_antenna(mod_id,i);
}
//TODO: Set tti bundling flag (See ts 36.321)
if(get_tti_bundling(mod_id,i) != -1){
config->has_tti_bundling = 1;
config->tti_bundling = get_tti_bundling(mod_id,i);
}
//TODO: Set the max HARQ retransmission for the UL
if(get_maxHARQ_TX(mod_id,i) != -1){
config->has_max_harq_tx = 1;
config->max_harq_tx = get_maxHARQ_TX(mod_id,i);
}
//TODO: Fill beta_offset_ack_index (TS 36.213)
if(get_beta_offset_ack_index(mod_id,i) != -1){
config->has_beta_offset_ack_index = 1;
config->beta_offset_ack_index = get_beta_offset_ack_index(mod_id,i);
}
//TODO: Fill beta_offset_ri_index (TS 36.213)
if(get_beta_offset_ri_index(mod_id,i) != -1){
config->has_beta_offset_ri_index = 1;
config->beta_offset_ri_index = get_beta_offset_ri_index(mod_id,i);
}
//TODO: Fill beta_offset_cqi_index (TS 36.213)
if(get_beta_offset_cqi_index(mod_id,i) != -1){
config->has_beta_offset_cqi_index = 1;
config->beta_offset_cqi_index = get_beta_offset_cqi_index(mod_id,i);
}
//TODO: Fill ack_nack_simultaneous_trans (TS 36.213)
if(get_ack_nack_simultaneous_trans(mod_id,i) != -1){
config->has_ack_nack_simultaneous_trans = 1;
config->ack_nack_simultaneous_trans = get_ack_nack_simultaneous_trans(mod_id,i);
}
//TODO: Fill simultaneous_ack_nack_cqi (TS 36.213)
if(get_simultaneous_ack_nack_cqi(mod_id,i) != -1){
config->has_simultaneous_ack_nack_cqi = 1;
config->simultaneous_ack_nack_cqi = get_simultaneous_ack_nack_cqi(mod_id,i);
}
//TODO: Set PRACRM_* value regarding aperiodic cqi report mode
if(get_aperiodic_cqi_rep_mode(mod_id,i) != -1){
config->has_aperiodic_cqi_rep_mode = 1;
int mode = get_aperiodic_cqi_rep_mode(mod_id,i);
......@@ -1403,22 +1376,22 @@ int enb_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_change)
config->aperiodic_cqi_rep_mode = mode;
}
}
//TODO: Set tdd_ack_nack_feedback
if(get_tdd_ack_nack_feedback(mod_id, i) != -1){
config->has_tdd_ack_nack_feedback = 1;
config->tdd_ack_nack_feedback = get_tdd_ack_nack_feedback(mod_id,i);
}
//TODO: Set ack_nack_repetition factor
if(get_ack_nack_repetition_factor(mod_id, i) != -1){
config->has_ack_nack_repetition_factor = 1;
config->ack_nack_repetition_factor = get_ack_nack_repetition_factor(mod_id,i);
}
//TODO: Set extended BSR size
if(get_extended_bsr_size(mod_id, i) != -1){
config->has_extended_bsr_size = 1;
config->extended_bsr_size = get_extended_bsr_size(mod_id,i);
}
//TODO: Set index of primary cell
config->has_pcell_carrier_index = 1;
config->pcell_carrier_index = UE_PCCID(mod_id, i);
//TODO: Set carrier aggregation support (boolean)
......@@ -1432,8 +1405,8 @@ int enb_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_change)
// We do not set it for now. No carrier aggregation support
//TODO: Set deactivation timer for secondary cell
config->has_scell_deactivation_timer = 1;
config->scell_deactivation_timer = 1;
config->has_scell_deactivation_timer = 0;
config->scell_deactivation_timer = 0;
}
} else if (state_change == PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_MOVED) {
// TODO: Not supported for now. Leave blank
......@@ -1462,9 +1435,7 @@ int enb_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_change)
LOG_D(ENB_AGENT, "Could not send UE state message\n");
}
/*
* timer primitives
*/
int enb_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) {
......@@ -1485,7 +1456,6 @@ int enb_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__Flexra
protocol__flex_lc_config_reply__init(lc_config_reply_msg);
lc_config_reply_msg->header = header;
//TODO: Fill in the actual number of UEs that we are going to report LC configs about
lc_config_reply_msg->n_lc_ue_config = get_num_ues(mod_id);
Protocol__FlexLcUeConfig **lc_ue_config;
......@@ -1498,9 +1468,10 @@ int enb_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__Flexra
for (i = 0; i < lc_config_reply_msg->n_lc_ue_config; i++) {
lc_ue_config[i] = malloc(sizeof(Protocol__FlexLcUeConfig));
protocol__flex_lc_ue_config__init(lc_ue_config[i]);
//TODO: Set the RNTI of the UE
lc_ue_config[i]->has_rnti = 1;
lc_ue_config[i]->rnti = get_ue_crnti(mod_id,i);
//TODO: Set the number of LC configurations that will be reported for this UE
//Set this according to the current state of the UE. This is only a temporary fix
int status = 0;
......@@ -1512,6 +1483,7 @@ int enb_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__Flexra
} else {
lc_ue_config[i]->n_lc_config = 3;
}
Protocol__FlexLcConfig **lc_config;
if (lc_ue_config[i]->n_lc_config > 0) {
lc_config = malloc(sizeof(Protocol__FlexLcConfig *) * lc_ue_config[i]->n_lc_config);
......@@ -1521,38 +1493,39 @@ int enb_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__Flexra
for (j = 0; j < lc_ue_config[i]->n_lc_config; j++) {
lc_config[j] = malloc(sizeof(Protocol__FlexLcConfig));
protocol__flex_lc_config__init(lc_config[j]);
//TODO: Set the LC id
lc_config[j]->has_lcid = 1;
lc_config[j]->lcid = j+1;
//TODO: Set the LCG of the channel
int lcg = get_lcg(i, j+1);
if (lcg >= 0 && lcg <= 3) {
lc_config[j]->has_lcg = 1;
lc_config[j]->lcg = get_lcg(i,j+1);
}
//TODO: Set the LC direction
lc_config[j]->has_direction = 1;
lc_config[j]->direction = get_direction(i,j+1);
//TODO: Bearer type. One of FLQBT_* values
//TODO: Bearer type. One of FLQBT_* values. Currently only default bearer supported
lc_config[j]->has_qos_bearer_type = 1;
lc_config[j]->qos_bearer_type = PROTOCOL__FLEX_QOS_BEARER_TYPE__FLQBT_NON_GBR;
//TODO: Set the QCI defined in TS 23.203, coded as defined in TS 36.413
// One less than the actual QCI value
// One less than the actual QCI value. Needs to be generalized
lc_config[j]->has_qci = 1;
lc_config[j]->qci = 1;
if (lc_config[j]->direction == PROTOCOL__FLEX_QOS_BEARER_TYPE__FLQBT_GBR) {
//TODO: Set the max bitrate (UL)
lc_config[j]->has_e_rab_max_bitrate_ul = 1;
lc_config[j]->e_rab_max_bitrate_ul = 1;
lc_config[j]->has_e_rab_max_bitrate_ul = 0;
lc_config[j]->e_rab_max_bitrate_ul = 0;
//TODO: Set the max bitrate (DL)
lc_config[j]->has_e_rab_max_bitrate_dl = 1;
lc_config[j]->e_rab_max_bitrate_dl = 1;
lc_config[j]->has_e_rab_max_bitrate_dl = 0;
lc_config[j]->e_rab_max_bitrate_dl = 0;
//TODO: Set the guaranteed bitrate (UL)
lc_config[j]->has_e_rab_guaranteed_bitrate_ul = 1;
lc_config[j]->e_rab_guaranteed_bitrate_ul = 1;
lc_config[j]->has_e_rab_guaranteed_bitrate_ul = 0;
lc_config[j]->e_rab_guaranteed_bitrate_ul = 0;
//TODO: Set the guaranteed bitrate (DL)
lc_config[j]->has_e_rab_guaranteed_bitrate_dl = 1;
lc_config[j]->e_rab_guaranteed_bitrate_dl = 1;
lc_config[j]->has_e_rab_guaranteed_bitrate_dl = 0;
lc_config[j]->e_rab_guaranteed_bitrate_dl = 0;
}
}
lc_ue_config[i]->lc_config = lc_config;
......@@ -1608,7 +1581,6 @@ int enb_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__Flexra
protocol__flex_ue_config_reply__init(ue_config_reply_msg);
ue_config_reply_msg->header = header;
//TODO: Fill in the actual number of UEs that are currently connected
ue_config_reply_msg->n_ue_config = get_num_ues(mod_id);
Protocol__FlexUeConfig **ue_config;
......@@ -1620,23 +1592,22 @@ int enb_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__Flexra
for (i = 0; i < ue_config_reply_msg->n_ue_config; i++) {
ue_config[i] = malloc(sizeof(Protocol__FlexUeConfig));
protocol__flex_ue_config__init(ue_config[i]);
//TODO: Set the RNTI of the ue with id i
ue_config[i]->rnti = get_ue_crnti(mod_id,i);
ue_config[i]->has_rnti = 1;
//TODO: Set the DRX configuration (optional)
//Not supported for now, so we do not set it
//TODO: Set the time_alignment_timer
if(get_time_alignment_timer(mod_id,i) != -1){
ue_config[i]->time_alignment_timer = get_time_alignment_timer(mod_id,i);
ue_config[i]->has_time_alignment_timer = 1;
}
//TODO: Set the measurement gap configuration pattern
if(get_meas_gap_config(mod_id,i) != -1){
ue_config[i]->meas_gap_config_pattern = get_meas_gap_config(mod_id,i);
ue_config[i]->has_meas_gap_config_pattern = 1;
}
//TODO: Set the measurement gap offset if applicable
if(ue_config[i]->has_meas_gap_config_pattern == 1 &&
ue_config[i]->meas_gap_config_pattern != PROTOCOL__FLEX_MEAS_GAP_CONFIG_PATTERN__FLMGCP_OFF) {
ue_config[i]->meas_gap_config_sf_offset = get_meas_gap_config_offset(mod_id,i);
......@@ -1651,82 +1622,78 @@ int enb_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__Flexra
//TODO: Set the CQI configuration (Optional)
//We do not set it for now
//TODO: Set the transmission mode
if(get_ue_transmission_mode(mod_id,i) != -1){
ue_config[i]->transmission_mode = get_ue_transmission_mode(mod_id,i);
ue_config[i]->has_transmission_mode = 1;
}
//TODO: Set the aggregated bit-rate of the non-gbr bearer (UL)
ue_config[i]->ue_aggregated_max_bitrate_ul = get_ue_aggregated_max_bitrate_ul(mod_id,i);
ue_config[i]->has_ue_aggregated_max_bitrate_ul = 1;
//TODO: Set the aggregated bit-rate of the non-gbr bearer (DL)
ue_config[i]->ue_aggregated_max_bitrate_dl = get_ue_aggregated_max_bitrate_dl(mod_id,i);
ue_config[i]->has_ue_aggregated_max_bitrate_dl = 1;
//TODO: Set the UE capabilities
Protocol__FlexUeCapabilities *capabilities;
capabilities = malloc(sizeof(Protocol__FlexUeCapabilities));
protocol__flex_ue_capabilities__init(capabilities);
//TODO: Set half duplex (FDD operation)
capabilities->has_half_duplex = 1;
capabilities->half_duplex = 1;//get_half_duplex(i);
capabilities->has_half_duplex = 0;
capabilities->half_duplex = 0;//get_half_duplex(i);
//TODO: Set intra-frame hopping flag
capabilities->has_intra_sf_hopping = 1;
capabilities->has_intra_sf_hopping = 0;
capabilities->intra_sf_hopping = 1;//get_intra_sf_hopping(i);
//TODO: Set support for type 2 hopping with n_sb > 1
capabilities->has_type2_sb_1 = 1;
capabilities->has_type2_sb_1 = 0;
capabilities->type2_sb_1 = 1;//get_type2_sb_1(i);
//TODO: Set ue category
capabilities->has_ue_category = 1;
capabilities->has_ue_category = 0;
capabilities->ue_category = 1;//get_ue_category(i);
//TODO: Set UE support for resource allocation type 1
capabilities->has_res_alloc_type1 = 1;
capabilities->has_res_alloc_type1 = 0;
capabilities->res_alloc_type1 = 1;//get_res_alloc_type1(i);
//Set the capabilites to the message
ue_config[i]->capabilities = capabilities;
//TODO: Set UE transmission antenna. One of the FLUTA_* values
if(get_ue_transmission_antenna(mod_id,i) != -1){
ue_config[i]->has_ue_transmission_antenna = 1;
ue_config[i]->ue_transmission_antenna = get_ue_transmission_antenna(mod_id,i);
}
//TODO: Set tti bundling flag (See ts 36.321)
if(get_tti_bundling(mod_id,i) != -1){
ue_config[i]->has_tti_bundling = 1;
ue_config[i]->tti_bundling = get_tti_bundling(mod_id,i);
}
//TODO: Set the max HARQ retransmission for the UL
if(get_maxHARQ_TX(mod_id,i) != -1){
ue_config[i]->has_max_harq_tx = 1;
ue_config[i]->max_harq_tx = get_maxHARQ_TX(mod_id,i);
}
//TODO: Fill beta_offset_ack_index (TS 36.213)
if(get_beta_offset_ack_index(mod_id,i) != -1){
ue_config[i]->has_beta_offset_ack_index = 1;
ue_config[i]->beta_offset_ack_index = get_beta_offset_ack_index(mod_id,i);
}
//TODO: Fill beta_offset_ri_index (TS 36.213)
if(get_beta_offset_ri_index(mod_id,i) != -1){
ue_config[i]->has_beta_offset_ri_index = 1;
ue_config[i]->beta_offset_ri_index = get_beta_offset_ri_index(mod_id,i);
}
//TODO: Fill beta_offset_cqi_index (TS 36.213)
if(get_beta_offset_cqi_index(mod_id,i) != -1){
ue_config[i]->has_beta_offset_cqi_index = 1;
ue_config[i]->beta_offset_cqi_index = get_beta_offset_cqi_index(mod_id,i);
}
//TODO: Fill ack_nack_simultaneous_trans (TS 36.213)
}
if(get_ack_nack_simultaneous_trans(mod_id,i) != -1){
ue_config[i]->has_ack_nack_simultaneous_trans = 1;
ue_config[i]->ack_nack_simultaneous_trans = get_ack_nack_simultaneous_trans(mod_id,i);
}
//TODO: Fill simultaneous_ack_nack_cqi (TS 36.213)
if(get_simultaneous_ack_nack_cqi(mod_id,i) != -1){
ue_config[i]->has_simultaneous_ack_nack_cqi = 1;
ue_config[i]->simultaneous_ack_nack_cqi = get_simultaneous_ack_nack_cqi(mod_id,i);
}
//TODO: Set FLACRM_* value regarding aperiodic cqi report mode
if(get_aperiodic_cqi_rep_mode(mod_id,i) != -1){
ue_config[i]->has_aperiodic_cqi_rep_mode = 1;
int mode = get_aperiodic_cqi_rep_mode(mod_id,i);
......@@ -1736,17 +1703,17 @@ int enb_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__Flexra
ue_config[i]->aperiodic_cqi_rep_mode = mode;
}
}
//TODO: Set tdd_ack_nack_feedback
if(get_tdd_ack_nack_feedback(mod_id, i) != -1){
ue_config[i]->has_tdd_ack_nack_feedback = 1;
ue_config[i]->tdd_ack_nack_feedback = get_tdd_ack_nack_feedback(mod_id,i);
}
//TODO: Set ack_nack_repetition factor
if(get_ack_nack_repetition_factor(mod_id, i) != -1){
ue_config[i]->has_ack_nack_repetition_factor = 1;
ue_config[i]->ack_nack_repetition_factor = get_ack_nack_repetition_factor(mod_id,i);
}
//TODO: Set extended BSR size
if(get_extended_bsr_size(mod_id, i) != -1){
ue_config[i]->has_extended_bsr_size = 1;
ue_config[i]->extended_bsr_size = get_extended_bsr_size(mod_id,i);
......@@ -1754,18 +1721,18 @@ int enb_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__Flexra
//TODO: Set carrier aggregation support (boolean)
ue_config[i]->has_ca_support = 0;
ue_config[i]->ca_support = 0;
//TODO: Set index of primary cell
ue_config[i]->has_pcell_carrier_index = 1;
ue_config[i]->pcell_carrier_index = UE_PCCID(mod_id, i);
if(ue_config[i]->has_ca_support){
//TODO: Set cross carrier scheduling support (boolean)
ue_config[i]->has_cross_carrier_sched_support = 1;
ue_config[i]->has_cross_carrier_sched_support = 0;
ue_config[i]->cross_carrier_sched_support = 0;
//TODO: Set secondary cells configuration
// We do not set it for now. No carrier aggregation support
//TODO: Set deactivation timer for secondary cell
ue_config[i]->has_scell_deactivation_timer = 1;
ue_config[i]->scell_deactivation_timer = 1;
ue_config[i]->has_scell_deactivation_timer = 0;
ue_config[i]->scell_deactivation_timer = 0;
}
}
ue_config_reply_msg->ue_config = ue_config;
......@@ -1871,26 +1838,26 @@ int enb_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__Flexr
for(i = 0; i < enb_config_reply_msg->n_cell_config; i++){
cell_conf[i] = malloc(sizeof(Protocol__FlexCellConfig));
protocol__flex_cell_config__init(cell_conf[i]);
//TODO: Fill in with actual value, the PCI of this cell
cell_conf[i]->phy_cell_id = 1;
cell_conf[i]->has_phy_cell_id = get_cell_id(enb_id,i);
//TODO: Fill in with actual value, the PLMN cell id of this cell
cell_conf[i]->cell_id = i;
cell_conf[i]->has_cell_id = 1;
//TODO: Fill in with actual value, PUSCH resources in RBs for hopping
cell_conf[i]->pusch_hopping_offset = get_hopping_offset(enb_id,i);
cell_conf[i]->has_pusch_hopping_offset = 1;
//TODO: Fill in with actual value
if(get_hopping_mode(enb_id,i) == 0){
cell_conf[i]->hopping_mode = PROTOCOL__FLEX_HOPPING_MODE__FLHM_INTER;
}else if(get_hopping_mode(enb_id,i) == 1){
cell_conf[i]->hopping_mode = PROTOCOL__FLEX_HOPPING_MODE__FLHM_INTERINTRA;
}
cell_conf[i]->has_hopping_mode = 1;
//TODO: Fill in with actual value, the number of subbands
cell_conf[i]->n_sb = get_n_SB(enb_id,i);
cell_conf[i]->has_n_sb = 1;
//TODO: Fill in with actual value, The number of resource element groups used for PHICH. One of FLPR_
if(get_phich_resource(enb_id,i) == 0){
cell_conf[i]->phich_resource = PROTOCOL__FLEX_PHICH_RESOURCE__FLPR_ONE_SIXTH; //0
}else if (get_phich_resource(enb_id,i) == 1){
......@@ -1901,7 +1868,7 @@ int enb_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__Flexr
cell_conf[i]->phich_resource = PROTOCOL__FLEX_PHICH_RESOURCE__FLPR_TWO;//3
}
cell_conf[i]->has_phich_resource = 1;
//TODO: Fill in with actual value, one of the FLPD_ values
if(get_phich_duration(enb_id,i) == 0){
cell_conf[i]->phich_duration = PROTOCOL__FLEX_PHICH_DURATION__FLPD_NORMAL;
}else if(get_phich_duration(enb_id,i) == 1){
......@@ -1910,7 +1877,7 @@ int enb_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__Flexr
cell_conf[i]->has_phich_duration = 1;
//TODO: Fill in with actual value, See TS 36.211, section 6.9
cell_conf[i]->init_nr_pdcch_ofdm_sym = get_num_pdcch_symb(enb_id,i);
cell_conf[i]->has_init_nr_pdcch_ofdm_sym = 1;
cell_conf[i]->has_init_nr_pdcch_ofdm_sym = 0;
//TODO: Fill in with actual value
/* Protocol__FlexSiConfig *si_config; */
/* si_config = malloc(sizeof(Protocol__FlexSiConfig)); */
......@@ -1949,20 +1916,19 @@ int enb_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__Flexr
/* } */
/* cell_conf[i]->si_config = si_config; */
//TODO: Fill in with actual value, the DL transmission bandwidth in RBs
cell_conf[i]->dl_bandwidth = get_N_RB_DL(enb_id,i);
cell_conf[i]->has_dl_bandwidth = 1;
//TODO: Fill in with actual value, the UL transmission bandwidth in RBs
cell_conf[i]->ul_bandwidth = get_N_RB_UL(enb_id,i);
cell_conf[i]->has_ul_bandwidth = 1;
//TODO: Fill in with actual value, one of FLUCPL values
if(get_ul_cyclic_prefix_length(enb_id,i) == 0){
cell_conf[i]->ul_cyclic_prefix_length = PROTOCOL__FLEX_UL_CYCLIC_PREFIX_LENGTH__FLUCPL_NORMAL;
}else if(get_ul_cyclic_prefix_length(enb_id,i) == 1){
cell_conf[i]->ul_cyclic_prefix_length = PROTOCOL__FLEX_UL_CYCLIC_PREFIX_LENGTH__FLUCPL_EXTENDED;
}
cell_conf[i]->has_ul_cyclic_prefix_length = 1;
//TODO: Fill in with actual value, one of FLUCPL values
if(get_ul_cyclic_prefix_length(enb_id,i) == 0){
cell_conf[i]->ul_cyclic_prefix_length = PROTOCOL__FLEX_DL_CYCLIC_PREFIX_LENGTH__FLDCPL_NORMAL;
}else if(get_ul_cyclic_prefix_length(enb_id,i) == 1){
......@@ -1970,10 +1936,10 @@ int enb_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__Flexr
}
cell_conf[i]->has_dl_cyclic_prefix_length = 1;
//TODO: Fill in with actual value, number of cell specific antenna ports
//TODO: Fill in with actual value, number of cell specific antenna ports. Currently single port support
cell_conf[i]->antenna_ports_count = 1;
cell_conf[i]->has_antenna_ports_count = 1;
//TODO: Fill in with actual value, one of FLDM values
if(get_duplex_mode(enb_id,i) == 1){
cell_conf[i]->duplex_mode = PROTOCOL__FLEX_DUPLEX_MODE__FLDM_FDD;
}else if(get_duplex_mode(enb_id,i) == 0){
......@@ -1982,10 +1948,10 @@ int enb_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__Flexr
cell_conf[i]->has_duplex_mode = 1;
//TODO: Fill in with actual value, DL/UL subframe assignment. TDD only
cell_conf[i]->subframe_assignment = get_subframe_assignment(enb_id,i);
cell_conf[i]->has_subframe_assignment = 1;
cell_conf[i]->has_subframe_assignment = 0;
//TODO: Fill in with actual value, TDD only. See TS 36.211, table 4.2.1
cell_conf[i]->special_subframe_patterns = get_special_subframe_assignment(enb_id,i);
cell_conf[i]->has_special_subframe_patterns = 1;
cell_conf[i]->has_special_subframe_patterns = 0;
//TODO: Fill in with actual value, The MBSFN radio frame period
cell_conf[i]->n_mbsfn_subframe_config_rfperiod = 5;
uint32_t *elem_rfperiod;
......@@ -2019,47 +1985,46 @@ int enb_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__Flexr
}
cell_conf[i]->mbsfn_subframe_config_sfalloc = elem_sfalloc;
//TODO: Fill in with actual value, See TS 36.211, section 5.7.1
cell_conf[i]->prach_config_index = get_prach_ConfigIndex(enb_id,i);
cell_conf[i]->has_prach_config_index = 1;
//TODO: Fill in with actual value, See TS 36.211, section 5.7.1
cell_conf[i]->prach_freq_offset = get_prach_FreqOffset(enb_id,i);
cell_conf[i]->has_prach_freq_offset = 1;
//TODO: Fill in with actual value, Duration of RA response window in SF
cell_conf[i]->ra_response_window_size = get_ra_ResponseWindowSize(enb_id,i);
cell_conf[i]->has_ra_response_window_size = 1;
//TODO: Fill in with actual value, Timer used for RA
cell_conf[i]->mac_contention_resolution_timer = get_mac_ContentionResolutionTimer(enb_id,i);
cell_conf[i]->has_mac_contention_resolution_timer = 1;
//TODO: Fill in with actual value, See TS 36.321
cell_conf[i]->max_harq_msg3tx = get_maxHARQ_Msg3Tx(enb_id,i);
cell_conf[i]->has_max_harq_msg3tx = 1;
//TODO: Fill in with actual value, See TS 36.213, section 10.1
cell_conf[i]->n1pucch_an = get_n1pucch_an(enb_id,i);
cell_conf[i]->has_n1pucch_an = 1;
//TODO: Fill in with actual value, See TS 36.211, section 5.4
cell_conf[i]->deltapucch_shift = get_deltaPUCCH_Shift(enb_id,i);
cell_conf[i]->has_deltapucch_shift = 1;
//TODO: Fill in with actual value, See TS 36.211, section 5.4
cell_conf[i]->nrb_cqi = get_nRB_CQI(enb_id,i);
cell_conf[i]->has_nrb_cqi = 1;
//TODO: Fill in with actual value, See TS 36.211, table 5.5.3.3-1 and 2
cell_conf[i]->srs_subframe_config = get_srs_SubframeConfig(enb_id,i);
cell_conf[i]->has_srs_subframe_config = 1;
//TODO: Fill in with actual value, See TS 36.211, section 5.5.3.2
cell_conf[i]->srs_bw_config = get_srs_BandwidthConfig(enb_id,i);
cell_conf[i]->has_srs_bw_config = 1;
//TODO: Fill in with actual value, Boolean value. See TS 36.211, section 5.5.3.2. TDD only
cell_conf[i]->srs_mac_up_pts = get_srs_MaxUpPts(enb_id,i);
cell_conf[i]->has_srs_mac_up_pts = 1;
//TODO: Fill in with actual value, One of the FLEQ_ values
if(get_enable64QAM(enb_id,i) == 0){
cell_conf[i]->enable_64qam = PROTOCOL__FLEX_QAM__FLEQ_MOD_16QAM;
}else if(get_enable64QAM(enb_id,i) == 1){
cell_conf[i]->enable_64qam = PROTOCOL__FLEX_QAM__FLEQ_MOD_64QAM;
}
cell_conf[i]->has_enable_64qam = 1;
//TODO: Fill in with actual value, Carrier component index
cell_conf[i]->carrier_index = i;
cell_conf[i]->has_carrier_index = 1;
}
......@@ -2088,6 +2053,11 @@ int enb_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__Flexr
}
/*
* timer primitives
*/
//struct enb_agent_map agent_map;
enb_agent_timer_instance_t timer_instance;
int agent_timer_init = 0;
......@@ -2099,11 +2069,6 @@ err_code_t enb_agent_init_timer(void){
agent_timer_init = 1;
}
/*
struct enb_agent_timer_element_s e;
memset(&e, 0, sizeof(enb_agent_timer_element_t));
RB_INSERT(enb_agent_map, &agent_map, &e);
*/
return PROTOCOL__FLEXRAN_ERR__NO_ERR;
}
......@@ -2249,13 +2214,6 @@ void enb_agent_sleep_until(struct timespec *ts, int delay) {
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, ts, NULL);
}
/*
int i =0;
RB_FOREACH(e, enb_agent_map, &enb_agent_head) {
printf("%d: %p\n", i, e); i++;
}
*/
err_code_t enb_agent_stop_timer(long timer_id){
......@@ -2283,39 +2241,3 @@ struct enb_agent_timer_element_s * get_timer_entry(long timer_id) {
return RB_FIND(enb_agent_map, &timer_instance.enb_agent_head, &search);
}
/*
// this will change the timer_id
err_code_t enb_agent_restart_timer(uint32_t *timer_id){
struct enb_agent_timer_element_s *e=NULL;
RB_FOREACH(e, enb_agent_map, &enb_agent_head) {
if (e->timer_id == timer_id)
break;
}
if (e != NULL ) {
e->state = ENB_AGENT_TIMER_STATE_ACTIVE;
}
ret = timer_setup(e->interval_sec,
e->interval_usec,
e->agent_id,
e->instance,
e->type,
e->timer_args,
&timer_id);
}
if (ret < 0 ) {
return PROTOCOL__FLEXRAN_ERR__TIMER_SETUP_FAILED;
}
return 0;
}
*/
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment