diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 47a8f3a9b764423b59748d8eb638127b45d7e64d..6b5c51870c3663afda4c39eeec290856b4cb58d3 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1620,7 +1620,7 @@ add_executable(test_epc_generate_scenario ${OPENAIR_BIN_DIR}/messages_xml.h ) target_link_libraries (test_epc_generate_scenario - -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} ) diff --git a/cmake_targets/epc_test/CMakeLists.template b/cmake_targets/epc_test/CMakeLists.template index 25d94ea852b92eaa2b4080810a9aef13bf365dd7..12a745b997fe7bfee7bf455e5c2ab6e5aaadb0a0 100644 --- a/cmake_targets/epc_test/CMakeLists.template +++ b/cmake_targets/epc_test/CMakeLists.template @@ -47,9 +47,9 @@ set ( OAI_EMU False ) set ( OAISIM False ) set ( OAI_NW_DRIVER_TYPE_ETHERNET False ) set ( OAI_NW_DRIVER_USE_NETLINK True ) -set ( OPENAIR1 False ) -set ( OPENAIR2 False ) -set ( OPENAIR_LTE F ) +set ( OPENAIR1 True ) +set ( OPENAIR2 True ) +set ( OPENAIR_LTE True ) set ( PACKAGE_NAME "epc_test" ) set ( PBS_SIM False ) set ( PDCP_USE_NETLINK True ) diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index bd181ce8784062b1fb43175265f64ff0f46e9e59..913533218e0a189e9e93405b2032cfefc394d0f1 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -39,15 +39,19 @@ #include <libconfig.h> #include <inttypes.h> #include <getopt.h> +#include <libgen.h> +#include <unistd.h> +#include <errno.h> +#include <fcntl.h> + #include "assertions.h" -#include "enb_config.h" +#include "generate_scenario.h" #include "s1ap_eNB.h" #if defined(ENABLE_ITTI) # include "intertask_interface.h" #endif -#define EPC_TEST_SCENARIO_MAX_ENB 2 #define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" @@ -78,30 +82,53 @@ #define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U" #define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U" +#define ENB_CONFIG_PROPERTIES_INDEX_OLD 0 +#define ENB_CONFIG_PROPERTIES_INDEX_NEW 1 -Enb_properties_array_t g_enb_properties; +Enb_properties_array_t g_enb_properties[2]; +char *g_test_dir = "."; // default value +char *g_pdml_in_basename = "trace.pdml"; // default value //------------------------------------------------------------------------------ -static void enb_config_display(void) +void generate_scenario(const char const * pdml_in_basenameP) //------------------------------------------------------------------------------ { - int i,j; + int fd_pdml_in; + if (chdir(g_test_dir) == 0) { + printf( "working in %s directory\n", g_test_dir); + fd_pdml_in = open(pdml_in_basenameP, O_RDONLY); + AssertFatal (fd_pdml_in > 0, + "Error while opening %s file in directory %s\n", + pdml_in_basenameP, + g_test_dir); + + } else { + printf("Error: chdir %s returned %s\n", g_test_dir, strerror(errno)); + exit(-1); + } +} + +//------------------------------------------------------------------------------ +static void enb_config_display(const boolean_t new_config_fileP) +//------------------------------------------------------------------------------ +{ + int i; printf( "\n----------------------------------------------------------------------\n"); - printf( " ENB CONFIG FILE CONTENT LOADED (TBC):\n"); + printf( " %s ENB CONFIG FILE CONTENT LOADED:\n", new_config_fileP == ENB_CONFIG_PROPERTIES_INDEX_OLD ? "Old":"New"); printf( "----------------------------------------------------------------------\n"); - for (i = 0; i < g_enb_properties.number; i++) { + for (i = 0; i < g_enb_properties[new_config_fileP].number; i++) { printf( "ENB CONFIG for instance %u:\n\n", i); - printf( "\teNB name: \t%s:\n",g_enb_properties.properties[i]->eNB_name); - printf( "\teNB ID: \t%"PRIu32":\n",g_enb_properties.properties[i]->eNB_id); - printf( "\tCell type: \t%s:\n",g_enb_properties.properties[i]->cell_type == CELL_MACRO_ENB ? "CELL_MACRO_ENB":"CELL_HOME_ENB"); - printf( "\tTAC: \t%"PRIu16":\n",g_enb_properties.properties[i]->tac); - printf( "\tMCC: \t%"PRIu16":\n",g_enb_properties.properties[i]->mcc); - - if (g_enb_properties.properties[i]->mnc_digit_length == 3) { - printf( "\tMNC: \t%03"PRIu16":\n",g_enb_properties.properties[i]->mnc); + printf( "\teNB name: \t%s\n",g_enb_properties[new_config_fileP].properties[i]->eNB_name); + printf( "\teNB ID: \t%"PRIu32"\n",g_enb_properties[new_config_fileP].properties[i]->eNB_id); + printf( "\tCell type: \t%s\n",g_enb_properties[new_config_fileP].properties[i]->cell_type == CELL_MACRO_ENB ? "CELL_MACRO_ENB":"CELL_HOME_ENB"); + printf( "\tTAC: \t%"PRIu16"\n",g_enb_properties[new_config_fileP].properties[i]->tac); + printf( "\tMCC: \t%"PRIu16"\n",g_enb_properties[new_config_fileP].properties[i]->mcc); + + if (g_enb_properties[new_config_fileP].properties[i]->mnc_digit_length == 3) { + printf( "\tMNC: \t%03"PRIu16"\n",g_enb_properties[new_config_fileP].properties[i]->mnc); } else { - printf( "\tMNC: \t%02"PRIu16":\n",g_enb_properties.properties[i]->mnc); + printf( "\tMNC: \t%02"PRIu16"\n",g_enb_properties[new_config_fileP].properties[i]->mnc); } printf( "\n--------------------------------------------------------\n"); } @@ -114,13 +141,12 @@ static void enb_config_display(void) #define libconfig_int int #endif //------------------------------------------------------------------------------ -const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) +void enb_config_init(const char const * lib_config_file_name_pP, const boolean_t new_config_fileP) //------------------------------------------------------------------------------ { config_t cfg; config_setting_t *setting = NULL; config_setting_t *subsetting = NULL; - config_setting_t *setting_srb1 = NULL; config_setting_t *setting_mme_addresses = NULL; config_setting_t *setting_mme_address = NULL; config_setting_t *setting_enb = NULL; @@ -128,8 +154,6 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) int enb_properties_index = 0; int num_enbs = 0; int num_mme_address = 0; - int num_otg_elements =0; - int num_component_carriers =0; int i = 0; int j = 0; int parse_errors = 0; @@ -139,12 +163,6 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) const char* enb_name = NULL; const char* mcc = 0; const char* mnc = 0; - const char* frame_type = NULL; - const char* prefix_type = NULL; - libconfig_int Nid_cell = 0; - - libconfig_int my_int; - char* ipv4 = NULL; char* ipv6 = NULL; char* active = NULL; @@ -157,21 +175,22 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) char* enb_ipv4_address_for_S1_MME = NULL; char *address = NULL; char *cidr = NULL; - char *astring = NULL; + + AssertFatal ((new_config_fileP == 0) || (new_config_fileP == 1), + "Bad parameter new_config_fileP %d \n", + new_config_fileP); + AssertFatal (lib_config_file_name_pP != NULL, + "Bad parameter lib_config_file_name_pP %s , must reference a valid eNB config file\n", + lib_config_file_name_pP); memset((char*)active_enb, 0 , EPC_TEST_SCENARIO_MAX_ENB * sizeof(char*)); config_init(&cfg); - if (lib_config_file_name_pP != NULL) { - /* Read the file. If there is an error, report it and exit. */ - if (! config_read_file(&cfg, lib_config_file_name_pP)) { - config_destroy(&cfg); - AssertFatal (0, "Failed to parse eNB configuration file %s!\n", lib_config_file_name_pP); - } - } else { + /* Read the file. If there is an error, report it and exit. */ + if (! config_read_file(&cfg, lib_config_file_name_pP)) { config_destroy(&cfg); - AssertFatal (0, "No eNB configuration file provided!\n"); + AssertFatal (0, "Failed to parse eNB configuration file %s!\n", lib_config_file_name_pP); } // Get list of active eNBs, (only these will be configured) @@ -195,7 +214,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) setting = config_lookup(&cfg, ENB_CONFIG_STRING_ENB_LIST); if (setting != NULL) { - enb_properties_index = 0; + enb_properties_index = g_enb_properties[new_config_fileP].number; parse_errors = 0; num_enbs = config_setting_length(setting); @@ -232,34 +251,34 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) // search if in active list for (j=0; j < num_enb_properties; j++) { if (strcmp(active_enb[j], enb_name) == 0) { - g_enb_properties.properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t)); + g_enb_properties[new_config_fileP].properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t)); - g_enb_properties.properties[enb_properties_index]->eNB_id = enb_id; + g_enb_properties[new_config_fileP].properties[enb_properties_index]->eNB_id = enb_id; if (strcmp(cell_type, "CELL_MACRO_ENB") == 0) { - g_enb_properties.properties[enb_properties_index]->cell_type = CELL_MACRO_ENB; + g_enb_properties[new_config_fileP].properties[enb_properties_index]->cell_type = CELL_MACRO_ENB; } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) { - g_enb_properties.properties[enb_properties_index]->cell_type = CELL_HOME_ENB; + g_enb_properties[new_config_fileP].properties[enb_properties_index]->cell_type = CELL_HOME_ENB; } else { AssertError (0, parse_errors ++, "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.properties[enb_properties_index]->eNB_name = strdup(enb_name); - g_enb_properties.properties[enb_properties_index]->tac = (uint16_t)atoi(tac); - g_enb_properties.properties[enb_properties_index]->mcc = (uint16_t)atoi(mcc); - g_enb_properties.properties[enb_properties_index]->mnc = (uint16_t)atoi(mnc); - g_enb_properties.properties[enb_properties_index]->mnc_digit_length = strlen(mnc); - AssertFatal((g_enb_properties.properties[enb_properties_index]->mnc_digit_length == 2) || - (g_enb_properties.properties[enb_properties_index]->mnc_digit_length == 3), + g_enb_properties[new_config_fileP].properties[enb_properties_index]->eNB_name = strdup(enb_name); + g_enb_properties[new_config_fileP].properties[enb_properties_index]->tac = (uint16_t)atoi(tac); + g_enb_properties[new_config_fileP].properties[enb_properties_index]->mcc = (uint16_t)atoi(mcc); + g_enb_properties[new_config_fileP].properties[enb_properties_index]->mnc = (uint16_t)atoi(mnc); + g_enb_properties[new_config_fileP].properties[enb_properties_index]->mnc_digit_length = strlen(mnc); + AssertFatal((g_enb_properties[new_config_fileP].properties[enb_properties_index]->mnc_digit_length == 2) || + (g_enb_properties[new_config_fileP].properties[enb_properties_index]->mnc_digit_length == 3), "BAD MNC DIGIT LENGTH %d", - g_enb_properties.properties[i]->mnc_digit_length); + g_enb_properties[new_config_fileP].properties[i]->mnc_digit_length); 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.properties[enb_properties_index]->nb_mme = 0; + g_enb_properties[new_config_fileP].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); @@ -277,22 +296,22 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) continue; // FIXME will prevent segfaults below, not sure what happens at function exit... } - g_enb_properties.properties[enb_properties_index]->nb_mme += 1; + g_enb_properties[new_config_fileP].properties[enb_properties_index]->nb_mme += 1; - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4_address = strdup(ipv4); - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6_address = strdup(ipv6); + g_enb_properties[new_config_fileP].properties[enb_properties_index]->mme_ip_address[j].ipv4_address = strdup(ipv4); + g_enb_properties[new_config_fileP].properties[enb_properties_index]->mme_ip_address[j].ipv6_address = strdup(ipv6); if (strcmp(active, "yes") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].active = 1; + g_enb_properties[new_config_fileP].properties[enb_properties_index]->mme_ip_address[j].active = 1; } // else { (calloc) if (strcmp(preference, "ipv4") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; + g_enb_properties[new_config_fileP].properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; } else if (strcmp(preference, "ipv6") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; + g_enb_properties[new_config_fileP].properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; } else if (strcmp(preference, "no") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; + g_enb_properties[new_config_fileP].properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; + g_enb_properties[new_config_fileP].properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; } } @@ -314,49 +333,37 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) &enb_port_for_S1U) ) ) { - g_enb_properties.properties[enb_properties_index]->enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U); + g_enb_properties[new_config_fileP].properties[enb_properties_index]->enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U); cidr = enb_ipv4_address_for_S1U; address = strtok(cidr, "/"); if (address) { - IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1U, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); + IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties[new_config_fileP].properties[enb_properties_index]->enb_ipv4_address_for_S1U, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); } - g_enb_properties.properties[enb_properties_index]->enb_port_for_S1U = enb_port_for_S1U; + g_enb_properties[new_config_fileP].properties[enb_properties_index]->enb_port_for_S1U = enb_port_for_S1U; - g_enb_properties.properties[enb_properties_index]->enb_interface_name_for_S1_MME = strdup(enb_interface_name_for_S1_MME); + g_enb_properties[new_config_fileP].properties[enb_properties_index]->enb_interface_name_for_S1_MME = strdup(enb_interface_name_for_S1_MME); cidr = enb_ipv4_address_for_S1_MME; address = strtok(cidr, "/"); if (address) { - IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR eNB S1_MME !\n" ); + IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties[new_config_fileP].properties[enb_properties_index]->enb_ipv4_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR eNB S1_MME !\n" ); } } - } - } - } - } - } + } // if (subsetting != NULL) { + enb_properties_index += 1; + } // if (strcmp(active_enb[j], enb_name) == 0) + } // for (j=0; j < num_enb_properties; j++) + } // for (i = 0; i < num_enbs; i++) + } // if (setting != NULL) { - g_enb_properties.number = num_enb_properties; + g_enb_properties[new_config_fileP].number += num_enb_properties; - AssertError (enb_properties_index == num_enb_properties, parse_errors ++, - "Failed to parse eNB configuration file %s, mismatch between %u active eNBs and %u corresponding defined eNBs !\n", - lib_config_file_name_pP, num_enb_properties, enb_properties_index); AssertFatal (parse_errors == 0, "Failed to parse eNB configuration file %s, found %d error%s !\n", lib_config_file_name_pP, parse_errors, parse_errors > 1 ? "s" : ""); - enb_config_display(); - return &g_enb_properties; - -} - -//------------------------------------------------------------------------------ -const Enb_properties_array_t *enb_config_get(void) -//------------------------------------------------------------------------------ -{ - return &g_enb_properties; } @@ -370,12 +377,12 @@ static void usage ( fprintf (stdout, "Usage: %s [options]\n\n", argv[0]); fprintf (stdout, "Available options:\n"); fprintf (stdout, "\t--help, -h Print this help and return\n"); - fprintf (stdout, "\t--test-dir <path>\n"); - fprintf (stdout, " Set the test directory where pdml and original enb(s) config files are located\n"); - fprintf (stdout, " See README in openair3/TEST/EPC_TEST\n"); fprintf (stdout, "\t--new-enb-conf-file <file>\n"); fprintf (stdout, " Provide an updated eNB config file for generating a copy of the original test\n"); - fprintf (stdout, " This option is set as many times as there are some eNB in the original test\n"); + fprintf (stdout, " This option is set as many times as there are some eNB config files in the original test\n"); + fprintf (stdout, "\t--old-enb-conf-file <file>\n"); + fprintf (stdout, " Provide the old eNB config file for generating a copy of the original test\n"); + fprintf (stdout, " This option is set as many times as there are some eNB config files in the original test\n"); } @@ -388,18 +395,19 @@ config_parse_opt_line ( { int option; char *enb_config_file_name = NULL; - char *test_dir = NULL; enum long_option_e { LONG_OPTION_START = 0x100, /* Start after regular single char options */ - LONG_OPTION_TEST_DIR, LONG_OPTION_NEW_ENB_CONF_FILE, + LONG_OPTION_OLD_ENB_CONF_FILE, + LONG_OPTION_PDML_IN_BASENAME, LONG_OPTION_HELP, }; static struct option long_options[] = { - {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, + {"old-enb-conf-file", required_argument, 0, LONG_OPTION_OLD_ENB_CONF_FILE}, {"new-enb-conf-file", required_argument, 0, LONG_OPTION_NEW_ENB_CONF_FILE}, + {"pdml_in_basename", required_argument, 0, LONG_OPTION_PDML_IN_BASENAME}, {"help", required_argument, 0, LONG_OPTION_HELP}, {NULL, 0, NULL, 0} }; @@ -407,31 +415,37 @@ config_parse_opt_line ( /* * Parsing command line */ - while ((option = getopt_long (argc, argv, "h", long_options, NULL)) != -1) { + while ((option = getopt_long (argc, argv, "hp:n:o", long_options, NULL)) != -1) { switch (option) { - case LONG_OPTION_TEST_DIR: + case LONG_OPTION_OLD_ENB_CONF_FILE: + case 'o': if (optarg) { - test_dir = strdup(optarg); - printf("TEST DIRECTORY IS %s\n", test_dir); + enb_config_file_name = optarg; + printf("Old eNB config file name is %s\n", enb_config_file_name); + enb_config_init(enb_config_file_name, ENB_CONFIG_PROPERTIES_INDEX_OLD); + g_test_dir = strdup(dirname(enb_config_file_name)); } break; case LONG_OPTION_NEW_ENB_CONF_FILE: + case 'n': if (optarg) { - enb_config_file_name = strdup(optarg); - printf("eNB config file name is %s\n", enb_config_file_name); - enb_config_init(enb_config_file_name); + enb_config_file_name = optarg; + printf("New eNB config file name is %s\n", enb_config_file_name); + enb_config_init(enb_config_file_name, ENB_CONFIG_PROPERTIES_INDEX_NEW); } break; + case LONG_OPTION_PDML_IN_BASENAME: + case 'p': if (optarg) { - test_dir = strdup(optarg); - printf("TEST DIRECTORY IS %s\n", test_dir); + g_pdml_in_basename = strdup(optarg); + printf("PDML input file name is %s\n", g_pdml_in_basename); } break; case LONG_OPTION_HELP: - case 'h': /* Fall through */ + case 'h': default: usage (argc, argv); exit (0); @@ -444,8 +458,11 @@ config_parse_opt_line ( int main( int argc, char **argv ) //------------------------------------------------------------------------------ { - memset((char*) &g_enb_properties, 0 , sizeof(g_enb_properties)); + memset((char*) &g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD], 0 , sizeof(g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD])); + memset((char*) &g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_NEW], 0 , sizeof(g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_NEW])); config_parse_opt_line (argc, argv); //Command-line options - + enb_config_display(ENB_CONFIG_PROPERTIES_INDEX_OLD); + enb_config_display(ENB_CONFIG_PROPERTIES_INDEX_NEW); + generate_scenario(g_pdml_in_basename); return 0; } diff --git a/openair3/TEST/EPC_TEST/generate_scenario.h b/openair3/TEST/EPC_TEST/generate_scenario.h new file mode 100755 index 0000000000000000000000000000000000000000..c3b42ea253352ad588f049341a2cc52145d97bfd --- /dev/null +++ b/openair3/TEST/EPC_TEST/generate_scenario.h @@ -0,0 +1,132 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see <http://www.gnu.org/licenses/>. + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + +*******************************************************************************/ + +/* + generate_scenario.h + ------------------- + AUTHOR : Lionel GAUTHIER + COMPANY : EURECOM + EMAIL : Lionel.Gauthier@eurecom.fr +*/ + +#ifndef GENERATE_SCENARIO_H_ +#define GENERATE_SCENARIO_H_ +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> + +#include "commonDef.h" +#include "platform_types.h" +#include "platform_constants.h" +#include "PHY/impl_defs_lte.h" +#include "s1ap_messages_types.h" +#ifdef CMAKER +#include "SystemInformationBlockType2.h" +#else +#include "RRC/LITE/MESSAGES/SystemInformationBlockType2.h" +#endif + +#define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\ + struct in_addr inp;\ + if ( inet_aton(AdDr_StR, &inp ) < 0 ) {\ + AssertFatal (0, MeSsAgE);\ + } else {\ + NwBo = inp.s_addr;\ + }\ + } while (0); + +/** @defgroup _enb_app ENB APP + * @ingroup _oai2 + * @{ + */ + +// Hard to find a defined value for max enb... +#define EPC_TEST_SCENARIO_MAX_ENB 4 + + +typedef struct mme_ip_address_s { + unsigned ipv4:1; + unsigned ipv6:1; + unsigned active:1; + char *ipv4_address; + char *ipv6_address; +} mme_ip_address_t; + +typedef struct Enb_properties_s { + /* Unique eNB_id to identify the eNB within EPC. + * For macro eNB ids this field should be 20 bits long. + * For home eNB ids this field should be 28 bits long. + */ + uint32_t eNB_id; + + /* The type of the cell */ + enum cell_type_e cell_type; + + /* Optional name for the cell + * NOTE: the name can be NULL (i.e no name) and will be cropped to 150 + * characters. + */ + char *eNB_name; + + /* Tracking area code */ + uint16_t tac; + + /* Mobile Country Code + * Mobile Network Code + */ + uint16_t mcc; + uint16_t mnc; + uint8_t mnc_digit_length; + + /* Nb of MME to connect to */ + uint8_t nb_mme; + /* List of MME to connect to */ + mme_ip_address_t mme_ip_address[S1AP_MAX_NB_MME_IP_ADDRESS]; + + int sctp_in_streams; + int sctp_out_streams; + + char *enb_interface_name_for_S1U; + in_addr_t enb_ipv4_address_for_S1U; + tcp_udp_port_t enb_port_for_S1U; + + char *enb_interface_name_for_S1_MME; + in_addr_t enb_ipv4_address_for_S1_MME; + +} Enb_properties_t; + +typedef struct Enb_properties_array_s { + int number; + Enb_properties_t *properties[EPC_TEST_SCENARIO_MAX_ENB]; +} Enb_properties_array_t; + +void enb_config_init(const char const * lib_config_file_name_pP, const boolean_t new_config_fileP); + +#endif /* ENB_CONFIG_H_ */ +/** @} */