diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 1411355bc6d92b4a318b6d92138554c2cfc57818..1ae974ce8f7f92c009176678e1bb050c6365a208 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -60,63 +60,56 @@ extern char *g_conf_config_file_name; # endif /*------------------------------------------------------------------------------*/ -# if defined(ENABLE_USE_MME) -static uint32_t enb_nb = 1; /* Default number of eNB */ -# endif +static Enb_properties_t *enb_properties[MAX_ENB]; +static int enb_nb_properties; + +/*------------------------------------------------------------------------------*/ +static void configure_phy(uint32_t enb_id) +{ + MessageDef *msg_p; + + msg_p = itti_alloc_new_message (TASK_ENB_APP, PHY_CONFIGURATION_REQ); + PHY_CONFIGURATION_REQ (msg_p).frame_type = enb_properties[enb_id]->frame_type; + PHY_CONFIGURATION_REQ (msg_p).prefix_type = enb_properties[enb_id]->prefix_type; + PHY_CONFIGURATION_REQ (msg_p).downlink_frequency = enb_properties[enb_id]->downlink_frequency; + PHY_CONFIGURATION_REQ (msg_p).uplink_frequency_offset = enb_properties[enb_id]->uplink_frequency_offset; -extern Enb_properties_t *g_enb_properties[]; -extern int g_num_enb_properties; + itti_send_msg_to_task (TASK_PHY_ENB, enb_id, msg_p); +} /*------------------------------------------------------------------------------*/ -static void configure_rrc(void) +static void configure_rrc(uint32_t enb_id) { - uint32_t eNB_id_start = 0; - uint32_t eNB_id_end = 1; - uint32_t eNB_id; MessageDef *msg_p; -# if defined(OAI_EMU) - eNB_id_start = oai_emulation.info.first_enb_local; - eNB_id_end = oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local; -# endif + msg_p = itti_alloc_new_message (TASK_ENB_APP, RRC_CONFIGURATION_REQ); - for (eNB_id = eNB_id_start; (eNB_id < eNB_id_end) ; eNB_id++) - { - msg_p = itti_alloc_new_message (TASK_ENB_APP, RRC_CONFIGURATION_REQ); - - RRC_CONFIGURATION_REQ (msg_p).cell_identity = g_enb_properties[eNB_id]->eNB_id; - RRC_CONFIGURATION_REQ (msg_p).tac = g_enb_properties[eNB_id]->tac; - RRC_CONFIGURATION_REQ (msg_p).mcc = g_enb_properties[eNB_id]->mcc; - RRC_CONFIGURATION_REQ (msg_p).mnc = g_enb_properties[eNB_id]->mnc; + RRC_CONFIGURATION_REQ (msg_p).cell_identity = enb_properties[enb_id]->eNB_id; + RRC_CONFIGURATION_REQ (msg_p).tac = enb_properties[enb_id]->tac; + RRC_CONFIGURATION_REQ (msg_p).mcc = enb_properties[enb_id]->mcc; + RRC_CONFIGURATION_REQ (msg_p).mnc = enb_properties[enb_id]->mnc; - itti_send_msg_to_task (TASK_RRC_ENB, eNB_id, msg_p); - } + itti_send_msg_to_task (TASK_RRC_ENB, enb_id, msg_p); } +/*------------------------------------------------------------------------------*/ # if defined(ENABLE_USE_MME) -static uint32_t eNB_app_register() +static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end) { - uint32_t eNB_id_start = 0; - uint32_t eNB_id_end = 1; - uint32_t eNB_id; + uint32_t enb_id; uint32_t mme_id; MessageDef *msg_p; uint32_t register_enb_pending = 0; # if defined(OAI_EMU) - eNB_id_start = oai_emulation.info.first_enb_local; - eNB_id_end = oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local; - DevCheck(eNB_id_end <= NUMBER_OF_eNB_MAX, eNB_id_end, NUMBER_OF_eNB_MAX, 0); # endif - //DevCheck(eNB_id_end <= (sizeof(g_enb_properties) / sizeof(g_enb_properties[0])), eNB_id_end, (sizeof(g_enb_properties) / sizeof(g_enb_properties[0])), 0); - DevCheck((eNB_id_end - eNB_id_start) == g_num_enb_properties, eNB_id_end - eNB_id_start, g_num_enb_properties, 0); - 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++) { # if defined(OAI_EMU) - if (oai_emulation.info.cli_start_enb[eNB_id] == 1) + if (oai_emulation.info.cli_start_enb[enb_id] == 1) # endif { s1ap_register_enb_req_t *s1ap_register_eNB; @@ -124,7 +117,7 @@ static uint32_t eNB_app_register() /* Overwrite default eNB ID */ hash = s1ap_generate_eNB_id (); - g_enb_properties[eNB_id]->eNB_id = eNB_id + (hash & 0xFFFF8); + enb_properties[enb_id]->eNB_id = enb_id + (hash & 0xFFFF8); /* note: there is an implicit relationship between the data structure and the message name */ msg_p = itti_alloc_new_message (TASK_ENB_APP, S1AP_REGISTER_ENB_REQ); @@ -132,30 +125,30 @@ static uint32_t eNB_app_register() s1ap_register_eNB = &S1AP_REGISTER_ENB_REQ(msg_p); /* Some default/random parameters */ - s1ap_register_eNB->eNB_id = g_enb_properties[eNB_id]->eNB_id; - s1ap_register_eNB->cell_type = g_enb_properties[eNB_id]->cell_type; - s1ap_register_eNB->eNB_name = g_enb_properties[eNB_id]->eNB_name; - s1ap_register_eNB->tac = g_enb_properties[eNB_id]->tac; - s1ap_register_eNB->mcc = g_enb_properties[eNB_id]->mcc; - s1ap_register_eNB->mnc = g_enb_properties[eNB_id]->mnc; - s1ap_register_eNB->default_drx = g_enb_properties[eNB_id]->default_drx; + s1ap_register_eNB->eNB_id = enb_properties[enb_id]->eNB_id; + s1ap_register_eNB->cell_type = enb_properties[enb_id]->cell_type; + s1ap_register_eNB->eNB_name = enb_properties[enb_id]->eNB_name; + s1ap_register_eNB->tac = enb_properties[enb_id]->tac; + s1ap_register_eNB->mcc = enb_properties[enb_id]->mcc; + s1ap_register_eNB->mnc = enb_properties[enb_id]->mnc; + s1ap_register_eNB->default_drx = enb_properties[enb_id]->default_drx; - s1ap_register_eNB->nb_mme = g_enb_properties[eNB_id]->nb_mme; - DevCheck(s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, eNB_id, s1ap_register_eNB->nb_mme, S1AP_MAX_NB_MME_IP_ADDRESS); + s1ap_register_eNB->nb_mme = enb_properties[enb_id]->nb_mme; + AssertFatal (s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, "Too many MME for eNB %d (%d/%d)!", enb_id, s1ap_register_eNB->nb_mme, S1AP_MAX_NB_MME_IP_ADDRESS); for (mme_id = 0; mme_id < s1ap_register_eNB->nb_mme; mme_id++) { - s1ap_register_eNB->mme_ip_address[mme_id].ipv4 = g_enb_properties[eNB_id]->mme_ip_address[mme_id].ipv4; - s1ap_register_eNB->mme_ip_address[mme_id].ipv6 = g_enb_properties[eNB_id]->mme_ip_address[mme_id].ipv6; + s1ap_register_eNB->mme_ip_address[mme_id].ipv4 = enb_properties[enb_id]->mme_ip_address[mme_id].ipv4; + s1ap_register_eNB->mme_ip_address[mme_id].ipv6 = enb_properties[enb_id]->mme_ip_address[mme_id].ipv6; strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv4_address, - g_enb_properties[eNB_id]->mme_ip_address[mme_id].ipv4_address, + enb_properties[enb_id]->mme_ip_address[mme_id].ipv4_address, sizeof(s1ap_register_eNB->mme_ip_address[0].ipv4_address)); strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv6_address, - g_enb_properties[eNB_id]->mme_ip_address[mme_id].ipv6_address, + enb_properties[enb_id]->mme_ip_address[mme_id].ipv6_address, sizeof(s1ap_register_eNB->mme_ip_address[0].ipv6_address)); } - itti_send_msg_to_task (TASK_S1AP, eNB_id, msg_p); + itti_send_msg_to_task (TASK_S1AP, enb_id, msg_p); register_enb_pending++; } @@ -170,11 +163,15 @@ static uint32_t eNB_app_register() void *eNB_app_task(void *args_p) { #if defined(ENABLE_ITTI) + uint32_t enb_nb = 1; /* Default number of eNB is 1 */ + uint32_t enb_id_start = 0; + uint32_t enb_id_end = enb_id_start + enb_nb; # if defined(ENABLE_USE_MME) - static uint32_t register_enb_pending; - static uint32_t registered_enb; - static long enb_register_retry_timer_id; + uint32_t register_enb_pending; + uint32_t registered_enb; + long enb_register_retry_timer_id; # endif + uint32_t enb_id; MessageDef *msg_p; const char *msg_name; instance_t instance; @@ -184,17 +181,32 @@ void *eNB_app_task(void *args_p) # if defined(ENABLE_USE_MME) # if defined(OAI_EMU) - enb_nb = oai_emulation.info.nb_enb_local; + enb_nb = oai_emulation.info.nb_enb_local; + enb_id_start = oai_emulation.info.first_enb_local; + enb_id_end = oai_emulation.info.first_enb_local + enb_nb; + + AssertFatal (enb_id_end <= NUMBER_OF_eNB_MAX, + "Last eNB index is greater or equal to maximum eNB index (%d/%d)!", + enb_id_end, NUMBER_OF_eNB_MAX); # endif # endif - enb_config_init(g_conf_config_file_name); - configure_rrc(); + enb_nb_properties = enb_config_init(g_conf_config_file_name, enb_properties); + + AssertFatal (enb_nb <= enb_nb_properties, + "Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!", + g_conf_config_file_name, enb_nb, enb_nb_properties); + + for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) + { + configure_phy(enb_id); + configure_rrc(enb_id); + } # if defined(ENABLE_USE_MME) /* Try to register each eNB */ registered_enb = 0; - register_enb_pending = eNB_app_register (); + register_enb_pending = eNB_app_register (enb_id_start, enb_id_end); # else /* Start L2L1 task */ msg_p = itti_alloc_new_message(TASK_ENB_APP, INITIALIZE_MESSAGE); @@ -245,7 +257,7 @@ void *eNB_app_task(void *args_p) itti_send_msg_to_task (TASK_L2L1, INSTANCE_DEFAULT, msg_init_p); # if defined(OAI_EMU) - /* If also inform all NAS UE tasks */ + /* Also inform all NAS UE tasks */ for (instance = NB_eNB_INST + oai_emulation.info.first_ue_local; instance < (NB_eNB_INST + oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); instance ++) { @@ -270,7 +282,7 @@ void *eNB_app_task(void *args_p) sleep(ENB_REGISTER_RETRY_DELAY); /* Restart the registration process */ registered_enb = 0; - register_enb_pending = eNB_app_register (); + register_enb_pending = eNB_app_register (enb_id_start, enb_id_end); } } } @@ -290,7 +302,7 @@ void *eNB_app_task(void *args_p) { /* Restart the registration process */ registered_enb = 0; - register_enb_pending = eNB_app_register (); + register_enb_pending = eNB_app_register (enb_id_start, enb_id_end); } break; # endif diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 1989734f88b6a957629e305b4171f2a53f02f7f5..cbaba2a9aba1c7f0c1872a1055fb2e6330f6a32a 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -48,19 +48,20 @@ #include "LAYER2/MAC/extern.h" -// Hard to find a defined value for max enb... -#define MAX_ENB 16 -Enb_properties_t *g_enb_properties[MAX_ENB]; -int g_num_enb_properties = 0; - -int enb_config_init(char* lib_config_file_name_pP) { +int enb_config_init(char* lib_config_file_name_pP, Enb_properties_t **enb_properties) { config_t cfg; config_setting_t *setting; config_setting_t *setting_mme_addresses; config_setting_t *setting_mme_address; config_setting_t *setting_enb; - int num_enbs, num_mme_address, i, j, parse_error = 0, enb_properties_index; + int num_enb_properties = 0; + int enb_properties_index = 0; + int num_enbs; + int num_mme_address; + int i; + int j; + int parse_error = 0; long int enb_id; const char* cell_type; long int tac; @@ -78,9 +79,8 @@ int enb_config_init(char* lib_config_file_name_pP) { char* preference; const char* active_enb[MAX_ENB]; - - memset((char*)g_enb_properties, 0 , MAX_ENB * sizeof(Enb_properties_t*)); - memset((char*)active_enb, 0 , MAX_ENB * sizeof(char*)); + memset((char*)enb_properties, 0 , MAX_ENB * sizeof(Enb_properties_t*)); + memset((char*)active_enb, 0 , MAX_ENB * sizeof(char*)); config_init(&cfg); @@ -102,7 +102,6 @@ int enb_config_init(char* lib_config_file_name_pP) { } // Get list of active eNBs, (only these will be configured) - g_num_enb_properties = 0; setting = config_lookup(&cfg, ENB_CONFIG_STRING_ACTIVE_ENBS); if(setting != NULL) { @@ -114,7 +113,7 @@ int enb_config_init(char* lib_config_file_name_pP) { "Failed to parse config file %s, %uth attribute %s \n", lib_config_file_name_pP, i, ENB_CONFIG_STRING_ACTIVE_ENBS); active_enb[i] = strdup(active_enb[i]); - g_num_enb_properties += 1; + num_enb_properties += 1; } } @@ -142,33 +141,33 @@ int enb_config_init(char* lib_config_file_name_pP) { lib_config_file_name_pP, i); } // search if in active list - for (j=0; j < g_num_enb_properties; j++) { + for (j=0; j < num_enb_properties; j++) { if (strcmp(active_enb[j], enb_name) == 0) { - g_enb_properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t)); + enb_properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t)); - g_enb_properties[enb_properties_index]->eNB_id = enb_id; + enb_properties[enb_properties_index]->eNB_id = enb_id; if (strcmp(cell_type, "CELL_MACRO_ENB") == 0) { - g_enb_properties[enb_properties_index]->cell_type = CELL_MACRO_ENB; + enb_properties[enb_properties_index]->cell_type = CELL_MACRO_ENB; } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) { - g_enb_properties[enb_properties_index]->cell_type = CELL_HOME_ENB; + enb_properties[enb_properties_index]->cell_type = CELL_HOME_ENB; } else { AssertError (0, parse_error ++, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n", lib_config_file_name_pP, i, cell_type); } - g_enb_properties[enb_properties_index]->eNB_name = strdup(enb_name); - g_enb_properties[enb_properties_index]->tac = (uint16_t)tac; - g_enb_properties[enb_properties_index]->mcc = (uint16_t)mcc; - g_enb_properties[enb_properties_index]->mnc = (uint16_t)mnc; + enb_properties[enb_properties_index]->eNB_name = strdup(enb_name); + enb_properties[enb_properties_index]->tac = (uint16_t)tac; + enb_properties[enb_properties_index]->mcc = (uint16_t)mcc; + enb_properties[enb_properties_index]->mnc = (uint16_t)mnc; if (strcmp(default_drx, "PAGING_DRX_32") == 0) { - g_enb_properties[enb_properties_index]->default_drx = PAGING_DRX_32; + enb_properties[enb_properties_index]->default_drx = PAGING_DRX_32; } else if (strcmp(default_drx, "PAGING_DRX_64") == 0) { - g_enb_properties[enb_properties_index]->default_drx = PAGING_DRX_64; + enb_properties[enb_properties_index]->default_drx = PAGING_DRX_64; } else if (strcmp(default_drx, "PAGING_DRX_128") == 0) { - g_enb_properties[enb_properties_index]->default_drx = PAGING_DRX_128; + enb_properties[enb_properties_index]->default_drx = PAGING_DRX_128; } else if (strcmp(default_drx, "PAGING_DRX_256") == 0) { - g_enb_properties[enb_properties_index]->default_drx = PAGING_DRX_256; + enb_properties[enb_properties_index]->default_drx = PAGING_DRX_256; } else { AssertError (0, parse_error ++, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for default_drx choice: PAGING_DRX_32..PAGING_DRX_256 !\n", @@ -178,47 +177,47 @@ int enb_config_init(char* lib_config_file_name_pP) { // Parse optional physical parameters if(config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_FRAME_TYPE, &frame_type)) { if (strcmp(frame_type, "FDD") == 0) { - g_enb_properties[enb_properties_index]->frame_type = FDD; + enb_properties[enb_properties_index]->frame_type = FDD; } else if (strcmp(frame_type, "TDD") == 0) { - g_enb_properties[enb_properties_index]->frame_type = TDD; + enb_properties[enb_properties_index]->frame_type = TDD; } else { AssertError (0, parse_error ++, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n", lib_config_file_name_pP, i, frame_type); } } else { - g_enb_properties[enb_properties_index]->frame_type = FDD; // Default frame type + enb_properties[enb_properties_index]->frame_type = FDD; // Default frame type } if(config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_PREFIX_TYPE, &prefix_type)) { if (strcmp(prefix_type, "NORMAL") == 0) { - g_enb_properties[enb_properties_index]->prefix_type = NORMAL; + enb_properties[enb_properties_index]->prefix_type = NORMAL; } else if (strcmp(prefix_type, "EXTENDED") == 0) { - g_enb_properties[enb_properties_index]->prefix_type = EXTENDED; + enb_properties[enb_properties_index]->prefix_type = EXTENDED; } else { AssertError (0, parse_error ++, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", lib_config_file_name_pP, i, prefix_type); } } else { - g_enb_properties[enb_properties_index]->prefix_type = NORMAL; // Default prefix type + enb_properties[enb_properties_index]->prefix_type = NORMAL; // Default prefix type } if(config_setting_lookup_int64(setting_enb, ENB_CONFIG_STRING_DOWNLINK_FREQUENCY, &downlink_frequency)) { - g_enb_properties[enb_properties_index]->downlink_frequency = downlink_frequency; + enb_properties[enb_properties_index]->downlink_frequency = downlink_frequency; } else { - g_enb_properties[enb_properties_index]->downlink_frequency = 2680000000UL; // Default downlink frequency + enb_properties[enb_properties_index]->downlink_frequency = 2680000000UL; // Default downlink frequency } if(config_setting_lookup_int(setting_enb, ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET, &uplink_frequency_offset)) { - g_enb_properties[enb_properties_index]->uplink_frequency_offset = uplink_frequency_offset; + enb_properties[enb_properties_index]->uplink_frequency_offset = uplink_frequency_offset; } else { - g_enb_properties[enb_properties_index]->uplink_frequency_offset = -120000000; // Default uplink frequency offset + enb_properties[enb_properties_index]->uplink_frequency_offset = -120000000; // Default uplink frequency offset } setting_mme_addresses = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_MME_IP_ADDRESS); num_mme_address = config_setting_length(setting_mme_addresses); - g_enb_properties[enb_properties_index]->nb_mme = 0; + enb_properties[enb_properties_index]->nb_mme = 0; for (j = 0; j < num_mme_address; j++) { setting_mme_address = config_setting_get_elem(setting_mme_addresses, j); if( !( @@ -232,24 +231,24 @@ int enb_config_init(char* lib_config_file_name_pP) { "Failed to parse eNB configuration file %s, %u th enb %u th mme address !\n", lib_config_file_name_pP, i, j); } - g_enb_properties[enb_properties_index]->nb_mme += 1; + enb_properties[enb_properties_index]->nb_mme += 1; - g_enb_properties[enb_properties_index]->mme_ip_address[j].ipv4_address = strdup(ipv4); - g_enb_properties[enb_properties_index]->mme_ip_address[j].ipv6_address = strdup(ipv6); + enb_properties[enb_properties_index]->mme_ip_address[j].ipv4_address = strdup(ipv4); + enb_properties[enb_properties_index]->mme_ip_address[j].ipv6_address = strdup(ipv6); if (strcmp(active, "yes") == 0) { - g_enb_properties[enb_properties_index]->mme_ip_address[j].active = 1; + enb_properties[enb_properties_index]->mme_ip_address[j].active = 1; #if defined(ENABLE_USE_MME) EPC_MODE_ENABLED = 1; #endif } // else { (calloc) if (strcmp(preference, "ipv4") == 0) { - g_enb_properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; + enb_properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; } else if (strcmp(preference, "ipv6") == 0) { - g_enb_properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; + enb_properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; } else if (strcmp(preference, "no") == 0) { - g_enb_properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; - g_enb_properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; + enb_properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; + enb_properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; } } enb_properties_index += 1; @@ -258,12 +257,12 @@ int enb_config_init(char* lib_config_file_name_pP) { } } } - AssertError (enb_properties_index == g_num_enb_properties, parse_error ++, + AssertError (enb_properties_index == num_enb_properties, parse_error ++, "Failed to parse eNB configuration file %s, mismatch between %u active eNBs and %u corresponding defined eNBs !\n", - lib_config_file_name_pP, g_num_enb_properties, enb_properties_index); + lib_config_file_name_pP, num_enb_properties, enb_properties_index); AssertFatal (parse_error == 0, "Failed to parse eNB configuration file %s, found %d error%s !\n", lib_config_file_name_pP, parse_error, parse_error > 1 ? "s" : ""); - return 0; + return num_enb_properties; } diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 19aa843c344a126f43ee1be41c3cfb6672242a46..8eb743fe808a8448f34b56659a2cea56ca2de75b 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -35,6 +35,9 @@ #include "PHY/impl_defs_lte.h" #include "s1ap_messages_types.h" +// Hard to find a defined value for max enb... +#define MAX_ENB 16 + #define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\ struct in_addr inp;\ if ( inet_aton(AdDr_StR, &inp ) < 0 ) {\ @@ -43,35 +46,37 @@ NwBo = inp.s_addr;\ }\ } while (0); -#define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" - -#define ENB_CONFIG_STRING_ENB_LIST "eNBs" -#define ENB_CONFIG_STRING_ENB_ID "eNB_ID" -#define ENB_CONFIG_STRING_CELL_TYPE "cell_type" -#define ENB_CONFIG_STRING_ENB_NAME "eNB_name" - -#define ENB_CONFIG_STRING_TRACKING_AREA_CODE "tracking_area_code" -#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE "mobile_country_code" -#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE "mobile_network_code" - -#define ENB_CONFIG_STRING_DEFAULT_PAGING_DRX "default_paging_drx" - -#define ENB_CONFIG_STRING_FRAME_TYPE "frame_type" -#define ENB_CONFIG_STRING_PREFIX_TYPE "prefix_type" -#define ENB_CONFIG_STRING_DOWNLINK_FREQUENCY "downlink_frequency" -#define ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET "uplink_frequency_offset" - -#define ENB_CONFIG_STRING_MME_IP_ADDRESS "mme_ip_address" -#define ENB_CONFIG_STRING_MME_IPV4_ADDRESS "ipv4" -#define ENB_CONFIG_STRING_MME_IPV6_ADDRESS "ipv6" -#define ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE "active" -#define ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE "preference" - -#define ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES" -#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME "ENB_INTERFACE_NAME_FOR_S1_MME" -#define ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME "ENB_IPV4_ADDRESS_FOR_S1_MME" -#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U "ENB_INTERFACE_NAME_FOR_S1U" -#define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U" + +#define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" + +#define ENB_CONFIG_STRING_ENB_LIST "eNBs" +#define ENB_CONFIG_STRING_ENB_ID "eNB_ID" +#define ENB_CONFIG_STRING_CELL_TYPE "cell_type" +#define ENB_CONFIG_STRING_ENB_NAME "eNB_name" + +#define ENB_CONFIG_STRING_TRACKING_AREA_CODE "tracking_area_code" +#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE "mobile_country_code" +#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE "mobile_network_code" + +#define ENB_CONFIG_STRING_DEFAULT_PAGING_DRX "default_paging_drx" + +#define ENB_CONFIG_STRING_FRAME_TYPE "frame_type" +#define ENB_CONFIG_STRING_PREFIX_TYPE "prefix_type" +#define ENB_CONFIG_STRING_DOWNLINK_FREQUENCY "downlink_frequency" +#define ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET "uplink_frequency_offset" + +#define ENB_CONFIG_STRING_MME_IP_ADDRESS "mme_ip_address" +#define ENB_CONFIG_STRING_MME_IPV4_ADDRESS "ipv4" +#define ENB_CONFIG_STRING_MME_IPV6_ADDRESS "ipv6" +#define ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE "active" +#define ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE "preference" + +#define ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES" +#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME "ENB_INTERFACE_NAME_FOR_S1_MME" +#define ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME "ENB_IPV4_ADDRESS_FOR_S1_MME" +#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U "ENB_INTERFACE_NAME_FOR_S1U" +#define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U" + typedef struct mme_ip_address_s { unsigned ipv4:1; unsigned ipv6:1; @@ -119,15 +124,14 @@ typedef struct Enb_properties_s { /* List of MME to connect to */ mme_ip_address_t mme_ip_address[S1AP_MAX_NB_MME_IP_ADDRESS]; - char *enb_interface_name_for_S1U; - uint32_t enb_ipv4_address_for_S1U; + char *enb_interface_name_for_S1U; + uint32_t enb_ipv4_address_for_S1U; - char *enb_interface_name_for_S1_MME; - uint32_t enb_ipv4_address_for_S1_MME; + char *enb_interface_name_for_S1_MME; + uint32_t enb_ipv4_address_for_S1_MME; } Enb_properties_t; - -int enb_config_init(char* lib_config_file_name_pP); +int enb_config_init(char* lib_config_file_name_pP, Enb_properties_t **enb_properties); #endif /* ENB_CONFIG_H_ */