Commit 612ab055 authored by Navid Nikaein's avatar Navid Nikaein Committed by Robert Schmidt

Add control logic to reconfigure and start eNB

parent 6e6a462d
...@@ -55,6 +55,17 @@ ...@@ -55,6 +55,17 @@
extern unsigned char NB_eNB_INST; extern unsigned char NB_eNB_INST;
#endif #endif
extern volatile int node_control_state;
static void enb_app_wait_reconfig_cmd (void)
{
LOG_I(ENB_APP, "ENB APP await reconfiguration command\n");
while (node_control_state == ENB_WAIT_RECONFIGURATION_CMD) {
usleep(200000);
}
sleep(2); // wait for createing other tasks
}
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
...@@ -270,7 +281,7 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, con ...@@ -270,7 +281,7 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, con
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
void *eNB_app_task(void *args_p) void *eNB_app_task(void *args_p)
{ {
const Enb_properties_array_t *enb_properties_p = NULL; Enb_properties_array_t *enb_properties_p = NULL;
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
uint32_t enb_nb = 1; /* Default number of eNB is 1 */ uint32_t enb_nb = 1; /* Default number of eNB is 1 */
uint32_t enb_id_start = 0; uint32_t enb_id_start = 0;
...@@ -309,19 +320,28 @@ void *eNB_app_task(void *args_p) ...@@ -309,19 +320,28 @@ void *eNB_app_task(void *args_p)
"Number of eNB is greater than eNB defined in configuration file (%d/%d)!", "Number of eNB is greater than eNB defined in configuration file (%d/%d)!",
enb_nb, enb_properties_p->number); enb_nb, enb_properties_p->number);
for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) {
configure_phy(enb_id, enb_properties_p);
configure_rrc(enb_id, enb_properties_p);
}
#if defined (FLEXRAN_AGENT_SB_IF) #if defined (FLEXRAN_AGENT_SB_IF)
for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) { for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) {
printf("\n start enb agent %d\n", enb_id);
flexran_agent_start(enb_id, enb_properties_p); flexran_agent_start(enb_id, enb_properties_p);
} }
// wait for config comd from the controller/network app
enb_app_wait_reconfig_cmd();
// set again the ran api vars
for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) {
printf("\n set again enb vars %d\n", enb_id);
flexran_set_enb_vars(enb_id, RAN_LTE_OAI);
}
#endif #endif
for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) {
configure_phy(enb_id, enb_properties_p);
configure_rrc(enb_id, enb_properties_p);
}
# if defined(ENABLE_USE_MME) # if defined(ENABLE_USE_MME)
/* Try to register each eNB */ /* Try to register each eNB */
registered_enb = 0; registered_enb = 0;
......
...@@ -197,6 +197,7 @@ ...@@ -197,6 +197,7 @@
#define ENB_CONFIG_STRING_FLEXRAN_AGENT_IPV4_ADDRESS "FLEXRAN_AGENT_IPV4_ADDRESS" #define ENB_CONFIG_STRING_FLEXRAN_AGENT_IPV4_ADDRESS "FLEXRAN_AGENT_IPV4_ADDRESS"
#define ENB_CONFIG_STRING_FLEXRAN_AGENT_PORT "FLEXRAN_AGENT_PORT" #define ENB_CONFIG_STRING_FLEXRAN_AGENT_PORT "FLEXRAN_AGENT_PORT"
#define ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE "FLEXRAN_AGENT_CACHE" #define ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE "FLEXRAN_AGENT_CACHE"
#define ENB_CONFIG_STRING_FLEXRAN_AGENT_AWAIT_RECONF "FLEXRAN_AGENT_AWAIT_RECONF"
#define ENB_CONFIG_STRING_RRH_GW_CONFIG "rrh_gw_config" #define ENB_CONFIG_STRING_RRH_GW_CONFIG "rrh_gw_config"
#define ENB_CONFIG_STRING_RRH_GW_LOCAL_IF_NAME "local_if_name" #define ENB_CONFIG_STRING_RRH_GW_LOCAL_IF_NAME "local_if_name"
...@@ -351,6 +352,8 @@ void enb_config_display(void) ...@@ -351,6 +352,8 @@ void enb_config_display(void)
// printf( "\tInterface IP Address: \t%s:\n",enb_properties.properties[i]->flexran_agent_ipv4_address); // printf( "\tInterface IP Address: \t%s:\n",enb_properties.properties[i]->flexran_agent_ipv4_address);
printf( "\tInterface PORT: \t%d:\n\n",enb_properties.properties[i]->flexran_agent_port); printf( "\tInterface PORT: \t%d:\n\n",enb_properties.properties[i]->flexran_agent_port);
printf( "\tCache directory: \t%s:\n",enb_properties.properties[i]->flexran_agent_cache); printf( "\tCache directory: \t%s:\n",enb_properties.properties[i]->flexran_agent_cache);
printf( "\teNB Control State: \t%s:\n",(enb_properties.properties[i]->flexran_agent_reconf==0)? "ENB_NORMAL_OPERATION":"ENB_WAIT_RECONFIGURATION_CMD");
#endif #endif
...@@ -536,7 +539,7 @@ extern int asn1_xer_print; ...@@ -536,7 +539,7 @@ extern int asn1_xer_print;
#else #else
#define libconfig_int int #define libconfig_int int
#endif #endif
const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
{ {
config_t cfg; config_t cfg;
config_setting_t *setting = NULL; config_setting_t *setting = NULL;
...@@ -689,6 +692,8 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) ...@@ -689,6 +692,8 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
char* flexran_agent_ipv4_address = NULL; char* flexran_agent_ipv4_address = NULL;
libconfig_int flexran_agent_port = 0; libconfig_int flexran_agent_port = 0;
char* flexran_agent_cache = NULL; char* flexran_agent_cache = NULL;
char* flexran_agent_reconf = NULL;
libconfig_int otg_ue_id = 0; libconfig_int otg_ue_id = 0;
char* otg_app_type = NULL; char* otg_app_type = NULL;
char* otg_bg_traffic = NULL; char* otg_bg_traffic = NULL;
...@@ -2580,6 +2585,9 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) ...@@ -2580,6 +2585,9 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
&flexran_agent_port) &flexran_agent_port)
&& config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE, && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE,
(const char **)&flexran_agent_cache) (const char **)&flexran_agent_cache)
&& config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_AWAIT_RECONF,
(const char **)&flexran_agent_reconf)
) )
) { ) {
enb_properties.properties[enb_properties_index]->flexran_agent_interface_name = strdup(flexran_agent_interface_name); enb_properties.properties[enb_properties_index]->flexran_agent_interface_name = strdup(flexran_agent_interface_name);
...@@ -2592,6 +2600,12 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) ...@@ -2592,6 +2600,12 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
enb_properties.properties[enb_properties_index]->flexran_agent_port = flexran_agent_port; enb_properties.properties[enb_properties_index]->flexran_agent_port = flexran_agent_port;
enb_properties.properties[enb_properties_index]->flexran_agent_cache = strdup(flexran_agent_cache); enb_properties.properties[enb_properties_index]->flexran_agent_cache = strdup(flexran_agent_cache);
if ((strcmp(flexran_agent_reconf, "yes") == 0) || (strcmp(flexran_agent_reconf, "YES") == 0)){
enb_properties.properties[enb_properties_index]->flexran_agent_reconf = 1;
} else {
enb_properties.properties[enb_properties_index]->flexran_agent_reconf = 0;
}
} }
} }
...@@ -2885,7 +2899,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) ...@@ -2885,7 +2899,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
} }
const Enb_properties_array_t *enb_config_get(void) Enb_properties_array_t *enb_config_get(void)
{ {
return &enb_properties; return &enb_properties;
} }
......
...@@ -237,6 +237,8 @@ typedef struct Enb_properties_s { ...@@ -237,6 +237,8 @@ typedef struct Enb_properties_s {
in_addr_t flexran_agent_ipv4_address; in_addr_t flexran_agent_ipv4_address;
tcp_udp_port_t flexran_agent_port; tcp_udp_port_t flexran_agent_port;
char *flexran_agent_cache; char *flexran_agent_cache;
int flexran_agent_reconf;
/* Nb of RRH to connect to */ /* Nb of RRH to connect to */
uint8_t nb_rrh_gw; uint8_t nb_rrh_gw;
...@@ -276,15 +278,20 @@ typedef struct Enb_properties_s { ...@@ -276,15 +278,20 @@ typedef struct Enb_properties_s {
#endif #endif
} Enb_properties_t; } Enb_properties_t;
typedef enum {
ENB_NORMAL_OPERATION=0x0,
ENB_WAIT_RECONFIGURATION_CMD=0x1
} ENB_MODULE_STATE;
typedef struct Enb_properties_array_s { typedef struct Enb_properties_array_s {
int number; int number;
Enb_properties_t *properties[MAX_ENB]; Enb_properties_t *properties[MAX_ENB];
} Enb_properties_array_t; } Enb_properties_array_t;
void enb_config_display(void); void enb_config_display(void);
const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP); Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP);
const Enb_properties_array_t *enb_config_get(void); Enb_properties_array_t *enb_config_get(void);
#endif /* ENB_CONFIG_H_ */ #endif /* ENB_CONFIG_H_ */
/** @} */ /** @} */
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#include "flexran_agent_common_internal.h" #include "flexran_agent_common_internal.h"
#include "flexran_agent_mac_internal.h" #include "flexran_agent_mac_internal.h"
extern volatile int reconfigure_enb; extern volatile int node_control_state;
int apply_reconfiguration_policy(mid_t mod_id, const char *policy, size_t policy_length) { int apply_reconfiguration_policy(mid_t mod_id, const char *policy, size_t policy_length) {
...@@ -72,8 +72,8 @@ int apply_reconfiguration_policy(mid_t mod_id, const char *policy, size_t policy ...@@ -72,8 +72,8 @@ int apply_reconfiguration_policy(mid_t mod_id, const char *policy, size_t policy
if (parse_enb_id(mod_id, &parser) == -1) { if (parse_enb_id(mod_id, &parser) == -1) {
goto error; goto error;
} else { // succeful parse and setting } else { // succeful parse and setting
LOG_I(ENB_APP, "Successful parsed config for enb system\n"); node_control_state= ENB_NORMAL_OPERATION;
//reconfigure_enb=RECONF_FREQ; LOG_I(ENB_APP, "Successful parsed config for enb system, entering normal state\n");
} }
} else if (strcmp((char *) event.data.scalar.value, "mac") == 0) { } else if (strcmp((char *) event.data.scalar.value, "mac") == 0) {
LOG_D(ENB_APP, "This is intended for the mac system\n"); LOG_D(ENB_APP, "This is intended for the mac system\n");
...@@ -258,6 +258,9 @@ int parse_enb_config_parameters(mid_t mod_id, yaml_parser_t *parser) { ...@@ -258,6 +258,9 @@ int parse_enb_config_parameters(mid_t mod_id, yaml_parser_t *parser) {
yaml_event_delete(&event); yaml_event_delete(&event);
} }
/* reflect in RAN API */
flexran_set_enb_vars(mod_id, RAN_LTE_OAI);
return 0; return 0;
error: error:
......
...@@ -131,6 +131,7 @@ int UE_num_active_CC(UE_list_t *listP,int ue_idP) ...@@ -131,6 +131,7 @@ int UE_num_active_CC(UE_list_t *listP,int ue_idP)
int UE_PCCID(module_id_t mod_idP,int ue_idP) int UE_PCCID(module_id_t mod_idP,int ue_idP)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
if (eNB_mac_inst == NULL) return 0;
return(eNB_mac_inst[mod_idP].UE_list.pCC_id[ue_idP]); return(eNB_mac_inst[mod_idP].UE_list.pCC_id[ue_idP]);
} }
...@@ -139,6 +140,7 @@ rnti_t UE_RNTI(module_id_t mod_idP, int ue_idP) ...@@ -139,6 +140,7 @@ rnti_t UE_RNTI(module_id_t mod_idP, int ue_idP)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
if (eNB_mac_inst == NULL) return 0;
rnti_t rnti = eNB_mac_inst[mod_idP].UE_list.UE_template[UE_PCCID(mod_idP,ue_idP)][ue_idP].rnti; rnti_t rnti = eNB_mac_inst[mod_idP].UE_list.UE_template[UE_PCCID(mod_idP,ue_idP)][ue_idP].rnti;
if (rnti>0) { if (rnti>0) {
...@@ -154,6 +156,7 @@ rnti_t UE_RNTI(module_id_t mod_idP, int ue_idP) ...@@ -154,6 +156,7 @@ rnti_t UE_RNTI(module_id_t mod_idP, int ue_idP)
boolean_t is_UE_active(module_id_t mod_idP, int ue_idP) boolean_t is_UE_active(module_id_t mod_idP, int ue_idP)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
if (eNB_mac_inst == NULL) return 0;
return(eNB_mac_inst[mod_idP].UE_list.active[ue_idP]); return(eNB_mac_inst[mod_idP].UE_list.active[ue_idP]);
} }
...@@ -182,6 +185,7 @@ uint8_t find_active_UEs(module_id_t module_idP,int CC_id){ ...@@ -182,6 +185,7 @@ uint8_t find_active_UEs(module_id_t module_idP,int CC_id){
int UE_BSR (uint8_t mod_id, uint8_t ue_id, uint8_t lcid) { int UE_BSR (uint8_t mod_id, uint8_t ue_id, uint8_t lcid) {
if (eNB_mac_inst == NULL) return 0;
return eNB_mac_inst[mod_id].UE_list.UE_template[UE_PCCID(mod_id,ue_id)][ue_id].bsr_info[lcid]; return eNB_mac_inst[mod_id].UE_list.UE_template[UE_PCCID(mod_id,ue_id)][ue_id].bsr_info[lcid];
} }
......
...@@ -40,21 +40,24 @@ ...@@ -40,21 +40,24 @@
# endif # endif
# include "enb_app.h" # include "enb_app.h"
int create_tasks(uint32_t enb_nb, uint32_t ue_nb) int create_enb_app_task(uint32_t enb_nb)
{ {
itti_wait_ready(1);
if (itti_create_task (TASK_L2L1, l2l1_task, NULL) < 0) {
LOG_E(PDCP, "Create task for L2L1 failed\n");
return -1;
}
if (enb_nb > 0) { if (enb_nb > 0) {
/* Last task to create, others task must be ready before its start */
if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) { if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) {
LOG_E(ENB_APP, "Create task for eNB APP failed\n"); LOG_E(ENB_APP, "Create task for eNB APP failed\n");
return -1; return -1;
} }
} }
return 0;
}
int create_tasks(uint32_t enb_nb, uint32_t ue_nb)
{
itti_wait_ready(1);
if (itti_create_task (TASK_L2L1, l2l1_task, NULL) < 0) {
LOG_E(PDCP, "Create task for L2L1 failed\n");
return -1;
}
# ifdef OPENAIR2 # ifdef OPENAIR2
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
extern void *l2l1_task(void *arg); extern void *l2l1_task(void *arg);
int create_tasks(uint32_t enb_nb, uint32_t ue_nb); int create_tasks(uint32_t enb_nb, uint32_t ue_nb);
int create_enb_app_task(uint32_t enb_nb);
#endif #endif
#endif /* CREATE_TASKS_H_ */ #endif /* CREATE_TASKS_H_ */
...@@ -155,10 +155,11 @@ eNBs = ...@@ -155,10 +155,11 @@ eNBs =
NETWORK_CONTROLLER : NETWORK_CONTROLLER :
{ {
FLEXRAN_AGENT_INTERFACE_NAME = "eth1"; FLEXRAN_AGENT_INTERFACE_NAME = "lo";
FLEXRAN_AGENT_IPV4_ADDRESS = "10.0.2.5/30"; FLEXRAN_AGENT_IPV4_ADDRESS = "127.0.0.1/30";
FLEXRAN_AGENT_PORT = 2210; FLEXRAN_AGENT_PORT = 2210;
FLEXRAN_AGENT_CACHE = "/mnt/oai_agent_cache"; FLEXRAN_AGENT_CACHE = "/mnt/oai_agent_cache";
FLEXRAN_AGENT_AWAIT_RECONF = "no";
}; };
log_config : log_config :
...@@ -177,6 +178,7 @@ eNBs = ...@@ -177,6 +178,7 @@ eNBs =
pdcp_log_verbosity ="medium"; pdcp_log_verbosity ="medium";
rrc_log_level ="info"; rrc_log_level ="info";
rrc_log_verbosity ="medium"; rrc_log_verbosity ="medium";
}; };
} }
); );
...@@ -174,6 +174,8 @@ eNB_func_t node_function[MAX_NUM_CCs]; ...@@ -174,6 +174,8 @@ eNB_func_t node_function[MAX_NUM_CCs];
eNB_timing_t node_timing[MAX_NUM_CCs]; eNB_timing_t node_timing[MAX_NUM_CCs];
int16_t node_synch_ref[MAX_NUM_CCs]; int16_t node_synch_ref[MAX_NUM_CCs];
volatile int16_t node_control_state;
uint32_t target_dl_mcs = 28; //maximum allowed mcs uint32_t target_dl_mcs = 28; //maximum allowed mcs
uint32_t target_ul_mcs = 20; uint32_t target_ul_mcs = 20;
uint32_t timing_advance = 0; uint32_t timing_advance = 0;
...@@ -232,6 +234,12 @@ threads_t threads= {-1,-1,-1,-1,-1,-1,-1}; ...@@ -232,6 +234,12 @@ threads_t threads= {-1,-1,-1,-1,-1,-1,-1};
*/ */
uint8_t abstraction_flag=0; uint8_t abstraction_flag=0;
/* */
/* overrid the enb configuration params*/
static void reconfigure_enb_params(int enb_id);
/*---------------------BMC: timespec helpers -----------------------------*/ /*---------------------BMC: timespec helpers -----------------------------*/
struct timespec min_diff_time = { .tv_sec = 0, .tv_nsec = 0 }; struct timespec min_diff_time = { .tv_sec = 0, .tv_nsec = 0 };
...@@ -1080,11 +1088,20 @@ static void get_options (int argc, char **argv) { ...@@ -1080,11 +1088,20 @@ static void get_options (int argc, char **argv) {
"Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!", "Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!",
conf_config_file_name, NB_eNB_INST, enb_properties->number); conf_config_file_name, NB_eNB_INST, enb_properties->number);
NB_eNB_INST=enb_properties->number;
/* Update some simulation parameters */ /* Update some simulation parameters */
for (i=0; i < enb_properties->number; i++) { for (i=0; i < enb_properties->number; i++) {
AssertFatal (MAX_NUM_CCs == enb_properties->properties[i]->nb_cc, AssertFatal (MAX_NUM_CCs == enb_properties->properties[i]->nb_cc,
"lte-softmodem compiled with MAX_NUM_CCs=%d, but only %d CCs configured for eNB %d!", "lte-softmodem compiled with MAX_NUM_CCs=%d, but only %d CCs configured for eNB %d!",
MAX_NUM_CCs, enb_properties->properties[i]->nb_cc, i); MAX_NUM_CCs, enb_properties->properties[i]->nb_cc, i);
if (enb_properties->properties[i]->flexran_agent_reconf == 1) {
node_control_state = ENB_WAIT_RECONFIGURATION_CMD;
} else {
node_control_state = ENB_NORMAL_OPERATION;
}
eth_params = (eth_params_t*)malloc(enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t)); eth_params = (eth_params_t*)malloc(enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t));
memset(eth_params, 0, enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t)); memset(eth_params, 0, enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t));
...@@ -1133,35 +1150,7 @@ static void get_options (int argc, char **argv) { ...@@ -1133,35 +1150,7 @@ static void get_options (int argc, char **argv) {
} }
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { reconfigure_enb_params(i);
node_function[CC_id] = enb_properties->properties[i]->cc_node_function[CC_id];
node_timing[CC_id] = enb_properties->properties[i]->cc_node_timing[CC_id];
node_synch_ref[CC_id] = enb_properties->properties[i]->cc_node_synch_ref[CC_id];
frame_parms[CC_id]->frame_type = enb_properties->properties[i]->frame_type[CC_id];
frame_parms[CC_id]->tdd_config = enb_properties->properties[i]->tdd_config[CC_id];
frame_parms[CC_id]->tdd_config_S = enb_properties->properties[i]->tdd_config_s[CC_id];
frame_parms[CC_id]->Ncp = enb_properties->properties[i]->prefix_type[CC_id];
//for (j=0; j < enb_properties->properties[i]->nb_cc; j++ ){
frame_parms[CC_id]->Nid_cell = enb_properties->properties[i]->Nid_cell[CC_id];
frame_parms[CC_id]->N_RB_DL = enb_properties->properties[i]->N_RB_DL[CC_id];
frame_parms[CC_id]->N_RB_UL = enb_properties->properties[i]->N_RB_DL[CC_id];
frame_parms[CC_id]->nb_antennas_tx = enb_properties->properties[i]->nb_antennas_tx[CC_id];
frame_parms[CC_id]->nb_antenna_ports_eNB = enb_properties->properties[i]->nb_antenna_ports[CC_id];
frame_parms[CC_id]->nb_antennas_rx = enb_properties->properties[i]->nb_antennas_rx[CC_id];
frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex = enb_properties->properties[i]->prach_config_index[CC_id];
frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset = enb_properties->properties[i]->prach_freq_offset[CC_id];
frame_parms[CC_id]->mode1_flag = (frame_parms[CC_id]->nb_antenna_ports_eNB == 1) ? 1 : 0;
frame_parms[CC_id]->threequarter_fs = threequarter_fs;
//} // j
}
init_all_otg(0); init_all_otg(0);
g_otg->seed = 0; g_otg->seed = 0;
...@@ -1206,20 +1195,7 @@ static void get_options (int argc, char **argv) { ...@@ -1206,20 +1195,7 @@ static void get_options (int argc, char **argv) {
osa_log_verbosity = enb_properties->properties[i]->osa_log_verbosity; osa_log_verbosity = enb_properties->properties[i]->osa_log_verbosity;
#endif #endif
// adjust the log
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
for (k = 0 ; k < 4; k++) {
downlink_frequency[CC_id][k] = enb_properties->properties[i]->downlink_frequency[CC_id];
uplink_frequency_offset[CC_id][k] = enb_properties->properties[i]->uplink_frequency_offset[CC_id];
rx_gain[CC_id][k] = (double)enb_properties->properties[i]->rx_gain[CC_id];
tx_gain[CC_id][k] = (double)enb_properties->properties[i]->tx_gain[CC_id];
}
printf("Downlink frequency/ uplink offset of CC_id %d set to %ju/%d\n", CC_id,
enb_properties->properties[i]->downlink_frequency[CC_id],
enb_properties->properties[i]->uplink_frequency_offset[CC_id]);
} // CC_id
}// i }// i
//this is needed for phy-test option //this is needed for phy-test option
...@@ -1236,6 +1212,57 @@ static void get_options (int argc, char **argv) { ...@@ -1236,6 +1212,57 @@ static void get_options (int argc, char **argv) {
} }
} }
static void reconfigure_enb_params(int enb_id)
{
int CC_id, k;
const Enb_properties_array_t *enb_properties=enb_config_get();
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
node_function[CC_id] = enb_properties->properties[enb_id]->cc_node_function[CC_id];
node_timing[CC_id] = enb_properties->properties[enb_id]->cc_node_timing[CC_id];
node_synch_ref[CC_id] = enb_properties->properties[enb_id]->cc_node_synch_ref[CC_id];
frame_parms[CC_id]->frame_type = enb_properties->properties[enb_id]->frame_type[CC_id];
frame_parms[CC_id]->tdd_config = enb_properties->properties[enb_id]->tdd_config[CC_id];
frame_parms[CC_id]->tdd_config_S = enb_properties->properties[enb_id]->tdd_config_s[CC_id];
frame_parms[CC_id]->Ncp = enb_properties->properties[enb_id]->prefix_type[CC_id];
//for (j=0; j < enb_properties->properties[i]->nb_cc; j++ ){
frame_parms[CC_id]->Nid_cell = enb_properties->properties[enb_id]->Nid_cell[CC_id];
frame_parms[CC_id]->N_RB_DL = enb_properties->properties[enb_id]->N_RB_DL[CC_id];
frame_parms[CC_id]->N_RB_UL = enb_properties->properties[enb_id]->N_RB_DL[CC_id];
frame_parms[CC_id]->nb_antennas_tx = enb_properties->properties[enb_id]->nb_antennas_tx[CC_id];
frame_parms[CC_id]->nb_antenna_ports_eNB = enb_properties->properties[enb_id]->nb_antenna_ports[CC_id];
frame_parms[CC_id]->nb_antennas_rx = enb_properties->properties[enb_id]->nb_antennas_rx[CC_id];
frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex = enb_properties->properties[enb_id]->prach_config_index[CC_id];
frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset = enb_properties->properties[enb_id]->prach_freq_offset[CC_id];
frame_parms[CC_id]->mode1_flag = (frame_parms[CC_id]->nb_antenna_ports_eNB == 1) ? 1 : 0;
frame_parms[CC_id]->threequarter_fs = threequarter_fs;
for (k = 0 ; k < 4; k++) {
downlink_frequency[CC_id][k] = enb_properties->properties[enb_id]->downlink_frequency[CC_id];
uplink_frequency_offset[CC_id][k] = enb_properties->properties[enb_id]->uplink_frequency_offset[CC_id];
rx_gain[CC_id][k] = (double)enb_properties->properties[enb_id]->rx_gain[CC_id];
tx_gain[CC_id][k] = (double)enb_properties->properties[enb_id]->tx_gain[CC_id];
}
printf("Downlink frequency/ uplink offset of CC_id %d set to %ju/%d\n", CC_id,
enb_properties->properties[enb_id]->downlink_frequency[CC_id],
enb_properties->properties[enb_id]->uplink_frequency_offset[CC_id]);
init_ul_hopping(frame_parms[CC_id]);
init_frame_parms(frame_parms[CC_id],1);
// phy_init_top(frame_parms[CC_id]);
phy_init_lte_top(frame_parms[CC_id]);
} // CC_id
}
#if T_TRACER #if T_TRACER
int T_wait = 1; /* by default we wait for the tracer */ int T_wait = 1; /* by default we wait for the tracer */
int T_port = 2021; /* default port to listen to to wait for the tracer */ int T_port = 2021; /* default port to listen to to wait for the tracer */
...@@ -1395,6 +1422,19 @@ void init_openair0() { ...@@ -1395,6 +1422,19 @@ void init_openair0() {
} }
} }
/* check the state : either continue or wait for a command to start/stop the eNB
* if needed override the current configuration parameters, such as
* frequencies, bands, power, bandwidth
*/
static void ltesm_wait_reconfig_cmd(void)
{
LOG_I(ENB_APP, "LTE Softmodem wait reconfiguration command\n");
while (node_control_state == ENB_WAIT_RECONFIGURATION_CMD) {
usleep(200000);
}
}
int main( int argc, char **argv ) { int main( int argc, char **argv ) {
int i,j,k,aa,re; int i,j,k,aa,re;
#if defined (XFORMS) #if defined (XFORMS)
...@@ -1405,6 +1445,8 @@ int main( int argc, char **argv ) { ...@@ -1405,6 +1445,8 @@ int main( int argc, char **argv ) {
uint8_t abstraction_flag=0; uint8_t abstraction_flag=0;
uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2;
PHY_vars_eNB_g=NULL;
#if defined (XFORMS) #if defined (XFORMS)
int ret; int ret;
#endif #endif
...@@ -1570,11 +1612,6 @@ int main( int argc, char **argv ) { ...@@ -1570,11 +1612,6 @@ int main( int argc, char **argv ) {
LOG_I(PHY,"Set nb_rx_antenna %d , nb_tx_antenna %d \n",frame_parms[CC_id]->nb_antennas_rx, frame_parms[CC_id]->nb_antennas_tx); LOG_I(PHY,"Set nb_rx_antenna %d , nb_tx_antenna %d \n",frame_parms[CC_id]->nb_antennas_rx, frame_parms[CC_id]->nb_antennas_tx);
} }
init_ul_hopping(frame_parms[CC_id]);
init_frame_parms(frame_parms[CC_id],1);
// phy_init_top(frame_parms[CC_id]);
phy_init_lte_top(frame_parms[CC_id]);
} }
...@@ -1586,6 +1623,14 @@ int main( int argc, char **argv ) { ...@@ -1586,6 +1623,14 @@ int main( int argc, char **argv ) {
// N_ZC = (prach_fmt <4)?839:139; // N_ZC = (prach_fmt <4)?839:139;
} }
create_enb_app_task(UE_flag ? 0 : 1);
ltesm_wait_reconfig_cmd ();
// reconfigure_enb: 0 for wait, 1 for skip, and other values to reconfigure
for (i=0; (i < NB_eNB_INST && node_control_state == ENB_NORMAL_OPERATION ) ; i++){
reconfigure_enb_params(i);
printf("[ENB_APP] Reconfigured eNB module %d - continue\n", i);
}
if (UE_flag==1) { if (UE_flag==1) {
NB_UE_INST=1; NB_UE_INST=1;
NB_INST=1; NB_INST=1;
......
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