From 1f34bfa1a428d996bd4a1b964d6377f1aa2be236 Mon Sep 17 00:00:00 2001 From: gauthier Date: Wed, 7 Oct 2015 18:53:56 +0200 Subject: [PATCH 001/122] TBD: generate scenario --- cmake_targets/CMakeLists.txt | 2 +- cmake_targets/epc_test/CMakeLists.template | 6 +- openair3/TEST/EPC_TEST/generate_scenario.c | 215 +++++++++++---------- openair3/TEST/EPC_TEST/generate_scenario.h | 132 +++++++++++++ 4 files changed, 252 insertions(+), 103 deletions(-) create mode 100755 openair3/TEST/EPC_TEST/generate_scenario.h diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 47a8f3a9b7..6b5c51870c 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 25d94ea852..12a745b997 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 bd181ce878..913533218e 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -39,15 +39,19 @@ #include #include #include +#include +#include +#include +#include + #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); + 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.properties[i]->mnc_digit_length == 3) { - printf( "\tMNC: \t%03"PRIu16":\n",g_enb_properties.properties[i]->mnc); + 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 \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 \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 \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 0000000000..c3b42ea253 --- /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 . + + 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 +#include +#include + +#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_ */ +/** @} */ From 5d4de8bd2d603d651f6eb797b1bb7a48247e9ef9 Mon Sep 17 00:00:00 2001 From: gauthier Date: Thu, 8 Oct 2015 15:21:56 +0200 Subject: [PATCH 002/122] switch branch --- cmake_targets/CMakeLists.txt | 5 ++- openair3/TEST/EPC_TEST/generate_scenario.c | 46 +++++++++++++++++----- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 6b5c51870c..6b9dae6b04 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1332,6 +1332,9 @@ include(FindPkgConfig) pkg_search_module(LIBXML2 libxml-2.0 REQUIRED) include_directories(${LIBXML2_INCLUDE_DIRS}) +pkg_search_module(LIBXSLT libxslt REQUIRED) +include_directories(${LIBXSLT_INCLUDE_DIRS}) + pkg_search_module(OPENSSL openssl REQUIRED) include_directories(${OPENSSL_INCLUDE_DIRS}) @@ -1620,7 +1623,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 ${ITTI_LIB} ${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} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} ) diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index 913533218e..6843766f95 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -43,15 +43,22 @@ #include #include #include - +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "assertions.h" #include "generate_scenario.h" #include "s1ap_eNB.h" -#if defined(ENABLE_ITTI) -# include "intertask_interface.h" -#endif - +#include "intertask_interface.h" #define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" @@ -85,23 +92,44 @@ #define ENB_CONFIG_PROPERTIES_INDEX_OLD 0 #define ENB_CONFIG_PROPERTIES_INDEX_NEW 1 +#define ENB_CONFIG_MAX_XSLT_PARAMS 64 + Enb_properties_array_t g_enb_properties[2]; char *g_test_dir = "."; // default value char *g_pdml_in_basename = "trace.pdml"; // default value - +extern int xmlLoadExtDtdDefaultValue; //------------------------------------------------------------------------------ void generate_scenario(const char const * pdml_in_basenameP) //------------------------------------------------------------------------------ { - int fd_pdml_in; + //int fd_pdml_in; + xsltStylesheetPtr cur = NULL; + xmlDocPtr doc, res; + const char *params[ENB_CONFIG_MAX_XSLT_PARAMS]; + int nb_params = 0; + if (chdir(g_test_dir) == 0) { printf( "working in %s directory\n", g_test_dir); - fd_pdml_in = open(pdml_in_basenameP, O_RDONLY); + /*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); + g_test_dir);*/ + params[nb_params] = NULL; + xmlSubstituteEntitiesDefault(1); + xmlLoadExtDtdDefaultValue = 1; + cur = xsltParseStylesheetFile("enb_config.xsl"); + doc = xmlParseFile(pdml_in_basenameP); + res = xsltApplyStylesheet(cur, doc, params); + xsltSaveResultToFile(stdout, res, cur); + + xsltFreeStylesheet(cur); + xmlFreeDoc(res); + xmlFreeDoc(doc); + + xsltCleanupGlobals(); + xmlCleanupParser(); } else { printf("Error: chdir %s returned %s\n", g_test_dir, strerror(errno)); exit(-1); From 62009b9a43878ff22bc5f1a5e7d49743560a4743 Mon Sep 17 00:00:00 2001 From: gauthier Date: Fri, 16 Oct 2015 16:56:06 +0200 Subject: [PATCH 003/122] Sync for home --- .../attach_complete.pdml | 4242 +++++++++++++++++ .../enb.band7.tm1.usrpb210.epc.local.conf | 174 + openair3/TEST/EPC_TEST/generate_scenario.c | 339 +- openair3/TEST/EPC_TEST/generic_scenario.xsl | 46 + openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml | 24 +- 5 files changed, 4766 insertions(+), 59 deletions(-) create mode 100644 openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml create mode 100644 openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf create mode 100644 openair3/TEST/EPC_TEST/generic_scenario.xsl diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml new file mode 100644 index 0000000000..fef45773f9 --- /dev/null +++ b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml @@ -0,0 +1,4242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf new file mode 100644 index 0000000000..e864f47edb --- /dev/null +++ b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf @@ -0,0 +1,174 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "95"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 120; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -26; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -108; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + } + ); + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.188.2.2"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "tun2"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.188.2.2/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.1/24"; + ENB_PORT_FOR_S1U = 2153; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + gtpu_log_level ="info"; + gtpu_log_verbosity ="medium"; + udp_log_level ="info"; + udp_log_verbosity ="medium"; + }; + + } +); diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index 6843766f95..eff91ea56f 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -43,6 +43,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -95,11 +98,64 @@ #define ENB_CONFIG_MAX_XSLT_PARAMS 64 Enb_properties_array_t g_enb_properties[2]; -char *g_test_dir = "."; // default value -char *g_pdml_in_basename = "trace.pdml"; // default value +char *g_openair_dir = NULL; +char *g_test_dir = NULL; +char *g_pdml_in_origin = NULL; +char *g_generic_scenario = NULL; extern int xmlLoadExtDtdDefaultValue; + +#define GENERATE_PDML_FILE 1 +#define GENERATE_GENERIC_SCENARIO 2 +#define GENERATE_DEDICATED_SCENARIO 4 + +#define GS_IS_FILE 1 +#define GS_IS_DIR 2 + //------------------------------------------------------------------------------ -void generate_scenario(const char const * pdml_in_basenameP) +// test if file exist in current directory +int is_file_exists( const char const * file_nameP, const char const *file_roleP) +{ + struct stat s; + int err = stat(file_nameP, &s); + if(-1 == err) { + if(ENOENT == errno) { + fprintf(stderr, "Please provide a valid %s, %s does not exist\n", file_roleP, file_nameP); + } else { + perror("stat"); + exit(1); + } + } else { + if(S_ISREG(s.st_mode)) { + return GS_IS_FILE; + } else if(S_ISDIR(s.st_mode)) { + return GS_IS_DIR; + } else { + fprintf(stderr, "Please provide a valid test %s, %s exists but is not found valid\n", file_roleP, file_nameP); + } + } + return 0; +} + +//------------------------------------------------------------------------------ +// return number of splitted items +int split_path( char * pathP, char *** resP) +{ + char * saveptr1; + char * p = strtok_r (pathP, "/", &saveptr1); + int n_spaces = 0; + + /// split string and append tokens to 'res' + while (p) { + *resP = realloc (*resP, sizeof (char*) * ++n_spaces); + AssertFatal (*resP, "realloc failed"); + (*resP)[n_spaces-1] = p; + p = strtok_r (NULL, "/", &saveptr1); + } + return n_spaces; +} + +//------------------------------------------------------------------------------ +void generate_generic_scenario(const char const * test_nameP, const char const * pdml_in_basenameP) //------------------------------------------------------------------------------ { //int fd_pdml_in; @@ -107,33 +163,58 @@ void generate_scenario(const char const * pdml_in_basenameP) xmlDocPtr doc, res; const char *params[ENB_CONFIG_MAX_XSLT_PARAMS]; int nb_params = 0; + int i,j; + char astring[1024]; + struct in_addr addr; - 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);*/ - - params[nb_params] = NULL; - xmlSubstituteEntitiesDefault(1); - xmlLoadExtDtdDefaultValue = 1; - cur = xsltParseStylesheetFile("enb_config.xsl"); - doc = xmlParseFile(pdml_in_basenameP); - res = xsltApplyStylesheet(cur, doc, params); - xsltSaveResultToFile(stdout, res, cur); - - xsltFreeStylesheet(cur); - xmlFreeDoc(res); - xmlFreeDoc(doc); - - xsltCleanupGlobals(); - xmlCleanupParser(); + memset(astring, 0, sizeof(astring)); + if (getcwd(astring, sizeof(astring)) != NULL) { + fprintf(stdout, "working in %s directory\n", astring); } else { - printf("Error: chdir %s returned %s\n", g_test_dir, strerror(errno)); - exit(-1); + perror("getcwd() error"); + exit(1); } + + memset(astring, 0, sizeof(astring)); + strcat(astring, g_openair_dir); + strcat(astring, "/openair3/TEST/EPC_TEST/generic_scenario.xsl"); + + xmlSubstituteEntitiesDefault(1); + xmlLoadExtDtdDefaultValue = 1; + cur = xsltParseStylesheetFile(astring); + doc = xmlParseFile(pdml_in_basenameP); + params[nb_params++] = "test_name"; + sprintf(astring, "\"%s\"", test_nameP); + params[nb_params++] = strdup(astring); + + for (i = 0; i < g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD].number; i++) { + // eNB S1-C IPv4 address + sprintf(astring, "enb_s1c%d", i); + params[nb_params++] = strdup(astring); + addr.s_addr = g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD].properties[i]->enb_ipv4_address_for_S1_MME; + sprintf(astring, "\"%s\"", inet_ntoa(addr)); + params[nb_params++] = strdup(astring); + + // MME S1-C IPv4 address + for (j = 0; j < g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD].properties[i]->nb_mme; j++) { + sprintf(astring, "mme_s1c%d_%d", i, j); + params[nb_params++] = strdup(astring); + AssertFatal (g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD].properties[i]->mme_ip_address[j].ipv4_address, + "Only support MME IPv4 address\n"); + sprintf(astring, "\"%s\"", g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD].properties[i]->mme_ip_address[j].ipv4_address); + params[nb_params++] = strdup(astring); + } + } + params[nb_params] = NULL; + res = xsltApplyStylesheet(cur, doc, params); + xsltSaveResultToFile(stdout, res, cur); + + xsltFreeStylesheet(cur); + xmlFreeDoc(res); + xmlFreeDoc(doc); + + xsltCleanupGlobals(); + xmlCleanupParser(); } //------------------------------------------------------------------------------ @@ -403,14 +484,77 @@ static void usage ( { fprintf (stdout, "Please report any bug to: openair4g-devel@lists.eurecom.fr\n\n"); fprintf (stdout, "Usage: %s [options]\n\n", argv[0]); + fprintf (stdout, "Mandatory options:\n"); + fprintf (stdout, "\t-t | --test-dir Directory where a set of files related to a particular test are located\n"); + fprintf (stdout, "\n"); fprintf (stdout, "Available options:\n"); - fprintf (stdout, "\t--help, -h Print this help and return\n"); - fprintf (stdout, "\t--new-enb-conf-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 config files in the original test\n"); - fprintf (stdout, "\t--old-enb-conf-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"); + fprintf (stdout, "\t-h | --help Print this help and return\n"); + fprintf (stdout, "\t-n | --new-enb-conf-file 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 config files in the original test\n"); + fprintf (stdout, "\t-o | --old-enb-conf-file 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"); + fprintf (stdout, "\t-p | --pdml File name (with no path) of an original scenario that has to be reworked (IP addresses) with new testbed\n"); + fprintf (stdout, "\t-s | --scenario-generic File name (with no path) of a scenario that has to be customized (IP addresses) with new testbed\n"); + fprintf (stdout, "\n"); + fprintf (stdout, "\n"); + fprintf (stdout, "Example of generate_scenario use cases: \n"); + fprintf (stdout, "\n"); + fprintf (stdout, " Case 1: generate a generix xml scenario from a captured pcap file: \n"); + fprintf (stdout, " +---------------------+ \n"); + fprintf (stdout, " |captured pcap-ng file| \n"); + fprintf (stdout, " +----------+----------+ \n"); + fprintf (stdout, " |\n"); + fprintf (stdout, " mme_test_s1_pcap2pdml \n"); + fprintf (stdout, " |\n"); + fprintf (stdout, " +--------V----------+ +------------------------+\n"); + fprintf (stdout, " |'pdml-in-orig' file| |'old-enb-conf-file' file|\n"); + fprintf (stdout, " +--------+----------+ +------------+-----------+\n"); + fprintf (stdout, " | |\n"); + fprintf (stdout, " +----------------------------+\n"); + fprintf (stdout, " |\n"); + fprintf (stdout, " generate_scenario -t -p -o \n"); + fprintf (stdout, " |\n"); + fprintf (stdout, " +------------V--------------+\n"); + fprintf (stdout, " +'xml-scenario-generic' file|\n"); + fprintf (stdout, " +---------------------------+\n"); + fprintf (stdout, "\n"); + fprintf (stdout, "\n"); + fprintf (stdout, " Case 2: generate a dedicated xml scenario from generic xml scenario:\n"); + fprintf (stdout, "\n"); + fprintf (stdout, " +---------------------------+ +------------------------+\n"); + fprintf (stdout, " |'xml-scenario-generic' file| |'new-enb-conf-file' file|\n"); + fprintf (stdout, " +--------+------------------+ +------------+-----------+\n"); + fprintf (stdout, " | |\n"); + fprintf (stdout, " +--------------------+---------------+\n"); + fprintf (stdout, " |\n"); + fprintf (stdout, " generate_scenario -t -s -n \n"); + fprintf (stdout, " |\n"); + fprintf (stdout, " +--------------V--------------+\n"); + fprintf (stdout, " +'xml-scenario-dedicated' file|\n"); + fprintf (stdout, " +-----------------------------+\n"); + fprintf (stdout, "\n"); + fprintf (stdout, "\n"); + fprintf (stdout, " Case 3 = case 1 + case 2: generate a dedicated xml scenario from a captured pcap file:\n"); + fprintf (stdout, "\n"); + fprintf (stdout, " +---------------------+\n"); + fprintf (stdout, " |captured pcap-ng file|\n"); + fprintf (stdout, " +----------+----------+\n"); + fprintf (stdout, " |\n"); + fprintf (stdout, " mme_test_s1_pcap2pdml \n"); + fprintf (stdout, " |\n"); + fprintf (stdout, " +------------------------+ +--------V----------+ +------------------------+\n"); + fprintf (stdout, " |'old-enb-conf-file' file| |'pdml-in-orig' file| |'new-enb-conf-file' file|\n"); + fprintf (stdout, " +------------+-----------+ +--------+----------+ +------------+-----------+\n"); + fprintf (stdout, " | | |\n"); + fprintf (stdout, " +----------------------+-------------------------+\n"); + fprintf (stdout, " |\n"); + fprintf (stdout, " V\n"); + fprintf (stdout, " generate_scenario -t -p -o -n \n"); + fprintf (stdout, " | ^ |\n"); + fprintf (stdout, " | | |\n"); + fprintf (stdout, " +--------------V------------+ +------------V----------------+\n"); + fprintf (stdout, " |'xml-scenario-generic' file| |'xml-scenario-dedicated' file|\n"); + fprintf (stdout, " +---------------------------+ +-----------------------------+\n"); } @@ -422,20 +566,29 @@ config_parse_opt_line ( //------------------------------------------------------------------------------ { int option; - char *enb_config_file_name = NULL; + int rv = 0; + char *new_enb_config_file_name = NULL; + char *old_enb_config_file_name = NULL; + char *pdml_in_file_name = NULL; + char *generic_scenario_file_name = NULL; + char *test_dir_name = NULL; enum long_option_e { LONG_OPTION_START = 0x100, /* Start after regular single char options */ LONG_OPTION_NEW_ENB_CONF_FILE, LONG_OPTION_OLD_ENB_CONF_FILE, - LONG_OPTION_PDML_IN_BASENAME, + LONG_OPTION_PDML, + LONG_OPTION_TEST_DIR, + LONG_OPTION_SCENARIO_GENERIC, LONG_OPTION_HELP, }; static struct option long_options[] = { {"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}, + {"pdml ", required_argument, 0, LONG_OPTION_PDML}, + {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, + {"scenario-generic", required_argument, 0, LONG_OPTION_SCENARIO_GENERIC}, {"help", required_argument, 0, LONG_OPTION_HELP}, {NULL, 0, NULL, 0} }; @@ -443,32 +596,53 @@ config_parse_opt_line ( /* * Parsing command line */ - while ((option = getopt_long (argc, argv, "hp:n:o", long_options, NULL)) != -1) { + while ((option = getopt_long (argc, argv, "hp:n:o:s:t", long_options, NULL)) != -1) { switch (option) { case LONG_OPTION_OLD_ENB_CONF_FILE: case 'o': if (optarg) { - 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)); + old_enb_config_file_name = optarg; + printf("Old eNB config file name is %s\n", old_enb_config_file_name); + rv |= GENERATE_GENERIC_SCENARIO; } break; case LONG_OPTION_NEW_ENB_CONF_FILE: case 'n': if (optarg) { - 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); + new_enb_config_file_name = optarg; + printf("New eNB config file name is %s\n", new_enb_config_file_name); + rv |= GENERATE_DEDICATED_SCENARIO; } break; - case LONG_OPTION_PDML_IN_BASENAME: + case LONG_OPTION_PDML: case 'p': if (optarg) { - g_pdml_in_basename = strdup(optarg); - printf("PDML input file name is %s\n", g_pdml_in_basename); + pdml_in_file_name = strdup(optarg); + printf("PDML input file name is %s\n", pdml_in_file_name); + rv |= GENERATE_GENERIC_SCENARIO; + } + break; + + case LONG_OPTION_TEST_DIR: + case 't': + if (optarg) { + test_dir_name = strdup(optarg); + if (is_file_exists(test_dir_name, "test dirname") != GS_IS_DIR) { + fprintf(stderr, "Please provide a valid test dirname, %s is not a valid directory name\n", test_dir_name); + exit(1); + } + printf("Test dir name is %s\n", test_dir_name); + } + break; + + case LONG_OPTION_SCENARIO_GENERIC: + case 's': + if (optarg) { + generic_scenario_file_name = strdup(optarg); + printf("Generic XML scenario input file name is %s\n", generic_scenario_file_name); + rv |= GENERATE_DEDICATED_SCENARIO; } break; @@ -479,18 +653,77 @@ config_parse_opt_line ( exit (0); } } - return 0; + if (NULL == test_dir_name) { + fprintf(stderr, "Please provide a valid test dirname\n"); + exit(1); + } + g_test_dir = test_dir_name; test_dir_name = NULL; + if (chdir(g_test_dir) != 0) { + fprintf(stderr, "Error: chdir %s returned %s\n", g_test_dir, strerror(errno)); + exit(1); + } + if (rv & GENERATE_GENERIC_SCENARIO) { + if (NULL == old_enb_config_file_name) { + fprintf(stderr, "Error: please provide the original eNB config file name that should be in %s\n", g_test_dir); + } + if (is_file_exists(old_enb_config_file_name, "Old eNB config file") != GS_IS_FILE) { + fprintf(stderr, "Error: original eNB config file name %s is not found in dir %s\n", old_enb_config_file_name, g_test_dir); + } + enb_config_display(ENB_CONFIG_PROPERTIES_INDEX_OLD); + enb_config_init(old_enb_config_file_name, ENB_CONFIG_PROPERTIES_INDEX_OLD); + + if (NULL == pdml_in_file_name) { + fprintf(stderr, "Error: please provide the PDML file name that should be in %s\n", g_test_dir); + } + if (is_file_exists(pdml_in_file_name, "PDML file") != GS_IS_FILE) { + fprintf(stderr, "Error: PDML file name %s is not found in dir %s\n", pdml_in_file_name, g_test_dir); + } + g_pdml_in_origin = pdml_in_file_name; pdml_in_file_name = NULL; + } + + if (rv & GENERATE_DEDICATED_SCENARIO) { + if (NULL == new_enb_config_file_name) { + fprintf(stderr, "Error: please provide the new eNB config file name that should be in %s\n", g_test_dir); + } + if (is_file_exists(new_enb_config_file_name, "New eNB config file") != GS_IS_FILE) { + fprintf(stderr, "Error: New eNB config file name %s is not found in dir %s\n", new_enb_config_file_name, g_test_dir); + } + enb_config_display(ENB_CONFIG_PROPERTIES_INDEX_NEW); + enb_config_init(new_enb_config_file_name, ENB_CONFIG_PROPERTIES_INDEX_NEW); + + if (NULL == generic_scenario_file_name) { + fprintf(stderr, "Error: please provide the Generic scenario file name that should be in %s\n", g_test_dir); + } + if (is_file_exists(generic_scenario_file_name, "Generic scenario file") != GS_IS_FILE) { + fprintf(stderr, "Error: Generic scenario file name %s is not found in dir %s\n", generic_scenario_file_name, g_test_dir); + } + g_generic_scenario = generic_scenario_file_name; generic_scenario_file_name = NULL; + } + return rv; } //------------------------------------------------------------------------------ int main( int argc, char **argv ) //------------------------------------------------------------------------------ { + int actions = 0; + + g_openair_dir = getenv("OPENAIR_DIR"); + if (NULL == g_openair_dir) { + fprintf(stderr, "Error: Could not get OPENAIR_DIR environment variable\n"); + exit(1); + } + 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); + + actions = config_parse_opt_line (argc, argv); //Command-line options + if (actions & GENERATE_GENERIC_SCENARIO) { + generate_generic_scenario(g_test_dir, g_pdml_in_origin); + } + /*if (actions & GENERATE_DEDICATED_SCENARIO) { + generate_dedicated_scenario(g_test_dir, g_pdml_in_origin); + }*/ + return 0; } diff --git a/openair3/TEST/EPC_TEST/generic_scenario.xsl b/openair3/TEST/EPC_TEST/generic_scenario.xsl new file mode 100644 index 0000000000..99672a28f0 --- /dev/null +++ b/openair3/TEST/EPC_TEST/generic_scenario.xsl @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml b/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml index b0a77e60f5..796fa9a45b 100755 --- a/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml +++ b/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml @@ -35,14 +35,25 @@ packets = orig_dom.getElementsByTagName("packet") for packet in packets: found_sctp = False found_s1ap = False + sctp_node = None + frame_node = None + ip_node = None protos = packet.getElementsByTagName("proto") for proto in protos: attrs = proto.attributes urlnode = attrs['name'] - if urlnode.nodeValue == 'sctp': + if urlnode.nodeValue == 'frame': + frame_node = proto + elif urlnode.nodeValue == 'ip': + frame_node.appendChild(proto) + ip_node = proto + elif urlnode.nodeValue == 'sctp': found_sctp = True + ip_node.appendChild(proto) + sctp_node = proto elif urlnode.nodeValue == 's1ap': found_s1ap = True + sctp_node.appendChild(proto) elif urlnode.nodeValue == 'geninfo': packet.removeChild(proto) elif urlnode.nodeValue == 'eth': @@ -54,20 +65,21 @@ for packet in packets: ##################### # dom to xml string ##################### -filtered_pdml_string = orig_dom.toxml() +filtered_pdml_string = orig_dom.toprettyxml(indent=" ") cleaned_pdml_string = "" ##################### # remove blank lines in xml string ##################### lines = filtered_pdml_string.splitlines() for line in lines: - if line[:-1]: - cleaned_pdml_string += line + '\r\n' + if len(line.strip()): + if line[:-1]: + cleaned_pdml_string += line + '\r\n' #print "'%s'" % cleaned_pdml_string ##################### # write pdml string to pdml file ##################### -out_pdml_file_name = os.path.dirname(orig_pcap_file_name) + os.path.splitext(os.path.basename(orig_pcap_file_name))[0] + '.pdml' +out_pdml_file_name = os.path.dirname(orig_pcap_file_name) + '/' + os.path.splitext(os.path.basename(orig_pcap_file_name))[0] + '.pdml' out_file = open(out_pdml_file_name, "w") out_file.write(cleaned_pdml_string) out_file.close() @@ -86,7 +98,7 @@ filtered_html_string = etree.tostring(trans_root) ##################### # write html string to html file ##################### -out_html_file_name = os.path.dirname(orig_pcap_file_name) + os.path.splitext(os.path.basename(orig_pcap_file_name))[0] + '.html' +out_html_file_name = os.path.dirname(orig_pcap_file_name) + '/' +os.path.splitext(os.path.basename(orig_pcap_file_name))[0] + '.html' out_file = open(out_html_file_name, "w") out_file.write(filtered_html_string) out_file.close() From e8c40e78efc35ad3c284c494a718b42cffb68b9f Mon Sep 17 00:00:00 2001 From: gauthier Date: Wed, 4 Nov 2015 10:57:03 +0100 Subject: [PATCH 004/122] generated an initial 'generic' scenario. --- openair3/TEST/EPC_TEST/generate_scenario.c | 69 ++++++- openair3/TEST/EPC_TEST/generic_scenario.xsl | 214 +++++++++++++++++++- 2 files changed, 264 insertions(+), 19 deletions(-) diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index eff91ea56f..c5289142b5 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -36,6 +36,7 @@ */ #include +#include #include #include #include @@ -95,7 +96,7 @@ #define ENB_CONFIG_PROPERTIES_INDEX_OLD 0 #define ENB_CONFIG_PROPERTIES_INDEX_NEW 1 -#define ENB_CONFIG_MAX_XSLT_PARAMS 64 +#define ENB_CONFIG_MAX_XSLT_PARAMS 32 Enb_properties_array_t g_enb_properties[2]; char *g_openair_dir = NULL; @@ -136,6 +137,25 @@ int is_file_exists( const char const * file_nameP, const char const *file_roleP) return 0; } + +//------------------------------------------------------------------------------ +int strip_extension(char *in_filename) +{ + static const uint8_t name_min_len = 1; + static const uint8_t max_ext_len = 5; // .pdml ! + fprintf(stdout, "strip_extension %s\n", in_filename); + + if (NULL != in_filename) { + /* Check chars starting at end of string to find last '.' */ + for (ssize_t i = strlen(in_filename); i > (name_min_len + max_ext_len); i--) { + if (in_filename[i] == '.') { + in_filename[i] = '\0'; + return i; + } + } + } + return -1; +} //------------------------------------------------------------------------------ // return number of splitted items int split_path( char * pathP, char *** resP) @@ -155,18 +175,21 @@ int split_path( char * pathP, char *** resP) } //------------------------------------------------------------------------------ -void generate_generic_scenario(const char const * test_nameP, const char const * pdml_in_basenameP) +int generate_generic_scenario(const char const * test_nameP, const char const * pdml_in_basenameP) //------------------------------------------------------------------------------ { //int fd_pdml_in; xsltStylesheetPtr cur = NULL; xmlDocPtr doc, res; - const char *params[ENB_CONFIG_MAX_XSLT_PARAMS]; + FILE *generic_scenario_file = NULL; + const char generic_scenario_filename[NAME_MAX]; + const char *params[2*ENB_CONFIG_MAX_XSLT_PARAMS]; int nb_params = 0; int i,j; char astring[1024]; struct in_addr addr; + memset(generic_scenario_filename, 0, sizeof(generic_scenario_filename)); memset(astring, 0, sizeof(astring)); if (getcwd(astring, sizeof(astring)) != NULL) { fprintf(stdout, "working in %s directory\n", astring); @@ -182,7 +205,18 @@ void generate_generic_scenario(const char const * test_nameP, const char const * xmlSubstituteEntitiesDefault(1); xmlLoadExtDtdDefaultValue = 1; cur = xsltParseStylesheetFile(astring); + if (NULL == cur) { + AssertFatal (0, "Could not parse stylesheet file %s (check OPENAIR_DIR env variable)!\n", astring); + } else { + fprintf(stdout, "XSLT style sheet: %s\n", astring); + } + doc = xmlParseFile(pdml_in_basenameP); + if (NULL == doc) { + AssertFatal (0, "Could not parse pdml file %s!\n", pdml_in_basenameP); + } else { + fprintf(stdout, "pdml file: %s\n", pdml_in_basenameP); + } params[nb_params++] = "test_name"; sprintf(astring, "\"%s\"", test_nameP); params[nb_params++] = strdup(astring); @@ -207,8 +241,25 @@ void generate_generic_scenario(const char const * test_nameP, const char const * } params[nb_params] = NULL; res = xsltApplyStylesheet(cur, doc, params); - xsltSaveResultToFile(stdout, res, cur); - + if (NULL != res) { + // since pdml filename is not relative (no path), just filename in current directory we can safely remove + sprintf(generic_scenario_filename,"%s",pdml_in_basenameP); + if (strip_extension(generic_scenario_filename) > 0) { + strcat(generic_scenario_filename, "_generic_scenario.xml"); + generic_scenario_file = fopen( generic_scenario_filename, "w+"); + if (NULL != generic_scenario_file) { + xsltSaveResultToFile(generic_scenario_file, res, cur); + fclose(generic_scenario_file); + fprintf(stdout, "Wrote generic scenario to %s\n", generic_scenario_filename); + } else { + fprintf(stderr, "Error in fopen(%s)\n", generic_scenario_filename); + } + } else { + fprintf(stderr, "Error in strip_extension()\n"); + } + } else { + fprintf(stderr, "Error in xsltApplyStylesheet()\n"); + } xsltFreeStylesheet(cur); xmlFreeDoc(res); xmlFreeDoc(doc); @@ -494,7 +545,7 @@ static void usage ( fprintf (stdout, "\t-o | --old-enb-conf-file 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"); fprintf (stdout, "\t-p | --pdml File name (with no path) of an original scenario that has to be reworked (IP addresses) with new testbed\n"); - fprintf (stdout, "\t-s | --scenario-generic File name (with no path) of a scenario that has to be customized (IP addresses) with new testbed\n"); + fprintf (stdout, "\t-s | --scenario-generic File name (with no path) of a scenario that has to be customized (IP addresses) with new testbed\n"); fprintf (stdout, "\n"); fprintf (stdout, "\n"); fprintf (stdout, "Example of generate_scenario use cases: \n"); @@ -596,7 +647,7 @@ config_parse_opt_line ( /* * Parsing command line */ - while ((option = getopt_long (argc, argv, "hp:n:o:s:t", long_options, NULL)) != -1) { + while ((option = getopt_long (argc, argv, "hp:n:o:s:t:", long_options, NULL)) != -1) { switch (option) { case LONG_OPTION_OLD_ENB_CONF_FILE: case 'o': @@ -669,8 +720,8 @@ config_parse_opt_line ( if (is_file_exists(old_enb_config_file_name, "Old eNB config file") != GS_IS_FILE) { fprintf(stderr, "Error: original eNB config file name %s is not found in dir %s\n", old_enb_config_file_name, g_test_dir); } - enb_config_display(ENB_CONFIG_PROPERTIES_INDEX_OLD); enb_config_init(old_enb_config_file_name, ENB_CONFIG_PROPERTIES_INDEX_OLD); + enb_config_display(ENB_CONFIG_PROPERTIES_INDEX_OLD); if (NULL == pdml_in_file_name) { fprintf(stderr, "Error: please provide the PDML file name that should be in %s\n", g_test_dir); @@ -688,8 +739,8 @@ config_parse_opt_line ( if (is_file_exists(new_enb_config_file_name, "New eNB config file") != GS_IS_FILE) { fprintf(stderr, "Error: New eNB config file name %s is not found in dir %s\n", new_enb_config_file_name, g_test_dir); } - enb_config_display(ENB_CONFIG_PROPERTIES_INDEX_NEW); enb_config_init(new_enb_config_file_name, ENB_CONFIG_PROPERTIES_INDEX_NEW); + enb_config_display(ENB_CONFIG_PROPERTIES_INDEX_NEW); if (NULL == generic_scenario_file_name) { fprintf(stderr, "Error: please provide the Generic scenario file name that should be in %s\n", g_test_dir); diff --git a/openair3/TEST/EPC_TEST/generic_scenario.xsl b/openair3/TEST/EPC_TEST/generic_scenario.xsl index 99672a28f0..ab0e7f1123 100644 --- a/openair3/TEST/EPC_TEST/generic_scenario.xsl +++ b/openair3/TEST/EPC_TEST/generic_scenario.xsl @@ -8,16 +8,103 @@ encoding="iso-8859-1" /> - + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + enb_s1c0 + enb_s1c1 + enb_s1c2 + enb_s1c3 + enb_s1c4 + enb_s1c5 + mme_s1c0_0 + mme_s1c0_1 + mme_s1c0_2 + mme_s1c0_3 + mme_s1c1_0 + mme_s1c1_1 + mme_s1c1_2" + mme_s1c1_3 + reverse_ip_yourself + + + + + + + DATA + INIT + INIT_ACK + SACK + HEARTBEAT + HEARTBEAT_ACK + ABORT + SHUTDOWN + SHUTDOWN_ACK + ERROR + COOKIE_ECHO + COOKIE_ACK + ECNE + CWR + SHUTDOWN_COMPLETE + UNKNOWN_CHUNK_TYPE + + + + + + + + + + + + + - - - + + + + + + + + + + + @@ -25,22 +112,129 @@ - + + + + + + + + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - From 12b871086da60688b7d15aeac269345e533b9c6c Mon Sep 17 00:00:00 2001 From: gauthier Date: Wed, 4 Nov 2015 12:26:41 +0100 Subject: [PATCH 005/122] Removed dedicated scenario option, fixed scenario name(xml attribute) = pdml filename --- openair3/TEST/EPC_TEST/generate_scenario.c | 212 +++++++-------------- openair3/TEST/EPC_TEST/generate_scenario.h | 2 +- 2 files changed, 65 insertions(+), 149 deletions(-) diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index c5289142b5..4cb21f9604 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -93,12 +93,10 @@ #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 #define ENB_CONFIG_MAX_XSLT_PARAMS 32 -Enb_properties_array_t g_enb_properties[2]; +Enb_properties_array_t g_enb_properties; char *g_openair_dir = NULL; char *g_test_dir = NULL; char *g_pdml_in_origin = NULL; @@ -107,7 +105,6 @@ extern int xmlLoadExtDtdDefaultValue; #define GENERATE_PDML_FILE 1 #define GENERATE_GENERIC_SCENARIO 2 -#define GENERATE_DEDICATED_SCENARIO 4 #define GS_IS_FILE 1 #define GS_IS_DIR 2 @@ -187,6 +184,7 @@ int generate_generic_scenario(const char const * test_nameP, const char const * int nb_params = 0; int i,j; char astring[1024]; + char *astring2 = NULL; struct in_addr addr; memset(generic_scenario_filename, 0, sizeof(generic_scenario_filename)); @@ -218,24 +216,32 @@ int generate_generic_scenario(const char const * test_nameP, const char const * fprintf(stdout, "pdml file: %s\n", pdml_in_basenameP); } params[nb_params++] = "test_name"; - sprintf(astring, "\"%s\"", test_nameP); + sprintf(astring, "%s", pdml_in_basenameP); + if (strip_extension(astring) > 0) { + astring2 = strdup(astring); + sprintf(astring, "\"%s\"", astring2); + free(astring2); + astring2 = NULL; + } else { + fprintf(stderr, "Assigning test name failed: %s\n", astring); + } params[nb_params++] = strdup(astring); - for (i = 0; i < g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD].number; i++) { + for (i = 0; i < g_enb_properties.number; i++) { // eNB S1-C IPv4 address sprintf(astring, "enb_s1c%d", i); params[nb_params++] = strdup(astring); - addr.s_addr = g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD].properties[i]->enb_ipv4_address_for_S1_MME; + addr.s_addr = g_enb_properties.properties[i]->enb_ipv4_address_for_S1_MME; sprintf(astring, "\"%s\"", inet_ntoa(addr)); params[nb_params++] = strdup(astring); // MME S1-C IPv4 address - for (j = 0; j < g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD].properties[i]->nb_mme; j++) { + for (j = 0; j < g_enb_properties.properties[i]->nb_mme; j++) { sprintf(astring, "mme_s1c%d_%d", i, j); params[nb_params++] = strdup(astring); - AssertFatal (g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD].properties[i]->mme_ip_address[j].ipv4_address, + AssertFatal (g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address, "Only support MME IPv4 address\n"); - sprintf(astring, "\"%s\"", g_enb_properties[ENB_CONFIG_PROPERTIES_INDEX_OLD].properties[i]->mme_ip_address[j].ipv4_address); + sprintf(astring, "\"%s\"", g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address); params[nb_params++] = strdup(astring); } } @@ -269,26 +275,26 @@ int generate_generic_scenario(const char const * test_nameP, const char const * } //------------------------------------------------------------------------------ -static void enb_config_display(const boolean_t new_config_fileP) +static void enb_config_display(void) //------------------------------------------------------------------------------ { int i; printf( "\n----------------------------------------------------------------------\n"); - printf( " %s ENB CONFIG FILE CONTENT LOADED:\n", new_config_fileP == ENB_CONFIG_PROPERTIES_INDEX_OLD ? "Old":"New"); + printf( " ENB CONFIG FILE CONTENT LOADED:\n"); printf( "----------------------------------------------------------------------\n"); - for (i = 0; i < g_enb_properties[new_config_fileP].number; i++) { + for (i = 0; i < g_enb_properties.number; i++) { printf( "ENB CONFIG for instance %u:\n\n", i); - 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); + 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[new_config_fileP].properties[i]->mnc_digit_length == 3) { - printf( "\tMNC: \t%03"PRIu16"\n",g_enb_properties[new_config_fileP].properties[i]->mnc); + if (g_enb_properties.properties[i]->mnc_digit_length == 3) { + printf( "\tMNC: \t%03"PRIu16"\n",g_enb_properties.properties[i]->mnc); } else { - printf( "\tMNC: \t%02"PRIu16"\n",g_enb_properties[new_config_fileP].properties[i]->mnc); + printf( "\tMNC: \t%02"PRIu16"\n",g_enb_properties.properties[i]->mnc); } printf( "\n--------------------------------------------------------\n"); } @@ -301,7 +307,7 @@ static void enb_config_display(const boolean_t new_config_fileP) #define libconfig_int int #endif //------------------------------------------------------------------------------ -void enb_config_init(const char const * lib_config_file_name_pP, const boolean_t new_config_fileP) +void enb_config_init(const char const * lib_config_file_name_pP) //------------------------------------------------------------------------------ { config_t cfg; @@ -336,9 +342,7 @@ void enb_config_init(const char const * lib_config_file_name_pP, const boolean_ char *address = NULL; char *cidr = 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); @@ -374,7 +378,7 @@ void enb_config_init(const char const * lib_config_file_name_pP, const boolean_ setting = config_lookup(&cfg, ENB_CONFIG_STRING_ENB_LIST); if (setting != NULL) { - enb_properties_index = g_enb_properties[new_config_fileP].number; + enb_properties_index = g_enb_properties.number; parse_errors = 0; num_enbs = config_setting_length(setting); @@ -411,34 +415,34 @@ void enb_config_init(const char const * lib_config_file_name_pP, const boolean_ // search if in active list for (j=0; j < num_enb_properties; j++) { if (strcmp(active_enb[j], enb_name) == 0) { - g_enb_properties[new_config_fileP].properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t)); + g_enb_properties.properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t)); - g_enb_properties[new_config_fileP].properties[enb_properties_index]->eNB_id = enb_id; + g_enb_properties.properties[enb_properties_index]->eNB_id = enb_id; if (strcmp(cell_type, "CELL_MACRO_ENB") == 0) { - g_enb_properties[new_config_fileP].properties[enb_properties_index]->cell_type = CELL_MACRO_ENB; + g_enb_properties.properties[enb_properties_index]->cell_type = CELL_MACRO_ENB; } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) { - g_enb_properties[new_config_fileP].properties[enb_properties_index]->cell_type = CELL_HOME_ENB; + g_enb_properties.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[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), + 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), "BAD MNC DIGIT LENGTH %d", - g_enb_properties[new_config_fileP].properties[i]->mnc_digit_length); + g_enb_properties.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[new_config_fileP].properties[enb_properties_index]->nb_mme = 0; + g_enb_properties.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); @@ -456,22 +460,22 @@ void enb_config_init(const char const * lib_config_file_name_pP, const boolean_ continue; // FIXME will prevent segfaults below, not sure what happens at function exit... } - g_enb_properties[new_config_fileP].properties[enb_properties_index]->nb_mme += 1; + g_enb_properties.properties[enb_properties_index]->nb_mme += 1; - 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); + 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); if (strcmp(active, "yes") == 0) { - g_enb_properties[new_config_fileP].properties[enb_properties_index]->mme_ip_address[j].active = 1; + g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].active = 1; } // else { (calloc) if (strcmp(preference, "ipv4") == 0) { - g_enb_properties[new_config_fileP].properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; + g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; } else if (strcmp(preference, "ipv6") == 0) { - g_enb_properties[new_config_fileP].properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; + g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; } else if (strcmp(preference, "no") == 0) { - 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; + 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; } } @@ -493,22 +497,22 @@ void enb_config_init(const char const * lib_config_file_name_pP, const boolean_ &enb_port_for_S1U) ) ) { - g_enb_properties[new_config_fileP].properties[enb_properties_index]->enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U); + g_enb_properties.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[new_config_fileP].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.properties[enb_properties_index]->enb_ipv4_address_for_S1U, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); } - 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_port_for_S1U = enb_port_for_S1U; - g_enb_properties[new_config_fileP].properties[enb_properties_index]->enb_interface_name_for_S1_MME = strdup(enb_interface_name_for_S1_MME); + g_enb_properties.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[new_config_fileP].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.properties[enb_properties_index]->enb_ipv4_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR eNB S1_MME !\n" ); } } } // if (subsetting != NULL) { @@ -518,7 +522,7 @@ void enb_config_init(const char const * lib_config_file_name_pP, const boolean_ } // for (i = 0; i < num_enbs; i++) } // if (setting != NULL) { - g_enb_properties[new_config_fileP].number += num_enb_properties; + g_enb_properties.number += num_enb_properties; AssertFatal (parse_errors == 0, @@ -540,22 +544,19 @@ static void usage ( fprintf (stdout, "\n"); fprintf (stdout, "Available options:\n"); fprintf (stdout, "\t-h | --help Print this help and return\n"); - fprintf (stdout, "\t-n | --new-enb-conf-file 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 config files in the original test\n"); fprintf (stdout, "\t-o | --old-enb-conf-file 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"); fprintf (stdout, "\t-p | --pdml File name (with no path) of an original scenario that has to be reworked (IP addresses) with new testbed\n"); - fprintf (stdout, "\t-s | --scenario-generic File name (with no path) of a scenario that has to be customized (IP addresses) with new testbed\n"); fprintf (stdout, "\n"); fprintf (stdout, "\n"); - fprintf (stdout, "Example of generate_scenario use cases: \n"); + fprintf (stdout, "Example of generate_scenario use case: \n"); fprintf (stdout, "\n"); - fprintf (stdout, " Case 1: generate a generix xml scenario from a captured pcap file: \n"); + fprintf (stdout, " Generate a generix xml scenario from a captured pcap file: \n"); fprintf (stdout, " +---------------------+ \n"); fprintf (stdout, " |captured pcap-ng file| \n"); fprintf (stdout, " +----------+----------+ \n"); fprintf (stdout, " |\n"); - fprintf (stdout, " mme_test_s1_pcap2pdml \n"); + fprintf (stdout, " mme_test_s1_pcap2pdml --pcap_file <`captured pcap-ng file`>\n"); fprintf (stdout, " |\n"); fprintf (stdout, " +--------V----------+ +------------------------+\n"); fprintf (stdout, " |'pdml-in-orig' file| |'old-enb-conf-file' file|\n"); @@ -563,52 +564,14 @@ static void usage ( fprintf (stdout, " | |\n"); fprintf (stdout, " +----------------------------+\n"); fprintf (stdout, " |\n"); - fprintf (stdout, " generate_scenario -t -p -o \n"); + fprintf (stdout, " generate_scenario -t -p <'pdml-in-orig' file> -o <'old-enb-conf-file' file> \n"); fprintf (stdout, " |\n"); fprintf (stdout, " +------------V--------------+\n"); fprintf (stdout, " +'xml-scenario-generic' file|\n"); fprintf (stdout, " +---------------------------+\n"); fprintf (stdout, "\n"); - fprintf (stdout, "\n"); - fprintf (stdout, " Case 2: generate a dedicated xml scenario from generic xml scenario:\n"); - fprintf (stdout, "\n"); - fprintf (stdout, " +---------------------------+ +------------------------+\n"); - fprintf (stdout, " |'xml-scenario-generic' file| |'new-enb-conf-file' file|\n"); - fprintf (stdout, " +--------+------------------+ +------------+-----------+\n"); - fprintf (stdout, " | |\n"); - fprintf (stdout, " +--------------------+---------------+\n"); - fprintf (stdout, " |\n"); - fprintf (stdout, " generate_scenario -t -s -n \n"); - fprintf (stdout, " |\n"); - fprintf (stdout, " +--------------V--------------+\n"); - fprintf (stdout, " +'xml-scenario-dedicated' file|\n"); - fprintf (stdout, " +-----------------------------+\n"); - fprintf (stdout, "\n"); - fprintf (stdout, "\n"); - fprintf (stdout, " Case 3 = case 1 + case 2: generate a dedicated xml scenario from a captured pcap file:\n"); - fprintf (stdout, "\n"); - fprintf (stdout, " +---------------------+\n"); - fprintf (stdout, " |captured pcap-ng file|\n"); - fprintf (stdout, " +----------+----------+\n"); - fprintf (stdout, " |\n"); - fprintf (stdout, " mme_test_s1_pcap2pdml \n"); - fprintf (stdout, " |\n"); - fprintf (stdout, " +------------------------+ +--------V----------+ +------------------------+\n"); - fprintf (stdout, " |'old-enb-conf-file' file| |'pdml-in-orig' file| |'new-enb-conf-file' file|\n"); - fprintf (stdout, " +------------+-----------+ +--------+----------+ +------------+-----------+\n"); - fprintf (stdout, " | | |\n"); - fprintf (stdout, " +----------------------+-------------------------+\n"); - fprintf (stdout, " |\n"); - fprintf (stdout, " V\n"); - fprintf (stdout, " generate_scenario -t -p -o -n \n"); - fprintf (stdout, " | ^ |\n"); - fprintf (stdout, " | | |\n"); - fprintf (stdout, " +--------------V------------+ +------------V----------------+\n"); - fprintf (stdout, " |'xml-scenario-generic' file| |'xml-scenario-dedicated' file|\n"); - fprintf (stdout, " +---------------------------+ +-----------------------------+\n"); } - //------------------------------------------------------------------------------ int config_parse_opt_line ( @@ -618,28 +581,22 @@ config_parse_opt_line ( { int option; int rv = 0; - char *new_enb_config_file_name = NULL; char *old_enb_config_file_name = NULL; char *pdml_in_file_name = NULL; - char *generic_scenario_file_name = NULL; char *test_dir_name = NULL; enum long_option_e { LONG_OPTION_START = 0x100, /* Start after regular single char options */ - LONG_OPTION_NEW_ENB_CONF_FILE, LONG_OPTION_OLD_ENB_CONF_FILE, LONG_OPTION_PDML, LONG_OPTION_TEST_DIR, - LONG_OPTION_SCENARIO_GENERIC, LONG_OPTION_HELP, }; static struct option long_options[] = { {"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 ", required_argument, 0, LONG_OPTION_PDML}, {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, - {"scenario-generic", required_argument, 0, LONG_OPTION_SCENARIO_GENERIC}, {"help", required_argument, 0, LONG_OPTION_HELP}, {NULL, 0, NULL, 0} }; @@ -658,15 +615,6 @@ config_parse_opt_line ( } break; - case LONG_OPTION_NEW_ENB_CONF_FILE: - case 'n': - if (optarg) { - new_enb_config_file_name = optarg; - printf("New eNB config file name is %s\n", new_enb_config_file_name); - rv |= GENERATE_DEDICATED_SCENARIO; - } - break; - case LONG_OPTION_PDML: case 'p': if (optarg) { @@ -688,15 +636,6 @@ config_parse_opt_line ( } break; - case LONG_OPTION_SCENARIO_GENERIC: - case 's': - if (optarg) { - generic_scenario_file_name = strdup(optarg); - printf("Generic XML scenario input file name is %s\n", generic_scenario_file_name); - rv |= GENERATE_DEDICATED_SCENARIO; - } - break; - case LONG_OPTION_HELP: case 'h': default: @@ -720,8 +659,8 @@ config_parse_opt_line ( if (is_file_exists(old_enb_config_file_name, "Old eNB config file") != GS_IS_FILE) { fprintf(stderr, "Error: original eNB config file name %s is not found in dir %s\n", old_enb_config_file_name, g_test_dir); } - enb_config_init(old_enb_config_file_name, ENB_CONFIG_PROPERTIES_INDEX_OLD); - enb_config_display(ENB_CONFIG_PROPERTIES_INDEX_OLD); + enb_config_init(old_enb_config_file_name); + enb_config_display(); if (NULL == pdml_in_file_name) { fprintf(stderr, "Error: please provide the PDML file name that should be in %s\n", g_test_dir); @@ -731,25 +670,6 @@ config_parse_opt_line ( } g_pdml_in_origin = pdml_in_file_name; pdml_in_file_name = NULL; } - - if (rv & GENERATE_DEDICATED_SCENARIO) { - if (NULL == new_enb_config_file_name) { - fprintf(stderr, "Error: please provide the new eNB config file name that should be in %s\n", g_test_dir); - } - if (is_file_exists(new_enb_config_file_name, "New eNB config file") != GS_IS_FILE) { - fprintf(stderr, "Error: New eNB config file name %s is not found in dir %s\n", new_enb_config_file_name, g_test_dir); - } - enb_config_init(new_enb_config_file_name, ENB_CONFIG_PROPERTIES_INDEX_NEW); - enb_config_display(ENB_CONFIG_PROPERTIES_INDEX_NEW); - - if (NULL == generic_scenario_file_name) { - fprintf(stderr, "Error: please provide the Generic scenario file name that should be in %s\n", g_test_dir); - } - if (is_file_exists(generic_scenario_file_name, "Generic scenario file") != GS_IS_FILE) { - fprintf(stderr, "Error: Generic scenario file name %s is not found in dir %s\n", generic_scenario_file_name, g_test_dir); - } - g_generic_scenario = generic_scenario_file_name; generic_scenario_file_name = NULL; - } return rv; } @@ -765,16 +685,12 @@ int main( int argc, char **argv ) exit(1); } - 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])); + memset((char*) &g_enb_properties, 0 , sizeof(g_enb_properties)); actions = config_parse_opt_line (argc, argv); //Command-line options if (actions & GENERATE_GENERIC_SCENARIO) { generate_generic_scenario(g_test_dir, g_pdml_in_origin); } - /*if (actions & GENERATE_DEDICATED_SCENARIO) { - generate_dedicated_scenario(g_test_dir, g_pdml_in_origin); - }*/ return 0; } diff --git a/openair3/TEST/EPC_TEST/generate_scenario.h b/openair3/TEST/EPC_TEST/generate_scenario.h index c3b42ea253..88c0d28e17 100755 --- a/openair3/TEST/EPC_TEST/generate_scenario.h +++ b/openair3/TEST/EPC_TEST/generate_scenario.h @@ -126,7 +126,7 @@ typedef struct Enb_properties_array_s { 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); +void enb_config_init(const char const * lib_config_file_name_pP); #endif /* ENB_CONFIG_H_ */ /** @} */ From d03f78a4031bf62d4ea1b43b0a83e899027ec84c Mon Sep 17 00:00:00 2001 From: gauthier Date: Fri, 6 Nov 2015 10:03:26 +0100 Subject: [PATCH 006/122] Cleaned xml output, now a S1C test scenario is generated, ready to be parsed. --- cmake_targets/CMakeLists.txt | 66 ++- cmake_targets/tools/build_test_epc_tools | 4 + openair2/ENB_APP/enb_config.c | 2 +- openair2/ENB_APP/enb_config.h | 1 + openair3/TEST/EPC_TEST/generate_scenario.c | 103 ++--- openair3/TEST/EPC_TEST/generate_scenario.h | 0 openair3/TEST/EPC_TEST/generic_scenario.xsl | 421 ++++++++++---------- openair3/TEST/EPC_TEST/play_scenario.c | 405 +++++++++++++++++++ openair3/TEST/EPC_TEST/play_scenario.h | 49 +++ openair3/TEST/EPC_TEST/play_scenario.xsl | 113 ++++++ 10 files changed, 901 insertions(+), 263 deletions(-) mode change 100755 => 100644 openair3/TEST/EPC_TEST/generate_scenario.h create mode 100644 openair3/TEST/EPC_TEST/play_scenario.c create mode 100644 openair3/TEST/EPC_TEST/play_scenario.h create mode 100644 openair3/TEST/EPC_TEST/play_scenario.xsl diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 6b9dae6b04..42e381dd68 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -162,24 +162,47 @@ add_definitions(-DCMAKER) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2") -# Below has been put in comment because does not work with -# SVN authentication. -# -#find_package(Subversion) -#if(SUBVERSION_FOUND) -# Subversion_WC_INFO(${OPENAIR_DIR} openair) -# set (FIRMWARE_VERSION "${openair_WC_REVISION} - ${openair_WC_LAST_CHANGED_DATE}") -# Subversion_WC_LOG(${OPENAIR_DIR} Project) -#else() -# set (FIRMWARE_VERSION "No svn information") -#endif() -#add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"") + + +set(GIT_BRANCH "UNKNOWN") +set(GIT_COMMIT_HASH "UNKNOWN") +set(GIT_COMMIT_DATE "UNKNOWN") + + +find_package(Git) +if(GIT_FOUND) + message("git found: ${GIT_EXECUTABLE}") + # Get the current working branch + execute_process( + COMMAND git rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # Get the latest abbreviated commit hash of the working branch + execute_process( + COMMAND git log -1 --format=%h + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # Get the latest commit date of the working branch + execute_process( + COMMAND git log -1 --format=%cd + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_DATE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +endif() + # Below is a hard-coded info set (FIRMWARE_VERSION "No svn information") add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"") -add_definitions("-DPACKAGE_VERSION=\"${FIRMWARE_VERSION}\"") -add_definitions("-DPACKAGE_BUGREPORT=\"OpenAirInterface web site\"") +add_definitions("-DPACKAGE_VERSION=\"Branch: ${GIT_BRANCH} Abrev. Hash: ${GIT_COMMIT_HASH} Date: ${GIT_COMMIT_DATE}\"") +add_definitions("-DPACKAGE_BUGREPORT=\"openair4g-devel@lists.eurecom.fr\"") @@ -1615,6 +1638,7 @@ endforeach(myExe) add_executable(test_epc_generate_scenario ${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.h ${OPENAIR2_DIR}/ENB_APP/enb_config.h ${OPENAIR2_DIR}/COMMON/commonDef.h ${OPENAIR2_DIR}/COMMON/messages_def.h @@ -1626,6 +1650,20 @@ 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 ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} ) +add_executable(test_epc_play_scenario + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.h + ${OPENAIR2_DIR}/ENB_APP/enb_config.h + ${OPENAIR2_DIR}/COMMON/commonDef.h + ${OPENAIR2_DIR}/COMMON/messages_def.h + ${OPENAIR2_DIR}/COMMON/messages_types.h + ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h + ${OPENAIR_BIN_DIR}/messages_xml.h + ) +target_link_libraries (test_epc_play_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 ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + ) + #unitary tests for Core NEtwork pieces ################################# diff --git a/cmake_targets/tools/build_test_epc_tools b/cmake_targets/tools/build_test_epc_tools index aff2a26fc0..10dc4fd256 100755 --- a/cmake_targets/tools/build_test_epc_tools +++ b/cmake_targets/tools/build_test_epc_tools @@ -121,6 +121,7 @@ function main() echo "Cleaning TEST_EPC" fi rm -f $OPENAIR_DIR/targets/bin/test_epc_generate_scenario + rm -f $OPENAIR_DIR/targets/bin/test_epc_play_scenario rm -Rf build 2>&1 mkdir -m 777 -p -v build fi @@ -140,6 +141,9 @@ function main() compilations \ epc_test test_epc_generate_scenario \ test_epc_generate_scenario $dbin/test_epc_generate_scenario + compilations \ + epc_test test_epc_play_scenario \ + test_epc_play_scenario $dbin/test_epc_play_scenario } diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 07e0ffa640..ad4dde7faa 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -253,7 +253,7 @@ static const eutra_band_t eutra_bands[] = { Enb_properties_array_t enb_properties; -static void enb_config_display(void) +void enb_config_display(void) { int i,j; diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 113681dafe..de837303ea 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -239,6 +239,7 @@ typedef struct Enb_properties_array_s { Enb_properties_t *properties[MAX_ENB]; } Enb_properties_array_t; +void enb_config_display(void); const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP); const Enb_properties_array_t *enb_config_get(void); diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index 4cb21f9604..8f39b9873e 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -100,11 +100,10 @@ Enb_properties_array_t g_enb_properties; char *g_openair_dir = NULL; char *g_test_dir = NULL; char *g_pdml_in_origin = NULL; -char *g_generic_scenario = NULL; extern int xmlLoadExtDtdDefaultValue; #define GENERATE_PDML_FILE 1 -#define GENERATE_GENERIC_SCENARIO 2 +#define GENERATE_SCENARIO 2 #define GS_IS_FILE 1 #define GS_IS_DIR 2 @@ -172,14 +171,14 @@ int split_path( char * pathP, char *** resP) } //------------------------------------------------------------------------------ -int generate_generic_scenario(const char const * test_nameP, const char const * pdml_in_basenameP) +int generate_test_scenario(const char const * test_nameP, const char const * pdml_in_basenameP) //------------------------------------------------------------------------------ { //int fd_pdml_in; xsltStylesheetPtr cur = NULL; xmlDocPtr doc, res; - FILE *generic_scenario_file = NULL; - const char generic_scenario_filename[NAME_MAX]; + FILE *test_scenario_file = NULL; + const char test_scenario_filename[NAME_MAX]; const char *params[2*ENB_CONFIG_MAX_XSLT_PARAMS]; int nb_params = 0; int i,j; @@ -187,7 +186,7 @@ int generate_generic_scenario(const char const * test_nameP, const char const * char *astring2 = NULL; struct in_addr addr; - memset(generic_scenario_filename, 0, sizeof(generic_scenario_filename)); + memset(test_scenario_filename, 0, sizeof(test_scenario_filename)); memset(astring, 0, sizeof(astring)); if (getcwd(astring, sizeof(astring)) != NULL) { fprintf(stdout, "working in %s directory\n", astring); @@ -249,16 +248,16 @@ int generate_generic_scenario(const char const * test_nameP, const char const * res = xsltApplyStylesheet(cur, doc, params); if (NULL != res) { // since pdml filename is not relative (no path), just filename in current directory we can safely remove - sprintf(generic_scenario_filename,"%s",pdml_in_basenameP); - if (strip_extension(generic_scenario_filename) > 0) { - strcat(generic_scenario_filename, "_generic_scenario.xml"); - generic_scenario_file = fopen( generic_scenario_filename, "w+"); - if (NULL != generic_scenario_file) { - xsltSaveResultToFile(generic_scenario_file, res, cur); - fclose(generic_scenario_file); - fprintf(stdout, "Wrote generic scenario to %s\n", generic_scenario_filename); + sprintf(test_scenario_filename,"%s",pdml_in_basenameP); + if (strip_extension(test_scenario_filename) > 0) { + strcat(test_scenario_filename, ".xml"); + test_scenario_file = fopen( test_scenario_filename, "w+"); + if (NULL != test_scenario_file) { + xsltSaveResultToFile(test_scenario_file, res, cur); + fclose(test_scenario_file); + fprintf(stdout, "Wrote test scenario to %s\n", test_scenario_filename); } else { - fprintf(stderr, "Error in fopen(%s)\n", generic_scenario_filename); + fprintf(stderr, "Error in fopen(%s)\n", test_scenario_filename); } } else { fprintf(stderr, "Error in strip_extension()\n"); @@ -537,17 +536,17 @@ static void usage ( char *argv[]) //------------------------------------------------------------------------------ { - fprintf (stdout, "Please report any bug to: openair4g-devel@lists.eurecom.fr\n\n"); + fprintf (stdout, "Please report any bug to: %s\n",PACKAGE_BUGREPORT); fprintf (stdout, "Usage: %s [options]\n\n", argv[0]); + fprintf (stdout, "\n"); fprintf (stdout, "Mandatory options:\n"); - fprintf (stdout, "\t-t | --test-dir Directory where a set of files related to a particular test are located\n"); + fprintf (stdout, "\t-c | --enb-conf-file Provide the old eNB config file for generating a copy of the original test\n"); + fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n"); + fprintf (stdout, "\t-p | --pdml File name (with no path) in 'test-dir' directory of an original scenario that has to be reworked (IP addresses) with new testbed\n"); fprintf (stdout, "\n"); - fprintf (stdout, "Available options:\n"); + fprintf (stdout, "Other options:\n"); fprintf (stdout, "\t-h | --help Print this help and return\n"); - fprintf (stdout, "\t-o | --old-enb-conf-file 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"); - fprintf (stdout, "\t-p | --pdml File name (with no path) of an original scenario that has to be reworked (IP addresses) with new testbed\n"); - fprintf (stdout, "\n"); + fprintf (stdout, "\t-v | --version Print informations about the version of this executable\n"); fprintf (stdout, "\n"); fprintf (stdout, "Example of generate_scenario use case: \n"); fprintf (stdout, "\n"); @@ -558,16 +557,16 @@ static void usage ( fprintf (stdout, " |\n"); fprintf (stdout, " mme_test_s1_pcap2pdml --pcap_file <`captured pcap-ng file`>\n"); fprintf (stdout, " |\n"); - fprintf (stdout, " +--------V----------+ +------------------------+\n"); - fprintf (stdout, " |'pdml-in-orig' file| |'old-enb-conf-file' file|\n"); - fprintf (stdout, " +--------+----------+ +------------+-----------+\n"); + fprintf (stdout, " +--------V----------+ +--------------------+\n"); + fprintf (stdout, " |'pdml-in-orig' file| |'enb-conf-file' file|\n"); + fprintf (stdout, " +--------+----------+ +--------------------+\n"); fprintf (stdout, " | |\n"); fprintf (stdout, " +----------------------------+\n"); fprintf (stdout, " |\n"); - fprintf (stdout, " generate_scenario -t -p <'pdml-in-orig' file> -o <'old-enb-conf-file' file> \n"); + fprintf (stdout, " generate_scenario -d -p <'pdml-in-orig' file> -c <'enb-conf-file' file> \n"); fprintf (stdout, " |\n"); fprintf (stdout, " +------------V--------------+\n"); - fprintf (stdout, " +'xml-scenario-generic' file|\n"); + fprintf (stdout, " +'xml-test-scenario' file |\n"); fprintf (stdout, " +---------------------------+\n"); fprintf (stdout, "\n"); } @@ -581,37 +580,39 @@ config_parse_opt_line ( { int option; int rv = 0; - char *old_enb_config_file_name = NULL; + char *enb_config_file_name = NULL; char *pdml_in_file_name = NULL; char *test_dir_name = NULL; enum long_option_e { LONG_OPTION_START = 0x100, /* Start after regular single char options */ - LONG_OPTION_OLD_ENB_CONF_FILE, + LONG_OPTION_ENB_CONF_FILE, LONG_OPTION_PDML, LONG_OPTION_TEST_DIR, LONG_OPTION_HELP, + LONG_OPTION_VERSION, }; static struct option long_options[] = { - {"old-enb-conf-file", required_argument, 0, LONG_OPTION_OLD_ENB_CONF_FILE}, - {"pdml ", required_argument, 0, LONG_OPTION_PDML}, - {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, - {"help", required_argument, 0, LONG_OPTION_HELP}, + {"enb-conf-file", required_argument, 0, LONG_OPTION_ENB_CONF_FILE}, + {"pdml ", required_argument, 0, LONG_OPTION_PDML}, + {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, + {"help", no_argument, 0, LONG_OPTION_HELP}, + {"version", no_argument, 0, LONG_OPTION_VERSION}, {NULL, 0, NULL, 0} }; /* * Parsing command line */ - while ((option = getopt_long (argc, argv, "hp:n:o:s:t:", long_options, NULL)) != -1) { + while ((option = getopt_long (argc, argv, "vhp:n:c:s:d:", long_options, NULL)) != -1) { switch (option) { - case LONG_OPTION_OLD_ENB_CONF_FILE: - case 'o': + case LONG_OPTION_ENB_CONF_FILE: + case 'c': if (optarg) { - old_enb_config_file_name = optarg; - printf("Old eNB config file name is %s\n", old_enb_config_file_name); - rv |= GENERATE_GENERIC_SCENARIO; + enb_config_file_name = optarg; + printf("eNB config file name is %s\n", enb_config_file_name); + rv |= GENERATE_SCENARIO; } break; @@ -620,12 +621,12 @@ config_parse_opt_line ( if (optarg) { pdml_in_file_name = strdup(optarg); printf("PDML input file name is %s\n", pdml_in_file_name); - rv |= GENERATE_GENERIC_SCENARIO; + rv |= GENERATE_SCENARIO; } break; case LONG_OPTION_TEST_DIR: - case 't': + case 'd': if (optarg) { test_dir_name = strdup(optarg); if (is_file_exists(test_dir_name, "test dirname") != GS_IS_DIR) { @@ -636,6 +637,12 @@ config_parse_opt_line ( } break; + case LONG_OPTION_VERSION: + case 'v': + printf("Version %s\n", PACKAGE_VERSION); + exit (0); + break; + case LONG_OPTION_HELP: case 'h': default: @@ -652,14 +659,14 @@ config_parse_opt_line ( fprintf(stderr, "Error: chdir %s returned %s\n", g_test_dir, strerror(errno)); exit(1); } - if (rv & GENERATE_GENERIC_SCENARIO) { - if (NULL == old_enb_config_file_name) { + if (rv & GENERATE_SCENARIO) { + if (NULL == enb_config_file_name) { fprintf(stderr, "Error: please provide the original eNB config file name that should be in %s\n", g_test_dir); } - if (is_file_exists(old_enb_config_file_name, "Old eNB config file") != GS_IS_FILE) { - fprintf(stderr, "Error: original eNB config file name %s is not found in dir %s\n", old_enb_config_file_name, g_test_dir); + if (is_file_exists(enb_config_file_name, "ENB config file") != GS_IS_FILE) { + fprintf(stderr, "Error: eNB config file name %s is not found in dir %s\n", enb_config_file_name, g_test_dir); } - enb_config_init(old_enb_config_file_name); + enb_config_init(enb_config_file_name); enb_config_display(); if (NULL == pdml_in_file_name) { @@ -688,8 +695,8 @@ int main( int argc, char **argv ) memset((char*) &g_enb_properties, 0 , sizeof(g_enb_properties)); actions = config_parse_opt_line (argc, argv); //Command-line options - if (actions & GENERATE_GENERIC_SCENARIO) { - generate_generic_scenario(g_test_dir, g_pdml_in_origin); + if (actions & GENERATE_SCENARIO) { + generate_test_scenario(g_test_dir, g_pdml_in_origin); } return 0; diff --git a/openair3/TEST/EPC_TEST/generate_scenario.h b/openair3/TEST/EPC_TEST/generate_scenario.h old mode 100755 new mode 100644 diff --git a/openair3/TEST/EPC_TEST/generic_scenario.xsl b/openair3/TEST/EPC_TEST/generic_scenario.xsl index ab0e7f1123..e55bfffd69 100644 --- a/openair3/TEST/EPC_TEST/generic_scenario.xsl +++ b/openair3/TEST/EPC_TEST/generic_scenario.xsl @@ -1,240 +1,261 @@ + xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + enb_s1c0 enb_s1c1 enb_s1c2 enb_s1c3 enb_s1c4 enb_s1c5 + enb_s1c6 + enb_s1c7 mme_s1c0_0 mme_s1c0_1 mme_s1c0_2 mme_s1c0_3 mme_s1c1_0 mme_s1c1_1 - mme_s1c1_2" + mme_s1c1_2 mme_s1c1_3 - reverse_ip_yourself - - + mme_s1c2_0 + mme_s1c2_1 + mme_s1c2_2 + mme_s1c2_3 + mme_s1c3_0 + mme_s1c3_1 + mme_s1c3_2 + mme_s1c3_3 + + ERROR: Cannot reverse resolv IP ! + + + + - - + + - DATA - INIT - INIT_ACK - SACK - HEARTBEAT - HEARTBEAT_ACK - ABORT - SHUTDOWN - SHUTDOWN_ACK - ERROR - COOKIE_ECHO - COOKIE_ACK - ECNE - CWR - SHUTDOWN_COMPLETE - UNKNOWN_CHUNK_TYPE + DATA + INIT + INIT_ACK + SACK + HEARTBEAT + HEARTBEAT_ACK + ABORT + SHUTDOWN + SHUTDOWN_ACK + ERROR + COOKIE_ECHO + COOKIE_ACK + ECNE + CWR + SHUTDOWN_COMPLETE + + ERROR: UNKNOWN CHUNK TYPE ! + + - + + - - - - + - + - + - + - - - - + + + + - - - - + + + + + + + + SEND + RECEIVE + + ERROR: UNKNOWN ACTION ! + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c new file mode 100644 index 0000000000..b8252854e4 --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -0,0 +1,405 @@ +/******************************************************************************* + 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 . + + 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 + + *******************************************************************************/ + +/* + play_scenario.c + ------------------- + AUTHOR : Lionel GAUTHIER + COMPANY : EURECOM + EMAIL : Lionel.Gauthier@eurecom.fr + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "assertions.h" +#include "play_scenario.h" +#include "s1ap_eNB.h" +#include "intertask_interface.h" +#include "enb_config.h" +//------------------------------------------------------------------------------ +#define ENB_CONFIG_MAX_XSLT_PARAMS 32 +#define PLAY_SCENARIO 1 +#define GS_IS_FILE 1 +#define GS_IS_DIR 2 +//------------------------------------------------------------------------------ +char *g_openair_dir = NULL; +//------------------------------------------------------------------------------ +extern Enb_properties_array_t enb_properties; +extern int xmlLoadExtDtdDefaultValue; + +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +// test if file exist in current directory +int is_file_exists( const char const * file_nameP, const char const *file_roleP) +{ + struct stat s; + int err = stat(file_nameP, &s); + if(-1 == err) { + if(ENOENT == errno) { + fprintf(stderr, "Please provide a valid %s, %s does not exist\n", file_roleP, file_nameP); + } else { + perror("stat"); + exit(1); + } + } else { + if(S_ISREG(s.st_mode)) { + return GS_IS_FILE; + } else if(S_ISDIR(s.st_mode)) { + return GS_IS_DIR; + } else { + fprintf(stderr, "Please provide a valid test %s, %s exists but is not found valid\n", file_roleP, file_nameP); + } + } + return 0; +} + + +//------------------------------------------------------------------------------ +int strip_extension(char *in_filename) +{ + static const uint8_t name_min_len = 1; + static const uint8_t max_ext_len = 5; // .pdml ! + fprintf(stdout, "strip_extension %s\n", in_filename); + + if (NULL != in_filename) { + /* Check chars starting at end of string to find last '.' */ + for (ssize_t i = strlen(in_filename); i > (name_min_len + max_ext_len); i--) { + if (in_filename[i] == '.') { + in_filename[i] = '\0'; + return i; + } + } + } + return -1; +} +//------------------------------------------------------------------------------ +// return number of splitted items +int split_path( char * pathP, char *** resP) +{ + char * saveptr1; + char * p = strtok_r (pathP, "/", &saveptr1); + int n_spaces = 0; + + /// split string and append tokens to 'res' + while (p) { + *resP = realloc (*resP, sizeof (char*) * ++n_spaces); + AssertFatal (*resP, "realloc failed"); + (*resP)[n_spaces-1] = p; + p = strtok_r (NULL, "/", &saveptr1); + } + return n_spaces; +} + +//------------------------------------------------------------------------------ +void play_scenario( + const char const * play_scenario_filename ) +{ + +} + +//------------------------------------------------------------------------------ +int generate_play_scenario( + const char const * test_dir_name, + const char const * test_scenario_filename, + const char const * enb_config_filename, + char const * play_scenario_filename /* OUT PARAM*/) +//------------------------------------------------------------------------------ +{ + //int fd_pdml_in; + xsltStylesheetPtr cur = NULL; + xmlDocPtr doc, res; + FILE *play_scenario_file = NULL; + const char *params[2*ENB_CONFIG_MAX_XSLT_PARAMS]; + int nb_params = 0; + int i,j; + char astring[1024]; + char *astring2 = NULL; + struct in_addr addr; + int ret = 0; + + memset(astring, 0, sizeof(astring)); + if (getcwd(astring, sizeof(astring)) != NULL) { + fprintf(stdout, "working in %s directory\n", astring); + } else { + perror("getcwd() error"); + exit(1); + } + + memset(astring, 0, sizeof(astring)); + strcat(astring, g_openair_dir); + strcat(astring, "/openair3/TEST/EPC_TEST/play_scenario.xsl"); + + xmlSubstituteEntitiesDefault(1); + xmlLoadExtDtdDefaultValue = 1; + cur = xsltParseStylesheetFile(astring); + if (NULL == cur) { + AssertFatal (0, "Could not parse stylesheet file %s (check OPENAIR_DIR env variable)!\n", astring); + } else { + fprintf(stdout, "XSLT style sheet: %s\n", astring); + } + + doc = xmlParseFile(test_scenario_filename); + if (NULL == doc) { + AssertFatal (0, "Could not parse scenario xml file %s!\n", test_scenario_filename); + } else { + fprintf(stdout, "Test scenario file: %s\n", test_scenario_filename); + } + + for (i = 0; i < enb_properties.number; i++) { + // eNB S1-C IPv4 address + sprintf(astring, "enb_s1c%d", i); + params[nb_params++] = strdup(astring); + addr.s_addr = enb_properties.properties[i]->enb_ipv4_address_for_S1_MME; + sprintf(astring, "\"%s\"", inet_ntoa(addr)); + params[nb_params++] = strdup(astring); + + // MME S1-C IPv4 address + for (j = 0; j < enb_properties.properties[i]->nb_mme; j++) { + sprintf(astring, "mme_s1c%d_%d", i, j); + params[nb_params++] = strdup(astring); + AssertFatal (enb_properties.properties[i]->mme_ip_address[j].ipv4_address, + "Only support MME IPv4 address\n"); + sprintf(astring, "\"%s\"", enb_properties.properties[i]->mme_ip_address[j].ipv4_address); + params[nb_params++] = strdup(astring); + } + } + params[nb_params] = NULL; + res = xsltApplyStylesheet(cur, doc, params); + if (NULL != res) { + // since pdml filename is not relative (no path), just filename in current directory we can safely remove + sprintf(play_scenario_filename,"%s",test_scenario_filename); + if (strip_extension(play_scenario_filename) > 0) { + strcat(play_scenario_filename, ".tsml"); + play_scenario_file = fopen( play_scenario_filename, "w+"); + if (NULL != play_scenario_file) { + xsltSaveResultToFile(play_scenario_file, res, cur); + fclose(play_scenario_file); + fprintf(stdout, "Wrote test scenario to %s\n", play_scenario_filename); + } else { + fprintf(stderr, "Error in fopen(%s)\n", play_scenario_filename); + ret = -1; + } + } else { + fprintf(stderr, "Error in strip_extension()\n"); + ret = -1; + } + } else { + fprintf(stderr, "Error in xsltApplyStylesheet()\n"); + ret = -1; + } + xsltFreeStylesheet(cur); + xmlFreeDoc(res); + xmlFreeDoc(doc); + + xsltCleanupGlobals(); + xmlCleanupParser(); + return ret; +} + +//------------------------------------------------------------------------------ +static void usage ( + int argc, + char *argv[]) +//------------------------------------------------------------------------------ +{ + fprintf (stdout, "Please report any bug to: %s\n",PACKAGE_BUGREPORT); + fprintf (stdout, "Usage: %s [options]\n\n", argv[0]); + fprintf (stdout, "\n"); + fprintf (stdout, "Client options:\n"); + fprintf (stdout, "\t-S | --server File name (with no path) of a test scenario that has to be replayed (TODO in future?)\n"); + fprintf (stdout, "Server options:\n"); + fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n"); + fprintf (stdout, "\t-c | --enb-conf-file Provide an eNB config file, valid for the testbed\n"); + fprintf (stdout, "\t-s | --scenario File name (with no path) of a test scenario that has to be replayed ()\n"); + fprintf (stdout, "\n"); + fprintf (stdout, "Other options:\n"); + fprintf (stdout, "\t-h | --help Print this help and return\n"); + fprintf (stdout, "\t-v | --version Print informations about the version of this executable\n"); + fprintf (stdout, "\n"); +} + +//------------------------------------------------------------------------------ +int +config_parse_opt_line ( + int argc, + char *argv[], + char **test_dir_name, + char **scenario_file_name, + char **enb_config_file_name) +//------------------------------------------------------------------------------ +{ + int option; + int rv = 0; + const Enb_properties_array_t *enb_properties_p = NULL; + + enum long_option_e { + LONG_OPTION_START = 0x100, /* Start after regular single char options */ + LONG_OPTION_ENB_CONF_FILE, + LONG_OPTION_SCENARIO_FILE, + LONG_OPTION_TEST_DIR, + LONG_OPTION_HELP, + LONG_OPTION_VERSION + }; + + static struct option long_options[] = { + {"enb-conf-file", required_argument, 0, LONG_OPTION_ENB_CONF_FILE}, + {"scenario ", required_argument, 0, LONG_OPTION_SCENARIO_FILE}, + {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, + {"help", no_argument, 0, LONG_OPTION_HELP}, + {"version", no_argument, 0, LONG_OPTION_VERSION}, + {NULL, 0, NULL, 0} + }; + + /* + * Parsing command line + */ + while ((option = getopt_long (argc, argv, "vhc:s:d:", long_options, NULL)) != -1) { + switch (option) { + case LONG_OPTION_ENB_CONF_FILE: + case 'c': + if (optarg) { + *enb_config_file_name = strdup(optarg); + printf("eNB config file name is %s\n", *enb_config_file_name); + rv |= PLAY_SCENARIO; + } + break; + + case LONG_OPTION_SCENARIO_FILE: + case 's': + if (optarg) { + *scenario_file_name = strdup(optarg); + printf("Scenario file name is %s\n", *scenario_file_name); + rv |= PLAY_SCENARIO; + } + break; + + case LONG_OPTION_TEST_DIR: + case 'd': + if (optarg) { + *test_dir_name = strdup(optarg); + if (is_file_exists(*test_dir_name, "test dirname") != GS_IS_DIR) { + fprintf(stderr, "Please provide a valid test dirname, %s is not a valid directory name\n", *test_dir_name); + exit(1); + } + printf("Test dir name is %s\n", *test_dir_name); + } + break; + + case LONG_OPTION_VERSION: + case 'v': + printf("Version %s\n", PACKAGE_VERSION); + exit (0); + break; + + case LONG_OPTION_HELP: + case 'h': + default: + usage (argc, argv); + exit (0); + } + } + if (NULL == *test_dir_name) { + fprintf(stderr, "Please provide a valid test dirname\n"); + exit(1); + } + if (chdir(*test_dir_name) != 0) { + fprintf(stderr, "Error: chdir %s returned %s\n", *test_dir_name, strerror(errno)); + exit(1); + } + if (rv & PLAY_SCENARIO) { + if (NULL == *enb_config_file_name) { + fprintf(stderr, "Error: please provide the original eNB config file name that should be in %s\n", *test_dir_name); + } + if (is_file_exists(*enb_config_file_name, "eNB config file") != GS_IS_FILE) { + fprintf(stderr, "Error: original eNB config file name %s is not found in dir %s\n", *enb_config_file_name, *test_dir_name); + } + enb_properties_p = enb_config_init(*enb_config_file_name); + + if (NULL == *scenario_file_name) { + fprintf(stderr, "Error: please provide the scenario file name that should be in %s\n", *test_dir_name); + } + if (is_file_exists(*scenario_file_name, "Scenario file") != GS_IS_FILE) { + fprintf(stderr, "Error: Scenario file name %s is not found in dir %s\n", *scenario_file_name, *test_dir_name); + } + } + return rv; +} + +//------------------------------------------------------------------------------ +int main( int argc, char **argv ) +//------------------------------------------------------------------------------ +{ + int actions = 0; + char *test_dir_name = NULL; + char *scenario_file_name = NULL; + char *enb_config_file_name = NULL; + char play_scenario_filename[NAME_MAX]; + + memset(play_scenario_filename, 0, sizeof(play_scenario_filename)); + g_openair_dir = getenv("OPENAIR_DIR"); + if (NULL == g_openair_dir) { + fprintf(stderr, "Error: Could not get OPENAIR_DIR environment variable\n"); + exit(1); + } + + actions = config_parse_opt_line (argc, argv, &test_dir_name, &scenario_file_name, &enb_config_file_name); //Command-line options + if (actions & PLAY_SCENARIO) { + if (generate_play_scenario(test_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) { + play_scenario(play_scenario_filename); + } + free_pointer(test_dir_name); + free_pointer(scenario_file_name); + free_pointer(enb_config_file_name); + } + + return 0; +} diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h new file mode 100644 index 0000000000..c6e1087a04 --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -0,0 +1,49 @@ +/******************************************************************************* + 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 . + + 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_ + +/** @defgroup _enb_app ENB APP + * @ingroup _oai2 + * @{ + */ + + +inline void free_pointer(void *p) {if (NULL != p) {free(p); p=NULL;}}; +#endif /* ENB_CONFIG_H_ */ +/** @} */ diff --git a/openair3/TEST/EPC_TEST/play_scenario.xsl b/openair3/TEST/EPC_TEST/play_scenario.xsl new file mode 100644 index 0000000000..1a89128005 --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario.xsl @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ERROR: Cannot resolv IP ! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ERROR: Cannot resolv IP ! + + + + + + + + + + + + + + + + From 34ab7c374fa99bc4e1ac167107c4acae0a8c6817 Mon Sep 17 00:00:00 2001 From: gauthier Date: Fri, 6 Nov 2015 16:51:30 +0100 Subject: [PATCH 007/122] For syncing with origin --- openair3/TEST/EPC_TEST/generic_scenario.xsl | 24 +-- openair3/TEST/EPC_TEST/play_scenario.c | 154 ++++++++++++++++++-- openair3/TEST/EPC_TEST/play_scenario.h | 88 +++++++++++ openair3/TEST/EPC_TEST/play_scenario.xsl | 4 +- 4 files changed, 241 insertions(+), 29 deletions(-) diff --git a/openair3/TEST/EPC_TEST/generic_scenario.xsl b/openair3/TEST/EPC_TEST/generic_scenario.xsl index e55bfffd69..b1cadbcdfa 100644 --- a/openair3/TEST/EPC_TEST/generic_scenario.xsl +++ b/openair3/TEST/EPC_TEST/generic_scenario.xsl @@ -146,7 +146,7 @@ - + @@ -160,14 +160,14 @@ - + - + @@ -181,13 +181,13 @@ - + - + @@ -201,13 +201,13 @@ - + - + @@ -218,10 +218,10 @@ - + - + @@ -232,11 +232,11 @@ - + - + @@ -247,7 +247,7 @@ - + diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index b8252854e4..e73a41a683 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -49,7 +49,6 @@ #include #include #include -#include #include #include #include @@ -138,16 +137,132 @@ int split_path( char * pathP, char *** resP) } return n_spaces; } - //------------------------------------------------------------------------------ -void play_scenario( +void display_node(xmlNodePtr node) { + if (node->type == XML_ELEMENT_NODE) { + xmlChar *path = xmlGetNodePath(node); + if (node->children != NULL && node->children->type == XML_TEXT_NODE) { + xmlChar *content = xmlNodeGetContent(node); + printf("%s -> %s\n", path, content); + xmlFree(content); + } else { + printf("%s\n", path); + } + xmlFree(path); + } +} +//------------------------------------------------------------------------------ +void free_scenario(test_scenario_t* scenario) +{ + //TODO +} +//------------------------------------------------------------------------------ +sctp_cid_t chunk_type_str2cid(xmlChar *chunk_type_str) +{ + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"DATA"))) { return SCTP_CID_DATA;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"INIT"))) { return SCTP_CID_INIT;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"INIT_ACK"))) { return SCTP_CID_INIT_ACK;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SACK"))) { return SCTP_CID_SACK;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"HEARTBEAT"))) { return SCTP_CID_HEARTBEAT;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"HEARTBEAT_ACK"))) { return SCTP_CID_HEARTBEAT_ACK;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ABORT"))) { return SCTP_CID_ABORT;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SHUTDOWN"))) { return SCTP_CID_SHUTDOWN;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SHUTDOWN_ACK"))) { return SCTP_CID_SHUTDOWN_ACK;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ERROR"))) { return SCTP_CID_ERROR;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"COOKIE_ECHO"))) { return SCTP_CID_COOKIE_ECHO;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"COOKIE_ACK"))) { return SCTP_CID_COOKIE_ACK;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ECN_ECNE"))) { return SCTP_CID_ECN_ECNE;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ECN_CWR"))) { return SCTP_CID_ECN_CWR;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SHUTDOWN_COMPLETE"))) { return SCTP_CID_SHUTDOWN_COMPLETE;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"AUTH"))) { return SCTP_CID_AUTH;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"FWD_TSN"))) { return SCTP_CID_FWD_TSN;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ASCONF"))) { return SCTP_CID_ASCONF;} + if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ASCONF_ACK"))) { return SCTP_CID_ASCONF_ACK;} + fprintf(stderr, "ERROR: Could not convert: %s\n", chunk_type_str); + exit(-1); +} +//------------------------------------------------------------------------------ +test_packet_t* parse_xml_packet(xmlNodePtr node) { + + test_packet_t *packet = NULL; + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + + if (NULL != node) { + packet = calloc(1, sizeof(*packet)); + + for (cur_node = node->children; cur_node; cur_node = cur_node->next) { + if (cur_node->type == XML_ELEMENT_NODE) { + printf("node type: Element, name: %s\n", cur_node->name); + if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.time_relative"))) { + } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.src"))) { + } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.dst"))) { + } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"sctp.chunk_type_str"))) { + xml_char = xmlGetProp(cur_node, (const xmlChar *)"value"); + packet->sctp_hdr.chunk_type = chunk_type_str2cid(xml_char); + fprintf(stdout, "chunk_type_str2cid: %s\n", xml_char); + } + } + } + } + return packet; +} +//------------------------------------------------------------------------------ +int play_scenario(test_scenario_t* scenario) { + //TODO + return 0; +} +//------------------------------------------------------------------------------ +test_scenario_t* generate_scenario( const char const * play_scenario_filename ) { + xmlDocPtr doc = NULL; + xmlNodePtr root = NULL; + xmlNodePtr node = NULL; + xmlChar *xml_char = NULL; + test_scenario_t *scenario = NULL; + test_packet_t *packet = NULL; + test_packet_t **next_packet = NULL; + doc = xmlParseFile(play_scenario_filename); + if (NULL == doc) { + AssertFatal (0, "Could not parse scenario xml file %s!\n", play_scenario_filename); + } else { + fprintf(stdout, "Test scenario file to play: %s\n", play_scenario_filename); + } + + // Get root + root = xmlDocGetRootElement(doc); + if (NULL != root) { + if ((!xmlStrcmp(root->name, (const xmlChar *)"scenario"))) { + xml_char = xmlGetProp(root, (const xmlChar *)"name"); + printf("scenario name: %s\n", xml_char); + scenario = calloc(1, sizeof(*scenario)); + scenario->name = xml_char; // nodup nofree + next_packet = &scenario->list_packet; + for (node = root->children; node != NULL; node = node->next) { + if ((!xmlStrcmp(node->name, (const xmlChar *)"packet"))) { + packet = parse_xml_packet(node); + if (NULL != packet) { + *next_packet = packet; + next_packet = &packet->next; + } else { + fprintf(stdout, "WARNING omitted packet:\n"); + display_node(node); + } + } + } + } + } else { + fprintf(stderr, "Empty xml document\n"); + } + xmlFreeDoc(doc); + xmlCleanupParser(); + return scenario; } //------------------------------------------------------------------------------ -int generate_play_scenario( +int generate_xml_scenario( const char const * test_dir_name, const char const * test_scenario_filename, const char const * enb_config_filename, @@ -180,7 +295,7 @@ int generate_play_scenario( xmlSubstituteEntitiesDefault(1); xmlLoadExtDtdDefaultValue = 1; - cur = xsltParseStylesheetFile(astring); + cur = xsltParseStylesheetFile((const xmlChar *)astring); if (NULL == cur) { AssertFatal (0, "Could not parse stylesheet file %s (check OPENAIR_DIR env variable)!\n", astring); } else { @@ -215,7 +330,6 @@ int generate_play_scenario( params[nb_params] = NULL; res = xsltApplyStylesheet(cur, doc, params); if (NULL != res) { - // since pdml filename is not relative (no path), just filename in current directory we can safely remove sprintf(play_scenario_filename,"%s",test_scenario_filename); if (strip_extension(play_scenario_filename) > 0) { strcat(play_scenario_filename, ".tsml"); @@ -237,8 +351,8 @@ int generate_play_scenario( ret = -1; } xsltFreeStylesheet(cur); - xmlFreeDoc(res); xmlFreeDoc(doc); + xmlFreeDoc(res); xsltCleanupGlobals(); xmlCleanupParser(); @@ -378,11 +492,13 @@ config_parse_opt_line ( int main( int argc, char **argv ) //------------------------------------------------------------------------------ { - int actions = 0; - char *test_dir_name = NULL; - char *scenario_file_name = NULL; - char *enb_config_file_name = NULL; - char play_scenario_filename[NAME_MAX]; + int actions = 0; + char *test_dir_name = NULL; + char *scenario_file_name = NULL; + char *enb_config_file_name = NULL; + char play_scenario_filename[NAME_MAX]; + int ret = 0; + test_scenario_t *scenario = NULL; memset(play_scenario_filename, 0, sizeof(play_scenario_filename)); g_openair_dir = getenv("OPENAIR_DIR"); @@ -393,13 +509,21 @@ int main( int argc, char **argv ) actions = config_parse_opt_line (argc, argv, &test_dir_name, &scenario_file_name, &enb_config_file_name); //Command-line options if (actions & PLAY_SCENARIO) { - if (generate_play_scenario(test_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) { - play_scenario(play_scenario_filename); + if (generate_xml_scenario(test_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) { + if (NULL != (scenario = generate_scenario(play_scenario_filename))) { + ret = play_scenario(scenario); + } else { + fprintf(stderr, "Error: Could not generate scenario from tsml file\n"); + ret = -1; + } + } else { + fprintf(stderr, "Error: Could not generate tsml scenario from xml file\n"); + ret = -1; } free_pointer(test_dir_name); free_pointer(scenario_file_name); free_pointer(enb_config_file_name); } - return 0; + return ret; } diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index c6e1087a04..4916950783 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -37,12 +37,100 @@ #ifndef GENERATE_SCENARIO_H_ #define GENERATE_SCENARIO_H_ +# include +# include +#include /** @defgroup _enb_app ENB APP * @ingroup _oai2 * @{ */ +typedef enum { + ACTION_S1C_START = 0, + ACTION_S1C_NULL = ACTION_S1C_START, + ACTION_S1C_SEND, + ACTION_S1C_RECEIVE, + ACTION_S1C_END +} test_action_t; + +// from kernel source file 3.19/include/linux/sctp.h +typedef enum { + SCTP_CID_DATA = 0, + SCTP_CID_INIT = 1, + SCTP_CID_INIT_ACK = 2, + SCTP_CID_SACK = 3, + SCTP_CID_HEARTBEAT = 4, + SCTP_CID_HEARTBEAT_ACK = 5, + SCTP_CID_ABORT = 6, + SCTP_CID_SHUTDOWN = 7, + SCTP_CID_SHUTDOWN_ACK = 8, + SCTP_CID_ERROR = 9, + SCTP_CID_COOKIE_ECHO = 10, + SCTP_CID_COOKIE_ACK = 11, + SCTP_CID_ECN_ECNE = 12, + SCTP_CID_ECN_CWR = 13, + SCTP_CID_SHUTDOWN_COMPLETE = 14, + + /* AUTH Extension Section 4.1 */ + SCTP_CID_AUTH = 0x0F, + + /* PR-SCTP Sec 3.2 */ + SCTP_CID_FWD_TSN = 0xC0, + + /* Use hex, as defined in ADDIP sec. 3.1 */ + SCTP_CID_ASCONF = 0xC1, + SCTP_CID_ASCONF_ACK = 0x80, +} sctp_cid_t; /* enum */ + +// from kernel source file 3.19/include/linux/sctp.h, Big Endians +typedef struct sctp_datahdr_s { + uint32_t tsn; + uint16_t stream; + uint16_t ssn; + uint32_t ppid; + uint8_t payload[0]; +} sctp_datahdr_t; + +// from kernel source file 3.19/include/linux/sctp.h, Big Endians +typedef struct sctp_inithdr { + uint32_t init_tag; + uint32_t a_rwnd; + uint16_t num_outbound_streams; + uint16_t num_inbound_streams; + uint32_t initial_tsn; + uint8_t params[0]; +} sctp_inithdr_t; + +typedef sctp_inithdr_t sctp_initackhdr_t; + +typedef struct test_sctp_hdr_s { + unsigned int src_port; + unsigned int dst_port; + sctp_cid_t chunk_type; + union { + sctp_datahdr_t data_hdr; + sctp_inithdr_t init_hdr; + sctp_initackhdr_t init_ack_hdr; + } u; +} test_sctp_hdr_t; + +typedef struct test_packet_s { + test_action_t action; + struct timeval time_relative_to_first_packet; + struct timeval time_relative_to_last_packet; + test_sctp_hdr_t sctp_hdr; + uint16_t s1ap_byte_stream_count; + uint8_t *s1ap_byte_stream; + xmlNodePtr *s1ap_node; + + struct test_packet_s *next; +}test_packet_t; + +typedef struct test_scenario_s { + xmlChar *name; + test_packet_t *list_packet; +}test_scenario_t; inline void free_pointer(void *p) {if (NULL != p) {free(p); p=NULL;}}; #endif /* ENB_CONFIG_H_ */ diff --git a/openair3/TEST/EPC_TEST/play_scenario.xsl b/openair3/TEST/EPC_TEST/play_scenario.xsl index 1a89128005..6b1c36cc3d 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.xsl +++ b/openair3/TEST/EPC_TEST/play_scenario.xsl @@ -34,7 +34,7 @@ - + @@ -67,7 +67,7 @@ - + From 757b1940ace4f35888b5c0968c0fb0217b498aa1 Mon Sep 17 00:00:00 2001 From: gauthier Date: Fri, 13 Nov 2015 14:04:00 +0100 Subject: [PATCH 008/122] Problem decoding S1AP --- cmake_targets/epc_test/CMakeLists.template | 2 + .../attach_complete.pdml | 2 +- openair3/TEST/EPC_TEST/generic_scenario.xsl | 91 +- openair3/TEST/EPC_TEST/play_scenario.c | 965 +++++++++++++++++- openair3/TEST/EPC_TEST/play_scenario.h | 68 +- 5 files changed, 1035 insertions(+), 93 deletions(-) diff --git a/cmake_targets/epc_test/CMakeLists.template b/cmake_targets/epc_test/CMakeLists.template index 12a745b997..5789c3eb5c 100644 --- a/cmake_targets/epc_test/CMakeLists.template +++ b/cmake_targets/epc_test/CMakeLists.template @@ -1,11 +1,13 @@ cmake_minimum_required(VERSION 2.8) set ( CMAKE_BUILD_TYPE "RelWithDebInfo" ) +set ( ASN_DEBUG False) set ( ADDR_CONF False ) set ( DEBUG_OMG False ) set ( DISABLE_XER_PRINT False ) set ( DRIVER2013 True ) set ( EMOS False ) +set ( EMIT_ASN_DEBUG True ) set ( ENABLE_FXP True ) set ( ENABLE_ITTI True ) set ( ENABLE_NAS_UE_LOGGING True ) diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml index fef45773f9..f7c27272aa 100644 --- a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml +++ b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml @@ -1,7 +1,7 @@ - + diff --git a/openair3/TEST/EPC_TEST/generic_scenario.xsl b/openair3/TEST/EPC_TEST/generic_scenario.xsl index b1cadbcdfa..1d49b4942e 100644 --- a/openair3/TEST/EPC_TEST/generic_scenario.xsl +++ b/openair3/TEST/EPC_TEST/generic_scenario.xsl @@ -106,6 +106,7 @@ + @@ -131,16 +132,17 @@ - - - - + + + + + @@ -148,59 +150,61 @@ + - - - - - + + + + + - + - - - + + + + - - - - - - + + + + + - + - - - + + + + - - - - - - + + + + + + - + @@ -209,44 +213,47 @@ + - - - + + + - + + - - - + + + - + + - - - + + + - + diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index e73a41a683..a32947c439 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -53,6 +54,7 @@ #include #include #include +#include #include #include #include @@ -60,9 +62,13 @@ #include "assertions.h" #include "play_scenario.h" -#include "s1ap_eNB.h" +//#include "s1ap_eNB.h" +#include "s1ap_common.h" +#include "s1ap_ies_defs.h" +#include "s1ap_eNB_decoder.h" #include "intertask_interface.h" #include "enb_config.h" +#include "log.h" //------------------------------------------------------------------------------ #define ENB_CONFIG_MAX_XSLT_PARAMS 32 #define PLAY_SCENARIO 1 @@ -73,8 +79,100 @@ char *g_openair_dir = NULL; //------------------------------------------------------------------------------ extern Enb_properties_array_t enb_properties; extern int xmlLoadExtDtdDefaultValue; - +extern int asn_debug; +extern int asn1_xer_print; //------------------------------------------------------------------------------ +void test_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num); +int is_file_exists ( const char const * file_nameP, const char const *file_roleP); +int strip_extension( char *in_filename); +int split_path ( char * pathP, char *** resP); +void display_node ( xmlNodePtr node, unsigned int indent); +void display_tree ( xmlNodePtr node, unsigned int indent); +//------------------------- +void free_packet(test_packet_t* packet); +void free_scenario(test_scenario_t* scenario); +//------------------------- +void display_packet_sctp_init(const sctp_inithdr_t * const sctp); +void display_packet_sctp_initack(const sctp_initackhdr_t * const sctp); +void display_packet_sctp_data(const sctp_datahdr_t * const sctp); +void display_packet_sctp(const test_sctp_hdr_t * const sctp); +void display_packet_ip(const test_ip_hdr_t * const ip); +void display_packet(const test_packet_t * const packet); +void display_scenario(const test_scenario_t * const scenario); +//------------------------- +char * test_ip2ip_str(const test_ip_t * const ip); +int hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len); +sctp_cid_t chunk_type_str2cid(const xmlChar * const chunk_type_str); +const char * const chunk_type_cid2str(const sctp_cid_t chunk_type); +test_action_t action_str2test_action_t(const xmlChar * const action); +void ip_str2test_ip(const xmlChar * const ip_str, test_ip_t * const ip); +//------------------------- +int test_s1ap_decode_initiating_message(s1ap_message *message, S1ap_InitiatingMessage_t *initiating_p); +int test_s1ap_decode_successful_outcome(s1ap_message *message, S1ap_SuccessfulOutcome_t *successfullOutcome_p); +int test_s1ap_decode_unsuccessful_outcome(s1ap_message *message, S1ap_UnsuccessfulOutcome_t *unSuccessfullOutcome_p); +int test_s1ap_decode_pdu(s1ap_message *message, const uint8_t * const buffer,const uint32_t length); +void test_decode_s1ap(test_s1ap_t * const s1ap); +//------------------------- +void parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, test_s1ap_t * const s1ap); +void parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t * const sctp_hdr); +void parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_inithdr_t * const sctp_hdr); +void parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t * const sctp_hdr); +void parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, test_sctp_hdr_t * const sctp_hdr); +test_packet_t* parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); +//------------------------- +int play_scenario(test_scenario_t* scenario); +int generate_xml_scenario( + const char const * test_dir_name, + const char const * test_scenario_filename, + const char const * enb_config_filename, + char const * play_scenario_filename /* OUT PARAM*/); + +//----------------------------------------------------------------------------- +void test_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num) +//----------------------------------------------------------------------------- +{ + unsigned long octet_index = 0; + + if (byte_stream == NULL) { + return; + } + + + + + fprintf(stdout, "+-----+-------------------------------------------------+\n"); + fprintf(stdout, "| | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n"); + fprintf(stdout, "+-----+-------------------------------------------------+\n"); + + for (octet_index = 0; octet_index < num; octet_index++) { + if ((octet_index % 16) == 0) { + if (octet_index != 0) { + fprintf(stdout, " |\n"); + } + + fprintf(stdout, " %04ld |", octet_index); + } + + /* + * Print every single octet in hexadecimal form + */ + fprintf(stdout, " %02x", byte_stream[octet_index]); + /* + * Align newline and pipes according to the octets in groups of 2 + */ + } + + /* + * Append enough spaces and put final pipe + */ + unsigned char index; + + for (index = octet_index; index < 16; ++index) { + fprintf(stdout, " "); + } + + fprintf(stdout, " |\n"); +} //------------------------------------------------------------------------------ // test if file exist in current directory @@ -138,9 +236,14 @@ int split_path( char * pathP, char *** resP) return n_spaces; } //------------------------------------------------------------------------------ -void display_node(xmlNodePtr node) { +void display_node(xmlNodePtr node, unsigned int indent) +{ + int i = 0; if (node->type == XML_ELEMENT_NODE) { xmlChar *path = xmlGetNodePath(node); + for (i=0; ichildren != NULL && node->children->type == XML_TEXT_NODE) { xmlChar *content = xmlNodeGetContent(node); printf("%s -> %s\n", path, content); @@ -151,13 +254,229 @@ void display_node(xmlNodePtr node) { xmlFree(path); } } +/** + * print_element_names: + * @node: the initial xml node to consider. + * @indent: indentation level. + * + * Prints the names of the all the xml elements + * that are siblings or children of a given xml node. + */ +//------------------------------------------------------------------------------ +void display_tree(xmlNodePtr node, unsigned int indent) +{ + xmlNode *cur_node = NULL; + + for (cur_node = node; cur_node; cur_node = cur_node->next) { + if (cur_node->type == XML_ELEMENT_NODE) { + display_node(cur_node, indent); + } + display_tree(cur_node->children, indent++); + } +} +//------------------------------------------------------------------------------ +void free_packet(test_packet_t* packet) +{ + if (packet) { + switch (packet->sctp_hdr.chunk_type) { + case SCTP_CID_DATA: + free_pointer(packet->sctp_hdr.u.data_hdr.payload.binary_stream); + break; + default: + ; + } + free_pointer(packet); + } +} + //------------------------------------------------------------------------------ void free_scenario(test_scenario_t* scenario) { - //TODO + test_packet_t *packet = NULL; + test_packet_t *next_packet = NULL; + if (scenario) { + packet = scenario->list_packet; + while (packet) { + next_packet = packet->next; + free_packet(packet); + packet = next_packet->next; + } + free_pointer(scenario); + } +} + + +//------------------------------------------------------------------------------ +void display_packet_sctp_init(const sctp_inithdr_t * const sctp) +{ + + if (sctp) { + fprintf(stdout, "\t\tSCTP.init.init_tag : %u\n", sctp->init_tag); + fprintf(stdout, "\t\tSCTP.init.a_rwnd : %u\n", sctp->a_rwnd); + fprintf(stdout, "\t\tSCTP.init.num_inbound_streams : %u\n", sctp->num_inbound_streams); + fprintf(stdout, "\t\tSCTP.init.num_outbound_streams : %u\n", sctp->num_outbound_streams); + fprintf(stdout, "\t\tSCTP.init.initial_tsn : %u\n", sctp->initial_tsn); + } } //------------------------------------------------------------------------------ -sctp_cid_t chunk_type_str2cid(xmlChar *chunk_type_str) +void display_packet_sctp_initack(const sctp_initackhdr_t * const sctp) +{ + + if (sctp) { + fprintf(stdout, "\t\tSCTP.initack.init_tag : %u\n", sctp->init_tag); + fprintf(stdout, "\t\tSCTP.initack.a_rwnd : %u\n", sctp->a_rwnd); + fprintf(stdout, "\t\tSCTP.initack.num_inbound_streams : %u\n", sctp->num_inbound_streams); + fprintf(stdout, "\t\tSCTP.initack.num_outbound_streams : %u\n", sctp->num_outbound_streams); + fprintf(stdout, "\t\tSCTP.initack.initial_tsn : %u\n", sctp->initial_tsn); + } +} +//------------------------------------------------------------------------------ +void display_packet_sctp_data(const sctp_datahdr_t * const sctp) +{ + if (sctp) { + fprintf(stdout, "\t\tSCTP.data.tsn : %u\n", sctp->tsn); + fprintf(stdout, "\t\tSCTP.data.stream : %u\n", sctp->stream); + fprintf(stdout, "\t\tSCTP.data.ssn : %u\n", sctp->ssn); + fprintf(stdout, "\t\tSCTP.data.ppid : %u\n", sctp->ppid); + //fprintf(stdout, "\t\tSCTP.data.pdu_type : %u\n", sctp->payload.pdu_type); + //fprintf(stdout, "\t\tSCTP.data.procedure_code : %u\n", sctp->payload.procedure_code); + fprintf(stdout, "\t\tSCTP.data.binary_stream_allocated_size : %u\n", sctp->payload.binary_stream_allocated_size); + if (NULL != sctp->payload.binary_stream) { + fprintf(stdout, "\t\tSCTP.data.binary_stream :\n"); + test_print_hex_octets(sctp->payload.binary_stream, sctp->payload.binary_stream_allocated_size); + } else { + fprintf(stdout, "\t\tSCTP.data.binary_stream : NULL\n"); + } + } +} + +//------------------------------------------------------------------------------ +void display_packet_sctp(const test_sctp_hdr_t * const sctp) +{ + if (sctp) { + fprintf(stdout, "\t\tSCTP.src_port : %u\n", sctp->src_port); + fprintf(stdout, "\t\tSCTP.dst_port : %u\n", sctp->dst_port); + fprintf(stdout, "\t\tSCTP.chunk_type : %s\n", chunk_type_cid2str(sctp->chunk_type)); + switch (sctp->chunk_type) { + case SCTP_CID_DATA: + display_packet_sctp_data(&sctp->u.data_hdr); + break; + case SCTP_CID_INIT: + display_packet_sctp_initack(&sctp->u.init_hdr); + break; + case SCTP_CID_INIT_ACK: + display_packet_sctp_initack(&sctp->u.init_ack_hdr); + break; + default: + ; + } + } +} +//------------------------------------------------------------------------------ +void display_packet_ip(const test_ip_hdr_t * const ip) +{ + if (ip) { + fprintf(stdout, "\t\tSource address : %s\n", test_ip2ip_str(&ip->src)); + fprintf(stdout, "\t\tDestination address : %s\n", test_ip2ip_str(&ip->dst)); + } +} + +//------------------------------------------------------------------------------ +void display_packet(const test_packet_t * const packet) +{ + if (packet) { + fprintf(stdout, "\tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); + fprintf(stdout, "\tPacket:\ttime relative to 1st packet %ld.%06lu\n", + packet->time_relative_to_first_packet.tv_sec, packet->time_relative_to_first_packet.tv_usec); + fprintf(stdout, "\tPacket:\ttime relative to last tx packet %ld.%06lu\n", + packet->time_relative_to_last_sent_packet.tv_sec, packet->time_relative_to_last_sent_packet.tv_usec); + fprintf(stdout, "\tPacket:\ttime relative to last_received packet %ld.%06lu\n", + packet->time_relative_to_last_received_packet.tv_sec, packet->time_relative_to_last_received_packet.tv_usec); + + switch(packet->action) { + case ACTION_S1C_SEND: + fprintf(stdout, "\tPacket:\tAction SEND\n"); + break; + case ACTION_S1C_RECEIVE: + fprintf(stdout, "\tPacket:\tAction RECEIVE\n"); + break; + default: + fprintf(stdout, "\tPacket:\tAction UNKNOWN\n"); + } + display_packet_ip(&packet->ip_hdr); + display_packet_sctp(&packet->sctp_hdr); + } +} +//------------------------------------------------------------------------------ +void display_scenario(const test_scenario_t * const scenario) +{ + test_packet_t *packet = NULL; + if (scenario) { + fprintf(stdout, "Scenario: %s\n", (scenario->name != NULL) ? (char*)scenario->name:"UNKNOWN NAME"); + packet = scenario->list_packet; + while (packet) { + display_packet(packet); + packet = packet->next; + } + } +} + +//------------------------------------------------------------------------------ +char * test_ip2ip_str(const test_ip_t * const ip) +{ + static char str[INET6_ADDRSTRLEN]; + + sprintf(str, "ERROR"); + switch (ip->address_family) { + case AF_INET6: + inet_ntop(AF_INET6, &(ip->address.ipv6), str, INET6_ADDRSTRLEN); + break; + case AF_INET: + inet_ntop(AF_INET, &(ip->address.ipv4), str, INET_ADDRSTRLEN); + break; + default: + ; + } + return str; +} +//------------------------------------------------------------------------------ +//convert hexstring to len bytes of data +//returns 0 on success, negative on error +//data is a buffer of at least len bytes +//hexstring is upper or lower case hexadecimal, NOT prepended with "0x" +int hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len) +{ + unsigned const char *pos = hexstring; + char *endptr = NULL; + size_t count = 0; + + fprintf(stdout, "%s(%s,%d)\n", __FUNCTION__, hexstring, len); + + if ((len > 1) && (strlen((const char*)hexstring) % 2)) { + //or hexstring has an odd length + return -3; + } + + if (len == 1) { + char buf[5] = {'0', 'x', 0, pos[0], '\0'}; + data[0] = strtol(buf, &endptr, 16); + /* Check for various possible errors */ + AssertFatal ((errno == 0) || (data[0] != 0), "ERROR %s() strtol: %s\n", __FUNCTION__, strerror(errno)); + AssertFatal (endptr != buf, "ERROR %s() No digits were found\n", __FUNCTION__); + return 0; + } + + for(count = 0; count < len/2; count++) { + char buf[5] = {'0', 'x', pos[0], pos[1], 0}; + data[count] = strtol(buf, &endptr, 16); + pos += 2 * sizeof(char); + AssertFatal (endptr[0] == '\0', "ERROR %s() non-hexadecimal character encountered buf %p endptr %p buf %s count %d pos %p\n", __FUNCTION__, buf, endptr, buf, count, pos); + AssertFatal (endptr != buf, "ERROR %s() No digits were found\n", __FUNCTION__); + } + return 0; +} +//------------------------------------------------------------------------------ +sctp_cid_t chunk_type_str2cid(const xmlChar * const chunk_type_str) { if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"DATA"))) { return SCTP_CID_DATA;} if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"INIT"))) { return SCTP_CID_INIT;} @@ -178,31 +497,599 @@ sctp_cid_t chunk_type_str2cid(xmlChar *chunk_type_str) if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"FWD_TSN"))) { return SCTP_CID_FWD_TSN;} if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ASCONF"))) { return SCTP_CID_ASCONF;} if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ASCONF_ACK"))) { return SCTP_CID_ASCONF_ACK;} - fprintf(stderr, "ERROR: Could not convert: %s\n", chunk_type_str); - exit(-1); + AssertFatal (0, "ERROR: %s() cannot convert: %s\n", __FUNCTION__, chunk_type_str); } //------------------------------------------------------------------------------ -test_packet_t* parse_xml_packet(xmlNodePtr node) { +const char * const chunk_type_cid2str(const sctp_cid_t chunk_type) +{ + switch (chunk_type) { + case SCTP_CID_DATA: return "DATA"; break; + case SCTP_CID_INIT: return "INIT"; break; + case SCTP_CID_INIT_ACK: return "INIT_ACK"; break; + case SCTP_CID_SACK: return "SACK"; break; + case SCTP_CID_HEARTBEAT: return "HEARTBEAT"; break; + case SCTP_CID_HEARTBEAT_ACK: return "HEARTBEAT_ACK"; break; + case SCTP_CID_ABORT: return "ABORT"; break; + case SCTP_CID_SHUTDOWN: return "SHUTDOWN"; break; + case SCTP_CID_SHUTDOWN_ACK: return "SHUTDOWN_ACK"; break; + case SCTP_CID_ERROR: return "ERROR"; break; + case SCTP_CID_COOKIE_ECHO: return "COOKIE_ECHO"; break; + case SCTP_CID_COOKIE_ACK: return "COOKIE_ACK"; break; + case SCTP_CID_ECN_ECNE: return "ECN_ECNE"; break; + case SCTP_CID_ECN_CWR: return "ECN_CWR"; break; + case SCTP_CID_SHUTDOWN_COMPLETE: return "SHUTDOWN_COMPLETE"; break; + case SCTP_CID_AUTH: return "AUTH"; break; + case SCTP_CID_FWD_TSN: return "FWD_TSN"; break; + case SCTP_CID_ASCONF: return "ASCONF"; break; + case SCTP_CID_ASCONF_ACK: return "ASCONF_ACK"; break; + default: + AssertFatal (0, "ERROR %s(): Unknown chunk_type %d!\n", __FUNCTION__, chunk_type); + } +} +//------------------------------------------------------------------------------ +test_action_t action_str2test_action_t(const xmlChar * const action) +{ + if ((!xmlStrcmp(action, (const xmlChar *)"SEND"))) { return ACTION_S1C_SEND;} + if ((!xmlStrcmp(action, (const xmlChar *)"RECEIVE"))) { return ACTION_S1C_RECEIVE;} + AssertFatal (0, "ERROR: %s cannot convert: %s\n", __FUNCTION__, action); + //if (NULL == action) {return ACTION_S1C_NULL;} +} +//------------------------------------------------------------------------------ +void ip_str2test_ip(const xmlChar * const ip_str, test_ip_t * const ip) +{ + AssertFatal (NULL != ip_str, "ERROR %s() Cannot convert null string to ip address!\n", __FUNCTION__); + AssertFatal (NULL != ip, "ERROR %s() out parameter pointer is NULL!\n", __FUNCTION__); + // store this IP address in sa: + if (inet_pton(AF_INET, (const char*)ip_str, (void*)&(ip->address.ipv4)) > 0) { + ip->address_family = AF_INET; + } else if (inet_pton(AF_INET6, (const char*)ip_str, (void*)&(ip->address.ipv6)) > 0) { + ip->address_family = AF_INET6; + } else { + ip->address_family = AF_UNSPEC; + AssertFatal (0, "ERROR %s() Could not parse ip address %s!\n", __FUNCTION__, ip_str); + } +} +//------------------------------------------------------------------------------ +int test_s1ap_decode_initiating_message(s1ap_message *message, + S1ap_InitiatingMessage_t *initiating_p) +{ + int ret = -1; - test_packet_t *packet = NULL; - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; + DevAssert(initiating_p != NULL); + + message->procedureCode = initiating_p->procedureCode; + message->criticality = initiating_p->criticality; + + switch(initiating_p->procedureCode) { + case S1ap_ProcedureCode_id_downlinkNASTransport: + ret = s1ap_decode_s1ap_downlinknastransporties( + &message->msg.s1ap_DownlinkNASTransportIEs, + &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_InitialContextSetup: + ret = s1ap_decode_s1ap_initialcontextsetuprequesties( + &message->msg.s1ap_InitialContextSetupRequestIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_UEContextRelease: + ret = s1ap_decode_s1ap_uecontextreleasecommandies( + &message->msg.s1ap_UEContextReleaseCommandIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_Paging: + ret = s1ap_decode_s1ap_pagingies( + &message->msg.s1ap_PagingIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_uplinkNASTransport: { + ret = s1ap_decode_s1ap_uplinknastransporties (&message->msg.s1ap_UplinkNASTransportIEs, &initiating_p->value); + } + break; + + case S1ap_ProcedureCode_id_S1Setup: { + ret = s1ap_decode_s1ap_s1setuprequesties (&message->msg.s1ap_S1SetupRequestIEs, &initiating_p->value); + } + break; + + case S1ap_ProcedureCode_id_initialUEMessage: { + ret = s1ap_decode_s1ap_initialuemessageies (&message->msg.s1ap_InitialUEMessageIEs, &initiating_p->value); + } + break; + + case S1ap_ProcedureCode_id_UEContextReleaseRequest: { + ret = s1ap_decode_s1ap_uecontextreleaserequesties (&message->msg.s1ap_UEContextReleaseRequestIEs, &initiating_p->value); + } + break; + + case S1ap_ProcedureCode_id_UECapabilityInfoIndication: { + ret = s1ap_decode_s1ap_uecapabilityinfoindicationies (&message->msg.s1ap_UECapabilityInfoIndicationIEs, &initiating_p->value); + } + break; + + case S1ap_ProcedureCode_id_NASNonDeliveryIndication: { + ret = s1ap_decode_s1ap_nasnondeliveryindication_ies (&message->msg.s1ap_NASNonDeliveryIndication_IEs, &initiating_p->value); + } + break; + + default: + AssertFatal( 0 , "Unknown procedure ID (%d) for initiating message\n", + (int)initiating_p->procedureCode); + return -1; + } + return ret; +} + +//------------------------------------------------------------------------------ +int test_s1ap_decode_successful_outcome(s1ap_message *message, + S1ap_SuccessfulOutcome_t *successfullOutcome_p) +{ + int ret = -1; + + DevAssert(successfullOutcome_p != NULL); + + message->procedureCode = successfullOutcome_p->procedureCode; + message->criticality = successfullOutcome_p->criticality; + + switch(successfullOutcome_p->procedureCode) { + case S1ap_ProcedureCode_id_S1Setup: + ret = s1ap_decode_s1ap_s1setupresponseies( + &message->msg.s1ap_S1SetupResponseIEs, &successfullOutcome_p->value); + break; + + case S1ap_ProcedureCode_id_InitialContextSetup: { + ret = s1ap_decode_s1ap_initialcontextsetupresponseies (&message->msg.s1ap_InitialContextSetupResponseIEs, &successfullOutcome_p->value); + } + break; + + case S1ap_ProcedureCode_id_UEContextRelease: { + ret = s1ap_decode_s1ap_uecontextreleasecompleteies (&message->msg.s1ap_UEContextReleaseCompleteIEs, &successfullOutcome_p->value); + } + break; + + default: + AssertFatal(0, "Unknown procedure ID (%d) for successfull outcome message\n", + (int)successfullOutcome_p->procedureCode); + return -1; + } + return ret; +} + +//------------------------------------------------------------------------------ +int test_s1ap_decode_unsuccessful_outcome(s1ap_message *message, + S1ap_UnsuccessfulOutcome_t *unSuccessfullOutcome_p) +{ + int ret = -1; + DevAssert(unSuccessfullOutcome_p != NULL); + + message->procedureCode = unSuccessfullOutcome_p->procedureCode; + message->criticality = unSuccessfullOutcome_p->criticality; + + switch(unSuccessfullOutcome_p->procedureCode) { + case S1ap_ProcedureCode_id_S1Setup: + return s1ap_decode_s1ap_s1setupfailureies( + &message->msg.s1ap_S1SetupFailureIEs, &unSuccessfullOutcome_p->value); + + case S1ap_ProcedureCode_id_InitialContextSetup: { + ret = s1ap_decode_s1ap_initialcontextsetupfailureies (&message->msg.s1ap_InitialContextSetupFailureIEs, &unSuccessfullOutcome_p->value); + } + break; + + + default: + AssertFatal(0,"Unknown procedure ID (%d) for unsuccessfull outcome message\n", + (int)unSuccessfullOutcome_p->procedureCode); + break; + } + + return ret; +} + +//------------------------------------------------------------------------------ +int test_s1ap_decode_pdu(s1ap_message *message, const uint8_t * const buffer, + const uint32_t length) +{ + S1AP_PDU_t pdu; + S1AP_PDU_t *pdu_p = &pdu; + asn_dec_rval_t dec_ret; + + DevAssert(buffer != NULL); + + memset((void *)pdu_p, 0, sizeof(S1AP_PDU_t)); + + dec_ret = aper_decode(NULL, + &asn_DEF_S1AP_PDU, + (void **)&pdu_p, + buffer, + length, + 0, + 0); + + if (dec_ret.code != RC_OK) { + S1AP_ERROR("Failed to decode pdu\n"); + return -1; + } + + message->direction = pdu_p->present; + + switch(pdu_p->present) { + case S1AP_PDU_PR_initiatingMessage: + return test_s1ap_decode_initiating_message(message, + &pdu_p->choice.initiatingMessage); + + case S1AP_PDU_PR_successfulOutcome: + return test_s1ap_decode_successful_outcome(message, + &pdu_p->choice.successfulOutcome); + + case S1AP_PDU_PR_unsuccessfulOutcome: + return test_s1ap_decode_unsuccessful_outcome(message, + &pdu_p->choice.unsuccessfulOutcome); + + default: + AssertFatal(0, "Unknown presence (%d) or not implemented\n", (int)pdu_p->present); + break; + } + return -1; +} +//------------------------------------------------------------------------------ +void test_decode_s1ap(test_s1ap_t * const s1ap) +{ + if (NULL != s1ap) { + if (test_s1ap_decode_pdu(&s1ap->message, s1ap->binary_stream, s1ap->binary_stream_allocated_size) < 0) { + AssertFatal (0, "ERROR %s() Cannot decode S1AP message!\n", __FUNCTION__); + } + } +} +//------------------------------------------------------------------------------ +void parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, test_s1ap_t * const s1ap) +{ + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + xmlChar *xml_char2 = NULL; + unsigned int size = 0; + int rc = 0; + unsigned int go_deeper_in_tree = 1; + + if ((NULL != s1ap_node) && (NULL != s1ap)) { + for (cur_node = (xmlNode *)s1ap_node; cur_node; cur_node = cur_node->next) { + go_deeper_in_tree = 1; + if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"field"))) { + // do not get hidden fields + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"hide"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"yes"))) { + xmlFree(xml_char); + return; + } + xmlFree(xml_char); + } + // first get size + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); + if (NULL != xml_char) { + size = strtoul((const char *)xml_char, NULL, 0); + xmlFree(xml_char); + // second: try to get value (always hex) + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); + if (NULL != xml_char) { + xml_char2 = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); + fprintf(stdout, "s1ap %p field %s size %d value %s\n",s1ap, xml_char2, size, xml_char); + xmlFree(xml_char2); + // if success to get value, do not parse children + //AssertFatal ((xmlStrlen(xml_char) == size), "ERROR %s() mismatch in size %d and strlen %d\n", __FUNCTION__, size, xmlStrlen(xml_char)); + //if (xmlStrlen(xml_char) == size) { + AssertFatal ((s1ap->binary_stream_pos+xmlStrlen(xml_char)/2) <= s1ap->binary_stream_allocated_size, + "ERROR %s() in buffer size: binary_stream_pos %d xmlStrlen(xml_char)/2=%d\n", __FUNCTION__, s1ap->binary_stream_pos, xmlStrlen(xml_char)/2); + rc = hex2data( &s1ap->binary_stream[s1ap->binary_stream_pos], xml_char, xmlStrlen(xml_char)); + s1ap->binary_stream_pos += xmlStrlen(xml_char)/2; + display_node(cur_node, 0); + AssertFatal (rc >= 0, "ERROR %s() in converting hex string %s len %d size %d rc %d\n", __FUNCTION__, xml_char, xmlStrlen(xml_char), size, rc); + go_deeper_in_tree = 0; + //} + xmlFree(xml_char); + } + } + } + if (0 < go_deeper_in_tree) { + parse_s1ap(doc, cur_node->children, s1ap); + } + } + } +} + +//------------------------------------------------------------------------------ +void parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t * const sctp_hdr) +{ + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + xmlChar *xml_char2 = NULL; + + if ((NULL != sctp_node) && (NULL != sctp_hdr)) { + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_payload_proto_id"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->ppid = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_sid"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->stream = strtoul((const char *)xml_char2, NULL, 16); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_tsn"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->tsn = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_ssn"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->ssn = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } + xmlFree(xml_char); + } + for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { + parse_sctp_data_chunk(doc, cur_node, sctp_hdr); + } + } + +} +//------------------------------------------------------------------------------ +void parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_inithdr_t * const sctp_hdr) +{ + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + xmlChar *xml_char2 = NULL; + + if ((NULL != sctp_node) && (NULL != sctp_hdr)) { + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_nr_out_streams"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->num_outbound_streams = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_nr_in_streams"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->num_inbound_streams = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_credit"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->a_rwnd = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_initial_tsn"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->initial_tsn = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_initiate_tag"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->init_tag = strtoul((const char *)xml_char2, NULL, 16); + xmlFree(xml_char2); + } + } + xmlFree(xml_char); + } + for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { + parse_sctp_init_chunk(doc, cur_node, sctp_hdr); + } + } +} +//------------------------------------------------------------------------------ +void parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t * const sctp_hdr) +{ + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + xmlChar *xml_char2 = NULL; + + if ((NULL != sctp_node) && (NULL != sctp_hdr)) { + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_nr_out_streams"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->num_outbound_streams = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_nr_in_streams"))) { + xml_char2 = xmlGetProp((xmlNode *)(xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->num_inbound_streams = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_credit"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->a_rwnd = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_initial_tsn"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->initial_tsn = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_initiate_tag"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->init_tag = strtoul((const char *)xml_char2, NULL, 16); + xmlFree(xml_char2); + } + } + xmlFree(xml_char); + } + for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { + parse_sctp_init_ack_chunk(doc, cur_node, sctp_hdr); + } + } +} +//------------------------------------------------------------------------------ +void parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, test_sctp_hdr_t * const sctp_hdr) +{ + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + xmlChar *xml_char2 = NULL; + + if ((NULL != sctp_node) && (NULL != sctp_hdr)) { + if ((!xmlStrcmp(sctp_node->name, (const xmlChar *)"proto"))) { + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"s1ap"))) { + xmlFree(xml_char); + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"size"); + if (NULL != xml_char2) { + sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size = strtoul((const char *)xml_char2, NULL, 0); + sctp_hdr->u.data_hdr.payload.binary_stream = calloc(1, sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size); + xmlFree(xml_char2); + } + parse_s1ap(doc, sctp_node, &sctp_hdr->u.data_hdr.payload); + test_decode_s1ap(&sctp_hdr->u.data_hdr.payload); + return; + } + xmlFree(xml_char); + } + } + //if ((cur_node->type == XML_ATTRIBUTE_NODE) || (cur_node->type == XML_ELEMENT_NODE)) { + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.srcport"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->src_port = strtoul((const char *)xml_char2, NULL, 16); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.dstport"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->dst_port = strtoul((const char *)xml_char2, NULL, 16); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.chunk_type"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->chunk_type = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + switch (sctp_hdr->chunk_type) { + case SCTP_CID_DATA: + parse_sctp_data_chunk(doc, sctp_node->parent, &sctp_hdr->u.data_hdr); + break; + case SCTP_CID_INIT: + parse_sctp_init_chunk(doc, sctp_node->parent, &sctp_hdr->u.init_hdr); + break; + case SCTP_CID_INIT_ACK: + parse_sctp_init_ack_chunk(doc, sctp_node->parent, &sctp_hdr->u.init_ack_hdr); + break; + default: + ; + } + } + } + } + for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { + parse_sctp(doc, cur_node, sctp_hdr); + } + } +} +//------------------------------------------------------------------------------ +test_packet_t* parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { + + test_packet_t *packet = NULL; + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + float afloat = (float)0.0; + static struct timeval initial_time = { .tv_sec = 0, .tv_usec = 0 }; + static struct timeval relative_last_sent_packet = { .tv_sec = 0, .tv_usec = 0 }; + static struct timeval relative_last_received_packet = { .tv_sec = 0, .tv_usec = 0 }; + static char first_packet = 1; + static char first_sent_packet = 1; + static char first_received_packet = 1; + static unsigned int packet_number = 1; if (NULL != node) { packet = calloc(1, sizeof(*packet)); + xml_char = xmlGetProp(node, (const xmlChar *)"action"); + packet->action = action_str2test_action_t(xml_char); + xmlFree(xml_char); + packet->packet_number = packet_number++; + for (cur_node = node->children; cur_node; cur_node = cur_node->next) { - if (cur_node->type == XML_ELEMENT_NODE) { - printf("node type: Element, name: %s\n", cur_node->name); + //if (cur_node->type == XML_ELEMENT_NODE) { if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.time_relative"))) { + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); + afloat = atof((const char*)xml_char); + xmlFree(xml_char); + packet->time_relative_to_first_packet.tv_sec = (int)afloat; + packet->time_relative_to_first_packet.tv_usec = (int)((afloat - packet->time_relative_to_first_packet.tv_sec)*1000000); + + if (first_packet > 0) { + initial_time = packet->time_relative_to_first_packet; + packet->time_relative_to_first_packet.tv_sec = 0; + packet->time_relative_to_first_packet.tv_usec = 0; + first_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &initial_time, + &packet->time_relative_to_first_packet); + } + if (packet->action == ACTION_S1C_SEND) { + if (first_sent_packet > 0) { + relative_last_sent_packet = packet->time_relative_to_first_packet; + packet->time_relative_to_last_sent_packet.tv_sec = 0; + packet->time_relative_to_last_sent_packet.tv_usec = 0; + first_sent_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, + &packet->time_relative_to_last_sent_packet); + relative_last_sent_packet = packet->time_relative_to_first_packet; + } + } else if (packet->action == ACTION_S1C_RECEIVE) { + if (first_received_packet > 0) { + relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec; + relative_last_received_packet.tv_usec = packet->time_relative_to_first_packet.tv_usec; + packet->time_relative_to_last_received_packet.tv_sec = 0; + packet->time_relative_to_last_received_packet.tv_usec = 0; + first_received_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, + &packet->time_relative_to_last_received_packet); + relative_last_received_packet = packet->time_relative_to_first_packet; + } + } + + } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.number"))) { + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); + packet->original_frame_number = strtoul((const char *)xml_char, NULL, 0); + xmlFree(xml_char); } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.src"))) { + xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1); + ip_str2test_ip(xml_char, &packet->ip_hdr.src); + xmlFree(xml_char); } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.dst"))) { - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"sctp.chunk_type_str"))) { - xml_char = xmlGetProp(cur_node, (const xmlChar *)"value"); - packet->sctp_hdr.chunk_type = chunk_type_str2cid(xml_char); - fprintf(stdout, "chunk_type_str2cid: %s\n", xml_char); + xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1); + ip_str2test_ip(xml_char, &packet->ip_hdr.dst); + xmlFree(xml_char); + } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"proto"))) { + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp"))) { + parse_sctp(doc, cur_node, &packet->sctp_hdr); + } + xmlFree(xml_char); + } } - } + //} } } return packet; @@ -210,11 +1097,12 @@ test_packet_t* parse_xml_packet(xmlNodePtr node) { //------------------------------------------------------------------------------ int play_scenario(test_scenario_t* scenario) { //TODO + display_scenario(scenario); return 0; } //------------------------------------------------------------------------------ test_scenario_t* generate_scenario( - const char const * play_scenario_filename ) + const char * const play_scenario_filename ) { xmlDocPtr doc = NULL; xmlNodePtr root = NULL; @@ -229,6 +1117,7 @@ test_scenario_t* generate_scenario( AssertFatal (0, "Could not parse scenario xml file %s!\n", play_scenario_filename); } else { fprintf(stdout, "Test scenario file to play: %s\n", play_scenario_filename); + //xmlDebugDumpDocument(NULL, doc); } // Get root @@ -242,13 +1131,13 @@ test_scenario_t* generate_scenario( next_packet = &scenario->list_packet; for (node = root->children; node != NULL; node = node->next) { if ((!xmlStrcmp(node->name, (const xmlChar *)"packet"))) { - packet = parse_xml_packet(node); + packet = parse_xml_packet(doc, node); if (NULL != packet) { *next_packet = packet; next_packet = &packet->next; } else { fprintf(stdout, "WARNING omitted packet:\n"); - display_node(node); + display_node(node, 0); } } } @@ -285,7 +1174,7 @@ int generate_xml_scenario( if (getcwd(astring, sizeof(astring)) != NULL) { fprintf(stdout, "working in %s directory\n", astring); } else { - perror("getcwd() error"); + perror("getcwd() ERROR"); exit(1); } @@ -332,22 +1221,22 @@ int generate_xml_scenario( if (NULL != res) { sprintf(play_scenario_filename,"%s",test_scenario_filename); if (strip_extension(play_scenario_filename) > 0) { - strcat(play_scenario_filename, ".tsml"); + strcat((char *)play_scenario_filename, ".tsml"); play_scenario_file = fopen( play_scenario_filename, "w+"); if (NULL != play_scenario_file) { xsltSaveResultToFile(play_scenario_file, res, cur); fclose(play_scenario_file); fprintf(stdout, "Wrote test scenario to %s\n", play_scenario_filename); } else { - fprintf(stderr, "Error in fopen(%s)\n", play_scenario_filename); + fprintf(stderr, "ERROR in fopen(%s)\n", play_scenario_filename); ret = -1; } } else { - fprintf(stderr, "Error in strip_extension()\n"); + fprintf(stderr, "ERROR in strip_extension()\n"); ret = -1; } } else { - fprintf(stderr, "Error in xsltApplyStylesheet()\n"); + fprintf(stderr, "ERROR in xsltApplyStylesheet()\n"); ret = -1; } xsltFreeStylesheet(cur); @@ -466,23 +1355,23 @@ config_parse_opt_line ( exit(1); } if (chdir(*test_dir_name) != 0) { - fprintf(stderr, "Error: chdir %s returned %s\n", *test_dir_name, strerror(errno)); + fprintf(stderr, "ERROR: chdir %s returned %s\n", *test_dir_name, strerror(errno)); exit(1); } if (rv & PLAY_SCENARIO) { if (NULL == *enb_config_file_name) { - fprintf(stderr, "Error: please provide the original eNB config file name that should be in %s\n", *test_dir_name); + fprintf(stderr, "ERROR: please provide the original eNB config file name that should be in %s\n", *test_dir_name); } if (is_file_exists(*enb_config_file_name, "eNB config file") != GS_IS_FILE) { - fprintf(stderr, "Error: original eNB config file name %s is not found in dir %s\n", *enb_config_file_name, *test_dir_name); + fprintf(stderr, "ERROR: original eNB config file name %s is not found in dir %s\n", *enb_config_file_name, *test_dir_name); } enb_properties_p = enb_config_init(*enb_config_file_name); if (NULL == *scenario_file_name) { - fprintf(stderr, "Error: please provide the scenario file name that should be in %s\n", *test_dir_name); + fprintf(stderr, "ERROR: please provide the scenario file name that should be in %s\n", *test_dir_name); } if (is_file_exists(*scenario_file_name, "Scenario file") != GS_IS_FILE) { - fprintf(stderr, "Error: Scenario file name %s is not found in dir %s\n", *scenario_file_name, *test_dir_name); + fprintf(stderr, "ERROR: Scenario file name %s is not found in dir %s\n", *scenario_file_name, *test_dir_name); } } return rv; @@ -503,21 +1392,29 @@ int main( int argc, char **argv ) memset(play_scenario_filename, 0, sizeof(play_scenario_filename)); g_openair_dir = getenv("OPENAIR_DIR"); if (NULL == g_openair_dir) { - fprintf(stderr, "Error: Could not get OPENAIR_DIR environment variable\n"); + fprintf(stderr, "ERROR: Could not get OPENAIR_DIR environment variable\n"); exit(1); } + // logging + logInit(); + set_comp_log(S1AP, LOG_TRACE, LOG_MED,1); + set_comp_log(SCTP, LOG_TRACE, LOG_MED,1); + asn_debug = 1; + asn1_xer_print = 1; + + //parameters actions = config_parse_opt_line (argc, argv, &test_dir_name, &scenario_file_name, &enb_config_file_name); //Command-line options if (actions & PLAY_SCENARIO) { if (generate_xml_scenario(test_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) { if (NULL != (scenario = generate_scenario(play_scenario_filename))) { ret = play_scenario(scenario); } else { - fprintf(stderr, "Error: Could not generate scenario from tsml file\n"); + fprintf(stderr, "ERROR: Could not generate scenario from tsml file\n"); ret = -1; } } else { - fprintf(stderr, "Error: Could not generate tsml scenario from xml file\n"); + fprintf(stderr, "ERROR: Could not generate tsml scenario from xml file\n"); ret = -1; } free_pointer(test_dir_name); diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 4916950783..2bf6cc4ccf 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -28,18 +28,22 @@ *******************************************************************************/ /* - generate_scenario.h + play_scenario.h ------------------- AUTHOR : Lionel GAUTHIER COMPANY : EURECOM EMAIL : Lionel.Gauthier@eurecom.fr */ -#ifndef GENERATE_SCENARIO_H_ -#define GENERATE_SCENARIO_H_ -# include -# include -#include +#ifndef PLAY_SCENARIO_H_ +#define PLAY_SCENARIO_H_ +# include +# include +# include +# include + +#include "s1ap_ies_defs.h" + /** @defgroup _enb_app ENB APP * @ingroup _oai2 @@ -83,13 +87,32 @@ typedef enum { SCTP_CID_ASCONF_ACK = 0x80, } sctp_cid_t; /* enum */ +typedef enum { + TEST_S1AP_PDU_TYPE_START = 0, + TEST_S1AP_PDU_TYPE_UNKNOWN = TEST_S1AP_PDU_TYPE_START, + TEST_S1AP_PDU_TYPE_INITIATING, + TEST_S1AP_PDU_TYPE_SUCCESSFUL_OUTCOME, + TEST_S1AP_PDU_TYPE_UNSUCCESSFUL_OUTCOME, + TEST_S1AP_PDU_TYPE_END +} test_s1ap_pdu_type_t; + + +typedef struct test_s1ap_s { + //test_s1ap_pdu_type_t pdu_type; + uint16_t binary_stream_pos; + uint16_t binary_stream_allocated_size; + uint8_t *binary_stream; + s1ap_message message; +} test_s1ap_t; + + // from kernel source file 3.19/include/linux/sctp.h, Big Endians typedef struct sctp_datahdr_s { - uint32_t tsn; - uint16_t stream; - uint16_t ssn; - uint32_t ppid; - uint8_t payload[0]; + uint32_t tsn; + uint16_t stream; + uint16_t ssn; + uint32_t ppid; + test_s1ap_t payload; } sctp_datahdr_t; // from kernel source file 3.19/include/linux/sctp.h, Big Endians @@ -115,15 +138,28 @@ typedef struct test_sctp_hdr_s { } u; } test_sctp_hdr_t; +typedef struct test_ip_s { + unsigned int address_family; // AF_INET, AF_INET6 + union { + struct in6_addr ipv6; + in_addr_t ipv4; + }address; +}test_ip_t; + +typedef struct test_ip_hdr_s { + test_ip_t src; + test_ip_t dst; +} test_ip_hdr_t; + typedef struct test_packet_s { test_action_t action; struct timeval time_relative_to_first_packet; - struct timeval time_relative_to_last_packet; + struct timeval time_relative_to_last_sent_packet; + struct timeval time_relative_to_last_received_packet; + unsigned int original_frame_number; + unsigned int packet_number; + test_ip_hdr_t ip_hdr; test_sctp_hdr_t sctp_hdr; - uint16_t s1ap_byte_stream_count; - uint8_t *s1ap_byte_stream; - xmlNodePtr *s1ap_node; - struct test_packet_s *next; }test_packet_t; From 7c28ae7360e846c035db6f906d5f45d570ca0d62 Mon Sep 17 00:00:00 2001 From: gauthier Date: Fri, 13 Nov 2015 16:54:17 +0100 Subject: [PATCH 009/122] Still ASN1 display bug --- openair3/TEST/EPC_TEST/play_scenario.c | 144 +++++++++++++++---------- 1 file changed, 86 insertions(+), 58 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index a32947c439..982c1ffb40 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -60,6 +60,7 @@ #include #include +#include "intertask_interface_init.h" #include "assertions.h" #include "play_scenario.h" //#include "s1ap_eNB.h" @@ -470,7 +471,7 @@ int hex2data(unsigned char * const data, const unsigned char * const hexstring, char buf[5] = {'0', 'x', pos[0], pos[1], 0}; data[count] = strtol(buf, &endptr, 16); pos += 2 * sizeof(char); - AssertFatal (endptr[0] == '\0', "ERROR %s() non-hexadecimal character encountered buf %p endptr %p buf %s count %d pos %p\n", __FUNCTION__, buf, endptr, buf, count, pos); + AssertFatal (endptr[0] == '\0', "ERROR %s() non-hexadecimal character encountered buf %p endptr %p buf %s count %zu pos %p\n", __FUNCTION__, buf, endptr, buf, count, pos); AssertFatal (endptr != buf, "ERROR %s() No digits were found\n", __FUNCTION__); } return 0; @@ -553,10 +554,13 @@ void ip_str2test_ip(const xmlChar * const ip_str, test_ip_t * const ip) int test_s1ap_decode_initiating_message(s1ap_message *message, S1ap_InitiatingMessage_t *initiating_p) { + char *message_string = NULL; int ret = -1; DevAssert(initiating_p != NULL); + message_string = calloc(20000, sizeof(char)); + AssertFatal (NULL != message_string, "ERROR malloc()failed!\n"); message->procedureCode = initiating_p->procedureCode; message->criticality = initiating_p->criticality; @@ -565,58 +569,65 @@ int test_s1ap_decode_initiating_message(s1ap_message *message, ret = s1ap_decode_s1ap_downlinknastransporties( &message->msg.s1ap_DownlinkNASTransportIEs, &initiating_p->value); + s1ap_xer_print_s1ap_downlinknastransport(s1ap_xer__print2sp, message_string, message); break; case S1ap_ProcedureCode_id_InitialContextSetup: ret = s1ap_decode_s1ap_initialcontextsetuprequesties( &message->msg.s1ap_InitialContextSetupRequestIEs, &initiating_p->value); + s1ap_xer_print_s1ap_initialcontextsetuprequest(s1ap_xer__print2sp, message_string, message); break; case S1ap_ProcedureCode_id_UEContextRelease: ret = s1ap_decode_s1ap_uecontextreleasecommandies( &message->msg.s1ap_UEContextReleaseCommandIEs, &initiating_p->value); + s1ap_xer_print_s1ap_uecontextreleasecommand(s1ap_xer__print2sp, message_string, message); break; case S1ap_ProcedureCode_id_Paging: ret = s1ap_decode_s1ap_pagingies( &message->msg.s1ap_PagingIEs, &initiating_p->value); + s1ap_xer_print_s1ap_paging(s1ap_xer__print2sp, message_string, message); break; - case S1ap_ProcedureCode_id_uplinkNASTransport: { - ret = s1ap_decode_s1ap_uplinknastransporties (&message->msg.s1ap_UplinkNASTransportIEs, &initiating_p->value); - } + case S1ap_ProcedureCode_id_uplinkNASTransport: + ret = s1ap_decode_s1ap_uplinknastransporties (&message->msg.s1ap_UplinkNASTransportIEs, &initiating_p->value); + s1ap_xer_print_s1ap_uplinknastransport(s1ap_xer__print2sp, message_string, message); break; - case S1ap_ProcedureCode_id_S1Setup: { - ret = s1ap_decode_s1ap_s1setuprequesties (&message->msg.s1ap_S1SetupRequestIEs, &initiating_p->value); - } + case S1ap_ProcedureCode_id_S1Setup: + ret = s1ap_decode_s1ap_s1setuprequesties (&message->msg.s1ap_S1SetupRequestIEs, &initiating_p->value); + s1ap_xer_print_s1ap_s1setuprequest(s1ap_xer__print2sp, message_string, message); break; - case S1ap_ProcedureCode_id_initialUEMessage: { - ret = s1ap_decode_s1ap_initialuemessageies (&message->msg.s1ap_InitialUEMessageIEs, &initiating_p->value); - } + case S1ap_ProcedureCode_id_initialUEMessage: + ret = s1ap_decode_s1ap_initialuemessageies (&message->msg.s1ap_InitialUEMessageIEs, &initiating_p->value); + s1ap_xer_print_s1ap_initialuemessage(s1ap_xer__print2sp, message_string, message); break; - case S1ap_ProcedureCode_id_UEContextReleaseRequest: { - ret = s1ap_decode_s1ap_uecontextreleaserequesties (&message->msg.s1ap_UEContextReleaseRequestIEs, &initiating_p->value); - } + case S1ap_ProcedureCode_id_UEContextReleaseRequest: + ret = s1ap_decode_s1ap_uecontextreleaserequesties (&message->msg.s1ap_UEContextReleaseRequestIEs, &initiating_p->value); + s1ap_xer_print_s1ap_uecontextreleaserequest(s1ap_xer__print2sp, message_string, message); break; - case S1ap_ProcedureCode_id_UECapabilityInfoIndication: { - ret = s1ap_decode_s1ap_uecapabilityinfoindicationies (&message->msg.s1ap_UECapabilityInfoIndicationIEs, &initiating_p->value); - } + case S1ap_ProcedureCode_id_UECapabilityInfoIndication: + ret = s1ap_decode_s1ap_uecapabilityinfoindicationies (&message->msg.s1ap_UECapabilityInfoIndicationIEs, &initiating_p->value); + //s1ap_xer_print_s1ap_uecapabilityinfoindication(s1ap_xer__print2sp, message_string, message); break; - case S1ap_ProcedureCode_id_NASNonDeliveryIndication: { - ret = s1ap_decode_s1ap_nasnondeliveryindication_ies (&message->msg.s1ap_NASNonDeliveryIndication_IEs, &initiating_p->value); - } + case S1ap_ProcedureCode_id_NASNonDeliveryIndication: + ret = s1ap_decode_s1ap_nasnondeliveryindication_ies (&message->msg.s1ap_NASNonDeliveryIndication_IEs, &initiating_p->value); + s1ap_xer_print_s1ap_nasnondeliveryindication_(s1ap_xer__print2sp, message_string, message); break; default: + free(message_string); AssertFatal( 0 , "Unknown procedure ID (%d) for initiating message\n", (int)initiating_p->procedureCode); return -1; } + fprintf(stdout, "s1ap_xer_print:\n%s\n", message_string); + free(message_string); return ret; } @@ -624,9 +635,12 @@ int test_s1ap_decode_initiating_message(s1ap_message *message, int test_s1ap_decode_successful_outcome(s1ap_message *message, S1ap_SuccessfulOutcome_t *successfullOutcome_p) { - int ret = -1; + char *message_string = NULL; + int ret = -1; DevAssert(successfullOutcome_p != NULL); + message_string = calloc(20000, sizeof(char)); + AssertFatal (NULL != message_string, "ERROR malloc()failed!\n"); message->procedureCode = successfullOutcome_p->procedureCode; message->criticality = successfullOutcome_p->criticality; @@ -635,23 +649,27 @@ int test_s1ap_decode_successful_outcome(s1ap_message *message, case S1ap_ProcedureCode_id_S1Setup: ret = s1ap_decode_s1ap_s1setupresponseies( &message->msg.s1ap_S1SetupResponseIEs, &successfullOutcome_p->value); + s1ap_xer_print_s1ap_s1setupresponse(s1ap_xer__print2sp, message_string, message); break; - case S1ap_ProcedureCode_id_InitialContextSetup: { - ret = s1ap_decode_s1ap_initialcontextsetupresponseies (&message->msg.s1ap_InitialContextSetupResponseIEs, &successfullOutcome_p->value); - } + case S1ap_ProcedureCode_id_InitialContextSetup: + ret = s1ap_decode_s1ap_initialcontextsetupresponseies (&message->msg.s1ap_InitialContextSetupResponseIEs, &successfullOutcome_p->value); + s1ap_xer_print_s1ap_initialcontextsetupresponse(s1ap_xer__print2sp, message_string, message); break; - case S1ap_ProcedureCode_id_UEContextRelease: { + case S1ap_ProcedureCode_id_UEContextRelease: ret = s1ap_decode_s1ap_uecontextreleasecompleteies (&message->msg.s1ap_UEContextReleaseCompleteIEs, &successfullOutcome_p->value); - } + s1ap_xer_print_s1ap_uecontextreleasecomplete(s1ap_xer__print2sp, message_string, message); break; default: + free(message_string); AssertFatal(0, "Unknown procedure ID (%d) for successfull outcome message\n", (int)successfullOutcome_p->procedureCode); return -1; } + fprintf(stdout, "s1ap_xer_print:\n%s\n", message_string); + free(message_string); return ret; } @@ -659,29 +677,37 @@ int test_s1ap_decode_successful_outcome(s1ap_message *message, int test_s1ap_decode_unsuccessful_outcome(s1ap_message *message, S1ap_UnsuccessfulOutcome_t *unSuccessfullOutcome_p) { + char *message_string = NULL; int ret = -1; + DevAssert(unSuccessfullOutcome_p != NULL); + message_string = calloc(20000, sizeof(char)); + AssertFatal (NULL != message_string, "ERROR malloc()failed!\n"); message->procedureCode = unSuccessfullOutcome_p->procedureCode; message->criticality = unSuccessfullOutcome_p->criticality; switch(unSuccessfullOutcome_p->procedureCode) { case S1ap_ProcedureCode_id_S1Setup: - return s1ap_decode_s1ap_s1setupfailureies( + ret = s1ap_decode_s1ap_s1setupfailureies( &message->msg.s1ap_S1SetupFailureIEs, &unSuccessfullOutcome_p->value); + s1ap_xer_print_s1ap_s1setupfailure(s1ap_xer__print2sp, message_string, message); + break; - case S1ap_ProcedureCode_id_InitialContextSetup: { - ret = s1ap_decode_s1ap_initialcontextsetupfailureies (&message->msg.s1ap_InitialContextSetupFailureIEs, &unSuccessfullOutcome_p->value); - } + case S1ap_ProcedureCode_id_InitialContextSetup: + ret = s1ap_decode_s1ap_initialcontextsetupfailureies (&message->msg.s1ap_InitialContextSetupFailureIEs, &unSuccessfullOutcome_p->value); + s1ap_xer_print_s1ap_initialcontextsetupfailure(s1ap_xer__print2sp, message_string, message); break; default: + free(message_string); AssertFatal(0,"Unknown procedure ID (%d) for unsuccessfull outcome message\n", (int)unSuccessfullOutcome_p->procedureCode); break; } - + fprintf(stdout, "s1ap_xer_print:\n%s\n", message_string); + free(message_string); return ret; } @@ -758,34 +784,35 @@ void parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, test_s1ap_t * con xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"hide"); if (NULL != xml_char) { if ((!xmlStrcmp(xml_char, (const xmlChar *)"yes"))) { - xmlFree(xml_char); - return; + go_deeper_in_tree = 0; } xmlFree(xml_char); } - // first get size - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); - if (NULL != xml_char) { - size = strtoul((const char *)xml_char, NULL, 0); - xmlFree(xml_char); - // second: try to get value (always hex) - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); + if (0 < go_deeper_in_tree) { + // first get size + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); if (NULL != xml_char) { - xml_char2 = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); - fprintf(stdout, "s1ap %p field %s size %d value %s\n",s1ap, xml_char2, size, xml_char); - xmlFree(xml_char2); - // if success to get value, do not parse children - //AssertFatal ((xmlStrlen(xml_char) == size), "ERROR %s() mismatch in size %d and strlen %d\n", __FUNCTION__, size, xmlStrlen(xml_char)); - //if (xmlStrlen(xml_char) == size) { - AssertFatal ((s1ap->binary_stream_pos+xmlStrlen(xml_char)/2) <= s1ap->binary_stream_allocated_size, - "ERROR %s() in buffer size: binary_stream_pos %d xmlStrlen(xml_char)/2=%d\n", __FUNCTION__, s1ap->binary_stream_pos, xmlStrlen(xml_char)/2); - rc = hex2data( &s1ap->binary_stream[s1ap->binary_stream_pos], xml_char, xmlStrlen(xml_char)); - s1ap->binary_stream_pos += xmlStrlen(xml_char)/2; - display_node(cur_node, 0); - AssertFatal (rc >= 0, "ERROR %s() in converting hex string %s len %d size %d rc %d\n", __FUNCTION__, xml_char, xmlStrlen(xml_char), size, rc); - go_deeper_in_tree = 0; - //} + size = strtoul((const char *)xml_char, NULL, 0); xmlFree(xml_char); + // second: try to get value (always hex) + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); + if (NULL != xml_char) { + xml_char2 = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); + fprintf(stdout, "s1ap %p field %s size %d value %s\n",s1ap, xml_char2, size, xml_char); + xmlFree(xml_char2); + // if success to get value, do not parse children + //AssertFatal ((xmlStrlen(xml_char) == size), "ERROR %s() mismatch in size %d and strlen %d\n", __FUNCTION__, size, xmlStrlen(xml_char)); + //if (xmlStrlen(xml_char) == size) { + AssertFatal ((s1ap->binary_stream_pos+xmlStrlen(xml_char)/2) <= s1ap->binary_stream_allocated_size, + "ERROR %s() in buffer size: binary_stream_pos %d xmlStrlen(xml_char)/2=%d\n", __FUNCTION__, s1ap->binary_stream_pos, xmlStrlen(xml_char)/2); + rc = hex2data( &s1ap->binary_stream[s1ap->binary_stream_pos], xml_char, xmlStrlen(xml_char)); + s1ap->binary_stream_pos += xmlStrlen(xml_char)/2; + display_node(cur_node, 0); + AssertFatal (rc >= 0, "ERROR %s() in converting hex string %s len %d size %d rc %d\n", __FUNCTION__, xml_char, xmlStrlen(xml_char), size, rc); + go_deeper_in_tree = 0; + //} + xmlFree(xml_char); + } } } } @@ -1166,7 +1193,6 @@ int generate_xml_scenario( int nb_params = 0; int i,j; char astring[1024]; - char *astring2 = NULL; struct in_addr addr; int ret = 0; @@ -1219,8 +1245,8 @@ int generate_xml_scenario( params[nb_params] = NULL; res = xsltApplyStylesheet(cur, doc, params); if (NULL != res) { - sprintf(play_scenario_filename,"%s",test_scenario_filename); - if (strip_extension(play_scenario_filename) > 0) { + sprintf((char *)play_scenario_filename,"%s",test_scenario_filename); + if (strip_extension((char *)play_scenario_filename) > 0) { strcat((char *)play_scenario_filename, ".tsml"); play_scenario_file = fopen( play_scenario_filename, "w+"); if (NULL != play_scenario_file) { @@ -1398,8 +1424,10 @@ int main( int argc, char **argv ) // logging logInit(); - set_comp_log(S1AP, LOG_TRACE, LOG_MED,1); - set_comp_log(SCTP, LOG_TRACE, LOG_MED,1); + itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL); + + set_comp_log(S1AP, LOG_TRACE, LOG_MED, 1); + set_comp_log(SCTP, LOG_TRACE, LOG_MED, 1); asn_debug = 1; asn1_xer_print = 1; From d27641a443113d3af55e05df7f433b54fd0a6bc5 Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 17 Nov 2015 16:56:24 +0100 Subject: [PATCH 010/122] Begin to begin sending packets (many things to do hash assoc id, mme_ue_id, nas security, etc) --- cmake_targets/CMakeLists.txt | 30 +- cmake_targets/epc_test/CMakeLists.template | 4 +- cmake_targets/tools/build_test_epc_tools | 2 +- openair3/S1AP/s1ap_eNB.c | 7 +- openair3/TEST/EPC_TEST/play_scenario.c | 1215 +++-------------- openair3/TEST/EPC_TEST/play_scenario.h | 215 ++- openair3/TEST/EPC_TEST/play_scenario_decode.c | 214 +++ .../TEST/EPC_TEST/play_scenario_display.c | 292 ++++ openair3/TEST/EPC_TEST/play_scenario_fsm.c | 127 ++ openair3/TEST/EPC_TEST/play_scenario_parse.c | 561 ++++++++ openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 162 +++ openair3/TEST/EPC_TEST/play_scenario_sctp.c | 45 + openair3/UTILS/conversions.h | 1 - 13 files changed, 1814 insertions(+), 1061 deletions(-) create mode 100644 openair3/TEST/EPC_TEST/play_scenario_decode.c create mode 100644 openair3/TEST/EPC_TEST/play_scenario_display.c create mode 100644 openair3/TEST/EPC_TEST/play_scenario_fsm.c create mode 100644 openair3/TEST/EPC_TEST/play_scenario_parse.c create mode 100644 openair3/TEST/EPC_TEST/play_scenario_s1ap.c create mode 100644 openair3/TEST/EPC_TEST/play_scenario_sctp.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 5fb722ee9d..148aae2419 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -216,18 +216,20 @@ add_definitions("-DPACKAGE_BUGREPORT=\"openair4g-devel@lists.eurecom.fr\"") # Debug related options ######################################### -add_boolean_option(MSG_PRINT False "print debug messages") -add_boolean_option(DISABLE_XER_PRINT False "print XER Format") -add_boolean_option(XER_PRINT False "print XER Format") -add_boolean_option(RRC_MSG_PRINT False "print RRC messages") -add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log") -add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace +add_boolean_option(ASN_DEBUG False "ASN1 coder/decoder Debug") +add_boolean_option(EMIT_ASN_DEBUG False "ASN1 coder/decoder Debug") +add_boolean_option(MSG_PRINT False "print debug messages") +add_boolean_option(DISABLE_XER_PRINT False "print XER Format") +add_boolean_option(XER_PRINT False "print XER Format") +add_boolean_option(RRC_MSG_PRINT False "print RRC messages") +add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log") +add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace -add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace -add_boolean_option(TEST_OMG False "???") -add_boolean_option(DEBUG_OMG False "???") -add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope") -add_boolean_option(PRINT_STATS False "This adds the possibility to see the status") +add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace +add_boolean_option(TEST_OMG False "???") +add_boolean_option(DEBUG_OMG False "???") +add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope") +add_boolean_option(PRINT_STATS False "This adds the possibility to see the status") add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering") @@ -1660,6 +1662,12 @@ target_link_libraries (test_epc_generate_scenario add_executable(test_epc_play_scenario ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_decode.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_display.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_fsm.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_parse.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_sctp.c ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.h ${OPENAIR2_DIR}/ENB_APP/enb_config.h ${OPENAIR2_DIR}/COMMON/commonDef.h diff --git a/cmake_targets/epc_test/CMakeLists.template b/cmake_targets/epc_test/CMakeLists.template index 5789c3eb5c..8a8223e4ae 100644 --- a/cmake_targets/epc_test/CMakeLists.template +++ b/cmake_targets/epc_test/CMakeLists.template @@ -7,7 +7,7 @@ set ( DEBUG_OMG False ) set ( DISABLE_XER_PRINT False ) set ( DRIVER2013 True ) set ( EMOS False ) -set ( EMIT_ASN_DEBUG True ) +set ( EMIT_ASN_DEBUG False ) set ( ENABLE_FXP True ) set ( ENABLE_ITTI True ) set ( ENABLE_NAS_UE_LOGGING True ) @@ -76,4 +76,4 @@ set ( SMBV False ) set ( TEST_OMG False ) set ( USE_MME "R10" ) set ( USER_MODE True ) -set ( XER_PRINT False ) +set ( XER_PRINT True ) diff --git a/cmake_targets/tools/build_test_epc_tools b/cmake_targets/tools/build_test_epc_tools index 10dc4fd256..db49fa017b 100755 --- a/cmake_targets/tools/build_test_epc_tools +++ b/cmake_targets/tools/build_test_epc_tools @@ -22,7 +22,7 @@ # Contact Information # OpenAirInterface Admin: openair_admin@eurecom.fr # OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@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 # diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c index c880c3f3b4..1b683d4aa3 100644 --- a/openair3/S1AP/s1ap_eNB.c +++ b/openair3/S1AP/s1ap_eNB.c @@ -72,9 +72,9 @@ s1ap_eNB_config_t s1ap_config; static int s1ap_eNB_generate_s1_setup_request( s1ap_eNB_instance_t *instance_p, s1ap_eNB_mme_data_t *s1ap_mme_data_p); -static + void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB); -static + void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp); uint32_t s1ap_generate_eNB_id(void) @@ -150,7 +150,7 @@ static void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, itti_send_msg_to_task(TASK_SCTP, instance_p->instance, message_p); } -static + void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB) { s1ap_eNB_instance_t *new_instance; @@ -210,7 +210,6 @@ void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t * } } -static void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) { s1ap_eNB_instance_t *instance_p; diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index 982c1ffb40..fda38dbcb8 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -48,132 +48,27 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include + #include "intertask_interface_init.h" +#include "timer.h" #include "assertions.h" -#include "play_scenario.h" -//#include "s1ap_eNB.h" #include "s1ap_common.h" -#include "s1ap_ies_defs.h" -#include "s1ap_eNB_decoder.h" #include "intertask_interface.h" -#include "enb_config.h" +#include "play_scenario.h" +#include "sctp_eNB_task.h" #include "log.h" //------------------------------------------------------------------------------ -#define ENB_CONFIG_MAX_XSLT_PARAMS 32 #define PLAY_SCENARIO 1 #define GS_IS_FILE 1 #define GS_IS_DIR 2 //------------------------------------------------------------------------------ char *g_openair_dir = NULL; //------------------------------------------------------------------------------ -extern Enb_properties_array_t enb_properties; extern int xmlLoadExtDtdDefaultValue; extern int asn_debug; extern int asn1_xer_print; -//------------------------------------------------------------------------------ -void test_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num); -int is_file_exists ( const char const * file_nameP, const char const *file_roleP); -int strip_extension( char *in_filename); -int split_path ( char * pathP, char *** resP); -void display_node ( xmlNodePtr node, unsigned int indent); -void display_tree ( xmlNodePtr node, unsigned int indent); -//------------------------- -void free_packet(test_packet_t* packet); -void free_scenario(test_scenario_t* scenario); -//------------------------- -void display_packet_sctp_init(const sctp_inithdr_t * const sctp); -void display_packet_sctp_initack(const sctp_initackhdr_t * const sctp); -void display_packet_sctp_data(const sctp_datahdr_t * const sctp); -void display_packet_sctp(const test_sctp_hdr_t * const sctp); -void display_packet_ip(const test_ip_hdr_t * const ip); -void display_packet(const test_packet_t * const packet); -void display_scenario(const test_scenario_t * const scenario); -//------------------------- -char * test_ip2ip_str(const test_ip_t * const ip); -int hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len); -sctp_cid_t chunk_type_str2cid(const xmlChar * const chunk_type_str); -const char * const chunk_type_cid2str(const sctp_cid_t chunk_type); -test_action_t action_str2test_action_t(const xmlChar * const action); -void ip_str2test_ip(const xmlChar * const ip_str, test_ip_t * const ip); -//------------------------- -int test_s1ap_decode_initiating_message(s1ap_message *message, S1ap_InitiatingMessage_t *initiating_p); -int test_s1ap_decode_successful_outcome(s1ap_message *message, S1ap_SuccessfulOutcome_t *successfullOutcome_p); -int test_s1ap_decode_unsuccessful_outcome(s1ap_message *message, S1ap_UnsuccessfulOutcome_t *unSuccessfullOutcome_p); -int test_s1ap_decode_pdu(s1ap_message *message, const uint8_t * const buffer,const uint32_t length); -void test_decode_s1ap(test_s1ap_t * const s1ap); -//------------------------- -void parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, test_s1ap_t * const s1ap); -void parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t * const sctp_hdr); -void parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_inithdr_t * const sctp_hdr); -void parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t * const sctp_hdr); -void parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, test_sctp_hdr_t * const sctp_hdr); -test_packet_t* parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); -//------------------------- -int play_scenario(test_scenario_t* scenario); -int generate_xml_scenario( - const char const * test_dir_name, - const char const * test_scenario_filename, - const char const * enb_config_filename, - char const * play_scenario_filename /* OUT PARAM*/); -//----------------------------------------------------------------------------- -void test_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num) -//----------------------------------------------------------------------------- -{ - unsigned long octet_index = 0; - - if (byte_stream == NULL) { - return; - } - - - - - fprintf(stdout, "+-----+-------------------------------------------------+\n"); - fprintf(stdout, "| | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n"); - fprintf(stdout, "+-----+-------------------------------------------------+\n"); - - for (octet_index = 0; octet_index < num; octet_index++) { - if ((octet_index % 16) == 0) { - if (octet_index != 0) { - fprintf(stdout, " |\n"); - } - - fprintf(stdout, " %04ld |", octet_index); - } - - /* - * Print every single octet in hexadecimal form - */ - fprintf(stdout, " %02x", byte_stream[octet_index]); - /* - * Align newline and pipes according to the octets in groups of 2 - */ - } - - /* - * Append enough spaces and put final pipe - */ - unsigned char index; - - for (index = octet_index; index < 16; ++index) { - fprintf(stdout, " "); - } - - fprintf(stdout, " |\n"); -} //------------------------------------------------------------------------------ // test if file exist in current directory @@ -202,7 +97,7 @@ int is_file_exists( const char const * file_nameP, const char const *file_roleP) //------------------------------------------------------------------------------ -int strip_extension(char *in_filename) +int et_strip_extension(char *in_filename) { static const uint8_t name_min_len = 1; static const uint8_t max_ext_len = 5; // .pdml ! @@ -237,193 +132,38 @@ int split_path( char * pathP, char *** resP) return n_spaces; } //------------------------------------------------------------------------------ -void display_node(xmlNodePtr node, unsigned int indent) -{ - int i = 0; - if (node->type == XML_ELEMENT_NODE) { - xmlChar *path = xmlGetNodePath(node); - for (i=0; ichildren != NULL && node->children->type == XML_TEXT_NODE) { - xmlChar *content = xmlNodeGetContent(node); - printf("%s -> %s\n", path, content); - xmlFree(content); - } else { - printf("%s\n", path); - } - xmlFree(path); - } -} -/** - * print_element_names: - * @node: the initial xml node to consider. - * @indent: indentation level. - * - * Prints the names of the all the xml elements - * that are siblings or children of a given xml node. - */ -//------------------------------------------------------------------------------ -void display_tree(xmlNodePtr node, unsigned int indent) -{ - xmlNode *cur_node = NULL; - - for (cur_node = node; cur_node; cur_node = cur_node->next) { - if (cur_node->type == XML_ELEMENT_NODE) { - display_node(cur_node, indent); - } - display_tree(cur_node->children, indent++); - } -} -//------------------------------------------------------------------------------ -void free_packet(test_packet_t* packet) +void et_free_packet(et_packet_t* packet) { if (packet) { switch (packet->sctp_hdr.chunk_type) { case SCTP_CID_DATA: - free_pointer(packet->sctp_hdr.u.data_hdr.payload.binary_stream); + et_free_pointer(packet->sctp_hdr.u.data_hdr.payload.binary_stream); break; default: ; } - free_pointer(packet); + et_free_pointer(packet); } } //------------------------------------------------------------------------------ -void free_scenario(test_scenario_t* scenario) +void et_free_scenario(et_scenario_t* scenario) { - test_packet_t *packet = NULL; - test_packet_t *next_packet = NULL; + et_packet_t *packet = NULL; + et_packet_t *next_packet = NULL; if (scenario) { packet = scenario->list_packet; while (packet) { next_packet = packet->next; - free_packet(packet); + et_free_packet(packet); packet = next_packet->next; } - free_pointer(scenario); - } -} - - -//------------------------------------------------------------------------------ -void display_packet_sctp_init(const sctp_inithdr_t * const sctp) -{ - - if (sctp) { - fprintf(stdout, "\t\tSCTP.init.init_tag : %u\n", sctp->init_tag); - fprintf(stdout, "\t\tSCTP.init.a_rwnd : %u\n", sctp->a_rwnd); - fprintf(stdout, "\t\tSCTP.init.num_inbound_streams : %u\n", sctp->num_inbound_streams); - fprintf(stdout, "\t\tSCTP.init.num_outbound_streams : %u\n", sctp->num_outbound_streams); - fprintf(stdout, "\t\tSCTP.init.initial_tsn : %u\n", sctp->initial_tsn); - } -} -//------------------------------------------------------------------------------ -void display_packet_sctp_initack(const sctp_initackhdr_t * const sctp) -{ - - if (sctp) { - fprintf(stdout, "\t\tSCTP.initack.init_tag : %u\n", sctp->init_tag); - fprintf(stdout, "\t\tSCTP.initack.a_rwnd : %u\n", sctp->a_rwnd); - fprintf(stdout, "\t\tSCTP.initack.num_inbound_streams : %u\n", sctp->num_inbound_streams); - fprintf(stdout, "\t\tSCTP.initack.num_outbound_streams : %u\n", sctp->num_outbound_streams); - fprintf(stdout, "\t\tSCTP.initack.initial_tsn : %u\n", sctp->initial_tsn); - } -} -//------------------------------------------------------------------------------ -void display_packet_sctp_data(const sctp_datahdr_t * const sctp) -{ - if (sctp) { - fprintf(stdout, "\t\tSCTP.data.tsn : %u\n", sctp->tsn); - fprintf(stdout, "\t\tSCTP.data.stream : %u\n", sctp->stream); - fprintf(stdout, "\t\tSCTP.data.ssn : %u\n", sctp->ssn); - fprintf(stdout, "\t\tSCTP.data.ppid : %u\n", sctp->ppid); - //fprintf(stdout, "\t\tSCTP.data.pdu_type : %u\n", sctp->payload.pdu_type); - //fprintf(stdout, "\t\tSCTP.data.procedure_code : %u\n", sctp->payload.procedure_code); - fprintf(stdout, "\t\tSCTP.data.binary_stream_allocated_size : %u\n", sctp->payload.binary_stream_allocated_size); - if (NULL != sctp->payload.binary_stream) { - fprintf(stdout, "\t\tSCTP.data.binary_stream :\n"); - test_print_hex_octets(sctp->payload.binary_stream, sctp->payload.binary_stream_allocated_size); - } else { - fprintf(stdout, "\t\tSCTP.data.binary_stream : NULL\n"); - } + et_free_pointer(scenario); } } //------------------------------------------------------------------------------ -void display_packet_sctp(const test_sctp_hdr_t * const sctp) -{ - if (sctp) { - fprintf(stdout, "\t\tSCTP.src_port : %u\n", sctp->src_port); - fprintf(stdout, "\t\tSCTP.dst_port : %u\n", sctp->dst_port); - fprintf(stdout, "\t\tSCTP.chunk_type : %s\n", chunk_type_cid2str(sctp->chunk_type)); - switch (sctp->chunk_type) { - case SCTP_CID_DATA: - display_packet_sctp_data(&sctp->u.data_hdr); - break; - case SCTP_CID_INIT: - display_packet_sctp_initack(&sctp->u.init_hdr); - break; - case SCTP_CID_INIT_ACK: - display_packet_sctp_initack(&sctp->u.init_ack_hdr); - break; - default: - ; - } - } -} -//------------------------------------------------------------------------------ -void display_packet_ip(const test_ip_hdr_t * const ip) -{ - if (ip) { - fprintf(stdout, "\t\tSource address : %s\n", test_ip2ip_str(&ip->src)); - fprintf(stdout, "\t\tDestination address : %s\n", test_ip2ip_str(&ip->dst)); - } -} - -//------------------------------------------------------------------------------ -void display_packet(const test_packet_t * const packet) -{ - if (packet) { - fprintf(stdout, "\tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); - fprintf(stdout, "\tPacket:\ttime relative to 1st packet %ld.%06lu\n", - packet->time_relative_to_first_packet.tv_sec, packet->time_relative_to_first_packet.tv_usec); - fprintf(stdout, "\tPacket:\ttime relative to last tx packet %ld.%06lu\n", - packet->time_relative_to_last_sent_packet.tv_sec, packet->time_relative_to_last_sent_packet.tv_usec); - fprintf(stdout, "\tPacket:\ttime relative to last_received packet %ld.%06lu\n", - packet->time_relative_to_last_received_packet.tv_sec, packet->time_relative_to_last_received_packet.tv_usec); - - switch(packet->action) { - case ACTION_S1C_SEND: - fprintf(stdout, "\tPacket:\tAction SEND\n"); - break; - case ACTION_S1C_RECEIVE: - fprintf(stdout, "\tPacket:\tAction RECEIVE\n"); - break; - default: - fprintf(stdout, "\tPacket:\tAction UNKNOWN\n"); - } - display_packet_ip(&packet->ip_hdr); - display_packet_sctp(&packet->sctp_hdr); - } -} -//------------------------------------------------------------------------------ -void display_scenario(const test_scenario_t * const scenario) -{ - test_packet_t *packet = NULL; - if (scenario) { - fprintf(stdout, "Scenario: %s\n", (scenario->name != NULL) ? (char*)scenario->name:"UNKNOWN NAME"); - packet = scenario->list_packet; - while (packet) { - display_packet(packet); - packet = packet->next; - } - } -} - -//------------------------------------------------------------------------------ -char * test_ip2ip_str(const test_ip_t * const ip) +char * et_ip2ip_str(const et_ip_t * const ip) { static char str[INET6_ADDRSTRLEN]; @@ -445,7 +185,7 @@ char * test_ip2ip_str(const test_ip_t * const ip) //returns 0 on success, negative on error //data is a buffer of at least len bytes //hexstring is upper or lower case hexadecimal, NOT prepended with "0x" -int hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len) +int et_hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len) { unsigned const char *pos = hexstring; char *endptr = NULL; @@ -477,7 +217,7 @@ int hex2data(unsigned char * const data, const unsigned char * const hexstring, return 0; } //------------------------------------------------------------------------------ -sctp_cid_t chunk_type_str2cid(const xmlChar * const chunk_type_str) +sctp_cid_t et_chunk_type_str2cid(const xmlChar * const chunk_type_str) { if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"DATA"))) { return SCTP_CID_DATA;} if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"INIT"))) { return SCTP_CID_INIT;} @@ -501,7 +241,7 @@ sctp_cid_t chunk_type_str2cid(const xmlChar * const chunk_type_str) AssertFatal (0, "ERROR: %s() cannot convert: %s\n", __FUNCTION__, chunk_type_str); } //------------------------------------------------------------------------------ -const char * const chunk_type_cid2str(const sctp_cid_t chunk_type) +const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type) { switch (chunk_type) { case SCTP_CID_DATA: return "DATA"; break; @@ -528,15 +268,15 @@ const char * const chunk_type_cid2str(const sctp_cid_t chunk_type) } } //------------------------------------------------------------------------------ -test_action_t action_str2test_action_t(const xmlChar * const action) +et_packet_action_t et_action_str2et_action_t(const xmlChar * const action) { - if ((!xmlStrcmp(action, (const xmlChar *)"SEND"))) { return ACTION_S1C_SEND;} - if ((!xmlStrcmp(action, (const xmlChar *)"RECEIVE"))) { return ACTION_S1C_RECEIVE;} + if ((!xmlStrcmp(action, (const xmlChar *)"SEND"))) { return ET_PACKET_ACTION_S1C_SEND;} + if ((!xmlStrcmp(action, (const xmlChar *)"RECEIVE"))) { return ET_PACKET_ACTION_S1C_RECEIVE;} AssertFatal (0, "ERROR: %s cannot convert: %s\n", __FUNCTION__, action); //if (NULL == action) {return ACTION_S1C_NULL;} } //------------------------------------------------------------------------------ -void ip_str2test_ip(const xmlChar * const ip_str, test_ip_t * const ip) +void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip) { AssertFatal (NULL != ip_str, "ERROR %s() Cannot convert null string to ip address!\n", __FUNCTION__); AssertFatal (NULL != ip, "ERROR %s() out parameter pointer is NULL!\n", __FUNCTION__); @@ -550,732 +290,207 @@ void ip_str2test_ip(const xmlChar * const ip_str, test_ip_t * const ip) AssertFatal (0, "ERROR %s() Could not parse ip address %s!\n", __FUNCTION__, ip_str); } } -//------------------------------------------------------------------------------ -int test_s1ap_decode_initiating_message(s1ap_message *message, - S1ap_InitiatingMessage_t *initiating_p) +/*------------------------------------------------------------------------------*/ +uint32_t et_eNB_app_register(const Enb_properties_array_t *enb_properties) { - char *message_string = NULL; - int ret = -1; + uint32_t enb_id; + uint32_t mme_id; + MessageDef *msg_p; + uint32_t register_enb_pending = 0; + char *str = NULL; + struct in_addr addr; - DevAssert(initiating_p != NULL); - message_string = calloc(20000, sizeof(char)); - AssertFatal (NULL != message_string, "ERROR malloc()failed!\n"); - message->procedureCode = initiating_p->procedureCode; - message->criticality = initiating_p->criticality; + for (enb_id = 0; (enb_id < enb_properties->number) ; enb_id++) { + { + s1ap_register_enb_req_t *s1ap_register_eNB; - switch(initiating_p->procedureCode) { - case S1ap_ProcedureCode_id_downlinkNASTransport: - ret = s1ap_decode_s1ap_downlinknastransporties( - &message->msg.s1ap_DownlinkNASTransportIEs, - &initiating_p->value); - s1ap_xer_print_s1ap_downlinknastransport(s1ap_xer__print2sp, message_string, message); - break; + /* 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); - case S1ap_ProcedureCode_id_InitialContextSetup: - ret = s1ap_decode_s1ap_initialcontextsetuprequesties( - &message->msg.s1ap_InitialContextSetupRequestIEs, &initiating_p->value); - s1ap_xer_print_s1ap_initialcontextsetuprequest(s1ap_xer__print2sp, message_string, message); - break; + s1ap_register_eNB = &S1AP_REGISTER_ENB_REQ(msg_p); - case S1ap_ProcedureCode_id_UEContextRelease: - ret = s1ap_decode_s1ap_uecontextreleasecommandies( - &message->msg.s1ap_UEContextReleaseCommandIEs, &initiating_p->value); - s1ap_xer_print_s1ap_uecontextreleasecommand(s1ap_xer__print2sp, message_string, message); - break; + /* Some default/random parameters */ + s1ap_register_eNB->eNB_id = enb_properties->properties[enb_id]->eNB_id; + s1ap_register_eNB->cell_type = enb_properties->properties[enb_id]->cell_type; + s1ap_register_eNB->eNB_name = enb_properties->properties[enb_id]->eNB_name; + s1ap_register_eNB->tac = enb_properties->properties[enb_id]->tac; + s1ap_register_eNB->mcc = enb_properties->properties[enb_id]->mcc; + s1ap_register_eNB->mnc = enb_properties->properties[enb_id]->mnc; + s1ap_register_eNB->mnc_digit_length = enb_properties->properties[enb_id]->mnc_digit_length; + s1ap_register_eNB->default_drx = enb_properties->properties[enb_id]->pcch_defaultPagingCycle[0]; - case S1ap_ProcedureCode_id_Paging: - ret = s1ap_decode_s1ap_pagingies( - &message->msg.s1ap_PagingIEs, &initiating_p->value); - s1ap_xer_print_s1ap_paging(s1ap_xer__print2sp, message_string, message); - break; + s1ap_register_eNB->nb_mme = enb_properties->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); - case S1ap_ProcedureCode_id_uplinkNASTransport: - ret = s1ap_decode_s1ap_uplinknastransporties (&message->msg.s1ap_UplinkNASTransportIEs, &initiating_p->value); - s1ap_xer_print_s1ap_uplinknastransport(s1ap_xer__print2sp, message_string, message); - break; + for (mme_id = 0; mme_id < s1ap_register_eNB->nb_mme; mme_id++) { + s1ap_register_eNB->mme_ip_address[mme_id].ipv4 = enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv4; + s1ap_register_eNB->mme_ip_address[mme_id].ipv6 = enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv6; + strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv4_address, + enb_properties->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, + enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv6_address, + sizeof(s1ap_register_eNB->mme_ip_address[0].ipv6_address)); + } - case S1ap_ProcedureCode_id_S1Setup: - ret = s1ap_decode_s1ap_s1setuprequesties (&message->msg.s1ap_S1SetupRequestIEs, &initiating_p->value); - s1ap_xer_print_s1ap_s1setuprequest(s1ap_xer__print2sp, message_string, message); - break; + s1ap_register_eNB->sctp_in_streams = enb_properties->properties[enb_id]->sctp_in_streams; + s1ap_register_eNB->sctp_out_streams = enb_properties->properties[enb_id]->sctp_out_streams; - case S1ap_ProcedureCode_id_initialUEMessage: - ret = s1ap_decode_s1ap_initialuemessageies (&message->msg.s1ap_InitialUEMessageIEs, &initiating_p->value); - s1ap_xer_print_s1ap_initialuemessage(s1ap_xer__print2sp, message_string, message); - break; - case S1ap_ProcedureCode_id_UEContextReleaseRequest: - ret = s1ap_decode_s1ap_uecontextreleaserequesties (&message->msg.s1ap_UEContextReleaseRequestIEs, &initiating_p->value); - s1ap_xer_print_s1ap_uecontextreleaserequest(s1ap_xer__print2sp, message_string, message); - break; + s1ap_register_eNB->enb_ip_address.ipv6 = 0; + s1ap_register_eNB->enb_ip_address.ipv4 = 1; + addr.s_addr = enb_properties->properties[enb_id]->enb_ipv4_address_for_S1_MME; + str = inet_ntoa(addr); + strcpy(s1ap_register_eNB->enb_ip_address.ipv4_address, str); - case S1ap_ProcedureCode_id_UECapabilityInfoIndication: - ret = s1ap_decode_s1ap_uecapabilityinfoindicationies (&message->msg.s1ap_UECapabilityInfoIndicationIEs, &initiating_p->value); - //s1ap_xer_print_s1ap_uecapabilityinfoindication(s1ap_xer__print2sp, message_string, message); - break; + itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); - case S1ap_ProcedureCode_id_NASNonDeliveryIndication: - ret = s1ap_decode_s1ap_nasnondeliveryindication_ies (&message->msg.s1ap_NASNonDeliveryIndication_IEs, &initiating_p->value); - s1ap_xer_print_s1ap_nasnondeliveryindication_(s1ap_xer__print2sp, message_string, message); - break; - - default: - free(message_string); - AssertFatal( 0 , "Unknown procedure ID (%d) for initiating message\n", - (int)initiating_p->procedureCode); - return -1; + register_enb_pending++; + } } - fprintf(stdout, "s1ap_xer_print:\n%s\n", message_string); - free(message_string); - return ret; + + return register_enb_pending; +} +/*------------------------------------------------------------------------------*/ +void *et_eNB_app_task(void *args_p) +{ + const Enb_properties_array_t *enb_properties_p = NULL; + uint32_t register_enb_pending; + uint32_t registered_enb; + long enb_register_retry_timer_id; + uint32_t enb_id; + MessageDef *msg_p = NULL; + const char *msg_name = NULL; + instance_t instance; + int result; + + itti_mark_task_ready (TASK_ENB_APP); + + + enb_properties_p = enb_config_get(); + + + /* Try to register each eNB */ + registered_enb = 0; + register_enb_pending = et_eNB_app_register (enb_properties_p); + + + do { + // Wait for a message + itti_receive_msg (TASK_ENB_APP, &msg_p); + + msg_name = ITTI_MSG_NAME (msg_p); + instance = ITTI_MSG_INSTANCE (msg_p); + + switch (ITTI_MSG_ID(msg_p)) { + case TERMINATE_MESSAGE: + itti_exit_task (); + break; + + + + case S1AP_REGISTER_ENB_CNF: + LOG_I(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name, + S1AP_REGISTER_ENB_CNF(msg_p).nb_mme); + + DevAssert(register_enb_pending > 0); + register_enb_pending--; + + /* Check if at least eNB is registered with one MME */ + if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) { + registered_enb++; + } + + /* Check if all register eNB requests have been processed */ + if (register_enb_pending == 0) { + if (registered_enb == enb_properties_p->number) { + /* If all eNB are registered, start scenario */ + + } else { + uint32_t not_associated = enb_properties_p->number - registered_enb; + + LOG_W(ENB_APP, " %d eNB %s not associated with a MME, retrying registration in %d seconds ...\n", + not_associated, not_associated > 1 ? "are" : "is", ET_ENB_REGISTER_RETRY_DELAY); + + /* Restart the eNB registration process in ENB_REGISTER_RETRY_DELAY seconds */ + if (timer_setup (ET_ENB_REGISTER_RETRY_DELAY, 0, TASK_ENB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, + NULL, &enb_register_retry_timer_id) < 0) { + LOG_E(ENB_APP, " Can not start eNB register retry timer, use \"sleep\" instead!\n"); + + sleep(ET_ENB_REGISTER_RETRY_DELAY); + /* Restart the registration process */ + registered_enb = 0; + register_enb_pending = et_eNB_app_register (enb_properties_p); + } + } + } + + break; + + case S1AP_DEREGISTERED_ENB_IND: + LOG_W(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name, + S1AP_DEREGISTERED_ENB_IND(msg_p).nb_mme); + + /* TODO handle recovering of registration */ + break; + + case TIMER_HAS_EXPIRED: + LOG_I(ENB_APP, " Received %s: timer_id %d\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id); + + if (TIMER_HAS_EXPIRED (msg_p).timer_id == enb_register_retry_timer_id) { + /* Restart the registration process */ + registered_enb = 0; + register_enb_pending = et_eNB_app_register (enb_properties_p); + } + break; + + default: + LOG_E(ENB_APP, "Received unexpected message %s\n", msg_name); + break; + } + + result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); + AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + } while (1); + return NULL; } //------------------------------------------------------------------------------ -int test_s1ap_decode_successful_outcome(s1ap_message *message, - S1ap_SuccessfulOutcome_t *successfullOutcome_p) +int et_play_scenario(et_scenario_t* const scenario) { - char *message_string = NULL; - int ret = -1; + et_event_t event; + et_display_scenario(scenario); - DevAssert(successfullOutcome_p != NULL); - message_string = calloc(20000, sizeof(char)); - AssertFatal (NULL != message_string, "ERROR malloc()failed!\n"); - - message->procedureCode = successfullOutcome_p->procedureCode; - message->criticality = successfullOutcome_p->criticality; - - switch(successfullOutcome_p->procedureCode) { - case S1ap_ProcedureCode_id_S1Setup: - ret = s1ap_decode_s1ap_s1setupresponseies( - &message->msg.s1ap_S1SetupResponseIEs, &successfullOutcome_p->value); - s1ap_xer_print_s1ap_s1setupresponse(s1ap_xer__print2sp, message_string, message); - break; - - case S1ap_ProcedureCode_id_InitialContextSetup: - ret = s1ap_decode_s1ap_initialcontextsetupresponseies (&message->msg.s1ap_InitialContextSetupResponseIEs, &successfullOutcome_p->value); - s1ap_xer_print_s1ap_initialcontextsetupresponse(s1ap_xer__print2sp, message_string, message); - break; - - case S1ap_ProcedureCode_id_UEContextRelease: - ret = s1ap_decode_s1ap_uecontextreleasecompleteies (&message->msg.s1ap_UEContextReleaseCompleteIEs, &successfullOutcome_p->value); - s1ap_xer_print_s1ap_uecontextreleasecomplete(s1ap_xer__print2sp, message_string, message); - break; - - default: - free(message_string); - AssertFatal(0, "Unknown procedure ID (%d) for successfull outcome message\n", - (int)successfullOutcome_p->procedureCode); - return -1; - } - fprintf(stdout, "s1ap_xer_print:\n%s\n", message_string); - free(message_string); - return ret; -} - -//------------------------------------------------------------------------------ -int test_s1ap_decode_unsuccessful_outcome(s1ap_message *message, - S1ap_UnsuccessfulOutcome_t *unSuccessfullOutcome_p) -{ - char *message_string = NULL; - int ret = -1; - - DevAssert(unSuccessfullOutcome_p != NULL); - message_string = calloc(20000, sizeof(char)); - AssertFatal (NULL != message_string, "ERROR malloc()failed!\n"); - - message->procedureCode = unSuccessfullOutcome_p->procedureCode; - message->criticality = unSuccessfullOutcome_p->criticality; - - switch(unSuccessfullOutcome_p->procedureCode) { - case S1ap_ProcedureCode_id_S1Setup: - ret = s1ap_decode_s1ap_s1setupfailureies( - &message->msg.s1ap_S1SetupFailureIEs, &unSuccessfullOutcome_p->value); - s1ap_xer_print_s1ap_s1setupfailure(s1ap_xer__print2sp, message_string, message); - break; - - case S1ap_ProcedureCode_id_InitialContextSetup: - ret = s1ap_decode_s1ap_initialcontextsetupfailureies (&message->msg.s1ap_InitialContextSetupFailureIEs, &unSuccessfullOutcome_p->value); - s1ap_xer_print_s1ap_initialcontextsetupfailure(s1ap_xer__print2sp, message_string, message); - break; - - - default: - free(message_string); - AssertFatal(0,"Unknown procedure ID (%d) for unsuccessfull outcome message\n", - (int)unSuccessfullOutcome_p->procedureCode); - break; - } - fprintf(stdout, "s1ap_xer_print:\n%s\n", message_string); - free(message_string); - return ret; -} - -//------------------------------------------------------------------------------ -int test_s1ap_decode_pdu(s1ap_message *message, const uint8_t * const buffer, - const uint32_t length) -{ - S1AP_PDU_t pdu; - S1AP_PDU_t *pdu_p = &pdu; - asn_dec_rval_t dec_ret; - - DevAssert(buffer != NULL); - - memset((void *)pdu_p, 0, sizeof(S1AP_PDU_t)); - - dec_ret = aper_decode(NULL, - &asn_DEF_S1AP_PDU, - (void **)&pdu_p, - buffer, - length, - 0, - 0); - - if (dec_ret.code != RC_OK) { - S1AP_ERROR("Failed to decode pdu\n"); + // create SCTP ITTI task: same as eNB code + if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) { + LOG_E(SCTP, "Create task for SCTP failed\n"); return -1; } - message->direction = pdu_p->present; - - switch(pdu_p->present) { - case S1AP_PDU_PR_initiatingMessage: - return test_s1ap_decode_initiating_message(message, - &pdu_p->choice.initiatingMessage); - - case S1AP_PDU_PR_successfulOutcome: - return test_s1ap_decode_successful_outcome(message, - &pdu_p->choice.successfulOutcome); - - case S1AP_PDU_PR_unsuccessfulOutcome: - return test_s1ap_decode_unsuccessful_outcome(message, - &pdu_p->choice.unsuccessfulOutcome); - - default: - AssertFatal(0, "Unknown presence (%d) or not implemented\n", (int)pdu_p->present); - break; - } - return -1; -} -//------------------------------------------------------------------------------ -void test_decode_s1ap(test_s1ap_t * const s1ap) -{ - if (NULL != s1ap) { - if (test_s1ap_decode_pdu(&s1ap->message, s1ap->binary_stream, s1ap->binary_stream_allocated_size) < 0) { - AssertFatal (0, "ERROR %s() Cannot decode S1AP message!\n", __FUNCTION__); - } - } -} -//------------------------------------------------------------------------------ -void parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, test_s1ap_t * const s1ap) -{ - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - xmlChar *xml_char2 = NULL; - unsigned int size = 0; - int rc = 0; - unsigned int go_deeper_in_tree = 1; - - if ((NULL != s1ap_node) && (NULL != s1ap)) { - for (cur_node = (xmlNode *)s1ap_node; cur_node; cur_node = cur_node->next) { - go_deeper_in_tree = 1; - if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"field"))) { - // do not get hidden fields - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"hide"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"yes"))) { - go_deeper_in_tree = 0; - } - xmlFree(xml_char); - } - if (0 < go_deeper_in_tree) { - // first get size - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); - if (NULL != xml_char) { - size = strtoul((const char *)xml_char, NULL, 0); - xmlFree(xml_char); - // second: try to get value (always hex) - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); - if (NULL != xml_char) { - xml_char2 = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); - fprintf(stdout, "s1ap %p field %s size %d value %s\n",s1ap, xml_char2, size, xml_char); - xmlFree(xml_char2); - // if success to get value, do not parse children - //AssertFatal ((xmlStrlen(xml_char) == size), "ERROR %s() mismatch in size %d and strlen %d\n", __FUNCTION__, size, xmlStrlen(xml_char)); - //if (xmlStrlen(xml_char) == size) { - AssertFatal ((s1ap->binary_stream_pos+xmlStrlen(xml_char)/2) <= s1ap->binary_stream_allocated_size, - "ERROR %s() in buffer size: binary_stream_pos %d xmlStrlen(xml_char)/2=%d\n", __FUNCTION__, s1ap->binary_stream_pos, xmlStrlen(xml_char)/2); - rc = hex2data( &s1ap->binary_stream[s1ap->binary_stream_pos], xml_char, xmlStrlen(xml_char)); - s1ap->binary_stream_pos += xmlStrlen(xml_char)/2; - display_node(cur_node, 0); - AssertFatal (rc >= 0, "ERROR %s() in converting hex string %s len %d size %d rc %d\n", __FUNCTION__, xml_char, xmlStrlen(xml_char), size, rc); - go_deeper_in_tree = 0; - //} - xmlFree(xml_char); - } - } - } - } - if (0 < go_deeper_in_tree) { - parse_s1ap(doc, cur_node->children, s1ap); - } - } - } -} - -//------------------------------------------------------------------------------ -void parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t * const sctp_hdr) -{ - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - xmlChar *xml_char2 = NULL; - - if ((NULL != sctp_node) && (NULL != sctp_hdr)) { - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_payload_proto_id"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->ppid = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_sid"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->stream = strtoul((const char *)xml_char2, NULL, 16); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_tsn"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->tsn = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_ssn"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->ssn = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } - xmlFree(xml_char); - } - for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { - parse_sctp_data_chunk(doc, cur_node, sctp_hdr); - } + // create S1AP ITTI task: not as same as eNB code + if (itti_create_task (TASK_S1AP, et_s1ap_eNB_task, NULL) < 0) { + LOG_E(S1AP, "Create task for S1AP failed\n"); + return -1; } -} -//------------------------------------------------------------------------------ -void parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_inithdr_t * const sctp_hdr) -{ - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - xmlChar *xml_char2 = NULL; - - if ((NULL != sctp_node) && (NULL != sctp_hdr)) { - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_nr_out_streams"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->num_outbound_streams = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_nr_in_streams"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->num_inbound_streams = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_credit"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->a_rwnd = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_initial_tsn"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->initial_tsn = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_initiate_tag"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->init_tag = strtoul((const char *)xml_char2, NULL, 16); - xmlFree(xml_char2); - } - } - xmlFree(xml_char); - } - for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { - parse_sctp_init_chunk(doc, cur_node, sctp_hdr); - } + // create ENB_APP ITTI task: not as same as eNB code + if (itti_create_task (TASK_ENB_APP, et_eNB_app_task, NULL) < 0) { + LOG_E(ENB_APP, "Create task for ENB_APP failed\n"); + return -1; } -} -//------------------------------------------------------------------------------ -void parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t * const sctp_hdr) -{ - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - xmlChar *xml_char2 = NULL; - if ((NULL != sctp_node) && (NULL != sctp_hdr)) { - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_nr_out_streams"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->num_outbound_streams = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_nr_in_streams"))) { - xml_char2 = xmlGetProp((xmlNode *)(xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->num_inbound_streams = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_credit"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->a_rwnd = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_initial_tsn"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->initial_tsn = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_initiate_tag"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->init_tag = strtoul((const char *)xml_char2, NULL, 16); - xmlFree(xml_char2); - } - } - xmlFree(xml_char); - } - for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { - parse_sctp_init_ack_chunk(doc, cur_node, sctp_hdr); - } - } -} -//------------------------------------------------------------------------------ -void parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, test_sctp_hdr_t * const sctp_hdr) -{ - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - xmlChar *xml_char2 = NULL; + event.code = ET_EVENT_INIT; + event.u.init.scenario = scenario; + et_scenario_fsm_notify_event(event); - if ((NULL != sctp_node) && (NULL != sctp_hdr)) { - if ((!xmlStrcmp(sctp_node->name, (const xmlChar *)"proto"))) { - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"s1ap"))) { - xmlFree(xml_char); - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"size"); - if (NULL != xml_char2) { - sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size = strtoul((const char *)xml_char2, NULL, 0); - sctp_hdr->u.data_hdr.payload.binary_stream = calloc(1, sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size); - xmlFree(xml_char2); - } - parse_s1ap(doc, sctp_node, &sctp_hdr->u.data_hdr.payload); - test_decode_s1ap(&sctp_hdr->u.data_hdr.payload); - return; - } - xmlFree(xml_char); - } - } - //if ((cur_node->type == XML_ATTRIBUTE_NODE) || (cur_node->type == XML_ELEMENT_NODE)) { - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.srcport"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->src_port = strtoul((const char *)xml_char2, NULL, 16); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.dstport"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->dst_port = strtoul((const char *)xml_char2, NULL, 16); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.chunk_type"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->chunk_type = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - switch (sctp_hdr->chunk_type) { - case SCTP_CID_DATA: - parse_sctp_data_chunk(doc, sctp_node->parent, &sctp_hdr->u.data_hdr); - break; - case SCTP_CID_INIT: - parse_sctp_init_chunk(doc, sctp_node->parent, &sctp_hdr->u.init_hdr); - break; - case SCTP_CID_INIT_ACK: - parse_sctp_init_ack_chunk(doc, sctp_node->parent, &sctp_hdr->u.init_ack_hdr); - break; - default: - ; - } - } - } - } - for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { - parse_sctp(doc, cur_node, sctp_hdr); - } - } -} -//------------------------------------------------------------------------------ -test_packet_t* parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { - test_packet_t *packet = NULL; - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - float afloat = (float)0.0; - static struct timeval initial_time = { .tv_sec = 0, .tv_usec = 0 }; - static struct timeval relative_last_sent_packet = { .tv_sec = 0, .tv_usec = 0 }; - static struct timeval relative_last_received_packet = { .tv_sec = 0, .tv_usec = 0 }; - static char first_packet = 1; - static char first_sent_packet = 1; - static char first_received_packet = 1; - static unsigned int packet_number = 1; - - if (NULL != node) { - packet = calloc(1, sizeof(*packet)); - - xml_char = xmlGetProp(node, (const xmlChar *)"action"); - packet->action = action_str2test_action_t(xml_char); - xmlFree(xml_char); - packet->packet_number = packet_number++; - - for (cur_node = node->children; cur_node; cur_node = cur_node->next) { - //if (cur_node->type == XML_ELEMENT_NODE) { - if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.time_relative"))) { - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); - afloat = atof((const char*)xml_char); - xmlFree(xml_char); - packet->time_relative_to_first_packet.tv_sec = (int)afloat; - packet->time_relative_to_first_packet.tv_usec = (int)((afloat - packet->time_relative_to_first_packet.tv_sec)*1000000); - - if (first_packet > 0) { - initial_time = packet->time_relative_to_first_packet; - packet->time_relative_to_first_packet.tv_sec = 0; - packet->time_relative_to_first_packet.tv_usec = 0; - first_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &initial_time, - &packet->time_relative_to_first_packet); - } - if (packet->action == ACTION_S1C_SEND) { - if (first_sent_packet > 0) { - relative_last_sent_packet = packet->time_relative_to_first_packet; - packet->time_relative_to_last_sent_packet.tv_sec = 0; - packet->time_relative_to_last_sent_packet.tv_usec = 0; - first_sent_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, - &packet->time_relative_to_last_sent_packet); - relative_last_sent_packet = packet->time_relative_to_first_packet; - } - } else if (packet->action == ACTION_S1C_RECEIVE) { - if (first_received_packet > 0) { - relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec; - relative_last_received_packet.tv_usec = packet->time_relative_to_first_packet.tv_usec; - packet->time_relative_to_last_received_packet.tv_sec = 0; - packet->time_relative_to_last_received_packet.tv_usec = 0; - first_received_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, - &packet->time_relative_to_last_received_packet); - relative_last_received_packet = packet->time_relative_to_first_packet; - } - } - - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.number"))) { - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); - packet->original_frame_number = strtoul((const char *)xml_char, NULL, 0); - xmlFree(xml_char); - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.src"))) { - xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1); - ip_str2test_ip(xml_char, &packet->ip_hdr.src); - xmlFree(xml_char); - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.dst"))) { - xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1); - ip_str2test_ip(xml_char, &packet->ip_hdr.dst); - xmlFree(xml_char); - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"proto"))) { - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp"))) { - parse_sctp(doc, cur_node, &packet->sctp_hdr); - } - xmlFree(xml_char); - } - } - //} - } - } - return packet; -} -//------------------------------------------------------------------------------ -int play_scenario(test_scenario_t* scenario) { - //TODO - display_scenario(scenario); return 0; } -//------------------------------------------------------------------------------ -test_scenario_t* generate_scenario( - const char * const play_scenario_filename ) -{ - xmlDocPtr doc = NULL; - xmlNodePtr root = NULL; - xmlNodePtr node = NULL; - xmlChar *xml_char = NULL; - test_scenario_t *scenario = NULL; - test_packet_t *packet = NULL; - test_packet_t **next_packet = NULL; - - doc = xmlParseFile(play_scenario_filename); - if (NULL == doc) { - AssertFatal (0, "Could not parse scenario xml file %s!\n", play_scenario_filename); - } else { - fprintf(stdout, "Test scenario file to play: %s\n", play_scenario_filename); - //xmlDebugDumpDocument(NULL, doc); - } - - // Get root - root = xmlDocGetRootElement(doc); - if (NULL != root) { - if ((!xmlStrcmp(root->name, (const xmlChar *)"scenario"))) { - xml_char = xmlGetProp(root, (const xmlChar *)"name"); - printf("scenario name: %s\n", xml_char); - scenario = calloc(1, sizeof(*scenario)); - scenario->name = xml_char; // nodup nofree - next_packet = &scenario->list_packet; - for (node = root->children; node != NULL; node = node->next) { - if ((!xmlStrcmp(node->name, (const xmlChar *)"packet"))) { - packet = parse_xml_packet(doc, node); - if (NULL != packet) { - *next_packet = packet; - next_packet = &packet->next; - } else { - fprintf(stdout, "WARNING omitted packet:\n"); - display_node(node, 0); - } - } - } - } - } else { - fprintf(stderr, "Empty xml document\n"); - } - xmlFreeDoc(doc); - xmlCleanupParser(); - return scenario; -} //------------------------------------------------------------------------------ -int generate_xml_scenario( - const char const * test_dir_name, - const char const * test_scenario_filename, - const char const * enb_config_filename, - char const * play_scenario_filename /* OUT PARAM*/) -//------------------------------------------------------------------------------ -{ - //int fd_pdml_in; - xsltStylesheetPtr cur = NULL; - xmlDocPtr doc, res; - FILE *play_scenario_file = NULL; - const char *params[2*ENB_CONFIG_MAX_XSLT_PARAMS]; - int nb_params = 0; - int i,j; - char astring[1024]; - struct in_addr addr; - int ret = 0; - - memset(astring, 0, sizeof(astring)); - if (getcwd(astring, sizeof(astring)) != NULL) { - fprintf(stdout, "working in %s directory\n", astring); - } else { - perror("getcwd() ERROR"); - exit(1); - } - - memset(astring, 0, sizeof(astring)); - strcat(astring, g_openair_dir); - strcat(astring, "/openair3/TEST/EPC_TEST/play_scenario.xsl"); - - xmlSubstituteEntitiesDefault(1); - xmlLoadExtDtdDefaultValue = 1; - cur = xsltParseStylesheetFile((const xmlChar *)astring); - if (NULL == cur) { - AssertFatal (0, "Could not parse stylesheet file %s (check OPENAIR_DIR env variable)!\n", astring); - } else { - fprintf(stdout, "XSLT style sheet: %s\n", astring); - } - - doc = xmlParseFile(test_scenario_filename); - if (NULL == doc) { - AssertFatal (0, "Could not parse scenario xml file %s!\n", test_scenario_filename); - } else { - fprintf(stdout, "Test scenario file: %s\n", test_scenario_filename); - } - - for (i = 0; i < enb_properties.number; i++) { - // eNB S1-C IPv4 address - sprintf(astring, "enb_s1c%d", i); - params[nb_params++] = strdup(astring); - addr.s_addr = enb_properties.properties[i]->enb_ipv4_address_for_S1_MME; - sprintf(astring, "\"%s\"", inet_ntoa(addr)); - params[nb_params++] = strdup(astring); - - // MME S1-C IPv4 address - for (j = 0; j < enb_properties.properties[i]->nb_mme; j++) { - sprintf(astring, "mme_s1c%d_%d", i, j); - params[nb_params++] = strdup(astring); - AssertFatal (enb_properties.properties[i]->mme_ip_address[j].ipv4_address, - "Only support MME IPv4 address\n"); - sprintf(astring, "\"%s\"", enb_properties.properties[i]->mme_ip_address[j].ipv4_address); - params[nb_params++] = strdup(astring); - } - } - params[nb_params] = NULL; - res = xsltApplyStylesheet(cur, doc, params); - if (NULL != res) { - sprintf((char *)play_scenario_filename,"%s",test_scenario_filename); - if (strip_extension((char *)play_scenario_filename) > 0) { - strcat((char *)play_scenario_filename, ".tsml"); - play_scenario_file = fopen( play_scenario_filename, "w+"); - if (NULL != play_scenario_file) { - xsltSaveResultToFile(play_scenario_file, res, cur); - fclose(play_scenario_file); - fprintf(stdout, "Wrote test scenario to %s\n", play_scenario_filename); - } else { - fprintf(stderr, "ERROR in fopen(%s)\n", play_scenario_filename); - ret = -1; - } - } else { - fprintf(stderr, "ERROR in strip_extension()\n"); - ret = -1; - } - } else { - fprintf(stderr, "ERROR in xsltApplyStylesheet()\n"); - ret = -1; - } - xsltFreeStylesheet(cur); - xmlFreeDoc(doc); - xmlFreeDoc(res); - - xsltCleanupGlobals(); - xmlCleanupParser(); - return ret; -} - -//------------------------------------------------------------------------------ -static void usage ( +static void et_usage ( int argc, char *argv[]) //------------------------------------------------------------------------------ @@ -1298,10 +513,10 @@ static void usage ( //------------------------------------------------------------------------------ int -config_parse_opt_line ( +et_config_parse_opt_line ( int argc, char *argv[], - char **test_dir_name, + char **et_dir_name, char **scenario_file_name, char **enb_config_file_name) //------------------------------------------------------------------------------ @@ -1354,12 +569,12 @@ config_parse_opt_line ( case LONG_OPTION_TEST_DIR: case 'd': if (optarg) { - *test_dir_name = strdup(optarg); - if (is_file_exists(*test_dir_name, "test dirname") != GS_IS_DIR) { - fprintf(stderr, "Please provide a valid test dirname, %s is not a valid directory name\n", *test_dir_name); + *et_dir_name = strdup(optarg); + if (is_file_exists(*et_dir_name, "test dirname") != GS_IS_DIR) { + fprintf(stderr, "Please provide a valid test dirname, %s is not a valid directory name\n", *et_dir_name); exit(1); } - printf("Test dir name is %s\n", *test_dir_name); + printf("Test dir name is %s\n", *et_dir_name); } break; @@ -1372,32 +587,32 @@ config_parse_opt_line ( case LONG_OPTION_HELP: case 'h': default: - usage (argc, argv); + et_usage (argc, argv); exit (0); } } - if (NULL == *test_dir_name) { + if (NULL == *et_dir_name) { fprintf(stderr, "Please provide a valid test dirname\n"); exit(1); } - if (chdir(*test_dir_name) != 0) { - fprintf(stderr, "ERROR: chdir %s returned %s\n", *test_dir_name, strerror(errno)); + if (chdir(*et_dir_name) != 0) { + fprintf(stderr, "ERROR: chdir %s returned %s\n", *et_dir_name, strerror(errno)); exit(1); } if (rv & PLAY_SCENARIO) { if (NULL == *enb_config_file_name) { - fprintf(stderr, "ERROR: please provide the original eNB config file name that should be in %s\n", *test_dir_name); + fprintf(stderr, "ERROR: please provide the original eNB config file name that should be in %s\n", *et_dir_name); } if (is_file_exists(*enb_config_file_name, "eNB config file") != GS_IS_FILE) { - fprintf(stderr, "ERROR: original eNB config file name %s is not found in dir %s\n", *enb_config_file_name, *test_dir_name); + fprintf(stderr, "ERROR: original eNB config file name %s is not found in dir %s\n", *enb_config_file_name, *et_dir_name); } enb_properties_p = enb_config_init(*enb_config_file_name); if (NULL == *scenario_file_name) { - fprintf(stderr, "ERROR: please provide the scenario file name that should be in %s\n", *test_dir_name); + fprintf(stderr, "ERROR: please provide the scenario file name that should be in %s\n", *et_dir_name); } if (is_file_exists(*scenario_file_name, "Scenario file") != GS_IS_FILE) { - fprintf(stderr, "ERROR: Scenario file name %s is not found in dir %s\n", *scenario_file_name, *test_dir_name); + fprintf(stderr, "ERROR: Scenario file name %s is not found in dir %s\n", *scenario_file_name, *et_dir_name); } } return rv; @@ -1408,12 +623,12 @@ int main( int argc, char **argv ) //------------------------------------------------------------------------------ { int actions = 0; - char *test_dir_name = NULL; + char *et_dir_name = NULL; char *scenario_file_name = NULL; char *enb_config_file_name = NULL; - char play_scenario_filename[NAME_MAX]; int ret = 0; - test_scenario_t *scenario = NULL; + et_scenario_t *scenario = NULL; + char play_scenario_filename[NAME_MAX]; memset(play_scenario_filename, 0, sizeof(play_scenario_filename)); g_openair_dir = getenv("OPENAIR_DIR"); @@ -1428,15 +643,15 @@ int main( int argc, char **argv ) set_comp_log(S1AP, LOG_TRACE, LOG_MED, 1); set_comp_log(SCTP, LOG_TRACE, LOG_MED, 1); - asn_debug = 1; + asn_debug = 0; asn1_xer_print = 1; //parameters - actions = config_parse_opt_line (argc, argv, &test_dir_name, &scenario_file_name, &enb_config_file_name); //Command-line options + actions = et_config_parse_opt_line (argc, argv, &et_dir_name, &scenario_file_name, &enb_config_file_name); //Command-line options if (actions & PLAY_SCENARIO) { - if (generate_xml_scenario(test_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) { - if (NULL != (scenario = generate_scenario(play_scenario_filename))) { - ret = play_scenario(scenario); + if (et_generate_xml_scenario(et_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) { + if (NULL != (scenario = et_generate_scenario(play_scenario_filename))) { + ret = et_play_scenario(scenario); } else { fprintf(stderr, "ERROR: Could not generate scenario from tsml file\n"); ret = -1; @@ -1445,9 +660,9 @@ int main( int argc, char **argv ) fprintf(stderr, "ERROR: Could not generate tsml scenario from xml file\n"); ret = -1; } - free_pointer(test_dir_name); - free_pointer(scenario_file_name); - free_pointer(enb_config_file_name); + et_free_pointer(et_dir_name); + et_free_pointer(scenario_file_name); + et_free_pointer(enb_config_file_name); } return ret; diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 2bf6cc4ccf..725b5abc0e 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -28,7 +28,7 @@ *******************************************************************************/ /* - play_scenario.h + et_scenario.h ------------------- AUTHOR : Lionel GAUTHIER COMPANY : EURECOM @@ -42,21 +42,44 @@ # include # include +#include "enb_config.h" #include "s1ap_ies_defs.h" +# define ET_ENB_REGISTER_RETRY_DELAY 3 -/** @defgroup _enb_app ENB APP - * @ingroup _oai2 - * @{ - */ typedef enum { - ACTION_S1C_START = 0, - ACTION_S1C_NULL = ACTION_S1C_START, - ACTION_S1C_SEND, - ACTION_S1C_RECEIVE, - ACTION_S1C_END -} test_action_t; + ET_PACKET_STATUS_START = 0, + ET_PACKET_STATUS_NONE = ET_PACKET_STATUS_START, + ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT, + ET_PACKET_STATUS_SCHEDULED_FOR_SENDING, + ET_PACKET_STATUS_SENT, + ET_PACKET_STATUS_SENT_WITH_ERRORS, + ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING, + ET_PACKET_STATUS_RECEIVED, + ET_PACKET_STATUS_RECEIVED_WITH_ERRORS, + ET_PACKET_STATUS_END +} et_packet_status_t; + +typedef enum { + ET_FSM_STATE_START = 0, + ET_FSM_STATE_NULL = ET_FSM_STATE_START, + ET_FSM_STATE_CONNECTING_SCTP, + ET_FSM_STATE_WAITING_TX_EVENT, + ET_FSM_STATE_WAITING_RX_EVENT, + ET_FSM_STATE_END +} et_fsm_state_t; + + + + +typedef enum { + ET_PACKET_ACTION_S1C_START = 0, + ET_PACKET_ACTION_S1C_NULL = ET_PACKET_ACTION_S1C_START, + ET_PACKET_ACTION_S1C_SEND, + ET_PACKET_ACTION_S1C_RECEIVE, + ET_PACKET_ACTION_S1C_END +} et_packet_action_t; // from kernel source file 3.19/include/linux/sctp.h typedef enum { @@ -94,16 +117,17 @@ typedef enum { TEST_S1AP_PDU_TYPE_SUCCESSFUL_OUTCOME, TEST_S1AP_PDU_TYPE_UNSUCCESSFUL_OUTCOME, TEST_S1AP_PDU_TYPE_END -} test_s1ap_pdu_type_t; +} et_s1ap_pdu_type_t; -typedef struct test_s1ap_s { - //test_s1ap_pdu_type_t pdu_type; +typedef struct et_s1ap_s { + //et_s1ap_pdu_type_t pdu_type; + S1AP_PDU_t pdu; // decoded ASN1 C type: choice of initiatingMessage, successfulOutcome, unsuccessfulOutcome uint16_t binary_stream_pos; uint16_t binary_stream_allocated_size; uint8_t *binary_stream; - s1ap_message message; -} test_s1ap_t; + s1ap_message message; // decoded message: information elements +} et_s1ap_t; // from kernel source file 3.19/include/linux/sctp.h, Big Endians @@ -112,7 +136,7 @@ typedef struct sctp_datahdr_s { uint16_t stream; uint16_t ssn; uint32_t ppid; - test_s1ap_t payload; + et_s1ap_t payload; } sctp_datahdr_t; // from kernel source file 3.19/include/linux/sctp.h, Big Endians @@ -127,7 +151,7 @@ typedef struct sctp_inithdr { typedef sctp_inithdr_t sctp_initackhdr_t; -typedef struct test_sctp_hdr_s { +typedef struct et_sctp_hdr_s { unsigned int src_port; unsigned int dst_port; sctp_cid_t chunk_type; @@ -136,38 +160,145 @@ typedef struct test_sctp_hdr_s { sctp_inithdr_t init_hdr; sctp_initackhdr_t init_ack_hdr; } u; -} test_sctp_hdr_t; +} et_sctp_hdr_t; -typedef struct test_ip_s { +typedef struct et_ip_s { unsigned int address_family; // AF_INET, AF_INET6 union { struct in6_addr ipv6; in_addr_t ipv4; }address; -}test_ip_t; +}et_ip_t; -typedef struct test_ip_hdr_s { - test_ip_t src; - test_ip_t dst; -} test_ip_hdr_t; +typedef struct et_ip_hdr_s { + et_ip_t src; + et_ip_t dst; +} et_ip_hdr_t; -typedef struct test_packet_s { - test_action_t action; - struct timeval time_relative_to_first_packet; - struct timeval time_relative_to_last_sent_packet; - struct timeval time_relative_to_last_received_packet; - unsigned int original_frame_number; - unsigned int packet_number; - test_ip_hdr_t ip_hdr; - test_sctp_hdr_t sctp_hdr; - struct test_packet_s *next; -}test_packet_t; +typedef struct et_packet_s { + et_packet_action_t action; + struct timeval time_relative_to_first_packet; + struct timeval time_relative_to_last_sent_packet; + struct timeval time_relative_to_last_received_packet; + unsigned int original_frame_number; + unsigned int packet_number; + et_ip_hdr_t ip_hdr; + et_sctp_hdr_t sctp_hdr; + struct et_packet_s *next; + //scenario running vars + et_packet_status_t status; +}et_packet_t; -typedef struct test_scenario_s { + +typedef struct sctp_epoll_s { + /* Array of events monitored by the task. + * By default only one fd is monitored (the one used to received messages + * from other tasks). + * More events can be suscribed later by the task itself. + */ + struct epoll_event *events; + + int epoll_nb_events; + +} thread_desc_t; + +typedef struct et_scenario_s { xmlChar *name; - test_packet_t *list_packet; -}test_scenario_t; + et_packet_t *list_packet; -inline void free_pointer(void *p) {if (NULL != p) {free(p); p=NULL;}}; -#endif /* ENB_CONFIG_H_ */ -/** @} */ + // playing scenario + et_packet_t *waited_packet; + et_packet_t *current_packet; +} et_scenario_t; + + +typedef enum { + ET_EVENT_START = 0, + ET_EVENT_INIT = ET_EVENT_START, + ET_EVENT_RX_SCTP_EVENT, + ET_EVENT_RX_S1AP, + ET_EVENT_RX_X2AP, + ET_EVENT_RX_PACKET_TIME_OUT, + ET_EVENT_TX_PACKET, + ET_EVENT_STOP, + ET_EVENT_END +} et_event_code_t; + +typedef struct et_event_init_s { + et_scenario_t *scenario; +} et_event_init_t; + +typedef struct et_event_s1ap_data_ind_s { + sctp_datahdr_t sctp_datahdr; +} et_event_s1ap_data_ind_t; + +typedef struct et_event_s1ap_data_req_s { + +} et_event_s1ap_data_req_t; + +typedef struct et_event_s { + et_event_code_t code; + union { + et_event_init_t init; + et_event_s1ap_data_ind_t s1ap_data_ind; + et_event_s1ap_data_req_t s1ap_data_req; + } u; +} et_event_t; + +inline void et_free_pointer(void *p) {if (NULL != p) {free(p); p=NULL;}}; + +//------------------------- +void et_free_packet(et_packet_t* packet); +void et_free_scenario(et_scenario_t* scenario); +//------------------------- +void et_display_packet_s1ap_data(const et_s1ap_t * const s1ap); +void et_display_packet_sctp_init(const sctp_inithdr_t * const sctp); +void et_display_packet_sctp_initack(const sctp_initackhdr_t * const sctp); +void et_display_packet_sctp_data(const sctp_datahdr_t * const sctp); +void et_display_packet_sctp(const et_sctp_hdr_t * const sctp); +void et_display_packet_ip(const et_ip_hdr_t * const ip); +void et_display_packet(const et_packet_t * const packet); +void et_display_scenario(const et_scenario_t * const scenario); +//------------------------- +int et_s1ap_decode_initiating_message(s1ap_message *message, S1ap_InitiatingMessage_t *initiating_p); +int et_s1ap_decode_successful_outcome(s1ap_message *message, S1ap_SuccessfulOutcome_t *successfullOutcome_p); +int et_s1ap_decode_unsuccessful_outcome(s1ap_message *message, S1ap_UnsuccessfulOutcome_t *unSuccessfullOutcome_p); +int et_s1ap_decode_pdu(S1AP_PDU_t * const pdu, s1ap_message * const message, const uint8_t * const buffer, const uint32_t length); +void et_decode_s1ap(et_s1ap_t * const s1ap); +//------------------------- +void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind); +void * et_s1ap_eNB_task(void *arg); +int et_generate_xml_scenario( + const char const * xml_in_dir_name, + const char const * xml_in_scenario_filename, + const char const * enb_config_filename, + char const * tsml_out_scenario_filename); +//------------------------- +int et_scenario_fsm_notify_event_state_null(et_event_t event); +int et_scenario_fsm_notify_event(et_event_t event); +//------------------------- +void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * const s1ap); +void et_parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t * const sctp_hdr); +void et_parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_inithdr_t * const sctp_hdr); +void et_parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t * const sctp_hdr); +void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t * const sctp_hdr); +et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); +et_scenario_t* et_generate_scenario(const char * const et_scenario_filename ); +//------------------------- +void et_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num); +int et_is_file_exists ( const char const * file_nameP, const char const *file_roleP); +int et_strip_extension( char *in_filename); +int et_split_path ( char * pathP, char *** resP); +void et_display_node ( xmlNodePtr node, unsigned int indent); +void et_display_tree ( xmlNodePtr node, unsigned int indent); +char * et_ip2ip_str(const et_ip_t * const ip); +int et_hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len); +sctp_cid_t et_chunk_type_str2cid(const xmlChar * const chunk_type_str); +const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type); +et_packet_action_t et_action_str2et_action_t(const xmlChar * const action); +void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip); +uint32_t et_eNB_app_register(const Enb_properties_array_t *enb_properties); +void *et_eNB_app_task(void *args_p); +int et_play_scenario(et_scenario_t* const scenario); + +#endif /* PLAY_SCENARIO_H_ */ diff --git a/openair3/TEST/EPC_TEST/play_scenario_decode.c b/openair3/TEST/EPC_TEST/play_scenario_decode.c new file mode 100644 index 0000000000..aba1703eb3 --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario_decode.c @@ -0,0 +1,214 @@ +/******************************************************************************* + 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 . + + 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 + + *******************************************************************************/ + +/* + play_scenario_decode.c + ------------------- + AUTHOR : Lionel GAUTHIER + COMPANY : EURECOM + EMAIL : Lionel.Gauthier@eurecom.fr + */ + +#include "intertask_interface.h" +#include "platform_types.h" +#include "s1ap_ies_defs.h" +#include "s1ap_eNB_decoder.h" +#include "assertions.h" +#include "play_scenario.h" + +//------------------------------------------------------------------------------ +int et_s1ap_decode_initiating_message(s1ap_message *message, S1ap_InitiatingMessage_t *initiating_p) +{ + int ret = -1; + + DevAssert(initiating_p != NULL); + + message->procedureCode = initiating_p->procedureCode; + message->criticality = initiating_p->criticality; + + switch(initiating_p->procedureCode) { + case S1ap_ProcedureCode_id_downlinkNASTransport: + ret = s1ap_decode_s1ap_downlinknastransporties(&message->msg.s1ap_DownlinkNASTransportIEs,&initiating_p->value); + break; + + case S1ap_ProcedureCode_id_InitialContextSetup: + ret = s1ap_decode_s1ap_initialcontextsetuprequesties(&message->msg.s1ap_InitialContextSetupRequestIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_UEContextRelease: + ret = s1ap_decode_s1ap_uecontextreleasecommandies(&message->msg.s1ap_UEContextReleaseCommandIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_Paging: + ret = s1ap_decode_s1ap_pagingies(&message->msg.s1ap_PagingIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_uplinkNASTransport: + ret = s1ap_decode_s1ap_uplinknastransporties (&message->msg.s1ap_UplinkNASTransportIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_S1Setup: + ret = s1ap_decode_s1ap_s1setuprequesties (&message->msg.s1ap_S1SetupRequestIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_initialUEMessage: + ret = s1ap_decode_s1ap_initialuemessageies (&message->msg.s1ap_InitialUEMessageIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_UEContextReleaseRequest: + ret = s1ap_decode_s1ap_uecontextreleaserequesties (&message->msg.s1ap_UEContextReleaseRequestIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_UECapabilityInfoIndication: + ret = s1ap_decode_s1ap_uecapabilityinfoindicationies (&message->msg.s1ap_UECapabilityInfoIndicationIEs, &initiating_p->value); + break; + + case S1ap_ProcedureCode_id_NASNonDeliveryIndication: + ret = s1ap_decode_s1ap_nasnondeliveryindication_ies (&message->msg.s1ap_NASNonDeliveryIndication_IEs, &initiating_p->value); + break; + + default: + AssertFatal( 0 , "Unknown procedure ID (%d) for initiating message\n", + (int)initiating_p->procedureCode); + return -1; + } + return ret; +} + +//------------------------------------------------------------------------------ +int et_s1ap_decode_successful_outcome(s1ap_message *message, S1ap_SuccessfulOutcome_t *successfullOutcome_p) +{ + int ret = -1; + + DevAssert(successfullOutcome_p != NULL); + + message->procedureCode = successfullOutcome_p->procedureCode; + message->criticality = successfullOutcome_p->criticality; + + switch(successfullOutcome_p->procedureCode) { + case S1ap_ProcedureCode_id_S1Setup: + ret = s1ap_decode_s1ap_s1setupresponseies( + &message->msg.s1ap_S1SetupResponseIEs, &successfullOutcome_p->value); + break; + + case S1ap_ProcedureCode_id_InitialContextSetup: + ret = s1ap_decode_s1ap_initialcontextsetupresponseies (&message->msg.s1ap_InitialContextSetupResponseIEs, &successfullOutcome_p->value); + break; + + case S1ap_ProcedureCode_id_UEContextRelease: + ret = s1ap_decode_s1ap_uecontextreleasecompleteies (&message->msg.s1ap_UEContextReleaseCompleteIEs, &successfullOutcome_p->value); + break; + + default: + AssertFatal(0, "Unknown procedure ID (%d) for successfull outcome message\n", + (int)successfullOutcome_p->procedureCode); + return -1; + } + return ret; +} + +//------------------------------------------------------------------------------ +int et_s1ap_decode_unsuccessful_outcome(s1ap_message *message, S1ap_UnsuccessfulOutcome_t *unSuccessfullOutcome_p) +{ + int ret = -1; + + DevAssert(unSuccessfullOutcome_p != NULL); + + message->procedureCode = unSuccessfullOutcome_p->procedureCode; + message->criticality = unSuccessfullOutcome_p->criticality; + + switch(unSuccessfullOutcome_p->procedureCode) { + case S1ap_ProcedureCode_id_S1Setup: + ret = s1ap_decode_s1ap_s1setupfailureies(&message->msg.s1ap_S1SetupFailureIEs, &unSuccessfullOutcome_p->value); + break; + + case S1ap_ProcedureCode_id_InitialContextSetup: + ret = s1ap_decode_s1ap_initialcontextsetupfailureies (&message->msg.s1ap_InitialContextSetupFailureIEs, &unSuccessfullOutcome_p->value); + break; + + default: + AssertFatal(0,"Unknown procedure ID (%d) for unsuccessfull outcome message\n", + (int)unSuccessfullOutcome_p->procedureCode); + break; + } + return ret; +} + +//------------------------------------------------------------------------------ +int et_s1ap_decode_pdu(S1AP_PDU_t * const pdu, s1ap_message * const message, const uint8_t * const buffer, const uint32_t length) +{ + asn_dec_rval_t dec_ret; + + DevAssert(buffer != NULL); + + memset((void *)pdu, 0, sizeof(S1AP_PDU_t)); + + dec_ret = aper_decode(NULL, + &asn_DEF_S1AP_PDU, + (void **)&pdu, + buffer, + length, + 0, + 0); + + if (dec_ret.code != RC_OK) { + S1AP_ERROR("Failed to decode pdu\n"); + return -1; + } + + message->direction = pdu->present; + + switch(pdu->present) { + case S1AP_PDU_PR_initiatingMessage: + return et_s1ap_decode_initiating_message(message, + &pdu->choice.initiatingMessage); + + case S1AP_PDU_PR_successfulOutcome: + return et_s1ap_decode_successful_outcome(message, + &pdu->choice.successfulOutcome); + + case S1AP_PDU_PR_unsuccessfulOutcome: + return et_s1ap_decode_unsuccessful_outcome(message, + &pdu->choice.unsuccessfulOutcome); + + default: + AssertFatal(0, "Unknown presence (%d) or not implemented\n", (int)pdu->present); + break; + } + return -1; +} +//------------------------------------------------------------------------------ +void et_decode_s1ap(et_s1ap_t * const s1ap) +{ + if (NULL != s1ap) { + if (et_s1ap_decode_pdu(&s1ap->pdu, &s1ap->message, s1ap->binary_stream, s1ap->binary_stream_allocated_size) < 0) { + AssertFatal (0, "ERROR %s() Cannot decode S1AP message!\n", __FUNCTION__); + } + } +} diff --git a/openair3/TEST/EPC_TEST/play_scenario_display.c b/openair3/TEST/EPC_TEST/play_scenario_display.c new file mode 100644 index 0000000000..406c69c858 --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario_display.c @@ -0,0 +1,292 @@ +/******************************************************************************* + 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 . + + 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 + + *******************************************************************************/ + +/* + play_scenario_display.c + ------------------- + AUTHOR : Lionel GAUTHIER + COMPANY : EURECOM + EMAIL : Lionel.Gauthier@eurecom.fr + */ +#include +#include + +#include "intertask_interface.h" +#include "platform_types.h" +#include "assertions.h" +#include "s1ap_ies_defs.h" +#include "s1ap_eNB_decoder.h" +#include "play_scenario.h" +//----------------------------------------------------------------------------- +void et_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num) +{ + unsigned long octet_index = 0; + + if (byte_stream == NULL) { + return; + } + + fprintf(stdout, "+-----+-------------------------------------------------+\n"); + fprintf(stdout, "| | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n"); + fprintf(stdout, "+-----+-------------------------------------------------+\n"); + + for (octet_index = 0; octet_index < num; octet_index++) { + if ((octet_index % 16) == 0) { + if (octet_index != 0) { + fprintf(stdout, " |\n"); + } + + fprintf(stdout, " %04ld |", octet_index); + } + + /* + * Print every single octet in hexadecimal form + */ + fprintf(stdout, " %02x", byte_stream[octet_index]); + /* + * Align newline and pipes according to the octets in groups of 2 + */ + } + + /* + * Append enough spaces and put final pipe + */ + unsigned char index; + + for (index = octet_index; index < 16; ++index) { + fprintf(stdout, " "); + } + + fprintf(stdout, " |\n"); +} + +//------------------------------------------------------------------------------ +void et_display_node(xmlNodePtr node, unsigned int indent) +{ + int i = 0; + if (node->type == XML_ELEMENT_NODE) { + xmlChar *path = xmlGetNodePath(node); + for (i=0; ichildren != NULL && node->children->type == XML_TEXT_NODE) { + xmlChar *content = xmlNodeGetContent(node); + printf("%s -> %s\n", path, content); + xmlFree(content); + } else { + printf("%s\n", path); + } + xmlFree(path); + } +} +//------------------------------------------------------------------------------ +void et_display_tree(xmlNodePtr node, unsigned int indent) +{ + xmlNode *cur_node = NULL; + + for (cur_node = node; cur_node; cur_node = cur_node->next) { + if (cur_node->type == XML_ELEMENT_NODE) { + et_display_node(cur_node, indent); + } + et_display_tree(cur_node->children, indent++); + } +} +//------------------------------------------------------------------------------ +void et_display_packet_s1ap_data(const et_s1ap_t * const s1ap) +{ + char *message_string = NULL; + + if (s1ap) { + message_string = calloc(20000, sizeof(char)); + AssertFatal (NULL != message_string, "ERROR malloc()failed!\n"); + s1ap_string_total_size = 0; + switch(s1ap->pdu.present) { + case S1AP_PDU_PR_initiatingMessage: + switch(s1ap->pdu.choice.initiatingMessage.procedureCode) { + case S1ap_ProcedureCode_id_downlinkNASTransport: s1ap_xer_print_s1ap_downlinknastransport(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_InitialContextSetup: s1ap_xer_print_s1ap_initialcontextsetuprequest(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_UEContextRelease: s1ap_xer_print_s1ap_uecontextreleasecommand(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_Paging: s1ap_xer_print_s1ap_paging(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_uplinkNASTransport: s1ap_xer_print_s1ap_uplinknastransport(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_S1Setup: s1ap_xer_print_s1ap_s1setuprequest(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_initialUEMessage: s1ap_xer_print_s1ap_initialuemessage(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_UEContextReleaseRequest: s1ap_xer_print_s1ap_uecontextreleaserequest(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_UECapabilityInfoIndication:s1ap_xer_print_s1ap_uecapabilityinfoindication(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_NASNonDeliveryIndication: s1ap_xer_print_s1ap_nasnondeliveryindication_(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + default: + AssertFatal( 0 , "Unknown procedure ID (%d) for initiating message\n", + (int)s1ap->pdu.choice.initiatingMessage.procedureCode); + } + break; + case S1AP_PDU_PR_successfulOutcome: + switch(s1ap->pdu.choice.successfulOutcome.procedureCode) { + case S1ap_ProcedureCode_id_S1Setup: s1ap_xer_print_s1ap_s1setupresponse(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_InitialContextSetup: s1ap_xer_print_s1ap_initialcontextsetupresponse(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_UEContextRelease: s1ap_xer_print_s1ap_uecontextreleasecomplete(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + default: + AssertFatal(0, "Unknown procedure ID (%d) for successfull outcome message\n", + (int)s1ap->pdu.choice.successfulOutcome.procedureCode); + } + break; + + case S1AP_PDU_PR_unsuccessfulOutcome: + switch(s1ap->pdu.choice.unsuccessfulOutcome.procedureCode) { + case S1ap_ProcedureCode_id_S1Setup: s1ap_xer_print_s1ap_s1setupfailure(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + case S1ap_ProcedureCode_id_InitialContextSetup: s1ap_xer_print_s1ap_initialcontextsetupfailure(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break; + default: + et_free_pointer(message_string); + AssertFatal(0,"Unknown procedure ID (%d) for unsuccessfull outcome message\n", + (int)s1ap->pdu.choice.unsuccessfulOutcome.procedureCode); + break; + } + break; + default: + AssertFatal(0, "Unknown presence (%d) or not implemented\n", (int)s1ap->pdu.present); + break; + } + fprintf(stdout, "\t\tSCTP.data XML dump:\n%s\n", message_string); + et_free_pointer(message_string); + } +} +//------------------------------------------------------------------------------ +void et_display_packet_sctp_init(const sctp_inithdr_t * const sctp) +{ + + if (sctp) { + fprintf(stdout, "\t\tSCTP.init.init_tag : %u\n", sctp->init_tag); + fprintf(stdout, "\t\tSCTP.init.a_rwnd : %u\n", sctp->a_rwnd); + fprintf(stdout, "\t\tSCTP.init.num_inbound_streams : %u\n", sctp->num_inbound_streams); + fprintf(stdout, "\t\tSCTP.init.num_outbound_streams : %u\n", sctp->num_outbound_streams); + fprintf(stdout, "\t\tSCTP.init.initial_tsn : %u\n", sctp->initial_tsn); + } +} +//------------------------------------------------------------------------------ +void et_display_packet_sctp_initack(const sctp_initackhdr_t * const sctp) +{ + + if (sctp) { + fprintf(stdout, "\t\tSCTP.initack.init_tag : %u\n", sctp->init_tag); + fprintf(stdout, "\t\tSCTP.initack.a_rwnd : %u\n", sctp->a_rwnd); + fprintf(stdout, "\t\tSCTP.initack.num_inbound_streams : %u\n", sctp->num_inbound_streams); + fprintf(stdout, "\t\tSCTP.initack.num_outbound_streams : %u\n", sctp->num_outbound_streams); + fprintf(stdout, "\t\tSCTP.initack.initial_tsn : %u\n", sctp->initial_tsn); + } +} +//------------------------------------------------------------------------------ +void et_display_packet_sctp_data(const sctp_datahdr_t * const sctp) +{ + if (sctp) { + fprintf(stdout, "\t\tSCTP.data.tsn : %u\n", sctp->tsn); + fprintf(stdout, "\t\tSCTP.data.stream : %u\n", sctp->stream); + fprintf(stdout, "\t\tSCTP.data.ssn : %u\n", sctp->ssn); + fprintf(stdout, "\t\tSCTP.data.ppid : %u\n", sctp->ppid); + if (sctp->ppid == 18) { + et_display_packet_s1ap_data(&sctp->payload); + } + fprintf(stdout, "\t\tSCTP.data.binary_stream_allocated_size : %u\n", sctp->payload.binary_stream_allocated_size); + if (NULL != sctp->payload.binary_stream) { + fprintf(stdout, "\t\tSCTP.data.binary_stream :\n"); + et_print_hex_octets(sctp->payload.binary_stream, sctp->payload.binary_stream_allocated_size); + } else { + fprintf(stdout, "\t\tSCTP.data.binary_stream : NULL\n"); + } + } +} + +//------------------------------------------------------------------------------ +void et_display_packet_sctp(const et_sctp_hdr_t * const sctp) +{ + if (sctp) { + fprintf(stdout, "\t\tSCTP.src_port : %u\n", sctp->src_port); + fprintf(stdout, "\t\tSCTP.dst_port : %u\n", sctp->dst_port); + fprintf(stdout, "\t\tSCTP.chunk_type : %s\n", et_chunk_type_cid2str(sctp->chunk_type)); + switch (sctp->chunk_type) { + case SCTP_CID_DATA: + et_display_packet_sctp_data(&sctp->u.data_hdr); + break; + case SCTP_CID_INIT: + et_display_packet_sctp_initack(&sctp->u.init_hdr); + break; + case SCTP_CID_INIT_ACK: + et_display_packet_sctp_initack(&sctp->u.init_ack_hdr); + break; + default: + ; + } + } +} +//------------------------------------------------------------------------------ +void et_display_packet_ip(const et_ip_hdr_t * const ip) +{ + if (ip) { + fprintf(stdout, "\t\tSource address : %s\n", et_ip2ip_str(&ip->src)); + fprintf(stdout, "\t\tDestination address : %s\n", et_ip2ip_str(&ip->dst)); + } +} + +//------------------------------------------------------------------------------ +void et_display_packet(const et_packet_t * const packet) +{ + if (packet) { + fprintf(stdout, "-------------------------------------------------------------------------------\n"); + fprintf(stdout, "\tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); + fprintf(stdout, "\tPacket:\ttime relative to 1st packet %ld.%06lu\n", + packet->time_relative_to_first_packet.tv_sec, packet->time_relative_to_first_packet.tv_usec); + fprintf(stdout, "\tPacket:\ttime relative to last tx packet %ld.%06lu\n", + packet->time_relative_to_last_sent_packet.tv_sec, packet->time_relative_to_last_sent_packet.tv_usec); + fprintf(stdout, "\tPacket:\ttime relative to last_received packet %ld.%06lu\n", + packet->time_relative_to_last_received_packet.tv_sec, packet->time_relative_to_last_received_packet.tv_usec); + + switch(packet->action) { + case ET_PACKET_ACTION_S1C_SEND: + fprintf(stdout, "\tPacket:\tAction SEND\n"); + break; + case ET_PACKET_ACTION_S1C_RECEIVE: + fprintf(stdout, "\tPacket:\tAction RECEIVE\n"); + break; + default: + fprintf(stdout, "\tPacket:\tAction UNKNOWN\n"); + } + et_display_packet_ip(&packet->ip_hdr); + et_display_packet_sctp(&packet->sctp_hdr); + } +} +//------------------------------------------------------------------------------ +void et_display_scenario(const et_scenario_t * const scenario) +{ + et_packet_t *packet = NULL; + if (scenario) { + fprintf(stdout, "Scenario: %s\n", (scenario->name != NULL) ? (char*)scenario->name:"UNKNOWN NAME"); + packet = scenario->list_packet; + while (packet) { + et_display_packet(packet); + packet = packet->next; + } + } +} diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c new file mode 100644 index 0000000000..6c73793f4d --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -0,0 +1,127 @@ +/******************************************************************************* + 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 . + + 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 + + *******************************************************************************/ + +/* + play_scenario_fsm.c + ------------------- + AUTHOR : Lionel GAUTHIER + COMPANY : EURECOM + EMAIL : Lionel.Gauthier@eurecom.fr + */ +#include + +#include "intertask_interface.h" +#include "platform_types.h" +#include "assertions.h" +#include "play_scenario.h" + + +et_scenario_t *g_scenario = NULL; +et_fsm_state_t g_fsm_state = ET_FSM_STATE_NULL; +//------------------------------------------------------------------------------ +int et_scenario_fsm_notify_event_state_null(et_event_t event) +{ + et_packet_t *packet = NULL; + const Enb_properties_array_t *enb_properties_p = NULL; + uint32_t register_enb_pending; + + switch (event.code){ + case ET_EVENT_INIT: + AssertFatal(NULL == g_scenario, "Current scenario not ended"); + g_scenario = event.u.init.scenario; + packet = g_scenario->list_packet; + while (NULL != packet) { + switch (packet->sctp_hdr.chunk_type) { + + case SCTP_CID_DATA : + // no init in this scenario, may be sub-scenario + if (packet->action == ET_PACKET_ACTION_S1C_SEND) { + } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + g_scenario->waited_packet = packet; + } else { + packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; + packet = packet->next; + } + break; + case SCTP_CID_INIT: + case SCTP_CID_INIT_ACK: + enb_properties_p = enb_config_get(); + /* Try to register each eNB */ + g_fsm_state = ET_FSM_STATE_CONNECTING_SCTP; + register_enb_pending = et_eNB_app_register (enb_properties_p); + break; + case SCTP_CID_HEARTBEAT: + case SCTP_CID_HEARTBEAT_ACK: + case SCTP_CID_COOKIE_ECHO: + case SCTP_CID_COOKIE_ACK: + case SCTP_CID_ECN_ECNE: + case SCTP_CID_ECN_CWR: + packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; + packet = packet->next; + break; + case SCTP_CID_ABORT: + case SCTP_CID_SHUTDOWN: + case SCTP_CID_SHUTDOWN_ACK: + case SCTP_CID_ERROR: + case SCTP_CID_SHUTDOWN_COMPLETE: + AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)", et_chunk_type_cid2str(packet->sctp_hdr.chunk_type)); + break; + + default: + packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; + packet = packet->next; + } + } + fprintf(stderr, "No Packet found in this scenario: %s\n", g_scenario->name); + return -1; + break; + + case ET_EVENT_STOP: + break; + + default: + AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_NULL", event.code); + } + return 0; +} + +//------------------------------------------------------------------------------ +int et_scenario_fsm_notify_event(et_event_t event) +{ + AssertFatal((event.code >= ET_EVENT_START) && (event.code < ET_EVENT_END), "Unknown et_event_t.code %d", event.code); + + switch (g_fsm_state){ + case ET_FSM_STATE_NULL: return et_scenario_fsm_notify_event_state_null(event); break; + case ET_FSM_STATE_CONNECTING_SCTP: return et_scenario_fsm_notify_event_state_null(event); break; + case ET_FSM_STATE_WAITING_TX_EVENT: return et_scenario_fsm_notify_event_state_null(event); break; + case ET_FSM_STATE_WAITING_RX_EVENT: return et_scenario_fsm_notify_event_state_null(event); break; + default: + return -1; + } +} diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c new file mode 100644 index 0000000000..236c17963a --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -0,0 +1,561 @@ +/******************************************************************************* + 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 . + + 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 + + *******************************************************************************/ + +/* + play_scenario_parse.c + ------------------- + AUTHOR : Lionel GAUTHIER + COMPANY : EURECOM + EMAIL : Lionel.Gauthier@eurecom.fr + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "intertask_interface.h" +#include "platform_types.h" +#include "enb_config.h" +#include "assertions.h" +#include "play_scenario.h" +//------------------------------------------------------------------------------ +#define ENB_CONFIG_MAX_XSLT_PARAMS 32 +//------------------------------------------------------------------------------ +extern char *g_openair_dir; +extern Enb_properties_array_t enb_properties; +//------------------------------------------------------------------------------ +void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * const s1ap) +{ + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + xmlChar *xml_char2 = NULL; + unsigned int size = 0; + int rc = 0; + unsigned int go_deeper_in_tree = 1; + + if ((NULL != s1ap_node) && (NULL != s1ap)) { + for (cur_node = (xmlNode *)s1ap_node; cur_node; cur_node = cur_node->next) { + go_deeper_in_tree = 1; + if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"field"))) { + // do not get hidden fields + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"hide"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"yes"))) { + go_deeper_in_tree = 0; + } + xmlFree(xml_char); + } + if (0 < go_deeper_in_tree) { + // first get size + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); + if (NULL != xml_char) { + size = strtoul((const char *)xml_char, NULL, 0); + xmlFree(xml_char); + // second: try to get value (always hex) + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); + if (NULL != xml_char) { + xml_char2 = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); + fprintf(stdout, "s1ap %p field %s size %d value %s\n",s1ap, xml_char2, size, xml_char); + xmlFree(xml_char2); + // if success to get value, do not parse children + //AssertFatal ((xmlStrlen(xml_char) == size), "ERROR %s() mismatch in size %d and strlen %d\n", __FUNCTION__, size, xmlStrlen(xml_char)); + //if (xmlStrlen(xml_char) == size) { + AssertFatal ((s1ap->binary_stream_pos+xmlStrlen(xml_char)/2) <= s1ap->binary_stream_allocated_size, + "ERROR %s() in buffer size: binary_stream_pos %d xmlStrlen(xml_char)/2=%d\n", __FUNCTION__, s1ap->binary_stream_pos, xmlStrlen(xml_char)/2); + rc = et_hex2data( &s1ap->binary_stream[s1ap->binary_stream_pos], xml_char, xmlStrlen(xml_char)); + s1ap->binary_stream_pos += xmlStrlen(xml_char)/2; + et_display_node(cur_node, 0); + AssertFatal (rc >= 0, "ERROR %s() in converting hex string %s len %d size %d rc %d\n", __FUNCTION__, xml_char, xmlStrlen(xml_char), size, rc); + go_deeper_in_tree = 0; + //} + xmlFree(xml_char); + } + } + } + } + if (0 < go_deeper_in_tree) { + et_parse_s1ap(doc, cur_node->children, s1ap); + } + } + } +} + +//------------------------------------------------------------------------------ +void et_parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t * const sctp_hdr) +{ + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + xmlChar *xml_char2 = NULL; + + if ((NULL != sctp_node) && (NULL != sctp_hdr)) { + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_payload_proto_id"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->ppid = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_sid"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->stream = strtoul((const char *)xml_char2, NULL, 16); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_tsn"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->tsn = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_ssn"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->ssn = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } + xmlFree(xml_char); + } + for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { + et_parse_sctp_data_chunk(doc, cur_node, sctp_hdr); + } + } + +} +//------------------------------------------------------------------------------ +void et_parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_inithdr_t * const sctp_hdr) +{ + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + xmlChar *xml_char2 = NULL; + + if ((NULL != sctp_node) && (NULL != sctp_hdr)) { + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_nr_out_streams"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->num_outbound_streams = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_nr_in_streams"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->num_inbound_streams = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_credit"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->a_rwnd = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_initial_tsn"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->initial_tsn = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_initiate_tag"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->init_tag = strtoul((const char *)xml_char2, NULL, 16); + xmlFree(xml_char2); + } + } + xmlFree(xml_char); + } + for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { + et_parse_sctp_init_chunk(doc, cur_node, sctp_hdr); + } + } +} +//------------------------------------------------------------------------------ +void et_parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t * const sctp_hdr) +{ + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + xmlChar *xml_char2 = NULL; + + if ((NULL != sctp_node) && (NULL != sctp_hdr)) { + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_nr_out_streams"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->num_outbound_streams = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_nr_in_streams"))) { + xml_char2 = xmlGetProp((xmlNode *)(xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->num_inbound_streams = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_credit"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->a_rwnd = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_initial_tsn"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->initial_tsn = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_initiate_tag"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); + if (NULL != xml_char2) { + sctp_hdr->init_tag = strtoul((const char *)xml_char2, NULL, 16); + xmlFree(xml_char2); + } + } + xmlFree(xml_char); + } + for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { + et_parse_sctp_init_ack_chunk(doc, cur_node, sctp_hdr); + } + } +} +//------------------------------------------------------------------------------ +void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t * const sctp_hdr) +{ + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + xmlChar *xml_char2 = NULL; + + if ((NULL != sctp_node) && (NULL != sctp_hdr)) { + if ((!xmlStrcmp(sctp_node->name, (const xmlChar *)"proto"))) { + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"s1ap"))) { + xmlFree(xml_char); + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"size"); + if (NULL != xml_char2) { + sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size = strtoul((const char *)xml_char2, NULL, 0); + sctp_hdr->u.data_hdr.payload.binary_stream = calloc(1, sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size); + xmlFree(xml_char2); + } + et_parse_s1ap(doc, sctp_node, &sctp_hdr->u.data_hdr.payload); + et_decode_s1ap(&sctp_hdr->u.data_hdr.payload); + return; + } + xmlFree(xml_char); + } + } + //if ((cur_node->type == XML_ATTRIBUTE_NODE) || (cur_node->type == XML_ELEMENT_NODE)) { + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.srcport"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->src_port = strtoul((const char *)xml_char2, NULL, 16); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.dstport"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->dst_port = strtoul((const char *)xml_char2, NULL, 16); + xmlFree(xml_char2); + } + } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.chunk_type"))) { + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); + if (NULL != xml_char2) { + sctp_hdr->chunk_type = strtoul((const char *)xml_char2, NULL, 0); + xmlFree(xml_char2); + switch (sctp_hdr->chunk_type) { + case SCTP_CID_DATA: + et_parse_sctp_data_chunk(doc, sctp_node->parent, &sctp_hdr->u.data_hdr); + break; + case SCTP_CID_INIT: + et_parse_sctp_init_chunk(doc, sctp_node->parent, &sctp_hdr->u.init_hdr); + break; + case SCTP_CID_INIT_ACK: + et_parse_sctp_init_ack_chunk(doc, sctp_node->parent, &sctp_hdr->u.init_ack_hdr); + break; + default: + ; + } + } + } + } + for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { + et_parse_sctp(doc, cur_node, sctp_hdr); + } + } +} +//------------------------------------------------------------------------------ +et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { + + et_packet_t *packet = NULL; + xmlNode *cur_node = NULL; + xmlChar *xml_char = NULL; + float afloat = (float)0.0; + static struct timeval initial_time = { .tv_sec = 0, .tv_usec = 0 }; + static struct timeval relative_last_sent_packet = { .tv_sec = 0, .tv_usec = 0 }; + static struct timeval relative_last_received_packet = { .tv_sec = 0, .tv_usec = 0 }; + static char first_packet = 1; + static char first_sent_packet = 1; + static char first_received_packet = 1; + static unsigned int packet_number = 1; + + if (NULL != node) { + packet = calloc(1, sizeof(*packet)); + + xml_char = xmlGetProp(node, (const xmlChar *)"action"); + packet->action = et_action_str2et_action_t(xml_char); + xmlFree(xml_char); + packet->packet_number = packet_number++; + + for (cur_node = node->children; cur_node; cur_node = cur_node->next) { + //if (cur_node->type == XML_ELEMENT_NODE) { + if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.time_relative"))) { + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); + afloat = atof((const char*)xml_char); + xmlFree(xml_char); + packet->time_relative_to_first_packet.tv_sec = (int)afloat; + packet->time_relative_to_first_packet.tv_usec = (int)((afloat - packet->time_relative_to_first_packet.tv_sec)*1000000); + + if (first_packet > 0) { + initial_time = packet->time_relative_to_first_packet; + packet->time_relative_to_first_packet.tv_sec = 0; + packet->time_relative_to_first_packet.tv_usec = 0; + first_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &initial_time, + &packet->time_relative_to_first_packet); + } + if (packet->action == ET_PACKET_ACTION_S1C_SEND) { + if (first_sent_packet > 0) { + relative_last_sent_packet = packet->time_relative_to_first_packet; + packet->time_relative_to_last_sent_packet.tv_sec = 0; + packet->time_relative_to_last_sent_packet.tv_usec = 0; + first_sent_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, + &packet->time_relative_to_last_sent_packet); + relative_last_sent_packet = packet->time_relative_to_first_packet; + } + } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + if (first_received_packet > 0) { + relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec; + relative_last_received_packet.tv_usec = packet->time_relative_to_first_packet.tv_usec; + packet->time_relative_to_last_received_packet.tv_sec = 0; + packet->time_relative_to_last_received_packet.tv_usec = 0; + first_received_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, + &packet->time_relative_to_last_received_packet); + relative_last_received_packet = packet->time_relative_to_first_packet; + } + } + + } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.number"))) { + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); + packet->original_frame_number = strtoul((const char *)xml_char, NULL, 0); + xmlFree(xml_char); + } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.src"))) { + xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1); + et_ip_str2et_ip(xml_char, &packet->ip_hdr.src); + xmlFree(xml_char); + } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.dst"))) { + xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1); + et_ip_str2et_ip(xml_char, &packet->ip_hdr.dst); + xmlFree(xml_char); + } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"proto"))) { + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp"))) { + et_parse_sctp(doc, cur_node, &packet->sctp_hdr); + } + xmlFree(xml_char); + } + } + //} + } + } + return packet; +} +//------------------------------------------------------------------------------ +et_scenario_t* et_generate_scenario( + const char * const tsml_out_scenario_filename ) +{ + xmlDocPtr doc = NULL; + xmlNodePtr root = NULL; + xmlNodePtr node = NULL; + xmlChar *xml_char = NULL; + et_scenario_t *scenario = NULL; + et_packet_t *packet = NULL; + et_packet_t **next_packet = NULL; + + doc = xmlParseFile(tsml_out_scenario_filename); + if (NULL == doc) { + AssertFatal (0, "Could not parse scenario xml file %s!\n", tsml_out_scenario_filename); + } else { + fprintf(stdout, "Test scenario file to play: %s\n", tsml_out_scenario_filename); + //xmlDebugDumpDocument(NULL, doc); + } + + // Get root + root = xmlDocGetRootElement(doc); + if (NULL != root) { + if ((!xmlStrcmp(root->name, (const xmlChar *)"scenario"))) { + xml_char = xmlGetProp(root, (const xmlChar *)"name"); + printf("scenario name: %s\n", xml_char); + scenario = calloc(1, sizeof(*scenario)); + scenario->name = xml_char; // nodup nofree + next_packet = &scenario->list_packet; + for (node = root->children; node != NULL; node = node->next) { + if ((!xmlStrcmp(node->name, (const xmlChar *)"packet"))) { + packet = et_parse_xml_packet(doc, node); + if (NULL != packet) { + *next_packet = packet; + next_packet = &packet->next; + } else { + fprintf(stdout, "WARNING omitted packet:\n"); + et_display_node(node, 0); + } + } + } + } + } else { + fprintf(stderr, "Empty xml document\n"); + } + xmlFreeDoc(doc); + xmlCleanupParser(); + return scenario; +} +//------------------------------------------------------------------------------ +int et_generate_xml_scenario( + const char const * xml_in_dir_name, + const char const * xml_in_scenario_filename, + const char const * enb_config_filename, + char const * tsml_out_scenario_filename) +//------------------------------------------------------------------------------ +{ + //int fd_pdml_in; + xsltStylesheetPtr cur = NULL; + xmlDocPtr doc, res; + FILE *play_scenario_file = NULL; + const char *params[2*ENB_CONFIG_MAX_XSLT_PARAMS]; + int nb_params = 0; + int i,j; + char astring[1024]; + struct in_addr addr; + int ret = 0; + + memset(astring, 0, sizeof(astring)); + if (getcwd(astring, sizeof(astring)) != NULL) { + fprintf(stdout, "working in %s directory\n", astring); + } else { + perror("getcwd() ERROR"); + exit(1); + } + + memset(astring, 0, sizeof(astring)); + strcat(astring, g_openair_dir); + strcat(astring, "/openair3/TEST/EPC_TEST/play_scenario.xsl"); + + xmlSubstituteEntitiesDefault(1); + xmlLoadExtDtdDefaultValue = 1; + cur = xsltParseStylesheetFile((const xmlChar *)astring); + if (NULL == cur) { + AssertFatal (0, "Could not parse stylesheet file %s (check OPENAIR_DIR env variable)!\n", astring); + } else { + fprintf(stdout, "XSLT style sheet: %s\n", astring); + } + + doc = xmlParseFile(xml_in_scenario_filename); + if (NULL == doc) { + AssertFatal (0, "Could not parse scenario xml file %s!\n", xml_in_scenario_filename); + } else { + fprintf(stdout, "Test scenario file: %s\n", xml_in_scenario_filename); + } + + for (i = 0; i < enb_properties.number; i++) { + // eNB S1-C IPv4 address + sprintf(astring, "enb_s1c%d", i); + params[nb_params++] = strdup(astring); + addr.s_addr = enb_properties.properties[i]->enb_ipv4_address_for_S1_MME; + sprintf(astring, "\"%s\"", inet_ntoa(addr)); + params[nb_params++] = strdup(astring); + + // MME S1-C IPv4 address + for (j = 0; j < enb_properties.properties[i]->nb_mme; j++) { + sprintf(astring, "mme_s1c%d_%d", i, j); + params[nb_params++] = strdup(astring); + AssertFatal (enb_properties.properties[i]->mme_ip_address[j].ipv4_address, + "Only support MME IPv4 address\n"); + sprintf(astring, "\"%s\"", enb_properties.properties[i]->mme_ip_address[j].ipv4_address); + params[nb_params++] = strdup(astring); + } + } + params[nb_params] = NULL; + res = xsltApplyStylesheet(cur, doc, params); + if (NULL != res) { + sprintf((char *)tsml_out_scenario_filename,"%s",xml_in_scenario_filename); + if (et_strip_extension((char *)tsml_out_scenario_filename) > 0) { + strcat((char *)tsml_out_scenario_filename, ".tsml"); + play_scenario_file = fopen( tsml_out_scenario_filename, "w+"); + if (NULL != play_scenario_file) { + xsltSaveResultToFile(play_scenario_file, res, cur); + fclose(play_scenario_file); + fprintf(stdout, "Wrote test scenario to %s\n", tsml_out_scenario_filename); + } else { + fprintf(stderr, "ERROR in fopen(%s)\n", tsml_out_scenario_filename); + ret = -1; + } + } else { + fprintf(stderr, "ERROR in strip_extension()\n"); + ret = -1; + } + } else { + fprintf(stderr, "ERROR in xsltApplyStylesheet()\n"); + ret = -1; + } + xsltFreeStylesheet(cur); + xmlFreeDoc(doc); + xmlFreeDoc(res); + + xsltCleanupGlobals(); + xmlCleanupParser(); + return ret; +} + diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c new file mode 100644 index 0000000000..cb5571c28b --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -0,0 +1,162 @@ +/******************************************************************************* + 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 . + + 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 + + *******************************************************************************/ + +/* + play_scenario_s1ap.c + ------------------- + AUTHOR : Lionel GAUTHIER + COMPANY : EURECOM + EMAIL : Lionel.Gauthier@eurecom.fr + */ +#include +#include +#include +#include +#include "tree.h" +#include "queue.h" + + +#include "intertask_interface.h" +#include "messages_types.h" +#include "platform_types.h" +#include "s1ap_common.h" +#include "s1ap_eNB_defs.h" +#include "s1ap_eNB_default_values.h" +#include "s1ap_eNB_management_procedures.h" +#include "s1ap_eNB.h" +#include "play_scenario.h" +#include "msc.h" +#include "assertions.h" +#include "conversions.h" + + +//------------------------------------------------------------------------------ +extern void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp); +extern void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB); +//------------------------------------------------------------------------------ +void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind) +{ + int result = 0; + et_event_t event; + + DevAssert(sctp_data_ind != NULL); + + memset((void*)&event, 0, sizeof(event)); + + event.code = ET_EVENT_RX_S1AP; + event.u.s1ap_data_ind.sctp_datahdr.tsn = 0; + event.u.s1ap_data_ind.sctp_datahdr.stream = sctp_data_ind->stream; + event.u.s1ap_data_ind.sctp_datahdr.ssn = 0; + event.u.s1ap_data_ind.sctp_datahdr.ppid = 18; // find constant + + event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_pos = 0; + event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_allocated_size = sctp_data_ind->buffer_length; + event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream = NULL; + if ((sctp_data_ind->buffer_length > 0) && (NULL != sctp_data_ind->buffer)) { + event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream = calloc(1, sctp_data_ind->buffer_length); + memcpy(event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream, + sctp_data_ind->buffer, + sctp_data_ind->buffer_length); + + if (et_s1ap_decode_pdu( + &event.u.s1ap_data_ind.sctp_datahdr.payload.pdu, + &event.u.s1ap_data_ind.sctp_datahdr.payload.message, + event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream, + event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_allocated_size) < 0) { + AssertFatal (0, "ERROR %s() Cannot decode RX S1AP message!\n", __FUNCTION__); + } + + } + + result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer); + AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + + et_scenario_fsm_notify_event(event); + +} +//------------------------------------------------------------------------------ +void *et_s1ap_eNB_task(void *arg) +{ + MessageDef *received_msg = NULL; + int result; + + S1AP_DEBUG("Starting S1AP layer\n"); + + s1ap_eNB_prepare_internal_data(); + + itti_mark_task_ready(TASK_S1AP); + MSC_START_USE(); + + while (1) { + itti_receive_msg(TASK_S1AP, &received_msg); + + switch (ITTI_MSG_ID(received_msg)) { + case TERMINATE_MESSAGE: + itti_exit_task(); + break; + + case S1AP_REGISTER_ENB_REQ: { + /* Register a new eNB. + * in Virtual mode eNBs will be distinguished using the mod_id/ + * Each eNB has to send an S1AP_REGISTER_ENB message with its + * own parameters. + */ + s1ap_eNB_handle_register_eNB(ITTI_MESSAGE_GET_INSTANCE(received_msg), + &S1AP_REGISTER_ENB_REQ(received_msg)); + } + break; + + case SCTP_NEW_ASSOCIATION_RESP: { + s1ap_eNB_handle_sctp_association_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg), + &received_msg->ittiMsg.sctp_new_association_resp); + } + break; + + case SCTP_DATA_IND: { + et_s1ap_eNB_handle_sctp_data_ind(&received_msg->ittiMsg.sctp_data_ind); + } + break; + + + default: + S1AP_ERROR("Received unhandled message: %d:%s\n", + ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg)); + break; + } + + result = itti_free (ITTI_MSG_ORIGIN_ID(received_msg), received_msg); + AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + + received_msg = NULL; + } + + return NULL; +} + + diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c new file mode 100644 index 0000000000..6856cb2933 --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -0,0 +1,45 @@ +/******************************************************************************* + 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 . + + 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 + + *******************************************************************************/ + +/* + play_scenario_sctp.c + ------------------- + AUTHOR : Lionel GAUTHIER + COMPANY : EURECOM + EMAIL : Lionel.Gauthier@eurecom.fr + */ + + +#include + +#include "intertask_interface.h" +#include "platform_types.h" +#include "assertions.h" +#include "play_scenario.h" + diff --git a/openair3/UTILS/conversions.h b/openair3/UTILS/conversions.h index aaa2b9714f..47912f0d92 100644 --- a/openair3/UTILS/conversions.h +++ b/openair3/UTILS/conversions.h @@ -275,7 +275,6 @@ do { \ (bITsTRING)->size = 3; \ (bITsTRING)->bits_unused = 4; \ } while(0) -/* /* TS 36.413 v10.9.0 section 9.2.1.38: * E-UTRAN CGI/Cell Identity * The leftmost bits of the Cell From e58be6bbc14cc1b1bde0a126d9bd9bd9206bca8c Mon Sep 17 00:00:00 2001 From: gauthier Date: Mon, 23 Nov 2015 16:54:44 +0100 Subject: [PATCH 011/122] Remaining TODO fill assoc_id and mme_ue_id of packets --- cmake_targets/CMakeLists.txt | 5 +- openair3/TEST/EPC_TEST/generate_scenario.c | 4 +- openair3/TEST/EPC_TEST/generic_scenario.xsl | 144 ++++-- openair3/TEST/EPC_TEST/play_scenario.c | 309 ++++++++++-- openair3/TEST/EPC_TEST/play_scenario.h | 186 +++++++- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 325 +++++++++++-- openair3/TEST/EPC_TEST/play_scenario_parse.c | 27 +- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 447 +++++++++++++++++- .../EPC_TEST/play_scenario_s1ap_eNB_defs.h | 250 ++++++++++ 9 files changed, 1522 insertions(+), 175 deletions(-) create mode 100644 openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 148aae2419..bcf90bdb83 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1667,17 +1667,16 @@ add_executable(test_epc_play_scenario ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_fsm.c ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_parse.c ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_sctp.c ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.h - ${OPENAIR2_DIR}/ENB_APP/enb_config.h ${OPENAIR2_DIR}/COMMON/commonDef.h ${OPENAIR2_DIR}/COMMON/messages_def.h ${OPENAIR2_DIR}/COMMON/messages_types.h - ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h ${OPENAIR_BIN_DIR}/messages_xml.h ) target_link_libraries (test_epc_play_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 ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} ) diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index 8f39b9873e..9f4e16baef 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -228,7 +228,7 @@ int generate_test_scenario(const char const * test_nameP, const char const * pdm for (i = 0; i < g_enb_properties.number; i++) { // eNB S1-C IPv4 address - sprintf(astring, "enb_s1c%d", i); + sprintf(astring, "enb%d_s1c", i); params[nb_params++] = strdup(astring); addr.s_addr = g_enb_properties.properties[i]->enb_ipv4_address_for_S1_MME; sprintf(astring, "\"%s\"", inet_ntoa(addr)); @@ -236,7 +236,7 @@ int generate_test_scenario(const char const * test_nameP, const char const * pdm // MME S1-C IPv4 address for (j = 0; j < g_enb_properties.properties[i]->nb_mme; j++) { - sprintf(astring, "mme_s1c%d_%d", i, j); + sprintf(astring, "mme%d_s1c_%d", i, j); params[nb_params++] = strdup(astring); AssertFatal (g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address, "Only support MME IPv4 address\n"); diff --git a/openair3/TEST/EPC_TEST/generic_scenario.xsl b/openair3/TEST/EPC_TEST/generic_scenario.xsl index 1d49b4942e..592bef83d4 100644 --- a/openair3/TEST/EPC_TEST/generic_scenario.xsl +++ b/openair3/TEST/EPC_TEST/generic_scenario.xsl @@ -8,30 +8,30 @@ /> - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -39,30 +39,30 @@ - enb_s1c0 - enb_s1c1 - enb_s1c2 - enb_s1c3 - enb_s1c4 - enb_s1c5 - enb_s1c6 - enb_s1c7 - mme_s1c0_0 - mme_s1c0_1 - mme_s1c0_2 - mme_s1c0_3 - mme_s1c1_0 - mme_s1c1_1 - mme_s1c1_2 - mme_s1c1_3 - mme_s1c2_0 - mme_s1c2_1 - mme_s1c2_2 - mme_s1c2_3 - mme_s1c3_0 - mme_s1c3_1 - mme_s1c3_2 - mme_s1c3_3 + enb0_s1c + enb1_s1c + enb2_s1c + enb3_s1c + enb4_s1c + enb5_s1c + enb6_s1c + enb7_s1c + mme0_s1c_0 + mme0_s1c_1 + mme0_s1c_2 + mme0_s1c_3 + mme1_s1c_0 + mme1_s1c_1 + mme1_s1c_2 + mme1_s1c_3 + mme2_s1c_0 + mme2_s1c_1 + mme2_s1c_2 + mme2_s1c_3 + mme3_s1c_0 + mme3_s1c_1 + mme3_s1c_2 + mme3_s1c_3 ERROR: Cannot reverse resolv IP ! @@ -70,6 +70,26 @@ + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + ERROR: Cannot set eNB instance ! + + + + + + + @@ -120,8 +140,26 @@ - SEND - RECEIVE + SEND + RECEIVE + + ERROR: UNKNOWN ACTION ! + + + + + + + + + + + + + + + + ERROR: UNKNOWN ACTION ! @@ -156,6 +194,7 @@ + @@ -177,6 +216,7 @@ + @@ -197,6 +237,7 @@ + @@ -218,6 +259,7 @@ + @@ -233,6 +275,7 @@ + @@ -249,6 +292,7 @@ + diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index fda38dbcb8..f29393f0e7 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -48,6 +48,9 @@ #include #include #include +#include +#include +#include #include "intertask_interface_init.h" @@ -63,11 +66,19 @@ #define GS_IS_FILE 1 #define GS_IS_DIR 2 //------------------------------------------------------------------------------ -char *g_openair_dir = NULL; +char *g_openair_dir = NULL; +Enb_properties_array_t g_enb_properties; //------------------------------------------------------------------------------ -extern int xmlLoadExtDtdDefaultValue; -extern int asn_debug; -extern int asn1_xer_print; +extern et_scenario_t *g_scenario; +extern int xmlLoadExtDtdDefaultValue; +extern int asn_debug; +extern int asn1_xer_print; + +//------------------------------------------------------------------------------ +// MEMO: +// Scenario with several eNBs: We may have to create ethx.y interfaces +// + //------------------------------------------------------------------------------ @@ -159,6 +170,7 @@ void et_free_scenario(et_scenario_t* scenario) packet = next_packet->next; } et_free_pointer(scenario); + pthread_mutex_destroy(&scenario->fsm_lock); } } @@ -290,17 +302,250 @@ void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip) AssertFatal (0, "ERROR %s() Could not parse ip address %s!\n", __FUNCTION__, ip_str); } } +#ifdef LIBCONFIG_LONG +#define libconfig_int long +#else +#define libconfig_int int +#endif +//------------------------------------------------------------------------------ +void et_enb_config_init(const char const * lib_config_file_name_pP) +//------------------------------------------------------------------------------ +{ + config_t cfg; + config_setting_t *setting = NULL; + config_setting_t *subsetting = NULL; + config_setting_t *setting_mme_addresses = NULL; + config_setting_t *setting_mme_address = NULL; + config_setting_t *setting_enb = NULL; + int num_enb_properties = 0; + int enb_properties_index = 0; + int num_enbs = 0; + int num_mme_address = 0; + int i = 0; + int j = 0; + int parse_errors = 0; + libconfig_int enb_id = 0; + const char* cell_type = NULL; + const char* tac = 0; + const char* enb_name = NULL; + const char* mcc = 0; + const char* mnc = 0; + char* ipv4 = NULL; + char* ipv6 = NULL; + char* active = NULL; + char* preference = NULL; + const char* active_enb[MAX_ENB]; + char* enb_interface_name_for_S1U = NULL; + char* enb_ipv4_address_for_S1U = NULL; + libconfig_int enb_port_for_S1U = 0; + char* enb_interface_name_for_S1_MME = NULL; + char* enb_ipv4_address_for_S1_MME = NULL; + char *address = NULL; + char *cidr = NULL; + + + 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 , MAX_ENB * sizeof(char*)); + + config_init(&cfg); + + /* 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); + } + + // Get list of active eNBs, (only these will be configured) + setting = config_lookup(&cfg, ENB_CONFIG_STRING_ACTIVE_ENBS); + + if (setting != NULL) { + num_enbs = config_setting_length(setting); + + for (i = 0; i < num_enbs; i++) { + setting_enb = config_setting_get_elem(setting, i); + active_enb[i] = config_setting_get_string (setting_enb); + AssertFatal (active_enb[i] != NULL, + "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]); + num_enb_properties += 1; + } + } + + /* Output a list of all eNBs. */ + setting = config_lookup(&cfg, ENB_CONFIG_STRING_ENB_LIST); + + if (setting != NULL) { + enb_properties_index = g_enb_properties.number; + parse_errors = 0; + num_enbs = config_setting_length(setting); + + for (i = 0; i < num_enbs; i++) { + setting_enb = config_setting_get_elem(setting, i); + + if (! config_setting_lookup_int(setting_enb, ENB_CONFIG_STRING_ENB_ID, &enb_id)) { + /* Calculate a default eNB ID */ +# if defined(ENABLE_USE_MME) + uint32_t hash; + + hash = et_s1ap_generate_eNB_id (); + enb_id = i + (hash & 0xFFFF8); +# else + enb_id = i; +# endif + } + + if ( !( config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_CELL_TYPE, &cell_type) + && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_ENB_NAME, &enb_name) + && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_TRACKING_AREA_CODE, &tac) + && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE, &mcc) + && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_NETWORK_CODE, &mnc) + + + ) + ) { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, %u th enb\n", + lib_config_file_name_pP, i); + continue; // FIXME this prevents segfaults below, not sure what happens after function exit + } + + // 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.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; + } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) { + g_enb_properties.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), + "BAD MNC DIGIT LENGTH %d", + g_enb_properties.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; + + for (j = 0; j < num_mme_address; j++) { + setting_mme_address = config_setting_get_elem(setting_mme_addresses, j); + + if ( !( + config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IPV4_ADDRESS, (const char **)&ipv4) + && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IPV6_ADDRESS, (const char **)&ipv6) + && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE, (const char **)&active) + && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE, (const char **)&preference) + ) + ) { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, %u th enb %u th mme address !\n", + lib_config_file_name_pP, i, j); + 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.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); + + if (strcmp(active, "yes") == 0) { + g_enb_properties.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; + } else if (strcmp(preference, "ipv6") == 0) { + g_enb_properties.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; + } + } + + + // NETWORK_INTERFACES + subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); + + if (subsetting != NULL) { + if ( ( + config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME, + (const char **)&enb_interface_name_for_S1_MME) + && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME, + (const char **)&enb_ipv4_address_for_S1_MME) + && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U, + (const char **)&enb_interface_name_for_S1U) + && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U, + (const char **)&enb_ipv4_address_for_S1U) + && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_ENB_PORT_FOR_S1U, + &enb_port_for_S1U) + ) + ) { + g_enb_properties.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" ); + } + + g_enb_properties.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); + 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" ); + } + } + } // 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; + + + 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" : ""); +} +/*------------------------------------------------------------------------------*/ +const Enb_properties_array_t *et_enb_config_get(void) +{ + return &g_enb_properties; +} /*------------------------------------------------------------------------------*/ uint32_t et_eNB_app_register(const Enb_properties_array_t *enb_properties) { uint32_t enb_id; uint32_t mme_id; MessageDef *msg_p; - uint32_t register_enb_pending = 0; char *str = NULL; struct in_addr addr; + g_scenario->register_enb_pending = 0; for (enb_id = 0; (enb_id < enb_properties->number) ; enb_id++) { { s1ap_register_enb_req_t *s1ap_register_eNB; @@ -318,7 +563,6 @@ uint32_t et_eNB_app_register(const Enb_properties_array_t *enb_properties) s1ap_register_eNB->mcc = enb_properties->properties[enb_id]->mcc; s1ap_register_eNB->mnc = enb_properties->properties[enb_id]->mnc; s1ap_register_eNB->mnc_digit_length = enb_properties->properties[enb_id]->mnc_digit_length; - s1ap_register_eNB->default_drx = enb_properties->properties[enb_id]->pcch_defaultPagingCycle[0]; s1ap_register_eNB->nb_mme = enb_properties->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, @@ -347,20 +591,16 @@ uint32_t et_eNB_app_register(const Enb_properties_array_t *enb_properties) itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); - register_enb_pending++; + g_scenario->register_enb_pending++; } } - return register_enb_pending; + return g_scenario->register_enb_pending; } /*------------------------------------------------------------------------------*/ void *et_eNB_app_task(void *args_p) { - const Enb_properties_array_t *enb_properties_p = NULL; - uint32_t register_enb_pending; - uint32_t registered_enb; - long enb_register_retry_timer_id; - uint32_t enb_id; + et_scenario_t *scenario = (et_scenario_t*)args_p; MessageDef *msg_p = NULL; const char *msg_name = NULL; instance_t instance; @@ -369,14 +609,6 @@ void *et_eNB_app_task(void *args_p) itti_mark_task_ready (TASK_ENB_APP); - enb_properties_p = enb_config_get(); - - - /* Try to register each eNB */ - registered_enb = 0; - register_enb_pending = et_eNB_app_register (enb_properties_p); - - do { // Wait for a message itti_receive_msg (TASK_ENB_APP, &msg_p); @@ -389,40 +621,40 @@ void *et_eNB_app_task(void *args_p) itti_exit_task (); break; - - case S1AP_REGISTER_ENB_CNF: LOG_I(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name, S1AP_REGISTER_ENB_CNF(msg_p).nb_mme); - DevAssert(register_enb_pending > 0); - register_enb_pending--; + DevAssert(g_scenario->register_enb_pending > 0); + g_scenario->register_enb_pending--; /* Check if at least eNB is registered with one MME */ if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) { - registered_enb++; + g_scenario->registered_enb++; } /* Check if all register eNB requests have been processed */ - if (register_enb_pending == 0) { - if (registered_enb == enb_properties_p->number) { + if (scenario->register_enb_pending == 0) { + if (scenario->registered_enb == scenario->enb_properties->number) { /* If all eNB are registered, start scenario */ - + et_event_t event; + event.code = ET_EVENT_S1C_CONNECTED; + et_scenario_fsm_notify_event(event); } else { - uint32_t not_associated = enb_properties_p->number - registered_enb; + uint32_t not_associated = scenario->enb_properties->number - scenario->registered_enb; LOG_W(ENB_APP, " %d eNB %s not associated with a MME, retrying registration in %d seconds ...\n", not_associated, not_associated > 1 ? "are" : "is", ET_ENB_REGISTER_RETRY_DELAY); /* Restart the eNB registration process in ENB_REGISTER_RETRY_DELAY seconds */ if (timer_setup (ET_ENB_REGISTER_RETRY_DELAY, 0, TASK_ENB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, - NULL, &enb_register_retry_timer_id) < 0) { + NULL, &scenario->enb_register_retry_timer_id) < 0) { LOG_E(ENB_APP, " Can not start eNB register retry timer, use \"sleep\" instead!\n"); sleep(ET_ENB_REGISTER_RETRY_DELAY); /* Restart the registration process */ - registered_enb = 0; - register_enb_pending = et_eNB_app_register (enb_properties_p); + scenario->registered_enb = 0; + scenario->register_enb_pending = et_eNB_app_register (scenario->enb_properties); } } } @@ -439,10 +671,10 @@ void *et_eNB_app_task(void *args_p) case TIMER_HAS_EXPIRED: LOG_I(ENB_APP, " Received %s: timer_id %d\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id); - if (TIMER_HAS_EXPIRED (msg_p).timer_id == enb_register_retry_timer_id) { + if (TIMER_HAS_EXPIRED (msg_p).timer_id == scenario->enb_register_retry_timer_id) { /* Restart the registration process */ - registered_enb = 0; - register_enb_pending = et_eNB_app_register (enb_properties_p); + scenario->registered_enb = 0; + scenario->register_enb_pending = et_eNB_app_register (scenario->enb_properties); } break; @@ -476,7 +708,7 @@ int et_play_scenario(et_scenario_t* const scenario) } // create ENB_APP ITTI task: not as same as eNB code - if (itti_create_task (TASK_ENB_APP, et_eNB_app_task, NULL) < 0) { + if (itti_create_task (TASK_ENB_APP, et_eNB_app_task, scenario) < 0) { LOG_E(ENB_APP, "Create task for ENB_APP failed\n"); return -1; } @@ -523,7 +755,6 @@ et_config_parse_opt_line ( { int option; int rv = 0; - const Enb_properties_array_t *enb_properties_p = NULL; enum long_option_e { LONG_OPTION_START = 0x100, /* Start after regular single char options */ @@ -606,7 +837,7 @@ et_config_parse_opt_line ( if (is_file_exists(*enb_config_file_name, "eNB config file") != GS_IS_FILE) { fprintf(stderr, "ERROR: original eNB config file name %s is not found in dir %s\n", *enb_config_file_name, *et_dir_name); } - enb_properties_p = enb_config_init(*enb_config_file_name); + et_enb_config_init(*enb_config_file_name); if (NULL == *scenario_file_name) { fprintf(stderr, "ERROR: please provide the scenario file name that should be in %s\n", *et_dir_name); diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 725b5abc0e..3a52c6a0b8 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -28,7 +28,7 @@ *******************************************************************************/ /* - et_scenario.h + play_scenario.h ------------------- AUTHOR : Lionel GAUTHIER COMPANY : EURECOM @@ -39,14 +39,121 @@ #define PLAY_SCENARIO_H_ # include # include +# include # include # include -#include "enb_config.h" +#include "S1AP-PDU.h" #include "s1ap_ies_defs.h" +#include "play_scenario_s1ap_eNB_defs.h" +#include "hashtable.h" -# define ET_ENB_REGISTER_RETRY_DELAY 3 +#define MAX_ENB 16 + +#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_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_SCTP_CONFIG "SCTP" +#define ENB_CONFIG_STRING_SCTP_INSTREAMS "SCTP_INSTREAMS" +#define ENB_CONFIG_STRING_SCTP_OUTSTREAMS "SCTP_OUTSTREAMS" + +#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_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U" + + +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; + +#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); + + +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; + + + + /* Physical parameters */ + + int16_t Nid_cell[1+MAX_NUM_CCs];// for testing, change later + /* 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[MAX_ENB]; +} Enb_properties_array_t; + +# define ET_ENB_REGISTER_RETRY_DELAY 3 +# define ET_FSM_STATE_WAITING_RX_EVENT_DELAY_SEC 15 typedef enum { ET_PACKET_STATUS_START = 0, @@ -54,19 +161,17 @@ typedef enum { ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT, ET_PACKET_STATUS_SCHEDULED_FOR_SENDING, ET_PACKET_STATUS_SENT, - ET_PACKET_STATUS_SENT_WITH_ERRORS, ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING, ET_PACKET_STATUS_RECEIVED, - ET_PACKET_STATUS_RECEIVED_WITH_ERRORS, ET_PACKET_STATUS_END } et_packet_status_t; typedef enum { ET_FSM_STATE_START = 0, ET_FSM_STATE_NULL = ET_FSM_STATE_START, - ET_FSM_STATE_CONNECTING_SCTP, - ET_FSM_STATE_WAITING_TX_EVENT, - ET_FSM_STATE_WAITING_RX_EVENT, + ET_FSM_STATE_CONNECTING_S1C, + ET_FSM_STATE_WAITING_EVENT, + ET_FSM_STATE_RUNNING, ET_FSM_STATE_END } et_fsm_state_t; @@ -136,6 +241,7 @@ typedef struct sctp_datahdr_s { uint16_t stream; uint16_t ssn; uint32_t ppid; + uint32_t assoc_id; // filled when running scenario et_s1ap_t payload; } sctp_datahdr_t; @@ -182,11 +288,15 @@ typedef struct et_packet_s { struct timeval time_relative_to_last_received_packet; unsigned int original_frame_number; unsigned int packet_number; + instance_t enb_instance; et_ip_hdr_t ip_hdr; et_sctp_hdr_t sctp_hdr; struct et_packet_s *next; + //scenario running vars et_packet_status_t status; + long timer_id; // ITTI timer id for waiting rx packets + struct timeval timestamp_packet; // timestamp when rx or tx packet }et_packet_t; @@ -203,24 +313,37 @@ typedef struct sctp_epoll_s { } thread_desc_t; typedef struct et_scenario_s { - xmlChar *name; - et_packet_t *list_packet; - + xmlChar *name; + et_packet_t *list_packet; + //-------------------------- // playing scenario - et_packet_t *waited_packet; - et_packet_t *current_packet; + //-------------------------- + Enb_properties_array_t *enb_properties; + uint32_t register_enb_pending; + uint32_t registered_enb; + long enb_register_retry_timer_id; + + pthread_mutex_t fsm_lock; + et_fsm_state_t fsm_state; + + hash_table_t *hash_mme2association_id; + hash_table_t *hash_old_ue_mme_id2ue_mme_id; + struct timeval time_last_tx_packet; + struct timeval time_last_rx_packet; + et_packet_t *last_rx_packet; + et_packet_t *last_tx_packet; + et_packet_t *next_packet; } et_scenario_t; typedef enum { ET_EVENT_START = 0, ET_EVENT_INIT = ET_EVENT_START, + ET_EVENT_S1C_CONNECTED, ET_EVENT_RX_SCTP_EVENT, ET_EVENT_RX_S1AP, - ET_EVENT_RX_X2AP, ET_EVENT_RX_PACKET_TIME_OUT, - ET_EVENT_TX_PACKET, - ET_EVENT_STOP, + ET_EVENT_TX_TIMED_PACKET, ET_EVENT_END } et_event_code_t; @@ -241,7 +364,8 @@ typedef struct et_event_s { union { et_event_init_t init; et_event_s1ap_data_ind_t s1ap_data_ind; - et_event_s1ap_data_req_t s1ap_data_req; + et_packet_t *tx_timed_packet; + et_packet_t *rx_packet_time_out; } u; } et_event_t; @@ -266,16 +390,36 @@ int et_s1ap_decode_unsuccessful_outcome(s1ap_message *message, S1ap_Unsuccessful int et_s1ap_decode_pdu(S1AP_PDU_t * const pdu, s1ap_message * const message, const uint8_t * const buffer, const uint32_t length); void et_decode_s1ap(et_s1ap_t * const s1ap); //------------------------- -void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind); +int et_s1ap_eNB_compare_assoc_id( struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2); +uint16_t et_s1ap_eNB_fetch_add_global_cnx_id(void); +void et_s1ap_eNB_prepare_internal_data(void); +void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p); +struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME(s1ap_eNB_instance_t *instance_p,int32_t assoc_id, uint16_t cnx_id); +s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance); +void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,uint32_t buffer_length, uint16_t stream); +void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind); +void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind); +void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, + net_ip_address_t *mme_ip_address, + net_ip_address_t *local_ip_addr, + uint16_t in_streams, + uint16_t out_streams); +void et_s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_shutdown); +void et_s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB); +void et_s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp); void * et_s1ap_eNB_task(void *arg); +//------------------------- int et_generate_xml_scenario( const char const * xml_in_dir_name, const char const * xml_in_scenario_filename, const char const * enb_config_filename, char const * tsml_out_scenario_filename); //------------------------- -int et_scenario_fsm_notify_event_state_null(et_event_t event); -int et_scenario_fsm_notify_event(et_event_t event); +et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event); +et_fsm_state_t et_scenario_fsm_notify_event_state_waiting(et_event_t event); +et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t event); +et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event); +et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event); //------------------------- void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * const s1ap); void et_parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t * const sctp_hdr); @@ -297,6 +441,8 @@ sctp_cid_t et_chunk_type_str2cid(const xmlChar * const chunk_type_str); const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type); et_packet_action_t et_action_str2et_action_t(const xmlChar * const action); void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip); +void et_enb_config_init(const char const * lib_config_file_name_pP); +const Enb_properties_array_t *et_enb_config_get(void); uint32_t et_eNB_app_register(const Enb_properties_array_t *enb_properties); void *et_eNB_app_task(void *args_p); int et_play_scenario(et_scenario_t* const scenario); diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index 6c73793f4d..8e59a98258 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -35,74 +35,322 @@ EMAIL : Lionel.Gauthier@eurecom.fr */ #include +#include #include "intertask_interface.h" #include "platform_types.h" #include "assertions.h" #include "play_scenario.h" +#include "s1ap_ies_defs.h" +#include "play_scenario_s1ap_eNB_defs.h" +#include "timer.h" - -et_scenario_t *g_scenario = NULL; -et_fsm_state_t g_fsm_state = ET_FSM_STATE_NULL; //------------------------------------------------------------------------------ -int et_scenario_fsm_notify_event_state_null(et_event_t event) +et_scenario_t *g_scenario = NULL; +//------------------------------------------------------------------------------ +int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b) +{ + struct timeval b2; + b2.tv_sec = b->tv_sec; + b2.tv_usec = b->tv_usec; + + /* Perform the carry for the later subtraction by updating y. */ + if (a->tv_usec < b2.tv_usec) { + int nsec = (b2.tv_usec - a->tv_usec) / 1000000 + 1; + b2.tv_usec -= 1000000 * nsec; + b2.tv_sec += nsec; + } + if (a->tv_usec - b2.tv_usec > 1000000) { + int nsec = (a->tv_usec - b2.tv_usec) / 1000000; + b2.tv_usec += 1000000 * nsec; + b2.tv_sec -= nsec; + } + + /* Compute the time remaining to wait. + tv_usec is certainly positive. */ + result->tv_sec = a->tv_sec - b2.tv_sec; + result->tv_usec = a->tv_usec - b2.tv_usec; + + /* Return 1 if result is negative. */ + return a->tv_sec < b2.tv_sec; +} + + +//------------------------------------------------------------------------------ +void et_scenario_wait_rx_packet(et_packet_t * const packet) +{ + if (timer_setup (ET_FSM_STATE_WAITING_RX_EVENT_DELAY_SEC, 0, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, + NULL, &packet->timer_id) < 0) { + AssertFatal(0, " Can not start waiting RX event timer\n"); + } + g_scenario->fsm_state = ET_FSM_STATE_WAITING_EVENT; + packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING; +} +//------------------------------------------------------------------------------ +void et_scenario_schedule_tx_packet(et_packet_t * const packet) +{ + s1ap_eNB_instance_t *s1ap_eNB_instance = NULL; + struct timeval now = { .tv_sec = 0, .tv_usec = 0 }; + struct timeval offset_last_tx_packet = { .tv_sec = 0, .tv_usec = 0 }; + struct timeval offset_last_rx_packet = { .tv_sec = 0, .tv_usec = 0 }; + struct timeval offset_tx_rx = { .tv_sec = 0, .tv_usec = 0 }; + struct timeval offset = { .tv_sec = 0, .tv_usec = 0 }; + int last_packet_was_tx = 0; + int we_are_too_early = 0; + + AssertFatal(NULL != packet, "packet argument is NULL"); + s1ap_eNB_instance = et_s1ap_eNB_get_instance(packet->enb_instance); + AssertFatal(NULL != s1ap_eNB_instance, "Cannot get s1ap_eNB_instance_t for eNB instance %d", packet->enb_instance); + + g_scenario->fsm_state = ET_FSM_STATE_WAITING_EVENT; + + switch (packet->sctp_hdr.chunk_type) { + case SCTP_CID_DATA: + // check if we can send it now + // TODO: BUG we have to discard in scenario all packets that cannot be processed (SACK, COOKIEs, etc) + AssertFatal(gettimeofday(&now, NULL) == 0, "gettimeofday failed"); + timeval_subtract(&offset_last_tx_packet,&now,&g_scenario->time_last_tx_packet); + timeval_subtract(&offset_last_rx_packet,&now,&g_scenario->time_last_rx_packet); + last_packet_was_tx = timeval_subtract(&offset_tx_rx,&offset_last_tx_packet,&offset_last_rx_packet); + if (last_packet_was_tx) { + we_are_too_early = timeval_subtract(&offset,&offset_last_tx_packet,&packet->time_relative_to_last_sent_packet); + } else { + we_are_too_early = timeval_subtract(&offset,&offset_last_rx_packet,&packet->time_relative_to_last_received_packet); + } + if (we_are_too_early > 0) { + // set timer + packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_SENDING; + if (timer_setup (offset.tv_sec, offset.tv_usec, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, + NULL, &packet->timer_id) < 0) { + AssertFatal(0, " Can not start TX event timer\n"); + } + // Done g_scenario->fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; + } else { + // send immediately + et_s1ap_eNB_itti_send_sctp_data_req( + packet->enb_instance, + packet->sctp_hdr.u.data_hdr.assoc_id, + packet->sctp_hdr.u.data_hdr.payload.binary_stream, + packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, + packet->sctp_hdr.u.data_hdr.stream); + packet->status = ET_PACKET_STATUS_SENT; + g_scenario->fsm_state = ET_FSM_STATE_RUNNING; + } + break; + case SCTP_CID_INIT: + case SCTP_CID_INIT_ACK: + AssertFatal(0, "Invalid case TX packet SCTP_CID_INIT or SCTP_CID_INIT_ACK"); + break; + default: + AssertFatal(0, "Invalid case TX packet SCTP_CID %d", packet->sctp_hdr.chunk_type); + } +} +//------------------------------------------------------------------------------ +et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) { - et_packet_t *packet = NULL; - const Enb_properties_array_t *enb_properties_p = NULL; - uint32_t register_enb_pending; switch (event.code){ - case ET_EVENT_INIT: - AssertFatal(NULL == g_scenario, "Current scenario not ended"); - g_scenario = event.u.init.scenario; - packet = g_scenario->list_packet; - while (NULL != packet) { - switch (packet->sctp_hdr.chunk_type) { + case ET_EVENT_RX_PACKET_TIME_OUT: + AssertFatal(0, "Event ET_EVENT_RX_PACKET_TIME_OUT not handled in FSM state ET_FSM_STATE_RUNNING"); + break; + case ET_EVENT_TX_TIMED_PACKET: + AssertFatal(0, "Event ET_EVENT_TX_TIMED_PACKET not handled in FSM state ET_FSM_STATE_RUNNING"); + break; + case ET_EVENT_RX_S1AP: + AssertFatal(0, "TODO"); + break; + default: + AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_RUNNING", event.code); + } + pthread_mutex_unlock(&g_scenario->fsm_lock); + return 0; +} +//------------------------------------------------------------------------------ +et_fsm_state_t et_scenario_fsm_notify_event_state_waiting(et_event_t event) +{ + + switch (event.code){ + case ET_EVENT_RX_PACKET_TIME_OUT: + fprintf(stderr, "Error The following packet is not received:\n"); + et_display_packet(event.u.rx_packet_time_out); + AssertFatal(0, "Waited packet not received"); + break; + case ET_EVENT_RX_S1AP: + et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); + break; + case ET_EVENT_TX_TIMED_PACKET: + // send immediately + et_s1ap_eNB_itti_send_sctp_data_req( + event.u.tx_timed_packet->enb_instance, + event.u.tx_timed_packet->sctp_hdr.u.data_hdr.assoc_id, + event.u.tx_timed_packet->sctp_hdr.u.data_hdr.payload.binary_stream, + event.u.tx_timed_packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, + event.u.tx_timed_packet->sctp_hdr.u.data_hdr.stream); + event.u.tx_timed_packet->status = ET_PACKET_STATUS_SENT; + g_scenario->fsm_state = ET_FSM_STATE_RUNNING; + break; + + + default: + AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING", event.code); + } + pthread_mutex_unlock(&g_scenario->fsm_lock); + return 0; +} + +//------------------------------------------------------------------------------ +et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t event) +{ + + switch (event.code){ + case ET_EVENT_S1C_CONNECTED: + // hack simulate we have been able to get the right timing values + AssertFatal(gettimeofday(&g_scenario->time_last_tx_packet, NULL) == 0, "gettimeofday failed"); + AssertFatal(gettimeofday(&g_scenario->time_last_rx_packet, NULL) == 0, "gettimeofday failed"); + + while (NULL != g_scenario->next_packet) { + switch (g_scenario->next_packet->sctp_hdr.chunk_type) { case SCTP_CID_DATA : // no init in this scenario, may be sub-scenario - if (packet->action == ET_PACKET_ACTION_S1C_SEND) { - } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - g_scenario->waited_packet = packet; + if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { + et_scenario_schedule_tx_packet(g_scenario->next_packet); + pthread_mutex_unlock(&g_scenario->fsm_lock); + return g_scenario->fsm_state; + } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { + g_scenario->last_rx_packet = g_scenario->next_packet; + g_scenario->next_packet = g_scenario->next_packet->next; + g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet; + g_scenario->next_packet = g_scenario->next_packet->next; + + } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) { + et_scenario_wait_rx_packet(g_scenario->next_packet); + pthread_mutex_unlock(&g_scenario->fsm_lock); + return g_scenario->fsm_state; + } else { + AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status); + } } else { - packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; - packet = packet->next; + AssertFatal(0, "Invalid packet action %d", g_scenario->next_packet->action); } - break; + break; + case SCTP_CID_INIT: case SCTP_CID_INIT_ACK: - enb_properties_p = enb_config_get(); - /* Try to register each eNB */ - g_fsm_state = ET_FSM_STATE_CONNECTING_SCTP; - register_enb_pending = et_eNB_app_register (enb_properties_p); - break; case SCTP_CID_HEARTBEAT: case SCTP_CID_HEARTBEAT_ACK: case SCTP_CID_COOKIE_ECHO: case SCTP_CID_COOKIE_ACK: case SCTP_CID_ECN_ECNE: case SCTP_CID_ECN_CWR: - packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; - packet = packet->next; + g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; + g_scenario->next_packet = g_scenario->next_packet->next; break; + case SCTP_CID_ABORT: case SCTP_CID_SHUTDOWN: case SCTP_CID_SHUTDOWN_ACK: case SCTP_CID_ERROR: case SCTP_CID_SHUTDOWN_COMPLETE: - AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)", et_chunk_type_cid2str(packet->sctp_hdr.chunk_type)); + AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)", + et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type)); break; default: - packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; - packet = packet->next; + g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; + g_scenario->next_packet = g_scenario->next_packet->next; } } fprintf(stderr, "No Packet found in this scenario: %s\n", g_scenario->name); - return -1; + g_scenario->fsm_state = ET_FSM_STATE_NULL; + pthread_mutex_unlock(&g_scenario->fsm_lock); + return g_scenario->fsm_state; break; - case ET_EVENT_STOP: + default: + AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_CONNECTING_S1C", event.code); + } + pthread_mutex_unlock(&g_scenario->fsm_lock); + return 0; +} +//------------------------------------------------------------------------------ +et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) +{ + switch (event.code){ + case ET_EVENT_INIT: + AssertFatal(NULL == g_scenario, "Current scenario not ended"); + g_scenario = event.u.init.scenario; + g_scenario->next_packet = g_scenario->list_packet; + while (NULL != g_scenario->next_packet) { + switch (g_scenario->next_packet->sctp_hdr.chunk_type) { + + case SCTP_CID_DATA : + // no init in this scenario, may be sub-scenario + if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { + et_scenario_schedule_tx_packet(g_scenario->next_packet); + pthread_mutex_unlock(&g_scenario->fsm_lock); + return g_scenario->fsm_state; + } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { + g_scenario->last_rx_packet = g_scenario->next_packet; + g_scenario->next_packet = g_scenario->next_packet->next; + g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet; + g_scenario->next_packet = g_scenario->next_packet->next; + + } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) { + et_scenario_wait_rx_packet(g_scenario->next_packet); + pthread_mutex_unlock(&g_scenario->fsm_lock); + return g_scenario->fsm_state; + } else { + AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status); + } + } else { + AssertFatal(0, "Invalid packet action %d", g_scenario->next_packet->action); + } + break; + + case SCTP_CID_INIT: + case SCTP_CID_INIT_ACK: + g_scenario->enb_properties = (Enb_properties_array_t *)et_enb_config_get(); + g_scenario->hash_old_ue_mme_id2ue_mme_id = hashtable_create (256,NULL,NULL); + g_scenario->hash_mme2association_id = hashtable_create (256,NULL,NULL); + // Try to register each eNB + g_scenario->registered_enb = 0; + g_scenario->fsm_state = ET_FSM_STATE_CONNECTING_S1C; + g_scenario->register_enb_pending = et_eNB_app_register (g_scenario->enb_properties); + pthread_mutex_unlock(&g_scenario->fsm_lock); + return g_scenario->fsm_state; + break; + + case SCTP_CID_HEARTBEAT: + case SCTP_CID_HEARTBEAT_ACK: + case SCTP_CID_COOKIE_ECHO: + case SCTP_CID_COOKIE_ACK: + case SCTP_CID_ECN_ECNE: + case SCTP_CID_ECN_CWR: + g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; + g_scenario->next_packet = g_scenario->next_packet->next; + break; + + case SCTP_CID_ABORT: + case SCTP_CID_SHUTDOWN: + case SCTP_CID_SHUTDOWN_ACK: + case SCTP_CID_ERROR: + case SCTP_CID_SHUTDOWN_COMPLETE: + AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)", + et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type)); + break; + + default: + g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; + g_scenario->next_packet = g_scenario->next_packet->next; + } + } + fprintf(stderr, "No Useful packet found in this scenario: %s\n", g_scenario->name); + g_scenario->fsm_state = ET_FSM_STATE_NULL; + pthread_mutex_unlock(&g_scenario->fsm_lock); + return g_scenario->fsm_state; break; default: @@ -112,16 +360,19 @@ int et_scenario_fsm_notify_event_state_null(et_event_t event) } //------------------------------------------------------------------------------ -int et_scenario_fsm_notify_event(et_event_t event) +et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event) { AssertFatal((event.code >= ET_EVENT_START) && (event.code < ET_EVENT_END), "Unknown et_event_t.code %d", event.code); - switch (g_fsm_state){ + pthread_mutex_lock(&g_scenario->fsm_lock); + switch (g_scenario->fsm_state){ case ET_FSM_STATE_NULL: return et_scenario_fsm_notify_event_state_null(event); break; - case ET_FSM_STATE_CONNECTING_SCTP: return et_scenario_fsm_notify_event_state_null(event); break; - case ET_FSM_STATE_WAITING_TX_EVENT: return et_scenario_fsm_notify_event_state_null(event); break; - case ET_FSM_STATE_WAITING_RX_EVENT: return et_scenario_fsm_notify_event_state_null(event); break; + case ET_FSM_STATE_CONNECTING_S1C: return et_scenario_fsm_notify_event_state_connecting_s1c(event); break; + case ET_FSM_STATE_WAITING_EVENT: return et_scenario_fsm_notify_event_state_waiting(event); break; + case ET_FSM_STATE_RUNNING: return et_scenario_fsm_notify_event_state_running(event); break; default: - return -1; + AssertFatal(0, "Case fsm_state %d not handled", g_scenario->fsm_state); } + pthread_mutex_unlock(&g_scenario->fsm_lock); + return g_scenario->fsm_state; } diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index 236c17963a..f6d8aa73ac 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -47,17 +47,19 @@ #include #include #include +#include +#include +#include #include "intertask_interface.h" #include "platform_types.h" -#include "enb_config.h" #include "assertions.h" #include "play_scenario.h" //------------------------------------------------------------------------------ #define ENB_CONFIG_MAX_XSLT_PARAMS 32 //------------------------------------------------------------------------------ extern char *g_openair_dir; -extern Enb_properties_array_t enb_properties; +extern Enb_properties_array_t g_enb_properties; //------------------------------------------------------------------------------ void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * const s1ap) { @@ -407,6 +409,10 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { } xmlFree(xml_char); } + } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"eNB.instance"))) { + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); + packet->enb_instance = strtoul((const char *)xml_char, NULL, 0); + xmlFree(xml_char); } //} } @@ -439,8 +445,11 @@ et_scenario_t* et_generate_scenario( if ((!xmlStrcmp(root->name, (const xmlChar *)"scenario"))) { xml_char = xmlGetProp(root, (const xmlChar *)"name"); printf("scenario name: %s\n", xml_char); - scenario = calloc(1, sizeof(*scenario)); - scenario->name = xml_char; // nodup nofree + scenario = calloc(1, sizeof(*scenario)); + scenario->name = xml_char; // nodup nofree + scenario->fsm_state = ET_FSM_STATE_NULL; + pthread_mutex_init(&scenario->fsm_lock, NULL); + next_packet = &scenario->list_packet; for (node = root->children; node != NULL; node = node->next) { if ((!xmlStrcmp(node->name, (const xmlChar *)"packet"))) { @@ -509,21 +518,21 @@ int et_generate_xml_scenario( fprintf(stdout, "Test scenario file: %s\n", xml_in_scenario_filename); } - for (i = 0; i < enb_properties.number; i++) { + for (i = 0; i < g_enb_properties.number; i++) { // eNB S1-C IPv4 address sprintf(astring, "enb_s1c%d", i); params[nb_params++] = strdup(astring); - addr.s_addr = enb_properties.properties[i]->enb_ipv4_address_for_S1_MME; + addr.s_addr = g_enb_properties.properties[i]->enb_ipv4_address_for_S1_MME; sprintf(astring, "\"%s\"", inet_ntoa(addr)); params[nb_params++] = strdup(astring); // MME S1-C IPv4 address - for (j = 0; j < enb_properties.properties[i]->nb_mme; j++) { + for (j = 0; j < g_enb_properties.properties[i]->nb_mme; j++) { sprintf(astring, "mme_s1c%d_%d", i, j); params[nb_params++] = strdup(astring); - AssertFatal (enb_properties.properties[i]->mme_ip_address[j].ipv4_address, + AssertFatal (g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address, "Only support MME IPv4 address\n"); - sprintf(astring, "\"%s\"", enb_properties.properties[i]->mme_ip_address[j].ipv4_address); + sprintf(astring, "\"%s\"", g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address); params[nb_params++] = strdup(astring); } } diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index cb5571c28b..7dd80904ae 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -38,29 +38,173 @@ #include #include #include +#include +#include #include "tree.h" #include "queue.h" #include "intertask_interface.h" -#include "messages_types.h" +#include "timer.h" #include "platform_types.h" -#include "s1ap_common.h" -#include "s1ap_eNB_defs.h" -#include "s1ap_eNB_default_values.h" -#include "s1ap_eNB_management_procedures.h" -#include "s1ap_eNB.h" -#include "play_scenario.h" -#include "msc.h" #include "assertions.h" #include "conversions.h" +#include "s1ap_common.h" +#include "play_scenario_s1ap_eNB_defs.h" +#include "play_scenario.h" +#include "msc.h" +//------------------------------------------------------------------------------ +s1ap_eNB_internal_data_t s1ap_eNB_internal_data; +RB_GENERATE(s1ap_mme_map, s1ap_eNB_mme_data_s, entry, et_s1ap_eNB_compare_assoc_id); +//------------------------------------------------------------------------------ +extern et_scenario_t *g_scenario; +//------------------------------------------------------------------------------ +int et_s1ap_eNB_compare_assoc_id( + struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2) +{ + if (p1->assoc_id == -1) { + if (p1->cnx_id < p2->cnx_id) { + return -1; + } + if (p1->cnx_id > p2->cnx_id) { + return 1; + } + } else { + if (p1->assoc_id < p2->assoc_id) { + return -1; + } + + if (p1->assoc_id > p2->assoc_id) { + return 1; + } + } + + /* Matching reference */ + return 0; +} +//------------------------------------------------------------------------------ +uint32_t et_s1ap_generate_eNB_id(void) +{ + char *out; + char hostname[50]; + int ret; + uint32_t eNB_id; + + /* Retrieve the host name */ + ret = gethostname(hostname, sizeof(hostname)); + DevAssert(ret == 0); + + out = crypt(hostname, "eurecom"); + DevAssert(out != NULL); + + eNB_id = ((out[0] << 24) | (out[1] << 16) | (out[2] << 8) | out[3]); + + return eNB_id; +} +//------------------------------------------------------------------------------ +uint16_t et_s1ap_eNB_fetch_add_global_cnx_id(void) +{ + return ++s1ap_eNB_internal_data.global_cnx_id; +} //------------------------------------------------------------------------------ -extern void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp); -extern void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB); +void et_s1ap_eNB_prepare_internal_data(void) +{ + memset(&s1ap_eNB_internal_data, 0, sizeof(s1ap_eNB_internal_data)); + STAILQ_INIT(&s1ap_eNB_internal_data.s1ap_eNB_instances_head); +} + //------------------------------------------------------------------------------ -void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind) +void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p) +{ + DevAssert(new_instance_p != NULL); + + STAILQ_INSERT_TAIL(&s1ap_eNB_internal_data.s1ap_eNB_instances_head, + new_instance_p, s1ap_eNB_entries); +} + +//------------------------------------------------------------------------------ +struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME( + s1ap_eNB_instance_t *instance_p, + int32_t assoc_id, uint16_t cnx_id) +{ + struct s1ap_eNB_mme_data_s temp; + struct s1ap_eNB_mme_data_s *found; + + memset(&temp, 0, sizeof(struct s1ap_eNB_mme_data_s)); + + temp.assoc_id = assoc_id; + temp.cnx_id = cnx_id; + + if (instance_p == NULL) { + STAILQ_FOREACH(instance_p, &s1ap_eNB_internal_data.s1ap_eNB_instances_head, + s1ap_eNB_entries) { + found = RB_FIND(s1ap_mme_map, &instance_p->s1ap_mme_head, &temp); + + if (found != NULL) { + return found; + } + } + } else { + return RB_FIND(s1ap_mme_map, &instance_p->s1ap_mme_head, &temp); + } + + return NULL; +} + +//------------------------------------------------------------------------------ +s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance) +{ + s1ap_eNB_instance_t *temp = NULL; + + STAILQ_FOREACH(temp, &s1ap_eNB_internal_data.s1ap_eNB_instances_head, + s1ap_eNB_entries) { + if (temp->instance == instance) { + /* Matching occurence */ + return temp; + } + } + + return NULL; +} +//------------------------------------------------------------------------------ +void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer, + uint32_t buffer_length, uint16_t stream) +{ + MessageDef *message_p; + sctp_data_req_t *sctp_data_req; + + message_p = itti_alloc_new_message(TASK_S1AP, SCTP_DATA_REQ); + + sctp_data_req = &message_p->ittiMsg.sctp_data_req; + + sctp_data_req->assoc_id = assoc_id; + sctp_data_req->buffer = buffer; + sctp_data_req->buffer_length = buffer_length; + sctp_data_req->stream = stream; + + itti_send_msg_to_task(TASK_SCTP, instance, message_p); +} +//------------------------------------------------------------------------------ +void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind) +{ + et_packet_t * packet = NULL; + unsigned long int not_found = 1; + + packet = g_scenario->next_packet; + // not_found threshold may sure depend on number of mme, may be not sure on number of UE + while ((NULL != packet) && (not_found < 5)) { + if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + //TODO + } + not_found += 1; + packet = packet->next; + } +} + +//------------------------------------------------------------------------------ +void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind) { int result = 0; et_event_t event; @@ -73,7 +217,8 @@ void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind) event.u.s1ap_data_ind.sctp_datahdr.tsn = 0; event.u.s1ap_data_ind.sctp_datahdr.stream = sctp_data_ind->stream; event.u.s1ap_data_ind.sctp_datahdr.ssn = 0; - event.u.s1ap_data_ind.sctp_datahdr.ppid = 18; // find constant + event.u.s1ap_data_ind.sctp_datahdr.ppid = S1AP_SCTP_PPID; + event.u.s1ap_data_ind.sctp_datahdr.assoc_id = sctp_data_ind->assoc_id; event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_pos = 0; event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_allocated_size = sctp_data_ind->buffer_length; @@ -100,6 +245,253 @@ void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind) et_scenario_fsm_notify_event(event); } +//------------------------------------------------------------------------------ +void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, + net_ip_address_t *mme_ip_address, + net_ip_address_t *local_ip_addr, + uint16_t in_streams, + uint16_t out_streams) +{ + MessageDef *message_p = NULL; + sctp_new_association_req_t *sctp_new_association_req_p = NULL; + s1ap_eNB_mme_data_t *s1ap_mme_data_p = NULL; + + DevAssert(instance_p != NULL); + DevAssert(mme_ip_address != NULL); + + message_p = itti_alloc_new_message(TASK_S1AP, SCTP_NEW_ASSOCIATION_REQ); + + sctp_new_association_req_p = &message_p->ittiMsg.sctp_new_association_req; + + sctp_new_association_req_p->port = S1AP_PORT_NUMBER; + sctp_new_association_req_p->ppid = S1AP_SCTP_PPID; + + sctp_new_association_req_p->in_streams = in_streams; + sctp_new_association_req_p->out_streams = out_streams; + + memcpy(&sctp_new_association_req_p->remote_address, + mme_ip_address, + sizeof(*mme_ip_address)); + + memcpy(&sctp_new_association_req_p->local_address, + local_ip_addr, + sizeof(*local_ip_addr)); + + /* Create new MME descriptor */ + s1ap_mme_data_p = calloc(1, sizeof(*s1ap_mme_data_p)); + DevAssert(s1ap_mme_data_p != NULL); + + s1ap_mme_data_p->cnx_id = et_s1ap_eNB_fetch_add_global_cnx_id(); + sctp_new_association_req_p->ulp_cnx_id = s1ap_mme_data_p->cnx_id; + + s1ap_mme_data_p->assoc_id = -1; + s1ap_mme_data_p->s1ap_eNB_instance = instance_p; + + memcpy((void*)&s1ap_mme_data_p->mme_net_ip_address, mme_ip_address, sizeof(*mme_ip_address)); + + + STAILQ_INIT(&s1ap_mme_data_p->served_gummei); + + /* Insert the new descriptor in list of known MME + * but not yet associated. + */ + RB_INSERT(s1ap_mme_map, &instance_p->s1ap_mme_head, s1ap_mme_data_p); + s1ap_mme_data_p->state = S1AP_ENB_STATE_WAITING; + instance_p->s1ap_mme_nb ++; + instance_p->s1ap_mme_pending_nb ++; + + itti_send_msg_to_task(TASK_SCTP, instance_p->instance, message_p); +} +//------------------------------------------------------------------------------ +void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, + struct s1ap_eNB_instance_s * const s1ap_eNB_instance, + s1ap_eNB_mme_data_t * const mme_desc_p) +{ + et_packet_t *packet = NULL; + struct in6_addr s1c_mme_ipv6 = IN6ADDR_ANY_INIT; + in_addr_t s1c_mme_ipv4 = INADDR_ANY; + struct in6_addr s1c_enb_ipv6 = IN6ADDR_ANY_INIT; + in_addr_t s1c_enb_ipv4 = INADDR_ANY; + + packet = g_scenario->next_packet; + while (NULL != packet) { + switch (packet->sctp_hdr.chunk_type) { + + case SCTP_CID_DATA : + if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { + // TODO compare addresses and ports + if (packet->ip_hdr.dst) + packet->sctp_hdr.dst_port == 0; + packet->sctp_hdr.src_port == 0; + + } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + } + break; + + case SCTP_CID_INIT: + case SCTP_CID_INIT_ACK: + case SCTP_CID_HEARTBEAT: + case SCTP_CID_HEARTBEAT_ACK: + case SCTP_CID_COOKIE_ECHO: + case SCTP_CID_COOKIE_ACK: + case SCTP_CID_ECN_ECNE: + case SCTP_CID_ECN_CWR: + break; + + case SCTP_CID_ABORT: + case SCTP_CID_SHUTDOWN: + case SCTP_CID_SHUTDOWN_ACK: + case SCTP_CID_ERROR: + case SCTP_CID_SHUTDOWN_COMPLETE: + //TODO + break; + + default: + ; + } + packet = packet->next; + } +} +//------------------------------------------------------------------------------ +void et_s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_shutdown) +{ + if (sctp_shutdown) { + /* A previously connected MME has been shutdown */ + + /* TODO check if it was used by some eNB and send a message to inform these eNB if there is no more associated MME */ + if (mme_desc_p->state == S1AP_ENB_STATE_CONNECTED) { + mme_desc_p->state = S1AP_ENB_STATE_DISCONNECTED; + + if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb > 0) { + /* Decrease associated MME number */ + mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb --; + } + + /* If there are no more associated MME, inform eNB app */ + if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb == 0) { + MessageDef *message_p; + + message_p = itti_alloc_new_message(TASK_S1AP, S1AP_DEREGISTERED_ENB_IND); + S1AP_DEREGISTERED_ENB_IND(message_p).nb_mme = 0; + itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p); + } + } + } else { + /* Check that at least one setup message is pending */ + DevCheck(mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0, mme_desc_p->s1ap_eNB_instance->instance, + mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb, 0); + + if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0) { + /* Decrease pending messages number */ + mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb --; + } + + et_s1ap_update_assoc_id_of_packets(mme_desc_p->assoc_id, + mme_desc_p->s1ap_eNB_instance, + mme_desc_p); + + /* If there are no more pending messages, inform eNB app */ + if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb == 0) { + MessageDef *message_p; + + message_p = itti_alloc_new_message(TASK_S1AP, S1AP_REGISTER_ENB_CNF); + S1AP_REGISTER_ENB_CNF(message_p).nb_mme = mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb; + itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p); + } + } +} +//------------------------------------------------------------------------------ +void et_s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB) +{ + s1ap_eNB_instance_t *new_instance; + uint8_t index; + + DevAssert(s1ap_register_eNB != NULL); + + /* Look if the provided instance already exists */ + new_instance = et_s1ap_eNB_get_instance(instance); + + if (new_instance != NULL) { + /* Checks if it is a retry on the same eNB */ + DevCheck(new_instance->eNB_id == s1ap_register_eNB->eNB_id, new_instance->eNB_id, s1ap_register_eNB->eNB_id, 0); + DevCheck(new_instance->cell_type == s1ap_register_eNB->cell_type, new_instance->cell_type, s1ap_register_eNB->cell_type, 0); + DevCheck(new_instance->tac == s1ap_register_eNB->tac, new_instance->tac, s1ap_register_eNB->tac, 0); + DevCheck(new_instance->mcc == s1ap_register_eNB->mcc, new_instance->mcc, s1ap_register_eNB->mcc, 0); + DevCheck(new_instance->mnc == s1ap_register_eNB->mnc, new_instance->mnc, s1ap_register_eNB->mnc, 0); + DevCheck(new_instance->mnc_digit_length == s1ap_register_eNB->mnc_digit_length, new_instance->mnc_digit_length, s1ap_register_eNB->mnc_digit_length, 0); + } else { + new_instance = calloc(1, sizeof(s1ap_eNB_instance_t)); + DevAssert(new_instance != NULL); + + RB_INIT(&new_instance->s1ap_ue_head); + RB_INIT(&new_instance->s1ap_mme_head); + + /* Copy usefull parameters */ + new_instance->instance = instance; + new_instance->eNB_name = s1ap_register_eNB->eNB_name; + new_instance->eNB_id = s1ap_register_eNB->eNB_id; + new_instance->cell_type = s1ap_register_eNB->cell_type; + new_instance->tac = s1ap_register_eNB->tac; + new_instance->mcc = s1ap_register_eNB->mcc; + new_instance->mnc = s1ap_register_eNB->mnc; + new_instance->mnc_digit_length = s1ap_register_eNB->mnc_digit_length; + + /* Add the new instance to the list of eNB (meaningfull in virtual mode) */ + et_s1ap_eNB_insert_new_instance(new_instance); + + S1AP_DEBUG("Registered new eNB[%d] and %s eNB id %u\n", + instance, + s1ap_register_eNB->cell_type == CELL_MACRO_ENB ? "macro" : "home", + s1ap_register_eNB->eNB_id); + } + + DevCheck(s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, + S1AP_MAX_NB_MME_IP_ADDRESS, s1ap_register_eNB->nb_mme, 0); + + /* Trying to connect to provided list of MME ip address */ + for (index = 0; index < s1ap_register_eNB->nb_mme; index++) { + et_s1ap_eNB_register_mme(new_instance, + &s1ap_register_eNB->mme_ip_address[index], + &s1ap_register_eNB->enb_ip_address, + s1ap_register_eNB->sctp_in_streams, + s1ap_register_eNB->sctp_out_streams); + } +} + +//------------------------------------------------------------------------------ +void et_s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) +{ + s1ap_eNB_instance_t *instance_p = NULL; + s1ap_eNB_mme_data_t *s1ap_mme_data_p = NULL; + + DevAssert(sctp_new_association_resp != NULL); + + instance_p = et_s1ap_eNB_get_instance(instance); + DevAssert(instance_p != NULL); + + s1ap_mme_data_p = et_s1ap_eNB_get_MME(instance_p, -1, + sctp_new_association_resp->ulp_cnx_id); + DevAssert(s1ap_mme_data_p != NULL); + + if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) { + S1AP_WARN("Received unsuccessful result for SCTP association (%u), instance %d, cnx_id %u\n", + sctp_new_association_resp->sctp_state, + instance, + sctp_new_association_resp->ulp_cnx_id); + + et_s1ap_handle_s1_setup_message(s1ap_mme_data_p, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN); + + return; + } + + /* Update parameters */ + s1ap_mme_data_p->assoc_id = sctp_new_association_resp->assoc_id; + s1ap_mme_data_p->in_streams = sctp_new_association_resp->in_streams; + s1ap_mme_data_p->out_streams = sctp_new_association_resp->out_streams; + + et_s1ap_handle_s1_setup_message(s1ap_mme_data_p, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN); +} + //------------------------------------------------------------------------------ void *et_s1ap_eNB_task(void *arg) { @@ -108,7 +500,7 @@ void *et_s1ap_eNB_task(void *arg) S1AP_DEBUG("Starting S1AP layer\n"); - s1ap_eNB_prepare_internal_data(); + et_s1ap_eNB_prepare_internal_data(); itti_mark_task_ready(TASK_S1AP); MSC_START_USE(); @@ -127,13 +519,13 @@ void *et_s1ap_eNB_task(void *arg) * Each eNB has to send an S1AP_REGISTER_ENB message with its * own parameters. */ - s1ap_eNB_handle_register_eNB(ITTI_MESSAGE_GET_INSTANCE(received_msg), + et_s1ap_eNB_handle_register_eNB(ITTI_MESSAGE_GET_INSTANCE(received_msg), &S1AP_REGISTER_ENB_REQ(received_msg)); } break; case SCTP_NEW_ASSOCIATION_RESP: { - s1ap_eNB_handle_sctp_association_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg), + et_s1ap_eNB_handle_sctp_association_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg), &received_msg->ittiMsg.sctp_new_association_resp); } break; @@ -143,6 +535,31 @@ void *et_s1ap_eNB_task(void *arg) } break; + case TIMER_HAS_EXPIRED: + LOG_I(S1AP, " Received TIMER_HAS_EXPIRED: timer_id %d\n", TIMER_HAS_EXPIRED(received_msg).timer_id); + { + et_packet_t * packet = (et_packet_t*)TIMER_HAS_EXPIRED (received_msg).arg; + et_event_t event; + if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING) { + memset((void*)&event, 0, sizeof(event)); + event.code = ET_EVENT_RX_PACKET_TIME_OUT; + event.u.rx_packet_time_out = packet; + et_scenario_fsm_notify_event(event); + } else if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_SENDING) { + memset((void*)&event, 0, sizeof(event)); + event.code = ET_EVENT_TX_TIMED_PACKET; + event.u.tx_timed_packet = packet; + et_scenario_fsm_notify_event(event); + } else if ((packet->status != ET_PACKET_STATUS_SENT) && ((packet->status != ET_PACKET_STATUS_RECEIVED))) { + AssertFatal (0, "Bad status %d of packet timed out!\n", packet->status); + } + } + if (TIMER_HAS_EXPIRED (received_msg).timer_id == g_scenario->enb_register_retry_timer_id) { + /* Restart the registration process */ + g_scenario->registered_enb = 0; + g_scenario->register_enb_pending = et_eNB_app_register (g_scenario->enb_properties); + } + break; default: S1AP_ERROR("Received unhandled message: %d:%s\n", diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h new file mode 100644 index 0000000000..ac77b88b24 --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h @@ -0,0 +1,250 @@ +/******************************************************************************* + 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 . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. + + *******************************************************************************/ + +#include + +#include "queue.h" +#include "tree.h" + +#include "sctp_eNB_defs.h" + +#ifndef PLAY_SCENARIO_S1AP_ENB_DEFS_H_ +#define PLAY_SCENARIO_S1AP_ENB_DEFS_H_ + +#define ENB_TAC (1) +#define ENB_MCC (208) +#define ENB_MNC (92) + +#define ENB_NAME "Eurecom ENB" +#define ENB_NAME_FORMAT (ENB_NAME" %u") + +#define S1AP_PORT_NUMBER (36412) +#define S1AP_SCTP_PPID (18) + +#define X2AP_PORT_NUMBER (36422) +#define X2AP_SCTP_PPID (27) + +#define S1AP_ENB_NAME_LENGTH_MAX (150) + +typedef enum { + /* Disconnected state: initial state for any association. */ + S1AP_ENB_STATE_DISCONNECTED = 0x0, + /* State waiting for S1 Setup response message if eNB is MME accepted or + * S1 Setup failure if MME rejects the eNB. + */ + S1AP_ENB_STATE_WAITING = 0x1, + /* The eNB is successfully connected to MME, UE contexts can be created. */ + S1AP_ENB_STATE_CONNECTED = 0x2, + /* The MME has sent an overload start message. Once the MME disables the + * OVERLOAD marker, the state of the association will be + * S1AP_ENB_STATE_CONNECTED. + */ + S1AP_ENB_OVERLOAD = 0x3, + /* Max number of states available */ + S1AP_ENB_STATE_MAX, +} s1ap_eNB_state_t; + + +/* If the Overload Action IE in the OVERLOAD START message is set to + * - “reject all RRC connection establishments for non-emergency mobile + * originated data transfer “ (i.e. reject traffic corresponding to RRC cause + * “mo-data “ (TS 36.331 [16])), or + * - “reject all RRC connection establishments for signalling “ (i.e. reject + * traffic corresponding to RRC cause “modata” and “mo-signalling” + * (TS 36.331 [16])),or + * - “only permit RRC connection establishments for emergency sessions and + * mobile terminated services” (i.e. only permit traffic corresponding to RRC + * cause “emergency” and “mt-Access” (TS 36.331 [16])). + * + * NOTE: When the Overload Action IE is set to “only permit RRC connection + * establishments for emergency sessions and mobile terminated services”, + * emergency calls with RRC cause “highPriorityAcess” from high priority users + * are rejected (TS 24.301 [24]). + */ +typedef enum { + S1AP_OVERLOAD_REJECT_MO_DATA = 0x0, + S1AP_OVERLOAD_REJECT_ALL_SIGNALLING = 0x1, + S1AP_OVERLOAD_ONLY_EMERGENCY_AND_MT = 0x2, + S1AP_NO_OVERLOAD = 0x3, + S1AP_OVERLOAD_MAX, +} s1ap_overload_state_t; + +/* Served PLMN identity element */ +struct plmn_identity_s { + uint16_t mcc; + uint16_t mnc; + uint8_t mnc_digit_length; + STAILQ_ENTRY(plmn_identity_s) next; +}; + +/* Served group id element */ +struct served_group_id_s { + uint16_t mme_group_id; + STAILQ_ENTRY(served_group_id_s) next; +}; + +/* Served mme code for a particular MME */ +struct mme_code_s { + uint8_t mme_code; + STAILQ_ENTRY(mme_code_s) next; +}; + +/* Served gummei element */ +struct served_gummei_s { + /* Number of MME served PLMNs */ + uint8_t nb_served_plmns; + /* List of served PLMNs by MME */ + STAILQ_HEAD(served_plmns_s, plmn_identity_s) served_plmns; + + /* Number of group id in list */ + uint8_t nb_group_id; + /* Served group id list */ + STAILQ_HEAD(served_group_ids_s, served_group_id_s) served_group_ids; + + /* Number of MME code */ + uint8_t nb_mme_code; + /* MME Code to uniquely identify an MME within an MME pool area */ + STAILQ_HEAD(mme_codes_s, mme_code_s) mme_codes; + + /* Next GUMMEI element */ + STAILQ_ENTRY(served_gummei_s) next; +}; + +struct s1ap_eNB_instance_s; + +/* This structure describes association of a eNB to a MME */ +typedef struct s1ap_eNB_mme_data_s { + /* MME descriptors tree, ordered by sctp assoc id */ + RB_ENTRY(s1ap_eNB_mme_data_s) entry; + + /* This is the optional name provided by the MME */ + char *mme_name; + net_ip_address_t mme_net_ip_address; // useful for joining assoc_id and ip address of packets + + /* List of served GUMMEI per MME. There is one GUMMEI per RAT with a max + * number of 8 RATs but in our case only one is used. The LTE related pool + * configuration is included on the first place in the list. + */ + STAILQ_HEAD(served_gummeis_s, served_gummei_s) served_gummei; + + /* Relative processing capacity of an MME with respect to the other MMEs + * in the pool in order to load-balance MMEs within a pool as defined + * in TS 23.401. + */ + uint8_t relative_mme_capacity; + + /* Current MME overload information (if any). */ + s1ap_overload_state_t overload_state; + /* Current eNB->MME S1AP association state */ + s1ap_eNB_state_t state; + + /* Next usable stream for UE signalling */ + int32_t nextstream; + + /* Number of input/ouput streams */ + uint16_t in_streams; + uint16_t out_streams; + + /* Connexion id used between SCTP/S1AP */ + uint16_t cnx_id; + + /* SCTP association id */ + int32_t assoc_id; + + /* Only meaningfull in virtual mode */ + struct s1ap_eNB_instance_s *s1ap_eNB_instance; +} s1ap_eNB_mme_data_t; + +typedef struct s1ap_eNB_instance_s { + /* Next s1ap eNB association. + * Only used for virtual mode. + */ + STAILQ_ENTRY(s1ap_eNB_instance_s) s1ap_eNB_entries; + + /* Number of MME requested by eNB (tree size) */ + uint32_t s1ap_mme_nb; + /* Number of MME for which association is pending */ + uint32_t s1ap_mme_pending_nb; + /* Number of MME successfully associated to eNB */ + uint32_t s1ap_mme_associated_nb; + /* Tree of S1AP MME associations ordered by association ID */ + RB_HEAD(s1ap_mme_map, s1ap_eNB_mme_data_s) s1ap_mme_head; + + /* TODO: add a map ordered by relative MME capacity */ + + /* Tree of UE ordered by eNB_ue_s1ap_id's */ + RB_HEAD(s1ap_ue_map, s1ap_eNB_ue_context_s) s1ap_ue_head; + + /* For virtual mode, mod_id as defined in the rest of the L1/L2 stack */ + instance_t instance; + + /* Displayable name of eNB */ + char *eNB_name; + net_ip_address_t s1c_net_ip_address; + + /* Unique eNB_id to identify the eNB within EPC. + * In our case the eNB is a macro eNB so the id will be 20 bits long. + * For Home eNB id, this field should be 28 bits long. + */ + uint32_t eNB_id; + /* The type of the cell */ + enum cell_type_e cell_type; + + /* Tracking area code */ + uint16_t tac; + + /* Mobile Country Code + * Mobile Network Code + */ + uint16_t mcc; + uint16_t mnc; + uint8_t mnc_digit_length; + +} s1ap_eNB_instance_t; + +typedef struct { + /* List of served eNBs + * Only used for virtual mode + */ + STAILQ_HEAD(s1ap_eNB_instances_head_s, s1ap_eNB_instance_s) s1ap_eNB_instances_head; + /* Nb of registered eNBs */ + uint8_t nb_registered_eNBs; + + /* Generate a unique connexion id used between S1AP and SCTP */ + uint16_t global_cnx_id; +} s1ap_eNB_internal_data_t; + +int s1ap_eNB_compare_assoc_id( + struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2); + +/* Generate the tree management functions */ +RB_PROTOTYPE(s1ap_mme_map, s1ap_eNB_mme_data_s, entry, + s1ap_eNB_compare_assoc_id); + +#endif /* PLAY_SCENARIO_S1AP_ENB_DEFS_H_ */ From 717cd8a102d002fba32f57ba04c7421347e06c36 Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 24 Nov 2015 16:51:15 +0100 Subject: [PATCH 012/122] Starting debug, remainig TODO report new mme_ue_id --- openair2/COMMON/s1ap_messages_types.h | 2 +- openair3/SCTP/sctp_eNB_task.c | 9 ++ openair3/TEST/EPC_TEST/play_scenario.c | 97 +++++++++---- openair3/TEST/EPC_TEST/play_scenario.h | 8 +- openair3/TEST/EPC_TEST/play_scenario.xsl | 144 +++++++++---------- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 68 ++++----- openair3/TEST/EPC_TEST/play_scenario_parse.c | 2 - openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 86 +++++++++-- 8 files changed, 266 insertions(+), 150 deletions(-) diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h index c39725b737..f2c6a2a3a2 100644 --- a/openair2/COMMON/s1ap_messages_types.h +++ b/openair2/COMMON/s1ap_messages_types.h @@ -112,7 +112,7 @@ typedef struct net_ip_address_s { unsigned ipv4:1; unsigned ipv6:1; char ipv4_address[16]; - char ipv6_address[40]; + char ipv6_address[46]; } net_ip_address_t; typedef uint64_t bitrate_t; diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c index c1e7d989e9..357803ac4f 100644 --- a/openair3/SCTP/sctp_eNB_task.c +++ b/openair3/SCTP/sctp_eNB_task.c @@ -100,6 +100,7 @@ static STAILQ_HEAD(sctp_cnx_list_head, sctp_cnx_list_elm_s) sctp_cnx_list; static uint16_t sctp_nb_cnx = 0; +//------------------------------------------------------------------------------ struct sctp_cnx_list_elm_s *sctp_get_cnx(int32_t assoc_id, int sd) { struct sctp_cnx_list_elm_s *elm; @@ -119,6 +120,7 @@ struct sctp_cnx_list_elm_s *sctp_get_cnx(int32_t assoc_id, int sd) return NULL; } +//------------------------------------------------------------------------------ void sctp_handle_new_association_req( const instance_t instance, @@ -388,6 +390,7 @@ sctp_handle_new_association_req( sd, sctp_nb_cnx, assoc_id); } + //------------------------------------------------------------------------------ void sctp_send_data( instance_t instance, task_id_t task_id, @@ -430,6 +433,7 @@ void sctp_send_data( sctp_cnx->assoc_id); } +//------------------------------------------------------------------------------ static int sctp_close_association( const instance_t instance, const task_id_t requestor, @@ -456,6 +460,7 @@ static int sctp_close_association( return 0; } +//------------------------------------------------------------------------------ static int sctp_create_new_listener( const instance_t instance, const task_id_t requestor, @@ -580,6 +585,7 @@ err: return -1; } +//------------------------------------------------------------------------------ static inline void sctp_eNB_accept_associations( @@ -646,6 +652,7 @@ sctp_eNB_accept_associations( } } +//------------------------------------------------------------------------------ static inline void sctp_eNB_read_from_socket( @@ -770,6 +777,7 @@ sctp_eNB_read_from_socket( } } +//------------------------------------------------------------------------------ void sctp_eNB_flush_sockets( struct epoll_event *events, int nb_events) @@ -799,6 +807,7 @@ sctp_eNB_flush_sockets( } +//------------------------------------------------------------------------------ void *sctp_eNB_task(void *arg) { int nb_events; diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index f29393f0e7..f8f334dd9c 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -51,6 +51,7 @@ #include #include #include +#include #include "intertask_interface_init.h" @@ -60,6 +61,7 @@ #include "intertask_interface.h" #include "play_scenario.h" #include "sctp_eNB_task.h" +#include "sctp_default_values.h" #include "log.h" //------------------------------------------------------------------------------ #define PLAY_SCENARIO 1 @@ -73,6 +75,7 @@ extern et_scenario_t *g_scenario; extern int xmlLoadExtDtdDefaultValue; extern int asn_debug; extern int asn1_xer_print; +extern pthread_mutex_t g_fsm_lock; //------------------------------------------------------------------------------ // MEMO: @@ -170,7 +173,7 @@ void et_free_scenario(et_scenario_t* scenario) packet = next_packet->next; } et_free_pointer(scenario); - pthread_mutex_destroy(&scenario->fsm_lock); + pthread_mutex_destroy(&g_fsm_lock); } } @@ -276,7 +279,7 @@ const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type) case SCTP_CID_ASCONF: return "ASCONF"; break; case SCTP_CID_ASCONF_ACK: return "ASCONF_ACK"; break; default: - AssertFatal (0, "ERROR %s(): Unknown chunk_type %d!\n", __FUNCTION__, chunk_type); + AssertFatal (0, "ERROR: Unknown chunk_type %d!\n", chunk_type); } } //------------------------------------------------------------------------------ @@ -284,24 +287,50 @@ et_packet_action_t et_action_str2et_action_t(const xmlChar * const action) { if ((!xmlStrcmp(action, (const xmlChar *)"SEND"))) { return ET_PACKET_ACTION_S1C_SEND;} if ((!xmlStrcmp(action, (const xmlChar *)"RECEIVE"))) { return ET_PACKET_ACTION_S1C_RECEIVE;} - AssertFatal (0, "ERROR: %s cannot convert: %s\n", __FUNCTION__, action); + AssertFatal (0, "ERROR: cannot convert: %s\n", action); //if (NULL == action) {return ACTION_S1C_NULL;} } //------------------------------------------------------------------------------ void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip) { - AssertFatal (NULL != ip_str, "ERROR %s() Cannot convert null string to ip address!\n", __FUNCTION__); - AssertFatal (NULL != ip, "ERROR %s() out parameter pointer is NULL!\n", __FUNCTION__); + AssertFatal (NULL != ip_str, "ERROR Cannot convert null string to ip address!\n"); + AssertFatal (NULL != ip, "ERROR out parameter pointer is NULL!\n"); // store this IP address in sa: if (inet_pton(AF_INET, (const char*)ip_str, (void*)&(ip->address.ipv4)) > 0) { ip->address_family = AF_INET; + strncpy((char *)ip->str, (const char *)ip_str, INET_ADDRSTRLEN+1); } else if (inet_pton(AF_INET6, (const char*)ip_str, (void*)&(ip->address.ipv6)) > 0) { ip->address_family = AF_INET6; + strncpy((char *)ip->str, (const char *)ip_str, INET6_ADDRSTRLEN+1); } else { ip->address_family = AF_UNSPEC; AssertFatal (0, "ERROR %s() Could not parse ip address %s!\n", __FUNCTION__, ip_str); } } +//------------------------------------------------------------------------------ +int et_compare_et_ip_to_net_ip_address(const et_ip_t * const ip, const net_ip_address_t * const net_ip) +{ + AssertFatal (NULL != ip, "ERROR ip parameter\n"); + AssertFatal (NULL != net_ip, "ERROR net_ip parameter\n"); + switch (ip->address_family) { + case AF_INET: + if (net_ip->ipv4) { + S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv4_address)); + return strcmp(ip->str, net_ip->ipv4_address); + } + return -1; + break; + case AF_INET6: + if (net_ip->ipv6) { + return strcmp(ip->str, net_ip->ipv6_address); + } + return -1; + break; + default: + return -1; + } +} + #ifdef LIBCONFIG_LONG #define libconfig_int long #else @@ -317,6 +346,7 @@ void et_enb_config_init(const char const * lib_config_file_name_pP) config_setting_t *setting_mme_addresses = NULL; config_setting_t *setting_mme_address = NULL; config_setting_t *setting_enb = NULL; + libconfig_int my_int; int num_enb_properties = 0; int enb_properties_index = 0; int num_enbs = 0; @@ -479,6 +509,20 @@ void et_enb_config_init(const char const * lib_config_file_name_pP) g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; } } + // SCTP SETTING + g_enb_properties.properties[enb_properties_index]->sctp_out_streams = SCTP_OUT_STREAMS; + g_enb_properties.properties[enb_properties_index]->sctp_in_streams = SCTP_IN_STREAMS; + subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_SCTP_CONFIG); + + if (subsetting != NULL) { + if ( (config_setting_lookup_int( subsetting, ENB_CONFIG_STRING_SCTP_INSTREAMS, &my_int) )) { + g_enb_properties.properties[enb_properties_index]->sctp_in_streams = (uint16_t)my_int; + } + + if ( (config_setting_lookup_int( subsetting, ENB_CONFIG_STRING_SCTP_OUTSTREAMS, &my_int) )) { + g_enb_properties.properties[enb_properties_index]->sctp_out_streams = (uint16_t)my_int; + } + } // NETWORK_INTERFACES @@ -536,19 +580,19 @@ const Enb_properties_array_t *et_enb_config_get(void) return &g_enb_properties; } /*------------------------------------------------------------------------------*/ -uint32_t et_eNB_app_register(const Enb_properties_array_t *enb_properties) +void et_eNB_app_register(const Enb_properties_array_t *enb_properties) { - uint32_t enb_id; - uint32_t mme_id; - MessageDef *msg_p; - char *str = NULL; - struct in_addr addr; + uint32_t enb_id = 0; + uint32_t mme_id = 0; + MessageDef *msg_p = NULL; + char *str = NULL; + struct in_addr addr = {.s_addr = 0}; g_scenario->register_enb_pending = 0; for (enb_id = 0; (enb_id < enb_properties->number) ; enb_id++) { { - s1ap_register_enb_req_t *s1ap_register_eNB; + s1ap_register_enb_req_t *s1ap_register_eNB = NULL; /* 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); @@ -589,13 +633,10 @@ uint32_t et_eNB_app_register(const Enb_properties_array_t *enb_properties) str = inet_ntoa(addr); strcpy(s1ap_register_eNB->enb_ip_address.ipv4_address, str); - itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); - g_scenario->register_enb_pending++; + itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); } } - - return g_scenario->register_enb_pending; } /*------------------------------------------------------------------------------*/ void *et_eNB_app_task(void *args_p) @@ -603,12 +644,11 @@ void *et_eNB_app_task(void *args_p) et_scenario_t *scenario = (et_scenario_t*)args_p; MessageDef *msg_p = NULL; const char *msg_name = NULL; - instance_t instance; - int result; + instance_t instance = 0; + int result = 0; itti_mark_task_ready (TASK_ENB_APP); - do { // Wait for a message itti_receive_msg (TASK_ENB_APP, &msg_p); @@ -625,18 +665,20 @@ void *et_eNB_app_task(void *args_p) LOG_I(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name, S1AP_REGISTER_ENB_CNF(msg_p).nb_mme); - DevAssert(g_scenario->register_enb_pending > 0); - g_scenario->register_enb_pending--; + DevAssert(scenario->register_enb_pending > 0); + scenario->register_enb_pending--; /* Check if at least eNB is registered with one MME */ if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) { - g_scenario->registered_enb++; + scenario->registered_enb++; } /* Check if all register eNB requests have been processed */ if (scenario->register_enb_pending == 0) { + timer_remove(scenario->enb_register_retry_timer_id); if (scenario->registered_enb == scenario->enb_properties->number) { /* If all eNB are registered, start scenario */ + LOG_D(ENB_APP, " All eNB are now associated with a MME\n"); et_event_t event; event.code = ET_EVENT_S1C_CONNECTED; et_scenario_fsm_notify_event(event); @@ -654,7 +696,7 @@ void *et_eNB_app_task(void *args_p) sleep(ET_ENB_REGISTER_RETRY_DELAY); /* Restart the registration process */ scenario->registered_enb = 0; - scenario->register_enb_pending = et_eNB_app_register (scenario->enb_properties); + et_eNB_app_register (scenario->enb_properties); } } } @@ -674,7 +716,7 @@ void *et_eNB_app_task(void *args_p) if (TIMER_HAS_EXPIRED (msg_p).timer_id == scenario->enb_register_retry_timer_id) { /* Restart the registration process */ scenario->registered_enb = 0; - scenario->register_enb_pending = et_eNB_app_register (scenario->enb_properties); + et_eNB_app_register (scenario->enb_properties); } break; @@ -870,10 +912,13 @@ int main( int argc, char **argv ) // logging logInit(); + set_glog(LOG_TRACE, LOG_MED); + itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL); + set_comp_log(ENB_APP, LOG_TRACE, LOG_MED, 1); set_comp_log(S1AP, LOG_TRACE, LOG_MED, 1); - set_comp_log(SCTP, LOG_TRACE, LOG_MED, 1); + set_comp_log(SCTP, LOG_TRACE, LOG_FULL, 1); asn_debug = 0; asn1_xer_print = 1; @@ -895,6 +940,6 @@ int main( int argc, char **argv ) et_free_pointer(scenario_file_name); et_free_pointer(enb_config_file_name); } - + itti_wait_tasks_end(); return ret; } diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 3a52c6a0b8..060c77b8ee 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -39,7 +39,6 @@ #define PLAY_SCENARIO_H_ # include # include -# include # include # include @@ -274,6 +273,7 @@ typedef struct et_ip_s { struct in6_addr ipv6; in_addr_t ipv4; }address; + char str[INET6_ADDRSTRLEN+1]; }et_ip_t; typedef struct et_ip_hdr_s { @@ -323,8 +323,6 @@ typedef struct et_scenario_s { uint32_t registered_enb; long enb_register_retry_timer_id; - pthread_mutex_t fsm_lock; - et_fsm_state_t fsm_state; hash_table_t *hash_mme2association_id; hash_table_t *hash_old_ue_mme_id2ue_mme_id; @@ -391,6 +389,7 @@ int et_s1ap_decode_pdu(S1AP_PDU_t * const pdu, s1ap_message * const message, con void et_decode_s1ap(et_s1ap_t * const s1ap); //------------------------- int et_s1ap_eNB_compare_assoc_id( struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2); +uint32_t et_s1ap_generate_eNB_id(void); uint16_t et_s1ap_eNB_fetch_add_global_cnx_id(void); void et_s1ap_eNB_prepare_internal_data(void); void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p); @@ -436,6 +435,7 @@ int et_split_path ( char * pathP, char *** resP); void et_display_node ( xmlNodePtr node, unsigned int indent); void et_display_tree ( xmlNodePtr node, unsigned int indent); char * et_ip2ip_str(const et_ip_t * const ip); +int et_compare_et_ip_to_net_ip_address(const et_ip_t * const ip, const net_ip_address_t * const net_ip); int et_hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len); sctp_cid_t et_chunk_type_str2cid(const xmlChar * const chunk_type_str); const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type); @@ -443,7 +443,7 @@ et_packet_action_t et_action_str2et_action_t(const xmlChar * const action); void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip); void et_enb_config_init(const char const * lib_config_file_name_pP); const Enb_properties_array_t *et_enb_config_get(void); -uint32_t et_eNB_app_register(const Enb_properties_array_t *enb_properties); +void et_eNB_app_register(const Enb_properties_array_t *enb_properties); void *et_eNB_app_task(void *args_p); int et_play_scenario(et_scenario_t* const scenario); diff --git a/openair3/TEST/EPC_TEST/play_scenario.xsl b/openair3/TEST/EPC_TEST/play_scenario.xsl index 6b1c36cc3d..0ce22c08df 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.xsl +++ b/openair3/TEST/EPC_TEST/play_scenario.xsl @@ -9,57 +9,57 @@ /> - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + ERROR: Cannot resolv IP ! @@ -69,30 +69,30 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + ERROR: Cannot resolv IP ! diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index 8e59a98258..18dba384b0 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -36,6 +36,7 @@ */ #include #include +#include #include "intertask_interface.h" #include "platform_types.h" @@ -46,7 +47,9 @@ #include "timer.h" //------------------------------------------------------------------------------ -et_scenario_t *g_scenario = NULL; +et_scenario_t *g_scenario = NULL; +pthread_mutex_t g_fsm_lock = PTHREAD_MUTEX_INITIALIZER; +et_fsm_state_t g_fsm_state = ET_FSM_STATE_NULL; //------------------------------------------------------------------------------ int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b) { @@ -83,7 +86,7 @@ void et_scenario_wait_rx_packet(et_packet_t * const packet) NULL, &packet->timer_id) < 0) { AssertFatal(0, " Can not start waiting RX event timer\n"); } - g_scenario->fsm_state = ET_FSM_STATE_WAITING_EVENT; + g_fsm_state = ET_FSM_STATE_WAITING_EVENT; packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING; } //------------------------------------------------------------------------------ @@ -102,7 +105,8 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) s1ap_eNB_instance = et_s1ap_eNB_get_instance(packet->enb_instance); AssertFatal(NULL != s1ap_eNB_instance, "Cannot get s1ap_eNB_instance_t for eNB instance %d", packet->enb_instance); - g_scenario->fsm_state = ET_FSM_STATE_WAITING_EVENT; + LOG_D(ENB_APP, "%s\n", __FUNCTION__); + g_fsm_state = ET_FSM_STATE_WAITING_EVENT; switch (packet->sctp_hdr.chunk_type) { case SCTP_CID_DATA: @@ -124,7 +128,7 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) NULL, &packet->timer_id) < 0) { AssertFatal(0, " Can not start TX event timer\n"); } - // Done g_scenario->fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; + // Done g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; } else { // send immediately et_s1ap_eNB_itti_send_sctp_data_req( @@ -134,7 +138,7 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, packet->sctp_hdr.u.data_hdr.stream); packet->status = ET_PACKET_STATUS_SENT; - g_scenario->fsm_state = ET_FSM_STATE_RUNNING; + g_fsm_state = ET_FSM_STATE_RUNNING; } break; case SCTP_CID_INIT: @@ -162,7 +166,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) default: AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_RUNNING", event.code); } - pthread_mutex_unlock(&g_scenario->fsm_lock); + pthread_mutex_unlock(&g_fsm_lock); return 0; } @@ -188,14 +192,14 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting(et_event_t event) event.u.tx_timed_packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, event.u.tx_timed_packet->sctp_hdr.u.data_hdr.stream); event.u.tx_timed_packet->status = ET_PACKET_STATUS_SENT; - g_scenario->fsm_state = ET_FSM_STATE_RUNNING; + g_fsm_state = ET_FSM_STATE_RUNNING; break; default: AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING", event.code); } - pthread_mutex_unlock(&g_scenario->fsm_lock); + pthread_mutex_unlock(&g_fsm_lock); return 0; } @@ -215,8 +219,8 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even // no init in this scenario, may be sub-scenario if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { et_scenario_schedule_tx_packet(g_scenario->next_packet); - pthread_mutex_unlock(&g_scenario->fsm_lock); - return g_scenario->fsm_state; + pthread_mutex_unlock(&g_fsm_lock); + return g_fsm_state; } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { g_scenario->last_rx_packet = g_scenario->next_packet; @@ -226,8 +230,8 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) { et_scenario_wait_rx_packet(g_scenario->next_packet); - pthread_mutex_unlock(&g_scenario->fsm_lock); - return g_scenario->fsm_state; + pthread_mutex_unlock(&g_fsm_lock); + return g_fsm_state; } else { AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status); } @@ -263,15 +267,15 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even } } fprintf(stderr, "No Packet found in this scenario: %s\n", g_scenario->name); - g_scenario->fsm_state = ET_FSM_STATE_NULL; - pthread_mutex_unlock(&g_scenario->fsm_lock); - return g_scenario->fsm_state; + g_fsm_state = ET_FSM_STATE_NULL; + pthread_mutex_unlock(&g_fsm_lock); + return g_fsm_state; break; default: AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_CONNECTING_S1C", event.code); } - pthread_mutex_unlock(&g_scenario->fsm_lock); + pthread_mutex_unlock(&g_fsm_lock); return 0; } //------------------------------------------------------------------------------ @@ -289,8 +293,8 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) // no init in this scenario, may be sub-scenario if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { et_scenario_schedule_tx_packet(g_scenario->next_packet); - pthread_mutex_unlock(&g_scenario->fsm_lock); - return g_scenario->fsm_state; + pthread_mutex_unlock(&g_fsm_lock); + return g_fsm_state; } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { g_scenario->last_rx_packet = g_scenario->next_packet; @@ -300,8 +304,8 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) { et_scenario_wait_rx_packet(g_scenario->next_packet); - pthread_mutex_unlock(&g_scenario->fsm_lock); - return g_scenario->fsm_state; + pthread_mutex_unlock(&g_fsm_lock); + return g_fsm_state; } else { AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status); } @@ -317,10 +321,10 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) g_scenario->hash_mme2association_id = hashtable_create (256,NULL,NULL); // Try to register each eNB g_scenario->registered_enb = 0; - g_scenario->fsm_state = ET_FSM_STATE_CONNECTING_S1C; - g_scenario->register_enb_pending = et_eNB_app_register (g_scenario->enb_properties); - pthread_mutex_unlock(&g_scenario->fsm_lock); - return g_scenario->fsm_state; + g_fsm_state = ET_FSM_STATE_CONNECTING_S1C; + et_eNB_app_register (g_scenario->enb_properties); + pthread_mutex_unlock(&g_fsm_lock); + return g_fsm_state; break; case SCTP_CID_HEARTBEAT: @@ -348,9 +352,9 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) } } fprintf(stderr, "No Useful packet found in this scenario: %s\n", g_scenario->name); - g_scenario->fsm_state = ET_FSM_STATE_NULL; - pthread_mutex_unlock(&g_scenario->fsm_lock); - return g_scenario->fsm_state; + g_fsm_state = ET_FSM_STATE_NULL; + pthread_mutex_unlock(&g_fsm_lock); + return g_fsm_state; break; default: @@ -364,15 +368,15 @@ et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event) { AssertFatal((event.code >= ET_EVENT_START) && (event.code < ET_EVENT_END), "Unknown et_event_t.code %d", event.code); - pthread_mutex_lock(&g_scenario->fsm_lock); - switch (g_scenario->fsm_state){ + pthread_mutex_lock(&g_fsm_lock); + switch (g_fsm_state){ case ET_FSM_STATE_NULL: return et_scenario_fsm_notify_event_state_null(event); break; case ET_FSM_STATE_CONNECTING_S1C: return et_scenario_fsm_notify_event_state_connecting_s1c(event); break; case ET_FSM_STATE_WAITING_EVENT: return et_scenario_fsm_notify_event_state_waiting(event); break; case ET_FSM_STATE_RUNNING: return et_scenario_fsm_notify_event_state_running(event); break; default: - AssertFatal(0, "Case fsm_state %d not handled", g_scenario->fsm_state); + AssertFatal(0, "Case fsm_state %d not handled", g_fsm_state); } - pthread_mutex_unlock(&g_scenario->fsm_lock); - return g_scenario->fsm_state; + pthread_mutex_unlock(&g_fsm_lock); + return g_fsm_state; } diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index f6d8aa73ac..13c4746a5e 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -447,8 +447,6 @@ et_scenario_t* et_generate_scenario( printf("scenario name: %s\n", xml_char); scenario = calloc(1, sizeof(*scenario)); scenario->name = xml_char; // nodup nofree - scenario->fsm_state = ET_FSM_STATE_NULL; - pthread_mutex_init(&scenario->fsm_lock, NULL); next_packet = &scenario->list_packet; for (node = root->children; node != NULL; node = node->next) { diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 7dd80904ae..d11d032b43 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -308,28 +308,82 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, s1ap_eNB_mme_data_t * const mme_desc_p) { et_packet_t *packet = NULL; - struct in6_addr s1c_mme_ipv6 = IN6ADDR_ANY_INIT; - in_addr_t s1c_mme_ipv4 = INADDR_ANY; - struct in6_addr s1c_enb_ipv6 = IN6ADDR_ANY_INIT; - in_addr_t s1c_enb_ipv4 = INADDR_ANY; + int ret; + unsigned int old_enb_port = 0; + unsigned int old_mme_port = 0; - packet = g_scenario->next_packet; + S1AP_DEBUG("%s for SCTP association (%u)\n",__FUNCTION__,assoc_id); + + packet = g_scenario->list_packet; while (NULL != packet) { switch (packet->sctp_hdr.chunk_type) { case SCTP_CID_DATA : - if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { - // TODO compare addresses and ports - if (packet->ip_hdr.dst) - packet->sctp_hdr.dst_port == 0; - packet->sctp_hdr.src_port == 0; - - } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + if (ET_PACKET_STATUS_NONE == packet->status) { + if (0 < old_mme_port) { + if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { + ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address); + if (0 == ret) { + ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address); + if (0 == ret) { + // same IP src, same IP dst + if ((packet->sctp_hdr.dst_port == old_mme_port) && (packet->sctp_hdr.src_port == old_enb_port)) { + packet->sctp_hdr.u.data_hdr.assoc_id = assoc_id; + S1AP_DEBUG("tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); + S1AP_DEBUG("\tUpdated assoc id: %u\n", assoc_id); + } + } + } + } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &mme_desc_p->mme_net_ip_address); + if (0 == ret) { + ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &s1ap_eNB_instance->s1c_net_ip_address); + if (0 == ret) { + // same IP src, same IP dst + if ((packet->sctp_hdr.src_port == old_mme_port) && (packet->sctp_hdr.dst_port == old_enb_port)) { + packet->sctp_hdr.u.data_hdr.assoc_id = assoc_id; + S1AP_DEBUG("tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); + S1AP_DEBUG("\tUpdated assoc id: %u\n", assoc_id); + } + } + } + } + } } break; + // Strong assumption + // in replayed scenario, the order of SCTP INIT packets is supposed to be the same as in the catched scenario case SCTP_CID_INIT: + ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address); + if (0 == ret) { + ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address); + if (0 == ret) { + if (0 == old_enb_port) { + if (ET_PACKET_STATUS_NONE == packet->status) { + packet->status = ET_PACKET_STATUS_SENT; + old_enb_port = packet->sctp_hdr.src_port; + } + } + } + } + break; + case SCTP_CID_INIT_ACK: + ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address); + if (0 == ret) { + ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address); + if (0 == ret) { + if (old_enb_port == packet->sctp_hdr.dst_port) { + if (ET_PACKET_STATUS_NONE == packet->status) { + packet->status = ET_PACKET_STATUS_RECEIVED; + old_mme_port = packet->sctp_hdr.dst_port; + } + } + } + } + break; + case SCTP_CID_HEARTBEAT: case SCTP_CID_HEARTBEAT_ACK: case SCTP_CID_COOKIE_ECHO: @@ -384,12 +438,14 @@ void et_s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_s if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0) { /* Decrease pending messages number */ mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb --; + mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb++; } et_s1ap_update_assoc_id_of_packets(mme_desc_p->assoc_id, mme_desc_p->s1ap_eNB_instance, mme_desc_p); + /* If there are no more pending messages, inform eNB app */ if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb == 0) { MessageDef *message_p; @@ -484,6 +540,10 @@ void et_s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_asso return; } + S1AP_DEBUG("Received successful result for SCTP association (%u), instance %d, cnx_id %u\n", + sctp_new_association_resp->sctp_state, + instance, + sctp_new_association_resp->ulp_cnx_id); /* Update parameters */ s1ap_mme_data_p->assoc_id = sctp_new_association_resp->assoc_id; s1ap_mme_data_p->in_streams = sctp_new_association_resp->in_streams; @@ -557,7 +617,7 @@ void *et_s1ap_eNB_task(void *arg) if (TIMER_HAS_EXPIRED (received_msg).timer_id == g_scenario->enb_register_retry_timer_id) { /* Restart the registration process */ g_scenario->registered_enb = 0; - g_scenario->register_enb_pending = et_eNB_app_register (g_scenario->enb_properties); + et_eNB_app_register (g_scenario->enb_properties); } break; From 610e07a96cfc87aa190df76757e81cf6441106ba Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 1 Dec 2015 16:55:41 +0100 Subject: [PATCH 013/122] For backup only, dont compile, TODO missing patch for asn1c compiler --- cmake_targets/CMakeLists.txt | 2 + openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py | 146 +++++++++- openair3/TEST/EPC_TEST/play_scenario.c | 4 + openair3/TEST/EPC_TEST/play_scenario.h | 11 + openair3/TEST/EPC_TEST/play_scenario_fsm.c | 11 +- openair3/TEST/EPC_TEST/play_scenario_parse.c | 4 +- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 83 +++++- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 273 ++++++++++++++++++ openair3/TEST/EPC_TEST/play_scenario_sctp.c | 45 +++ 9 files changed, 570 insertions(+), 9 deletions(-) create mode 100644 openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index bcf90bdb83..9c5bbad0de 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -337,6 +337,7 @@ set(S1AP_OAI_generated ${S1AP_C_DIR}/s1ap_decoder.c ${S1AP_C_DIR}/s1ap_encoder.c ${S1AP_C_DIR}/s1ap_xer_print.c + ${S1AP_C_DIR}/s1ap_compare.c ${S1AP_C_DIR}/s1ap_ies_defs.h ) file(GLOB s1ap_h ${S1AP_C_DIR}/*.h) @@ -1667,6 +1668,7 @@ add_executable(test_epc_play_scenario ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_fsm.c ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_parse.c ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_sctp.c ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.h diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py index c298e8ae87..f5daf03c25 100644 --- a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py +++ b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py @@ -250,20 +250,31 @@ for key in iesDefs: asn1cStruct = re.sub('Item', 'List', asn1cStruct) keylowerunderscore = re.sub('-', '_', key.lower()) firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) + + f.write("/* %s in iesDefs not in ieofielist.values() */\n" % (key)) f.write("/** \\brief Decode function for %s ies.\n" % (key)) if len(iesDefs[key]["ies"]) != 0: f.write(" * \\param %s Pointer to ASN1 structure in which data will be stored\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) f.write(" * \\param any_p Pointer to the ANY value to decode.\n") f.write(" **/\n") f.write("int %s_decode_%s(\n" % (fileprefix, keylowerunderscore)) - if len(iesDefs[key]["ies"]) != 0: f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) f.write(" ANY_t *any_p);\n\n") + f.write("/* %s in iesDefs not in ieofielist.values() */\n" % (key)) + f.write("/** \\brief Compare function for %s ies.\n" % (key)) + f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) + f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) + f.write(" **/\n") + f.write("long %s_compare_%s(\n" % (fileprefix, keylowerunderscore)) + f.write(" %s_t *%s1,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) + f.write(" %s_t *%s2);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) + if len(iesDefs[key]["ies"]) == 0: continue + f.write("/* %s in iesDefs not in ieofielist.values() */\n" % (key)) f.write("/** \\brief Encode function for %s ies.\n" % (key)) f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) @@ -272,16 +283,19 @@ for key in iesDefs: f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) f.write(" %s_t *%s);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) + for key in iesDefs: if key not in ieofielist.values(): continue asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) asn1cStruct = re.sub('Item', 'List', asn1cStruct) firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) + f.write("/* %s in iesDefs in ieofielist.values() */\n" % (key)) f.write("/** \\brief Encode function for %s ies.\n" % (key)) f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) f.write(" **/\n") + f.write("/* %s in iesDefs in ieofielist.values() */\n" % (key)) f.write("int %s_encode_%s(\n" % (fileprefix, firstlower.lower())) f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) f.write(" %sIEs_t *%sIEs);\n\n" % (asn1cStruct, firstlower)) @@ -289,9 +303,19 @@ for key in iesDefs: f.write(" * \\param any_p Pointer to the ANY value to decode.\n") f.write(" * \\param callback Callback function called when any_p is successfully decoded.\n") f.write(" **/\n") + f.write("/* %s in iesDefs in ieofielist.values() */\n" % (key)) f.write("int %s_decode_%s(\n" % (fileprefix, firstlower.lower())) f.write(" %sIEs_t *%sIEs,\n" % (asn1cStruct, firstlower)) f.write(" %s_t *%s);\n\n" % (asn1cStruct, lowerFirstCamelWord(asn1cStruct))) + f.write("/** \\brief Compare function for %s ies.\n" % (key)) + f.write(" * \\param %s Pointer to the IES structure.\n" % (firstlower)) + f.write(" * \\param %s Pointer to the IES structure.\n" % (firstlower)) + f.write(" **/\n") + f.write("long %s_compare_%s(\n" % (fileprefix, firstlower.lower())) + f.write(" %sIEs_t *%s1,\n" % (asn1cStruct, firstlower)) + f.write(" %sIEs_t *%s2);\n\n" % (asn1cStruct, firstlower)) + + for key in iesDefs: asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) @@ -704,3 +728,123 @@ for (key, value) in iesDefs.items(): #f.write("cb_failed:\n") #f.write(" return er;\n") f.write("}\n\n") + + +#Generate xer print functions +f = open(outdir + fileprefix + '_compare.c', 'w') +outputHeaderToFile(f, filename) +f.write("#include \n") +f.write("#include \n\n") +f.write("#include \n#include \n\n") +f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n" % (fileprefix, fileprefix)) +f.write("#include \"%s-ProtocolIE-ID.h\"\n\n" % (fileprefix_first_upper)) + + +for key in iesDefs: + if key in ieofielist.values(): + continue + structName = re.sub('ies', '', key) + asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) + asn1cStruct = re.sub('Item', 'List', asn1cStruct) + if asn1cStruct.rfind('_') == len(asn1cStruct) - 1: + asn1cStruct = asn1cStruct[:-1] + asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] + firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) + + iesaccess = "" + if key not in ieofielist.values(): + iesaccess = "%s_ies." % (firstwordlower) + + keyName = re.sub('-', '_', key) + keyupperunderscore = keyName.upper() + # No IE to encode... + if len(iesDefs[key]["ies"]) == 0: + continue + + f.write("long %s_compare_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) + f.write(" %s_t *%s1,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) + f.write(" %s_t *%s2) {\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) + + f.write(" long rv = 0;\n\n") + + f.write(" assert(%s1 != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))); + f.write(" assert(%s2 != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))); + + loop = 0 + for ie in iesDefs[key]["ies"]: + iename = re.sub('-', '_', re.sub('id-', '', ie[0])) + ienameunderscore = re.sub('-', '_', iename) + ienamefirstwordlower = lowerFirstCamelWord(iename) + ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper() + ietypeunderscore = re.sub('-', '_', ie[2]) + + if ie[3] != "mandatory": + + loop = loop + 1 + if loop == 1: + #f.write(" %s_IE_t *ie1 = NULL;\n" % (fileprefix_first_upper)) + #f.write(" %s_IE_t *ie2 = NULL;\n" % (fileprefix_first_upper)) + f.write(" if (%s1->presenceMask != %s2->presenceMask) return -1;\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), lowerFirstCamelWord(re.sub('-', '_', key)))) + + if ie[3] == "optional": + f.write(" /* Optional field */\n") + elif ie[3] == "conditional": + f.write(" /* Conditional field */\n") + f.write(" if (%s1->presenceMask & %s_%s_PRESENT) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore)) + + + if ie[2] in ieofielist.keys(): + f.write(" /* collection field */\n") + f.write(" rv = %s_compare_%s(&%s1->%s, &%s2->%s);\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) + f.write(" if (rv != 0) {rv = rv << 8; rv |= %s_ProtocolIE_ID_id_%s; return rv;}\n" % (fileprefix_first_upper, ienameunderscore)) + else: + f.write(" /* simple field */\n") + f.write(" rv = asn_DEF_%s.compare(&asn_DEF_%s, &%s1->%s, &asn_DEF_%s, &%s2->%s); \n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) + f.write(" if (rv != 0) {rv = rv << 8; rv |= %s_ProtocolIE_ID_id_%s; return rv;}\n" % (fileprefix_first_upper, ienameunderscore)) + f.write(" assert(0);\n"); + f.write(" }\n\n") + + else: + if ie[2] in ieofielist.keys(): + f.write(" /* Mandatory collection field */\n") + f.write(" rv = %s_compare_%s(&%s1->%s, &%s2->%s);\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) + f.write(" if (rv != 0) {rv = rv << 8; rv |= %s_ProtocolIE_ID_id_%s; return rv;}\n" % (fileprefix_first_upper, ienameunderscore)) + else: + f.write(" /* Mandatory simple field */\n") + f.write(" rv = asn_DEF_%s.compare(&asn_DEF_%s, &%s1->%s, &asn_DEF_%s, &%s2->%s);\n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) + f.write(" if (rv != 0) {rv = rv << 8; rv |= %s_ProtocolIE_ID_id_%s; return rv;}\n" % (fileprefix_first_upper, ienameunderscore)) + f.write(" return 0;\n") + f.write("}\n\n") + +for (key, value) in iesDefs.items(): + if key not in ieofielist.values(): + continue + + ie = value["ies"][0] + ietypeunderscore = re.sub('-', '_', ie[2]) + asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) + asn1cStruct = re.sub('Item', 'List', asn1cStruct) + firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) + + for (i, j) in ieofielist.items(): + if j == key: + break + + f.write("extern asn_TYPE_descriptor_t asn_DEF_%s;\n" % (ietypeunderscore)) + + f.write("long %s_compare_%s(\n" % (fileprefix, re.sub('-', '_', i).lower())) + f.write(" %sIEs_t *%sIEs1,\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i)))) + f.write(" %sIEs_t *%sIEs2) {\n\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i)))) + f.write(" int i;\n") + f.write(" long rv = 0;\n") + + f.write(" assert(%sIEs1 != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', i)))); + f.write(" assert(%sIEs2 != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', i)))); + + f.write(" for (i = 0; i < %sIEs1->%s.count; i++) {\n" % (lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) + f.write(" rv = asn_DEF_%s.compare(&asn_DEF_%s, %sIEs1->%s.array[i], &asn_DEF_%s, %sIEs2->%s.array[i]);\n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))), ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) + f.write(" if (rv != 0) return rv;\n") + f.write(" }\n") + f.write(" return 0;\n") + f.write("}\n\n") + diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index f8f334dd9c..216e098a01 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -318,15 +318,19 @@ int et_compare_et_ip_to_net_ip_address(const et_ip_t * const ip, const net_ip_ad S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv4_address)); return strcmp(ip->str, net_ip->ipv4_address); } + S1AP_DEBUG("%s(%s,%s)=-1 (IP version (4) not matching)\n",__FUNCTION__,ip->str, net_ip->ipv4_address); return -1; break; case AF_INET6: if (net_ip->ipv6) { + S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv6_address)); return strcmp(ip->str, net_ip->ipv6_address); } + S1AP_DEBUG("%s(%s,%s)=-1 (IP version (6) not matching)\n",__FUNCTION__,ip->str, net_ip->ipv6_address); return -1; break; default: + S1AP_DEBUG("%s(%s,...)=-1 (unknown IP version)\n",__FUNCTION__,ip->str); return -1; } } diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 060c77b8ee..3c8c5faef8 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -47,6 +47,10 @@ #include "play_scenario_s1ap_eNB_defs.h" #include "hashtable.h" +// powers of 2 +#define ET_BIT_MASK_MATCH_SCTP_STREAM 1 +#define ET_BIT_MASK_MATCH_SCTP_SSN 2 +//#define ET_BIT_MASK_MATCH_S1AP_ 2 #define MAX_ENB 16 @@ -396,6 +400,8 @@ void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p); struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME(s1ap_eNB_instance_t *instance_p,int32_t assoc_id, uint16_t cnx_id); s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance); void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,uint32_t buffer_length, uint16_t stream); +int et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints); +et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const s1ap_data_ind); void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind); void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind); void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, @@ -428,6 +434,11 @@ void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); et_scenario_t* et_generate_scenario(const char * const et_scenario_filename ); //------------------------- +int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints); +//------------------------- +int et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints); +int et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints); +//------------------------------------------------------------------------------ void et_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num); int et_is_file_exists ( const char const * file_nameP, const char const *file_roleP); int et_strip_extension( char *in_filename); diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index 18dba384b0..23ef72035c 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -50,6 +50,7 @@ et_scenario_t *g_scenario = NULL; pthread_mutex_t g_fsm_lock = PTHREAD_MUTEX_INITIALIZER; et_fsm_state_t g_fsm_state = ET_FSM_STATE_NULL; +uint32_t g_constraints = ET_BIT_MASK_MATCH_SCTP_STREAM | ET_BIT_MASK_MATCH_SCTP_SSN; //------------------------------------------------------------------------------ int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b) { @@ -123,6 +124,9 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) } if (we_are_too_early > 0) { // set timer + LOG_D(ENB_APP, "Send packet num %u original frame number %u in %ld.%d sec\n", + packet->packet_number, packet->original_frame_number, offset.tv_sec, offset.tv_usec); + packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_SENDING; if (timer_setup (offset.tv_sec, offset.tv_usec, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, NULL, &packet->timer_id) < 0) { @@ -130,7 +134,9 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) } // Done g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; } else { + LOG_D(ENB_APP, "Send packet num %u original frame number %u immediately\n", packet->packet_number, packet->original_frame_number); // send immediately + AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed"); et_s1ap_eNB_itti_send_sctp_data_req( packet->enb_instance, packet->sctp_hdr.u.data_hdr.assoc_id, @@ -161,7 +167,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) AssertFatal(0, "Event ET_EVENT_TX_TIMED_PACKET not handled in FSM state ET_FSM_STATE_RUNNING"); break; case ET_EVENT_RX_S1AP: - AssertFatal(0, "TODO"); + et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); break; default: AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_RUNNING", event.code); @@ -185,6 +191,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting(et_event_t event) break; case ET_EVENT_TX_TIMED_PACKET: // send immediately + AssertFatal(0 == gettimeofday(&event.u.tx_timed_packet->timestamp_packet, NULL), "gettimeofday() Failed"); et_s1ap_eNB_itti_send_sctp_data_req( event.u.tx_timed_packet->enb_instance, event.u.tx_timed_packet->sctp_hdr.u.data_hdr.assoc_id, @@ -290,7 +297,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) switch (g_scenario->next_packet->sctp_hdr.chunk_type) { case SCTP_CID_DATA : - // no init in this scenario, may be sub-scenario + // no init in this scenario, may be sub-scenario, ... if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { et_scenario_schedule_tx_packet(g_scenario->next_packet); pthread_mutex_unlock(&g_fsm_lock); diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index 13c4746a5e..cb302f229a 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -518,7 +518,7 @@ int et_generate_xml_scenario( for (i = 0; i < g_enb_properties.number; i++) { // eNB S1-C IPv4 address - sprintf(astring, "enb_s1c%d", i); + sprintf(astring, "enb%d_s1c", i); params[nb_params++] = strdup(astring); addr.s_addr = g_enb_properties.properties[i]->enb_ipv4_address_for_S1_MME; sprintf(astring, "\"%s\"", inet_ntoa(addr)); @@ -526,7 +526,7 @@ int et_generate_xml_scenario( // MME S1-C IPv4 address for (j = 0; j < g_enb_properties.properties[i]->nb_mme; j++) { - sprintf(astring, "mme_s1c%d_%d", i, j); + sprintf(astring, "mme%d_s1c_%d", i, j); params[nb_params++] = strdup(astring); AssertFatal (g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address, "Only support MME IPv4 address\n"); diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index d11d032b43..408ff72a4a 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "tree.h" #include "queue.h" @@ -58,6 +59,7 @@ s1ap_eNB_internal_data_t s1ap_eNB_internal_data; RB_GENERATE(s1ap_mme_map, s1ap_eNB_mme_data_s, entry, et_s1ap_eNB_compare_assoc_id); //------------------------------------------------------------------------------ extern et_scenario_t *g_scenario; +extern uint32_t g_constraints; //------------------------------------------------------------------------------ int et_s1ap_eNB_compare_assoc_id( struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2) @@ -187,20 +189,86 @@ void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, itti_send_msg_to_task(TASK_SCTP, instance, message_p); } //------------------------------------------------------------------------------ -void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind) +int et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints) +{ + if (s1ap1->pdu.present != s1ap2->pdu.present) return -6; + switch (s1ap1->pdu.present) { + case S1AP_PDU_PR_NOTHING: + break; + case S1AP_PDU_PR_initiatingMessage: + if (s1ap1->pdu.choice.initiatingMessage.procedureCode != s1ap2->pdu.choice.initiatingMessage.procedureCode) return -7; + if (s1ap1->pdu.choice.initiatingMessage.criticality != s1ap2->pdu.choice.initiatingMessage.criticality) return -8; + break; + case S1AP_PDU_PR_successfulOutcome: + if (s1ap1->pdu.choice.successfulOutcome.procedureCode != s1ap2->pdu.choice.successfulOutcome.procedureCode) return -7; + if (s1ap1->pdu.choice.successfulOutcome.criticality != s1ap2->pdu.choice.successfulOutcome.criticality) return -8; + break; + case S1AP_PDU_PR_unsuccessfulOutcome: + if (s1ap1->pdu.choice.unsuccessfulOutcome.procedureCode != s1ap2->pdu.choice.unsuccessfulOutcome.procedureCode) return -7; + if (s1ap1->pdu.choice.unsuccessfulOutcome.criticality != s1ap2->pdu.choice.unsuccessfulOutcome.criticality) return -8; + break; + default: + AssertFatal(0, "Unknown pdu.present %d", s1ap1->pdu.present); + } + + if (s1ap1->binary_stream_allocated_size == s1ap2->binary_stream_allocated_size) { + if (memcmp((void*)s1ap1->binary_stream, (void*)s1ap2->binary_stream, s1ap1->binary_stream_allocated_size) == 0) return 0; + } + // if no matching, may be the scenario need minor corrections (same enb_ue_s1ap_id but need to update mme_ue_s1ap_id) + return et_s1ap_ies_is_matching(s1ap1->pdu.present, &s1ap1->message, &s1ap2->message, constraints); +} + +//------------------------------------------------------------------------------ +et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const s1ap_data_ind) { et_packet_t * packet = NULL; + AssertFatal (NULL != s1ap_data_ind, "Bad parameter sctp_data_ind\n"); + packet = calloc(1, sizeof(*packet)); + packet->action = ET_PACKET_ACTION_S1C_NULL; + //packet->time_relative_to_first_packet.tv_sec = 0; + //packet->time_relative_to_first_packet.tv_usec = 0; + //packet->time_relative_to_last_sent_packet.tv_sec = 0; + //packet->time_relative_to_last_sent_packet.tv_usec = 0; + //packet->time_relative_to_last_received_packet.tv_sec = 0; + //packet->time_relative_to_last_received_packet.tv_usec = 0; + //packet->original_frame_number = 0; + //packet->packet_number = 0; + packet->enb_instance = 0; //TODO + //packet->ip_hdr; + // keep in mind: allocated buffer: sctp_datahdr.payload.binary_stream + memcpy((void*)&packet->sctp_hdr, (void*)&s1ap_data_ind->sctp_datahdr, sizeof(packet->sctp_hdr)); + //packet->next = NULL; + packet->status = ET_PACKET_STATUS_RECEIVED; + //packet->timer_id = 0; + AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed"); + return packet; +} + + +//------------------------------------------------------------------------------ +void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) +{ + et_packet_t * packet = NULL; + et_packet_t * rx_packet = NULL; unsigned long int not_found = 1; + AssertFatal (NULL != s1ap_data_ind, "Bad parameter sctp_data_ind\n"); + rx_packet = et_build_packet_from_s1ap_data_ind(s1ap_data_ind); + packet = g_scenario->next_packet; // not_found threshold may sure depend on number of mme, may be not sure on number of UE while ((NULL != packet) && (not_found < 5)) { if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { //TODO + if (et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints) == 0) { + et_scenario_set_packet_received(packet); + } } not_found += 1; packet = packet->next; } + S1AP_DEBUG("Rx packet not found in scenario:\n"); + et_display_packet_sctp(&rx_packet->sctp_hdr); } //------------------------------------------------------------------------------ @@ -234,7 +302,7 @@ void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind) &event.u.s1ap_data_ind.sctp_datahdr.payload.message, event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream, event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_allocated_size) < 0) { - AssertFatal (0, "ERROR %s() Cannot decode RX S1AP message!\n", __FUNCTION__); + AssertFatal (0, "ERROR Cannot decode RX S1AP message!\n"); } } @@ -319,6 +387,7 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, switch (packet->sctp_hdr.chunk_type) { case SCTP_CID_DATA : + S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_DATA\n",__FUNCTION__,assoc_id); if (ET_PACKET_STATUS_NONE == packet->status) { if (0 < old_mme_port) { if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { @@ -355,6 +424,7 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, // Strong assumption // in replayed scenario, the order of SCTP INIT packets is supposed to be the same as in the catched scenario case SCTP_CID_INIT: + S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT\n",__FUNCTION__,assoc_id); ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address); if (0 == ret) { ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address); @@ -363,6 +433,7 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, if (ET_PACKET_STATUS_NONE == packet->status) { packet->status = ET_PACKET_STATUS_SENT; old_enb_port = packet->sctp_hdr.src_port; + S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT SUCCESS\n",__FUNCTION__,assoc_id); } } } @@ -370,14 +441,16 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, break; case SCTP_CID_INIT_ACK: - ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address); + S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT_ACK\n",__FUNCTION__,assoc_id); + ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &mme_desc_p->mme_net_ip_address); if (0 == ret) { - ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address); + ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &s1ap_eNB_instance->s1c_net_ip_address); if (0 == ret) { if (old_enb_port == packet->sctp_hdr.dst_port) { if (ET_PACKET_STATUS_NONE == packet->status) { packet->status = ET_PACKET_STATUS_RECEIVED; old_mme_port = packet->sctp_hdr.dst_port; + S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT_ACK SUCCESS\n",__FUNCTION__,assoc_id); } } } @@ -475,6 +548,7 @@ void et_s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_ DevCheck(new_instance->mcc == s1ap_register_eNB->mcc, new_instance->mcc, s1ap_register_eNB->mcc, 0); DevCheck(new_instance->mnc == s1ap_register_eNB->mnc, new_instance->mnc, s1ap_register_eNB->mnc, 0); DevCheck(new_instance->mnc_digit_length == s1ap_register_eNB->mnc_digit_length, new_instance->mnc_digit_length, s1ap_register_eNB->mnc_digit_length, 0); + DevCheck(memcmp((void*)&new_instance->s1c_net_ip_address, (void*)&s1ap_register_eNB->enb_ip_address, sizeof(new_instance->s1c_net_ip_address)) == 0, 0,0,0); } else { new_instance = calloc(1, sizeof(s1ap_eNB_instance_t)); DevAssert(new_instance != NULL); @@ -491,6 +565,7 @@ void et_s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_ new_instance->mcc = s1ap_register_eNB->mcc; new_instance->mnc = s1ap_register_eNB->mnc; new_instance->mnc_digit_length = s1ap_register_eNB->mnc_digit_length; + memcpy((void*)&new_instance->s1c_net_ip_address, (void*)&s1ap_register_eNB->enb_ip_address, sizeof(new_instance->s1c_net_ip_address)); /* Add the new instance to the list of eNB (meaningfull in virtual mode) */ et_s1ap_eNB_insert_new_instance(new_instance); diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c new file mode 100644 index 0000000000..5ad5708bab --- /dev/null +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -0,0 +1,273 @@ +/******************************************************************************* + 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 . + + 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 + + *******************************************************************************/ + +/* + play_scenario_s1ap_compare_ie.c + ------------------- + AUTHOR : Lionel GAUTHIER + COMPANY : EURECOM + EMAIL : Lionel.Gauthier@eurecom.fr + */ +#include +#include +#include +#include +#include +#include +#include "tree.h" +#include "queue.h" + + +#include "intertask_interface.h" +#include "timer.h" +#include "platform_types.h" +#include "assertions.h" +#include "conversions.h" +#include "s1ap_common.h" +#include "play_scenario_s1ap_eNB_defs.h" +#include "play_scenario.h" +#include "msc.h" +//------------------------------------------------------------------------------ +extern et_scenario_t *g_scenario; +extern uint32_t g_constraints; +//------------------------------------------------------------------------------ + +int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints) +{ + long ret = 0; + AssertFatal(m1 != NULL, "bad parameter m1"); + AssertFatal(m2 != NULL, "bad parameter m2"); + if (m1->procedureCode != m2->procedureCode) return -1; + + + // some cases can never occur since uplink only. + switch (m1->procedureCode) { + case S1ap_ProcedureCode_id_HandoverPreparation: + AssertFatal(0, "S1ap_ProcedureCode_id_InitialContextSetup not implemented"); + break; + case S1ap_ProcedureCode_id_HandoverResourceAllocation: + AssertFatal(0, "S1ap_ProcedureCode_id_InitialContextSetup not implemented"); + break; + case S1ap_ProcedureCode_id_HandoverNotification: + AssertFatal(0, "S1ap_ProcedureCode_id_HandoverNotification not implemented"); + break; + case S1ap_ProcedureCode_id_PathSwitchRequest: + ret = s1ap_compare_s1ap_pathswitchrequesties( + &m1->msg.s1ap_PathSwitchRequestIEs, + &m2->msg.s1ap_PathSwitchRequestIEs); + break; + case S1ap_ProcedureCode_id_HandoverCancel: + ret = s1ap_compare_s1ap_handovercancelies( + &m1->msg.s1ap_HandoverCancelIEs, + &m2->msg.s1ap_HandoverCancelIEs); + break; + case S1ap_ProcedureCode_id_E_RABSetup: + case S1ap_ProcedureCode_id_E_RABModify: + case S1ap_ProcedureCode_id_E_RABRelease: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_e_rabreleasecommandies( + &m1->msg.s1ap_E_RABReleaseCommandIEs, + &m2->msg.s1ap_E_RABReleaseCommandIEs); + } else if (present == S1AP_PDU_PR_successfulOutcome) { + ret = s1ap_compare_s1ap_e_rabreleaseresponseies( + &m1->msg.s1ap_E_RABReleaseResponseIEs, + &m2->msg.s1ap_E_RABReleaseResponseIEs); + } + break; + case S1ap_ProcedureCode_id_E_RABReleaseIndication: + ret = s1ap_compare_s1ap_e_rabreleaseindicationies( + &m1->msg.s1ap_E_RABReleaseIndicationIEs, + &m2->msg.s1ap_E_RABReleaseIndicationIEs); + break; + case S1ap_ProcedureCode_id_InitialContextSetup: + AssertFatal(0, "S1ap_ProcedureCode_id_InitialContextSetup not implemented"); + break; + case S1ap_ProcedureCode_id_Paging: + ret = s1ap_compare_s1ap_pagingies( + &m1->msg.s1ap_PagingIEs, + &m2->msg.s1ap_PagingIEs); + break; + case S1ap_ProcedureCode_id_downlinkNASTransport: + ret = s1ap_compare_s1ap_downlinknastransporties( + &m1->msg.s1ap_DownlinkNASTransportIEs, + &m2->msg.s1ap_DownlinkNASTransportIEs); + break; + case S1ap_ProcedureCode_id_initialUEMessage: + ret = s1ap_compare_s1ap_initialuemessageies( + &m1->msg.s1ap_InitialUEMessageIEs, + &m2->msg.s1ap_InitialUEMessageIEs); + break; + case S1ap_ProcedureCode_id_uplinkNASTransport: + ret = s1ap_compare_s1ap_uplinknastransporties( + &m1->msg.s1ap_UplinkNASTransportIEs, + &m2->msg.s1ap_UplinkNASTransportIEs); + break; + case S1ap_ProcedureCode_id_Reset: + ret = s1ap_compare_s1ap_reseties( + &m1->msg.s1ap_ResetIEs, + &m2->msg.s1ap_ResetIEs); + break; + case S1ap_ProcedureCode_id_ErrorIndication: + ret = s1ap_compare_s1ap_errorindicationies( + &m1->msg.s1ap_ErrorIndicationIEs, + &m2->msg.s1ap_ErrorIndicationIEs); + break; + case S1ap_ProcedureCode_id_NASNonDeliveryIndication: + ret = s1ap_compare_s1ap_nasnondeliveryindication_ies( + &m1->msg.s1ap_NASNonDeliveryIndication_IEs, + &m2->msg.s1ap_NASNonDeliveryIndication_IEs); + break; + case S1ap_ProcedureCode_id_S1Setup: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_s1setuprequesties( + &m1->msg.s1ap_S1SetupRequestIEs, + &m2->msg.s1ap_S1SetupRequestIEs); + } else if (present == S1AP_PDU_PR_successfulOutcome) { + ret = s1ap_compare_s1ap_s1setupresponseies( + &m1->msg.s1ap_S1SetupResponseIEs, + &m2->msg.s1ap_S1SetupResponseIEs); + } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { + ret = s1ap_compare_s1ap_s1setupfailureies( + &m1->msg.s1ap_S1SetupFailureIEs, + &m2->msg.s1ap_S1SetupFailureIEs); + } + break; + case S1ap_ProcedureCode_id_UEContextReleaseRequest: + ret = s1ap_compare_s1ap_uecontextreleaserequesties( + &m1->msg.s1ap_UEContextReleaseRequestIEs, + &m2->msg.s1ap_UEContextReleaseRequestIEs); + break; + case S1ap_ProcedureCode_id_DownlinkS1cdma2000tunneling: + ret = s1ap_compare_s1ap_downlinks1cdma2000tunnelingies( + &m1->msg.s1ap_DownlinkS1cdma2000tunnelingIEs, + &m2->msg.s1ap_DownlinkS1cdma2000tunnelingIEs); + break; + case S1ap_ProcedureCode_id_UplinkS1cdma2000tunneling: + ret = s1ap_compare_s1ap_uplinks1cdma2000tunnelingies( + &m1->msg.s1ap_UplinkS1cdma2000tunnelingIEs, + &m2->msg.s1ap_UplinkS1cdma2000tunnelingIEs); + break; + case S1ap_ProcedureCode_id_UEContextModification: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_uecontextmodificationrequesties( + &m1->msg.s1ap_UEContextModificationRequestIEs, + &m2->msg.s1ap_UEContextModificationRequestIEs); + } else if (present == S1AP_PDU_PR_successfulOutcome) { + ret = s1ap_compare_s1ap_uecontextmodificationresponseies( + &m1->msg.s1ap_UEContextModificationResponseIEs, + &m2->msg.s1ap_UEContextModificationResponseIEs); + } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { + ret = s1ap_compare_s1ap_uecontextmodificationfailureies( + &m1->msg.s1ap_UEContextModificationFailureIEs, + &m2->msg.s1ap_UEContextModificationFailureIEs); + } + break; + case S1ap_ProcedureCode_id_UECapabilityInfoIndication: + ret = s1ap_compare_s1ap_uecapabilityinfoindicationies( + &m1->msg.s1ap_UECapabilityInfoIndicationIEs, + &m2->msg.s1ap_UECapabilityInfoIndicationIEs); + break; + case S1ap_ProcedureCode_id_UEContextRelease: + + break; + case S1ap_ProcedureCode_id_eNBStatusTransfer: + ret = s1ap_compare_s1ap_enbstatustransferies( + &m1->msg.s1ap_ENBStatusTransferIEs, + &m2->msg.s1ap_ENBStatusTransferIEs); + break; + case S1ap_ProcedureCode_id_MMEStatusTransfer: + ret = s1ap_compare_s1ap_mmestatustransferies( + &m1->msg.s1ap_MMEStatusTransferIEs, + &m2->msg.s1ap_MMEStatusTransferIEs); + break; + case S1ap_ProcedureCode_id_DeactivateTrace: + ret = s1ap_compare_s1ap_deactivatetraceies( + &m1->msg.s1ap_DeactivateTraceIEs, + &m2->msg.s1ap_DeactivateTraceIEs); + break; + case S1ap_ProcedureCode_id_TraceStart: + ret = s1ap_compare_s1ap_tracestarties( + &m1->msg.s1ap_TraceStartIEs, + &m2->msg.s1ap_TraceStartIEs); + break; + case S1ap_ProcedureCode_id_TraceFailureIndication: + ret = s1ap_compare_s1ap_tracefailureindicationies( + &m1->msg.s1ap_TraceFailureIndicationIEs, + &m2->msg.s1ap_TraceFailureIndicationIEs); + break; + case S1ap_ProcedureCode_id_ENBConfigurationUpdate: + case S1ap_ProcedureCode_id_MMEConfigurationUpdate: + case S1ap_ProcedureCode_id_LocationReportingControl: + case S1ap_ProcedureCode_id_LocationReportingFailureIndication: + case S1ap_ProcedureCode_id_LocationReport: + case S1ap_ProcedureCode_id_OverloadStart: + case S1ap_ProcedureCode_id_OverloadStop: + case S1ap_ProcedureCode_id_WriteReplaceWarning: + case S1ap_ProcedureCode_id_eNBDirectInformationTransfer: + case S1ap_ProcedureCode_id_MMEDirectInformationTransfer: + case S1ap_ProcedureCode_id_PrivateMessage: + case S1ap_ProcedureCode_id_eNBConfigurationTransfer: + case S1ap_ProcedureCode_id_MMEConfigurationTransfer: + case S1ap_ProcedureCode_id_CellTrafficTrace: + case S1ap_ProcedureCode_id_Kill: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_killrequesties( + &m1->msg.s1ap_KillRequestIEs, + &m2->msg.s1ap_KillRequestIEs); + } else { + ret = s1ap_compare_s1ap_killresponseies( + &m1->msg.s1ap_KillResponseIEs, + &m2->msg.s1ap_KillResponseIEs); + } + break; + case S1ap_ProcedureCode_id_downlinkUEAssociatedLPPaTransport: + ret = s1ap_compare_s1ap_downlinkueassociatedlppatransport_ies( + &m1->msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs, + &m2->msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs); + break; + case S1ap_ProcedureCode_id_uplinkUEAssociatedLPPaTransport: + ret = s1ap_compare_s1ap_uplinkueassociatedlppatransport_ies( + &m1->msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs, + &m2->msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs); + break; + case S1ap_ProcedureCode_id_downlinkNonUEAssociatedLPPaTransport: + ret = s1ap_compare_s1ap_downlinknonueassociatedlppatransport_ies( + &m1->msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs, + &m2->msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs); + break; + case S1ap_ProcedureCode_id_uplinkNonUEAssociatedLPPaTransport: + ret = s1ap_compare_s1ap_uplinknonueassociatedlppatransport_ies( + &m1->msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs, + &m2->msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs); + break; + default: + AssertFatal(0, "Unknown procedure code %ld", m1->procedureCode); + } + return 0; +} diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index 6856cb2933..314beae8e1 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -43,3 +43,48 @@ #include "assertions.h" #include "play_scenario.h" +//------------------------------------------------------------------------------ +int et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints) +{ + // no comparison for ports + if (sctp1->ppid != sctp2->ppid) return -4; + if (sctp1->assoc_id != sctp2->assoc_id) return -5; + if (sctp1->stream != sctp2->stream) { + if (constraints & ET_BIT_MASK_MATCH_SCTP_STREAM) { + return -2; + } else { + S1AP_WARN("No Matching SCTP stream %u %u\n", sctp1->stream, sctp2->stream); + } + } + if (sctp1->ssn != sctp2->ssn) { + if (constraints & ET_BIT_MASK_MATCH_SCTP_SSN) { + return -3; + } else { + S1AP_WARN("No Matching SCTP ssn %u %u\n", sctp1->ssn, sctp2->ssn); + } + } + return et_s1ap_is_matching(&sctp1->payload, &sctp2->payload, constraints); +} + +//------------------------------------------------------------------------------ +int et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints) +{ + // no comparison for ports + if (sctp1->chunk_type != sctp2->chunk_type) return -1; + switch (sctp1->chunk_type) { + case SCTP_CID_DATA: + return et_sctp_data_is_matching(&sctp1->u.data_hdr, &sctp2->u.data_hdr, constraints); + break; + + case SCTP_CID_INIT: + AssertFatal(0, "Not needed now"); + break; + case SCTP_CID_INIT_ACK: + AssertFatal(0, "Not needed now"); + break; + default: + AssertFatal(0, "Not needed now cid %d", sctp1->chunk_type); + } + + return 0; +} From 44355e1a7355cc0d36c5f5f636d88533287c2fe6 Mon Sep 17 00:00:00 2001 From: gauthier Date: Wed, 2 Dec 2015 11:26:21 +0100 Subject: [PATCH 014/122] Receiving setupresponse success, TBC --- openair3/TEST/EPC_TEST/play_scenario.c | 16 ++ openair3/TEST/EPC_TEST/play_scenario.h | 21 +- .../TEST/EPC_TEST/play_scenario_display.c | 22 ++ openair3/TEST/EPC_TEST/play_scenario_fsm.c | 5 +- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 61 ++++-- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 194 +++++++++++++++++- openair3/TEST/EPC_TEST/play_scenario_sctp.c | 18 +- 7 files changed, 305 insertions(+), 32 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index 216e098a01..9a9cb881b1 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -283,6 +283,22 @@ const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type) } } //------------------------------------------------------------------------------ +const char * const et_error_match2str(const int err) +{ + switch (err) { + case -ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE: return "SCTP_CHUNK_TYPE"; break; + case -ET_ERROR_MATCH_PACKET_SCTP_PPID: return "SCTP_PPID"; break; + case -ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID: return "SCTP_ASSOC_ID"; break; + case -ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID: return "SCTP_STREAM_ID"; break; + case -ET_ERROR_MATCH_PACKET_SCTP_SSN: return "SCTP_SSN"; break; + case -ET_ERROR_MATCH_PACKET_S1AP_PRESENT: return "S1AP_PRESENT"; break; + case -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE: return "S1AP_PROCEDURE_CODE"; break; + case -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY: return "S1AP_CRITICALITY"; break; + default: + AssertFatal (0, "ERROR: Unknown match error %d!(TODO handle an1c error codes)\n", err); + } +} +//------------------------------------------------------------------------------ et_packet_action_t et_action_str2et_action_t(const xmlChar * const action) { if ((!xmlStrcmp(action, (const xmlChar *)"SEND"))) { return ET_PACKET_ACTION_S1C_SEND;} diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 3c8c5faef8..d5f11e40f9 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -178,6 +178,19 @@ typedef enum { ET_FSM_STATE_END } et_fsm_state_t; +typedef enum { + ET_ERROR_MATCH_START = 1, + ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE = ET_ERROR_MATCH_START, + ET_ERROR_MATCH_PACKET_SCTP_PPID, + ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID, + ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID, + ET_ERROR_MATCH_PACKET_SCTP_SSN, + ET_ERROR_MATCH_PACKET_S1AP_PRESENT, + ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE, + ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY, + ET_ERROR_MATCH_END +} et_error_match_code_t; + @@ -332,9 +345,9 @@ typedef struct et_scenario_s { hash_table_t *hash_old_ue_mme_id2ue_mme_id; struct timeval time_last_tx_packet; struct timeval time_last_rx_packet; - et_packet_t *last_rx_packet; - et_packet_t *last_tx_packet; - et_packet_t *next_packet; + et_packet_t *last_rx_packet; // last packet received with all previous scenario RX packet received. + et_packet_t *last_tx_packet; // last sent packet + et_packet_t *next_packet; // next packet to be handled in the scenario (RX or TX packet) } et_scenario_t; @@ -402,6 +415,7 @@ s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance); void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,uint32_t buffer_length, uint16_t stream); int et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints); et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const s1ap_data_ind); +void et_scenario_set_packet_received(et_packet_t * const packet); void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind); void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind); void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, @@ -450,6 +464,7 @@ int et_compare_et_ip_to_net_ip_address(const et_ip_t * const ip, const net_ip_ad int et_hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len); sctp_cid_t et_chunk_type_str2cid(const xmlChar * const chunk_type_str); const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type); +const char * const et_error_match2str(const int err); et_packet_action_t et_action_str2et_action_t(const xmlChar * const action); void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip); void et_enb_config_init(const char const * lib_config_file_name_pP); diff --git a/openair3/TEST/EPC_TEST/play_scenario_display.c b/openair3/TEST/EPC_TEST/play_scenario_display.c index 406c69c858..2a924e952c 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_display.c +++ b/openair3/TEST/EPC_TEST/play_scenario_display.c @@ -273,6 +273,28 @@ void et_display_packet(const et_packet_t * const packet) default: fprintf(stdout, "\tPacket:\tAction UNKNOWN\n"); } + switch(packet->status) { + case ET_PACKET_STATUS_NONE: + fprintf(stdout, "\tPacket:\tStatus NONE\n"); + break; + case ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT: + fprintf(stdout, "\tPacket:\tStatus NOT_TAKEN_IN_ACCOUNT\n"); + break; + case ET_PACKET_STATUS_SCHEDULED_FOR_SENDING: + fprintf(stdout, "\tPacket:\tStatus SCHEDULED_FOR_SENDING\n"); + break; + case ET_PACKET_STATUS_SENT: + fprintf(stdout, "\tPacket:\tStatus SENT\n"); + break; + case ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING: + fprintf(stdout, "\tPacket:\tStatus SCHEDULED_FOR_RECEIVING\n"); + break; + case ET_PACKET_STATUS_RECEIVED: + fprintf(stdout, "\tPacket:\tStatus RECEIVED\n"); + break; + default: + fprintf(stdout, "\tPacket:\tStatus UNKNOWN\n"); + } et_display_packet_ip(&packet->ip_hdr); et_display_packet_sctp(&packet->sctp_hdr); } diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index 23ef72035c..d561668b17 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -292,7 +292,10 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) case ET_EVENT_INIT: AssertFatal(NULL == g_scenario, "Current scenario not ended"); g_scenario = event.u.init.scenario; - g_scenario->next_packet = g_scenario->list_packet; + g_scenario->next_packet = g_scenario->list_packet; + g_scenario->last_rx_packet = NULL; + g_scenario->last_tx_packet = NULL; + while (NULL != g_scenario->next_packet) { switch (g_scenario->next_packet->sctp_hdr.chunk_type) { diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 408ff72a4a..92cc3f766e 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -191,21 +191,21 @@ void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, //------------------------------------------------------------------------------ int et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints) { - if (s1ap1->pdu.present != s1ap2->pdu.present) return -6; + if (s1ap1->pdu.present != s1ap2->pdu.present) return -ET_ERROR_MATCH_PACKET_S1AP_PRESENT; switch (s1ap1->pdu.present) { case S1AP_PDU_PR_NOTHING: break; case S1AP_PDU_PR_initiatingMessage: - if (s1ap1->pdu.choice.initiatingMessage.procedureCode != s1ap2->pdu.choice.initiatingMessage.procedureCode) return -7; - if (s1ap1->pdu.choice.initiatingMessage.criticality != s1ap2->pdu.choice.initiatingMessage.criticality) return -8; + if (s1ap1->pdu.choice.initiatingMessage.procedureCode != s1ap2->pdu.choice.initiatingMessage.procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; + if (s1ap1->pdu.choice.initiatingMessage.criticality != s1ap2->pdu.choice.initiatingMessage.criticality) return -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; break; case S1AP_PDU_PR_successfulOutcome: - if (s1ap1->pdu.choice.successfulOutcome.procedureCode != s1ap2->pdu.choice.successfulOutcome.procedureCode) return -7; - if (s1ap1->pdu.choice.successfulOutcome.criticality != s1ap2->pdu.choice.successfulOutcome.criticality) return -8; + if (s1ap1->pdu.choice.successfulOutcome.procedureCode != s1ap2->pdu.choice.successfulOutcome.procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; + if (s1ap1->pdu.choice.successfulOutcome.criticality != s1ap2->pdu.choice.successfulOutcome.criticality) return -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; break; case S1AP_PDU_PR_unsuccessfulOutcome: - if (s1ap1->pdu.choice.unsuccessfulOutcome.procedureCode != s1ap2->pdu.choice.unsuccessfulOutcome.procedureCode) return -7; - if (s1ap1->pdu.choice.unsuccessfulOutcome.criticality != s1ap2->pdu.choice.unsuccessfulOutcome.criticality) return -8; + if (s1ap1->pdu.choice.unsuccessfulOutcome.procedureCode != s1ap2->pdu.choice.unsuccessfulOutcome.procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; + if (s1ap1->pdu.choice.unsuccessfulOutcome.criticality != s1ap2->pdu.choice.unsuccessfulOutcome.criticality) return -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; break; default: AssertFatal(0, "Unknown pdu.present %d", s1ap1->pdu.present); @@ -236,7 +236,8 @@ et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const packet->enb_instance = 0; //TODO //packet->ip_hdr; // keep in mind: allocated buffer: sctp_datahdr.payload.binary_stream - memcpy((void*)&packet->sctp_hdr, (void*)&s1ap_data_ind->sctp_datahdr, sizeof(packet->sctp_hdr)); + packet->sctp_hdr.chunk_type = SCTP_CID_DATA; + memcpy((void*)&packet->sctp_hdr.u.data_hdr, (void*)&s1ap_data_ind->sctp_datahdr, sizeof(packet->sctp_hdr)); //packet->next = NULL; packet->status = ET_PACKET_STATUS_RECEIVED; //packet->timer_id = 0; @@ -245,23 +246,54 @@ et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const } +//------------------------------------------------------------------------------ +void et_scenario_set_packet_received(et_packet_t * const packet) +{ + int rc = 0; + packet->status = ET_PACKET_STATUS_RECEIVED; + S1AP_DEBUG("Packet num %d received\n", packet->packet_number); + if (packet->timer_id != 0) { + rc = timer_remove(packet->timer_id); + AssertFatal(rc == 0, "Timer on Rx packet num %d unknown", packet->packet_number); + } +} + //------------------------------------------------------------------------------ void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) { et_packet_t * packet = NULL; et_packet_t * rx_packet = NULL; unsigned long int not_found = 1; + long rv = 0; AssertFatal (NULL != s1ap_data_ind, "Bad parameter sctp_data_ind\n"); rx_packet = et_build_packet_from_s1ap_data_ind(s1ap_data_ind); - packet = g_scenario->next_packet; + if (NULL == g_scenario->last_rx_packet) { + packet = g_scenario->list_packet; + while (NULL != packet) { + if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + if (packet->status == ET_PACKET_STATUS_RECEIVED) { + g_scenario->last_rx_packet = packet; + } else { + break; + } + } + packet = packet->next; + } + packet = g_scenario->list_packet; + } else { + packet = g_scenario->last_rx_packet; + } // not_found threshold may sure depend on number of mme, may be not sure on number of UE while ((NULL != packet) && (not_found < 5)) { if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - //TODO - if (et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints) == 0) { + rv = et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints); + if (0 == rv) { + S1AP_DEBUG("Compare RX packet with packet num %d succeeded\n", packet->packet_number); et_scenario_set_packet_received(packet); + } else { + S1AP_DEBUG("Compare RX packet with packet num %d failed %s\n", packet->packet_number, et_error_match2str(rv)); } } not_found += 1; @@ -388,9 +420,9 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, case SCTP_CID_DATA : S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_DATA\n",__FUNCTION__,assoc_id); - if (ET_PACKET_STATUS_NONE == packet->status) { + if ((ET_PACKET_STATUS_NONE == packet->status) || (ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING == packet->status)) { if (0 < old_mme_port) { - if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { + if (packet->action == ET_PACKET_ACTION_S1C_SEND) { ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address); if (0 == ret) { ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address); @@ -403,7 +435,7 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, } } } - } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &mme_desc_p->mme_net_ip_address); if (0 == ret) { ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &s1ap_eNB_instance->s1c_net_ip_address); @@ -474,6 +506,7 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, break; default: + AssertFatal(0, "Unknown chunk_type %d packet num %d", packet->sctp_hdr.chunk_type, packet->packet_number); ; } packet = packet->next; diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 5ad5708bab..239621854a 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -63,86 +63,156 @@ int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, long ret = 0; AssertFatal(m1 != NULL, "bad parameter m1"); AssertFatal(m2 != NULL, "bad parameter m2"); - if (m1->procedureCode != m2->procedureCode) return -1; + AssertFatal((present == S1AP_PDU_PR_initiatingMessage) || + (present == S1AP_PDU_PR_successfulOutcome) || + (present == S1AP_PDU_PR_unsuccessfulOutcome) , "bad parameter S1AP_PDU_PR present "); + if (m1->procedureCode != m2->procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; // some cases can never occur since uplink only. switch (m1->procedureCode) { case S1ap_ProcedureCode_id_HandoverPreparation: - AssertFatal(0, "S1ap_ProcedureCode_id_InitialContextSetup not implemented"); + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_handoverrequiredies( + &m1->msg.s1ap_HandoverRequiredIEs, + &m2->msg.s1ap_HandoverRequiredIEs); + } else { + ret = s1ap_compare_s1ap_handovercommandies( + &m1->msg.s1ap_HandoverCommandIEs, + &m2->msg.s1ap_HandoverCommandIEs); + } break; + case S1ap_ProcedureCode_id_HandoverResourceAllocation: - AssertFatal(0, "S1ap_ProcedureCode_id_InitialContextSetup not implemented"); + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_handoverrequesties( + &m1->msg.s1ap_HandoverRequestIEs, + &m2->msg.s1ap_HandoverRequestIEs); + } else if (present == S1AP_PDU_PR_successfulOutcome) { + ret = s1ap_compare_s1ap_handoverrequestacknowledgeies( + &m1->msg.s1ap_HandoverRequestAcknowledgeIEs, + &m2->msg.s1ap_HandoverRequestAcknowledgeIEs); + } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { + ret = s1ap_compare_s1ap_handoverfailureies( + &m1->msg.s1ap_HandoverFailureIEs, + &m2->msg.s1ap_HandoverFailureIEs); + } break; + case S1ap_ProcedureCode_id_HandoverNotification: - AssertFatal(0, "S1ap_ProcedureCode_id_HandoverNotification not implemented"); + ret = s1ap_compare_s1ap_handovernotifyies( + &m1->msg.s1ap_HandoverNotifyIEs, + &m2->msg.s1ap_HandoverNotifyIEs); break; + case S1ap_ProcedureCode_id_PathSwitchRequest: ret = s1ap_compare_s1ap_pathswitchrequesties( &m1->msg.s1ap_PathSwitchRequestIEs, &m2->msg.s1ap_PathSwitchRequestIEs); break; + case S1ap_ProcedureCode_id_HandoverCancel: ret = s1ap_compare_s1ap_handovercancelies( &m1->msg.s1ap_HandoverCancelIEs, &m2->msg.s1ap_HandoverCancelIEs); break; + case S1ap_ProcedureCode_id_E_RABSetup: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_e_rabsetuprequesties( + &m1->msg.s1ap_E_RABSetupRequestIEs, + &m2->msg.s1ap_E_RABSetupRequestIEs); + } else { + ret = s1ap_compare_s1ap_e_rabsetupresponseies( + &m1->msg.s1ap_E_RABSetupResponseIEs, + &m2->msg.s1ap_E_RABSetupResponseIEs); + } + break; + case S1ap_ProcedureCode_id_E_RABModify: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_e_rabmodifyrequesties( + &m1->msg.s1ap_E_RABModifyRequestIEs, + &m2->msg.s1ap_E_RABModifyRequestIEs); + } else { + ret = s1ap_compare_s1ap_e_rabmodifyresponseies( + &m1->msg.s1ap_E_RABModifyResponseIEs, + &m2->msg.s1ap_E_RABModifyResponseIEs); + } + break; + case S1ap_ProcedureCode_id_E_RABRelease: if (present == S1AP_PDU_PR_initiatingMessage) { ret = s1ap_compare_s1ap_e_rabreleasecommandies( &m1->msg.s1ap_E_RABReleaseCommandIEs, &m2->msg.s1ap_E_RABReleaseCommandIEs); - } else if (present == S1AP_PDU_PR_successfulOutcome) { + } else { ret = s1ap_compare_s1ap_e_rabreleaseresponseies( &m1->msg.s1ap_E_RABReleaseResponseIEs, &m2->msg.s1ap_E_RABReleaseResponseIEs); } break; + case S1ap_ProcedureCode_id_E_RABReleaseIndication: ret = s1ap_compare_s1ap_e_rabreleaseindicationies( &m1->msg.s1ap_E_RABReleaseIndicationIEs, &m2->msg.s1ap_E_RABReleaseIndicationIEs); break; + case S1ap_ProcedureCode_id_InitialContextSetup: - AssertFatal(0, "S1ap_ProcedureCode_id_InitialContextSetup not implemented"); + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_initialcontextsetuprequesties( + &m1->msg.s1ap_InitialContextSetupRequestIEs, + &m2->msg.s1ap_InitialContextSetupRequestIEs); + } else { + ret = s1ap_compare_s1ap_initialcontextsetupresponseies( + &m1->msg.s1ap_InitialContextSetupResponseIEs, + &m2->msg.s1ap_InitialContextSetupResponseIEs); + } break; + case S1ap_ProcedureCode_id_Paging: ret = s1ap_compare_s1ap_pagingies( &m1->msg.s1ap_PagingIEs, &m2->msg.s1ap_PagingIEs); break; + case S1ap_ProcedureCode_id_downlinkNASTransport: ret = s1ap_compare_s1ap_downlinknastransporties( &m1->msg.s1ap_DownlinkNASTransportIEs, &m2->msg.s1ap_DownlinkNASTransportIEs); break; + case S1ap_ProcedureCode_id_initialUEMessage: ret = s1ap_compare_s1ap_initialuemessageies( &m1->msg.s1ap_InitialUEMessageIEs, &m2->msg.s1ap_InitialUEMessageIEs); break; + case S1ap_ProcedureCode_id_uplinkNASTransport: ret = s1ap_compare_s1ap_uplinknastransporties( &m1->msg.s1ap_UplinkNASTransportIEs, &m2->msg.s1ap_UplinkNASTransportIEs); break; + case S1ap_ProcedureCode_id_Reset: ret = s1ap_compare_s1ap_reseties( &m1->msg.s1ap_ResetIEs, &m2->msg.s1ap_ResetIEs); break; + case S1ap_ProcedureCode_id_ErrorIndication: ret = s1ap_compare_s1ap_errorindicationies( &m1->msg.s1ap_ErrorIndicationIEs, &m2->msg.s1ap_ErrorIndicationIEs); break; + case S1ap_ProcedureCode_id_NASNonDeliveryIndication: ret = s1ap_compare_s1ap_nasnondeliveryindication_ies( &m1->msg.s1ap_NASNonDeliveryIndication_IEs, &m2->msg.s1ap_NASNonDeliveryIndication_IEs); break; + case S1ap_ProcedureCode_id_S1Setup: if (present == S1AP_PDU_PR_initiatingMessage) { ret = s1ap_compare_s1ap_s1setuprequesties( @@ -158,21 +228,25 @@ int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, &m2->msg.s1ap_S1SetupFailureIEs); } break; + case S1ap_ProcedureCode_id_UEContextReleaseRequest: ret = s1ap_compare_s1ap_uecontextreleaserequesties( &m1->msg.s1ap_UEContextReleaseRequestIEs, &m2->msg.s1ap_UEContextReleaseRequestIEs); break; + case S1ap_ProcedureCode_id_DownlinkS1cdma2000tunneling: ret = s1ap_compare_s1ap_downlinks1cdma2000tunnelingies( &m1->msg.s1ap_DownlinkS1cdma2000tunnelingIEs, &m2->msg.s1ap_DownlinkS1cdma2000tunnelingIEs); break; + case S1ap_ProcedureCode_id_UplinkS1cdma2000tunneling: ret = s1ap_compare_s1ap_uplinks1cdma2000tunnelingies( &m1->msg.s1ap_UplinkS1cdma2000tunnelingIEs, &m2->msg.s1ap_UplinkS1cdma2000tunnelingIEs); break; + case S1ap_ProcedureCode_id_UEContextModification: if (present == S1AP_PDU_PR_initiatingMessage) { ret = s1ap_compare_s1ap_uecontextmodificationrequesties( @@ -188,53 +262,152 @@ int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, &m2->msg.s1ap_UEContextModificationFailureIEs); } break; + case S1ap_ProcedureCode_id_UECapabilityInfoIndication: ret = s1ap_compare_s1ap_uecapabilityinfoindicationies( &m1->msg.s1ap_UECapabilityInfoIndicationIEs, &m2->msg.s1ap_UECapabilityInfoIndicationIEs); break; - case S1ap_ProcedureCode_id_UEContextRelease: + case S1ap_ProcedureCode_id_UEContextRelease: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_uecontextreleasecommandies( + &m1->msg.s1ap_UEContextReleaseCommandIEs, + &m2->msg.s1ap_UEContextReleaseCommandIEs); + } else { + ret = s1ap_compare_s1ap_uecontextreleasecompleteies( + &m1->msg.s1ap_UEContextReleaseCompleteIEs, + &m2->msg.s1ap_UEContextReleaseCompleteIEs); + } break; + case S1ap_ProcedureCode_id_eNBStatusTransfer: ret = s1ap_compare_s1ap_enbstatustransferies( &m1->msg.s1ap_ENBStatusTransferIEs, &m2->msg.s1ap_ENBStatusTransferIEs); break; + case S1ap_ProcedureCode_id_MMEStatusTransfer: ret = s1ap_compare_s1ap_mmestatustransferies( &m1->msg.s1ap_MMEStatusTransferIEs, &m2->msg.s1ap_MMEStatusTransferIEs); break; + case S1ap_ProcedureCode_id_DeactivateTrace: ret = s1ap_compare_s1ap_deactivatetraceies( &m1->msg.s1ap_DeactivateTraceIEs, &m2->msg.s1ap_DeactivateTraceIEs); break; + case S1ap_ProcedureCode_id_TraceStart: ret = s1ap_compare_s1ap_tracestarties( &m1->msg.s1ap_TraceStartIEs, &m2->msg.s1ap_TraceStartIEs); break; + case S1ap_ProcedureCode_id_TraceFailureIndication: ret = s1ap_compare_s1ap_tracefailureindicationies( &m1->msg.s1ap_TraceFailureIndicationIEs, &m2->msg.s1ap_TraceFailureIndicationIEs); break; + case S1ap_ProcedureCode_id_ENBConfigurationUpdate: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_enbconfigurationupdateies( + &m1->msg.s1ap_ENBConfigurationUpdateIEs, + &m2->msg.s1ap_ENBConfigurationUpdateIEs); + } else if (present == S1AP_PDU_PR_successfulOutcome) { + ret = s1ap_compare_s1ap_enbconfigurationupdateacknowledgeies( + &m1->msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs, + &m2->msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs); + } else { + ret = s1ap_compare_s1ap_enbconfigurationupdatefailureies( + &m1->msg.s1ap_ENBConfigurationUpdateFailureIEs, + &m2->msg.s1ap_ENBConfigurationUpdateFailureIEs); + } + break; + case S1ap_ProcedureCode_id_MMEConfigurationUpdate: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_mmeconfigurationupdateies( + &m1->msg.s1ap_MMEConfigurationUpdateIEs, + &m2->msg.s1ap_MMEConfigurationUpdateIEs); + } else if (present == S1AP_PDU_PR_successfulOutcome) { + ret = s1ap_compare_s1ap_mmeconfigurationupdateacknowledgeies( + &m1->msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs, + &m2->msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs); + } else { + ret = s1ap_compare_s1ap_mmeconfigurationupdatefailureies( + &m1->msg.s1ap_MMEConfigurationUpdateFailureIEs, + &m2->msg.s1ap_MMEConfigurationUpdateFailureIEs); + } + break; + case S1ap_ProcedureCode_id_LocationReportingControl: + ret = s1ap_compare_s1ap_locationreportingcontrolies( + &m1->msg.s1ap_LocationReportingControlIEs, + &m2->msg.s1ap_LocationReportingControlIEs); + break; + case S1ap_ProcedureCode_id_LocationReportingFailureIndication: + ret = s1ap_compare_s1ap_locationreportingfailureindicationies( + &m1->msg.s1ap_LocationReportingFailureIndicationIEs, + &m2->msg.s1ap_LocationReportingFailureIndicationIEs); + break; + case S1ap_ProcedureCode_id_LocationReport: + ret = s1ap_compare_s1ap_locationreporties( + &m1->msg.s1ap_LocationReportIEs, + &m2->msg.s1ap_LocationReportIEs); + break; + case S1ap_ProcedureCode_id_OverloadStart: + ret = s1ap_compare_s1ap_overloadstarties( + &m1->msg.s1ap_OverloadStartIEs, + &m2->msg.s1ap_OverloadStartIEs); + break; + case S1ap_ProcedureCode_id_OverloadStop: + ret = s1ap_compare_s1ap_overloadstopies( + &m1->msg.s1ap_OverloadStopIEs, + &m2->msg.s1ap_OverloadStopIEs); + break; + case S1ap_ProcedureCode_id_WriteReplaceWarning: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_writereplacewarningrequesties( + &m1->msg.s1ap_WriteReplaceWarningRequestIEs, + &m2->msg.s1ap_WriteReplaceWarningRequestIEs); + } else { + ret = s1ap_compare_s1ap_writereplacewarningresponseies( + &m1->msg.s1ap_WriteReplaceWarningResponseIEs, + &m2->msg.s1ap_WriteReplaceWarningResponseIEs); + } + break; + case S1ap_ProcedureCode_id_eNBDirectInformationTransfer: + ret = s1ap_compare_s1ap_enbdirectinformationtransferies( + &m1->msg.s1ap_ENBDirectInformationTransferIEs, + &m2->msg.s1ap_ENBDirectInformationTransferIEs); + break; + case S1ap_ProcedureCode_id_MMEDirectInformationTransfer: + + ret = s1ap_compare_s1ap_mmedirectinformationtransferies( + &m1->msg.s1ap_MMEDirectInformationTransferIEs, + &m2->msg.s1ap_MMEDirectInformationTransferIEs); + break; + case S1ap_ProcedureCode_id_PrivateMessage: case S1ap_ProcedureCode_id_eNBConfigurationTransfer: case S1ap_ProcedureCode_id_MMEConfigurationTransfer: + case S1ap_ProcedureCode_id_CellTrafficTrace: + ret = s1ap_compare_s1ap_celltraffictraceies( + &m1->msg.s1ap_CellTrafficTraceIEs, + &m2->msg.s1ap_CellTrafficTraceIEs); + break; + case S1ap_ProcedureCode_id_Kill: if (present == S1AP_PDU_PR_initiatingMessage) { ret = s1ap_compare_s1ap_killrequesties( @@ -246,28 +419,33 @@ int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, &m2->msg.s1ap_KillResponseIEs); } break; + case S1ap_ProcedureCode_id_downlinkUEAssociatedLPPaTransport: ret = s1ap_compare_s1ap_downlinkueassociatedlppatransport_ies( &m1->msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs, &m2->msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs); break; + case S1ap_ProcedureCode_id_uplinkUEAssociatedLPPaTransport: ret = s1ap_compare_s1ap_uplinkueassociatedlppatransport_ies( &m1->msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs, &m2->msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs); break; + case S1ap_ProcedureCode_id_downlinkNonUEAssociatedLPPaTransport: ret = s1ap_compare_s1ap_downlinknonueassociatedlppatransport_ies( &m1->msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs, &m2->msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs); break; + case S1ap_ProcedureCode_id_uplinkNonUEAssociatedLPPaTransport: ret = s1ap_compare_s1ap_uplinknonueassociatedlppatransport_ies( &m1->msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs, &m2->msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs); break; + default: AssertFatal(0, "Unknown procedure code %ld", m1->procedureCode); } - return 0; + return ret; } diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index 314beae8e1..a61701d92d 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -47,20 +47,26 @@ int et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints) { // no comparison for ports - if (sctp1->ppid != sctp2->ppid) return -4; - if (sctp1->assoc_id != sctp2->assoc_id) return -5; + if (sctp1->ppid != sctp2->ppid) { + S1AP_WARN("No Matching SCTP PPID %u %u\n", sctp1->ppid, sctp2->ppid); + return -ET_ERROR_MATCH_PACKET_SCTP_PPID; + } + if (sctp1->assoc_id != sctp2->assoc_id) { + S1AP_WARN("No Matching SCTP assoc id %u %u\n", sctp1->assoc_id, sctp2->assoc_id); + return -ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID; + } if (sctp1->stream != sctp2->stream) { if (constraints & ET_BIT_MASK_MATCH_SCTP_STREAM) { - return -2; + return -ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID; } else { S1AP_WARN("No Matching SCTP stream %u %u\n", sctp1->stream, sctp2->stream); } } if (sctp1->ssn != sctp2->ssn) { if (constraints & ET_BIT_MASK_MATCH_SCTP_SSN) { - return -3; + return -ET_ERROR_MATCH_PACKET_SCTP_SSN; } else { - S1AP_WARN("No Matching SCTP ssn %u %u\n", sctp1->ssn, sctp2->ssn); + S1AP_WARN("No Matching SCTP STREAM SN %u %u\n", sctp1->ssn, sctp2->ssn); } } return et_s1ap_is_matching(&sctp1->payload, &sctp2->payload, constraints); @@ -70,7 +76,7 @@ int et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * cons int et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints) { // no comparison for ports - if (sctp1->chunk_type != sctp2->chunk_type) return -1; + if (sctp1->chunk_type != sctp2->chunk_type) return -ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE; switch (sctp1->chunk_type) { case SCTP_CID_DATA: return et_sctp_data_is_matching(&sctp1->u.data_hdr, &sctp2->u.data_hdr, constraints); From 8a001c57bc4432786d2d5f8d1a5a8a3de5b3ef9b Mon Sep 17 00:00:00 2001 From: gauthier Date: Wed, 2 Dec 2015 13:04:21 +0100 Subject: [PATCH 015/122] Backup, need to feed with packets, still patch for asn1c to be comited --- openair3/TEST/EPC_TEST/play_scenario.h | 19 +++-- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 74 ++++++++++++++++--- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 24 ++++-- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 6 +- openair3/TEST/EPC_TEST/play_scenario_sctp.c | 4 +- 5 files changed, 97 insertions(+), 30 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index d5f11e40f9..604d0000bc 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -173,7 +173,8 @@ typedef enum { ET_FSM_STATE_START = 0, ET_FSM_STATE_NULL = ET_FSM_STATE_START, ET_FSM_STATE_CONNECTING_S1C, - ET_FSM_STATE_WAITING_EVENT, + ET_FSM_STATE_WAITING_RX_EVENT, + ET_FSM_STATE_WAITING_TX_EVENT, ET_FSM_STATE_RUNNING, ET_FSM_STATE_END } et_fsm_state_t; @@ -359,6 +360,7 @@ typedef enum { ET_EVENT_RX_S1AP, ET_EVENT_RX_PACKET_TIME_OUT, ET_EVENT_TX_TIMED_PACKET, + ET_EVENT_TICK, ET_EVENT_END } et_event_code_t; @@ -413,10 +415,10 @@ void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p); struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME(s1ap_eNB_instance_t *instance_p,int32_t assoc_id, uint16_t cnx_id); s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance); void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,uint32_t buffer_length, uint16_t stream); -int et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints); +long et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints); et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const s1ap_data_ind); -void et_scenario_set_packet_received(et_packet_t * const packet); -void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind); +int et_scenario_set_packet_received(et_packet_t * const packet); +int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind); void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind); void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, net_ip_address_t *mme_ip_address, @@ -435,7 +437,8 @@ int et_generate_xml_scenario( char const * tsml_out_scenario_filename); //------------------------- et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event); -et_fsm_state_t et_scenario_fsm_notify_event_state_waiting(et_event_t event); +et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event); +et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event); et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t event); et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event); et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event); @@ -448,10 +451,10 @@ void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); et_scenario_t* et_generate_scenario(const char * const et_scenario_filename ); //------------------------- -int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints); +long et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints); //------------------------- -int et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints); -int et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints); +long et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints); +long et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints); //------------------------------------------------------------------------------ void et_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num); int et_is_file_exists ( const char const * file_nameP, const char const *file_roleP); diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index d561668b17..b6ff0de859 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -87,7 +87,7 @@ void et_scenario_wait_rx_packet(et_packet_t * const packet) NULL, &packet->timer_id) < 0) { AssertFatal(0, " Can not start waiting RX event timer\n"); } - g_fsm_state = ET_FSM_STATE_WAITING_EVENT; + g_fsm_state = ET_FSM_STATE_WAITING_RX_EVENT; packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING; } //------------------------------------------------------------------------------ @@ -107,7 +107,7 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) AssertFatal(NULL != s1ap_eNB_instance, "Cannot get s1ap_eNB_instance_t for eNB instance %d", packet->enb_instance); LOG_D(ENB_APP, "%s\n", __FUNCTION__); - g_fsm_state = ET_FSM_STATE_WAITING_EVENT; + g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; switch (packet->sctp_hdr.chunk_type) { case SCTP_CID_DATA: @@ -160,6 +160,10 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) { switch (event.code){ + case ET_EVENT_TICK: + //TODO + + break; case ET_EVENT_RX_PACKET_TIME_OUT: AssertFatal(0, "Event ET_EVENT_RX_PACKET_TIME_OUT not handled in FSM state ET_FSM_STATE_RUNNING"); break; @@ -177,18 +181,17 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) } //------------------------------------------------------------------------------ -et_fsm_state_t et_scenario_fsm_notify_event_state_waiting(et_event_t event) +et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event) { - + int rv = 0; switch (event.code){ - case ET_EVENT_RX_PACKET_TIME_OUT: - fprintf(stderr, "Error The following packet is not received:\n"); - et_display_packet(event.u.rx_packet_time_out); - AssertFatal(0, "Waited packet not received"); + case ET_EVENT_TICK: break; + case ET_EVENT_RX_S1AP: - et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); + rv = et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); break; + case ET_EVENT_TX_TIMED_PACKET: // send immediately AssertFatal(0 == gettimeofday(&event.u.tx_timed_packet->timestamp_packet, NULL), "gettimeofday() Failed"); @@ -202,9 +205,39 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting(et_event_t event) g_fsm_state = ET_FSM_STATE_RUNNING; break; - + case ET_EVENT_RX_PACKET_TIME_OUT: default: - AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING", event.code); + AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING_TX", event.code); + } + pthread_mutex_unlock(&g_fsm_lock); + return 0; +} + +//------------------------------------------------------------------------------ +et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event) +{ + int rv = 0; + switch (event.code){ + case ET_EVENT_TICK: + break; + + case ET_EVENT_RX_PACKET_TIME_OUT: + fprintf(stderr, "Error The following packet is not received:\n"); + et_display_packet(event.u.rx_packet_time_out); + AssertFatal(0, "Waited packet not received"); + break; + + case ET_EVENT_RX_S1AP: + rv = et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); + // waited packet + if (rv == 0) { + g_fsm_state = ET_FSM_STATE_RUNNING; + } + break; + + case ET_EVENT_TX_TIMED_PACKET: + default: + AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING_RX", event.code); } pthread_mutex_unlock(&g_fsm_lock); return 0; @@ -215,6 +248,9 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even { switch (event.code){ + case ET_EVENT_TICK: + break; + case ET_EVENT_S1C_CONNECTED: // hack simulate we have been able to get the right timing values AssertFatal(gettimeofday(&g_scenario->time_last_tx_packet, NULL) == 0, "gettimeofday failed"); @@ -227,6 +263,11 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { et_scenario_schedule_tx_packet(g_scenario->next_packet); pthread_mutex_unlock(&g_fsm_lock); + + et_event_t continue_event; + continue_event.code = ET_EVENT_TICK; + et_scenario_fsm_notify_event(continue_event); + return g_fsm_state; } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { @@ -289,6 +330,9 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) { switch (event.code){ + case ET_EVENT_TICK: + break; + case ET_EVENT_INIT: AssertFatal(NULL == g_scenario, "Current scenario not ended"); g_scenario = event.u.init.scenario; @@ -304,6 +348,11 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { et_scenario_schedule_tx_packet(g_scenario->next_packet); pthread_mutex_unlock(&g_fsm_lock); + + et_event_t continue_event; + continue_event.code = ET_EVENT_TICK; + et_scenario_fsm_notify_event(continue_event); + return g_fsm_state; } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { @@ -382,7 +431,8 @@ et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event) switch (g_fsm_state){ case ET_FSM_STATE_NULL: return et_scenario_fsm_notify_event_state_null(event); break; case ET_FSM_STATE_CONNECTING_S1C: return et_scenario_fsm_notify_event_state_connecting_s1c(event); break; - case ET_FSM_STATE_WAITING_EVENT: return et_scenario_fsm_notify_event_state_waiting(event); break; + case ET_FSM_STATE_WAITING_TX_EVENT: return et_scenario_fsm_notify_event_state_waiting_tx(event); break; + case ET_FSM_STATE_WAITING_RX_EVENT: return et_scenario_fsm_notify_event_state_waiting_rx(event); break; case ET_FSM_STATE_RUNNING: return et_scenario_fsm_notify_event_state_running(event); break; default: AssertFatal(0, "Case fsm_state %d not handled", g_fsm_state); diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 92cc3f766e..336dc547d5 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -189,7 +189,7 @@ void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, itti_send_msg_to_task(TASK_SCTP, instance, message_p); } //------------------------------------------------------------------------------ -int et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints) +long et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints) { if (s1ap1->pdu.present != s1ap2->pdu.present) return -ET_ERROR_MATCH_PACKET_S1AP_PRESENT; switch (s1ap1->pdu.present) { @@ -247,19 +247,22 @@ et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const //------------------------------------------------------------------------------ -void et_scenario_set_packet_received(et_packet_t * const packet) +// return 0 if packet was waited +int et_scenario_set_packet_received(et_packet_t * const packet) { int rc = 0; packet->status = ET_PACKET_STATUS_RECEIVED; S1AP_DEBUG("Packet num %d received\n", packet->packet_number); if (packet->timer_id != 0) { rc = timer_remove(packet->timer_id); - AssertFatal(rc == 0, "Timer on Rx packet num %d unknown", packet->packet_number); + AssertFatal(rc == 0, "TODO: Debug Timer on Rx packet num %d unknown", packet->packet_number); + return rc; } + return 1; } //------------------------------------------------------------------------------ -void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) +int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) { et_packet_t * packet = NULL; et_packet_t * rx_packet = NULL; @@ -291,9 +294,15 @@ void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) rv = et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints); if (0 == rv) { S1AP_DEBUG("Compare RX packet with packet num %d succeeded\n", packet->packet_number); - et_scenario_set_packet_received(packet); + return et_scenario_set_packet_received(packet); } else { S1AP_DEBUG("Compare RX packet with packet num %d failed %s\n", packet->packet_number, et_error_match2str(rv)); + // asn1 compare no match return code, may not collide with non asn1 error return codes + // (each asn1 rc <= 166 (enum e_S1ap_ProtocolIE_ID, in generated file S1ap_ProtocolIE_ID.h)) + if ((rv > 0) || (rv <= -ET_ERROR_MATCH_END)) { + //TODO MME_UE_S1AP_ID, etc. + AssertFatal(0,"Some work needed there"); + } } } not_found += 1; @@ -301,6 +310,7 @@ void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) } S1AP_DEBUG("Rx packet not found in scenario:\n"); et_display_packet_sctp(&rx_packet->sctp_hdr); + return -1; } //------------------------------------------------------------------------------ @@ -344,6 +354,10 @@ void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind) et_scenario_fsm_notify_event(event); + memset((void*)&event, 0, sizeof(event)); + event.code = ET_EVENT_TICK; + et_scenario_fsm_notify_event(event); + } //------------------------------------------------------------------------------ void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 239621854a..5300476e98 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -58,15 +58,15 @@ extern et_scenario_t *g_scenario; extern uint32_t g_constraints; //------------------------------------------------------------------------------ -int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints) +long et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints) { long ret = 0; AssertFatal(m1 != NULL, "bad parameter m1"); AssertFatal(m2 != NULL, "bad parameter m2"); AssertFatal((present == S1AP_PDU_PR_initiatingMessage) || (present == S1AP_PDU_PR_successfulOutcome) || - (present == S1AP_PDU_PR_unsuccessfulOutcome) , "bad parameter S1AP_PDU_PR present "); - if (m1->procedureCode != m2->procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; + (present == S1AP_PDU_PR_unsuccessfulOutcome) , "Bad parameter S1AP_PDU_PR present "); + AssertFatal( m1->procedureCode == m2->procedureCode, "Bad parameters: no matching procedure codes"); // some cases can never occur since uplink only. diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index a61701d92d..07206f53b8 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -44,7 +44,7 @@ #include "play_scenario.h" //------------------------------------------------------------------------------ -int et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints) +long et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints) { // no comparison for ports if (sctp1->ppid != sctp2->ppid) { @@ -73,7 +73,7 @@ int et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * cons } //------------------------------------------------------------------------------ -int et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints) +long et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints) { // no comparison for ports if (sctp1->chunk_type != sctp2->chunk_type) return -ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE; From e547fa872442df5571f2e23c0329b5aa9dcb5c75 Mon Sep 17 00:00:00 2001 From: gauthier Date: Fri, 4 Dec 2015 11:16:47 +0100 Subject: [PATCH 016/122] Able to begin replay a scenario...debug needed --- cmake_targets/tools/build_helper | 1 + cmake_targets/tools/build_test_epc_tools | 5 + openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 | 1030 +++++++++++++++++++ openair3/TEST/EPC_TEST/play_scenario.c | 8 +- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 77 +- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 22 +- 6 files changed, 1133 insertions(+), 10 deletions(-) create mode 100644 openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 46997c2773..350dae86a6 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -274,6 +274,7 @@ install_asn1c_from_source(){ patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch.p0 >> /tmp/log_compile_asn1c patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_2.p0 >> /tmp/log_compile_asn1c patch -p0 < $OPENAIR_DIR/openair2/RRC/LITE/MESSAGES/asn1c/asn1cpatch.p0 >> /tmp/log_compile_asn1c + patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 >> /tmp/log_compile_asn1c ./configure make > /tmp/log_compile_asn1c 2>&1 $SUDO make install diff --git a/cmake_targets/tools/build_test_epc_tools b/cmake_targets/tools/build_test_epc_tools index db49fa017b..b67cf15810 100755 --- a/cmake_targets/tools/build_test_epc_tools +++ b/cmake_targets/tools/build_test_epc_tools @@ -141,9 +141,14 @@ function main() compilations \ epc_test test_epc_generate_scenario \ test_epc_generate_scenario $dbin/test_epc_generate_scenario + compilations \ epc_test test_epc_play_scenario \ test_epc_play_scenario $dbin/test_epc_play_scenario + + $SUDO cp -upv test_epc_generate_scenario /usr/local/bin + $SUDO cp -upv test_epc_play_scenario /usr/local/bin + $SUDO cp -upv $OPENAIR_DIR/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml /usr/local/bin } diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 b/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 new file mode 100644 index 0000000000..cf3553c362 --- /dev/null +++ b/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 @@ -0,0 +1,1030 @@ +--- ./asn1c/unber.c 2015-12-03 09:43:33.959009150 +0100 ++++ ./asn1c/unber.c 2015-11-30 13:20:40.751264003 +0100 +@@ -779,4 +779,6 @@ + + asn_enc_rval_t OCTET_STRING_encode_aper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void *sptr, asn_per_outp_t *po) { asn_enc_rval_t er = { 0, 0, 0 }; (void)td; (void)cts; (void)sptr; (void)po; return er; } + ++long OCTET_STRING_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { (void)td1; (void)sptr1; (void)td2; (void)sptr2; return 0; } ++ + size_t xer_whitespace_span(const void *chunk_buf, size_t chunk_size) { (void)chunk_buf; (void)chunk_size; return 0; } +--- ./libasn1compiler/asn1c_C.c 2015-12-03 09:43:33.971009150 +0100 ++++ ./libasn1compiler/asn1c_C.c 2015-11-30 14:29:33.027259725 +0100 +@@ -1082,6 +1082,8 @@ + enum tvm_compat tv_mode; + enum etd_spec etd_spec; + char *p; ++ char tmp_buf[512]; ++ int i = 0; + + if(arg->embed) { + enum tnfmt tnfmt = TNF_CTYPE; +@@ -1243,7 +1245,8 @@ + OUT("td->uper_decoder = asn_DEF_%s.uper_decoder;\n", type_name); + OUT("td->uper_encoder = asn_DEF_%s.uper_encoder;\n", type_name); + OUT("td->aper_decoder = asn_DEF_%s.aper_decoder;\n", type_name); +- OUT("td->aper_encoder = asn_DEF_%s.aper_encoder;\n", type_name); ++ OUT("td->aper_encoder = asn_DEF_%s.aper_encoder;\n", type_name); ++ OUT("td->compare = asn_DEF_%s.compare;\n", type_name); + if(!terminal && !tags_count) { + OUT("/* The next four lines are here because of -fknown-extern-type */\n"); + OUT("td->tags = asn_DEF_%s.tags;\n", type_name); +@@ -1413,6 +1416,49 @@ + OUT("}\n"); + OUT("\n"); + ++ ++ i = 0; ++ while ((p[i] != '_') && (i < sizeof(tmp_buf))) { ++ tmp_buf[i] = p[i]; ++ i++; ++ } ++ tmp_buf[i] = '\0'; ++ // hack, only for s1ap ++ if ((strcmp("S1ap", tmp_buf) == 0) || (strcmp("X2ap", tmp_buf) == 0)) ++ OUT("#include \"%s-ProtocolIE-ID.h\"\n", tmp_buf); ++ ++ ++ p = MKID(expr); ++ if(HIDE_INNER_DEFS) OUT("static "); ++ OUT("long\n"); ++ OUT("%s", p); ++ if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index); ++ OUT("_compare(asn_TYPE_descriptor_t *td1,\n"); ++ i = 0; ++ while ((p[i] != '_') && (i < sizeof(tmp_buf))) { ++ tmp_buf[i] = p[i]; ++ i++; ++ } ++ tmp_buf[i] = '\0'; ++ strcat(tmp_buf,"_ProtocolIE_ID_id_"); ++ strcat(tmp_buf,&p[++i]); ++ INDENTED( ++ OUT("\tvoid *structure1,\n"); ++ OUT("\tasn_TYPE_descriptor_t *td2,\n"); ++ OUT("\tvoid *structure2) {\n"); ++ OUT("long rv = 0;\n"); ++ OUT("%s_%d_inherit_TYPE_descriptor(td1);\n", ++ p, expr->_type_unique_index); ++ OUT("%s_%d_inherit_TYPE_descriptor(td2);\n", ++ p, expr->_type_unique_index); ++ OUT("rv = td1->compare(td1, structure1, td2, structure2);\n"); ++ if ((strcmp("S1ap", tmp_buf) == 0) || (strcmp("X2ap", tmp_buf) == 0)) ++ OUT("if (rv) { rv = (rv << 8); rv |= %s;}\n", tmp_buf); ++ OUT("return rv;\n"); ++ ); ++ OUT("}\n"); ++ OUT("\n"); ++ + p = MKID(expr); + + if(HIDE_INNER_DEFS) OUT("static "); +@@ -1450,7 +1496,8 @@ + OUT("per_type_decoder_f %s_decode_uper;\n", p); + OUT("per_type_encoder_f %s_encode_uper;\n", p); + OUT("per_type_decoder_f %s_decode_aper;\n", p); +- OUT("per_type_encoder_f %s_encode_aper;\n", p); ++ OUT("per_type_encoder_f %s_encode_aper;\n", p); ++ OUT("type_compare_f %s_compare;\n", p); + } + } + +@@ -2501,6 +2548,7 @@ + OUT("0, 0,\t/* No APER support, " + "use \"-gen-PER\" to enable */\n"); + } ++ FUNCREF(compare); + + if(!terminal || terminal->expr_type == ASN_CONSTR_CHOICE) { + //if(expr->expr_type == ASN_CONSTR_CHOICE) { +--- ./skeletons/ANY.c 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/ANY.c 2015-11-26 14:40:56.547616803 +0100 +@@ -24,7 +24,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + 0, 0, 0, 0, + 0, /* No PER visible constraints */ +--- ./skeletons/BIT_STRING.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/BIT_STRING.c 2015-11-26 14:41:50.159616747 +0100 +@@ -30,7 +30,8 @@ + OCTET_STRING_decode_uper, /* Unaligned PER decoder */ + OCTET_STRING_encode_uper, /* Unaligned PER encoder */ + OCTET_STRING_decode_aper, /* Aligned PER decoder */ +- OCTET_STRING_encode_aper, /* Aligned PER encoder */ ++ OCTET_STRING_encode_aper, /* Aligned PER encoder */ ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_BIT_STRING_tags, + sizeof(asn_DEF_BIT_STRING_tags) +--- ./skeletons/BMPString.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/BMPString.c 2015-11-26 14:42:08.487616728 +0100 +@@ -36,7 +36,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, /* Aligned PER decoder */ +- OCTET_STRING_encode_aper, /* Aligned PER encoder */ ++ OCTET_STRING_encode_aper, /* Aligned PER encoder */ ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_BMPString_tags, + sizeof(asn_DEF_BMPString_tags) +--- ./skeletons/BOOLEAN.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/BOOLEAN.c 2015-11-30 13:16:30.275264262 +0100 +@@ -25,7 +25,8 @@ + BOOLEAN_decode_uper, /* Unaligned PER decoder */ + BOOLEAN_encode_uper, /* Unaligned PER encoder */ + BOOLEAN_decode_aper, /* Aligned PER decoder */ +- BOOLEAN_encode_aper, /* Aligned PER encoder */ ++ BOOLEAN_encode_aper, /* Aligned PER encoder */ ++ BOOLEAN_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_BOOLEAN_tags, + sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), +@@ -326,3 +327,21 @@ + + _ASN_ENCODED_OK(er); + } ++ ++long ++BOOLEAN_compare(asn_TYPE_descriptor_t *td1, ++ void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { ++ const BOOLEAN_t *st1 = (const BOOLEAN_t *)sptr1; ++ const BOOLEAN_t *st2 = (const BOOLEAN_t *)sptr2; ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ return (*st1 != *st2); ++} ++ +--- ./skeletons/BOOLEAN.h 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/BOOLEAN.h 2015-11-26 12:46:58.491623882 +0100 +@@ -30,6 +30,7 @@ + per_type_encoder_f BOOLEAN_encode_uper; + per_type_decoder_f BOOLEAN_decode_aper; + per_type_encoder_f BOOLEAN_encode_aper; ++type_compare_f BOOLEAN_compare; + + #ifdef __cplusplus + } +--- ./skeletons/compare.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./skeletons/compare.h 2015-11-30 13:15:56.415264297 +0100 +@@ -0,0 +1,27 @@ ++/*- ++ * Eurecom 2015. ++ */ ++#ifndef _COMPARE_H_ ++#define _COMPARE_H_ ++ ++#include ++#include ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++struct asn_TYPE_descriptor_s; /* Forward declaration */ ++ ++typedef long (type_compare_f)( ++ struct asn_TYPE_descriptor_s *type_descriptor1, ++ void *struct_ptr1, ++ struct asn_TYPE_descriptor_s *type_descriptor2, ++ void *struct_ptr2 ++); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* _COMPARE_H_ */ +--- ./skeletons/constr_CHOICE.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/constr_CHOICE.c 2015-11-30 13:16:49.007264243 +0100 +@@ -1272,3 +1272,57 @@ + assert(pres_size != sizeof(int)); + } + } ++ ++long ++CHOICE_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) ++{ ++ asn_CHOICE_specifics_t *specs1 = (asn_CHOICE_specifics_t *)td1->specifics; ++ asn_CHOICE_specifics_t *specs2 = (asn_CHOICE_specifics_t *)td2->specifics; ++ int present1; ++ int present2; ++ ++ if ((!sptr1) && (!sptr2)) return 0; ++ if (!sptr1) return -1; ++ if (!sptr2) return -1; ++ ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ ++ /* ++ * Figure out which CHOICE element is encoded. ++ */ ++ present1 = _fetch_present_idx(sptr1, specs1->pres_offset,specs1->pres_size); ++ // same specs ++ present2 = _fetch_present_idx(sptr2, specs2->pres_offset,specs2->pres_size); ++ ++ if (td1->elements_count != td2->elements_count) return -1; ++ if (present1 != present2) return -1; ++ if(present1 > 0 && present1 <= td1->elements_count) { ++ asn_TYPE_member_t *elm1 = &td1->elements[present1-1]; ++ asn_TYPE_member_t *elm2 = &td2->elements[present2-1]; ++ const void *memb_ptr1; ++ const void *memb_ptr2; ++ ++ if((elm1->flags & ATF_POINTER) && (elm1->flags & ATF_POINTER)){ ++ memb_ptr1 = *(const void * const *)((const char *)sptr1 + elm1->memb_offset); ++ memb_ptr2 = *(const void * const *)((const char *)sptr2 + elm2->memb_offset); ++ if((!memb_ptr1) && (!memb_ptr2)) return -1; ++ if (!memb_ptr1) return -1; ++ if (!memb_ptr2) return -1; ++ } else if (!(elm1->flags & ATF_POINTER) && !(elm1->flags & ATF_POINTER)){ ++ memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset); ++ memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset); ++ } else { ++ return -1; ++ } ++ return elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2); ++ } ++ return 0; ++} +--- ./skeletons/constr_CHOICE.h 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/constr_CHOICE.h 2015-11-26 14:43:57.647616615 +0100 +@@ -39,7 +39,7 @@ + /* + * A set specialized functions dealing with the CHOICE type. + */ +-asn_struct_free_f CHOICE_free; ++asn_struct_free_f CHOICE_free; + asn_struct_print_f CHOICE_print; + asn_constr_check_f CHOICE_constraint; + ber_type_decoder_f CHOICE_decode_ber; +@@ -50,7 +50,8 @@ + per_type_encoder_f CHOICE_encode_uper; + per_type_decoder_f CHOICE_decode_aper; + per_type_encoder_f CHOICE_encode_aper; +-asn_outmost_tag_f CHOICE_outmost_tag; ++type_compare_f CHOICE_compare; ++asn_outmost_tag_f CHOICE_outmost_tag; + + #ifdef __cplusplus + } +--- ./skeletons/constr_SEQUENCE.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/constr_SEQUENCE.c 2015-11-30 13:17:33.871264196 +0100 +@@ -1761,3 +1761,50 @@ + + _ASN_ENCODED_OK(er); + } ++ ++long ++SEQUENCE_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { ++ int edx; ++ int ret; ++ ++ if((!sptr1) && (!sptr2)) return -1; ++ if(!sptr1) return -1; ++ if(!sptr2) return -1; ++ ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ ++ if (td1->elements_count != td2->elements_count) return -1; ++ ++ for(edx = 0; edx < td1->elements_count; edx++) { ++ asn_TYPE_member_t *elm1 = &td1->elements[edx]; ++ asn_TYPE_member_t *elm2 = &td1->elements[edx]; ++ const void *memb_ptr1; ++ const void *memb_ptr2; ++ ++ if(elm1->flags & ATF_POINTER) { ++ memb_ptr1 = *(const void * const *)((const char *)sptr1 + elm1->memb_offset); ++ memb_ptr2 = *(const void * const *)((const char *)sptr2 + elm2->memb_offset); ++ if((!memb_ptr1) && (!memb_ptr2)) { ++ if(elm1->optional) continue; ++ } ++ if (!memb_ptr1) return -1; ++ if (!memb_ptr2) return -1; ++ } else { ++ memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset); ++ memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset); ++ } ++ ++ /* Compare the member itself */ ++ ret = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2); ++ if(ret) return ret; ++ } ++ return 0; ++} +--- ./skeletons/constr_SEQUENCE.h 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/constr_SEQUENCE.h 2015-11-26 14:48:14.123616350 +0100 +@@ -54,6 +54,7 @@ + per_type_encoder_f SEQUENCE_encode_uper; + per_type_decoder_f SEQUENCE_decode_aper; + per_type_encoder_f SEQUENCE_encode_aper; ++type_compare_f SEQUENCE_compare; + + #ifdef __cplusplus + } +--- ./skeletons/constr_SEQUENCE_OF.h 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/constr_SEQUENCE_OF.h 2015-11-26 15:05:25.399615282 +0100 +@@ -22,7 +22,8 @@ + #define SEQUENCE_OF_decode_ber SET_OF_decode_ber + #define SEQUENCE_OF_decode_xer SET_OF_decode_xer + #define SEQUENCE_OF_decode_uper SET_OF_decode_uper +-#define SEQUENCE_OF_decode_aper SET_OF_decode_aper ++#define SEQUENCE_OF_decode_aper SET_OF_decode_aper ++#define SEQUENCE_OF_compare SET_OF_compare + der_type_encoder_f SEQUENCE_OF_encode_der; + xer_type_encoder_f SEQUENCE_OF_encode_xer; + per_type_encoder_f SEQUENCE_OF_encode_uper; +--- ./skeletons/constr_SET.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/constr_SET.c 2015-11-30 13:17:49.903264180 +0100 +@@ -1108,7 +1108,7 @@ + } + } + +-int ++long + SET_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + int edx; +--- ./skeletons/constr_SET.h 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/constr_SET.h 2015-11-26 14:49:09.243616293 +0100 +@@ -56,6 +56,7 @@ + per_type_decoder_f SET_decode_aper; + per_type_encoder_f SET_encode_uper; + per_type_encoder_f SET_encode_aper; ++type_compare_f SET_compare; + + /*********************** + * Some handy helpers. * +--- ./skeletons/constr_SET_OF.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/constr_SET_OF.c 2015-11-30 13:17:42.099264188 +0100 +@@ -1039,3 +1039,46 @@ + rv.consumed = 0; + return rv; + } ++ ++long ++SET_OF_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) ++{ ++ asn_TYPE_member_t *elm1 = td1->elements; ++ asn_TYPE_member_t *elm2 = td2->elements; ++ const asn_anonymous_set_ *list1 = _A_CSET_FROM_VOID(sptr1); ++ const asn_anonymous_set_ *list2 = _A_CSET_FROM_VOID(sptr2); ++ int ret; ++ int i; ++ ++ if((!sptr1) && !(sptr2)) return 0; ++ if(!sptr1) return -1; ++ if(!sptr2) return -1; ++ ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ ++ if (td1->elements_count != td2->elements_count) return -1; ++ ++ ++ if (list1->count != list2->count ) return -1; ++ ++ for(i = 0; i < list1->count; i++) { ++ const void *memb_ptr1 = list1->array[i]; ++ const void *memb_ptr2 = list2->array[i]; ++ if ((!memb_ptr1) & (!memb_ptr2)) continue; ++ if(!memb_ptr1) return -1; ++ if(!memb_ptr2) return -1; ++ ++ ret = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2); ++ if(ret) return ret; ++ } ++ ++ return 0; ++} +--- ./skeletons/constr_SET_OF.h 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/constr_SET_OF.h 2015-11-26 14:48:45.067616318 +0100 +@@ -36,6 +36,7 @@ + per_type_encoder_f SET_OF_encode_uper; + per_type_decoder_f SET_OF_decode_aper; + per_type_encoder_f SET_OF_encode_aper; ++type_compare_f SET_OF_compare; + + #ifdef __cplusplus + } +--- ./skeletons/constr_TYPE.h 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/constr_TYPE.h 2015-11-26 15:28:05.495613874 +0100 +@@ -41,7 +41,8 @@ + #include /* Encoder into XER (XML, text) */ + #include /* Packet Encoding Rules decoder */ + #include /* Packet Encoding Rules encoder */ +-#include /* Subtype constraints support */ ++#include /* Subtype constraints support */ ++#include /* Comparison */ + + /* + * Free the structure according to its specification. +@@ -101,6 +102,7 @@ + per_type_encoder_f *uper_encoder; /* Unaligned PER encoder */ + per_type_decoder_f *aper_decoder; /* Aligned PER decoder */ + per_type_encoder_f *aper_encoder; /* Aligned PER encoder */ ++ type_compare_f *compare; /* Comparison between 2 instances */ + + /*********************************************************************** + * Internally useful members. Not to be used by applications directly. * +--- ./skeletons/ENUMERATED.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/ENUMERATED.c 2015-11-30 13:18:05.399264164 +0100 +@@ -27,7 +27,8 @@ + ENUMERATED_decode_uper, /* Unaligned PER decoder */ + ENUMERATED_encode_uper, /* Unaligned PER encoder */ + ENUMERATED_decode_aper, /* Aligned PER decoder */ +- ENUMERATED_encode_aper, /* Aligned PER encoder */ ++ ENUMERATED_encode_aper, /* Aligned PER encoder */ ++ ENUMERATED_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_ENUMERATED_tags, + sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), +@@ -103,3 +104,22 @@ + + return NativeEnumerated_encode_aper(td, constraints, &value, po); + } ++ ++long ++ENUMERATED_compare(asn_TYPE_descriptor_t *td1, void *sptr1, ++ asn_TYPE_descriptor_t *td2, void *sptr2) { ++ ENUMERATED_t *st1 = (ENUMERATED_t *)sptr1; ++ ENUMERATED_t *st2 = (ENUMERATED_t *)sptr2; ++ ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ return (*st1 != *st2); ++} ++ +--- ./skeletons/ENUMERATED.h 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/ENUMERATED.h 2015-11-26 12:46:35.523623906 +0100 +@@ -19,6 +19,7 @@ + per_type_encoder_f ENUMERATED_encode_uper; + per_type_decoder_f ENUMERATED_decode_aper; + per_type_encoder_f ENUMERATED_encode_aper; ++type_compare_f ENUMERATED_compare; + + #ifdef __cplusplus + } +--- ./skeletons/file-dependencies 2015-12-03 09:43:33.731009150 +0100 ++++ ./skeletons/file-dependencies 2015-11-26 16:05:44.923611535 +0100 +@@ -39,7 +39,7 @@ + constr_SEQUENCE.h constr_SEQUENCE.c + constr_SEQUENCE_OF.h constr_SEQUENCE_OF.c asn_SEQUENCE_OF.h constr_SET_OF.h + constr_SET.h constr_SET.c +-constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h ++constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h compare.h + + COMMON-FILES: # THIS IS A SPECIAL SECTION + asn_application.h # Applications should include this file +--- ./skeletons/GeneralizedTime.c 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/GeneralizedTime.c 2015-11-26 15:09:03.899615056 +0100 +@@ -168,7 +168,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_GeneralizedTime_tags, + sizeof(asn_DEF_GeneralizedTime_tags) +--- ./skeletons/GeneralString.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/GeneralString.c 2015-11-26 14:50:11.843616228 +0100 +@@ -25,7 +25,8 @@ + OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_GeneralString_tags, + sizeof(asn_DEF_GeneralString_tags) +--- ./skeletons/GraphicString.c 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/GraphicString.c 2015-11-26 15:33:33.255613535 +0100 +@@ -25,7 +25,8 @@ + OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_GraphicString_tags, + sizeof(asn_DEF_GraphicString_tags) +--- ./skeletons/IA5String.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/IA5String.c 2015-11-26 14:50:44.219616194 +0100 +@@ -31,6 +31,7 @@ + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, + OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_IA5String_tags, + sizeof(asn_DEF_IA5String_tags) +--- ./skeletons/INTEGER.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/INTEGER.c 2015-11-30 13:18:18.143264151 +0100 +@@ -35,6 +35,7 @@ + INTEGER_decode_aper, + INTEGER_encode_aper, + #endif /* ASN_DISABLE_PER_SUPPORT */ ++ INTEGER_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_INTEGER_tags, + sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), +@@ -1501,3 +1502,20 @@ + } + + ++long ++INTEGER_compare(asn_TYPE_descriptor_t *td1, void *sptr1, ++ asn_TYPE_descriptor_t *td2, void *sptr2) { ++ INTEGER_t *st1 = (INTEGER_t *)sptr1; ++ INTEGER_t *st2 = (INTEGER_t *)sptr2; ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ if (st1->size != st2->size) return -1; ++ return memcmp(st1->buf, st2->buf, st1->size); ++} +--- ./skeletons/INTEGER.h 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/INTEGER.h 2015-11-26 12:50:41.551623651 +0100 +@@ -43,6 +43,7 @@ + per_type_encoder_f INTEGER_encode_uper; + per_type_decoder_f INTEGER_decode_aper; + per_type_encoder_f INTEGER_encode_aper; ++type_compare_f INTEGER_compare; + + /*********************************** + * Some handy conversion routines. * +--- ./skeletons/ISO646String.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/ISO646String.c 2015-11-26 12:55:48.327623333 +0100 +@@ -30,7 +30,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_ISO646String_tags, + sizeof(asn_DEF_ISO646String_tags) +--- ./skeletons/Makefile.am 2015-12-03 09:43:33.715009150 +0100 ++++ ./skeletons/Makefile.am 2015-11-26 15:28:55.887613822 +0100 +@@ -50,7 +50,7 @@ + ber_decoder.c ber_decoder.h \ + ber_tlv_length.c ber_tlv_length.h \ + ber_tlv_tag.c ber_tlv_tag.h \ +- constr_CHOICE.c constr_CHOICE.h \ ++ comparison.h constr_CHOICE.c constr_CHOICE.h \ + constr_SEQUENCE.c constr_SEQUENCE.h \ + constr_SEQUENCE_OF.c constr_SEQUENCE_OF.h \ + constr_SET.c constr_SET.h \ +--- ./skeletons/NativeEnumerated.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/NativeEnumerated.c 2015-11-30 13:18:32.015264136 +0100 +@@ -31,7 +31,8 @@ + NativeEnumerated_decode_uper, + NativeEnumerated_encode_uper, + NativeEnumerated_decode_aper, +- NativeEnumerated_encode_aper, ++ NativeEnumerated_encode_aper, ++ NativeEnumerated_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NativeEnumerated_tags, + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), +@@ -335,3 +336,25 @@ + + _ASN_ENCODED_OK(er); + } ++ ++long ++NativeEnumerated_compare(asn_TYPE_descriptor_t *td1, void *sptr1, ++ asn_TYPE_descriptor_t *td2, void *sptr2) { ++ const asn_INTEGER_enum_map_t *a = sptr1; ++ const asn_INTEGER_enum_map_t *b = sptr2; ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ ++ if(a->nat_value == b->nat_value) ++ return 0; ++ if(a->nat_value < b->nat_value) ++ return -1; ++ return 1; ++} +--- ./skeletons/NativeEnumerated.h 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/NativeEnumerated.h 2015-11-26 14:51:43.315616133 +0100 +@@ -26,6 +26,7 @@ + per_type_encoder_f NativeEnumerated_encode_uper; + per_type_decoder_f NativeEnumerated_decode_aper; + per_type_encoder_f NativeEnumerated_encode_aper; ++type_compare_f NativeEnumerated_compare; + + #ifdef __cplusplus + } +--- ./skeletons/NativeInteger.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/NativeInteger.c 2015-11-30 13:18:39.887264128 +0100 +@@ -32,7 +32,8 @@ + NativeInteger_decode_uper, /* Unaligned PER decoder */ + NativeInteger_encode_uper, /* Unaligned PER encoder */ + NativeInteger_decode_aper, /* Aligned PER decoder */ +- NativeInteger_encode_aper, /* Aligned PER encoder */ ++ NativeInteger_encode_aper, /* Aligned PER encoder */ ++ NativeInteger_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NativeInteger_tags, + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), +@@ -410,3 +411,20 @@ + } + } + ++ ++long ++NativeInteger_compare(asn_TYPE_descriptor_t *td1, void *sptr1, ++ asn_TYPE_descriptor_t *td2, void *sptr2) { ++ const long *native1 = (const long *)sptr1; ++ const long *native2 = (const long *)sptr2; ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ return (*native1 != *native2); ++} +--- ./skeletons/NativeInteger.h 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/NativeInteger.h 2015-11-26 14:52:13.931616101 +0100 +@@ -31,6 +31,7 @@ + per_type_encoder_f NativeInteger_encode_uper; + per_type_decoder_f NativeInteger_decode_aper; + per_type_encoder_f NativeInteger_encode_aper; ++type_compare_f NativeInteger_compare; + + #ifdef __cplusplus + } +--- ./skeletons/NativeReal.c 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/NativeReal.c 2015-11-30 13:18:46.655264121 +0100 +@@ -33,7 +33,8 @@ + NativeReal_decode_uper, + NativeReal_encode_uper, + NativeReal_decode_aper, +- NativeReal_encode_aper, ++ NativeReal_encode_aper, ++ NativeReal_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NativeReal_tags, + sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]), +@@ -405,3 +406,21 @@ + } + } + ++long ++NativeReal_compare(asn_TYPE_descriptor_t *td1, void *sptr1, ++ asn_TYPE_descriptor_t *td2, void *sptr2) { ++ REAL_t *st1 = (REAL_t *)sptr1; ++ REAL_t *st2 = (REAL_t *)sptr2; ++ ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ if (st1->size != st2->size) return -1; ++ return memcmp(st1->buf, st2->buf, st1->size); ++} +--- ./skeletons/NativeReal.h 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/NativeReal.h 2015-11-26 14:31:12.631617407 +0100 +@@ -29,6 +29,7 @@ + per_type_encoder_f NativeReal_encode_uper; + per_type_decoder_f NativeReal_decode_aper; + per_type_encoder_f NativeReal_encode_aper; ++type_compare_f NativeReal_compare; + + #ifdef __cplusplus + } +--- ./skeletons/NULL.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/NULL.c 2015-11-30 13:18:53.047264114 +0100 +@@ -26,7 +26,8 @@ + NULL_decode_uper, /* Unaligned PER decoder */ + NULL_encode_uper, /* Unaligned PER encoder */ + NULL_decode_aper, /* Aligned PER decoder */ +- NULL_encode_aper, /* Aligned PER encoder */ ++ NULL_encode_aper, /* Aligned PER encoder */ ++ NULL_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NULL_tags, + sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), +@@ -192,3 +193,10 @@ + er.encoded = 0; + _ASN_ENCODED_OK(er); + } ++ ++long ++NULL_compare(asn_TYPE_descriptor_t *td1, void *sptr1, ++ asn_TYPE_descriptor_t *td2, void *sptr2) { ++ ++ return 0; ++} +--- ./skeletons/NULL.h 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/NULL.h 2015-11-26 14:53:03.875616050 +0100 +@@ -27,6 +27,7 @@ + per_type_encoder_f NULL_encode_uper; + per_type_decoder_f NULL_decode_aper; + per_type_encoder_f NULL_encode_aper; ++type_compare_f NULL_compare; + + #ifdef __cplusplus + } +--- ./skeletons/NumericString.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/NumericString.c 2015-11-26 14:40:39.407616820 +0100 +@@ -50,7 +50,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NumericString_tags, + sizeof(asn_DEF_NumericString_tags) +--- ./skeletons/ObjectDescriptor.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/ObjectDescriptor.c 2015-11-26 14:55:46.227615882 +0100 +@@ -25,7 +25,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_ObjectDescriptor_tags, + sizeof(asn_DEF_ObjectDescriptor_tags) +--- ./skeletons/OBJECT_IDENTIFIER.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/OBJECT_IDENTIFIER.c 2015-11-26 14:55:13.311615916 +0100 +@@ -28,7 +28,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_OBJECT_IDENTIFIER_tags, + sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) +--- ./skeletons/OCTET_STRING.c 2015-12-03 09:43:33.975009150 +0100 ++++ ./skeletons/OCTET_STRING.c 2015-11-30 13:19:18.271264088 +0100 +@@ -37,7 +37,8 @@ + OCTET_STRING_decode_uper, /* Unaligned PER decoder */ + OCTET_STRING_encode_uper, /* Unaligned PER encoder */ + OCTET_STRING_decode_aper, /* Aligned PER decoder */ +- OCTET_STRING_encode_aper, /* Aligned PER encoder */ ++ OCTET_STRING_encode_aper, /* Aligned PER encoder */ ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_OCTET_STRING_tags, + sizeof(asn_DEF_OCTET_STRING_tags) +@@ -2160,3 +2161,21 @@ + return st; + } + ++long ++OCTET_STRING_compare(asn_TYPE_descriptor_t *td1, ++ void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { ++ OCTET_STRING_t *st1 = (OCTET_STRING_t *)sptr1; ++ OCTET_STRING_t *st2 = (OCTET_STRING_t *)sptr2; ++ ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ if (st1->size != st2->size) return -1; ++ return memcmp(st1->buf, st2->buf, st1->size); ++} +--- ./skeletons/OCTET_STRING.h 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/OCTET_STRING.h 2015-11-26 12:56:15.259623305 +0100 +@@ -34,6 +34,7 @@ + per_type_encoder_f OCTET_STRING_encode_uper; + per_type_decoder_f OCTET_STRING_decode_aper; + per_type_encoder_f OCTET_STRING_encode_aper; ++type_compare_f OCTET_STRING_compare; + + /****************************** + * Handy conversion routines. * +--- ./skeletons/PrintableString.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/PrintableString.c 2015-11-26 14:56:09.787615857 +0100 +@@ -60,7 +60,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_PrintableString_tags, + sizeof(asn_DEF_PrintableString_tags) +--- ./skeletons/REAL.c 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/REAL.c 2015-11-30 13:19:27.671264079 +0100 +@@ -46,7 +46,8 @@ + REAL_decode_uper, + REAL_encode_uper, + REAL_decode_aper, +- REAL_encode_aper, ++ REAL_encode_aper, ++ REAL_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_REAL_tags, + sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]), +@@ -741,3 +742,23 @@ + + return 0; + } ++ ++ ++long ++REAL_compare(asn_TYPE_descriptor_t *td1, void *sptr1, ++ asn_TYPE_descriptor_t *td2, void *sptr2) { ++ REAL_t *st1 = (REAL_t *)sptr1; ++ REAL_t *st2 = (REAL_t *)sptr2; ++ ++ if ((td1) && (td2)) { ++ if ((td1->name) && (td2->name)) { ++ if (strcmp(td1->name, td2->name)) return -1; ++ } else { ++ if ((td1->xml_tag) && (td2->xml_tag)) { ++ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; ++ } ++ } ++ } ++ if (st1->size != st2->size) return -1; ++ return memcmp(st1->buf, st2->buf, st1->size); ++} +--- ./skeletons/REAL.h 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/REAL.h 2015-11-26 13:00:46.183623025 +0100 +@@ -23,6 +23,7 @@ + per_type_encoder_f REAL_encode_uper; + per_type_decoder_f REAL_decode_aper; + per_type_encoder_f REAL_encode_aper; ++type_compare_f REAL_compare; + + /*********************************** + * Some handy conversion routines. * +--- ./skeletons/RELATIVE-OID.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/RELATIVE-OID.c 2015-11-26 14:56:31.703615834 +0100 +@@ -29,7 +29,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_RELATIVE_OID_tags, + sizeof(asn_DEF_RELATIVE_OID_tags) +--- ./skeletons/T61String.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/T61String.c 2015-11-26 14:57:07.235615798 +0100 +@@ -25,7 +25,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_T61String_tags, + sizeof(asn_DEF_T61String_tags) +--- ./skeletons/TeletexString.c 2015-12-03 09:43:33.963009150 +0100 ++++ ./skeletons/TeletexString.c 2015-11-26 14:57:17.643615787 +0100 +@@ -25,7 +25,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_TeletexString_tags, + sizeof(asn_DEF_TeletexString_tags) +--- ./skeletons/UniversalString.c 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/UniversalString.c 2015-11-26 14:57:29.015615775 +0100 +@@ -36,7 +36,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_UniversalString_tags, + sizeof(asn_DEF_UniversalString_tags) +--- ./skeletons/UTCTime.c 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/UTCTime.c 2015-11-26 14:57:44.127615759 +0100 +@@ -41,7 +41,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_UTCTime_tags, + sizeof(asn_DEF_UTCTime_tags) +--- ./skeletons/UTF8String.c 2015-12-03 09:43:33.959009150 +0100 ++++ ./skeletons/UTF8String.c 2015-11-26 14:06:54.563618917 +0100 +@@ -27,6 +27,7 @@ + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, + OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_UTF8String_tags, + sizeof(asn_DEF_UTF8String_tags) +--- ./skeletons/VideotexString.c 2015-12-03 09:43:33.967009150 +0100 ++++ ./skeletons/VideotexString.c 2015-11-26 14:07:06.139618905 +0100 +@@ -25,7 +25,8 @@ + OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_VideotexString_tags, + sizeof(asn_DEF_VideotexString_tags) +--- ./skeletons/VisibleString.c 2015-12-03 09:43:33.971009150 +0100 ++++ ./skeletons/VisibleString.c 2015-11-26 14:07:15.283618895 +0100 +@@ -30,7 +30,8 @@ + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, +- OCTET_STRING_encode_aper, ++ OCTET_STRING_encode_aper, ++ OCTET_STRING_compare, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_VisibleString_tags, + sizeof(asn_DEF_VisibleString_tags) diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index 9a9cb881b1..1aab216428 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -331,18 +331,18 @@ int et_compare_et_ip_to_net_ip_address(const et_ip_t * const ip, const net_ip_ad switch (ip->address_family) { case AF_INET: if (net_ip->ipv4) { - S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv4_address)); + //S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv4_address)); return strcmp(ip->str, net_ip->ipv4_address); } - S1AP_DEBUG("%s(%s,%s)=-1 (IP version (4) not matching)\n",__FUNCTION__,ip->str, net_ip->ipv4_address); + //S1AP_DEBUG("%s(%s,%s)=-1 (IP version (4) not matching)\n",__FUNCTION__,ip->str, net_ip->ipv4_address); return -1; break; case AF_INET6: if (net_ip->ipv6) { - S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv6_address)); + //S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv6_address)); return strcmp(ip->str, net_ip->ipv6_address); } - S1AP_DEBUG("%s(%s,%s)=-1 (IP version (6) not matching)\n",__FUNCTION__,ip->str, net_ip->ipv6_address); + //S1AP_DEBUG("%s(%s,%s)=-1 (IP version (6) not matching)\n",__FUNCTION__,ip->str, net_ip->ipv6_address); return -1; break; default: diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index b6ff0de859..1db9df632e 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -87,6 +87,7 @@ void et_scenario_wait_rx_packet(et_packet_t * const packet) NULL, &packet->timer_id) < 0) { AssertFatal(0, " Can not start waiting RX event timer\n"); } + LOG_D(ENB_APP, "Waiting RX packet num %d\n", packet->packet_number); g_fsm_state = ET_FSM_STATE_WAITING_RX_EVENT; packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING; } @@ -144,6 +145,7 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, packet->sctp_hdr.u.data_hdr.stream); packet->status = ET_PACKET_STATUS_SENT; + g_scenario->next_packet = g_scenario->next_packet->next; g_fsm_state = ET_FSM_STATE_RUNNING; } break; @@ -161,8 +163,76 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) switch (event.code){ case ET_EVENT_TICK: - //TODO + while (NULL != g_scenario->next_packet) { + LOG_D(ENB_APP, "EVENT_TICK: Considering packet num %d:\n", g_scenario->next_packet->packet_number); + switch (g_scenario->next_packet->sctp_hdr.chunk_type) { + case SCTP_CID_DATA : + // no init in this scenario, may be sub-scenario + if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { + if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) { + et_scenario_schedule_tx_packet(g_scenario->next_packet); + pthread_mutex_unlock(&g_fsm_lock); + et_event_t continue_event; + continue_event.code = ET_EVENT_TICK; + et_scenario_fsm_notify_event(continue_event); + + return g_fsm_state; + } else if (g_scenario->next_packet->status != ET_PACKET_STATUS_SCHEDULED_FOR_SENDING) { + AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status); + } + } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { + g_scenario->next_packet = g_scenario->next_packet->next; + + } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) { + et_scenario_wait_rx_packet(g_scenario->next_packet); + pthread_mutex_unlock(&g_fsm_lock); + return g_fsm_state; + } else { + AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status); + } + } else { + AssertFatal(0, "Invalid packet action %d", g_scenario->next_packet->action); + } + break; + + case SCTP_CID_INIT: + case SCTP_CID_INIT_ACK: + case SCTP_CID_HEARTBEAT: + case SCTP_CID_HEARTBEAT_ACK: + case SCTP_CID_COOKIE_ECHO: + case SCTP_CID_COOKIE_ACK: + case SCTP_CID_ECN_ECNE: + case SCTP_CID_ECN_CWR: + LOG_D(ENB_APP, "EVENT_TICK: Ignoring packet num %d SCTP CID %s\n", + g_scenario->next_packet->packet_number, + et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type)); + g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; + g_scenario->next_packet = g_scenario->next_packet->next; + break; + + case SCTP_CID_ABORT: + case SCTP_CID_SHUTDOWN: + case SCTP_CID_SHUTDOWN_ACK: + case SCTP_CID_ERROR: + case SCTP_CID_SHUTDOWN_COMPLETE: + AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)", + et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type)); + break; + + default: + LOG_D(ENB_APP, "EVENT_TICK: Ignoring packet num %d SCTP CID %s\n", + g_scenario->next_packet->packet_number, + et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type)); + g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; + g_scenario->next_packet = g_scenario->next_packet->next; + } + } + fprintf(stderr, "No Packet found in this scenario: %s\n", g_scenario->name); + g_fsm_state = ET_FSM_STATE_NULL; + pthread_mutex_unlock(&g_fsm_lock); + return g_fsm_state; break; case ET_EVENT_RX_PACKET_TIME_OUT: AssertFatal(0, "Event ET_EVENT_RX_PACKET_TIME_OUT not handled in FSM state ET_FSM_STATE_RUNNING"); @@ -186,6 +256,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event) int rv = 0; switch (event.code){ case ET_EVENT_TICK: + fprintf(stdout, "EVENT_TICK: waiting for tx event\n"); break; case ET_EVENT_RX_S1AP: @@ -202,6 +273,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event) event.u.tx_timed_packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, event.u.tx_timed_packet->sctp_hdr.u.data_hdr.stream); event.u.tx_timed_packet->status = ET_PACKET_STATUS_SENT; + g_scenario->next_packet = event.u.tx_timed_packet->next; g_fsm_state = ET_FSM_STATE_RUNNING; break; @@ -219,6 +291,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event) int rv = 0; switch (event.code){ case ET_EVENT_TICK: + fprintf(stdout, "EVENT_TICK: waiting for rx event\n"); break; case ET_EVENT_RX_PACKET_TIME_OUT: @@ -272,7 +345,6 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { g_scenario->last_rx_packet = g_scenario->next_packet; - g_scenario->next_packet = g_scenario->next_packet->next; g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet; g_scenario->next_packet = g_scenario->next_packet->next; @@ -357,7 +429,6 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { g_scenario->last_rx_packet = g_scenario->next_packet; - g_scenario->next_packet = g_scenario->next_packet->next; g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet; g_scenario->next_packet = g_scenario->next_packet->next; diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 336dc547d5..142ab069e9 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -250,9 +250,24 @@ et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const // return 0 if packet was waited int et_scenario_set_packet_received(et_packet_t * const packet) { - int rc = 0; + et_packet_t * p = NULL; + int rc = 0; + packet->status = ET_PACKET_STATUS_RECEIVED; S1AP_DEBUG("Packet num %d received\n", packet->packet_number); + + p = g_scenario->last_rx_packet; + while (NULL != p) { + if (p->action == ET_PACKET_ACTION_S1C_RECEIVE) { + if (p->status == ET_PACKET_STATUS_RECEIVED) { + g_scenario->last_rx_packet = p; + } else { + break; + } + } + p = p->next; + } + if (packet->timer_id != 0) { rc = timer_remove(packet->timer_id); AssertFatal(rc == 0, "TODO: Debug Timer on Rx packet num %d unknown", packet->packet_number); @@ -278,6 +293,7 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (packet->status == ET_PACKET_STATUS_RECEIVED) { g_scenario->last_rx_packet = packet; + g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet; } else { break; } @@ -286,7 +302,7 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) } packet = g_scenario->list_packet; } else { - packet = g_scenario->last_rx_packet; + packet = g_scenario->last_rx_packet->next; } // not_found threshold may sure depend on number of mme, may be not sure on number of UE while ((NULL != packet) && (not_found < 5)) { @@ -308,8 +324,8 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) not_found += 1; packet = packet->next; } - S1AP_DEBUG("Rx packet not found in scenario:\n"); et_display_packet_sctp(&rx_packet->sctp_hdr); + AssertFatal(0, "Rx packet not found in scenario (see dump above)"); return -1; } From afa23c829b015c6a024e04fc7e9e0db4f92e1148 Mon Sep 17 00:00:00 2001 From: gauthier Date: Fri, 4 Dec 2015 16:12:49 +0100 Subject: [PATCH 017/122] Timings seems to be OK, (to be checked more accurately) --- openair3/TEST/EPC_TEST/play_scenario.h | 10 +++---- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 30 ++++++++++++++++---- openair3/TEST/EPC_TEST/play_scenario_parse.c | 1 + openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 29 +++++++++++++------ 4 files changed, 51 insertions(+), 19 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 604d0000bc..a926ea55e4 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -344,11 +344,11 @@ typedef struct et_scenario_s { hash_table_t *hash_mme2association_id; hash_table_t *hash_old_ue_mme_id2ue_mme_id; - struct timeval time_last_tx_packet; - struct timeval time_last_rx_packet; - et_packet_t *last_rx_packet; // last packet received with all previous scenario RX packet received. - et_packet_t *last_tx_packet; // last sent packet - et_packet_t *next_packet; // next packet to be handled in the scenario (RX or TX packet) + struct timeval time_last_tx_packet; // Time last sent packet + struct timeval time_last_rx_packet; // Time last packet received with all previous scenario RX packet received. + et_packet_t *last_rx_packet; // Last packet received with all previous scenario RX packet received. + et_packet_t *last_tx_packet; // Last sent packet + et_packet_t *next_packet; // Next packet to be handled in the scenario (RX or TX packet) } et_scenario_t; diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index 1db9df632e..b76d2240f5 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -55,17 +55,19 @@ uint32_t g_constraints = ET_BIT_MASK_MATCH_SCTP_STREAM | ET_BIT_MASK_MA int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b) { struct timeval b2; + int nsec = 0; b2.tv_sec = b->tv_sec; b2.tv_usec = b->tv_usec; + /* Perform the carry for the later subtraction by updating y. */ if (a->tv_usec < b2.tv_usec) { - int nsec = (b2.tv_usec - a->tv_usec) / 1000000 + 1; + nsec = (b2.tv_usec - a->tv_usec) / 1000000 + 1; b2.tv_usec -= 1000000 * nsec; b2.tv_sec += nsec; } if (a->tv_usec - b2.tv_usec > 1000000) { - int nsec = (a->tv_usec - b2.tv_usec) / 1000000; + nsec = (a->tv_usec - b2.tv_usec) / 1000000; b2.tv_usec += 1000000 * nsec; b2.tv_sec -= nsec; } @@ -75,7 +77,8 @@ int timeval_subtract (struct timeval * const result, struct timeval * const a, s result->tv_sec = a->tv_sec - b2.tv_sec; result->tv_usec = a->tv_usec - b2.tv_usec; - /* Return 1 if result is negative. */ + LOG_D(ENB_APP, "timeval_subtract(%ld.%06d, %ld.%06d)=%ld.%06d\n", a->tv_sec, a->tv_usec, b->tv_sec, b->tv_usec, result->tv_sec, result->tv_usec); + return a->tv_sec < b2.tv_sec; } @@ -117,15 +120,22 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) AssertFatal(gettimeofday(&now, NULL) == 0, "gettimeofday failed"); timeval_subtract(&offset_last_tx_packet,&now,&g_scenario->time_last_tx_packet); timeval_subtract(&offset_last_rx_packet,&now,&g_scenario->time_last_rx_packet); + LOG_D(ENB_APP, "offset_last_tx_packet=%ld.%06d\n", offset_last_tx_packet.tv_sec, offset_last_tx_packet.tv_usec); + LOG_D(ENB_APP, "offset_last_rx_packet=%ld.%06d\n", offset_last_rx_packet.tv_sec, offset_last_rx_packet.tv_usec); + last_packet_was_tx = timeval_subtract(&offset_tx_rx,&offset_last_tx_packet,&offset_last_rx_packet); if (last_packet_was_tx) { + LOG_D(ENB_APP, "last_packet_was_tx\n"); we_are_too_early = timeval_subtract(&offset,&offset_last_tx_packet,&packet->time_relative_to_last_sent_packet); + LOG_D(ENB_APP, "we_are_too_early=%d, offset=%ld.%06d\n", we_are_too_early, offset.tv_sec, offset.tv_usec); } else { + LOG_D(ENB_APP, "last_packet_was_rx\n"); we_are_too_early = timeval_subtract(&offset,&offset_last_rx_packet,&packet->time_relative_to_last_received_packet); + LOG_D(ENB_APP, "we_are_too_early=%d, offset=%ld.%06d\n", we_are_too_early, offset.tv_sec, offset.tv_usec); } if (we_are_too_early > 0) { // set timer - LOG_D(ENB_APP, "Send packet num %u original frame number %u in %ld.%d sec\n", + LOG_D(ENB_APP, "Send packet num %u original frame number %u in %ld.%06d sec\n", packet->packet_number, packet->original_frame_number, offset.tv_sec, offset.tv_usec); packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_SENDING; @@ -138,6 +148,10 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) LOG_D(ENB_APP, "Send packet num %u original frame number %u immediately\n", packet->packet_number, packet->original_frame_number); // send immediately AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed"); + + g_scenario->time_last_tx_packet.tv_sec = packet->timestamp_packet.tv_sec; + g_scenario->time_last_tx_packet.tv_usec = packet->timestamp_packet.tv_usec; + et_s1ap_eNB_itti_send_sctp_data_req( packet->enb_instance, packet->sctp_hdr.u.data_hdr.assoc_id, @@ -266,6 +280,10 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event) case ET_EVENT_TX_TIMED_PACKET: // send immediately AssertFatal(0 == gettimeofday(&event.u.tx_timed_packet->timestamp_packet, NULL), "gettimeofday() Failed"); + + g_scenario->time_last_tx_packet.tv_sec = event.u.tx_timed_packet->timestamp_packet.tv_sec; + g_scenario->time_last_tx_packet.tv_usec = event.u.tx_timed_packet->timestamp_packet.tv_usec; + et_s1ap_eNB_itti_send_sctp_data_req( event.u.tx_timed_packet->enb_instance, event.u.tx_timed_packet->sctp_hdr.u.data_hdr.assoc_id, @@ -325,8 +343,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even break; case ET_EVENT_S1C_CONNECTED: - // hack simulate we have been able to get the right timing values - AssertFatal(gettimeofday(&g_scenario->time_last_tx_packet, NULL) == 0, "gettimeofday failed"); + // hack simulate we have been able to get the right timing values for STCP connect AssertFatal(gettimeofday(&g_scenario->time_last_rx_packet, NULL) == 0, "gettimeofday failed"); while (NULL != g_scenario->next_packet) { @@ -452,6 +469,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) // Try to register each eNB g_scenario->registered_enb = 0; g_fsm_state = ET_FSM_STATE_CONNECTING_S1C; + AssertFatal(gettimeofday(&g_scenario->time_last_tx_packet, NULL) == 0, "gettimeofday failed"); et_eNB_app_register (g_scenario->enb_properties); pthread_mutex_unlock(&g_fsm_lock); return g_fsm_state; diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index cb302f229a..496102449a 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -343,6 +343,7 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { xml_char = xmlGetProp(node, (const xmlChar *)"action"); packet->action = et_action_str2et_action_t(xml_char); + packet->status = ET_PACKET_STATUS_NONE; xmlFree(xml_char); packet->packet_number = packet_number++; diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 142ab069e9..df26de97c2 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -254,13 +254,18 @@ int et_scenario_set_packet_received(et_packet_t * const packet) int rc = 0; packet->status = ET_PACKET_STATUS_RECEIVED; - S1AP_DEBUG("Packet num %d received\n", packet->packet_number); + S1AP_DEBUG("Packet received: num %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); + S1AP_DEBUG("Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number); p = g_scenario->last_rx_packet; while (NULL != p) { - if (p->action == ET_PACKET_ACTION_S1C_RECEIVE) { - if (p->status == ET_PACKET_STATUS_RECEIVED) { + if (ET_PACKET_ACTION_S1C_RECEIVE == p->action) { + if ((ET_PACKET_STATUS_RECEIVED == p->status) || (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT == p->status)) { g_scenario->last_rx_packet = p; + g_scenario->time_last_rx_packet.tv_sec = p->timestamp_packet.tv_sec; + g_scenario->time_last_rx_packet.tv_usec = p->timestamp_packet.tv_usec; + S1AP_DEBUG("Set Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number); + S1AP_DEBUG("Set time_last_rx_packet %ld.%06d\n", g_scenario->time_last_rx_packet.tv_sec, g_scenario->time_last_rx_packet.tv_usec); } else { break; } @@ -268,7 +273,7 @@ int et_scenario_set_packet_received(et_packet_t * const packet) p = p->next; } - if (packet->timer_id != 0) { + if (0 != packet->timer_id) { rc = timer_remove(packet->timer_id); AssertFatal(rc == 0, "TODO: Debug Timer on Rx packet num %d unknown", packet->packet_number); return rc; @@ -291,9 +296,14 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) packet = g_scenario->list_packet; while (NULL != packet) { if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - if (packet->status == ET_PACKET_STATUS_RECEIVED) { + if ((ET_PACKET_STATUS_RECEIVED == packet->status) || (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT == packet->status)) { g_scenario->last_rx_packet = packet; - g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet; + if (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT != packet->status) { + g_scenario->time_last_rx_packet.tv_sec = packet->timestamp_packet.tv_sec; + g_scenario->time_last_rx_packet.tv_usec = packet->timestamp_packet.tv_usec; + } + S1AP_DEBUG("Set Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number); + S1AP_DEBUG("Set time_last_rx_packet %ld.%06d\n", g_scenario->time_last_rx_packet.tv_sec, g_scenario->time_last_rx_packet.tv_usec); } else { break; } @@ -309,10 +319,13 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { rv = et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints); if (0 == rv) { - S1AP_DEBUG("Compare RX packet with packet num %d succeeded\n", packet->packet_number); + S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); + packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec; + packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; return et_scenario_set_packet_received(packet); } else { - S1AP_DEBUG("Compare RX packet with packet num %d failed %s\n", packet->packet_number, et_error_match2str(rv)); + S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u failed:%s\n", + packet->packet_number, packet->original_frame_number, et_error_match2str(rv)); // asn1 compare no match return code, may not collide with non asn1 error return codes // (each asn1 rc <= 166 (enum e_S1ap_ProtocolIE_ID, in generated file S1ap_ProtocolIE_ID.h)) if ((rv > 0) || (rv <= -ET_ERROR_MATCH_END)) { From 1b86363795b0931fc47d78899e9d079df659f408 Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 8 Dec 2015 15:08:02 +0100 Subject: [PATCH 018/122] Remaining TODO: handle diff MME_UE_S1AP_ID, asn1c compare not tested --- cmake_targets/CMakeLists.txt | 1 + openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 | 848 +++++++++++------- openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py | 87 +- openair3/TEST/EPC_TEST/play_scenario.c | 34 +- openair3/TEST/EPC_TEST/play_scenario.h | 14 +- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 394 +++++++- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 6 +- openair3/TEST/EPC_TEST/play_scenario_sctp.c | 31 +- 8 files changed, 1041 insertions(+), 374 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 9c5bbad0de..a562a5ebc0 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1677,6 +1677,7 @@ add_executable(test_epc_play_scenario ${OPENAIR2_DIR}/COMMON/messages_types.h ${OPENAIR_BIN_DIR}/messages_xml.h ) +target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c) target_link_libraries (test_epc_play_scenario -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} ) diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 b/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 index cf3553c362..3986a6a83b 100644 --- a/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 +++ b/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 @@ -1,20 +1,20 @@ ---- ./asn1c/unber.c 2015-12-03 09:43:33.959009150 +0100 -+++ ./asn1c/unber.c 2015-11-30 13:20:40.751264003 +0100 +--- asn1c/unber.c 2015-12-08 14:39:33.282543533 +0100 ++++ asn1c/unber.c 2015-12-07 10:46:18.382647000 +0100 @@ -779,4 +779,6 @@ asn_enc_rval_t OCTET_STRING_encode_aper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void *sptr, asn_per_outp_t *po) { asn_enc_rval_t er = { 0, 0, 0 }; (void)td; (void)cts; (void)sptr; (void)po; return er; } -+long OCTET_STRING_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { (void)td1; (void)sptr1; (void)td2; (void)sptr2; return 0; } ++asn_comp_rval_t * OCTET_STRING_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { (void)td1; (void)sptr1; (void)td2; (void)sptr2; return 0; } + size_t xer_whitespace_span(const void *chunk_buf, size_t chunk_size) { (void)chunk_buf; (void)chunk_size; return 0; } ---- ./libasn1compiler/asn1c_C.c 2015-12-03 09:43:33.971009150 +0100 -+++ ./libasn1compiler/asn1c_C.c 2015-11-30 14:29:33.027259725 +0100 +--- libasn1compiler/asn1c_C.c 2015-12-08 14:39:33.366543533 +0100 ++++ libasn1compiler/asn1c_C.c 2015-12-08 08:38:29.002565000 +0100 @@ -1082,6 +1082,8 @@ enum tvm_compat tv_mode; enum etd_spec etd_spec; char *p; -+ char tmp_buf[512]; -+ int i = 0; ++ //char tmp_buf[512]; ++ //int i = 0; if(arg->embed) { enum tnfmt tnfmt = TNF_CTYPE; @@ -28,49 +28,39 @@ if(!terminal && !tags_count) { OUT("/* The next four lines are here because of -fknown-extern-type */\n"); OUT("td->tags = asn_DEF_%s.tags;\n", type_name); -@@ -1413,6 +1416,49 @@ +@@ -1413,6 +1416,39 @@ OUT("}\n"); OUT("\n"); + -+ i = 0; -+ while ((p[i] != '_') && (i < sizeof(tmp_buf))) { -+ tmp_buf[i] = p[i]; -+ i++; -+ } -+ tmp_buf[i] = '\0'; ++ //i = 0; ++ //while ((p[i] != '_') && (i < sizeof(tmp_buf))) { ++ // tmp_buf[i] = p[i]; ++ // i++; ++ //} ++ //tmp_buf[i] = '\0'; + // hack, only for s1ap -+ if ((strcmp("S1ap", tmp_buf) == 0) || (strcmp("X2ap", tmp_buf) == 0)) -+ OUT("#include \"%s-ProtocolIE-ID.h\"\n", tmp_buf); ++ //if ((strcmp("S1ap", tmp_buf) == 0) || (strcmp("X2ap", tmp_buf) == 0)) ++ // OUT("#include \"%s-ProtocolIE-ID.h\"\n", tmp_buf); + + + p = MKID(expr); + if(HIDE_INNER_DEFS) OUT("static "); -+ OUT("long\n"); ++ OUT("asn_comp_rval_t * \n"); + OUT("%s", p); + if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index); + OUT("_compare(asn_TYPE_descriptor_t *td1,\n"); -+ i = 0; -+ while ((p[i] != '_') && (i < sizeof(tmp_buf))) { -+ tmp_buf[i] = p[i]; -+ i++; -+ } -+ tmp_buf[i] = '\0'; -+ strcat(tmp_buf,"_ProtocolIE_ID_id_"); -+ strcat(tmp_buf,&p[++i]); + INDENTED( + OUT("\tvoid *structure1,\n"); + OUT("\tasn_TYPE_descriptor_t *td2,\n"); + OUT("\tvoid *structure2) {\n"); -+ OUT("long rv = 0;\n"); ++ OUT("asn_comp_rval_t * res = NULL;\n"); + OUT("%s_%d_inherit_TYPE_descriptor(td1);\n", + p, expr->_type_unique_index); + OUT("%s_%d_inherit_TYPE_descriptor(td2);\n", + p, expr->_type_unique_index); -+ OUT("rv = td1->compare(td1, structure1, td2, structure2);\n"); -+ if ((strcmp("S1ap", tmp_buf) == 0) || (strcmp("X2ap", tmp_buf) == 0)) -+ OUT("if (rv) { rv = (rv << 8); rv |= %s;}\n", tmp_buf); -+ OUT("return rv;\n"); ++ OUT("res = td1->compare(td1, structure1, td2, structure2);\n"); ++ OUT("return res;\n"); + ); + OUT("}\n"); + OUT("\n"); @@ -78,7 +68,7 @@ p = MKID(expr); if(HIDE_INNER_DEFS) OUT("static "); -@@ -1450,7 +1496,8 @@ +@@ -1450,7 +1486,8 @@ OUT("per_type_decoder_f %s_decode_uper;\n", p); OUT("per_type_encoder_f %s_encode_uper;\n", p); OUT("per_type_decoder_f %s_decode_aper;\n", p); @@ -88,7 +78,7 @@ } } -@@ -2501,6 +2548,7 @@ +@@ -2501,6 +2538,7 @@ OUT("0, 0,\t/* No APER support, " "use \"-gen-PER\" to enable */\n"); } @@ -96,8 +86,8 @@ if(!terminal || terminal->expr_type == ASN_CONSTR_CHOICE) { //if(expr->expr_type == ASN_CONSTR_CHOICE) { ---- ./skeletons/ANY.c 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/ANY.c 2015-11-26 14:40:56.547616803 +0100 +--- skeletons/ANY.c 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/ANY.c 2015-11-26 14:40:56.547616000 +0100 @@ -24,7 +24,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -108,8 +98,101 @@ 0, /* Use generic outmost tag fetcher */ 0, 0, 0, 0, 0, /* No PER visible constraints */ ---- ./skeletons/BIT_STRING.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/BIT_STRING.c 2015-11-26 14:41:50.159616747 +0100 +--- skeletons/asn_application.h 2015-12-08 14:39:12.674543554 +0100 ++++ skeletons/asn_application.h 2015-12-07 14:36:32.950633000 +0100 +@@ -9,7 +9,8 @@ + #define _ASN_APPLICATION_H_ + + #include "asn_system.h" /* for platform-dependent types */ +-#include "asn_codecs.h" /* for ASN.1 codecs specifics */ ++#include "asn_codecs.h" /* for ASN.1 codecs specifics */ ++#include "asn_compare.h" + + #ifdef __cplusplus + extern "C" { +--- skeletons/asn_compare.h 1970-01-01 01:00:00.000000000 +0100 ++++ skeletons/asn_compare.h 2015-12-08 10:34:58.090558000 +0100 +@@ -0,0 +1,78 @@ ++#ifndef _ASN_COMPARE_H_ ++#define _ASN_COMPARE_H_ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++struct asn_TYPE_descriptor_s; /* Forward declaration */ ++ ++ ++typedef enum COMPARE_ERR_CODE_e { ++ COMPARE_ERR_CODE_START = 0, ++ COMPARE_ERR_CODE_NONE = COMPARE_ERR_CODE_START, ++ COMPARE_ERR_CODE_NO_MATCH, ++ COMPARE_ERR_CODE_TYPE_MISMATCH, ++ COMPARE_ERR_CODE_TYPE_ARG_NULL, ++ COMPARE_ERR_CODE_VALUE_NULL, ++ COMPARE_ERR_CODE_VALUE_ARG_NULL, ++ COMPARE_ERR_CODE_CHOICE_NUM, ++ COMPARE_ERR_CODE_CHOICE_PRESENT, ++ COMPARE_ERR_CODE_CHOICE_MALFORMED, ++ COMPARE_ERR_CODE_SET_MALFORMED, ++ COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS, ++ COMPARE_ERR_CODE_END ++} COMPARE_ERR_CODE_t; ++ ++typedef struct asn_comp_rval_s { ++ enum COMPARE_ERR_CODE_e err_code; ++ char *name; // e_S1ap_ProtocolIE_ID not available for all ASN1 use (RRC vs S1AP, X2AP) ++ void *structure1; ++ void *structure2; ++ struct asn_comp_rval_s *next; ++} asn_comp_rval_t; ++ ++#define COMPARE_CHECK_ARGS(aRg_tYpE_dEf1, aRg_tYpE_dEf2, aRg_vAl1, aRg_vAl2, rEsUlT) \ ++ do {\ ++ if ((aRg_tYpE_dEf1) && (aRg_tYpE_dEf2)) {\ ++ if ((aRg_tYpE_dEf1->name) && (aRg_tYpE_dEf2->name)) {\ ++ if (strcmp(aRg_tYpE_dEf1->name, aRg_tYpE_dEf2->name)) {\ ++ rEsUlT = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\ ++ rEsUlT->err_code = COMPARE_ERR_CODE_TYPE_MISMATCH;\ ++ rEsUlT->name = aRg_tYpE_dEf1->name;\ ++ return rEsUlT;\ ++ }\ ++ } else {\ ++ if ((aRg_tYpE_dEf1->xml_tag) && (aRg_tYpE_dEf2->xml_tag)) {\ ++ if (strcmp(aRg_tYpE_dEf1->xml_tag, aRg_tYpE_dEf2->xml_tag)) {\ ++ rEsUlT = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\ ++ rEsUlT->err_code = COMPARE_ERR_CODE_TYPE_MISMATCH;\ ++ rEsUlT->name = aRg_tYpE_dEf1->xml_tag;\ ++ return rEsUlT;\ ++ }\ ++ }\ ++ }\ ++ } else {\ ++ rEsUlT = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\ ++ rEsUlT->name = aRg_tYpE_dEf1->name;\ ++ rEsUlT->structure1 = aRg_vAl1;\ ++ rEsUlT->structure2 = aRg_vAl2;\ ++ rEsUlT->err_code = COMPARE_ERR_CODE_TYPE_ARG_NULL;\ ++ return rEsUlT;\ ++ }\ ++ if ((NULL == aRg_vAl1) || (NULL == aRg_vAl2)){\ ++ rEsUlT = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\ ++ rEsUlT->name = aRg_tYpE_dEf1->name;\ ++ rEsUlT->structure1 = aRg_vAl1;\ ++ rEsUlT->structure2 = aRg_vAl2;\ ++ rEsUlT->err_code = COMPARE_ERR_CODE_VALUE_ARG_NULL;\ ++ return rEsUlT;\ ++ }\ ++ } while (0); ++ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* _ASN_COMPARE_H_ */ +--- skeletons/BIT_STRING.c 2015-12-08 14:39:33.346543533 +0100 ++++ skeletons/BIT_STRING.c 2015-11-26 14:41:50.159616000 +0100 @@ -30,7 +30,8 @@ OCTET_STRING_decode_uper, /* Unaligned PER decoder */ OCTET_STRING_encode_uper, /* Unaligned PER encoder */ @@ -120,8 +203,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_BIT_STRING_tags, sizeof(asn_DEF_BIT_STRING_tags) ---- ./skeletons/BMPString.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/BMPString.c 2015-11-26 14:42:08.487616728 +0100 +--- skeletons/BMPString.c 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/BMPString.c 2015-11-26 14:42:08.487616000 +0100 @@ -36,7 +36,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -132,8 +215,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_BMPString_tags, sizeof(asn_DEF_BMPString_tags) ---- ./skeletons/BOOLEAN.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/BOOLEAN.c 2015-11-30 13:16:30.275264262 +0100 +--- skeletons/BOOLEAN.c 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/BOOLEAN.c 2015-12-08 10:37:11.866558000 +0100 @@ -25,7 +25,8 @@ BOOLEAN_decode_uper, /* Unaligned PER decoder */ BOOLEAN_encode_uper, /* Unaligned PER encoder */ @@ -144,30 +227,31 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_BOOLEAN_tags, sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), -@@ -326,3 +327,21 @@ +@@ -326,3 +327,22 @@ _ASN_ENCODED_OK(er); } + -+long ++asn_comp_rval_t * +BOOLEAN_compare(asn_TYPE_descriptor_t *td1, + void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { + const BOOLEAN_t *st1 = (const BOOLEAN_t *)sptr1; + const BOOLEAN_t *st2 = (const BOOLEAN_t *)sptr2; -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } -+ } -+ return (*st1 != *st2); ++ asn_comp_rval_t *res = NULL; ++ ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) ++ ++ if (*st1 == *st2) return NULL; ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; +} + ---- ./skeletons/BOOLEAN.h 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/BOOLEAN.h 2015-11-26 12:46:58.491623882 +0100 +--- skeletons/BOOLEAN.h 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/BOOLEAN.h 2015-11-26 12:46:58.491623000 +0100 @@ -30,6 +30,7 @@ per_type_encoder_f BOOLEAN_encode_uper; per_type_decoder_f BOOLEAN_decode_aper; @@ -176,9 +260,9 @@ #ifdef __cplusplus } ---- ./skeletons/compare.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./skeletons/compare.h 2015-11-30 13:15:56.415264297 +0100 -@@ -0,0 +1,27 @@ +--- skeletons/compare.h 1970-01-01 01:00:00.000000000 +0100 ++++ skeletons/compare.h 2015-12-08 08:23:03.694566000 +0100 +@@ -0,0 +1,28 @@ +/*- + * Eurecom 2015. + */ @@ -186,7 +270,6 @@ +#define _COMPARE_H_ + +#include -+#include + +#ifdef __cplusplus +extern "C" { @@ -194,46 +277,37 @@ + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + -+typedef long (type_compare_f)( ++typedef asn_comp_rval_t * (type_compare_f)( + struct asn_TYPE_descriptor_s *type_descriptor1, + void *struct_ptr1, + struct asn_TYPE_descriptor_s *type_descriptor2, + void *struct_ptr2 +); + ++ ++ +#ifdef __cplusplus +} +#endif + +#endif /* _COMPARE_H_ */ ---- ./skeletons/constr_CHOICE.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/constr_CHOICE.c 2015-11-30 13:16:49.007264243 +0100 -@@ -1272,3 +1272,57 @@ +--- skeletons/constr_CHOICE.c 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/constr_CHOICE.c 2015-12-08 10:39:16.670558000 +0100 +@@ -1272,3 +1272,75 @@ assert(pres_size != sizeof(int)); } } + -+long ++asn_comp_rval_t * +CHOICE_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) +{ + asn_CHOICE_specifics_t *specs1 = (asn_CHOICE_specifics_t *)td1->specifics; + asn_CHOICE_specifics_t *specs2 = (asn_CHOICE_specifics_t *)td2->specifics; + int present1; + int present2; ++ asn_comp_rval_t *res = NULL; + -+ if ((!sptr1) && (!sptr2)) return 0; -+ if (!sptr1) return -1; -+ if (!sptr2) return -1; -+ -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } -+ } ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) + + /* + * Figure out which CHOICE element is encoded. @@ -242,8 +316,22 @@ + // same specs + present2 = _fetch_present_idx(sptr2, specs2->pres_offset,specs2->pres_size); + -+ if (td1->elements_count != td2->elements_count) return -1; -+ if (present1 != present2) return -1; ++ if (td1->elements_count != td2->elements_count) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_CHOICE_NUM; ++ return res; ++ } ++ if (present1 != present2) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_CHOICE_PRESENT; ++ return res; ++ } + if(present1 > 0 && present1 <= td1->elements_count) { + asn_TYPE_member_t *elm1 = &td1->elements[present1-1]; + asn_TYPE_member_t *elm2 = &td2->elements[present2-1]; @@ -253,21 +341,36 @@ + if((elm1->flags & ATF_POINTER) && (elm1->flags & ATF_POINTER)){ + memb_ptr1 = *(const void * const *)((const char *)sptr1 + elm1->memb_offset); + memb_ptr2 = *(const void * const *)((const char *)sptr2 + elm2->memb_offset); -+ if((!memb_ptr1) && (!memb_ptr2)) return -1; -+ if (!memb_ptr1) return -1; -+ if (!memb_ptr2) return -1; ++ if((!memb_ptr1) || (!memb_ptr2)) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_VALUE_NULL; ++ return res; ++ } + } else if (!(elm1->flags & ATF_POINTER) && !(elm1->flags & ATF_POINTER)){ + memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset); + memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset); + } else { -+ return -1; ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_CHOICE_MALFORMED; ++ return res; + } + return elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2); + } -+ return 0; ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_CHOICE_MALFORMED; ++ return res; +} ---- ./skeletons/constr_CHOICE.h 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/constr_CHOICE.h 2015-11-26 14:43:57.647616615 +0100 +--- skeletons/constr_CHOICE.h 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/constr_CHOICE.h 2015-11-26 14:43:57.647616000 +0100 @@ -39,7 +39,7 @@ /* * A set specialized functions dealing with the CHOICE type. @@ -287,34 +390,30 @@ #ifdef __cplusplus } ---- ./skeletons/constr_SEQUENCE.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/constr_SEQUENCE.c 2015-11-30 13:17:33.871264196 +0100 -@@ -1761,3 +1761,50 @@ +--- skeletons/constr_SEQUENCE.c 2015-12-08 14:39:33.346543533 +0100 ++++ skeletons/constr_SEQUENCE.c 2015-12-08 10:39:52.442558000 +0100 +@@ -1761,3 +1761,66 @@ _ASN_ENCODED_OK(er); } + -+long -+SEQUENCE_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { ++asn_comp_rval_t * SEQUENCE_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { + int edx; + int ret; ++ asn_comp_rval_t *res = NULL; ++ asn_comp_rval_t *res2 = NULL; + -+ if((!sptr1) && (!sptr2)) return -1; -+ if(!sptr1) return -1; -+ if(!sptr2) return -1; ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) + -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } ++ if (td1->elements_count != td2->elements_count) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS; ++ return res; + } + -+ if (td1->elements_count != td2->elements_count) return -1; -+ + for(edx = 0; edx < td1->elements_count; edx++) { + asn_TYPE_member_t *elm1 = &td1->elements[edx]; + asn_TYPE_member_t *elm2 = &td1->elements[edx]; @@ -327,21 +426,41 @@ + if((!memb_ptr1) && (!memb_ptr2)) { + if(elm1->optional) continue; + } -+ if (!memb_ptr1) return -1; -+ if (!memb_ptr2) return -1; ++ if ((!memb_ptr1) || (!memb_ptr2)) { ++ res2 = calloc(1, sizeof(asn_comp_rval_t)); ++ res2->name = elm1->name; ++ res2->structure1 = memb_ptr1; ++ res2->structure2 = memb_ptr2; ++ res->err_code = COMPARE_ERR_CODE_VALUE_NULL; ++ if (NULL == res) { ++ res = res2; ++ } else { ++ res2->next = res; ++ res = res2; ++ } ++ res2 = NULL; ++ } + } else { + memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset); + memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset); + } + + /* Compare the member itself */ -+ ret = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2); -+ if(ret) return ret; ++ res2 = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2); ++ if(res2) { ++ if (NULL == res) { ++ res = res2; ++ } else { ++ res2->next = res; ++ res = res2; ++ } ++ res2 = NULL; ++ } + } -+ return 0; ++ return res; +} ---- ./skeletons/constr_SEQUENCE.h 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/constr_SEQUENCE.h 2015-11-26 14:48:14.123616350 +0100 +--- skeletons/constr_SEQUENCE.h 2015-12-08 14:39:33.346543533 +0100 ++++ skeletons/constr_SEQUENCE.h 2015-11-26 14:48:14.123616000 +0100 @@ -54,6 +54,7 @@ per_type_encoder_f SEQUENCE_encode_uper; per_type_decoder_f SEQUENCE_decode_aper; @@ -350,8 +469,8 @@ #ifdef __cplusplus } ---- ./skeletons/constr_SEQUENCE_OF.h 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/constr_SEQUENCE_OF.h 2015-11-26 15:05:25.399615282 +0100 +--- skeletons/constr_SEQUENCE_OF.h 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/constr_SEQUENCE_OF.h 2015-11-26 15:05:25.399615000 +0100 @@ -22,7 +22,8 @@ #define SEQUENCE_OF_decode_ber SET_OF_decode_ber #define SEQUENCE_OF_decode_xer SET_OF_decode_xer @@ -362,8 +481,8 @@ der_type_encoder_f SEQUENCE_OF_encode_der; xer_type_encoder_f SEQUENCE_OF_encode_xer; per_type_encoder_f SEQUENCE_OF_encode_uper; ---- ./skeletons/constr_SET.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/constr_SET.c 2015-11-30 13:17:49.903264180 +0100 +--- skeletons/constr_SET.c 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/constr_SET.c 2015-12-08 10:40:35.066558000 +0100 @@ -1108,7 +1108,7 @@ } } @@ -373,8 +492,67 @@ SET_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { int edx; ---- ./skeletons/constr_SET.h 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/constr_SET.h 2015-11-26 14:49:09.243616293 +0100 +@@ -1159,3 +1159,58 @@ + + return 0; + } ++ ++asn_comp_rval_t * ++SET_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) ++{ ++ int edx; ++ asn_comp_rval_t *res = NULL; ++ asn_comp_rval_t *res2 = NULL; ++ ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) ++ ++ if (td1->elements_count != td2->elements_count) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS; ++ return res; ++ } ++ ++ for(edx = 0; edx < td1->elements_count; edx++) { ++ asn_TYPE_member_t *elm1 = &td1->elements[edx]; ++ asn_TYPE_member_t *elm2 = &td2->elements[edx]; ++ const void *memb_ptr1; ++ const void *memb_ptr2; ++ ++ if(elm1->flags & ATF_POINTER) { ++ memb_ptr1 = *(const void * const *)((const char *)sptr1 + elm1->memb_offset); ++ memb_ptr2 = *(const void * const *)((const char *)sptr2 + elm2->memb_offset); ++ if(!memb_ptr1) { ++ if(elm1->optional) ++ continue; ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_SET_MALFORMED; ++ return res; ++ } ++ } else { ++ memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset); ++ memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset); ++ } ++ res2 = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2); ++ if(res2) { ++ if (NULL == res) { ++ res = res2; ++ } else { ++ res2->next = res; ++ res = res2; ++ } ++ res2 = NULL; ++ } ++ } ++ return res; ++} +--- skeletons/constr_SET.h 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/constr_SET.h 2015-11-26 14:49:09.243616000 +0100 @@ -56,6 +56,7 @@ per_type_decoder_f SET_decode_aper; per_type_encoder_f SET_encode_uper; @@ -383,14 +561,14 @@ /*********************** * Some handy helpers. * ---- ./skeletons/constr_SET_OF.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/constr_SET_OF.c 2015-11-30 13:17:42.099264188 +0100 -@@ -1039,3 +1039,46 @@ +--- skeletons/constr_SET_OF.c 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/constr_SET_OF.c 2015-12-08 10:45:54.466557000 +0100 +@@ -1039,3 +1039,55 @@ rv.consumed = 0; return rv; } + -+long ++asn_comp_rval_t * +SET_OF_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) +{ + asn_TYPE_member_t *elm1 = td1->elements; @@ -399,41 +577,50 @@ + const asn_anonymous_set_ *list2 = _A_CSET_FROM_VOID(sptr2); + int ret; + int i; ++ asn_comp_rval_t *res = NULL; ++ asn_comp_rval_t *res2 = NULL; + -+ if((!sptr1) && !(sptr2)) return 0; -+ if(!sptr1) return -1; -+ if(!sptr2) return -1; ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) + -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } ++ if (td1->elements_count != td2->elements_count) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS; ++ return res; + } + -+ if (td1->elements_count != td2->elements_count) return -1; + -+ -+ if (list1->count != list2->count ) return -1; ++ if (list1->count != list2->count ) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS; ++ return res; ++ } + + for(i = 0; i < list1->count; i++) { + const void *memb_ptr1 = list1->array[i]; + const void *memb_ptr2 = list2->array[i]; + if ((!memb_ptr1) & (!memb_ptr2)) continue; -+ if(!memb_ptr1) return -1; -+ if(!memb_ptr2) return -1; + -+ ret = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2); -+ if(ret) return ret; ++ res2 = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2); ++ if(res2) { ++ if (NULL == res) { ++ res = res2; ++ } else { ++ res2->next = res; ++ res = res2; ++ } ++ res2 = NULL; ++ } + } -+ -+ return 0; ++ return res; +} ---- ./skeletons/constr_SET_OF.h 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/constr_SET_OF.h 2015-11-26 14:48:45.067616318 +0100 +--- skeletons/constr_SET_OF.h 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/constr_SET_OF.h 2015-11-26 14:48:45.067616000 +0100 @@ -36,6 +36,7 @@ per_type_encoder_f SET_OF_encode_uper; per_type_decoder_f SET_OF_decode_aper; @@ -442,8 +629,8 @@ #ifdef __cplusplus } ---- ./skeletons/constr_TYPE.h 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/constr_TYPE.h 2015-11-26 15:28:05.495613874 +0100 +--- skeletons/constr_TYPE.h 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/constr_TYPE.h 2015-11-26 15:28:05.495613000 +0100 @@ -41,7 +41,8 @@ #include /* Encoder into XER (XML, text) */ #include /* Packet Encoding Rules decoder */ @@ -462,8 +649,8 @@ /*********************************************************************** * Internally useful members. Not to be used by applications directly. * ---- ./skeletons/ENUMERATED.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/ENUMERATED.c 2015-11-30 13:18:05.399264164 +0100 +--- skeletons/ENUMERATED.c 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/ENUMERATED.c 2015-12-08 10:40:55.986558000 +0100 @@ -27,7 +27,8 @@ ENUMERATED_decode_uper, /* Unaligned PER decoder */ ENUMERATED_encode_uper, /* Unaligned PER encoder */ @@ -479,26 +666,26 @@ return NativeEnumerated_encode_aper(td, constraints, &value, po); } + -+long ++asn_comp_rval_t * +ENUMERATED_compare(asn_TYPE_descriptor_t *td1, void *sptr1, + asn_TYPE_descriptor_t *td2, void *sptr2) { + ENUMERATED_t *st1 = (ENUMERATED_t *)sptr1; + ENUMERATED_t *st2 = (ENUMERATED_t *)sptr2; ++ asn_comp_rval_t *res = NULL; + -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } -+ } -+ return (*st1 != *st2); ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) ++ ++ if (*st1 == *st2) return NULL; ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; +} + ---- ./skeletons/ENUMERATED.h 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/ENUMERATED.h 2015-11-26 12:46:35.523623906 +0100 +--- skeletons/ENUMERATED.h 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/ENUMERATED.h 2015-11-26 12:46:35.523623000 +0100 @@ -19,6 +19,7 @@ per_type_encoder_f ENUMERATED_encode_uper; per_type_decoder_f ENUMERATED_decode_aper; @@ -507,9 +694,9 @@ #ifdef __cplusplus } ---- ./skeletons/file-dependencies 2015-12-03 09:43:33.731009150 +0100 -+++ ./skeletons/file-dependencies 2015-11-26 16:05:44.923611535 +0100 -@@ -39,7 +39,7 @@ +--- skeletons/file-dependencies 2015-12-08 14:39:12.678543554 +0100 ++++ skeletons/file-dependencies 2015-12-07 15:34:40.454629000 +0100 +@@ -39,12 +39,13 @@ constr_SEQUENCE.h constr_SEQUENCE.c constr_SEQUENCE_OF.h constr_SEQUENCE_OF.c asn_SEQUENCE_OF.h constr_SET_OF.h constr_SET.h constr_SET.c @@ -517,9 +704,17 @@ +constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h compare.h COMMON-FILES: # THIS IS A SPECIAL SECTION - asn_application.h # Applications should include this file ---- ./skeletons/GeneralizedTime.c 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/GeneralizedTime.c 2015-11-26 15:09:03.899615056 +0100 +-asn_application.h # Applications should include this file ++asn_application.h # Applications should include this file + asn_system.h # Platform-dependent types +-asn_codecs.h # Return types of encoders and decoders ++asn_codecs.h # Return types of encoders and decoders ++asn_compare.h # Return type of compare + asn_internal.h # Internal stuff + OCTET_STRING.h OCTET_STRING.c # This one is used too widely + BIT_STRING.h BIT_STRING.c # This one is necessary for the above one +--- skeletons/GeneralizedTime.c 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/GeneralizedTime.c 2015-11-26 15:09:03.899615000 +0100 @@ -168,7 +168,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -530,8 +725,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_GeneralizedTime_tags, sizeof(asn_DEF_GeneralizedTime_tags) ---- ./skeletons/GeneralString.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/GeneralString.c 2015-11-26 14:50:11.843616228 +0100 +--- skeletons/GeneralString.c 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/GeneralString.c 2015-11-26 14:50:11.843616000 +0100 @@ -25,7 +25,8 @@ OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_uper, @@ -542,8 +737,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_GeneralString_tags, sizeof(asn_DEF_GeneralString_tags) ---- ./skeletons/GraphicString.c 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/GraphicString.c 2015-11-26 15:33:33.255613535 +0100 +--- skeletons/GraphicString.c 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/GraphicString.c 2015-11-26 15:33:33.255613000 +0100 @@ -25,7 +25,8 @@ OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_uper, @@ -554,8 +749,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_GraphicString_tags, sizeof(asn_DEF_GraphicString_tags) ---- ./skeletons/IA5String.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/IA5String.c 2015-11-26 14:50:44.219616194 +0100 +--- skeletons/IA5String.c 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/IA5String.c 2015-11-26 14:50:44.219616000 +0100 @@ -31,6 +31,7 @@ OCTET_STRING_encode_uper, OCTET_STRING_decode_aper, @@ -564,8 +759,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_IA5String_tags, sizeof(asn_DEF_IA5String_tags) ---- ./skeletons/INTEGER.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/INTEGER.c 2015-11-30 13:18:18.143264151 +0100 +--- skeletons/INTEGER.c 2015-12-08 14:39:33.346543533 +0100 ++++ skeletons/INTEGER.c 2015-12-08 10:41:08.526558000 +0100 @@ -35,6 +35,7 @@ INTEGER_decode_aper, INTEGER_encode_aper, @@ -574,29 +769,39 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_INTEGER_tags, sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), -@@ -1501,3 +1502,20 @@ +@@ -1501,3 +1502,30 @@ } -+long ++asn_comp_rval_t * +INTEGER_compare(asn_TYPE_descriptor_t *td1, void *sptr1, + asn_TYPE_descriptor_t *td2, void *sptr2) { + INTEGER_t *st1 = (INTEGER_t *)sptr1; + INTEGER_t *st2 = (INTEGER_t *)sptr2; -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } ++ asn_comp_rval_t *res = NULL; ++ ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) ++ ++ if (st1->size != st2->size) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; + } -+ if (st1->size != st2->size) return -1; -+ return memcmp(st1->buf, st2->buf, st1->size); ++ if (0 != memcmp(st1->buf, st2->buf, st1->size)) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; ++ } ++ return NULL; +} ---- ./skeletons/INTEGER.h 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/INTEGER.h 2015-11-26 12:50:41.551623651 +0100 +--- skeletons/INTEGER.h 2015-12-08 14:39:33.346543533 +0100 ++++ skeletons/INTEGER.h 2015-11-26 12:50:41.551623000 +0100 @@ -43,6 +43,7 @@ per_type_encoder_f INTEGER_encode_uper; per_type_decoder_f INTEGER_decode_aper; @@ -605,8 +810,8 @@ /*********************************** * Some handy conversion routines. * ---- ./skeletons/ISO646String.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/ISO646String.c 2015-11-26 12:55:48.327623333 +0100 +--- skeletons/ISO646String.c 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/ISO646String.c 2015-11-26 12:55:48.327623000 +0100 @@ -30,7 +30,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -617,19 +822,25 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_ISO646String_tags, sizeof(asn_DEF_ISO646String_tags) ---- ./skeletons/Makefile.am 2015-12-03 09:43:33.715009150 +0100 -+++ ./skeletons/Makefile.am 2015-11-26 15:28:55.887613822 +0100 -@@ -50,7 +50,7 @@ +--- skeletons/Makefile.am 2015-12-08 14:39:12.666543554 +0100 ++++ skeletons/Makefile.am 2015-12-07 15:54:00.150628000 +0100 +@@ -46,11 +46,11 @@ + asn_SET_OF.c asn_SET_OF.h \ + asn_application.h asn_codecs.h \ + asn_codecs_prim.c asn_codecs_prim.h \ +- asn_internal.h asn_system.h \ ++ asn_internal.h asn_system.h asn_compare.h \ ber_decoder.c ber_decoder.h \ ber_tlv_length.c ber_tlv_length.h \ - ber_tlv_tag.c ber_tlv_tag.h \ +- ber_tlv_tag.c ber_tlv_tag.h \ - constr_CHOICE.c constr_CHOICE.h \ ++ ber_tlv_tag.c ber_tlv_tag.h compare.h \ + comparison.h constr_CHOICE.c constr_CHOICE.h \ constr_SEQUENCE.c constr_SEQUENCE.h \ constr_SEQUENCE_OF.c constr_SEQUENCE_OF.h \ constr_SET.c constr_SET.h \ ---- ./skeletons/NativeEnumerated.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/NativeEnumerated.c 2015-11-30 13:18:32.015264136 +0100 +--- skeletons/NativeEnumerated.c 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/NativeEnumerated.c 2015-12-08 10:41:17.662558000 +0100 @@ -31,7 +31,8 @@ NativeEnumerated_decode_uper, NativeEnumerated_encode_uper, @@ -640,34 +851,31 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeEnumerated_tags, sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), -@@ -335,3 +336,25 @@ +@@ -335,3 +336,22 @@ _ASN_ENCODED_OK(er); } + -+long ++asn_comp_rval_t * +NativeEnumerated_compare(asn_TYPE_descriptor_t *td1, void *sptr1, + asn_TYPE_descriptor_t *td2, void *sptr2) { + const asn_INTEGER_enum_map_t *a = sptr1; + const asn_INTEGER_enum_map_t *b = sptr2; -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } -+ } ++ asn_comp_rval_t *res = NULL; ++ ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) + + if(a->nat_value == b->nat_value) -+ return 0; -+ if(a->nat_value < b->nat_value) -+ return -1; -+ return 1; ++ return NULL; ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; +} ---- ./skeletons/NativeEnumerated.h 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/NativeEnumerated.h 2015-11-26 14:51:43.315616133 +0100 +--- skeletons/NativeEnumerated.h 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/NativeEnumerated.h 2015-11-26 14:51:43.315616000 +0100 @@ -26,6 +26,7 @@ per_type_encoder_f NativeEnumerated_encode_uper; per_type_decoder_f NativeEnumerated_decode_aper; @@ -676,8 +884,8 @@ #ifdef __cplusplus } ---- ./skeletons/NativeInteger.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/NativeInteger.c 2015-11-30 13:18:39.887264128 +0100 +--- skeletons/NativeInteger.c 2015-12-08 14:39:33.346543533 +0100 ++++ skeletons/NativeInteger.c 2015-12-08 10:41:24.550558000 +0100 @@ -32,7 +32,8 @@ NativeInteger_decode_uper, /* Unaligned PER decoder */ NativeInteger_encode_uper, /* Unaligned PER encoder */ @@ -688,29 +896,30 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeInteger_tags, sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), -@@ -410,3 +411,20 @@ +@@ -410,3 +411,21 @@ } } + -+long ++asn_comp_rval_t * +NativeInteger_compare(asn_TYPE_descriptor_t *td1, void *sptr1, + asn_TYPE_descriptor_t *td2, void *sptr2) { + const long *native1 = (const long *)sptr1; + const long *native2 = (const long *)sptr2; -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } -+ } -+ return (*native1 != *native2); ++ asn_comp_rval_t *res = NULL; ++ ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) ++ ++ if (*native1 == *native2) return NULL; ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; +} ---- ./skeletons/NativeInteger.h 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/NativeInteger.h 2015-11-26 14:52:13.931616101 +0100 +--- skeletons/NativeInteger.h 2015-12-08 14:39:33.346543533 +0100 ++++ skeletons/NativeInteger.h 2015-11-26 14:52:13.931616000 +0100 @@ -31,6 +31,7 @@ per_type_encoder_f NativeInteger_encode_uper; per_type_decoder_f NativeInteger_decode_aper; @@ -719,8 +928,8 @@ #ifdef __cplusplus } ---- ./skeletons/NativeReal.c 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/NativeReal.c 2015-11-30 13:18:46.655264121 +0100 +--- skeletons/NativeReal.c 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/NativeReal.c 2015-12-08 10:41:32.666558000 +0100 @@ -33,7 +33,8 @@ NativeReal_decode_uper, NativeReal_encode_uper, @@ -731,30 +940,39 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeReal_tags, sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]), -@@ -405,3 +406,21 @@ +@@ -405,3 +406,30 @@ } } -+long ++asn_comp_rval_t * +NativeReal_compare(asn_TYPE_descriptor_t *td1, void *sptr1, + asn_TYPE_descriptor_t *td2, void *sptr2) { + REAL_t *st1 = (REAL_t *)sptr1; + REAL_t *st2 = (REAL_t *)sptr2; ++ asn_comp_rval_t *res = NULL; + -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) ++ ++ if (st1->size != st2->size) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; + } -+ if (st1->size != st2->size) return -1; -+ return memcmp(st1->buf, st2->buf, st1->size); ++ if (0 != memcmp(st1->buf, st2->buf, st1->size)) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; ++ } ++ return NULL; +} ---- ./skeletons/NativeReal.h 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/NativeReal.h 2015-11-26 14:31:12.631617407 +0100 +--- skeletons/NativeReal.h 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/NativeReal.h 2015-11-26 14:31:12.631617000 +0100 @@ -29,6 +29,7 @@ per_type_encoder_f NativeReal_encode_uper; per_type_decoder_f NativeReal_decode_aper; @@ -763,8 +981,8 @@ #ifdef __cplusplus } ---- ./skeletons/NULL.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/NULL.c 2015-11-30 13:18:53.047264114 +0100 +--- skeletons/NULL.c 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/NULL.c 2015-12-07 10:49:05.178647000 +0100 @@ -26,7 +26,8 @@ NULL_decode_uper, /* Unaligned PER decoder */ NULL_encode_uper, /* Unaligned PER encoder */ @@ -780,14 +998,14 @@ _ASN_ENCODED_OK(er); } + -+long ++asn_comp_rval_t * +NULL_compare(asn_TYPE_descriptor_t *td1, void *sptr1, + asn_TYPE_descriptor_t *td2, void *sptr2) { + -+ return 0; ++ return NULL; +} ---- ./skeletons/NULL.h 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/NULL.h 2015-11-26 14:53:03.875616050 +0100 +--- skeletons/NULL.h 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/NULL.h 2015-11-26 14:53:03.875616000 +0100 @@ -27,6 +27,7 @@ per_type_encoder_f NULL_encode_uper; per_type_decoder_f NULL_decode_aper; @@ -796,8 +1014,8 @@ #ifdef __cplusplus } ---- ./skeletons/NumericString.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/NumericString.c 2015-11-26 14:40:39.407616820 +0100 +--- skeletons/NumericString.c 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/NumericString.c 2015-11-26 14:40:39.407616000 +0100 @@ -50,7 +50,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -808,8 +1026,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_NumericString_tags, sizeof(asn_DEF_NumericString_tags) ---- ./skeletons/ObjectDescriptor.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/ObjectDescriptor.c 2015-11-26 14:55:46.227615882 +0100 +--- skeletons/ObjectDescriptor.c 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/ObjectDescriptor.c 2015-11-26 14:55:46.227615000 +0100 @@ -25,7 +25,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -820,8 +1038,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_ObjectDescriptor_tags, sizeof(asn_DEF_ObjectDescriptor_tags) ---- ./skeletons/OBJECT_IDENTIFIER.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/OBJECT_IDENTIFIER.c 2015-11-26 14:55:13.311615916 +0100 +--- skeletons/OBJECT_IDENTIFIER.c 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/OBJECT_IDENTIFIER.c 2015-11-26 14:55:13.311615000 +0100 @@ -28,7 +28,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -832,8 +1050,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_OBJECT_IDENTIFIER_tags, sizeof(asn_DEF_OBJECT_IDENTIFIER_tags) ---- ./skeletons/OCTET_STRING.c 2015-12-03 09:43:33.975009150 +0100 -+++ ./skeletons/OCTET_STRING.c 2015-11-30 13:19:18.271264088 +0100 +--- skeletons/OCTET_STRING.c 2015-12-08 14:39:44.554543521 +0100 ++++ skeletons/OCTET_STRING.c 2015-12-08 10:41:42.838558000 +0100 @@ -37,7 +37,8 @@ OCTET_STRING_decode_uper, /* Unaligned PER decoder */ OCTET_STRING_encode_uper, /* Unaligned PER encoder */ @@ -844,30 +1062,39 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_OCTET_STRING_tags, sizeof(asn_DEF_OCTET_STRING_tags) -@@ -2160,3 +2161,21 @@ +@@ -2160,3 +2161,30 @@ return st; } -+long ++asn_comp_rval_t * +OCTET_STRING_compare(asn_TYPE_descriptor_t *td1, + void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { + OCTET_STRING_t *st1 = (OCTET_STRING_t *)sptr1; + OCTET_STRING_t *st2 = (OCTET_STRING_t *)sptr2; ++ asn_comp_rval_t *res = NULL; + -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) ++ ++ if (st1->size != st2->size) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; + } -+ if (st1->size != st2->size) return -1; -+ return memcmp(st1->buf, st2->buf, st1->size); ++ if (0 != memcmp(st1->buf, st2->buf, st1->size)) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; ++ } ++ return NULL; +} ---- ./skeletons/OCTET_STRING.h 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/OCTET_STRING.h 2015-11-26 12:56:15.259623305 +0100 +--- skeletons/OCTET_STRING.h 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/OCTET_STRING.h 2015-11-26 12:56:15.259623000 +0100 @@ -34,6 +34,7 @@ per_type_encoder_f OCTET_STRING_encode_uper; per_type_decoder_f OCTET_STRING_decode_aper; @@ -876,8 +1103,8 @@ /****************************** * Handy conversion routines. * ---- ./skeletons/PrintableString.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/PrintableString.c 2015-11-26 14:56:09.787615857 +0100 +--- skeletons/PrintableString.c 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/PrintableString.c 2015-11-26 14:56:09.787615000 +0100 @@ -60,7 +60,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -888,8 +1115,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_PrintableString_tags, sizeof(asn_DEF_PrintableString_tags) ---- ./skeletons/REAL.c 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/REAL.c 2015-11-30 13:19:27.671264079 +0100 +--- skeletons/REAL.c 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/REAL.c 2015-12-08 10:41:55.178558000 +0100 @@ -46,7 +46,8 @@ REAL_decode_uper, REAL_encode_uper, @@ -900,32 +1127,41 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_REAL_tags, sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]), -@@ -741,3 +742,23 @@ +@@ -741,3 +742,32 @@ return 0; } + + -+long ++asn_comp_rval_t * +REAL_compare(asn_TYPE_descriptor_t *td1, void *sptr1, + asn_TYPE_descriptor_t *td2, void *sptr2) { + REAL_t *st1 = (REAL_t *)sptr1; + REAL_t *st2 = (REAL_t *)sptr2; ++ asn_comp_rval_t *res = NULL; + -+ if ((td1) && (td2)) { -+ if ((td1->name) && (td2->name)) { -+ if (strcmp(td1->name, td2->name)) return -1; -+ } else { -+ if ((td1->xml_tag) && (td2->xml_tag)) { -+ if (strcmp(td1->xml_tag, td2->xml_tag)) return -1; -+ } -+ } ++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res) ++ ++ if (st1->size != st2->size) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; + } -+ if (st1->size != st2->size) return -1; -+ return memcmp(st1->buf, st2->buf, st1->size); ++ if (0 != memcmp(st1->buf, st2->buf, st1->size)) { ++ res = calloc(1, sizeof(asn_comp_rval_t)); ++ res->name = td1->name; ++ res->structure1 = sptr1; ++ res->structure2 = sptr2; ++ res->err_code = COMPARE_ERR_CODE_NO_MATCH; ++ return res; ++ } ++ return NULL; +} ---- ./skeletons/REAL.h 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/REAL.h 2015-11-26 13:00:46.183623025 +0100 +--- skeletons/REAL.h 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/REAL.h 2015-11-26 13:00:46.183623000 +0100 @@ -23,6 +23,7 @@ per_type_encoder_f REAL_encode_uper; per_type_decoder_f REAL_decode_aper; @@ -934,8 +1170,8 @@ /*********************************** * Some handy conversion routines. * ---- ./skeletons/RELATIVE-OID.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/RELATIVE-OID.c 2015-11-26 14:56:31.703615834 +0100 +--- skeletons/RELATIVE-OID.c 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/RELATIVE-OID.c 2015-11-26 14:56:31.703615000 +0100 @@ -29,7 +29,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -946,8 +1182,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_RELATIVE_OID_tags, sizeof(asn_DEF_RELATIVE_OID_tags) ---- ./skeletons/T61String.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/T61String.c 2015-11-26 14:57:07.235615798 +0100 +--- skeletons/T61String.c 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/T61String.c 2015-11-26 14:57:07.235615000 +0100 @@ -25,7 +25,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -958,8 +1194,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_T61String_tags, sizeof(asn_DEF_T61String_tags) ---- ./skeletons/TeletexString.c 2015-12-03 09:43:33.963009150 +0100 -+++ ./skeletons/TeletexString.c 2015-11-26 14:57:17.643615787 +0100 +--- skeletons/TeletexString.c 2015-12-08 14:39:33.338543533 +0100 ++++ skeletons/TeletexString.c 2015-11-26 14:57:17.643615000 +0100 @@ -25,7 +25,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -970,8 +1206,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_TeletexString_tags, sizeof(asn_DEF_TeletexString_tags) ---- ./skeletons/UniversalString.c 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/UniversalString.c 2015-11-26 14:57:29.015615775 +0100 +--- skeletons/UniversalString.c 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/UniversalString.c 2015-11-26 14:57:29.015615000 +0100 @@ -36,7 +36,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -982,8 +1218,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_UniversalString_tags, sizeof(asn_DEF_UniversalString_tags) ---- ./skeletons/UTCTime.c 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/UTCTime.c 2015-11-26 14:57:44.127615759 +0100 +--- skeletons/UTCTime.c 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/UTCTime.c 2015-11-26 14:57:44.127615000 +0100 @@ -41,7 +41,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, @@ -994,8 +1230,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_UTCTime_tags, sizeof(asn_DEF_UTCTime_tags) ---- ./skeletons/UTF8String.c 2015-12-03 09:43:33.959009150 +0100 -+++ ./skeletons/UTF8String.c 2015-11-26 14:06:54.563618917 +0100 +--- skeletons/UTF8String.c 2015-12-08 14:39:33.314543533 +0100 ++++ skeletons/UTF8String.c 2015-11-26 14:06:54.563618000 +0100 @@ -27,6 +27,7 @@ OCTET_STRING_encode_uper, OCTET_STRING_decode_aper, @@ -1004,8 +1240,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_UTF8String_tags, sizeof(asn_DEF_UTF8String_tags) ---- ./skeletons/VideotexString.c 2015-12-03 09:43:33.967009150 +0100 -+++ ./skeletons/VideotexString.c 2015-11-26 14:07:06.139618905 +0100 +--- skeletons/VideotexString.c 2015-12-08 14:39:33.342543533 +0100 ++++ skeletons/VideotexString.c 2015-11-26 14:07:06.139618000 +0100 @@ -25,7 +25,8 @@ OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_uper, @@ -1016,8 +1252,8 @@ 0, /* Use generic outmost tag fetcher */ asn_DEF_VideotexString_tags, sizeof(asn_DEF_VideotexString_tags) ---- ./skeletons/VisibleString.c 2015-12-03 09:43:33.971009150 +0100 -+++ ./skeletons/VisibleString.c 2015-11-26 14:07:15.283618895 +0100 +--- skeletons/VisibleString.c 2015-12-08 14:39:33.350543533 +0100 ++++ skeletons/VisibleString.c 2015-11-26 14:07:15.283618000 +0100 @@ -30,7 +30,8 @@ OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py index f5daf03c25..446266d6a3 100644 --- a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py +++ b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py @@ -36,7 +36,7 @@ def outputHeaderToFile(f, filename): f.write("""/******************************************************************************* Eurecom OpenAirInterface - Copyright(c) 1999 - 2013 Eurecom + Copyright(c) 1999 - 2015 Eurecom This program is free software; you can redistribute it and/or modify it under the terms and conditions of the GNU General Public License, @@ -267,7 +267,7 @@ for key in iesDefs: f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) f.write(" **/\n") - f.write("long %s_compare_%s(\n" % (fileprefix, keylowerunderscore)) + f.write("asn_comp_rval_t * %s_compare_%s(\n" % (fileprefix, keylowerunderscore)) f.write(" %s_t *%s1,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) f.write(" %s_t *%s2);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) @@ -311,7 +311,7 @@ for key in iesDefs: f.write(" * \\param %s Pointer to the IES structure.\n" % (firstlower)) f.write(" * \\param %s Pointer to the IES structure.\n" % (firstlower)) f.write(" **/\n") - f.write("long %s_compare_%s(\n" % (fileprefix, firstlower.lower())) + f.write("asn_comp_rval_t * %s_compare_%s(\n" % (fileprefix, firstlower.lower())) f.write(" %sIEs_t *%s1,\n" % (asn1cStruct, firstlower)) f.write(" %sIEs_t *%s2);\n\n" % (asn1cStruct, firstlower)) @@ -761,11 +761,12 @@ for key in iesDefs: if len(iesDefs[key]["ies"]) == 0: continue - f.write("long %s_compare_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) + f.write("asn_comp_rval_t * %s_compare_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) f.write(" %s_t *%s1,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) f.write(" %s_t *%s2) {\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" long rv = 0;\n\n") + f.write(" asn_comp_rval_t *rv = NULL;\n\n") + f.write(" asn_comp_rval_t *rv2 = NULL;\n\n") f.write(" assert(%s1 != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))); f.write(" assert(%s2 != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))); @@ -784,7 +785,7 @@ for key in iesDefs: if loop == 1: #f.write(" %s_IE_t *ie1 = NULL;\n" % (fileprefix_first_upper)) #f.write(" %s_IE_t *ie2 = NULL;\n" % (fileprefix_first_upper)) - f.write(" if (%s1->presenceMask != %s2->presenceMask) return -1;\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), lowerFirstCamelWord(re.sub('-', '_', key)))) + f.write(" if (%s1->presenceMask != %s2->presenceMask) {rv=calloc(1,sizeof(asn_comp_rval_t));rv->name = asn_DEF_%s.name;rv->structure1 = %s1;rv->structure2 = %s2;rv->err_code = COMPARE_ERR_CODE_VALUE_NULL; return rv;}\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), lowerFirstCamelWord(re.sub('-', '_', key)), ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), lowerFirstCamelWord(re.sub('-', '_', key)))) if ie[3] == "optional": f.write(" /* Optional field */\n") @@ -795,25 +796,61 @@ for key in iesDefs: if ie[2] in ieofielist.keys(): f.write(" /* collection field */\n") - f.write(" rv = %s_compare_%s(&%s1->%s, &%s2->%s);\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) - f.write(" if (rv != 0) {rv = rv << 8; rv |= %s_ProtocolIE_ID_id_%s; return rv;}\n" % (fileprefix_first_upper, ienameunderscore)) + f.write(" rv2 = %s_compare_%s(&%s1->%s, &%s2->%s);\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) + f.write(" if(rv2) {") + f.write(" if (NULL == rv) {") + f.write(" rv = rv2;") + f.write(" } else {") + f.write(" rv2->next = rv;") + f.write(" rv = rv2;") + f.write(" }") + f.write(" rv2 = NULL;") + f.write(" }") else: f.write(" /* simple field */\n") - f.write(" rv = asn_DEF_%s.compare(&asn_DEF_%s, &%s1->%s, &asn_DEF_%s, &%s2->%s); \n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) - f.write(" if (rv != 0) {rv = rv << 8; rv |= %s_ProtocolIE_ID_id_%s; return rv;}\n" % (fileprefix_first_upper, ienameunderscore)) + f.write(" rv2 = asn_DEF_%s.compare(&asn_DEF_%s, &%s1->%s, &asn_DEF_%s, &%s2->%s); \n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) + f.write(" if (rv2) {") + f.write(" if (NULL == rv) {") + f.write(" rv = rv2;") + f.write(" } else {") + f.write(" rv2->next = rv;") + f.write(" rv = rv2;") + f.write(" }") + f.write(" rv2 = NULL;") + f.write(" if (!rv->name) rv->name = asn_DEF_%s.name;" % (ietypeunderscore)) + f.write(" }") + f.write(" assert(0);\n"); f.write(" }\n\n") else: if ie[2] in ieofielist.keys(): f.write(" /* Mandatory collection field */\n") - f.write(" rv = %s_compare_%s(&%s1->%s, &%s2->%s);\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) - f.write(" if (rv != 0) {rv = rv << 8; rv |= %s_ProtocolIE_ID_id_%s; return rv;}\n" % (fileprefix_first_upper, ienameunderscore)) + f.write(" rv2 = %s_compare_%s(&%s1->%s, &%s2->%s);\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) + f.write(" if (rv2) {\n") + f.write(" if (NULL == rv) {\n") + f.write(" rv = rv2;\n") + f.write(" } else {\n") + f.write(" rv2->next = rv;\n") + f.write(" rv = rv2;\n") + f.write(" }\n") + f.write(" rv2 = NULL;\n") + f.write(" }\n") + else: f.write(" /* Mandatory simple field */\n") - f.write(" rv = asn_DEF_%s.compare(&asn_DEF_%s, &%s1->%s, &asn_DEF_%s, &%s2->%s);\n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) - f.write(" if (rv != 0) {rv = rv << 8; rv |= %s_ProtocolIE_ID_id_%s; return rv;}\n" % (fileprefix_first_upper, ienameunderscore)) - f.write(" return 0;\n") + f.write(" rv2 = asn_DEF_%s.compare(&asn_DEF_%s, &%s1->%s, &asn_DEF_%s, &%s2->%s);\n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower )) + f.write(" if(rv2) {\n") + f.write(" if (NULL == rv) {\n") + f.write(" rv = rv2;\n") + f.write(" } else {\n") + f.write(" rv2->next = rv;\n") + f.write(" rv = rv2;\n") + f.write(" }\n") + f.write(" rv2 = NULL;\n") + f.write(" if (!rv->name) rv->name = asn_DEF_%s.name;\n" % (ietypeunderscore)) + f.write(" }\n") + f.write(" return rv;\n") f.write("}\n\n") for (key, value) in iesDefs.items(): @@ -832,19 +869,29 @@ for (key, value) in iesDefs.items(): f.write("extern asn_TYPE_descriptor_t asn_DEF_%s;\n" % (ietypeunderscore)) - f.write("long %s_compare_%s(\n" % (fileprefix, re.sub('-', '_', i).lower())) + f.write("asn_comp_rval_t * %s_compare_%s(\n" % (fileprefix, re.sub('-', '_', i).lower())) f.write(" %sIEs_t *%sIEs1,\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i)))) f.write(" %sIEs_t *%sIEs2) {\n\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i)))) f.write(" int i;\n") - f.write(" long rv = 0;\n") + f.write(" asn_comp_rval_t *rv = NULL;\n\n") + f.write(" asn_comp_rval_t *rv2 = NULL;\n\n") + f.write(" assert(%sIEs1 != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', i)))); f.write(" assert(%sIEs2 != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', i)))); f.write(" for (i = 0; i < %sIEs1->%s.count; i++) {\n" % (lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" rv = asn_DEF_%s.compare(&asn_DEF_%s, %sIEs1->%s.array[i], &asn_DEF_%s, %sIEs2->%s.array[i]);\n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))), ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) - f.write(" if (rv != 0) return rv;\n") + f.write(" rv2 = asn_DEF_%s.compare(&asn_DEF_%s, %sIEs1->%s.array[i], &asn_DEF_%s, %sIEs2->%s.array[i]);\n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))), ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) + f.write(" if(rv2) {") + f.write(" if (NULL == rv) {") + f.write(" rv = rv2;") + f.write(" } else {") + f.write(" rv2->next = rv;") + f.write(" rv = rv2;") + f.write(" }") + f.write(" rv2 = NULL;") + f.write(" }") f.write(" }\n") - f.write(" return 0;\n") + f.write(" return rv;\n") f.write("}\n\n") diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index 1aab216428..133e9adf4b 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -286,14 +286,26 @@ const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type) const char * const et_error_match2str(const int err) { switch (err) { - case -ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE: return "SCTP_CHUNK_TYPE"; break; - case -ET_ERROR_MATCH_PACKET_SCTP_PPID: return "SCTP_PPID"; break; - case -ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID: return "SCTP_ASSOC_ID"; break; - case -ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID: return "SCTP_STREAM_ID"; break; - case -ET_ERROR_MATCH_PACKET_SCTP_SSN: return "SCTP_SSN"; break; - case -ET_ERROR_MATCH_PACKET_S1AP_PRESENT: return "S1AP_PRESENT"; break; - case -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE: return "S1AP_PROCEDURE_CODE"; break; - case -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY: return "S1AP_CRITICALITY"; break; + // from asn_compare.h + case COMPARE_ERR_CODE_NO_MATCH: return "CODE_NO_MATCH"; break; + case COMPARE_ERR_CODE_TYPE_MISMATCH: return "TYPE_MISMATCH"; break; + case COMPARE_ERR_CODE_TYPE_ARG_NULL: return "TYPE_ARG_NULL"; break; + case COMPARE_ERR_CODE_VALUE_NULL: return "VALUE_NULL"; break; + case COMPARE_ERR_CODE_VALUE_ARG_NULL: return "VALUE_ARG_NULL"; break; + case COMPARE_ERR_CODE_CHOICE_NUM: return "CHOICE_NUM"; break; + case COMPARE_ERR_CODE_CHOICE_PRESENT: return "CHOICE_PRESENT"; break; + case COMPARE_ERR_CODE_CHOICE_MALFORMED: return "CHOICE_MALFORMED"; break; + case COMPARE_ERR_CODE_SET_MALFORMED: return "SET_MALFORMED"; break; + case COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS: return "COLLECTION_NUM_ELEMENTS"; break; + // from play_scenario.h + case ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE: return "SCTP_CHUNK_TYPE"; break; + case ET_ERROR_MATCH_PACKET_SCTP_PPID: return "SCTP_PPID"; break; + case ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID: return "SCTP_ASSOC_ID"; break; + case ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID: return "SCTP_STREAM_ID"; break; + case ET_ERROR_MATCH_PACKET_SCTP_SSN: return "SCTP_SSN"; break; + case ET_ERROR_MATCH_PACKET_S1AP_PRESENT: return "S1AP_PRESENT"; break; + case ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE: return "S1AP_PROCEDURE_CODE"; break; + case ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY: return "S1AP_CRITICALITY"; break; default: AssertFatal (0, "ERROR: Unknown match error %d!(TODO handle an1c error codes)\n", err); } @@ -792,9 +804,9 @@ static void et_usage ( fprintf (stdout, "Please report any bug to: %s\n",PACKAGE_BUGREPORT); fprintf (stdout, "Usage: %s [options]\n\n", argv[0]); fprintf (stdout, "\n"); - fprintf (stdout, "Client options:\n"); - fprintf (stdout, "\t-S | --server File name (with no path) of a test scenario that has to be replayed (TODO in future?)\n"); - fprintf (stdout, "Server options:\n"); + //fprintf (stdout, "Client options:\n"); + //fprintf (stdout, "\t-S | --server File name (with no path) of a test scenario that has to be replayed (TODO in future?)\n"); + //fprintf (stdout, "Server options:\n"); fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n"); fprintf (stdout, "\t-c | --enb-conf-file Provide an eNB config file, valid for the testbed\n"); fprintf (stdout, "\t-s | --scenario File name (with no path) of a test scenario that has to be replayed ()\n"); diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index a926ea55e4..f44974dae0 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -46,6 +46,7 @@ #include "s1ap_ies_defs.h" #include "play_scenario_s1ap_eNB_defs.h" #include "hashtable.h" +#include "asn_compare.h" // powers of 2 #define ET_BIT_MASK_MATCH_SCTP_STREAM 1 @@ -179,8 +180,10 @@ typedef enum { ET_FSM_STATE_END } et_fsm_state_t; +enum COMPARE_ERR_CODE_e; + typedef enum { - ET_ERROR_MATCH_START = 1, + ET_ERROR_MATCH_START = COMPARE_ERR_CODE_END, ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE = ET_ERROR_MATCH_START, ET_ERROR_MATCH_PACKET_SCTP_PPID, ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID, @@ -415,7 +418,8 @@ void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p); struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME(s1ap_eNB_instance_t *instance_p,int32_t assoc_id, uint16_t cnx_id); s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance); void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,uint32_t buffer_length, uint16_t stream); -long et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints); +int et_handle_s1ap_mismatch(et_packet_t * const spacket, et_packet_t * const rx_packet); +asn_comp_rval_t* et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints); et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const s1ap_data_ind); int et_scenario_set_packet_received(et_packet_t * const packet); int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind); @@ -451,10 +455,10 @@ void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); et_scenario_t* et_generate_scenario(const char * const et_scenario_filename ); //------------------------- -long et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints); +asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints); //------------------------- -long et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints); -long et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints); +asn_comp_rval_t * et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints); +asn_comp_rval_t * et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints); //------------------------------------------------------------------------------ void et_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num); int et_is_file_exists ( const char const * file_nameP, const char const *file_roleP); diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index df26de97c2..d58b16c2d3 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -189,30 +189,363 @@ void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, itti_send_msg_to_task(TASK_SCTP, instance, message_p); } //------------------------------------------------------------------------------ -long et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints) +int et_handle_s1ap_mismatch(et_packet_t * const spacket, et_packet_t * const rx_packet) { - if (s1ap1->pdu.present != s1ap2->pdu.present) return -ET_ERROR_MATCH_PACKET_S1AP_PRESENT; + S1ap_MME_UE_S1AP_ID_t scenario_mme_ue_s1ap_id = 0; + S1ap_MME_UE_S1AP_ID_t rx_mme_ue_s1ap_id = 0; + S1AP_PDU_PR present; + + present = rx_packet->sctp_hdr.u.data_hdr.payload.pdu.present; + + switch (rx_packet->sctp_hdr.u.data_hdr.payload.message.procedureCode) { + case S1ap_ProcedureCode_id_HandoverPreparation: + if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs.mme_ue_s1ap_id; + } else { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCommandIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCommandIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_HandoverResourceAllocation: + if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_successfulOutcome) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestAcknowledgeIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestAcknowledgeIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverFailureIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverFailureIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_HandoverNotification: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverNotifyIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverNotifyIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_PathSwitchRequest: + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PathSwitchRequestIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PathSwitchRequestIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_HandoverCancel: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCancelIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCancelIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_E_RABSetup: + if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupRequestIEs.mme_ue_s1ap_id; + } else { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupResponseIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_E_RABModify: + if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyRequestIEs.mme_ue_s1ap_id; + } else { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyResponseIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_E_RABRelease: + if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseCommandIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseCommandIEs.mme_ue_s1ap_id; + } else { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseResponseIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_E_RABReleaseIndication: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseIndicationIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseIndicationIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_InitialContextSetup: + if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupRequestIEs.mme_ue_s1ap_id; + } else { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupResponseIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_Paging: + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PagingIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PagingIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_downlinkNASTransport: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_initialUEMessage: + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialUEMessageIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialUEMessageIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_uplinkNASTransport: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_Reset: + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ResetIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ResetIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_ErrorIndication: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ErrorIndicationIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ErrorIndicationIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_NASNonDeliveryIndication: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_NASNonDeliveryIndication_IEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_NASNonDeliveryIndication_IEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_S1Setup: + /*if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupRequestIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_successfulOutcome) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupResponseIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupFailureIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupFailureIEs.mme_ue_s1ap_id; + }*/ + break; + + case S1ap_ProcedureCode_id_UEContextReleaseRequest: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseRequestIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_DownlinkS1cdma2000tunneling: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_UplinkS1cdma2000tunneling: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_UEContextModification: + if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationRequestIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_successfulOutcome) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationResponseIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationFailureIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationFailureIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_UECapabilityInfoIndication: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UECapabilityInfoIndicationIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UECapabilityInfoIndicationIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_UEContextRelease: + if (present == S1AP_PDU_PR_initiatingMessage) { + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.mme_ue_s1ap_id; + } else { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCompleteIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCompleteIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_eNBStatusTransfer: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBStatusTransferIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBStatusTransferIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_MMEStatusTransfer: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEStatusTransferIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEStatusTransferIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_DeactivateTrace: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DeactivateTraceIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DeactivateTraceIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_TraceStart: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceStartIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceStartIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_TraceFailureIndication: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceFailureIndicationIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceFailureIndicationIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_ENBConfigurationUpdate: + /*if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_successfulOutcome) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; + } else { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateFailureIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateFailureIEs.mme_ue_s1ap_id; + }*/ + break; + + case S1ap_ProcedureCode_id_MMEConfigurationUpdate: + /*if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_successfulOutcome) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; + } else { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateFailureIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateFailureIEs.mme_ue_s1ap_id; + }*/ + break; + + case S1ap_ProcedureCode_id_LocationReportingControl: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingControlIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingControlIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_LocationReportingFailureIndication: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingFailureIndicationIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingFailureIndicationIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_LocationReport: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_OverloadStart: + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStartIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStartIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_OverloadStop: + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStopIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStopIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_WriteReplaceWarning: + /*if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningRequestIEs.mme_ue_s1ap_id; + } else { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningResponseIEs.mme_ue_s1ap_id; + }*/ + break; + + case S1ap_ProcedureCode_id_eNBDirectInformationTransfer: + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBDirectInformationTransferIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBDirectInformationTransferIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_MMEDirectInformationTransfer: + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEDirectInformationTransferIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEDirectInformationTransferIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_PrivateMessage: + case S1ap_ProcedureCode_id_eNBConfigurationTransfer: + case S1ap_ProcedureCode_id_MMEConfigurationTransfer: + AssertFatal(0, "TODO"); + break; + + case S1ap_ProcedureCode_id_CellTrafficTrace: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_CellTrafficTraceIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_CellTrafficTraceIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_Kill: + /*if (present == S1AP_PDU_PR_initiatingMessage) { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillRequestIEs.mme_ue_s1ap_id; + } else { + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillResponseIEs.mme_ue_s1ap_id; + }*/ + break; + + case S1ap_ProcedureCode_id_downlinkUEAssociatedLPPaTransport: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_uplinkUEAssociatedLPPaTransport: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_downlinkNonUEAssociatedLPPaTransport: + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_uplinkNonUEAssociatedLPPaTransport: + //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + break; + + default: + AssertFatal(0, "Unknown procedure code %ld", rx_packet->sctp_hdr.u.data_hdr.payload.message.procedureCode); + } + return 0; +} +//------------------------------------------------------------------------------ +asn_comp_rval_t * et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints) +{ + asn_comp_rval_t *rv = NULL; + if (s1ap1->pdu.present != s1ap2->pdu.present) {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PRESENT; return rv;} switch (s1ap1->pdu.present) { case S1AP_PDU_PR_NOTHING: break; case S1AP_PDU_PR_initiatingMessage: - if (s1ap1->pdu.choice.initiatingMessage.procedureCode != s1ap2->pdu.choice.initiatingMessage.procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; - if (s1ap1->pdu.choice.initiatingMessage.criticality != s1ap2->pdu.choice.initiatingMessage.criticality) return -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; + if (s1ap1->pdu.choice.initiatingMessage.procedureCode != s1ap2->pdu.choice.initiatingMessage.procedureCode) + {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; return rv;} + if (s1ap1->pdu.choice.initiatingMessage.criticality != s1ap2->pdu.choice.initiatingMessage.criticality) + {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; return rv;} break; case S1AP_PDU_PR_successfulOutcome: - if (s1ap1->pdu.choice.successfulOutcome.procedureCode != s1ap2->pdu.choice.successfulOutcome.procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; - if (s1ap1->pdu.choice.successfulOutcome.criticality != s1ap2->pdu.choice.successfulOutcome.criticality) return -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; + if (s1ap1->pdu.choice.successfulOutcome.procedureCode != s1ap2->pdu.choice.successfulOutcome.procedureCode) + {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; return rv;} + if (s1ap1->pdu.choice.successfulOutcome.criticality != s1ap2->pdu.choice.successfulOutcome.criticality) + {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; return rv;} break; case S1AP_PDU_PR_unsuccessfulOutcome: - if (s1ap1->pdu.choice.unsuccessfulOutcome.procedureCode != s1ap2->pdu.choice.unsuccessfulOutcome.procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; - if (s1ap1->pdu.choice.unsuccessfulOutcome.criticality != s1ap2->pdu.choice.unsuccessfulOutcome.criticality) return -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; + if (s1ap1->pdu.choice.unsuccessfulOutcome.procedureCode != s1ap2->pdu.choice.unsuccessfulOutcome.procedureCode) + {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; return rv;} + if (s1ap1->pdu.choice.unsuccessfulOutcome.criticality != s1ap2->pdu.choice.unsuccessfulOutcome.criticality) + {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; return rv;} break; default: AssertFatal(0, "Unknown pdu.present %d", s1ap1->pdu.present); } if (s1ap1->binary_stream_allocated_size == s1ap2->binary_stream_allocated_size) { - if (memcmp((void*)s1ap1->binary_stream, (void*)s1ap2->binary_stream, s1ap1->binary_stream_allocated_size) == 0) return 0; + if (memcmp((void*)s1ap1->binary_stream, (void*)s1ap2->binary_stream, s1ap1->binary_stream_allocated_size) == 0) return NULL; } // if no matching, may be the scenario need minor corrections (same enb_ue_s1ap_id but need to update mme_ue_s1ap_id) return et_s1ap_ies_is_matching(s1ap1->pdu.present, &s1ap1->message, &s1ap2->message, constraints); @@ -284,10 +617,12 @@ int et_scenario_set_packet_received(et_packet_t * const packet) //------------------------------------------------------------------------------ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) { - et_packet_t * packet = NULL; - et_packet_t * rx_packet = NULL; - unsigned long int not_found = 1; - long rv = 0; + et_packet_t *packet = NULL; + et_packet_t *rx_packet = NULL; + unsigned long int not_found = 1; + asn_comp_rval_t *comp_results = NULL; + asn_comp_rval_t *comp_results2 = NULL; + unsigned char error_code = 0; AssertFatal (NULL != s1ap_data_ind, "Bad parameter sctp_data_ind\n"); rx_packet = et_build_packet_from_s1ap_data_ind(s1ap_data_ind); @@ -317,20 +652,35 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) // not_found threshold may sure depend on number of mme, may be not sure on number of UE while ((NULL != packet) && (not_found < 5)) { if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - rv = et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints); - if (0 == rv) { + comp_results = et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints); + if (NULL == comp_results) { S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec; packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; return et_scenario_set_packet_received(packet); } else { - S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u failed:%s\n", - packet->packet_number, packet->original_frame_number, et_error_match2str(rv)); - // asn1 compare no match return code, may not collide with non asn1 error return codes - // (each asn1 rc <= 166 (enum e_S1ap_ProtocolIE_ID, in generated file S1ap_ProtocolIE_ID.h)) - if ((rv > 0) || (rv <= -ET_ERROR_MATCH_END)) { - //TODO MME_UE_S1AP_ID, etc. - AssertFatal(0,"Some work needed there"); + S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u failed\n", + packet->packet_number, packet->original_frame_number); + while (comp_results) { + S1AP_DEBUG("Result err code %s(%u) ASN1 struct name %s\n", + et_error_match2str(comp_results->err_code), comp_results->err_code, comp_results->name); + // (each asn1 rc <= 166 (enum e_S1ap_ProtocolIE_ID, in generated file S1ap_ProtocolIE_ID.h)) + if (comp_results->err_code == COMPARE_ERR_CODE_NO_MATCH) { + //TODO MME_UE_S1AP_ID, etc. + // get latest error code + if (strcmp(comp_results->name, "S1ap-MME-UE-S1AP-ID") == 0) { + if (0 == et_handle_s1ap_mismatch((et_packet_t *const)packet, (et_packet_t *const)rx_packet)) { + packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec; + packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; + return et_scenario_set_packet_received(packet); + } + } else { + AssertFatal(0,"Some work needed there"); + } + } + comp_results2 = comp_results; + comp_results = comp_results2->next; + et_free_pointer(comp_results2); } } } diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 5300476e98..213be2b347 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -58,9 +58,9 @@ extern et_scenario_t *g_scenario; extern uint32_t g_constraints; //------------------------------------------------------------------------------ -long et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints) +asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints) { - long ret = 0; + asn_comp_rval_t *ret = NULL; AssertFatal(m1 != NULL, "bad parameter m1"); AssertFatal(m2 != NULL, "bad parameter m2"); AssertFatal((present == S1AP_PDU_PR_initiatingMessage) || @@ -401,6 +401,8 @@ long et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, case S1ap_ProcedureCode_id_PrivateMessage: case S1ap_ProcedureCode_id_eNBConfigurationTransfer: case S1ap_ProcedureCode_id_MMEConfigurationTransfer: + AssertFatal(0, "TODO"); + break; case S1ap_ProcedureCode_id_CellTrafficTrace: ret = s1ap_compare_s1ap_celltraffictraceies( diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index 07206f53b8..181009c2c9 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -44,27 +44,36 @@ #include "play_scenario.h" //------------------------------------------------------------------------------ -long et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints) +asn_comp_rval_t * et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints) { + asn_comp_rval_t *rv = NULL; // no comparison for ports if (sctp1->ppid != sctp2->ppid) { S1AP_WARN("No Matching SCTP PPID %u %u\n", sctp1->ppid, sctp2->ppid); - return -ET_ERROR_MATCH_PACKET_SCTP_PPID; + rv = calloc(1, sizeof(asn_comp_rval_t)); + rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_PPID; + return rv; } if (sctp1->assoc_id != sctp2->assoc_id) { S1AP_WARN("No Matching SCTP assoc id %u %u\n", sctp1->assoc_id, sctp2->assoc_id); - return -ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID; + rv = calloc(1, sizeof(asn_comp_rval_t)); + rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID; + return rv; } if (sctp1->stream != sctp2->stream) { if (constraints & ET_BIT_MASK_MATCH_SCTP_STREAM) { - return -ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID; + rv = calloc(1, sizeof(asn_comp_rval_t)); + rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID; + return rv; } else { S1AP_WARN("No Matching SCTP stream %u %u\n", sctp1->stream, sctp2->stream); } } if (sctp1->ssn != sctp2->ssn) { if (constraints & ET_BIT_MASK_MATCH_SCTP_SSN) { - return -ET_ERROR_MATCH_PACKET_SCTP_SSN; + rv = calloc(1, sizeof(asn_comp_rval_t)); + rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_SSN; + return rv; } else { S1AP_WARN("No Matching SCTP STREAM SN %u %u\n", sctp1->ssn, sctp2->ssn); } @@ -73,10 +82,16 @@ long et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * con } //------------------------------------------------------------------------------ -long et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints) +asn_comp_rval_t * et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints) { // no comparison for ports - if (sctp1->chunk_type != sctp2->chunk_type) return -ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE; + asn_comp_rval_t *rv = NULL; + if (sctp1->chunk_type != sctp2->chunk_type){ + S1AP_WARN("No Matching chunk_type %u %u\n", sctp1->chunk_type, sctp2->chunk_type); + rv = calloc(1, sizeof(asn_comp_rval_t)); + rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE; + return rv; + } switch (sctp1->chunk_type) { case SCTP_CID_DATA: return et_sctp_data_is_matching(&sctp1->u.data_hdr, &sctp2->u.data_hdr, constraints); @@ -92,5 +107,5 @@ long et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp AssertFatal(0, "Not needed now cid %d", sctp1->chunk_type); } - return 0; + return NULL; } From 3e3bdd9ef23c6c3a3738021f3f288509dda30903 Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 15 Dec 2015 13:19:00 +0100 Subject: [PATCH 019/122] Removed from this repo epc xsl files, commiting for sync --- cmake_targets/tools/build_helper | 179 ++++++++- cmake_targets/tools/build_test_epc_tools | 1 - openair3/TEST/EPC_TEST/generate_scenario.c | 17 +- openair3/TEST/EPC_TEST/generic_scenario.xsl | 312 ---------------- openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml | 104 ------ openair3/TEST/EPC_TEST/play_scenario.c | 6 - openair3/TEST/EPC_TEST/play_scenario.h | 3 +- openair3/TEST/EPC_TEST/play_scenario.xsl | 113 ------ openair3/TEST/EPC_TEST/play_scenario_parse.c | 13 +- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 14 +- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 351 ++++++++++++++++++ .../enb.band7.tm1.usrpb210.epc.local.conf | 12 +- 12 files changed, 557 insertions(+), 568 deletions(-) delete mode 100644 openair3/TEST/EPC_TEST/generic_scenario.xsl delete mode 100755 openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml delete mode 100644 openair3/TEST/EPC_TEST/play_scenario.xsl diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 350dae86a6..0a0118581e 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -30,7 +30,7 @@ ################################################################################ # file build_helper # brief -# author Laurent Thomas +# authors Laurent Thomas, Lionel GAUTHIER # ####################################### SUDO='sudo -E' @@ -301,6 +301,183 @@ install_nas_tools() { fi } +################################################# +# 3. Network interfaces utilities +################################################ + +cidr2mask(){ + local i mask="" + local full_octets=$(($1/8)) + local partial_octet=$(($1%8)) + + for ((i=0;i<4;i+=1)); do + if [ $i -lt $full_octets ]; then + mask+=255 + elif [ $i -eq $full_octets ]; then + mask+=$((256 - 2**(8-$partial_octet))) + else + mask+=0 + fi + test $i -lt 3 && mask+=. + done + + echo $mask +} + +# example: netcalc 192.168.12.100 255.255.255.0 +netcalc(){ + local IFS='.' ip i + local -a oct msk + + read -ra oct <<<"$1" + read -ra msk <<<"$2" + + for i in ${!oct[@]}; do + ip+=( "$(( oct[i] & msk[i] ))" ) + done + + echo "${ip[*]}" +} + +# example: +bcastcalc(){ + local IFS='.' ip i + local -a oct msk + + read -ra oct <<<"$1" + read -ra msk <<<"$2" + + for i in ${!oct[@]}; do + ip+=( "$(( oct[i] + ( 255 - ( oct[i] | msk[i] ) ) ))" ) + done + echo "${ip[*]}" +} + + +is_real_interface(){ + my_bool=1 + for var in "$@" + do + if [ "a$var" == "a" ]; then + return 0 + fi + if [ "a$var" == "anone" ]; then + return 0 + fi + IF=`cat /etc/udev/rules.d/70-persistent-net.rules | grep $var | sed 's/^.*NAME=//' | tr -d '"'` + if [ "$IF" == "$var" ]; then + if [ "a${var:0:3}" != "aeth" ]; then + if [ "a${var:0:4}" != "awlan" ]; then + if [ "a${var:0:4}" != "awifi" ]; then + my_bool=0; + fi + fi + fi + fi + done + return $my_bool +} + +is_virtual_interface(){ + my_bool=1 + for var in "$@" + do + if [ "a$var" == "a" ]; then + return 0 + fi + if [ "a$var" == "anone" ]; then + return 0 + fi + num=`expr index "$var" :` + + if [ $num -eq 0 ]; then + my_bool=0; + fi + done + return $my_bool +} + +# arg1 = interface name +# arg2 = ipv4 addr cidr +set_interface_up(){ + interface=$1 + address=${2%/*} #part before '/' + cidr_netmask=${2#*/} # part after '/' + + if [ "a${interface:0:4}" == "anone" ]; then + return; + fi + echo "ifconfig $interface up" + $SUDO ifconfig $interface up + sync + netmask=`cidr2mask $cidr_netmask` + broadcast=`bcastcalc $address $netmask` + echo "ip -4 addr add $address/$cidr_netmask broadcast $broadcast dev $interface" + $SUDO ip -4 addr add $address/$cidr_netmask broadcast $broadcast dev $interface + sync +} + +# arg1 = interface name +# arg2 = ipv4 addr cidr +set_virtual_interface_up(){ + interface=$1 + address=${2%/*} #part before '/' + cidr_netmask=${2#*/} # part after '/' + + if [ "a${interface:0:4}" == "anone" ]; then + return; + fi + $SUDO ifconfig $interface down > /dev/null 2>&1 + sync + echo "ifconfig $interface $address up" + $SUDO ifconfig $interface $address up + sync +} + +#arg1 is interface name +#arg2 is IP address (CIDR) +set_network_interface(){ + local interface_name=$1 + local ip_cidr=$2 + + is_virtual_interface $interface_name + if [ $? -eq 1 ]; then + echo "$interface_name is virtual interface" + set_virtual_interface_up $interface_name $ip_cidr + else + is_real_interface $interface_name + if [ $? -eq 1 ]; then + echo "$interface_name is real interface" + set_interface_up $interface_name $ip_cidr + else + echo_warning "$interface_name not handled, not configuring it" + return + fi + fi +} + +# arg1 is a 'libconfig-like' config file +set_epc_network_interfaces(){ + value="`cat $1 | cut -d "#" -f1 | grep 'ADDRESS\|INTERFACE' | tr -d " " | grep "="`" + eval $value + + # check all var names are correct + list_var_name="\ + ENB_INTERFACE_NAME_FOR_S1_MME ENB_IPV4_ADDRESS_FOR_S1_MME \ + ENB_INTERFACE_NAME_FOR_S1U ENB_IPV4_ADDRESS_FOR_S1U " + for var_name in $list_var_name + do + if [ -n "$${var_name}" ]; then + echo_success "Found ${var_name} = ${!var_name}" + else + echo_fatal "${var_name} does does not exist in your config file $1" + fi + done + + # configure interfaces + set_network_interface $ENB_INTERFACE_NAME_FOR_S1_MME $ENB_IPV4_ADDRESS_FOR_S1_MME + set_network_interface $ENB_INTERFACE_NAME_FOR_S1U $ENB_IPV4_ADDRESS_FOR_S1U +} diff --git a/cmake_targets/tools/build_test_epc_tools b/cmake_targets/tools/build_test_epc_tools index b67cf15810..aa7103fd78 100755 --- a/cmake_targets/tools/build_test_epc_tools +++ b/cmake_targets/tools/build_test_epc_tools @@ -148,7 +148,6 @@ function main() $SUDO cp -upv test_epc_generate_scenario /usr/local/bin $SUDO cp -upv test_epc_play_scenario /usr/local/bin - $SUDO cp -upv $OPENAIR_DIR/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml /usr/local/bin } diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index 9f4e16baef..238ba0ff11 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -97,7 +97,6 @@ #define ENB_CONFIG_MAX_XSLT_PARAMS 32 Enb_properties_array_t g_enb_properties; -char *g_openair_dir = NULL; char *g_test_dir = NULL; char *g_pdml_in_origin = NULL; extern int xmlLoadExtDtdDefaultValue; @@ -195,17 +194,13 @@ int generate_test_scenario(const char const * test_nameP, const char const * pdm exit(1); } - memset(astring, 0, sizeof(astring)); - strcat(astring, g_openair_dir); - strcat(astring, "/openair3/TEST/EPC_TEST/generic_scenario.xsl"); - xmlSubstituteEntitiesDefault(1); xmlLoadExtDtdDefaultValue = 1; - cur = xsltParseStylesheetFile(astring); + cur = xsltParseStylesheetFile("/usr/share/oai/xsl/generic_scenario.xsl"); if (NULL == cur) { - AssertFatal (0, "Could not parse stylesheet file %s (check OPENAIR_DIR env variable)!\n", astring); + AssertFatal (0, "Could not parse stylesheet file /usr/share/oai/xsl/generic_scenario.xsl!\n"); } else { - fprintf(stdout, "XSLT style sheet: %s\n", astring); + fprintf(stdout, "XSLT style sheet: /usr/share/oai/xsl/generic_scenario.xsl\n"); } doc = xmlParseFile(pdml_in_basenameP); @@ -686,12 +681,6 @@ int main( int argc, char **argv ) { int actions = 0; - g_openair_dir = getenv("OPENAIR_DIR"); - if (NULL == g_openair_dir) { - fprintf(stderr, "Error: Could not get OPENAIR_DIR environment variable\n"); - exit(1); - } - memset((char*) &g_enb_properties, 0 , sizeof(g_enb_properties)); actions = config_parse_opt_line (argc, argv); //Command-line options diff --git a/openair3/TEST/EPC_TEST/generic_scenario.xsl b/openair3/TEST/EPC_TEST/generic_scenario.xsl deleted file mode 100644 index 592bef83d4..0000000000 --- a/openair3/TEST/EPC_TEST/generic_scenario.xsl +++ /dev/null @@ -1,312 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - enb0_s1c - enb1_s1c - enb2_s1c - enb3_s1c - enb4_s1c - enb5_s1c - enb6_s1c - enb7_s1c - mme0_s1c_0 - mme0_s1c_1 - mme0_s1c_2 - mme0_s1c_3 - mme1_s1c_0 - mme1_s1c_1 - mme1_s1c_2 - mme1_s1c_3 - mme2_s1c_0 - mme2_s1c_1 - mme2_s1c_2 - mme2_s1c_3 - mme3_s1c_0 - mme3_s1c_1 - mme3_s1c_2 - mme3_s1c_3 - - ERROR: Cannot reverse resolv IP ! - - - - - - - - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - - ERROR: Cannot set eNB instance ! - - - - - - - - - - - DATA - INIT - INIT_ACK - SACK - HEARTBEAT - HEARTBEAT_ACK - ABORT - SHUTDOWN - SHUTDOWN_ACK - ERROR - COOKIE_ECHO - COOKIE_ACK - ECNE - CWR - SHUTDOWN_COMPLETE - - ERROR: UNKNOWN CHUNK TYPE ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SEND - RECEIVE - - ERROR: UNKNOWN ACTION ! - - - - - - - - - - - - - - - - - - ERROR: UNKNOWN ACTION ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml b/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml deleted file mode 100755 index 796fa9a45b..0000000000 --- a/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -import sys -import subprocess -import re -import socket -import datetime -from datetime import date -import os, errno -import argparse -import tempfile -from lxml import etree -from xml.dom.minidom import parse, parseString - -##################### -# program arguments -##################### -parser = argparse.ArgumentParser() -parser.add_argument("--pcap_file", "-p", type=str,help="input pcap file to be translated") -args = parser.parse_args() - -##################### -# get xml document from pcap -##################### -orig_pcap_file_name = args.pcap_file.strip() -orig_pdml_string = subprocess.check_output(["tshark", '-T', 'pdml', '-r', orig_pcap_file_name]) - -orig_dom = parseString(orig_pdml_string) - -##################### -# filtering unwanted packets -##################### -#cases = orig_etree.findall(".//proto[@name='sctp']") -packets = orig_dom.getElementsByTagName("packet") -for packet in packets: - found_sctp = False - found_s1ap = False - sctp_node = None - frame_node = None - ip_node = None - protos = packet.getElementsByTagName("proto") - for proto in protos: - attrs = proto.attributes - urlnode = attrs['name'] - if urlnode.nodeValue == 'frame': - frame_node = proto - elif urlnode.nodeValue == 'ip': - frame_node.appendChild(proto) - ip_node = proto - elif urlnode.nodeValue == 'sctp': - found_sctp = True - ip_node.appendChild(proto) - sctp_node = proto - elif urlnode.nodeValue == 's1ap': - found_s1ap = True - sctp_node.appendChild(proto) - elif urlnode.nodeValue == 'geninfo': - packet.removeChild(proto) - elif urlnode.nodeValue == 'eth': - packet.removeChild(proto) - if found_sctp == False: - # hopefully it seems to work (remove iterated packet) - packet.parentNode.removeChild(packet) - -##################### -# dom to xml string -##################### -filtered_pdml_string = orig_dom.toprettyxml(indent=" ") -cleaned_pdml_string = "" -##################### -# remove blank lines in xml string -##################### -lines = filtered_pdml_string.splitlines() -for line in lines: - if len(line.strip()): - if line[:-1]: - cleaned_pdml_string += line + '\r\n' -#print "'%s'" % cleaned_pdml_string -##################### -# write pdml string to pdml file -##################### -out_pdml_file_name = os.path.dirname(orig_pcap_file_name) + '/' + os.path.splitext(os.path.basename(orig_pcap_file_name))[0] + '.pdml' -out_file = open(out_pdml_file_name, "w") -out_file.write(cleaned_pdml_string) -out_file.close() - -############################################################ -# DECEIVING HTML BONUS: DO NOT SEEM TO WORK CORRECTLY IN FIREFOX -# DID NOT INVESTIGATE -##################### -# write xml string to html file -##################### -xsl_root = etree.fromstring(open('/usr/share/wireshark/pdml2html.xsl').read()) -transform = etree.XSLT(xsl_root) -xml_root = etree.fromstring(cleaned_pdml_string) -trans_root = transform(xml_root) -filtered_html_string = etree.tostring(trans_root) -##################### -# write html string to html file -##################### -out_html_file_name = os.path.dirname(orig_pcap_file_name) + '/' +os.path.splitext(os.path.basename(orig_pcap_file_name))[0] + '.html' -out_file = open(out_html_file_name, "w") -out_file.write(filtered_html_string) -out_file.close() diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index 133e9adf4b..a801d2cf23 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -68,7 +68,6 @@ #define GS_IS_FILE 1 #define GS_IS_DIR 2 //------------------------------------------------------------------------------ -char *g_openair_dir = NULL; Enb_properties_array_t g_enb_properties; //------------------------------------------------------------------------------ extern et_scenario_t *g_scenario; @@ -936,11 +935,6 @@ int main( int argc, char **argv ) char play_scenario_filename[NAME_MAX]; memset(play_scenario_filename, 0, sizeof(play_scenario_filename)); - g_openair_dir = getenv("OPENAIR_DIR"); - if (NULL == g_openair_dir) { - fprintf(stderr, "ERROR: Could not get OPENAIR_DIR environment variable\n"); - exit(1); - } // logging logInit(); diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index f44974dae0..758ee97981 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -252,6 +252,7 @@ typedef struct et_s1ap_s { uint16_t binary_stream_allocated_size; uint8_t *binary_stream; s1ap_message message; // decoded message: information elements + xmlNodePtr xml_node; // XML representation of the S1AP PDU } et_s1ap_t; @@ -418,7 +419,7 @@ void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p); struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME(s1ap_eNB_instance_t *instance_p,int32_t assoc_id, uint16_t cnx_id); s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance); void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,uint32_t buffer_length, uint16_t stream); -int et_handle_s1ap_mismatch(et_packet_t * const spacket, et_packet_t * const rx_packet); +int et_handle_s1ap_mismatch_mme_ue_s1ap_id(et_packet_t * const spacket, et_packet_t * const rx_packet); asn_comp_rval_t* et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints); et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const s1ap_data_ind); int et_scenario_set_packet_received(et_packet_t * const packet); diff --git a/openair3/TEST/EPC_TEST/play_scenario.xsl b/openair3/TEST/EPC_TEST/play_scenario.xsl deleted file mode 100644 index 0ce22c08df..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario.xsl +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ERROR: Cannot resolv IP ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ERROR: Cannot resolv IP ! - - - - - - - - - - - - - - - - diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index 496102449a..35ed5c8603 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -58,7 +58,6 @@ //------------------------------------------------------------------------------ #define ENB_CONFIG_MAX_XSLT_PARAMS 32 //------------------------------------------------------------------------------ -extern char *g_openair_dir; extern Enb_properties_array_t g_enb_properties; //------------------------------------------------------------------------------ void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * const s1ap) @@ -71,6 +70,9 @@ void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * co unsigned int go_deeper_in_tree = 1; if ((NULL != s1ap_node) && (NULL != s1ap)) { + // seee http://www.xmlsoft.org/html/libxml-tree.html#xmlCopyNode + s1ap->xml_node = xmlCopyNode(s1ap_node, 1); + AssertFatal(NULL != s1ap->xml_node, "xmlCopyNode Failed"); for (cur_node = (xmlNode *)s1ap_node; cur_node; cur_node = cur_node->next) { go_deeper_in_tree = 1; if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"field"))) { @@ -497,17 +499,14 @@ int et_generate_xml_scenario( exit(1); } - memset(astring, 0, sizeof(astring)); - strcat(astring, g_openair_dir); - strcat(astring, "/openair3/TEST/EPC_TEST/play_scenario.xsl"); xmlSubstituteEntitiesDefault(1); xmlLoadExtDtdDefaultValue = 1; - cur = xsltParseStylesheetFile((const xmlChar *)astring); + cur = xsltParseStylesheetFile((const xmlChar *)"/usr/share/oai/xsl/play_scenario.xsl"); if (NULL == cur) { - AssertFatal (0, "Could not parse stylesheet file %s (check OPENAIR_DIR env variable)!\n", astring); + AssertFatal (0, "Could not parse stylesheet file /usr/share/oai/xsl/play_scenario.xsl!\n"); } else { - fprintf(stdout, "XSLT style sheet: %s\n", astring); + fprintf(stdout, "XSLT style sheet: /usr/share/oai/xsl/play_scenario.xsl\n"); } doc = xmlParseFile(xml_in_scenario_filename); diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index d58b16c2d3..f5afebd786 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -189,7 +189,7 @@ void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, itti_send_msg_to_task(TASK_SCTP, instance, message_p); } //------------------------------------------------------------------------------ -int et_handle_s1ap_mismatch(et_packet_t * const spacket, et_packet_t * const rx_packet) +int et_handle_s1ap_mismatch_mme_ue_s1ap_id(et_packet_t * const spacket, et_packet_t * const rx_packet) { S1ap_MME_UE_S1AP_ID_t scenario_mme_ue_s1ap_id = 0; S1ap_MME_UE_S1AP_ID_t rx_mme_ue_s1ap_id = 0; @@ -512,7 +512,15 @@ int et_handle_s1ap_mismatch(et_packet_t * const spacket, et_packet_t * const rx_ default: AssertFatal(0, "Unknown procedure code %ld", rx_packet->sctp_hdr.u.data_hdr.payload.message.procedureCode); } - return 0; + if (scenario_mme_ue_s1ap_id != rx_mme_ue_s1ap_id) { + et_packet_t * p = spacket; + while (p) { + et_s1ap_update_mme_ue_s1ap_id(p, scenario_mme_ue_s1ap_id, rx_mme_ue_s1ap_id); + p = p->next; + } + return 0; + } + return 1; } //------------------------------------------------------------------------------ asn_comp_rval_t * et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints) @@ -669,7 +677,7 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) //TODO MME_UE_S1AP_ID, etc. // get latest error code if (strcmp(comp_results->name, "S1ap-MME-UE-S1AP-ID") == 0) { - if (0 == et_handle_s1ap_mismatch((et_packet_t *const)packet, (et_packet_t *const)rx_packet)) { + if (0 == et_handle_s1ap_mismatch_mme_ue_s1ap_id((et_packet_t *const)packet, (et_packet_t *const)rx_packet)) { packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec; packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; return et_scenario_set_packet_received(packet); diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 213be2b347..3533ee086e 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -451,3 +451,354 @@ asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_messag } return ret; } + +//------------------------------------------------------------------------------ +int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_S1AP_ID_t old_id, const S1ap_MME_UE_S1AP_ID_t new_id) +{ + S1ap_MME_UE_S1AP_ID_t mme_ue_s1ap_id = 0; + S1AP_PDU_PR present; + ssize_t encoded; + + present = packet->sctp_hdr.u.data_hdr.payload.pdu.present; + + S1AP_DEBUG("Updating mme_ue_s1ap_id of packet num %d...\n", packet->packet_number); + + switch (packet->sctp_hdr.u.data_hdr.payload.message.procedureCode) { + case S1ap_ProcedureCode_id_HandoverPreparation: + if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs.mme_ue_s1ap_id; + if (old_id == mme_ue_s1ap_id) { + packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs.mme_ue_s1ap_id = new_id; + // re-encode + S1ap_HandoverRequired_t msg; + S1ap_HandoverRequired_t *msg_p = &msg; + memset((void *)msg_p, 0, sizeof(msg)); + + if (s1ap_encode_s1ap_handoverrequiredies( + msg_p, &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs) < 0) { + AssertFatal(0, "Re-encoding handoverrequiredies failed"); + } + + ANY_fromType_aper(&packet->sctp_hdr.u.data_hdr.payload.pdu.choice.initiatingMessage.value, + &asn_DEF_S1ap_HandoverRequired, + &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs); + + packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs; + encoded = aper_encode_to_new_buffer(&asn_DEF_S1AP_PDU, 0, &packet->sctp_hdr.u.data_hdr.payload.pdu, + (void **)&packet->sctp_hdr.u.data_hdr.payload.binary_stream); + AssertFatal(encoded < 0, "Re-encoding PDU failed"); + } + } else { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCommandIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_HandoverResourceAllocation: + if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_successfulOutcome) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestAcknowledgeIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverFailureIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_HandoverNotification: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverNotifyIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_PathSwitchRequest: + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PathSwitchRequestIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PathSwitchRequestIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_HandoverCancel: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCancelIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_E_RABSetup: + if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupRequestIEs.mme_ue_s1ap_id; + } else { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupResponseIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_E_RABModify: + if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyRequestIEs.mme_ue_s1ap_id; + } else { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyResponseIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_E_RABRelease: + if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseCommandIEs.mme_ue_s1ap_id; + } else { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseResponseIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_E_RABReleaseIndication: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseIndicationIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_InitialContextSetup: + if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupRequestIEs.mme_ue_s1ap_id; + } else { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupResponseIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_Paging: + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PagingIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PagingIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_downlinkNASTransport: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs.mme_ue_s1ap_id; + if (old_id == mme_ue_s1ap_id) { + packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs.mme_ue_s1ap_id = new_id; + // re-encode + S1ap_DownlinkNASTransport_t msg; + S1ap_DownlinkNASTransport_t *msg_p = &msg; + memset((void *)msg_p, 0, sizeof(msg)); + + if (s1ap_encode_s1ap_downlinknastransporties( + msg_p, &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs) < 0) { + AssertFatal(0, "Re-encoding downlinknastransporties failed"); + } + + ANY_fromType_aper(&packet->sctp_hdr.u.data_hdr.payload.pdu.choice.initiatingMessage.value, + &asn_DEF_S1ap_DownlinkNASTransport, + &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs); + + encoded = aper_encode_to_new_buffer(&asn_DEF_S1AP_PDU, 0, &packet->sctp_hdr.u.data_hdr.payload.pdu, + (void **)&packet->sctp_hdr.u.data_hdr.payload.binary_stream); + AssertFatal(encoded < 0, "Re-encoding PDU failed"); + } + break; + + case S1ap_ProcedureCode_id_initialUEMessage: + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialUEMessageIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialUEMessageIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_uplinkNASTransport: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs.mme_ue_s1ap_id; + if (old_id == mme_ue_s1ap_id) { + packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs.mme_ue_s1ap_id = new_id; + // re-encode + S1ap_UplinkNASTransport_t msg; + S1ap_UplinkNASTransport_t *msg_p = &msg; + memset((void *)msg_p, 0, sizeof(msg)); + + if (s1ap_encode_s1ap_uplinknastransporties( + msg_p, &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs) < 0) { + AssertFatal(0, "Re-encoding uplinknastransporties failed"); + } + + ANY_fromType_aper(&packet->sctp_hdr.u.data_hdr.payload.pdu.choice.initiatingMessage.value, + &asn_DEF_S1ap_DownlinkNASTransport, + &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs); + + encoded = aper_encode_to_new_buffer(&asn_DEF_S1AP_PDU, 0, &packet->sctp_hdr.u.data_hdr.payload.pdu, + (void **)&packet->sctp_hdr.u.data_hdr.payload.binary_stream); + AssertFatal(encoded < 0, "Re-encoding PDU failed"); + } + break; + + case S1ap_ProcedureCode_id_Reset: + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ResetIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ResetIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_ErrorIndication: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ErrorIndicationIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_NASNonDeliveryIndication: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_NASNonDeliveryIndication_IEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_S1Setup: + /*if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupRequestIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_successfulOutcome) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupResponseIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupFailureIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupFailureIEs.mme_ue_s1ap_id; + }*/ + break; + + case S1ap_ProcedureCode_id_UEContextReleaseRequest: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseRequestIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_DownlinkS1cdma2000tunneling: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_UplinkS1cdma2000tunneling: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_UEContextModification: + if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationRequestIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_successfulOutcome) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationResponseIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationFailureIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_UECapabilityInfoIndication: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UECapabilityInfoIndicationIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_UEContextRelease: + if (present == S1AP_PDU_PR_initiatingMessage) { + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.mme_ue_s1ap_id; + } else { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCompleteIEs.mme_ue_s1ap_id; + } + break; + + case S1ap_ProcedureCode_id_eNBStatusTransfer: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBStatusTransferIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_MMEStatusTransfer: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEStatusTransferIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_DeactivateTrace: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DeactivateTraceIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_TraceStart: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceStartIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_TraceFailureIndication: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceFailureIndicationIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_ENBConfigurationUpdate: + /*if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_successfulOutcome) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; + } else { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateFailureIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateFailureIEs.mme_ue_s1ap_id; + }*/ + break; + + case S1ap_ProcedureCode_id_MMEConfigurationUpdate: + /*if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateIEs.mme_ue_s1ap_id; + } else if (present == S1AP_PDU_PR_successfulOutcome) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; + } else { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateFailureIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateFailureIEs.mme_ue_s1ap_id; + }*/ + break; + + case S1ap_ProcedureCode_id_LocationReportingControl: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingControlIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_LocationReportingFailureIndication: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingFailureIndicationIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_LocationReport: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_OverloadStart: + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStartIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStartIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_OverloadStop: + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStopIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStopIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_WriteReplaceWarning: + /*if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningRequestIEs.mme_ue_s1ap_id; + } else { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningResponseIEs.mme_ue_s1ap_id; + }*/ + break; + + case S1ap_ProcedureCode_id_eNBDirectInformationTransfer: + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBDirectInformationTransferIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBDirectInformationTransferIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_MMEDirectInformationTransfer: + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEDirectInformationTransferIEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEDirectInformationTransferIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_PrivateMessage: + case S1ap_ProcedureCode_id_eNBConfigurationTransfer: + case S1ap_ProcedureCode_id_MMEConfigurationTransfer: + AssertFatal(0, "TODO"); + break; + + case S1ap_ProcedureCode_id_CellTrafficTrace: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_CellTrafficTraceIEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_Kill: + /*if (present == S1AP_PDU_PR_initiatingMessage) { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillRequestIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillRequestIEs.mme_ue_s1ap_id; + } else { + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillResponseIEs.mme_ue_s1ap_id; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillResponseIEs.mme_ue_s1ap_id; + }*/ + break; + + case S1ap_ProcedureCode_id_downlinkUEAssociatedLPPaTransport: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_uplinkUEAssociatedLPPaTransport: + mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_downlinkNonUEAssociatedLPPaTransport: + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + break; + + case S1ap_ProcedureCode_id_uplinkNonUEAssociatedLPPaTransport: + //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; + break; + + default: + AssertFatal(0, "Unknown procedure code %ld", packet->sctp_hdr.u.data_hdr.payload.message.procedureCode); + } + return 0; +} diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf index e864f47edb..a2df43fec0 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf @@ -131,7 +131,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.188.2.2"; + mme_ip_address = ( { ipv4 = "192.170.0.1"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -140,12 +140,12 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "tun2"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.188.2.2/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0:3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.170.0.2/24"; - ENB_INTERFACE_NAME_FOR_S1U = "lo"; - ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.1/24"; - ENB_PORT_FOR_S1U = 2153; # Spec 2152 + ENB_INTERFACE_NAME_FOR_S1U = "eth0:4"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.170.1.2/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; log_config : From cc4286f27bdb827267b105a4f33bc5a63024606a Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 15 Dec 2015 16:56:55 +0100 Subject: [PATCH 020/122] sync --- openair3/TEST/EPC_TEST/play_scenario.h | 5 +- openair3/TEST/EPC_TEST/play_scenario_parse.c | 9 +- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 475 +++++------------- 3 files changed, 146 insertions(+), 343 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 758ee97981..4ac46e84b5 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -48,6 +48,9 @@ #include "hashtable.h" #include "asn_compare.h" +#define ET_XPATH_EXPRESSION_MAX_LENGTH 400 + + // powers of 2 #define ET_BIT_MASK_MATCH_SCTP_STREAM 1 #define ET_BIT_MASK_MATCH_SCTP_SSN 2 @@ -252,7 +255,7 @@ typedef struct et_s1ap_s { uint16_t binary_stream_allocated_size; uint8_t *binary_stream; s1ap_message message; // decoded message: information elements - xmlNodePtr xml_node; // XML representation of the S1AP PDU + xmlDocPtr doc; // XML representation of the S1AP PDU } et_s1ap_t; diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index 35ed5c8603..b9d24f366c 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -70,9 +70,12 @@ void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * co unsigned int go_deeper_in_tree = 1; if ((NULL != s1ap_node) && (NULL != s1ap)) { - // seee http://www.xmlsoft.org/html/libxml-tree.html#xmlCopyNode - s1ap->xml_node = xmlCopyNode(s1ap_node, 1); - AssertFatal(NULL != s1ap->xml_node, "xmlCopyNode Failed"); + // see http://www.xmlsoft.org/html/libxml-tree.html#xmlCopyNode + cur_node = xmlCopyNode(s1ap_node, 1); + AssertFatal(NULL != cur_node, "xmlCopyNode Failed"); + s1ap->doc = xmlNewDoc(BAD_CAST "1.0"); + xmlDocSetRootElement(s1ap->doc, cur_node); + for (cur_node = (xmlNode *)s1ap_node; cur_node; cur_node = cur_node->next) { go_deeper_in_tree = 1; if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"field"))) { diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 3533ee086e..87ffe29e32 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -40,6 +40,10 @@ #include #include #include +#include +#include +#include +#include #include "tree.h" #include "queue.h" @@ -452,353 +456,146 @@ asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_messag return ret; } + +static void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, xmlChar *new_id_hex, xmlChar *new_id_dec, xmlChar *showname) +{ + xmlNode *cur_node = NULL; + xmlAttrPtr attr = NULL; + xmlChar *xml_char = NULL; + int size = 0; + int pos = 0; + int go_deeper_in_tree = 1; + // modify + for (cur_node = (xmlNode *)node; cur_node; cur_node = cur_node->next) { + go_deeper_in_tree = 1; + if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"field"))) { + // do not get hidden fields + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"hide"); + if (NULL != xml_char) { + if ((!xmlStrcmp(xml_char, (const xmlChar *)"yes"))) { + go_deeper_in_tree = 0; + } + xmlFree(xml_char); + } + if (0 < go_deeper_in_tree) { + // first get size + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"pos"); + if (NULL != xml_char) { + pos = strtoul((const char *)xml_char, NULL, 0); + xmlFree(xml_char); + xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); + if (NULL != xml_char) { + size = strtoul((const char *)xml_char, NULL, 0); + xmlFree(xml_char); + // second: try to set value (always hex) + attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"value", new_id_hex); + attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"show", new_id_dec); + attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"showname", showname); + //TODO update s1ap->binary_stream @pos with new_id_hex, size + } + } + } + } + if (0 < go_deeper_in_tree) { + update_xpath_node_mme_ue_s1ap_id(s1ap, cur_node->children, new_id_hex, new_id_dec, showname); + } + } +} + +/** + * update_xpath_nodes: + * @nodes: the nodes set. + * @value: the new value for the node(s) + * + * Prints the @nodes content to @output. + * From http://www.xmlsoft.org/examples/#xpath2.c + */ +static void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSetPtr nodes, const S1ap_MME_UE_S1AP_ID_t new_id) +{ + int size = 0; + int i = 0; + int ret = 0; + const xmlChar value_d[32]; + const xmlChar value_h[20]; + const xmlChar showname[64]; + xmlNode *s1ap_node = NULL; + + size = (nodes) ? nodes->nodeNr : 0; + + ret = snprintf((char *)value_d, 32, "%ld", new_id); + AssertFatal((ret < 0) || (ret > 32), "Could not convert int to dec str"); + ret = snprintf((char *)value_h, 20, "C0%X", new_id); + AssertFatal((ret < 0) || (ret > 20), "Could not convert int to hex str"); + ret = snprintf((char *)showname, 64, "MME-UE-S1AP-ID: %d", new_id); + AssertFatal((ret < 0) || (ret > 64), "Could not convert int to dec str"); + /* + * NOTE: the nodes are processed in reverse order, i.e. reverse document + * order because xmlNodeSetContent can actually free up descendant + * of the node and such nodes may have been selected too ! Handling + * in reverse order ensure that descendant are accessed first, before + * they get removed. Mixing XPath and modifications on a tree must be + * done carefully ! + */ + for(i = size - 1; i >= 0; i--) { + s1ap_node = nodes->nodeTab[i]; + AssertFatal(NULL != s1ap_node, "One element of resultset of XPATH expression is NULL\n"); + update_xpath_node_mme_ue_s1ap_id(s1ap_payload, s1ap_node, value_d, value_h, showname); + /* + * All the elements returned by an XPath query are pointers to + * elements from the tree *except* namespace nodes where the XPath + * semantic is different from the implementation in libxml2 tree. + * As a result when a returned node set is freed when + * xmlXPathFreeObject() is called, that routine must check the + * element type. But node from the returned set may have been removed + * by xmlNodeSetContent() resulting in access to freed data. + * This can be exercised by running valgrind + * There is 2 ways around it: + * - make a copy of the pointers to the nodes from the result set + * then call xmlXPathFreeObject() and then modify the nodes + * or + * - remove the reference to the modified nodes from the node set + * as they are processed, if they are not namespace nodes. + */ + if (nodes->nodeTab[i]->type != XML_NAMESPACE_DECL) { + nodes->nodeTab[i] = NULL; + } + } +} //------------------------------------------------------------------------------ int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_S1AP_ID_t old_id, const S1ap_MME_UE_S1AP_ID_t new_id) { - S1ap_MME_UE_S1AP_ID_t mme_ue_s1ap_id = 0; - S1AP_PDU_PR present; - ssize_t encoded; - present = packet->sctp_hdr.u.data_hdr.payload.pdu.present; - S1AP_DEBUG("Updating mme_ue_s1ap_id of packet num %d...\n", packet->packet_number); + xmlNode *cur_node = NULL; + xmlChar xpath_expression[ET_XPATH_EXPRESSION_MAX_LENGTH]; + int ret = 0; + xmlDocPtr doc = NULL; + xmlXPathContextPtr xpath_ctx = NULL; + xmlXPathObjectPtr xpath_obj = NULL; - switch (packet->sctp_hdr.u.data_hdr.payload.message.procedureCode) { - case S1ap_ProcedureCode_id_HandoverPreparation: - if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs.mme_ue_s1ap_id; - if (old_id == mme_ue_s1ap_id) { - packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs.mme_ue_s1ap_id = new_id; - // re-encode - S1ap_HandoverRequired_t msg; - S1ap_HandoverRequired_t *msg_p = &msg; - memset((void *)msg_p, 0, sizeof(msg)); + ret = snprintf(xpath_expression, ET_XPATH_EXPRESSION_MAX_LENGTH, "//field[@name=\"s1ap.MME_UE_S1AP_ID\"][@show=\"%d\"]", old_id); + AssertFatal((ret < 0) || (ret > ET_XPATH_EXPRESSION_MAX_LENGTH), "Could not build XPATH expression"); - if (s1ap_encode_s1ap_handoverrequiredies( - msg_p, &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs) < 0) { - AssertFatal(0, "Re-encoding handoverrequiredies failed"); - } + doc = packet->sctp_hdr.u.data_hdr.payload.doc; - ANY_fromType_aper(&packet->sctp_hdr.u.data_hdr.payload.pdu.choice.initiatingMessage.value, - &asn_DEF_S1ap_HandoverRequired, - &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs); - - packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs; - encoded = aper_encode_to_new_buffer(&asn_DEF_S1AP_PDU, 0, &packet->sctp_hdr.u.data_hdr.payload.pdu, - (void **)&packet->sctp_hdr.u.data_hdr.payload.binary_stream); - AssertFatal(encoded < 0, "Re-encoding PDU failed"); - } - } else { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCommandIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_HandoverResourceAllocation: - if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_successfulOutcome) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestAcknowledgeIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverFailureIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_HandoverNotification: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverNotifyIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_PathSwitchRequest: - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PathSwitchRequestIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PathSwitchRequestIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_HandoverCancel: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCancelIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_E_RABSetup: - if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupRequestIEs.mme_ue_s1ap_id; - } else { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupResponseIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_E_RABModify: - if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyRequestIEs.mme_ue_s1ap_id; - } else { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyResponseIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_E_RABRelease: - if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseCommandIEs.mme_ue_s1ap_id; - } else { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseResponseIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_E_RABReleaseIndication: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseIndicationIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_InitialContextSetup: - if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupRequestIEs.mme_ue_s1ap_id; - } else { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupResponseIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_Paging: - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PagingIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PagingIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_downlinkNASTransport: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs.mme_ue_s1ap_id; - if (old_id == mme_ue_s1ap_id) { - packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs.mme_ue_s1ap_id = new_id; - // re-encode - S1ap_DownlinkNASTransport_t msg; - S1ap_DownlinkNASTransport_t *msg_p = &msg; - memset((void *)msg_p, 0, sizeof(msg)); - - if (s1ap_encode_s1ap_downlinknastransporties( - msg_p, &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs) < 0) { - AssertFatal(0, "Re-encoding downlinknastransporties failed"); - } - - ANY_fromType_aper(&packet->sctp_hdr.u.data_hdr.payload.pdu.choice.initiatingMessage.value, - &asn_DEF_S1ap_DownlinkNASTransport, - &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs); - - encoded = aper_encode_to_new_buffer(&asn_DEF_S1AP_PDU, 0, &packet->sctp_hdr.u.data_hdr.payload.pdu, - (void **)&packet->sctp_hdr.u.data_hdr.payload.binary_stream); - AssertFatal(encoded < 0, "Re-encoding PDU failed"); - } - break; - - case S1ap_ProcedureCode_id_initialUEMessage: - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialUEMessageIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialUEMessageIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_uplinkNASTransport: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs.mme_ue_s1ap_id; - if (old_id == mme_ue_s1ap_id) { - packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs.mme_ue_s1ap_id = new_id; - // re-encode - S1ap_UplinkNASTransport_t msg; - S1ap_UplinkNASTransport_t *msg_p = &msg; - memset((void *)msg_p, 0, sizeof(msg)); - - if (s1ap_encode_s1ap_uplinknastransporties( - msg_p, &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs) < 0) { - AssertFatal(0, "Re-encoding uplinknastransporties failed"); - } - - ANY_fromType_aper(&packet->sctp_hdr.u.data_hdr.payload.pdu.choice.initiatingMessage.value, - &asn_DEF_S1ap_DownlinkNASTransport, - &packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs); - - encoded = aper_encode_to_new_buffer(&asn_DEF_S1AP_PDU, 0, &packet->sctp_hdr.u.data_hdr.payload.pdu, - (void **)&packet->sctp_hdr.u.data_hdr.payload.binary_stream); - AssertFatal(encoded < 0, "Re-encoding PDU failed"); - } - break; - - case S1ap_ProcedureCode_id_Reset: - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ResetIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ResetIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_ErrorIndication: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ErrorIndicationIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_NASNonDeliveryIndication: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_NASNonDeliveryIndication_IEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_S1Setup: - /*if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupRequestIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_successfulOutcome) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupResponseIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupFailureIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupFailureIEs.mme_ue_s1ap_id; - }*/ - break; - - case S1ap_ProcedureCode_id_UEContextReleaseRequest: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseRequestIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_DownlinkS1cdma2000tunneling: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_UplinkS1cdma2000tunneling: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_UEContextModification: - if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationRequestIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_successfulOutcome) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationResponseIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationFailureIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_UECapabilityInfoIndication: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UECapabilityInfoIndicationIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_UEContextRelease: - if (present == S1AP_PDU_PR_initiatingMessage) { - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.mme_ue_s1ap_id; - } else { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCompleteIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_eNBStatusTransfer: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBStatusTransferIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_MMEStatusTransfer: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEStatusTransferIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_DeactivateTrace: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DeactivateTraceIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_TraceStart: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceStartIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_TraceFailureIndication: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceFailureIndicationIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_ENBConfigurationUpdate: - /*if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_successfulOutcome) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; - } else { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateFailureIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateFailureIEs.mme_ue_s1ap_id; - }*/ - break; - - case S1ap_ProcedureCode_id_MMEConfigurationUpdate: - /*if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_successfulOutcome) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; - } else { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateFailureIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateFailureIEs.mme_ue_s1ap_id; - }*/ - break; - - case S1ap_ProcedureCode_id_LocationReportingControl: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingControlIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_LocationReportingFailureIndication: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingFailureIndicationIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_LocationReport: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_OverloadStart: - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStartIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStartIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_OverloadStop: - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStopIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStopIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_WriteReplaceWarning: - /*if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningRequestIEs.mme_ue_s1ap_id; - } else { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningResponseIEs.mme_ue_s1ap_id; - }*/ - break; - - case S1ap_ProcedureCode_id_eNBDirectInformationTransfer: - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBDirectInformationTransferIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBDirectInformationTransferIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_MMEDirectInformationTransfer: - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEDirectInformationTransferIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEDirectInformationTransferIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_PrivateMessage: - case S1ap_ProcedureCode_id_eNBConfigurationTransfer: - case S1ap_ProcedureCode_id_MMEConfigurationTransfer: - AssertFatal(0, "TODO"); - break; - - case S1ap_ProcedureCode_id_CellTrafficTrace: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_CellTrafficTraceIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_Kill: - /*if (present == S1AP_PDU_PR_initiatingMessage) { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillRequestIEs.mme_ue_s1ap_id; - } else { - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillResponseIEs.mme_ue_s1ap_id; - }*/ - break; - - case S1ap_ProcedureCode_id_downlinkUEAssociatedLPPaTransport: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_uplinkUEAssociatedLPPaTransport: - mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_downlinkNonUEAssociatedLPPaTransport: - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_uplinkNonUEAssociatedLPPaTransport: - //mme_ue_s1ap_id = packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - break; - - default: - AssertFatal(0, "Unknown procedure code %ld", packet->sctp_hdr.u.data_hdr.payload.message.procedureCode); + // Create xpath evaluation context + xpath_ctx = xmlXPathNewContext(doc); + if(xpath_ctx == NULL) { + fprintf(stderr,"Error: unable to create new XPath context\n"); + xmlFreeDoc(doc); + return(-1); } + + // Evaluate xpath expression + xpath_obj = xmlXPathEvalExpression(xpath_expression, xpath_ctx); + AssertFatal(xpath_obj != NULL, "Unable to evaluate XPATH expression \"%s\"\n", xpath_expression); + + // update selected nodes + update_xpath_nodes_mme_ue_s1ap_id(&packet->sctp_hdr.u.data_hdr.payload, xpath_obj->nodesetval, new_id); + + // Cleanup of XPath data + xmlXPathFreeObject(xpath_obj); + xmlXPathFreeContext(xpath_ctx); + return 0; } From ed26845480fc401e9c994ae958f4e4f515df54ff Mon Sep 17 00:00:00 2001 From: gauthier Date: Thu, 17 Dec 2015 16:22:08 +0100 Subject: [PATCH 021/122] TODO transport layer address, play scenario max speed --- cmake_targets/tools/build_helper | 178 ------------------ openair3/TEST/EPC_TEST/generate_scenario.c | 4 +- openair3/TEST/EPC_TEST/play_scenario.c | 12 +- openair3/TEST/EPC_TEST/play_scenario.h | 4 + openair3/TEST/EPC_TEST/play_scenario_fsm.c | 19 +- openair3/TEST/EPC_TEST/play_scenario_parse.c | 16 +- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 33 ++-- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 54 ++++-- openair3/TEST/EPC_TEST/play_scenario_sctp.c | 19 +- 9 files changed, 112 insertions(+), 227 deletions(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 0a0118581e..534c4e0907 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -301,184 +301,6 @@ install_nas_tools() { fi } -################################################# -# 3. Network interfaces utilities -################################################ - -cidr2mask(){ - local i mask="" - local full_octets=$(($1/8)) - local partial_octet=$(($1%8)) - - for ((i=0;i<4;i+=1)); do - if [ $i -lt $full_octets ]; then - mask+=255 - elif [ $i -eq $full_octets ]; then - mask+=$((256 - 2**(8-$partial_octet))) - else - mask+=0 - fi - test $i -lt 3 && mask+=. - done - - echo $mask -} - -# example: netcalc 192.168.12.100 255.255.255.0 -netcalc(){ - local IFS='.' ip i - local -a oct msk - - read -ra oct <<<"$1" - read -ra msk <<<"$2" - - for i in ${!oct[@]}; do - ip+=( "$(( oct[i] & msk[i] ))" ) - done - - echo "${ip[*]}" -} - -# example: -bcastcalc(){ - local IFS='.' ip i - local -a oct msk - - read -ra oct <<<"$1" - read -ra msk <<<"$2" - - for i in ${!oct[@]}; do - ip+=( "$(( oct[i] + ( 255 - ( oct[i] | msk[i] ) ) ))" ) - done - echo "${ip[*]}" -} - - -is_real_interface(){ - my_bool=1 - for var in "$@" - do - if [ "a$var" == "a" ]; then - return 0 - fi - if [ "a$var" == "anone" ]; then - return 0 - fi - IF=`cat /etc/udev/rules.d/70-persistent-net.rules | grep $var | sed 's/^.*NAME=//' | tr -d '"'` - if [ "$IF" == "$var" ]; then - if [ "a${var:0:3}" != "aeth" ]; then - if [ "a${var:0:4}" != "awlan" ]; then - if [ "a${var:0:4}" != "awifi" ]; then - my_bool=0; - fi - fi - fi - fi - done - return $my_bool -} - -is_virtual_interface(){ - my_bool=1 - for var in "$@" - do - if [ "a$var" == "a" ]; then - return 0 - fi - if [ "a$var" == "anone" ]; then - return 0 - fi - num=`expr index "$var" :` - - if [ $num -eq 0 ]; then - my_bool=0; - fi - done - return $my_bool -} - -# arg1 = interface name -# arg2 = ipv4 addr cidr -set_interface_up(){ - interface=$1 - address=${2%/*} #part before '/' - cidr_netmask=${2#*/} # part after '/' - - if [ "a${interface:0:4}" == "anone" ]; then - return; - fi - echo "ifconfig $interface up" - $SUDO ifconfig $interface up - sync - netmask=`cidr2mask $cidr_netmask` - broadcast=`bcastcalc $address $netmask` - echo "ip -4 addr add $address/$cidr_netmask broadcast $broadcast dev $interface" - $SUDO ip -4 addr add $address/$cidr_netmask broadcast $broadcast dev $interface - sync -} - -# arg1 = interface name -# arg2 = ipv4 addr cidr -set_virtual_interface_up(){ - interface=$1 - address=${2%/*} #part before '/' - cidr_netmask=${2#*/} # part after '/' - - if [ "a${interface:0:4}" == "anone" ]; then - return; - fi - $SUDO ifconfig $interface down > /dev/null 2>&1 - sync - echo "ifconfig $interface $address up" - $SUDO ifconfig $interface $address up - sync -} - -#arg1 is interface name -#arg2 is IP address (CIDR) -set_network_interface(){ - local interface_name=$1 - local ip_cidr=$2 - - is_virtual_interface $interface_name - if [ $? -eq 1 ]; then - echo "$interface_name is virtual interface" - set_virtual_interface_up $interface_name $ip_cidr - else - is_real_interface $interface_name - if [ $? -eq 1 ]; then - echo "$interface_name is real interface" - set_interface_up $interface_name $ip_cidr - else - echo_warning "$interface_name not handled, not configuring it" - return - fi - fi -} - -# arg1 is a 'libconfig-like' config file -set_epc_network_interfaces(){ - value="`cat $1 | cut -d "#" -f1 | grep 'ADDRESS\|INTERFACE' | tr -d " " | grep "="`" - eval $value - - # check all var names are correct - list_var_name="\ - ENB_INTERFACE_NAME_FOR_S1_MME ENB_IPV4_ADDRESS_FOR_S1_MME \ - ENB_INTERFACE_NAME_FOR_S1U ENB_IPV4_ADDRESS_FOR_S1U " - for var_name in $list_var_name - do - if [ -n "$${var_name}" ]; then - echo_success "Found ${var_name} = ${!var_name}" - else - echo_fatal "${var_name} does does not exist in your config file $1" - fi - done - - # configure interfaces - set_network_interface $ENB_INTERFACE_NAME_FOR_S1_MME $ENB_IPV4_ADDRESS_FOR_S1_MME - set_network_interface $ENB_INTERFACE_NAME_FOR_S1U $ENB_IPV4_ADDRESS_FOR_S1U -} - ################################ diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index 238ba0ff11..69e707dcf9 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -142,7 +142,7 @@ int strip_extension(char *in_filename) if (NULL != in_filename) { /* Check chars starting at end of string to find last '.' */ - for (ssize_t i = strlen(in_filename); i > (name_min_len + max_ext_len); i--) { + for (ssize_t i = strlen(in_filename); i >= name_min_len; i--) { if (in_filename[i] == '.') { in_filename[i] = '\0'; return i; @@ -662,7 +662,7 @@ config_parse_opt_line ( fprintf(stderr, "Error: eNB config file name %s is not found in dir %s\n", enb_config_file_name, g_test_dir); } enb_config_init(enb_config_file_name); - enb_config_display(); + //enb_config_display(); if (NULL == pdml_in_file_name) { fprintf(stderr, "Error: please provide the PDML file name that should be in %s\n", g_test_dir); diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index a801d2cf23..21aca820c2 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -69,6 +69,7 @@ #define GS_IS_DIR 2 //------------------------------------------------------------------------------ Enb_properties_array_t g_enb_properties; +int g_max_speed = 0; //------------------------------------------------------------------------------ extern et_scenario_t *g_scenario; extern int xmlLoadExtDtdDefaultValue; @@ -118,7 +119,7 @@ int et_strip_extension(char *in_filename) if (NULL != in_filename) { /* Check chars starting at end of string to find last '.' */ - for (ssize_t i = strlen(in_filename); i > (name_min_len + max_ext_len); i--) { + for (ssize_t i = strlen(in_filename); i > name_min_len; i--) { if (in_filename[i] == '.') { in_filename[i] = '\0'; return i; @@ -833,6 +834,7 @@ et_config_parse_opt_line ( LONG_OPTION_START = 0x100, /* Start after regular single char options */ LONG_OPTION_ENB_CONF_FILE, LONG_OPTION_SCENARIO_FILE, + LONG_OPTION_MAX_SPEED, LONG_OPTION_TEST_DIR, LONG_OPTION_HELP, LONG_OPTION_VERSION @@ -841,6 +843,7 @@ et_config_parse_opt_line ( static struct option long_options[] = { {"enb-conf-file", required_argument, 0, LONG_OPTION_ENB_CONF_FILE}, {"scenario ", required_argument, 0, LONG_OPTION_SCENARIO_FILE}, + {"max-speed ", no_argument, 0, LONG_OPTION_MAX_SPEED}, {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, {"help", no_argument, 0, LONG_OPTION_HELP}, {"version", no_argument, 0, LONG_OPTION_VERSION}, @@ -850,7 +853,7 @@ et_config_parse_opt_line ( /* * Parsing command line */ - while ((option = getopt_long (argc, argv, "vhc:s:d:", long_options, NULL)) != -1) { + while ((option = getopt_long (argc, argv, "vhmc:s:d:", long_options, NULL)) != -1) { switch (option) { case LONG_OPTION_ENB_CONF_FILE: case 'c': @@ -882,6 +885,11 @@ et_config_parse_opt_line ( } break; + case LONG_OPTION_MAX_SPEED: + case 'm': + g_max_speed = 1; + break; + case LONG_OPTION_VERSION: case 'v': printf("Version %s\n", PACKAGE_VERSION); diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 4ac46e84b5..0391ac5c47 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -40,6 +40,7 @@ # include # include # include +# include # include #include "S1AP-PDU.h" @@ -460,6 +461,9 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); et_scenario_t* et_generate_scenario(const char * const et_scenario_filename ); //------------------------- asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints); +void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, const S1ap_MME_UE_S1AP_ID_t new_id); +void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSetPtr nodes, const S1ap_MME_UE_S1AP_ID_t new_id); +int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_S1AP_ID_t old_id, const S1ap_MME_UE_S1AP_ID_t new_id); //------------------------- asn_comp_rval_t * et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints); asn_comp_rval_t * et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints); diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index b76d2240f5..a8f7e7331f 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -46,6 +46,8 @@ #include "play_scenario_s1ap_eNB_defs.h" #include "timer.h" +//------------------------------------------------------------------------------ +extern int g_max_speed; //------------------------------------------------------------------------------ et_scenario_t *g_scenario = NULL; pthread_mutex_t g_fsm_lock = PTHREAD_MUTEX_INITIALIZER; @@ -86,13 +88,13 @@ int timeval_subtract (struct timeval * const result, struct timeval * const a, s //------------------------------------------------------------------------------ void et_scenario_wait_rx_packet(et_packet_t * const packet) { + packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING; + g_fsm_state = ET_FSM_STATE_WAITING_RX_EVENT; if (timer_setup (ET_FSM_STATE_WAITING_RX_EVENT_DELAY_SEC, 0, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, - NULL, &packet->timer_id) < 0) { + packet, &packet->timer_id) < 0) { AssertFatal(0, " Can not start waiting RX event timer\n"); } LOG_D(ENB_APP, "Waiting RX packet num %d\n", packet->packet_number); - g_fsm_state = ET_FSM_STATE_WAITING_RX_EVENT; - packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING; } //------------------------------------------------------------------------------ void et_scenario_schedule_tx_packet(et_packet_t * const packet) @@ -133,14 +135,19 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) we_are_too_early = timeval_subtract(&offset,&offset_last_rx_packet,&packet->time_relative_to_last_received_packet); LOG_D(ENB_APP, "we_are_too_early=%d, offset=%ld.%06d\n", we_are_too_early, offset.tv_sec, offset.tv_usec); } - if (we_are_too_early > 0) { + if ((0 < we_are_too_early) && (0 == g_max_speed)){ // set timer + if (offset.tv_sec < 0) offset.tv_sec = -offset.tv_sec; + if (offset.tv_usec < 0) { + offset.tv_usec = offset.tv_usec + 1000000; + offset.tv_sec -= 1; + } + LOG_D(ENB_APP, "Send packet num %u original frame number %u in %ld.%06d sec\n", packet->packet_number, packet->original_frame_number, offset.tv_sec, offset.tv_usec); packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_SENDING; - if (timer_setup (offset.tv_sec, offset.tv_usec, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, - NULL, &packet->timer_id) < 0) { + if (timer_setup (offset.tv_sec, offset.tv_usec, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT,packet, &packet->timer_id) < 0) { AssertFatal(0, " Can not start TX event timer\n"); } // Done g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index b9d24f366c..4004dd5074 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -359,7 +359,7 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { afloat = atof((const char*)xml_char); xmlFree(xml_char); packet->time_relative_to_first_packet.tv_sec = (int)afloat; - packet->time_relative_to_first_packet.tv_usec = (int)((afloat - packet->time_relative_to_first_packet.tv_sec)*1000000); + packet->time_relative_to_first_packet.tv_usec = (int)((afloat - packet->time_relative_to_first_packet.tv_sec)*1000000.0); if (first_packet > 0) { initial_time = packet->time_relative_to_first_packet; @@ -381,6 +381,13 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { &packet->time_relative_to_last_sent_packet); relative_last_sent_packet = packet->time_relative_to_first_packet; } + if (first_received_packet > 0) { + packet->time_relative_to_last_received_packet.tv_sec = 0; + packet->time_relative_to_last_received_packet.tv_usec = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, + &packet->time_relative_to_last_received_packet); + } } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (first_received_packet > 0) { relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec; @@ -393,6 +400,13 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { &packet->time_relative_to_last_received_packet); relative_last_received_packet = packet->time_relative_to_first_packet; } + if (first_sent_packet > 0) { + packet->time_relative_to_last_sent_packet.tv_sec = 0; + packet->time_relative_to_last_sent_packet.tv_usec = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, + &packet->time_relative_to_last_sent_packet); + } } } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.number"))) { diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index f5afebd786..6a39397f19 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -682,6 +682,11 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; return et_scenario_set_packet_received(packet); } + } else if (strcmp(comp_results->name, "S1ap-TransportLayerAddress") == 0) { + S1AP_WARN("Some work needed there for %s, TODO in generic_scenario.xsl, add epc conf file in the process\n",comp_results->name); + packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec; + packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; + return et_scenario_set_packet_received(packet); } else { AssertFatal(0,"Some work needed there"); } @@ -1109,18 +1114,22 @@ void *et_s1ap_eNB_task(void *arg) { et_packet_t * packet = (et_packet_t*)TIMER_HAS_EXPIRED (received_msg).arg; et_event_t event; - if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING) { - memset((void*)&event, 0, sizeof(event)); - event.code = ET_EVENT_RX_PACKET_TIME_OUT; - event.u.rx_packet_time_out = packet; - et_scenario_fsm_notify_event(event); - } else if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_SENDING) { - memset((void*)&event, 0, sizeof(event)); - event.code = ET_EVENT_TX_TIMED_PACKET; - event.u.tx_timed_packet = packet; - et_scenario_fsm_notify_event(event); - } else if ((packet->status != ET_PACKET_STATUS_SENT) && ((packet->status != ET_PACKET_STATUS_RECEIVED))) { - AssertFatal (0, "Bad status %d of packet timed out!\n", packet->status); + if (NULL != packet) { + if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING) { + memset((void*)&event, 0, sizeof(event)); + event.code = ET_EVENT_RX_PACKET_TIME_OUT; + event.u.rx_packet_time_out = packet; + et_scenario_fsm_notify_event(event); + } else if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_SENDING) { + memset((void*)&event, 0, sizeof(event)); + event.code = ET_EVENT_TX_TIMED_PACKET; + event.u.tx_timed_packet = packet; + et_scenario_fsm_notify_event(event); + } else if ((packet->status != ET_PACKET_STATUS_SENT) && ((packet->status != ET_PACKET_STATUS_RECEIVED))) { + AssertFatal (0, "Bad status %d of packet timed out!\n", packet->status); + } + } else { + LOG_W(S1AP, " Received TIMER_HAS_EXPIRED: timer_id %d, no packet attached to timer\n", TIMER_HAS_EXPIRED(received_msg).timer_id); } } if (TIMER_HAS_EXPIRED (received_msg).timer_id == g_scenario->enb_register_retry_timer_id) { diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 87ffe29e32..31d784b2bd 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -38,8 +38,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -457,7 +459,7 @@ asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_messag } -static void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, xmlChar *new_id_hex, xmlChar *new_id_dec, xmlChar *showname) +void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, const S1ap_MME_UE_S1AP_ID_t new_id) { xmlNode *cur_node = NULL; xmlAttrPtr attr = NULL; @@ -485,19 +487,47 @@ static void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *no xmlFree(xml_char); xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); if (NULL != xml_char) { + const xmlChar value_d[32]; + const xmlChar value_h[20]; + const xmlChar showname[64]; + int ret = 0; + int pos2 = 0; + char val = NULL; + char hex[3] = {0,0,0};; + size = strtoul((const char *)xml_char, NULL, 0); xmlFree(xml_char); // second: try to set value (always hex) - attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"value", new_id_hex); - attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"show", new_id_dec); + ret = snprintf((char *)value_d, 32, "%ld", new_id); + AssertFatal((ret < 0) || (ret > 32), "Could not convert int to dec str"); + ret = snprintf((char *)value_h, 20, "C0%08X", new_id); + AssertFatal((ret < 0) || (ret > 20), "Could not convert int to hex str"); + ret = snprintf((char *)showname, 64, "MME-UE-S1AP-ID: %d", new_id); + AssertFatal((ret < 0) || (ret > 64), "Could not convert int to dec str"); + + attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"value", value_h); + attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"show", value_d); attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"showname", showname); //TODO update s1ap->binary_stream @pos with new_id_hex, size + AssertFatal((pos+size) < s1ap->binary_stream_allocated_size, "Rewrite of mme_ue_s1ap_id out of bounds of binary_stream"); + //avoid endianess issues + do { + hex[0] = value_h[pos2++]; + hex[1] = value_h[pos2++]; + hex[2] = 0; + val = (unsigned char)strtoul(hex, NULL, 16); + AssertFatal(errno != 0, "Conversion of hexstring %s failed", hex); + s1ap->binary_stream[pos++] = val; + } while (pos2 < (2*5)); + // update ASN1 + et_decode_s1ap(s1ap); + S1AP_DEBUG("Updated ASN1 for %s\n", showname); } } } } if (0 < go_deeper_in_tree) { - update_xpath_node_mme_ue_s1ap_id(s1ap, cur_node->children, new_id_hex, new_id_dec, showname); + update_xpath_node_mme_ue_s1ap_id(s1ap, cur_node->children, new_id); } } } @@ -510,24 +540,14 @@ static void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *no * Prints the @nodes content to @output. * From http://www.xmlsoft.org/examples/#xpath2.c */ -static void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSetPtr nodes, const S1ap_MME_UE_S1AP_ID_t new_id) +void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSetPtr nodes, const S1ap_MME_UE_S1AP_ID_t new_id) { int size = 0; int i = 0; - int ret = 0; - const xmlChar value_d[32]; - const xmlChar value_h[20]; - const xmlChar showname[64]; xmlNode *s1ap_node = NULL; size = (nodes) ? nodes->nodeNr : 0; - ret = snprintf((char *)value_d, 32, "%ld", new_id); - AssertFatal((ret < 0) || (ret > 32), "Could not convert int to dec str"); - ret = snprintf((char *)value_h, 20, "C0%X", new_id); - AssertFatal((ret < 0) || (ret > 20), "Could not convert int to hex str"); - ret = snprintf((char *)showname, 64, "MME-UE-S1AP-ID: %d", new_id); - AssertFatal((ret < 0) || (ret > 64), "Could not convert int to dec str"); /* * NOTE: the nodes are processed in reverse order, i.e. reverse document * order because xmlNodeSetContent can actually free up descendant @@ -539,7 +559,7 @@ static void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xm for(i = size - 1; i >= 0; i--) { s1ap_node = nodes->nodeTab[i]; AssertFatal(NULL != s1ap_node, "One element of resultset of XPATH expression is NULL\n"); - update_xpath_node_mme_ue_s1ap_id(s1ap_payload, s1ap_node, value_d, value_h, showname); + update_xpath_node_mme_ue_s1ap_id(s1ap_payload, s1ap_node, new_id); /* * All the elements returned by an XPath query are pointers to * elements from the tree *except* namespace nodes where the XPath @@ -574,7 +594,7 @@ int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_ xmlXPathObjectPtr xpath_obj = NULL; ret = snprintf(xpath_expression, ET_XPATH_EXPRESSION_MAX_LENGTH, "//field[@name=\"s1ap.MME_UE_S1AP_ID\"][@show=\"%d\"]", old_id); - AssertFatal((ret < 0) || (ret > ET_XPATH_EXPRESSION_MAX_LENGTH), "Could not build XPATH expression"); + AssertFatal((ret > 0) && (ret < ET_XPATH_EXPRESSION_MAX_LENGTH), "Could not build XPATH expression err=%d", ret); doc = packet->sctp_hdr.u.data_hdr.payload.doc; diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index 181009c2c9..5d5489089b 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -69,15 +69,16 @@ asn_comp_rval_t * et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_da S1AP_WARN("No Matching SCTP stream %u %u\n", sctp1->stream, sctp2->stream); } } - if (sctp1->ssn != sctp2->ssn) { - if (constraints & ET_BIT_MASK_MATCH_SCTP_SSN) { - rv = calloc(1, sizeof(asn_comp_rval_t)); - rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_SSN; - return rv; - } else { - S1AP_WARN("No Matching SCTP STREAM SN %u %u\n", sctp1->ssn, sctp2->ssn); - } - } + // We do not have SSN from lower layers +// if (sctp1->ssn != sctp2->ssn) { +// if (constraints & ET_BIT_MASK_MATCH_SCTP_SSN) { +// rv = calloc(1, sizeof(asn_comp_rval_t)); +// rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_SSN; +// return rv; +// } else { +// S1AP_WARN("No Matching SCTP STREAM SN %u %u\n", sctp1->ssn, sctp2->ssn); +// } +// } return et_s1ap_is_matching(&sctp1->payload, &sctp2->payload, constraints); } From e5bcff484cc550d9a2824807138780203eb6bc63 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 18 Dec 2015 14:52:45 +0100 Subject: [PATCH 022/122] first version of phy only test --- openair1/PHY/defs.h | 2 + openair1/SCHED/phy_mac_stub.c | 732 ++++++++++++++++++++ openair1/SCHED/phy_procedures_lte_eNb.c | 886 +++--------------------- 3 files changed, 826 insertions(+), 794 deletions(-) create mode 100644 openair1/SCHED/phy_mac_stub.c diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 398861cabf..9050ec47e5 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -271,6 +271,8 @@ typedef struct PHY_VARS_eNB_s { int **dl_precoder_SeNB[3]; char log2_maxp; /// holds the maximum channel/precoder coefficient + int mac_enabled; + /// For emulation only (used by UE abstraction to retrieve DCI) uint8_t num_common_dci[2]; // num_dci in even/odd subframes uint8_t num_ue_spec_dci[2]; // num_dci in even/odd subframes diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c new file mode 100644 index 0000000000..136672a8ef --- /dev/null +++ b/openair1/SCHED/phy_mac_stub.c @@ -0,0 +1,732 @@ +/******************************************************************************* + 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 . + + 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 + + *******************************************************************************/ + +/*! \file phy_mac_stub.c + * \brief stimulates the phy without mac + * \author R. Knopp, F. Kaltenberger, N. Nikaein + * \date 2011 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr + * \note + * \warning + */ + +#include "PHY/defs.h" +#include "PHY/extern.h" +#include "MAC_INTERFACE/defs.h" +#include "MAC_INTERFACE/extern.h" +#include "SCHED/defs.h" +#include "SCHED/extern.h" +#include "LAYER2/MAC/extern.h" + +#ifdef EMOS +#include "SCHED/phy_procedures_emos.h" +#endif + +void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB) +{ + + int i; + uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag; + uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0]; + + uint32_t rballoc = 0x7FFF; + uint32_t rballoc2 = 0x000F; + int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; + + LTE_eNB_DLSCH_t *DLSCH_ptr = phy_vars_eNB->dlsch_eNB[0][0]; + + /* + uint32_t rand = taus(); + if ((subframe==8) || (subframe==9) || (subframe==0)) + rand = (rand%5)+5; + else + rand = (rand%4)+5; + */ + uint32_t bcch_pdu; + uint64_t dlsch_pdu; + + DCI_pdu->Num_common_dci = 0; + DCI_pdu->Num_ue_spec_dci=0; + + switch (subframe) { + case 5: + DCI_pdu->Num_common_dci = 1; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = SI_RNTI; + DCI_pdu->dci_alloc[0].format = format1A; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type = 1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv = 1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t)); + } else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t)); + } + + break; + + case 25: + default: + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type = 1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv = 1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); + } else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); + } + + break; + + case 50: + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_FDD_t; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t)); + } else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t)); + } + + break; + + case 100: + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_FDD_t; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t)); + } else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t)); + } + + break; + } + + case 6: + /* + DCI_pdu->Num_ue_spec_dci = 1; + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0x1236; + DCI_pdu->dci_alloc[0].format = format2_2A_M10PRB; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + DLSCH_alloc_pdu1.rballoc = 0x00ff; + DLSCH_alloc_pdu1.TPC = 0; + DLSCH_alloc_pdu1.dai = 0; + DLSCH_alloc_pdu1.harq_pid = 0; + DLSCH_alloc_pdu1.tb_swap = 0; + DLSCH_alloc_pdu1.mcs1 = 0; + DLSCH_alloc_pdu1.ndi1 = 1; + DLSCH_alloc_pdu1.rv1 = 0; + DLSCH_alloc_pdu1.tpmi = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1,sizeof(DCI2_5MHz_2A_M10PRB_TDD_t)); + */ + break; + + case 7: + DCI_pdu->Num_ue_spec_dci = 1; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format1; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + if (transmission_mode<3) { + //user 1 + switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + case 25: + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; + + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); + + /* + //user2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); + */ + } else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; + + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); + + /* + //user2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); + */ + } + + break; + + case 50: + + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_FDD_t; + + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); + + /* + //user2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_TDD_t; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; + //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); + */ + } else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_TDD_t; + + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); + + /* + //user2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_TDD_t; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; + //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); + */ + } + + break; + + case 100: + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; + + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); + + /* + //user2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); + */ + } else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_20MHz_TDD_t; + + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t)); + + /* + //user2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_20MHz_TDD_t; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->dai = 0; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; + //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = 1; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_20MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); + */ + } + + break; + } + + } else if (transmission_mode==5) { + DCI_pdu->Num_ue_spec_dci = 2; + // user 1 + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[0].L = 3; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback + DLSCH_alloc_pdu1E.rv = 0; + DLSCH_alloc_pdu1E.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]]; + //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); + DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; + //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); + phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; + DLSCH_alloc_pdu1E.harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + DLSCH_alloc_pdu1E.dai = 0; + DLSCH_alloc_pdu1E.TPC = 0; + DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu1E.rah = 0; + DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + + //user 2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[1].L = 0; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; + DCI_pdu->dci_alloc[1].ra_flag = 0; + //DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; + //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); + //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + DLSCH_alloc_pdu1E.mcs = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28); + phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; + + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + + // set the precoder of the second UE orthogonal to the first + phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); + } + + break; + + /* + case 8: + DCI_pdu->Num_common_dci = 1; + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0xbeef; + DCI_pdu->dci_alloc[0].format = format1A; + DCI_pdu->dci_alloc[0].ra_flag = 1; + + RA_alloc_pdu.type = 1; + RA_alloc_pdu.vrb_type = 0; + RA_alloc_pdu.rballoc = computeRIV(25,12,3); + RA_alloc_pdu.ndi = 1; + RA_alloc_pdu.rv = 1; + RA_alloc_pdu.mcs = 4; + RA_alloc_pdu.harq_pid = 0; + RA_alloc_pdu.TPC = 1; + + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); + break; + */ + case 9: + DCI_pdu->Num_ue_spec_dci = 1; + + //user 1 + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_FDD_t ; + else + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; + + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format0; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + UL_alloc_pdu.type = 0; + UL_alloc_pdu.hopping = 0; + UL_alloc_pdu.rballoc = computeRIV(25,2,openair_daq_vars.ue_ul_nb_rb); + UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + UL_alloc_pdu.TPC = 0; + UL_alloc_pdu.cshift = 0; + UL_alloc_pdu.dai = 0; + UL_alloc_pdu.cqi_req = 1; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); + + // user 2 + /* + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format0; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + UL_alloc_pdu.type = 0; + UL_alloc_pdu.hopping = 0; + if (cooperation_flag==0) + UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb); + else + UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); + UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + UL_alloc_pdu.TPC = 0; + if ((cooperation_flag==0) || (cooperation_flag==1)) + UL_alloc_pdu.cshift = 0; + else + UL_alloc_pdu.cshift = 1; + UL_alloc_pdu.dai = 0; + UL_alloc_pdu.cqi_req = 1; + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); + */ + break; + + default: + break; + } + + DCI_pdu->nCCE = 0; + + for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) { + DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L)); + } + +} + +void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB) +{ + + int i; + uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag; + uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0]; + + //uint32_t rballoc = 0x00F0; + //uint32_t rballoc2 = 0x000F; + /* + uint32_t rand = taus(); + if ((subframe==8) || (subframe==9) || (subframe==0)) + rand = (rand%5)+5; + else + rand = (rand%4)+5; + */ + + DCI_pdu->Num_common_dci = 0; + DCI_pdu->Num_ue_spec_dci=0; + + switch (subframe) { + case 5: + DCI_pdu->Num_ue_spec_dci = 1; + + if (transmission_mode<3) { + //user 1 + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format1; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + DLSCH_alloc_pdu.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu.TPC = 0; + DLSCH_alloc_pdu.dai = 0; + DLSCH_alloc_pdu.harq_pid = 1; + DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; + DLSCH_alloc_pdu.ndi = 1; + DLSCH_alloc_pdu.rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); + + /* + //user2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + DLSCH_alloc_pdu.rballoc = rballoc2; + DLSCH_alloc_pdu.TPC = 0; + DLSCH_alloc_pdu.dai = 0; + DLSCH_alloc_pdu.harq_pid = 1; + DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; + DLSCH_alloc_pdu.ndi = 1; + DLSCH_alloc_pdu.rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); + */ + } else if (transmission_mode==5) { + DCI_pdu->Num_ue_spec_dci = 2; + // user 1 + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback + DLSCH_alloc_pdu1E.rv = 0; + DLSCH_alloc_pdu1E.ndi = 1; + DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; + DLSCH_alloc_pdu1E.harq_pid = 1; + DLSCH_alloc_pdu1E.dai = 0; + DLSCH_alloc_pdu1E.TPC = 0; + DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu1E.rah = 0; + DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + + //user 2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + + // set the precoder of the second UE orthogonal to the first + phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); + } + + break; + + case 7: + DCI_pdu->Num_common_dci = 1; + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0xbeef; + DCI_pdu->dci_alloc[0].format = format1A; + DCI_pdu->dci_alloc[0].ra_flag = 1; + + RA_alloc_pdu.type = 1; + RA_alloc_pdu.vrb_type = 0; + RA_alloc_pdu.rballoc = computeRIV(25,12,3); + RA_alloc_pdu.ndi = 1; + RA_alloc_pdu.rv = 1; + RA_alloc_pdu.mcs = 4; + RA_alloc_pdu.harq_pid = 0; + RA_alloc_pdu.TPC = 1; + + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); + break; + + case 9: + DCI_pdu->Num_ue_spec_dci = 1; + + //user 1 + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format0; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + UL_alloc_pdu.type = 0; + UL_alloc_pdu.hopping = 0; + UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); + UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.ndi = 1; + UL_alloc_pdu.TPC = 0; + UL_alloc_pdu.cshift = 0; + UL_alloc_pdu.dai = 0; + UL_alloc_pdu.cqi_req = 1; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); + + /* + //user 2 + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format0; + DCI_pdu->dci_alloc[1].ra_flag = 0; + + UL_alloc_pdu.type = 0; + UL_alloc_pdu.hopping = 0; + if (cooperation_flag==0) + UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb); + else + UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); + UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.ndi = 1; + UL_alloc_pdu.TPC = 0; + if ((cooperation_flag==0) || (cooperation_flag==1)) + UL_alloc_pdu.cshift = 0; + else + UL_alloc_pdu.cshift = 1; + UL_alloc_pdu.dai = 0; + UL_alloc_pdu.cqi_req = 1; + memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); + */ + break; + + default: + break; + } + + DCI_pdu->nCCE = 0; + + for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) { + DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L)); + } + +} diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index d073657519..d9e9a1b186 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -52,12 +52,10 @@ //#define DEBUG_PHY_PROC (Already defined in cmake) //#define DEBUG_ULSCH -//#ifdef OPENAIR2 #include "LAYER2/MAC/extern.h" #include "LAYER2/MAC/defs.h" #include "UTIL/LOG/log.h" #include "UTIL/LOG/vcd_signal_dumper.h" -//#endif #include "assertions.h" #include "msc.h" @@ -575,689 +573,6 @@ void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eN } #endif -#ifndef OPENAIR2 -void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB) -{ - - int i; - uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag; - uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0]; - - uint32_t rballoc = 0x7FFF; - uint32_t rballoc2 = 0x000F; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; - /* - uint32_t rand = taus(); - if ((subframe==8) || (subframe==9) || (subframe==0)) - rand = (rand%5)+5; - else - rand = (rand%4)+5; - */ - uint32_t bcch_pdu; - uint64_t dlsch_pdu; - - DCI_pdu->Num_common_dci = 0; - DCI_pdu->Num_ue_spec_dci=0; - - - - switch (subframe) { - case 5: - DCI_pdu->Num_common_dci = 1; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = SI_RNTI; - DCI_pdu->dci_alloc[0].format = format1A; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_FDD_t; - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type = 1; - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv = 1; - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t)); - } else { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t)); - } - - break; - - case 25: - default: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t; - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type = 1; - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv = 1; - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); - } else { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); - } - - break; - - case 50: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_FDD_t; - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1; - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1; - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1; - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t)); - } else { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t)); - } - - break; - - case 100: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_FDD_t; - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1; - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1; - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1; - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t)); - } else { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t)); - } - - break; - } - - case 6: - /* - DCI_pdu->Num_ue_spec_dci = 1; - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1236; - DCI_pdu->dci_alloc[0].format = format2_2A_M10PRB; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - DLSCH_alloc_pdu1.rballoc = 0x00ff; - DLSCH_alloc_pdu1.TPC = 0; - DLSCH_alloc_pdu1.dai = 0; - DLSCH_alloc_pdu1.harq_pid = 0; - DLSCH_alloc_pdu1.tb_swap = 0; - DLSCH_alloc_pdu1.mcs1 = 0; - DLSCH_alloc_pdu1.ndi1 = 1; - DLSCH_alloc_pdu1.rv1 = 0; - DLSCH_alloc_pdu1.tpmi = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1,sizeof(DCI2_5MHz_2A_M10PRB_TDD_t)); - */ - break; - - case 7: - DCI_pdu->Num_ue_spec_dci = 1; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - if (transmission_mode<3) { - //user 1 - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { - case 25: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; - - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); - - /* - //user2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); - */ - } else { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; - - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = 0; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); - - /* - //user2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); - */ - } - - break; - - case 50: - - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_FDD_t; - - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); - - /* - //user2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); - */ - } else { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_TDD_t; - - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = 0; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); - - /* - //user2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); - */ - } - - break; - - case 100: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; - - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); - - /* - //user2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); - */ - } else { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_20MHz_TDD_t; - - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = 0; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t)); - - /* - //user2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_20MHz_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = 1; - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_20MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); - */ - } - - break; - } - - } else if (transmission_mode==5) { - DCI_pdu->Num_ue_spec_dci = 2; - // user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[0].L = 3; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback - DLSCH_alloc_pdu1E.rv = 0; - DLSCH_alloc_pdu1E.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]]; - //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); - DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; - //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; - DLSCH_alloc_pdu1E.harq_pid = 0; - DLSCH_alloc_pdu1E.dai = 0; - DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; - DLSCH_alloc_pdu1E.rah = 0; - DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - - //user 2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[1].L = 0; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[1].ra_flag = 0; - //DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; - //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); - //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - DLSCH_alloc_pdu1E.mcs = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28); - phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; - - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - - // set the precoder of the second UE orthogonal to the first - phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); - } - - break; - - /* - case 8: - DCI_pdu->Num_common_dci = 1; - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0xbeef; - DCI_pdu->dci_alloc[0].format = format1A; - DCI_pdu->dci_alloc[0].ra_flag = 1; - - RA_alloc_pdu.type = 1; - RA_alloc_pdu.vrb_type = 0; - RA_alloc_pdu.rballoc = computeRIV(25,12,3); - RA_alloc_pdu.ndi = 1; - RA_alloc_pdu.rv = 1; - RA_alloc_pdu.mcs = 4; - RA_alloc_pdu.harq_pid = 0; - RA_alloc_pdu.TPC = 1; - - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); - break; - */ - case 9: - DCI_pdu->Num_ue_spec_dci = 1; - - //user 1 - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_FDD_t ; - else - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; - - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format0; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - UL_alloc_pdu.type = 0; - UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = computeRIV(25,2,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; - UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - UL_alloc_pdu.TPC = 0; - UL_alloc_pdu.cshift = 0; - UL_alloc_pdu.dai = 0; - UL_alloc_pdu.cqi_req = 1; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - - // user 2 - /* - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format0; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - UL_alloc_pdu.type = 0; - UL_alloc_pdu.hopping = 0; - if (cooperation_flag==0) - UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb); - else - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; - UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - UL_alloc_pdu.TPC = 0; - if ((cooperation_flag==0) || (cooperation_flag==1)) - UL_alloc_pdu.cshift = 0; - else - UL_alloc_pdu.cshift = 1; - UL_alloc_pdu.dai = 0; - UL_alloc_pdu.cqi_req = 1; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - */ - break; - - default: - break; - } - - DCI_pdu->nCCE = 0; - - for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) { - DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L)); - } - -} - -#ifdef EMOS -void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB) -{ - - int i; - uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag; - uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0]; - - //uint32_t rballoc = 0x00F0; - //uint32_t rballoc2 = 0x000F; - /* - uint32_t rand = taus(); - if ((subframe==8) || (subframe==9) || (subframe==0)) - rand = (rand%5)+5; - else - rand = (rand%4)+5; - */ - - DCI_pdu->Num_common_dci = 0; - DCI_pdu->Num_ue_spec_dci=0; - - switch (subframe) { - case 5: - DCI_pdu->Num_ue_spec_dci = 1; - - if (transmission_mode<3) { - //user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - DLSCH_alloc_pdu.rballoc = openair_daq_vars.ue_dl_rb_alloc; - DLSCH_alloc_pdu.TPC = 0; - DLSCH_alloc_pdu.dai = 0; - DLSCH_alloc_pdu.harq_pid = 1; - DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; - DLSCH_alloc_pdu.ndi = 1; - DLSCH_alloc_pdu.rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); - - /* - //user2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - DLSCH_alloc_pdu.rballoc = rballoc2; - DLSCH_alloc_pdu.TPC = 0; - DLSCH_alloc_pdu.dai = 0; - DLSCH_alloc_pdu.harq_pid = 1; - DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; - DLSCH_alloc_pdu.ndi = 1; - DLSCH_alloc_pdu.rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); - */ - } else if (transmission_mode==5) { - DCI_pdu->Num_ue_spec_dci = 2; - // user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback - DLSCH_alloc_pdu1E.rv = 0; - DLSCH_alloc_pdu1E.ndi = 1; - DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; - DLSCH_alloc_pdu1E.harq_pid = 1; - DLSCH_alloc_pdu1E.dai = 0; - DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; - DLSCH_alloc_pdu1E.rah = 0; - DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - - //user 2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - - // set the precoder of the second UE orthogonal to the first - phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); - } - - break; - - case 7: - DCI_pdu->Num_common_dci = 1; - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0xbeef; - DCI_pdu->dci_alloc[0].format = format1A; - DCI_pdu->dci_alloc[0].ra_flag = 1; - - RA_alloc_pdu.type = 1; - RA_alloc_pdu.vrb_type = 0; - RA_alloc_pdu.rballoc = computeRIV(25,12,3); - RA_alloc_pdu.ndi = 1; - RA_alloc_pdu.rv = 1; - RA_alloc_pdu.mcs = 4; - RA_alloc_pdu.harq_pid = 0; - RA_alloc_pdu.TPC = 1; - - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); - break; - - case 9: - DCI_pdu->Num_ue_spec_dci = 1; - - //user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format0; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - UL_alloc_pdu.type = 0; - UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; - UL_alloc_pdu.ndi = 1; - UL_alloc_pdu.TPC = 0; - UL_alloc_pdu.cshift = 0; - UL_alloc_pdu.dai = 0; - UL_alloc_pdu.cqi_req = 1; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - - /* - //user 2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format0; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - UL_alloc_pdu.type = 0; - UL_alloc_pdu.hopping = 0; - if (cooperation_flag==0) - UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb); - else - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; - UL_alloc_pdu.ndi = 1; - UL_alloc_pdu.TPC = 0; - if ((cooperation_flag==0) || (cooperation_flag==1)) - UL_alloc_pdu.cshift = 0; - else - UL_alloc_pdu.cshift = 1; - UL_alloc_pdu.dai = 0; - UL_alloc_pdu.cqi_req = 1; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - */ - break; - - default: - break; - } - - DCI_pdu->nCCE = 0; - - for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) { - DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L)); - } - -} -#endif //EMOS -#endif //OPENAIR2 #define AMP_OVER_SQRT2 ((AMP*ONE_OVER_SQRT2_Q15)>>15) #define AMP_OVER_2 (AMP>>1) @@ -1404,10 +719,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e uint8_t harq_pid; DCI_PDU *DCI_pdu; uint8_t *DLSCH_pdu=NULL; -#ifndef OPENAIR2 DCI_PDU DCI_pdu_tmp; uint8_t DLSCH_pdu_tmp[768*8]; -#endif int8_t UE_id; uint8_t num_pdcch_symbols=0; uint8_t ul_subframe; @@ -1449,13 +762,12 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } -#ifdef OPENAIR2 - // Get scheduling info for next subframe - if (phy_vars_eNB->CC_id == 0) - mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1); - -#endif + if (phy_vars_eNB->mac_enabled==1) { + if (phy_vars_eNB->CC_id == 0) { + mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1); + } + } if (abstraction_flag==0) { // clear the transmit data array for the current subframe @@ -1783,36 +1095,22 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e #endif -#ifdef OPENAIR2 - - // Parse DCI received from MAC - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1); - DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe); -#else - DCI_pdu = &DCI_pdu_tmp; -#ifdef EMOS - /* - if (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)%3 == 0) && (next_slot == 0)) { - //openair_daq_vars.target_ue_dl_mcs = (openair_daq_vars.target_ue_dl_mcs+1)%28; - openair_daq_vars.target_ue_dl_mcs = taus()%28; - LOG_D(PHY,"[MYEMOS] frame %d, increasing MCS to %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,openair_daq_vars.target_ue_dl_mcs); - } - */ - /* - if (phy_vars_eNB->proc[sched_subframe].frame_tx > 28000) { - LOG_E(PHY,"More that 28000 frames reached! Exiting!\n"); - } - */ -#endif + if (phy_vars_eNB->mac_enabled==1) { + // Parse DCI received from MAC + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1); + DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + phy_vars_eNB->proc[sched_subframe].frame_tx, + subframe); + } + else { + DCI_pdu = &DCI_pdu_tmp; #ifdef EMOS_CHANNEL - fill_dci_emos(DCI_pdu,sched_subframe,phy_vars_eNB); + fill_dci_emos(DCI_pdu,sched_subframe,phy_vars_eNB); #else - fill_dci(DCI_pdu,sched_subframe,phy_vars_eNB); -#endif + fill_dci(DCI_pdu,sched_subframe,phy_vars_eNB); #endif + } // clear existing ulsch dci allocations before applying info from MAC (this is table ul_subframe = pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe); @@ -1875,6 +1173,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %"PRIu8"] SI generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id); #endif + generate_eNB_dlsch_params_from_dci(frame, subframe, &DCI_pdu->dci_alloc[i].dci_pdu[0], @@ -1916,6 +1215,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %"PRIu8"] RA generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id); #endif + generate_eNB_dlsch_params_from_dci(frame, subframe, &DCI_pdu->dci_alloc[i].dci_pdu[0], @@ -1958,14 +1258,14 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e else if (DCI_pdu->dci_alloc[i].format != format0) { // this is a normal DLSCH allocation -#ifdef OPENAIR2 #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB] Searching for RNTI %"PRIx16"\n",DCI_pdu->dci_alloc[i].rnti); #endif - UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); -#else - UE_id = i; -#endif + + if (phy_vars_eNB->mac_enabled==1) + UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); + else + UE_id = i; if (UE_id>=0) { // dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); @@ -1978,6 +1278,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } #endif + generate_eNB_dlsch_params_from_dci(frame, subframe, &DCI_pdu->dci_alloc[i].dci_pdu[0], @@ -2049,11 +1350,10 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e return; // not reached } -#ifdef OPENAIR2 - UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); -#else - UE_id = i; -#endif + if (phy_vars_eNB->mac_enabled==1) + UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); + else + UE_id = i; if (UE_id<0) { LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti); @@ -2082,6 +1382,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e //dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); //LOG_D(PHY,"[eNB] cba generate_eNB_ulsch_params_from_dci for ue %d for dci rnti %x\n", UE_id, DCI_pdu->dci_alloc[i].rnti); + generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0], DCI_pdu->dci_alloc[i].rnti, sched_subframe, @@ -2191,19 +1492,19 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8; -#ifdef OPENAIR2 - DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - SI_RNTI, - 0); -#else - DLSCH_pdu = DLSCH_pdu_tmp; + if (phy_vars_eNB->mac_enabled==1) { + DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + phy_vars_eNB->proc[sched_subframe].frame_tx, + SI_RNTI, + 0); + } + else { + DLSCH_pdu = DLSCH_pdu_tmp; - for (i=0; idlsch_eNB_ra->harq_processes[0]->TBS/8; -#ifdef OPENAIR2 int16_t crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id, phy_vars_eNB->CC_id, phy_vars_eNB->proc[sched_subframe].frame_tx, @@ -2342,15 +1642,14 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); -#else - - for (i=0; ieNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4 - dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4 - //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset); -#endif + /* + for (i=0; ieNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4 + dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4 + //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset); + */ #if defined(SMBV) && !defined(EXMIMO) @@ -2419,10 +1718,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, re_allocated); #endif -#ifdef OPENAIR2 } //max user count -#endif phy_vars_eNB->dlsch_eNB_ra->active = 0; } @@ -2479,21 +1776,21 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][0]++; -#ifdef OPENAIR2 - DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti, - 0); - phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS; -#else - DLSCH_pdu = DLSCH_pdu_tmp; - - for (i=0; imac_enabled==1) { + DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + phy_vars_eNB->proc[sched_subframe].frame_tx, + phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti, + 0); + phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS; + } + else { + DLSCH_pdu = DLSCH_pdu_tmp; + + for (i=0; imac_enabled==1) { uint8_t update_TA=4; switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { @@ -3205,16 +2503,14 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t break; } - - mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id, phy_vars_eNB->CC_id, frame, preamble_max, preamble_delay_list[preamble_max]*update_TA, 0,subframe,0); - -#endif + } + } else { MSC_LOG_EVENT(MSC_PHY_ENB, "0 RA Failed add user, too many"); LOG_I(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n", @@ -3395,11 +2691,13 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ if ((i == 1) && (phy_vars_eNB->cooperation_flag > 0) && (two_ues_connected == 1)) break; */ -#ifdef OPENAIR2 - if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) - process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid); -#endif + if (phy_vars_eNB->mac_enabled==1) { + if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) { + process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid); + } + } + /* #ifdef DEBUG_PHY_PROC @@ -3630,12 +2928,12 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ LOG_I(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n", phy_vars_eNB->Mod_id, i); phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; -#ifdef OPENAIR2 - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); -#endif + if (phy_vars_eNB->mac_enabled==1) { + mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame, + phy_vars_eNB->eNB_UE_stats[i].crnti); + } remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag); phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; @@ -3755,7 +3053,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0; if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { -#ifdef OPENAIR2 + if (phy_vars_eNB->mac_enabled==1) { #ifdef DEBUG_PHY_PROC LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", phy_vars_eNB->Mod_id, @@ -3788,7 +3086,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); */ -#endif + } phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH; phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0; @@ -3837,7 +3135,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ //dump_ulsch(phy_vars_eNB,sched_subframe,i); -#ifdef OPENAIR2 + if (phy_vars_eNB->mac_enabled==1) { // if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) { mac_xface->rx_sdu(phy_vars_eNB->Mod_id, phy_vars_eNB->CC_id, @@ -3864,7 +3162,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ stop_meas(&phy_vars_eNB->localization_stats); #endif -#endif + } } // estimate timing advance for MAC @@ -3987,12 +3285,12 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe); } -#ifdef OPENAIR2 - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe); -#endif + if (phy_vars_eNB->mac_enabled==1) { + mac_xface->SR_indication(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame, + phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe); + } } }// do_SR==1 From 6f889b30e4616499dc4b7caa7bde2dd02da9577a Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 18 Dec 2015 17:26:48 +0100 Subject: [PATCH 023/122] minor changes to be able to load full frame --- openair1/SCHED/phy_mac_stub.c | 16 +++++++++------- openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 136672a8ef..cb66f49013 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -195,8 +195,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e break; } - case 6: /* + case 6: DCI_pdu->Num_ue_spec_dci = 1; DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_M10PRB_TDD_t; DCI_pdu->dci_alloc[0].L = 2; @@ -214,9 +214,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DLSCH_alloc_pdu1.rv1 = 0; DLSCH_alloc_pdu1.tpmi = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1,sizeof(DCI2_5MHz_2A_M10PRB_TDD_t)); - */ break; + */ + default: case 7: DCI_pdu->Num_ue_spec_dci = 1; DCI_pdu->dci_alloc[0].L = 2; @@ -234,7 +235,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = subframe*3; //openair_daq_vars.target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; @@ -493,6 +494,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); break; */ + /* case 9: DCI_pdu->Num_ue_spec_dci = 1; @@ -517,7 +519,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e UL_alloc_pdu.dai = 0; UL_alloc_pdu.cqi_req = 1; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - + */ // user 2 /* DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; @@ -542,11 +544,11 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e UL_alloc_pdu.dai = 0; UL_alloc_pdu.cqi_req = 1; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); + break; */ - break; - default: - break; + /*default: + break;*/ } DCI_pdu->nCCE = 0; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index d9e9a1b186..4680bcf99d 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2175,7 +2175,7 @@ void process_HARQ_feedback(uint8_t UE_id, // then Increment DLSCH round index dlsch_harq_proc->round++; - if (dlsch_harq_proc->round == dlsch->Mdlharq) { + if (dlsch_harq_proc->round == 1/*dlsch->Mdlharq*/) { // This was the last round for DLSCH so reset round and increment l2_error counter #ifdef DEBUG_PHY_PROC LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",phy_vars_eNB->Mod_id, From 64df39d1bf706a1206fe8239defb9217589d8a6b Mon Sep 17 00:00:00 2001 From: gauthier Date: Fri, 18 Dec 2015 21:11:45 +0100 Subject: [PATCH 024/122] Sync --- openair3/TEST/EPC_TEST/play_scenario.c | 277 +++++++++++++++++- openair3/TEST/EPC_TEST/play_scenario.h | 18 +- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 58 ++-- openair3/TEST/EPC_TEST/play_scenario_parse.c | 52 +++- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 2 - .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 1 - 6 files changed, 346 insertions(+), 62 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index 21aca820c2..d85faf4c2c 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -130,6 +130,54 @@ int et_strip_extension(char *in_filename) } //------------------------------------------------------------------------------ // return number of splitted items +void et_get_shift_arg( char * line_argument, shift_packet_t * const shift) +{ + int len = strlen(line_argument); + int i = 0; + int j = 0; + int num_milli = 0; + char my_num[64]; + int negative = 0; + + + while ((line_argument[i] != ':') && (i < len)) { + my_num[i] = line_argument[i]; + i += 1; + } + my_num[i++] = '\0'; + shift->frame_number = atoi(my_num); + AssertFatal(ishift_seconds = atoi(my_num); + // may omit .mmm, accept .m or .mm or .mmm or ... + while ((i < len) && (num_milli++ < 3)){ + my_num[j++] = line_argument[i++]; + } + while (num_milli++ < 6){ + my_num[j++] = '0'; + } + my_num[j] = '\0'; + shift->shift_microseconds = atoi(my_num); + if (negative == 1) { + shift->shift_seconds = - shift->shift_seconds; + shift->shift_microseconds = - shift->shift_microseconds; + } +} +//------------------------------------------------------------------------------ +// return number of splitted items int split_path( char * pathP, char *** resP) { char * saveptr1; @@ -764,9 +812,168 @@ void *et_eNB_app_task(void *args_p) } //------------------------------------------------------------------------------ -int et_play_scenario(et_scenario_t* const scenario) +int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s *shifts) { - et_event_t event; + et_event_t event; + struct shift_packet_s *shift = shifts; + et_packet_t *packet = NULL; + et_packet_t *next_packet = NULL; + struct timeval shift_all_packets = { .tv_sec = 0, .tv_usec = 0 }; + struct timeval relative_last_sent_packet = { .tv_sec = 0, .tv_usec = 0 }; + struct timeval relative_last_received_packet = { .tv_sec = 0, .tv_usec = 0 }; + struct timeval initial_time = { .tv_sec = 0, .tv_usec = 0 }; + char first_packet = 1; + char first_sent_packet = 1; + char first_received_packet = 1; + + // first apply timing shifts if requested + while (shift) { + packet = scenario->list_packet; + while (packet) { + fprintf(stdout, "*shift: %p\n", shift); + fprintf(stdout, "\tframe_number: %p\n", shift->frame_number); + fprintf(stdout, "\tshift_seconds: %ld\n", shift->shift_seconds); + fprintf(stdout, "\tshift_microseconds: %ld\n", shift->shift_microseconds); + fprintf(stdout, "\tsingle: %d\n\n", shift->single); + fprintf(stdout, "\tshift_all_packets_seconds: %ld\n", shift_all_packets.tv_sec); + fprintf(stdout, "\tshift_all_packets_microseconds: %ld\n", shift_all_packets.tv_usec); + + AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), + "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", + packet->time_relative_to_first_packet.tv_sec, + packet->time_relative_to_first_packet.tv_usec, + packet->packet_number, + packet->original_frame_number); + AssertFatal((packet->time_relative_to_last_received_packet.tv_sec >= 0) && (packet->time_relative_to_last_received_packet.tv_usec >= 0), + "Bad timing result time_relative_to_last_received_packet=%d.%d packet num %u, original frame number %u", + packet->time_relative_to_last_received_packet.tv_sec, + packet->time_relative_to_last_received_packet.tv_usec, + packet->packet_number, + packet->original_frame_number); + AssertFatal((packet->time_relative_to_last_sent_packet.tv_sec >= 0) && (packet->time_relative_to_last_sent_packet.tv_usec >= 0), + "Bad timing result time_relative_to_last_sent_packet=%d.%d packet num %u, original frame number %u", + packet->time_relative_to_last_sent_packet.tv_sec, + packet->time_relative_to_last_sent_packet.tv_usec, + packet->packet_number, + packet->original_frame_number); + fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_first_packet=%d.%d\n", + packet->packet_number, + packet->original_frame_number, + packet->time_relative_to_first_packet.tv_sec, + packet->time_relative_to_first_packet.tv_usec); + fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_last_received_packet=%d.%d\n", + packet->packet_number, + packet->original_frame_number, + packet->time_relative_to_last_received_packet.tv_sec, + packet->time_relative_to_last_received_packet.tv_usec); + fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_last_sent_packet=%d.%d\n", + packet->packet_number, + packet->original_frame_number, + packet->time_relative_to_last_sent_packet.tv_sec, + packet->time_relative_to_last_sent_packet.tv_usec); + + if ((shift->single) && (shift->frame_number == packet->original_frame_number)) { + struct timeval t_offset = { .tv_sec = shift->shift_seconds, .tv_usec = shift->shift_microseconds }; + et_packet_shift_timing(packet, &t_offset); + next_packet = packet->next; + if (next_packet) { + t_offset.tv_sec = -t_offset.tv_sec; + t_offset.tv_usec = -t_offset.tv_usec; + + if (packet->action == ET_PACKET_ACTION_S1C_SEND) { + timeval_add(&next_packet->time_relative_to_last_sent_packet, &next_packet->time_relative_to_last_sent_packet, &t_offset); + } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + timeval_add(&next_packet->time_relative_to_last_received_packet, &next_packet->time_relative_to_last_received_packet, &t_offset); + } + } + } + if ((0 == shift->single) && (shift->frame_number == packet->original_frame_number)) { + shift_all_packets.tv_sec = shift->shift_seconds; + shift_all_packets.tv_usec = shift->shift_microseconds; + timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, &shift_all_packets); + fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", + packet->packet_number, + packet->original_frame_number, + packet->time_relative_to_first_packet.tv_sec, + packet->time_relative_to_first_packet.tv_usec); + AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), + "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", + packet->time_relative_to_first_packet.tv_sec, + packet->time_relative_to_first_packet.tv_usec, + packet->packet_number, + packet->original_frame_number); + } else if ((0 == shift->single) && (shift->frame_number < packet->original_frame_number)) { + timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, &shift_all_packets); + fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", + packet->packet_number, + packet->original_frame_number, + packet->time_relative_to_first_packet.tv_sec, + packet->time_relative_to_first_packet.tv_usec); + AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), + "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", + packet->time_relative_to_first_packet.tv_sec, + packet->time_relative_to_first_packet.tv_usec, + packet->packet_number, + packet->original_frame_number); + } + packet = packet->next; + } + shift = shift->next; + } + // now recompute time_relative_to_last_received_packet, time_relative_to_last_sent_packet + if (shifts) { + packet = scenario->list_packet; + while (packet) { + if (first_packet > 0) { + initial_time = packet->time_relative_to_first_packet; + packet->time_relative_to_first_packet.tv_sec = 0; + packet->time_relative_to_first_packet.tv_usec = 0; + first_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &initial_time, + &packet->time_relative_to_first_packet); + } + if (packet->action == ET_PACKET_ACTION_S1C_SEND) { + if (first_sent_packet > 0) { + relative_last_sent_packet = packet->time_relative_to_first_packet; + packet->time_relative_to_last_sent_packet.tv_sec = 0; + packet->time_relative_to_last_sent_packet.tv_usec = 0; + first_sent_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, + &packet->time_relative_to_last_sent_packet); + relative_last_sent_packet = packet->time_relative_to_first_packet; + } + if (first_received_packet > 0) { + packet->time_relative_to_last_received_packet.tv_sec = 0; + packet->time_relative_to_last_received_packet.tv_usec = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, + &packet->time_relative_to_last_received_packet); + } + } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + if (first_received_packet > 0) { + relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec; + relative_last_received_packet.tv_usec = packet->time_relative_to_first_packet.tv_usec; + packet->time_relative_to_last_received_packet.tv_sec = 0; + packet->time_relative_to_last_received_packet.tv_usec = 0; + first_received_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, + &packet->time_relative_to_last_received_packet); + relative_last_received_packet = packet->time_relative_to_first_packet; + } + if (first_sent_packet > 0) { + packet->time_relative_to_last_sent_packet.tv_sec = 0; + packet->time_relative_to_last_sent_packet.tv_usec = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, + &packet->time_relative_to_last_sent_packet); + } + } + packet = packet->next; + } + } et_display_scenario(scenario); // create SCTP ITTI task: same as eNB code @@ -804,16 +1011,16 @@ static void et_usage ( fprintf (stdout, "Please report any bug to: %s\n",PACKAGE_BUGREPORT); fprintf (stdout, "Usage: %s [options]\n\n", argv[0]); fprintf (stdout, "\n"); - //fprintf (stdout, "Client options:\n"); - //fprintf (stdout, "\t-S | --server File name (with no path) of a test scenario that has to be replayed (TODO in future?)\n"); - //fprintf (stdout, "Server options:\n"); - fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n"); - fprintf (stdout, "\t-c | --enb-conf-file Provide an eNB config file, valid for the testbed\n"); - fprintf (stdout, "\t-s | --scenario File name (with no path) of a test scenario that has to be replayed ()\n"); + fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n"); + fprintf (stdout, "\t-c | --enb-conf-file Provide an eNB config file, valid for the testbed\n"); + fprintf (stdout, "\t-f | --shift-packet Shift the timing of a packet'\n"); + fprintf (stdout, "\t-F | --shift-packets Shift the timing of packets starting at frame 'frame' included\n"); + fprintf (stdout, "\t-m | --max-speed Play scenario as fast as possible without respecting frame timings\n"); + fprintf (stdout, "\t-s | --scenario File name (with no path) of a test scenario that has to be replayed ()\n"); fprintf (stdout, "\n"); fprintf (stdout, "Other options:\n"); - fprintf (stdout, "\t-h | --help Print this help and return\n"); - fprintf (stdout, "\t-v | --version Print informations about the version of this executable\n"); + fprintf (stdout, "\t-h | --help Print this help and return\n"); + fprintf (stdout, "\t-v | --version Print informations about the version of this executable\n"); fprintf (stdout, "\n"); } @@ -824,11 +1031,13 @@ et_config_parse_opt_line ( char *argv[], char **et_dir_name, char **scenario_file_name, - char **enb_config_file_name) + char **enb_config_file_name, + shift_packet_t **shifts) //------------------------------------------------------------------------------ { - int option; - int rv = 0; + int option = 0; + int rv = 0; + shift_packet_t *shift = NULL; enum long_option_e { LONG_OPTION_START = 0x100, /* Start after regular single char options */ @@ -836,6 +1045,8 @@ et_config_parse_opt_line ( LONG_OPTION_SCENARIO_FILE, LONG_OPTION_MAX_SPEED, LONG_OPTION_TEST_DIR, + LONG_OPTION_SHIFT_PACKET, + LONG_OPTION_SHIFT_PACKETS, LONG_OPTION_HELP, LONG_OPTION_VERSION }; @@ -845,6 +1056,8 @@ et_config_parse_opt_line ( {"scenario ", required_argument, 0, LONG_OPTION_SCENARIO_FILE}, {"max-speed ", no_argument, 0, LONG_OPTION_MAX_SPEED}, {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, + {"shift-packet", required_argument, 0, LONG_OPTION_SHIFT_PACKET}, + {"shift-packets", required_argument, 0, LONG_OPTION_SHIFT_PACKETS}, {"help", no_argument, 0, LONG_OPTION_HELP}, {"version", no_argument, 0, LONG_OPTION_VERSION}, {NULL, 0, NULL, 0} @@ -853,7 +1066,7 @@ et_config_parse_opt_line ( /* * Parsing command line */ - while ((option = getopt_long (argc, argv, "vhmc:s:d:", long_options, NULL)) != -1) { + while ((option = getopt_long (argc, argv, "vhmc:s:d:f:F", long_options, NULL)) != -1) { switch (option) { case LONG_OPTION_ENB_CONF_FILE: case 'c': @@ -885,6 +1098,37 @@ et_config_parse_opt_line ( } break; + case LONG_OPTION_SHIFT_PACKET: + case 'f': + if (optarg) { + if (NULL == *shifts) { + shift = calloc(1, sizeof (*shift)); + *shifts = shift; + } else { + shift->next = calloc(1, sizeof (*shift)); + shift = shift->next; + } + shift->single = 1; + et_get_shift_arg(optarg, shift); + printf("Arg Shift packet %s\n", optarg); + } + break; + + case LONG_OPTION_SHIFT_PACKETS: + case 'F': + if (optarg) { + if (NULL == *shifts) { + shift = calloc(1, sizeof (*shift)); + *shifts = shift; + } else { + shift->next = calloc(1, sizeof (*shift)); + shift = shift->next; + } + et_get_shift_arg(optarg, shift); + printf("Arg Shift packets %s\n", optarg); + } + break; + case LONG_OPTION_MAX_SPEED: case 'm': g_max_speed = 1; @@ -938,6 +1182,7 @@ int main( int argc, char **argv ) char *et_dir_name = NULL; char *scenario_file_name = NULL; char *enb_config_file_name = NULL; + struct shift_packet_s *shifts = NULL; int ret = 0; et_scenario_t *scenario = NULL; char play_scenario_filename[NAME_MAX]; @@ -957,11 +1202,11 @@ int main( int argc, char **argv ) asn1_xer_print = 1; //parameters - actions = et_config_parse_opt_line (argc, argv, &et_dir_name, &scenario_file_name, &enb_config_file_name); //Command-line options + actions = et_config_parse_opt_line (argc, argv, &et_dir_name, &scenario_file_name, &enb_config_file_name, &shifts); //Command-line options if (actions & PLAY_SCENARIO) { if (et_generate_xml_scenario(et_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) { if (NULL != (scenario = et_generate_scenario(play_scenario_filename))) { - ret = et_play_scenario(scenario); + ret = et_play_scenario(scenario, shifts); } else { fprintf(stderr, "ERROR: Could not generate scenario from tsml file\n"); ret = -1; diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 0391ac5c47..ca569e5141 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -89,6 +89,15 @@ #define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U" +typedef struct shift_packet_s { + unsigned int frame_number; + int shift_seconds; + int shift_microseconds; + int single; // only this packet + struct shift_packet_s *next; +} shift_packet_t; + + typedef struct mme_ip_address_s { unsigned ipv4:1; unsigned ipv6:1; @@ -445,6 +454,10 @@ int et_generate_xml_scenario( const char const * enb_config_filename, char const * tsml_out_scenario_filename); //------------------------- +void timeval_add (struct timeval * const result, const struct timeval * const a, const struct timeval * const b); +int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b); +void et_scenario_wait_rx_packet(et_packet_t * const packet); +void et_scenario_schedule_tx_packet(et_packet_t * const packet); et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event); et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event); et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event); @@ -458,7 +471,7 @@ void et_parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sct void et_parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t * const sctp_hdr); void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t * const sctp_hdr); et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); -et_scenario_t* et_generate_scenario(const char * const et_scenario_filename ); +et_scenario_t* et_generate_scenario(const char * const et_scenario_filename); //------------------------- asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints); void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, const S1ap_MME_UE_S1AP_ID_t new_id); @@ -471,6 +484,7 @@ asn_comp_rval_t * et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t void et_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num); int et_is_file_exists ( const char const * file_nameP, const char const *file_roleP); int et_strip_extension( char *in_filename); +void et_get_shift_arg( char * line_argument, shift_packet_t * const shift); int et_split_path ( char * pathP, char *** resP); void et_display_node ( xmlNodePtr node, unsigned int indent); void et_display_tree ( xmlNodePtr node, unsigned int indent); @@ -486,6 +500,6 @@ void et_enb_config_init(const char const * lib_config_file_name_pP); const Enb_properties_array_t *et_enb_config_get(void); void et_eNB_app_register(const Enb_properties_array_t *enb_properties); void *et_eNB_app_task(void *args_p); -int et_play_scenario(et_scenario_t* const scenario); +int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s *shifts); #endif /* PLAY_SCENARIO_H_ */ diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index a8f7e7331f..dece907dee 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -54,36 +54,35 @@ pthread_mutex_t g_fsm_lock = PTHREAD_MUTEX_INITIALIZER; et_fsm_state_t g_fsm_state = ET_FSM_STATE_NULL; uint32_t g_constraints = ET_BIT_MASK_MATCH_SCTP_STREAM | ET_BIT_MASK_MATCH_SCTP_SSN; //------------------------------------------------------------------------------ -int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b) +// it is assumed that if a time is negative tv_sec and tv_usec are both negative +void timeval_add (struct timeval * const result, const struct timeval * const a, const struct timeval * const b) { - struct timeval b2; - int nsec = 0; - b2.tv_sec = b->tv_sec; - b2.tv_usec = b->tv_usec; - - - /* Perform the carry for the later subtraction by updating y. */ - if (a->tv_usec < b2.tv_usec) { - nsec = (b2.tv_usec - a->tv_usec) / 1000000 + 1; - b2.tv_usec -= 1000000 * nsec; - b2.tv_sec += nsec; + AssertFatal(((a->tv_sec <= 0) && (a->tv_usec <= 0)) || ((a->tv_sec >= 0) && (a->tv_usec >= 0)), " Bad time format arg a\n"); + AssertFatal(((b->tv_sec <= 0) && (b->tv_usec <= 0)) || ((b->tv_sec >= 0) && (b->tv_usec >= 0)), " Bad time format arg b\n"); + // may happen overflows but were are not dealing with very large timings + long long int r = a->tv_usec + b->tv_usec + (a->tv_sec + b->tv_sec) * 1000000; + result->tv_sec = r / (long long int)1000000; + result->tv_usec = r % (long long int)1000000; + if ((result != a) && (result != b)) { + LOG_D(ENB_APP, "timeval_add(%ld.%06d, %ld.%06d)=%ld.%06d\n", a->tv_sec, a->tv_usec, b->tv_sec, b->tv_usec, result->tv_sec, result->tv_usec); } - if (a->tv_usec - b2.tv_usec > 1000000) { - nsec = (a->tv_usec - b2.tv_usec) / 1000000; - b2.tv_usec += 1000000 * nsec; - b2.tv_sec -= nsec; - } - - /* Compute the time remaining to wait. - tv_usec is certainly positive. */ - result->tv_sec = a->tv_sec - b2.tv_sec; - result->tv_usec = a->tv_usec - b2.tv_usec; - - LOG_D(ENB_APP, "timeval_subtract(%ld.%06d, %ld.%06d)=%ld.%06d\n", a->tv_sec, a->tv_usec, b->tv_sec, b->tv_usec, result->tv_sec, result->tv_usec); - - return a->tv_sec < b2.tv_sec; } +//------------------------------------------------------------------------------ +// it is assumed that if a time is negative tv_sec and tv_usec are both negative +int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b) +{ + AssertFatal(((a->tv_sec <= 0) && (a->tv_usec <= 0)) || ((a->tv_sec >= 0) && (a->tv_usec >= 0)), " Bad time format arg a\n"); + AssertFatal(((b->tv_sec <= 0) && (b->tv_usec <= 0)) || ((b->tv_sec >= 0) && (b->tv_usec >= 0)), " Bad time format arg b\n"); + // may happen overflows but were are not dealing with very large timings + long long int r = a->tv_usec - b->tv_usec + (a->tv_sec - b->tv_sec) * 1000000; + result->tv_sec = r / (long long int)1000000; + result->tv_usec = r % (long long int)1000000; + if ((result != a) && (result != b)) { + LOG_D(ENB_APP, "timeval_subtract(%ld.%06d, %ld.%06d)=%ld.%06d\n", a->tv_sec, a->tv_usec, b->tv_sec, b->tv_usec, result->tv_sec, result->tv_usec); + } + return result->tv_sec < 0; +} //------------------------------------------------------------------------------ void et_scenario_wait_rx_packet(et_packet_t * const packet) @@ -137,10 +136,9 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) } if ((0 < we_are_too_early) && (0 == g_max_speed)){ // set timer - if (offset.tv_sec < 0) offset.tv_sec = -offset.tv_sec; - if (offset.tv_usec < 0) { - offset.tv_usec = offset.tv_usec + 1000000; - offset.tv_sec -= 1; + if (offset.tv_sec < 0) { + offset.tv_sec = -offset.tv_sec; + offset.tv_usec = -offset.tv_usec; } LOG_D(ENB_APP, "Send packet num %u original frame number %u in %ld.%06d sec\n", diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index 4004dd5074..11dac34f0a 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -62,7 +62,7 @@ extern Enb_properties_array_t g_enb_properties; //------------------------------------------------------------------------------ void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * const s1ap) { - xmlNode *cur_node = NULL; + xmlNodePtr cur_node = NULL; xmlChar *xml_char = NULL; xmlChar *xml_char2 = NULL; unsigned int size = 0; @@ -329,9 +329,38 @@ void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t } } //------------------------------------------------------------------------------ -et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { +void et_packet_shift_timing(et_packet_t * const packet, const struct timeval * const shift) +{ + timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, shift); + AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), + "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", + packet->time_relative_to_first_packet.tv_sec, + packet->time_relative_to_first_packet.tv_usec, + packet->packet_number, + packet->original_frame_number); - et_packet_t *packet = NULL; + timeval_add(&packet->time_relative_to_last_received_packet, &packet->time_relative_to_last_received_packet, shift); + AssertFatal((packet->time_relative_to_last_received_packet.tv_sec >= 0) && (packet->time_relative_to_last_received_packet.tv_usec >= 0), + "Bad timing result time_relative_to_last_received_packet=%d.%d packet num %u, original frame number %u", + packet->time_relative_to_last_received_packet.tv_sec, + packet->time_relative_to_last_received_packet.tv_usec, + packet->packet_number, + packet->original_frame_number); + + timeval_add(&packet->time_relative_to_last_sent_packet, &packet->time_relative_to_last_sent_packet, shift); + AssertFatal((packet->time_relative_to_last_sent_packet.tv_sec >= 0) && (packet->time_relative_to_last_sent_packet.tv_usec >= 0), + "Bad timing result time_relative_to_last_sent_packet=%d.%d packet num %u, original frame number %u", + packet->time_relative_to_last_sent_packet.tv_sec, + packet->time_relative_to_last_sent_packet.tv_usec, + packet->packet_number, + packet->original_frame_number); +} + +//------------------------------------------------------------------------------ +et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) +{ + + et_packet_t *packet = NULL; xmlNode *cur_node = NULL; xmlChar *xml_char = NULL; float afloat = (float)0.0; @@ -343,6 +372,7 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { static char first_received_packet = 1; static unsigned int packet_number = 1; + if (NULL != node) { packet = calloc(1, sizeof(*packet)); @@ -441,15 +471,15 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) { } //------------------------------------------------------------------------------ et_scenario_t* et_generate_scenario( - const char * const tsml_out_scenario_filename ) + const char * const tsml_out_scenario_filename) { - xmlDocPtr doc = NULL; - xmlNodePtr root = NULL; - xmlNodePtr node = NULL; - xmlChar *xml_char = NULL; - et_scenario_t *scenario = NULL; - et_packet_t *packet = NULL; - et_packet_t **next_packet = NULL; + xmlDocPtr doc = NULL; + xmlNodePtr root = NULL; + xmlNodePtr node = NULL; + xmlChar *xml_char = NULL; + et_scenario_t *scenario = NULL; + et_packet_t *packet = NULL; + et_packet_t **next_packet = NULL; doc = xmlParseFile(tsml_out_scenario_filename); if (NULL == doc) { diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 6a39397f19..285b883ded 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -68,7 +68,6 @@ int et_s1ap_eNB_compare_assoc_id( if (p1->cnx_id < p2->cnx_id) { return -1; } - if (p1->cnx_id > p2->cnx_id) { return 1; } @@ -76,7 +75,6 @@ int et_s1ap_eNB_compare_assoc_id( if (p1->assoc_id < p2->assoc_id) { return -1; } - if (p1->assoc_id > p2->assoc_id) { return 1; } diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 31d784b2bd..32b571f823 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -586,7 +586,6 @@ int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_ { - xmlNode *cur_node = NULL; xmlChar xpath_expression[ET_XPATH_EXPRESSION_MAX_LENGTH]; int ret = 0; xmlDocPtr doc = NULL; From ea7c5d5e6d694dc119010753c61aa449319cd116 Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 22 Dec 2015 16:18:51 +0100 Subject: [PATCH 025/122] Ok, replay scenario, to be tested with more scenarios --- openair3/TEST/EPC_TEST/play_scenario.c | 64 +++++----- openair3/TEST/EPC_TEST/play_scenario.h | 9 +- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 100 ++++++++++------ openair3/TEST/EPC_TEST/play_scenario_parse.c | 110 ++++++++---------- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 28 ++++- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 13 ++- 6 files changed, 184 insertions(+), 140 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index d85faf4c2c..e7cb8ef848 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -830,13 +830,13 @@ int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s while (shift) { packet = scenario->list_packet; while (packet) { - fprintf(stdout, "*shift: %p\n", shift); - fprintf(stdout, "\tframe_number: %p\n", shift->frame_number); - fprintf(stdout, "\tshift_seconds: %ld\n", shift->shift_seconds); - fprintf(stdout, "\tshift_microseconds: %ld\n", shift->shift_microseconds); - fprintf(stdout, "\tsingle: %d\n\n", shift->single); - fprintf(stdout, "\tshift_all_packets_seconds: %ld\n", shift_all_packets.tv_sec); - fprintf(stdout, "\tshift_all_packets_microseconds: %ld\n", shift_all_packets.tv_usec); +// fprintf(stdout, "*shift: %p\n", shift); +// fprintf(stdout, "\tframe_number: %p\n", shift->frame_number); +// fprintf(stdout, "\tshift_seconds: %ld\n", shift->shift_seconds); +// fprintf(stdout, "\tshift_microseconds: %ld\n", shift->shift_microseconds); +// fprintf(stdout, "\tsingle: %d\n\n", shift->single); +// fprintf(stdout, "\tshift_all_packets_seconds: %ld\n", shift_all_packets.tv_sec); +// fprintf(stdout, "\tshift_all_packets_microseconds: %ld\n", shift_all_packets.tv_usec); AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", @@ -856,21 +856,21 @@ int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s packet->time_relative_to_last_sent_packet.tv_usec, packet->packet_number, packet->original_frame_number); - fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_first_packet=%d.%d\n", - packet->packet_number, - packet->original_frame_number, - packet->time_relative_to_first_packet.tv_sec, - packet->time_relative_to_first_packet.tv_usec); - fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_last_received_packet=%d.%d\n", - packet->packet_number, - packet->original_frame_number, - packet->time_relative_to_last_received_packet.tv_sec, - packet->time_relative_to_last_received_packet.tv_usec); - fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_last_sent_packet=%d.%d\n", - packet->packet_number, - packet->original_frame_number, - packet->time_relative_to_last_sent_packet.tv_sec, - packet->time_relative_to_last_sent_packet.tv_usec); +// fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_first_packet=%d.%d\n", +// packet->packet_number, +// packet->original_frame_number, +// packet->time_relative_to_first_packet.tv_sec, +// packet->time_relative_to_first_packet.tv_usec); +// fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_last_received_packet=%d.%d\n", +// packet->packet_number, +// packet->original_frame_number, +// packet->time_relative_to_last_received_packet.tv_sec, +// packet->time_relative_to_last_received_packet.tv_usec); +// fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_last_sent_packet=%d.%d\n", +// packet->packet_number, +// packet->original_frame_number, +// packet->time_relative_to_last_sent_packet.tv_sec, +// packet->time_relative_to_last_sent_packet.tv_usec); if ((shift->single) && (shift->frame_number == packet->original_frame_number)) { struct timeval t_offset = { .tv_sec = shift->shift_seconds, .tv_usec = shift->shift_microseconds }; @@ -891,11 +891,11 @@ int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s shift_all_packets.tv_sec = shift->shift_seconds; shift_all_packets.tv_usec = shift->shift_microseconds; timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, &shift_all_packets); - fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", - packet->packet_number, - packet->original_frame_number, - packet->time_relative_to_first_packet.tv_sec, - packet->time_relative_to_first_packet.tv_usec); +// fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", +// packet->packet_number, +// packet->original_frame_number, +// packet->time_relative_to_first_packet.tv_sec, +// packet->time_relative_to_first_packet.tv_usec); AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", packet->time_relative_to_first_packet.tv_sec, @@ -904,11 +904,11 @@ int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s packet->original_frame_number); } else if ((0 == shift->single) && (shift->frame_number < packet->original_frame_number)) { timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, &shift_all_packets); - fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", - packet->packet_number, - packet->original_frame_number, - packet->time_relative_to_first_packet.tv_sec, - packet->time_relative_to_first_packet.tv_usec); +// fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", +// packet->packet_number, +// packet->original_frame_number, +// packet->time_relative_to_first_packet.tv_sec, +// packet->time_relative_to_first_packet.tv_usec); AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", packet->time_relative_to_first_packet.tv_sec, diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index ca569e5141..c1458047bd 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -90,10 +90,10 @@ typedef struct shift_packet_s { - unsigned int frame_number; + unsigned int frame_number; // original frame number int shift_seconds; int shift_microseconds; - int single; // only this packet + int single; // shift timing only for this packet (not also following packets) struct shift_packet_s *next; } shift_packet_t; @@ -261,6 +261,7 @@ typedef enum { typedef struct et_s1ap_s { //et_s1ap_pdu_type_t pdu_type; S1AP_PDU_t pdu; // decoded ASN1 C type: choice of initiatingMessage, successfulOutcome, unsuccessfulOutcome + uint16_t xml_stream_pos_offset; uint16_t binary_stream_pos; uint16_t binary_stream_allocated_size; uint8_t *binary_stream; @@ -366,6 +367,8 @@ typedef struct et_scenario_s { et_packet_t *last_rx_packet; // Last packet received with all previous scenario RX packet received. et_packet_t *last_tx_packet; // Last sent packet et_packet_t *next_packet; // Next packet to be handled in the scenario (RX or TX packet) + + int timer_count; } et_scenario_t; @@ -457,7 +460,7 @@ int et_generate_xml_scenario( void timeval_add (struct timeval * const result, const struct timeval * const a, const struct timeval * const b); int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b); void et_scenario_wait_rx_packet(et_packet_t * const packet); -void et_scenario_schedule_tx_packet(et_packet_t * const packet); +void et_scenario_schedule_tx_packet(et_packet_t * packet); et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event); et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event); et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event); diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index dece907dee..5dee83afc9 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -70,6 +70,7 @@ void timeval_add (struct timeval * const result, const struct timeval * const a, //------------------------------------------------------------------------------ // it is assumed that if a time is negative tv_sec and tv_usec are both negative +// return true if result is positive int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b) { AssertFatal(((a->tv_sec <= 0) && (a->tv_usec <= 0)) || ((a->tv_sec >= 0) && (a->tv_usec >= 0)), " Bad time format arg a\n"); @@ -81,7 +82,7 @@ int timeval_subtract (struct timeval * const result, struct timeval * const a, s if ((result != a) && (result != b)) { LOG_D(ENB_APP, "timeval_subtract(%ld.%06d, %ld.%06d)=%ld.%06d\n", a->tv_sec, a->tv_usec, b->tv_sec, b->tv_usec, result->tv_sec, result->tv_usec); } - return result->tv_sec < 0; + return (result->tv_sec >= 0) && (result->tv_usec >= 0); } //------------------------------------------------------------------------------ @@ -93,10 +94,11 @@ void et_scenario_wait_rx_packet(et_packet_t * const packet) packet, &packet->timer_id) < 0) { AssertFatal(0, " Can not start waiting RX event timer\n"); } - LOG_D(ENB_APP, "Waiting RX packet num %d\n", packet->packet_number); + g_scenario->timer_count++; + LOG_D(ENB_APP, "Waiting RX packet num %d original frame number %u\n", packet->packet_number, packet->original_frame_number); } //------------------------------------------------------------------------------ -void et_scenario_schedule_tx_packet(et_packet_t * const packet) +void et_scenario_schedule_tx_packet(et_packet_t * packet) { s1ap_eNB_instance_t *s1ap_eNB_instance = NULL; struct timeval now = { .tv_sec = 0, .tv_usec = 0 }; @@ -104,8 +106,9 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) struct timeval offset_last_rx_packet = { .tv_sec = 0, .tv_usec = 0 }; struct timeval offset_tx_rx = { .tv_sec = 0, .tv_usec = 0 }; struct timeval offset = { .tv_sec = 0, .tv_usec = 0 }; - int last_packet_was_tx = 0; - int we_are_too_early = 0; + int last_packet_was_rx = 0; + int we_are_too_late = 0; + int original_frame_number = -1; AssertFatal(NULL != packet, "packet argument is NULL"); s1ap_eNB_instance = et_s1ap_eNB_get_instance(packet->enb_instance); @@ -124,19 +127,19 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) LOG_D(ENB_APP, "offset_last_tx_packet=%ld.%06d\n", offset_last_tx_packet.tv_sec, offset_last_tx_packet.tv_usec); LOG_D(ENB_APP, "offset_last_rx_packet=%ld.%06d\n", offset_last_rx_packet.tv_sec, offset_last_rx_packet.tv_usec); - last_packet_was_tx = timeval_subtract(&offset_tx_rx,&offset_last_tx_packet,&offset_last_rx_packet); - if (last_packet_was_tx) { - LOG_D(ENB_APP, "last_packet_was_tx\n"); - we_are_too_early = timeval_subtract(&offset,&offset_last_tx_packet,&packet->time_relative_to_last_sent_packet); - LOG_D(ENB_APP, "we_are_too_early=%d, offset=%ld.%06d\n", we_are_too_early, offset.tv_sec, offset.tv_usec); - } else { + last_packet_was_rx = timeval_subtract(&offset_tx_rx,&offset_last_tx_packet,&offset_last_rx_packet); + if (last_packet_was_rx) { LOG_D(ENB_APP, "last_packet_was_rx\n"); - we_are_too_early = timeval_subtract(&offset,&offset_last_rx_packet,&packet->time_relative_to_last_received_packet); - LOG_D(ENB_APP, "we_are_too_early=%d, offset=%ld.%06d\n", we_are_too_early, offset.tv_sec, offset.tv_usec); + we_are_too_late = timeval_subtract(&offset,&offset_last_rx_packet,&packet->time_relative_to_last_received_packet); + LOG_D(ENB_APP, "we_are_too_late=%d, offset=%ld.%06d\n", we_are_too_late, offset.tv_sec, offset.tv_usec); + } else { + LOG_D(ENB_APP, "last_packet_was_tx\n"); + we_are_too_late = timeval_subtract(&offset,&offset_last_tx_packet,&packet->time_relative_to_last_sent_packet); + LOG_D(ENB_APP, "we_are_too_early=%d, offset=%ld.%06d\n", we_are_too_late, offset.tv_sec, offset.tv_usec); } - if ((0 < we_are_too_early) && (0 == g_max_speed)){ + if ((0 == we_are_too_late) && (0 == g_max_speed)){ // set timer - if (offset.tv_sec < 0) { + if ((offset.tv_sec <= 0) || (offset.tv_usec <= 0)){ offset.tv_sec = -offset.tv_sec; offset.tv_usec = -offset.tv_usec; } @@ -148,23 +151,27 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) if (timer_setup (offset.tv_sec, offset.tv_usec, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT,packet, &packet->timer_id) < 0) { AssertFatal(0, " Can not start TX event timer\n"); } + g_scenario->timer_count++; // Done g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; } else { - LOG_D(ENB_APP, "Send packet num %u original frame number %u immediately\n", packet->packet_number, packet->original_frame_number); // send immediately AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed"); + original_frame_number = packet->original_frame_number; + do { + g_scenario->time_last_tx_packet.tv_sec = packet->timestamp_packet.tv_sec; + g_scenario->time_last_tx_packet.tv_usec = packet->timestamp_packet.tv_usec; - g_scenario->time_last_tx_packet.tv_sec = packet->timestamp_packet.tv_sec; - g_scenario->time_last_tx_packet.tv_usec = packet->timestamp_packet.tv_usec; - - et_s1ap_eNB_itti_send_sctp_data_req( + LOG_D(ENB_APP, "Sending packet num %d original frame number %u immediately\n",packet->packet_number, packet->original_frame_number); + et_s1ap_eNB_itti_send_sctp_data_req( packet->enb_instance, packet->sctp_hdr.u.data_hdr.assoc_id, packet->sctp_hdr.u.data_hdr.payload.binary_stream, packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, packet->sctp_hdr.u.data_hdr.stream); - packet->status = ET_PACKET_STATUS_SENT; - g_scenario->next_packet = g_scenario->next_packet->next; + packet->status = ET_PACKET_STATUS_SENT; + g_scenario->next_packet = g_scenario->next_packet->next; + packet = packet->next; + } while ((NULL != packet) && (packet->original_frame_number == original_frame_number)); g_fsm_state = ET_FSM_STATE_RUNNING; } break; @@ -183,7 +190,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) switch (event.code){ case ET_EVENT_TICK: while (NULL != g_scenario->next_packet) { - LOG_D(ENB_APP, "EVENT_TICK: Considering packet num %d:\n", g_scenario->next_packet->packet_number); + LOG_D(ENB_APP, "EVENT_TICK: Considering packet num %d original frame number %u\n", g_scenario->next_packet->packet_number, g_scenario->next_packet->original_frame_number); switch (g_scenario->next_packet->sctp_hdr.chunk_type) { case SCTP_CID_DATA : // no init in this scenario, may be sub-scenario @@ -251,6 +258,13 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) fprintf(stderr, "No Packet found in this scenario: %s\n", g_scenario->name); g_fsm_state = ET_FSM_STATE_NULL; pthread_mutex_unlock(&g_fsm_lock); + if (0 == g_scenario->timer_count) { + fprintf(stderr, "End of scenario: %s\n", g_scenario->name); + fflush(stderr); + fflush(stdout); + exit(0); + } + fprintf(stderr, "Remaining timers running: %d\n", g_scenario->timer_count); return g_fsm_state; break; case ET_EVENT_RX_PACKET_TIME_OUT: @@ -272,7 +286,10 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) //------------------------------------------------------------------------------ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event) { - int rv = 0; + int rv = 0; + int original_frame_number = -1; + et_packet_t *packet = NULL; + switch (event.code){ case ET_EVENT_TICK: fprintf(stdout, "EVENT_TICK: waiting for tx event\n"); @@ -284,19 +301,25 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event) case ET_EVENT_TX_TIMED_PACKET: // send immediately - AssertFatal(0 == gettimeofday(&event.u.tx_timed_packet->timestamp_packet, NULL), "gettimeofday() Failed"); + packet = event.u.tx_timed_packet; + AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed"); - g_scenario->time_last_tx_packet.tv_sec = event.u.tx_timed_packet->timestamp_packet.tv_sec; - g_scenario->time_last_tx_packet.tv_usec = event.u.tx_timed_packet->timestamp_packet.tv_usec; + original_frame_number = packet->original_frame_number; + do { + g_scenario->time_last_tx_packet.tv_sec = packet->timestamp_packet.tv_sec; + g_scenario->time_last_tx_packet.tv_usec = packet->timestamp_packet.tv_usec; - et_s1ap_eNB_itti_send_sctp_data_req( - event.u.tx_timed_packet->enb_instance, - event.u.tx_timed_packet->sctp_hdr.u.data_hdr.assoc_id, - event.u.tx_timed_packet->sctp_hdr.u.data_hdr.payload.binary_stream, - event.u.tx_timed_packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, - event.u.tx_timed_packet->sctp_hdr.u.data_hdr.stream); - event.u.tx_timed_packet->status = ET_PACKET_STATUS_SENT; - g_scenario->next_packet = event.u.tx_timed_packet->next; + LOG_D(ENB_APP, "Sending packet num %d original frame number %u immediately\n",packet->packet_number, packet->original_frame_number); + et_s1ap_eNB_itti_send_sctp_data_req( + packet->enb_instance, + packet->sctp_hdr.u.data_hdr.assoc_id, + packet->sctp_hdr.u.data_hdr.payload.binary_stream, + packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, + packet->sctp_hdr.u.data_hdr.stream); + packet->status = ET_PACKET_STATUS_SENT; + packet = packet->next; + g_scenario->next_packet = packet; + } while ( (NULL != packet) && (packet->original_frame_number == original_frame_number)); g_fsm_state = ET_FSM_STATE_RUNNING; break; @@ -411,6 +434,13 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even fprintf(stderr, "No Packet found in this scenario: %s\n", g_scenario->name); g_fsm_state = ET_FSM_STATE_NULL; pthread_mutex_unlock(&g_fsm_lock); + if (0 == g_scenario->timer_count) { + fprintf(stderr, "End of scenario: %s\n", g_scenario->name); + fflush(stderr); + fflush(stdout); + exit(0); + } + fprintf(stderr, "Remaining timers running: %d\n", g_scenario->timer_count); return g_fsm_state; break; diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index 11dac34f0a..aedc021f73 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -71,10 +71,15 @@ void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * co if ((NULL != s1ap_node) && (NULL != s1ap)) { // see http://www.xmlsoft.org/html/libxml-tree.html#xmlCopyNode - cur_node = xmlCopyNode(s1ap_node, 1); - AssertFatal(NULL != cur_node, "xmlCopyNode Failed"); - s1ap->doc = xmlNewDoc(BAD_CAST "1.0"); - xmlDocSetRootElement(s1ap->doc, cur_node); + if (NULL == s1ap->doc) { + xmlUnlinkNode(s1ap_node); + //cur_node = xmlCopyNodeList(s1ap_node); + // arg2: if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable) + //cur_node = xmlCopyNode(s1ap_node, 1); + //AssertFatal(NULL != cur_node, "xmlCopyNode Failed"); + s1ap->doc = xmlNewDoc(BAD_CAST "1.0"); + xmlDocSetRootElement(s1ap->doc, s1ap_node); + } for (cur_node = (xmlNode *)s1ap_node; cur_node; cur_node = cur_node->next) { go_deeper_in_tree = 1; @@ -97,17 +102,17 @@ void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * co xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); if (NULL != xml_char) { xml_char2 = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); - fprintf(stdout, "s1ap %p field %s size %d value %s\n",s1ap, xml_char2, size, xml_char); + fprintf(stdout, "s1ap %p field name %s size %d value %s\n",s1ap, xml_char2, size, xml_char); xmlFree(xml_char2); // if success to get value, do not parse children //AssertFatal ((xmlStrlen(xml_char) == size), "ERROR %s() mismatch in size %d and strlen %d\n", __FUNCTION__, size, xmlStrlen(xml_char)); //if (xmlStrlen(xml_char) == size) { AssertFatal ((s1ap->binary_stream_pos+xmlStrlen(xml_char)/2) <= s1ap->binary_stream_allocated_size, - "ERROR %s() in buffer size: binary_stream_pos %d xmlStrlen(xml_char)/2=%d\n", __FUNCTION__, s1ap->binary_stream_pos, xmlStrlen(xml_char)/2); + "ERROR in buffer size: binary_stream_pos %d xmlStrlen(xml_char)/2=%d\n", s1ap->binary_stream_pos, xmlStrlen(xml_char)/2); rc = et_hex2data( &s1ap->binary_stream[s1ap->binary_stream_pos], xml_char, xmlStrlen(xml_char)); s1ap->binary_stream_pos += xmlStrlen(xml_char)/2; - et_display_node(cur_node, 0); - AssertFatal (rc >= 0, "ERROR %s() in converting hex string %s len %d size %d rc %d\n", __FUNCTION__, xml_char, xmlStrlen(xml_char), size, rc); + //et_display_node(cur_node, 0); + AssertFatal (rc >= 0, "ERROR in converting hex string %s len %d size %d rc %d\n", xml_char, xmlStrlen(xml_char), size, rc); go_deeper_in_tree = 0; //} xmlFree(xml_char); @@ -274,15 +279,23 @@ void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t if (NULL != xml_char) { if ((!xmlStrcmp(xml_char, (const xmlChar *)"s1ap"))) { xmlFree(xml_char); - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"size"); - if (NULL != xml_char2) { - sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size = strtoul((const char *)xml_char2, NULL, 0); - sctp_hdr->u.data_hdr.payload.binary_stream = calloc(1, sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size); - xmlFree(xml_char2); + xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"pos"); + if (NULL != xml_char) { + sctp_hdr->u.data_hdr.payload.xml_stream_pos_offset = strtoul((const char *)xml_char, NULL, 0); + xmlFree(xml_char); + + xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"size"); + if (NULL != xml_char2) { + sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size = strtoul((const char *)xml_char2, NULL, 0); + sctp_hdr->u.data_hdr.payload.binary_stream = calloc(1, sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size); + sctp_hdr->u.data_hdr.payload.binary_stream_pos = 0; + fprintf(stdout, "Allocating payload of sctp_hdr %p %u bytes\n", sctp_hdr, sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size); + xmlFree(xml_char2); + } + et_parse_s1ap(doc, sctp_node, &sctp_hdr->u.data_hdr.payload); + et_decode_s1ap(&sctp_hdr->u.data_hdr.payload); + return; } - et_parse_s1ap(doc, sctp_node, &sctp_hdr->u.data_hdr.payload); - et_decode_s1ap(&sctp_hdr->u.data_hdr.payload); - return; } xmlFree(xml_char); } @@ -388,6 +401,7 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); afloat = atof((const char*)xml_char); xmlFree(xml_char); + fprintf(stdout, "Parsing packet frame.time_relative: %f\n", afloat); packet->time_relative_to_first_packet.tv_sec = (int)afloat; packet->time_relative_to_first_packet.tv_usec = (int)((afloat - packet->time_relative_to_first_packet.tv_sec)*1000000.0); @@ -400,48 +414,10 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) timersub(&packet->time_relative_to_first_packet, &initial_time, &packet->time_relative_to_first_packet); } - if (packet->action == ET_PACKET_ACTION_S1C_SEND) { - if (first_sent_packet > 0) { - relative_last_sent_packet = packet->time_relative_to_first_packet; - packet->time_relative_to_last_sent_packet.tv_sec = 0; - packet->time_relative_to_last_sent_packet.tv_usec = 0; - first_sent_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, - &packet->time_relative_to_last_sent_packet); - relative_last_sent_packet = packet->time_relative_to_first_packet; - } - if (first_received_packet > 0) { - packet->time_relative_to_last_received_packet.tv_sec = 0; - packet->time_relative_to_last_received_packet.tv_usec = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, - &packet->time_relative_to_last_received_packet); - } - } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - if (first_received_packet > 0) { - relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec; - relative_last_received_packet.tv_usec = packet->time_relative_to_first_packet.tv_usec; - packet->time_relative_to_last_received_packet.tv_sec = 0; - packet->time_relative_to_last_received_packet.tv_usec = 0; - first_received_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, - &packet->time_relative_to_last_received_packet); - relative_last_received_packet = packet->time_relative_to_first_packet; - } - if (first_sent_packet > 0) { - packet->time_relative_to_last_sent_packet.tv_sec = 0; - packet->time_relative_to_last_sent_packet.tv_usec = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, - &packet->time_relative_to_last_sent_packet); - } - } - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.number"))) { xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); packet->original_frame_number = strtoul((const char *)xml_char, NULL, 0); + fprintf(stdout, "Parsing packet frame.number: %u\n", packet->original_frame_number); xmlFree(xml_char); } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.src"))) { xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1); @@ -473,13 +449,14 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) et_scenario_t* et_generate_scenario( const char * const tsml_out_scenario_filename) { - xmlDocPtr doc = NULL; - xmlNodePtr root = NULL; - xmlNodePtr node = NULL; - xmlChar *xml_char = NULL; - et_scenario_t *scenario = NULL; - et_packet_t *packet = NULL; - et_packet_t **next_packet = NULL; + xmlDocPtr doc = NULL; + xmlNodePtr root = NULL; + xmlNodePtr node = NULL; + xmlChar *xml_char = NULL; + et_scenario_t *scenario = NULL; + et_packet_t *last_packet = NULL; + et_packet_t *packet = NULL; + et_packet_t **next_packet = NULL; doc = xmlParseFile(tsml_out_scenario_filename); if (NULL == doc) { @@ -503,6 +480,14 @@ et_scenario_t* et_generate_scenario( if ((!xmlStrcmp(node->name, (const xmlChar *)"packet"))) { packet = et_parse_xml_packet(doc, node); if (NULL != packet) { + // special case: S1AP same frame for 2 packets + if (NULL != last_packet) { + if (last_packet->original_frame_number == packet->original_frame_number) { + // updating because these informations are not in 2nd sctp header (same IP packet) + packet->sctp_hdr.dst_port = last_packet->sctp_hdr.dst_port; + packet->sctp_hdr.src_port = last_packet->sctp_hdr.src_port; + } + } *next_packet = packet; next_packet = &packet->next; } else { @@ -510,6 +495,7 @@ et_scenario_t* et_generate_scenario( et_display_node(node, 0); } } + last_packet = packet; } } } else { diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 285b883ded..5d5a3672d3 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -362,8 +362,16 @@ int et_handle_s1ap_mismatch_mme_ue_s1ap_id(et_packet_t * const spacket, et_packe case S1ap_ProcedureCode_id_UEContextRelease: if (present == S1AP_PDU_PR_initiatingMessage) { - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.mme_ue_s1ap_id; + switch (rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.present) { + case S1ap_UE_S1AP_IDs_PR_uE_S1AP_ID_pair: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.uE_S1AP_ID_pair.mME_UE_S1AP_ID; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.uE_S1AP_ID_pair.mME_UE_S1AP_ID; + break; + case S1ap_UE_S1AP_IDs_PR_mME_UE_S1AP_ID: + rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.mME_UE_S1AP_ID; + scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.mME_UE_S1AP_ID; + break; + } } else { rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCompleteIEs.mme_ue_s1ap_id; scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCompleteIEs.mme_ue_s1ap_id; @@ -511,6 +519,7 @@ int et_handle_s1ap_mismatch_mme_ue_s1ap_id(et_packet_t * const spacket, et_packe AssertFatal(0, "Unknown procedure code %ld", rx_packet->sctp_hdr.u.data_hdr.payload.message.procedureCode); } if (scenario_mme_ue_s1ap_id != rx_mme_ue_s1ap_id) { + S1AP_DEBUG("%s() Updating mme_ue_s1ap_id %u -> %u \n", __FUNCTION__, scenario_mme_ue_s1ap_id, rx_mme_ue_s1ap_id); et_packet_t * p = spacket; while (p) { et_s1ap_update_mme_ue_s1ap_id(p, scenario_mme_ue_s1ap_id, rx_mme_ue_s1ap_id); @@ -615,6 +624,7 @@ int et_scenario_set_packet_received(et_packet_t * const packet) if (0 != packet->timer_id) { rc = timer_remove(packet->timer_id); AssertFatal(rc == 0, "TODO: Debug Timer on Rx packet num %d unknown", packet->packet_number); + g_scenario->timer_count--; return rc; } return 1; @@ -656,7 +666,8 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) packet = g_scenario->last_rx_packet->next; } // not_found threshold may sure depend on number of mme, may be not sure on number of UE - while ((NULL != packet) && (not_found < 5)) { + while ((NULL != packet) && (not_found < 7)) { + S1AP_DEBUG("%s() Considering packet num %d original frame number %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number); if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { comp_results = et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints); if (NULL == comp_results) { @@ -681,11 +692,15 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) return et_scenario_set_packet_received(packet); } } else if (strcmp(comp_results->name, "S1ap-TransportLayerAddress") == 0) { - S1AP_WARN("Some work needed there for %s, TODO in generic_scenario.xsl, add epc conf file in the process\n",comp_results->name); + S1AP_WARN("Some work needed there for %s, TODO in generic_scenario.xsl, add epc conf file in the process, anyway continuing...\n",comp_results->name); packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec; packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; return et_scenario_set_packet_received(packet); } else { + S1AP_WARN("\n\nRX PACKET:\n"); + et_display_packet_sctp(&rx_packet->sctp_hdr); + S1AP_WARN("\n\nWAITED PACKET:\n"); + et_display_packet_sctp(&packet->sctp_hdr); AssertFatal(0,"Some work needed there"); } } @@ -1112,6 +1127,7 @@ void *et_s1ap_eNB_task(void *arg) { et_packet_t * packet = (et_packet_t*)TIMER_HAS_EXPIRED (received_msg).arg; et_event_t event; + g_scenario->timer_count--; if (NULL != packet) { if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING) { memset((void*)&event, 0, sizeof(event)); @@ -1123,6 +1139,10 @@ void *et_s1ap_eNB_task(void *arg) event.code = ET_EVENT_TX_TIMED_PACKET; event.u.tx_timed_packet = packet; et_scenario_fsm_notify_event(event); + + et_event_t continue_event; + continue_event.code = ET_EVENT_TICK; + et_scenario_fsm_notify_event(continue_event); } else if ((packet->status != ET_PACKET_STATUS_SENT) && ((packet->status != ET_PACKET_STATUS_RECEIVED))) { AssertFatal (0, "Bad status %d of packet timed out!\n", packet->status); } diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 32b571f823..ad720ab7dc 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -467,6 +467,8 @@ void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, con int size = 0; int pos = 0; int go_deeper_in_tree = 1; + S1AP_DEBUG("%s() mme_ue_s1ap_id %u\n", __FUNCTION__, new_id); + // modify for (cur_node = (xmlNode *)node; cur_node; cur_node = cur_node->next) { go_deeper_in_tree = 1; @@ -484,6 +486,8 @@ void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, con xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"pos"); if (NULL != xml_char) { pos = strtoul((const char *)xml_char, NULL, 0); + pos -= s1ap->xml_stream_pos_offset; + AssertFatal(pos >= 0, "Bad pos %d xml_stream_pos_offset %d", pos, s1ap->xml_stream_pos_offset); xmlFree(xml_char); xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); if (NULL != xml_char) { @@ -499,11 +503,11 @@ void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, con xmlFree(xml_char); // second: try to set value (always hex) ret = snprintf((char *)value_d, 32, "%ld", new_id); - AssertFatal((ret < 0) || (ret > 32), "Could not convert int to dec str"); + AssertFatal((ret > 0) && (ret < 32), "Could not convert int to dec str"); ret = snprintf((char *)value_h, 20, "C0%08X", new_id); - AssertFatal((ret < 0) || (ret > 20), "Could not convert int to hex str"); + AssertFatal((ret > 0) && (ret < 20), "Could not convert int to hex str"); ret = snprintf((char *)showname, 64, "MME-UE-S1AP-ID: %d", new_id); - AssertFatal((ret < 0) || (ret > 64), "Could not convert int to dec str"); + AssertFatal((ret > 0) && (ret < 64), "Could not convert int to dec str"); attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"value", value_h); attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"show", value_d); @@ -592,11 +596,12 @@ int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_ xmlXPathContextPtr xpath_ctx = NULL; xmlXPathObjectPtr xpath_obj = NULL; + S1AP_DEBUG("%s() packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number, old_id, new_id); + ret = snprintf(xpath_expression, ET_XPATH_EXPRESSION_MAX_LENGTH, "//field[@name=\"s1ap.MME_UE_S1AP_ID\"][@show=\"%d\"]", old_id); AssertFatal((ret > 0) && (ret < ET_XPATH_EXPRESSION_MAX_LENGTH), "Could not build XPATH expression err=%d", ret); doc = packet->sctp_hdr.u.data_hdr.payload.doc; - // Create xpath evaluation context xpath_ctx = xmlXPathNewContext(doc); if(xpath_ctx == NULL) { From b14a2212fda1cff45267144085a1faad437ea8b8 Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 5 Jan 2016 11:38:39 +0100 Subject: [PATCH 026/122] Correct timming issues --- openair3/TEST/EPC_TEST/play_scenario.c | 100 +++++++++--------- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 2 +- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 18 ++-- 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index e7cb8ef848..c633cedfa7 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -921,58 +921,56 @@ int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s shift = shift->next; } // now recompute time_relative_to_last_received_packet, time_relative_to_last_sent_packet - if (shifts) { - packet = scenario->list_packet; - while (packet) { - if (first_packet > 0) { - initial_time = packet->time_relative_to_first_packet; - packet->time_relative_to_first_packet.tv_sec = 0; - packet->time_relative_to_first_packet.tv_usec = 0; - first_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &initial_time, - &packet->time_relative_to_first_packet); - } - if (packet->action == ET_PACKET_ACTION_S1C_SEND) { - if (first_sent_packet > 0) { - relative_last_sent_packet = packet->time_relative_to_first_packet; - packet->time_relative_to_last_sent_packet.tv_sec = 0; - packet->time_relative_to_last_sent_packet.tv_usec = 0; - first_sent_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, - &packet->time_relative_to_last_sent_packet); - relative_last_sent_packet = packet->time_relative_to_first_packet; - } - if (first_received_packet > 0) { - packet->time_relative_to_last_received_packet.tv_sec = 0; - packet->time_relative_to_last_received_packet.tv_usec = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, - &packet->time_relative_to_last_received_packet); - } - } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - if (first_received_packet > 0) { - relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec; - relative_last_received_packet.tv_usec = packet->time_relative_to_first_packet.tv_usec; - packet->time_relative_to_last_received_packet.tv_sec = 0; - packet->time_relative_to_last_received_packet.tv_usec = 0; - first_received_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, - &packet->time_relative_to_last_received_packet); - relative_last_received_packet = packet->time_relative_to_first_packet; - } - if (first_sent_packet > 0) { - packet->time_relative_to_last_sent_packet.tv_sec = 0; - packet->time_relative_to_last_sent_packet.tv_usec = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, - &packet->time_relative_to_last_sent_packet); - } - } - packet = packet->next; + packet = scenario->list_packet; + while (packet) { + if (first_packet > 0) { + initial_time = packet->time_relative_to_first_packet; + packet->time_relative_to_first_packet.tv_sec = 0; + packet->time_relative_to_first_packet.tv_usec = 0; + first_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &initial_time, + &packet->time_relative_to_first_packet); } + if (packet->action == ET_PACKET_ACTION_S1C_SEND) { + if (first_sent_packet > 0) { + relative_last_sent_packet = packet->time_relative_to_first_packet; + packet->time_relative_to_last_sent_packet.tv_sec = 0; + packet->time_relative_to_last_sent_packet.tv_usec = 0; + first_sent_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, + &packet->time_relative_to_last_sent_packet); + relative_last_sent_packet = packet->time_relative_to_first_packet; + } + if (first_received_packet > 0) { + packet->time_relative_to_last_received_packet.tv_sec = 0; + packet->time_relative_to_last_received_packet.tv_usec = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, + &packet->time_relative_to_last_received_packet); + } + } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + if (first_received_packet > 0) { + relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec; + relative_last_received_packet.tv_usec = packet->time_relative_to_first_packet.tv_usec; + packet->time_relative_to_last_received_packet.tv_sec = 0; + packet->time_relative_to_last_received_packet.tv_usec = 0; + first_received_packet = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, + &packet->time_relative_to_last_received_packet); + relative_last_received_packet = packet->time_relative_to_first_packet; + } + if (first_sent_packet > 0) { + packet->time_relative_to_last_sent_packet.tv_sec = 0; + packet->time_relative_to_last_sent_packet.tv_usec = 0; + } else { + timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, + &packet->time_relative_to_last_sent_packet); + } + } + packet = packet->next; } et_display_scenario(scenario); diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index 5dee83afc9..d253e5cd5f 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -135,7 +135,7 @@ void et_scenario_schedule_tx_packet(et_packet_t * packet) } else { LOG_D(ENB_APP, "last_packet_was_tx\n"); we_are_too_late = timeval_subtract(&offset,&offset_last_tx_packet,&packet->time_relative_to_last_sent_packet); - LOG_D(ENB_APP, "we_are_too_early=%d, offset=%ld.%06d\n", we_are_too_late, offset.tv_sec, offset.tv_usec); + LOG_D(ENB_APP, "we_are_too_late=%d, offset=%ld.%06d\n", we_are_too_late, offset.tv_sec, offset.tv_usec); } if ((0 == we_are_too_late) && (0 == g_max_speed)){ // set timer diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index ad720ab7dc..2242a63bd6 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -494,10 +494,11 @@ void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, con const xmlChar value_d[32]; const xmlChar value_h[20]; const xmlChar showname[64]; - int ret = 0; - int pos2 = 0; - char val = NULL; - char hex[3] = {0,0,0};; + int ret = 0; + int pos2 = 0; + unsigned long int uli = 0; + char hex[3] = {0,0,0}; + char *end_ptr = NULL; size = strtoul((const char *)xml_char, NULL, 0); xmlFree(xml_char); @@ -518,10 +519,11 @@ void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, con do { hex[0] = value_h[pos2++]; hex[1] = value_h[pos2++]; - hex[2] = 0; - val = (unsigned char)strtoul(hex, NULL, 16); - AssertFatal(errno != 0, "Conversion of hexstring %s failed", hex); - s1ap->binary_stream[pos++] = val; + hex[2] = '\0'; + end_ptr = hex; + uli = strtoul(hex, &end_ptr, 16); + AssertFatal((uli != ULONG_MAX) && (end_ptr != NULL) && (*end_ptr == '\0'), "Conversion of hexstring %s failed returned %ld errno %d", hex, uli, errno); + s1ap->binary_stream[pos++] = (unsigned char)uli; } while (pos2 < (2*5)); // update ASN1 et_decode_s1ap(s1ap); From 191e93cc91853e9228e02456241d1edad6958c50 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 25 Jan 2016 01:13:24 -0800 Subject: [PATCH 027/122] basic skeleton for SoDeRa OAI library --- cmake_targets/CMakeLists.txt | 22 +- cmake_targets/build_oai | 8 +- targets/ARCH/COMMON/common_lib.c | 8 +- targets/ARCH/COMMON/common_lib.h | 3 + .../ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp | 442 ++++++++++++++++++ 5 files changed, 476 insertions(+), 7 deletions(-) create mode 100644 targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index f52a3c465f..d359b231b4 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -159,7 +159,7 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP" ) set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR}" + "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 " ) # set a flag for changes in the source code # these changes are related to hardcoded path to include .h files @@ -167,6 +167,7 @@ add_definitions(-DCMAKER) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2") +Message("RF_BOARD is ${RF_BOARD}") # Below has been put in comment because does not work with # SVN authentication. # @@ -404,7 +405,9 @@ add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4 add_list1_option(NB_ANTENNAS_TX "2" "Number of antennas in transmission" "1" "2" "4") add_list1_option(NB_ANTENNAS_TXRX "2" "Number of antennas in ????" "1" "2" "4") -add_list2_option(RF_BOARD "EXMIMO" "RF head type" "False" "EXMIMO" "OAI_USRP" "ETHERNET" "OAI_BLADERF" "CPRIGW") +add_list2_option(RF_BOARD "EXMIMO" "RF head type" "False" "EXMIMO" "OAI_USRP" "ETHERNET" "OAI_BLADERF" "OAI_SODERA" "CPRIGW") + +Message("RF_BOARD is ${RF_BOARD}") if (${RF_BOARD} STREQUAL "EXMIMO") set(DRIVER2013) @@ -434,6 +437,19 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF") set(option_HW_lib "bladeRF") #set(LOWLATENCY False) +elseif (${RF_BOARD} STREQUAL "OAI_SODERA") + include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/") + include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/SoDeRaV1_distro_01v/lms7suite_source_code/src/lms7002m") + include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/SoDeRaV1_distro_01v/lms7suite_source_code/src/Si5351C") + set(HW_SOURCE ${HW_SOURCE} + ${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp + ) + LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/SoDeRaV1_distro_01v/lms7suite_source_code/build/lms7002m") + LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu") + set(option_HW_lib "usb-1.0") + set(LMS7002_LIB "libLMS7002M.a") + #set(LOWLATENCY False) + elseif (${RF_BOARD} STREQUAL "ETHERNET") include_directories ("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB") set(HW_SOURCE ${HW_SOURCE} @@ -1431,7 +1447,7 @@ add_executable(lte-softmodem target_link_libraries (lte-softmodem -Wl,--start-group - RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} + RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${LMS7002_LIB} -Wl,--end-group ) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index c723d8d6dc..4a18e53f47 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -90,7 +90,7 @@ Options default is Rel10, Rel8 limits the implementation to 3GPP Release 8 version -w | --hardware - EXMIMO (Default), USRP, BLADERF, ETHERNET, None + EXMIMO (Default), USRP, BLADERF, SODERA, ETHERNET, None Adds this RF board support (in external packages installation and in compilation) --oaisim Makes the oaisim simulator. Hardware will be defaulted to "NONE". @@ -181,6 +181,9 @@ function main() { if [ "$HW" == "BLADERF" ] ; then HW="OAI_BLADERF" fi + if [ "$HW" == "SODERA" ] ; then + HW="OAI_SODERA" + fi echo_info "setting hardware to: $HW" shift 2;; --oaisim) @@ -249,6 +252,7 @@ function main() { esac done + echo_info "RF HW set to $HW" #Now we set flags to enable deadline scheduler settings #By default: USRP: disable, #By default: BLADERF: enable, @@ -262,6 +266,8 @@ function main() { LOWLATENCY_FLAG_USER="False" elif [ "$HW" = "OAI_BLADERF" ] ; then LOWLATENCY_FLAG_USER="False" + elif [ "$HW" = "OAI_SODERA" ] ; then + LOWLATENCY_FLAG_USER="False" elif [ "$HW" = "None" ] ; then LOWLATENCY_FLAG_USER="False" else diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c index bdf0e46278..8ee25c5fda 100644 --- a/targets/ARCH/COMMON/common_lib.c +++ b/targets/ARCH/COMMON/common_lib.c @@ -57,12 +57,14 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf openair0_dev_init_usrp(device, openair0_cfg); printf("openair0_dev_init_usrp ...\n"); return(openair0_dev_init_usrp(device, openair0_cfg)); - #elif OAI_BLADERF device->type=BLADERF_IF; printf(" openair0_dev_init_bladerf ...\n"); return(openair0_dev_init_bladerf(device, openair0_cfg)); - -#endif +#elif OAI_SODERA + device->type=OAI_SODERA; + printf(" openair0_dev_init_sodera ...\n"); + return(openair0_dev_init_sodera(device, openair0_cfg)); +#endif } diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index a3fe9e9dbd..8eaf3f781a 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -164,6 +164,8 @@ typedef enum { USRP_X300_IF, /*!\brief device is BLADE RF*/ BLADERF_IF, + /*!\brief device is SODERA RF*/ + SODERARF_IF, /*!\brief device is NONE*/ NONE_IF, MAX_DEV_TYPE @@ -295,6 +297,7 @@ extern "C" /*! \brief Initialize Openair ETHERNET target. It returns 0 if OK */ int openair0_dev_init_eth(openair0_device *device, openair0_config_t *openair0_cfg); int openair0_dev_init_bladerf(openair0_device *device, openair0_config_t *openair0_cfg); + int openair0_dev_init_sodera(openair0_device *device, openair0_config_t *openair0_cfg); int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_cfg); int openair0_dev_init_exmimo(openair0_device *device, openair0_config_t *openair0_cfg); /*@}*/ diff --git a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp new file mode 100644 index 0000000000..f8257fccf8 --- /dev/null +++ b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp @@ -0,0 +1,442 @@ +/******************************************************************************* + 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 . + + 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 + + *******************************************************************************/ + +/** sodera_lib.c + * + * Author: Raymond Knopp + */ + + +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include + +#include "common_lib.h" + +#include "lmsComms.h" +#include "Si5351C.h" +#ifdef __SSE4_1__ +# include +#endif + +#ifdef __AVX2__ +# include +#endif + +int num_devices=0; +/*These items configure the underlying asynch stream used by the the sync interface. + */ + +typedef struct +{ + + // -------------------------------- + // variables for SoDeRa configuration + // -------------------------------- + /* + uhd::usrp::multi_usrp::sptr usrp; + //uhd::usrp::multi_usrp::sptr rx_usrp; + + //create a send streamer and a receive streamer + uhd::tx_streamer::sptr tx_stream; + uhd::rx_streamer::sptr rx_stream; + + uhd::tx_metadata_t tx_md; + uhd::rx_metadata_t rx_md; + + uhd::time_spec_t tm_spec; + //setup variables and allocate buffer + uhd::async_metadata_t async_md; + */ + + LMScomms mDataPort; + + double sample_rate; + // time offset between transmiter timestamp and receiver timestamp; + double tdiff; + + // -------------------------------- + // Debug and output control + // -------------------------------- + int num_underflows; + int num_overflows; + int num_seq_errors; + + int64_t tx_count; + int64_t rx_count; + openair0_timestamp rx_timestamp; + +} sodera_state_t; + + +static int trx_sodera_start(openair0_device *device) +{ + sodera_state_t *s = (sodera_state_t*)device->priv; + + // init recv and send streaming + + s->rx_count = 0; + s->tx_count = 0; + s->rx_timestamp = 0; + + return 0; +} + +static void trx_sodera_end(openair0_device *device) +{ + sodera_state_t *s = (sodera_state_t*)device->priv; + + + +} + +static int trx_sodera_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) +{ + sodera_state_t *s = (sodera_state_t*)device->priv; + + if (cc>1) { + // s->tx_stream->send(buff_ptrs, nsamps, s->tx_md); + } + else + // s->tx_stream->send(buff[0], nsamps, s->tx_md); + + return 0; +} + +static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) +{ + sodera_state_t *s = (sodera_state_t*)device->priv; + int samples_received=0,i,j; + int nsamps2; // aligned to upper 32 or 16 byte boundary +#if defined(__x86_64) || defined(__i386__) +#ifdef __AVX2__ + __m256i buff_tmp[2][nsamps>>3]; + nsamps2 = (nsamps+7)>>3; +#else + __m128i buff_tmp[2][nsamps>>2]; + nsamps2 = (nsamps+3)>>2; +#endif +#elif defined(__arm__) + int16x8_t buff_tmp[2][nsamps>>2]; + nsamps2 = (nsamps+3)>>2; +#endif + + + if (cc>1) { + // receive multiple channels (e.g. RF A and RF B) + + } else { + // receive a single channel (e.g. from connector RF A) + + } + + if (samples_received < nsamps) { + printf("[recv] received %d samples out of %d\n",samples_received,nsamps); + + } + + //handle the error code + + s->rx_count += nsamps; + // s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate); + *ptimestamp = s->rx_timestamp; + + return samples_received; +} + + + +static bool is_equal(double a, double b) +{ + return fabs(a-b) < 1e-6; +} + +int trx_sodera_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) { + + sodera_state_t *s = (sodera_state_t*)device->priv; + + // s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[0]); + // s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[0]); + + return(0); + +} + +int openair0_set_rx_frequencies(openair0_device* device, openair0_config_t *openair0_cfg) { + + sodera_state_t *s = (sodera_state_t*)device->priv; + static int first_call=1; + static double rf_freq,diff; + + // uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0]); + + // rx_tune_req.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL; + // rx_tune_req.rf_freq = openair0_cfg[0].rx_freq[0]; + // rf_freq=openair0_cfg[0].rx_freq[0]; + // s->usrp->set_rx_freq(rx_tune_req); + + return(0); + +} + +int trx_sodera_set_gains(openair0_device* device, + openair0_config_t *openair0_cfg) { + + sodera_state_t *s = (sodera_state_t*)device->priv; + + // s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[0]); + // ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(0); + // limit to maximum gain + /* if (openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0] > gain_range.stop()) { + + printf("RX Gain 0 too high, reduce by %f dB\n", + openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0] - gain_range.stop()); + exit(-1); + } + s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]); + printf("Setting SODERA RX gain to %f (rx_gain %f,gain_range.stop() %f)\n", openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0],openair0_cfg[0].rx_gain[0],gain_range.stop()); + */ + return(0); +} + +int trx_sodera_stop(int card) { + return(0); +} + + +rx_gain_calib_table_t calib_table_sodera[] = { + {3500000000.0,44.0}, + {2660000000.0,49.0}, + {2300000000.0,50.0}, + {1880000000.0,53.0}, + {816000000.0,58.0}, + {-1,0}}; + +void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index,int bw_gain_adjust) { + + int i=0; + // loop through calibration table to find best adjustment factor for RX frequency + double min_diff = 6e9,diff,gain_adj=0.0; + if (bw_gain_adjust==1) { + switch ((int)openair0_cfg[0].sample_rate) { + case 30720000: + break; + case 23040000: + gain_adj=1.25; + break; + case 15360000: + gain_adj=3.0; + break; + case 7680000: + gain_adj=6.0; + break; + case 3840000: + gain_adj=9.0; + break; + case 1920000: + gain_adj=12.0; + break; + default: + printf("unknown sampling rate %d\n",(int)openair0_cfg[0].sample_rate); + exit(-1); + break; + } + } + while (openair0_cfg->rx_gain_calib_table[i].freq>0) { + diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq); + printf("cal %d: freq %f, offset %f, diff %f\n", + i, + openair0_cfg->rx_gain_calib_table[i].freq, + openair0_cfg->rx_gain_calib_table[i].offset,diff); + if (min_diff > diff) { + min_diff = diff; + openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset+gain_adj; + } + i++; + } + +} + + +int trx_sodera_get_stats(openair0_device* device) { + + return(0); + +} +int trx_sodera_reset_stats(openair0_device* device) { + + return(0); + +} + + +int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair0_cfg) +{ + + sodera_state_t *s = (sodera_state_t*)malloc(sizeof(sodera_state_t)); + size_t i; + memset(s, 0, sizeof(sodera_state_t)); + + // Initialize SODERA device + if (!s->mDataPort.Open(0)) { + printf("Cannot open SoDeRa\n"); + exit(-1); + } + + + int vers=0,subvers=0,subsubvers=0; + int bw_gain_adjust=0; + + + openair0_cfg[0].rx_gain_calib_table = calib_table_sodera; + + switch ((int)openair0_cfg[0].sample_rate) { + case 30720000: + // from usrp_time_offset + openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; + break; + case 15360000: + openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 45; + openair0_cfg[0].tx_bw = 10e6; + openair0_cfg[0].rx_bw = 10e6; + openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; + break; + case 7680000: + openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 5e6; + openair0_cfg[0].rx_bw = 5e6; + openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; + break; + case 1920000: + openair0_cfg[0].samples_per_packet = 256; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 1.25e6; + openair0_cfg[0].rx_bw = 1.25e6; + openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; + break; + default: + printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; + } + + /* + for(i=0;iusrp->get_rx_num_channels();i++) { + if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i); + s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); + printf("Setting rx freq/gain on channel %lu/%lu : BW %f (readback %f)\n",i,s->usrp->get_rx_num_channels(),openair0_cfg[0].rx_bw/1e6,s->usrp->get_rx_bandwidth(i)/1e6); + s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); + set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust); + + ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); + // limit to maximum gain + if (openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] > gain_range.stop()) { + + printf("RX Gain %lu too high, lower by %f dB\n",i,openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop()); + exit(-1); + } + s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i); + printf("RX Gain %lu %f (%f) => %f (max %f)\n",i, + openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i], + openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop()); + } + } + for(i=0;iusrp->get_tx_num_channels();i++) { + if (iusrp->set_tx_rate(openair0_cfg[0].sample_rate,i); + s->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); + printf("Setting tx freq/gain on channel %lu/%lu: BW %f (readback %f)\n",i,s->usrp->get_tx_num_channels(),openair0_cfg[0].tx_bw/1e6,s->usrp->get_tx_bandwidth(i)/1e6); + s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); + s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[i],i); + } + } + */ + + // create tx & rx streamer + + //stream_args_rx.args["spp"] = str(boost::format("%d") % 2048);//(openair0_cfg[0].rx_num_channels*openair0_cfg[0].samples_per_packet)); + + /* + for (i=0;iusrp->get_rx_rate(i)/1e6) << std::endl; + std::cout << boost::format("Actual RX frequency: %fGHz...") % (s->usrp->get_rx_freq(i)/1e9) << std::endl; + std::cout << boost::format("Actual RX gain: %f...") % (s->usrp->get_rx_gain(i)) << std::endl; + std::cout << boost::format("Actual RX bandwidth: %fM...") % (s->usrp->get_rx_bandwidth(i)/1e6) << std::endl; + std::cout << boost::format("Actual RX antenna: %s...") % (s->usrp->get_rx_antenna(i)) << std::endl; + } + } + + for (i=0;iusrp->get_tx_rate(i)/1e6) << std::endl; + std::cout << boost::format("Actual TX frequency: %fGHz...") % (s->usrp->get_tx_freq(i)/1e9) << std::endl; + std::cout << boost::format("Actual TX gain: %f...") % (s->usrp->get_tx_gain(i)) << std::endl; + std::cout << boost::format("Actual TX bandwidth: %fM...") % (s->usrp->get_tx_bandwidth(i)/1e6) << std::endl; + std::cout << boost::format("Actual TX antenna: %s...") % (s->usrp->get_tx_antenna(i)) << std::endl; + } + } + */ + + + device->priv = s; + device->trx_start_func = trx_sodera_start; + device->trx_write_func = trx_sodera_write; + device->trx_read_func = trx_sodera_read; + device->trx_get_stats_func = trx_sodera_get_stats; + device->trx_reset_stats_func = trx_sodera_reset_stats; + device->trx_end_func = trx_sodera_end; + device->trx_stop_func = trx_sodera_stop; + device->trx_set_freq_func = trx_sodera_set_freq; + device->trx_set_gains_func = trx_sodera_set_gains; + + s->sample_rate = openair0_cfg[0].sample_rate; + // TODO: + + return 0; +} From de3ba76b2f0608df77bde76d2ed82700b02a0160 Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Tue, 26 Jan 2016 01:21:59 +0100 Subject: [PATCH 028/122] first steps of SoDeRa configuration --- cmake_targets/CMakeLists.txt | 12 +- targets/ARCH/COMMON/common_lib.c | 9 +- targets/ARCH/COMMON/common_lib.h | 3 +- .../ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp | 155 ++- targets/ARCH/SODERA/lms7_trx_LTE_mimo_RF.ini | 1128 +++++++++++++++++ targets/ARCH/SODERA/lms7_trx_LTE_mimo_TSG.ini | 1128 +++++++++++++++++ .../CONF/enb.band4.tm1.usrpb210.conf | 12 +- targets/RT/USER/lte-softmodem.c | 21 +- 8 files changed, 2397 insertions(+), 71 deletions(-) create mode 100644 targets/ARCH/SODERA/lms7_trx_LTE_mimo_RF.ini create mode 100644 targets/ARCH/SODERA/lms7_trx_LTE_mimo_TSG.ini diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index d359b231b4..84bf183991 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -438,16 +438,18 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF") #set(LOWLATENCY False) elseif (${RF_BOARD} STREQUAL "OAI_SODERA") - include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/") - include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/SoDeRaV1_distro_01v/lms7suite_source_code/src/lms7002m") - include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/SoDeRaV1_distro_01v/lms7suite_source_code/src/Si5351C") + include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB") + include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/lms7002m") + include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/Si5351C") set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp ) - LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/SoDeRaV1_distro_01v/lms7suite_source_code/build/lms7002m") + LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/lms7002m") + LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/Si5351C") LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu") set(option_HW_lib "usb-1.0") set(LMS7002_LIB "libLMS7002M.a") + set(Si5351C_LIB "libSi5351C.a") #set(LOWLATENCY False) elseif (${RF_BOARD} STREQUAL "ETHERNET") @@ -1447,7 +1449,7 @@ add_executable(lte-softmodem target_link_libraries (lte-softmodem -Wl,--start-group - RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${LMS7002_LIB} + RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${LMS7002_LIB} ${Si5351C_LIB} -Wl,--end-group ) diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c index 8ee25c5fda..278d8ed79f 100644 --- a/targets/ARCH/COMMON/common_lib.c +++ b/targets/ARCH/COMMON/common_lib.c @@ -59,11 +59,16 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf return(openair0_dev_init_usrp(device, openair0_cfg)); #elif OAI_BLADERF device->type=BLADERF_IF; - printf(" openair0_dev_init_bladerf ...\n"); + printf("openair0_dev_init_bladerf ...\n"); return(openair0_dev_init_bladerf(device, openair0_cfg)); #elif OAI_SODERA device->type=OAI_SODERA; - printf(" openair0_dev_init_sodera ...\n"); + printf("openair0_dev_init_sodera ...\n"); + if (openair0_cfg[0].configFilename==NULL) { + printf("Please provide a configuration file for SoDeRa\n"); + exit(-1); + } + return(openair0_dev_init_sodera(device, openair0_cfg)); #endif diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 8eaf3f781a..3f814a9e55 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -133,7 +133,8 @@ typedef struct { char *my_ip; //! my port number for Ethernet interface (eNB/BBU, UE) int my_port; - + //! Configuration file for LMS7002M + char *configFilename; } openair0_config_t; typedef struct { diff --git a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp index f8257fccf8..ddd608d0a1 100644 --- a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp +++ b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp @@ -31,8 +31,9 @@ * * Author: Raymond Knopp */ - - + +#include +#include #include #include #include @@ -49,6 +50,7 @@ #include "common_lib.h" #include "lmsComms.h" +#include "LMS7002M.h" #include "Si5351C.h" #ifdef __SSE4_1__ # include @@ -58,6 +60,8 @@ # include #endif +using namespace std; + int num_devices=0; /*These items configure the underlying asynch stream used by the the sync interface. */ @@ -84,8 +88,8 @@ typedef struct uhd::async_metadata_t async_md; */ - LMScomms mDataPort; - + LMScomms Port; + Si5351C Si; double sample_rate; // time offset between transmiter timestamp and receiver timestamp; double tdiff; @@ -103,6 +107,7 @@ typedef struct } sodera_state_t; +sodera_state_t sodera_state; static int trx_sodera_start(openair0_device *device) { @@ -308,62 +313,99 @@ int trx_sodera_reset_stats(openair0_device* device) { int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair0_cfg) { - sodera_state_t *s = (sodera_state_t*)malloc(sizeof(sodera_state_t)); + sodera_state_t *s=&sodera_state; + size_t i; - memset(s, 0, sizeof(sodera_state_t)); // Initialize SODERA device - if (!s->mDataPort.Open(0)) { - printf("Cannot open SoDeRa\n"); - exit(-1); - } + s->Port.RefreshDeviceList(); + vector deviceNames=s->Port.GetDeviceList(); - - int vers=0,subvers=0,subsubvers=0; - int bw_gain_adjust=0; + if (deviceNames.size() == 1) { + if (s->Port.Open(0) != IConnection::SUCCESS) { + printf("Cannot open SoDeRa\n"); + exit(-1); + } + LMSinfo devInfo = s->Port.GetInfo(); + printf("Device %s, HW: %d, FW: %d, Protocol %d\n", + GetDeviceName(devInfo.device), + (int)devInfo.hardware, + (int)devInfo.firmware, + (int)devInfo.protocol); + LMS7002M lmsControl(&s->Port); + + printf("Configuring Si5351C\n"); + s->Si.Initialize(&s->Port); + s->Si.SetPLL(0, 25000000, 0); + s->Si.SetPLL(1, 25000000, 0); + s->Si.SetClock(0, 27000000, true, false); + s->Si.SetClock(1, 27000000, true, false); + for (int i = 2; i < 8; ++i) + s->Si.SetClock(i, 27000000, false, false); + Si5351C::Status status = s->Si.ConfigureClocks(); + if (status != Si5351C::SUCCESS) + { + printf("Failed to configure Si5351C"); + exit(-1); + } + status = s->Si.UploadConfiguration(); + if (status != Si5351C::SUCCESS) + printf("Failed to upload Si5351C configuration"); + + + printf("Configuring LMS7002\n"); + + int bw_gain_adjust=0; - openair0_cfg[0].rx_gain_calib_table = calib_table_sodera; + openair0_cfg[0].rx_gain_calib_table = calib_table_sodera; - switch ((int)openair0_cfg[0].sample_rate) { - case 30720000: - // from usrp_time_offset - openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; - break; - case 15360000: - openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 45; - openair0_cfg[0].tx_bw = 10e6; - openair0_cfg[0].rx_bw = 10e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; - break; - case 7680000: - openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 50; - openair0_cfg[0].tx_bw = 5e6; - openair0_cfg[0].rx_bw = 5e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; - break; - case 1920000: - openair0_cfg[0].samples_per_packet = 256; - openair0_cfg[0].tx_sample_advance = 50; - openair0_cfg[0].tx_bw = 1.25e6; - openair0_cfg[0].rx_bw = 1.25e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; - break; - default: - printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); - exit(-1); - break; - } - - /* - for(i=0;iusrp->get_rx_num_channels();i++) { - if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i); s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); printf("Setting rx freq/gain on channel %lu/%lu : BW %f (readback %f)\n",i,s->usrp->get_rx_num_channels(),openair0_cfg[0].rx_bw/1e6,s->usrp->get_rx_bandwidth(i)/1e6); @@ -420,9 +462,12 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair std::cout << boost::format("Actual TX bandwidth: %fM...") % (s->usrp->get_tx_bandwidth(i)/1e6) << std::endl; std::cout << boost::format("Actual TX antenna: %s...") % (s->usrp->get_tx_antenna(i)) << std::endl; } - } */ - + } + else { + printf("Please connect SoDeRa\n"); + exit(-1); + } device->priv = s; device->trx_start_func = trx_sodera_start; diff --git a/targets/ARCH/SODERA/lms7_trx_LTE_mimo_RF.ini b/targets/ARCH/SODERA/lms7_trx_LTE_mimo_RF.ini new file mode 100644 index 0000000000..e0e313b23e --- /dev/null +++ b/targets/ARCH/SODERA/lms7_trx_LTE_mimo_RF.ini @@ -0,0 +1,1128 @@ +[file_info] +type=lms7002m_minimal_config +version=1 +[lms7002_registers_a] +0x0020=0xFFFD +0x0021=0x0E9F +0x0022=0x07FF +0x0023=0x5550 +0x0024=0xE4E4 +0x0025=0x0101 +0x0026=0x0101 +0x0027=0xB1E4 +0x0028=0x0101 +0x0029=0x0101 +0x002A=0x0086 +0x002B=0x0038 +0x002C=0x0000 +0x002D=0xFFFF +0x002E=0x0000 +0x002F=0x3840 +0x0081=0x0000 +0x0082=0x8001 +0x0084=0x0400 +0x0085=0x0001 +0x0086=0x4101 +0x0087=0xB13B +0x0088=0x0303 +0x0089=0x1078 +0x008A=0x0514 +0x008B=0x2182 +0x008C=0x267B +0x0092=0x0001 +0x0093=0x0000 +0x0094=0x0000 +0x0095=0x0000 +0x0096=0x0000 +0x0097=0x0000 +0x0098=0x0000 +0x0099=0x6565 +0x009A=0x658C +0x009B=0x6565 +0x009C=0x658C +0x009D=0x6565 +0x009E=0x658C +0x009F=0x658C +0x00A0=0x6565 +0x00A1=0x6565 +0x00A2=0x6565 +0x00A3=0x6565 +0x00A4=0x6565 +0x00A5=0x6565 +0x00A6=0x0001 +0x00A7=0x6565 +0x00A8=0x0000 +0x00A9=0x8000 +0x00AA=0x0000 +0x00AB=0x0040 +0x00AC=0x2000 +0x00AD=0x03FF +0x00AE=0x0000 +0x0100=0x7409 +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0A12 +0x0104=0x0088 +0x0105=0x0007 +0x0106=0x3182 +0x0107=0x318C +0x0108=0x3042 +0x0109=0x61C1 +0x010A=0x104C +0x010C=0x8865 +0x010D=0x019D +0x010E=0x2040 +0x010F=0x3042 +0x0110=0x0BF4 +0x0111=0x0083 +0x0112=0xC0E6 +0x0113=0x03C3 +0x0114=0x008D +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x280C +0x0118=0x018C +0x0119=0x18CB +0x011A=0x2E02 +0x011C=0xA941 +0x011D=0x4EC4 +0x011E=0x048C +0x011F=0x3640 +0x0120=0xB9FF +0x0121=0x3158 +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0081 +0x0201=0x07B0 +0x0202=0x06F2 +0x0203=0x0FC2 +0x0204=0xD51F +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0170 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x4000 +0x020C=0x7FFF +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x0081 +0x0401=0x07FF +0x0402=0x07FF +0x0403=0x0000 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0003 +0x040B=0x000F +0x040C=0x00FC +0x040D=0x0000 +0x040E=0x0000 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x0563 +0x0443=0xB490 +0x0444=0x02B1 +0x0445=0xDA48 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[lms7002_registers_b] +0x0100=0x3409 +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0A12 +0x0104=0x0088 +0x0105=0x0007 +0x0106=0x3182 +0x0107=0x318C +0x0108=0x3042 +0x0109=0x61C1 +0x010A=0x104C +0x010C=0x8865 +0x010D=0x019C +0x010E=0x2040 +0x010F=0x3042 +0x0110=0x0BF4 +0x0111=0x0083 +0x0112=0xC0E6 +0x0113=0x03C3 +0x0114=0x008D +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x280C +0x0118=0x018C +0x0119=0x18CB +0x011A=0x2E02 +0x011C=0xA941 +0x011D=0x3B13 +0x011E=0x0631 +0x011F=0x3600 +0x0120=0xB9FF +0x0121=0x31DA +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0101 +0x0201=0x05BD +0x0202=0x0779 +0x0203=0x0F9E +0x0204=0xBCC2 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0170 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x4000 +0x020C=0x7FFF +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x0101 +0x0401=0x07FF +0x0402=0x079B +0x0403=0x0FF5 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0000 +0x040B=0x7FFF +0x040C=0x00FC +0x040D=0x0000 +0x040E=0x0000 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x0000 +0x0443=0x0000 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[reference_clocks] +sxr_ref_clk_mhz=52 +sxt_ref_clk_mhz=52 diff --git a/targets/ARCH/SODERA/lms7_trx_LTE_mimo_TSG.ini b/targets/ARCH/SODERA/lms7_trx_LTE_mimo_TSG.ini new file mode 100644 index 0000000000..fb25b06527 --- /dev/null +++ b/targets/ARCH/SODERA/lms7_trx_LTE_mimo_TSG.ini @@ -0,0 +1,1128 @@ +[file_info] +type=lms7002m_minimal_config +version=1 +[lms7002_registers_a] +0x0020=0xFFFD +0x0021=0x0E9F +0x0022=0x07FF +0x0023=0x5550 +0x0024=0xE4E4 +0x0025=0x0101 +0x0026=0x0101 +0x0027=0xE4E4 +0x0028=0x0101 +0x0029=0x0101 +0x002A=0x0086 +0x002B=0x0038 +0x002C=0x0000 +0x002D=0xFFFF +0x002E=0x0000 +0x002F=0x3840 +0x0081=0x0000 +0x0082=0x8001 +0x0084=0x0400 +0x0085=0x0001 +0x0086=0x4101 +0x0087=0xB13B +0x0088=0x0303 +0x0089=0x1078 +0x008A=0x0514 +0x008B=0x2184 +0x008C=0x267B +0x0092=0x0001 +0x0093=0x0000 +0x0094=0x0000 +0x0095=0x0000 +0x0096=0x0000 +0x0097=0x0000 +0x0098=0x0000 +0x0099=0x6565 +0x009A=0x658C +0x009B=0x6565 +0x009C=0x658C +0x009D=0x6565 +0x009E=0x658C +0x009F=0x658C +0x00A0=0x6565 +0x00A1=0x6565 +0x00A2=0x6565 +0x00A3=0x6565 +0x00A4=0x6565 +0x00A5=0x6565 +0x00A6=0x0001 +0x00A7=0x6565 +0x00A8=0x0000 +0x00A9=0x8000 +0x00AA=0x0000 +0x00AB=0x0040 +0x00AC=0x2000 +0x00AD=0x03FF +0x00AE=0x0000 +0x0100=0x7409 +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0A12 +0x0104=0x0088 +0x0105=0x0007 +0x0106=0x3182 +0x0107=0x318C +0x0108=0x9442 +0x0109=0x61C1 +0x010A=0x104C +0x010C=0x8865 +0x010D=0x011A +0x010E=0x2040 +0x010F=0x3042 +0x0110=0x0BF4 +0x0111=0x0083 +0x0112=0xC0E6 +0x0113=0x03C3 +0x0114=0x008D +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x280C +0x0118=0x018C +0x0119=0x18CB +0x011A=0x2E02 +0x011C=0xAD41 +0x011D=0x9D89 +0x011E=0x0398 +0x011F=0x3680 +0x0120=0xB9FF +0x0121=0x3692 +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0081 +0x0201=0x07B0 +0x0202=0x06F2 +0x0203=0x0FC2 +0x0204=0xD51F +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0070 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x4000 +0x020C=0x7FFF +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x0085 +0x0401=0x07FF +0x0402=0x07FF +0x0403=0x0000 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0003 +0x040B=0x000F +0x040C=0x00FC +0x040D=0x0000 +0x040E=0x0000 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x0563 +0x0443=0xB490 +0x0444=0x02B1 +0x0445=0xDA48 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[lms7002_registers_b] +0x0100=0x3409 +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0A12 +0x0104=0x0088 +0x0105=0x0007 +0x0106=0x3182 +0x0107=0x318C +0x0108=0x9442 +0x0109=0x61C1 +0x010A=0x104C +0x010C=0x88FD +0x010D=0x009E +0x010E=0x2040 +0x010F=0x3042 +0x0110=0x0BF4 +0x0111=0x0083 +0x0112=0xC0E6 +0x0113=0x03C3 +0x0114=0x008D +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x280C +0x0118=0x018C +0x0119=0x18CB +0x011A=0x2E02 +0x011C=0xA941 +0x011D=0xEC4E +0x011E=0x04E4 +0x011F=0x3600 +0x0120=0xB9FF +0x0121=0x3348 +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0101 +0x0201=0x05BD +0x0202=0x0779 +0x0203=0x0F9E +0x0204=0xBCC2 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0070 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x4000 +0x020C=0x7FFF +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x0105 +0x0401=0x07FF +0x0402=0x079B +0x0403=0x0FF5 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0000 +0x040B=0x7FFF +0x040C=0x00FC +0x040D=0x0000 +0x040E=0x0000 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x0000 +0x0443=0x0000 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[reference_clocks] +sxr_ref_clk_mhz=52 +sxt_ref_clk_mhz=52 diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf index ee4700c771..853db14393 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "92"; + mobile_network_code = "93"; ////////// Physical parameters: @@ -36,7 +36,7 @@ eNBs = nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 120; + rx_gain = 128; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; @@ -66,7 +66,7 @@ eNBs = pusch_p0_Nominal = -90; pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; + pucch_p0_Nominal = -96; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -131,7 +131,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; + mme_ip_address = ( { ipv4 = "192.168.12.11"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -141,10 +141,10 @@ eNBs = NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index e67bcb6b07..612239bec3 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -290,6 +290,8 @@ double bw = 10.0e6; static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/; +char rf_config_file[1024]; + int chain_offset=0; #ifndef EXMIMO @@ -411,6 +413,7 @@ void help (void) { printf(" sudo -E lte-softmodem [options]\n"); printf(" sudo -E ./lte-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf -S -V -m 26 -t 16 -x 1 --ulsch-max-errors 100 -W\n\n"); printf("Options:\n"); + printf(" --rf-config-file Configuration file for front-end (e.g. LMS7002M)\n"); printf(" --ulsch-max-errors set the max ULSCH erros\n"); printf(" --calib-ue-rx set UE RX calibration\n"); printf(" --calib-ue-rx-med \n"); @@ -2051,6 +2054,7 @@ static void get_options (int argc, char **argv) enum long_option_e { LONG_OPTION_START = 0x100, /* Start after regular single char options */ + LONG_OPTION_RF_CONFIG_FILE, LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS, LONG_OPTION_CALIB_UE_RX, LONG_OPTION_CALIB_UE_RX_MED, @@ -2067,6 +2071,7 @@ static void get_options (int argc, char **argv) }; static const struct option long_options[] = { + {"rf-config-file",required_argument, NULL, LONG_OPTION_RF_CONFIG_FILE}, {"ulsch-max-errors",required_argument, NULL, LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS}, {"calib-ue-rx", required_argument, NULL, LONG_OPTION_CALIB_UE_RX}, {"calib-ue-rx-med", required_argument, NULL, LONG_OPTION_CALIB_UE_RX_MED}, @@ -2085,11 +2090,19 @@ static void get_options (int argc, char **argv) while ((c = getopt_long (argc, argv, "A:a:C:dEK:g:F:G:hqO:m:SUVRM:r:P:Ws:t:Tx:",long_options,NULL)) != -1) { switch (c) { + case LONG_OPTION_RF_CONFIG_FILE: + if (strlen(optarg)<=1024) + strcpy(rf_config_file,optarg); + else { + printf("Configuration filename is too long\n"); + exit(-1); + } + break; case LONG_OPTION_MAXPOWER: tx_max_power[0]=atoi(optarg); for (CC_id=1;CC_id Date: Tue, 26 Jan 2016 00:18:34 -0800 Subject: [PATCH 029/122] added configuration file for SoDeRa --- targets/ARCH/SODERA/SoDeRa_MIMO.ini | 1128 +++++++++++++++++++++++++++ 1 file changed, 1128 insertions(+) create mode 100755 targets/ARCH/SODERA/SoDeRa_MIMO.ini diff --git a/targets/ARCH/SODERA/SoDeRa_MIMO.ini b/targets/ARCH/SODERA/SoDeRa_MIMO.ini new file mode 100755 index 0000000000..a3feaa269b --- /dev/null +++ b/targets/ARCH/SODERA/SoDeRa_MIMO.ini @@ -0,0 +1,1128 @@ +[file_info] +type=lms7002m_minimal_config +version=1 +[lms7002_registers_a] +0x0493=0x0000 +0x0492=0x0000 +0x0491=0x0000 +0x029B=0x0000 +0x048E=0x0000 +0x0022=0x07FF +0x0283=0x0000 +0x0487=0x0000 +0x0486=0x0000 +0x045F=0x0000 +0x0480=0x0000 +0x0460=0x0000 +0x0447=0x0000 +0x045A=0x0000 +0x02DA=0x0000 +0x0458=0x0000 +0x0314=0x0000 +0x0456=0x0000 +0x0559=0xACB9 +0x0451=0x0000 +0x0390=0x0000 +0x044B=0x0000 +0x0448=0x0000 +0x0454=0x0000 +0x0446=0x0000 +0x04CA=0x0000 +0x0444=0x02B1 +0x0443=0xCCCD +0x0508=0xEF99 +0x0441=0x0000 +0x040D=0x0000 +0x040B=0x000F +0x0409=0x0000 +0x0580=0xEFF2 +0x0407=0x0000 +0x0405=0x0000 +0x0254=0x0000 +0x0404=0x0000 +0x00A0=0x6565 +0x0560=0x174B +0x0403=0x0000 +0x0402=0x07FF +0x055E=0xDB10 +0x03A7=0x0000 +0x0520=0x174B +0x03A5=0x0000 +0x03A4=0x0000 +0x03A3=0x0000 +0x03A2=0x0000 +0x051C=0x0000 +0x048D=0x0000 +0x059A=0x0000 +0x03A1=0x0000 +0x02A2=0x0000 +0x04E1=0x0000 +0x039F=0x0000 +0x0248=0x0000 +0x039B=0x0000 +0x0408=0x0000 +0x0398=0x0000 +0x0393=0x0000 +0x0305=0x0000 +0x038E=0x0000 +0x0324=0x0000 +0x02E7=0x0000 +0x038D=0x0000 +0x0387=0x0000 +0x03A0=0x0000 +0x02D0=0x0000 +0x009A=0x658C +0x054E=0x8184 +0x0386=0x0000 +0x040F=0x0000 +0x04E3=0x0000 +0x0389=0x0000 +0x054F=0x18C9 +0x0385=0x0000 +0x0315=0x0000 +0x0384=0x0000 +0x0382=0x0000 +0x0288=0x0000 +0x0366=0x0000 +0x0365=0x0000 +0x0364=0x0000 +0x0325=0x0000 +0x0081=0x0000 +0x0362=0x0000 +0x038A=0x0000 +0x035E=0x0000 +0x035D=0x0000 +0x0442=0x0CCC +0x0449=0x0000 +0x035A=0x0000 +0x02C8=0x0000 +0x0452=0x0000 +0x0299=0x0000 +0x0359=0x0000 +0x0358=0x0000 +0x048B=0x0000 +0x0354=0x0000 +0x0351=0x0000 +0x03A6=0x0000 +0x0293=0x0000 +0x034E=0x0000 +0x035C=0x0000 +0x034D=0x0000 +0x034B=0x0000 +0x011A=0x2E02 +0x0455=0x0000 +0x034A=0x0000 +0x0348=0x0000 +0x0084=0x0400 +0x0498=0x0000 +0x035B=0x0000 +0x0505=0x00D8 +0x0345=0x0000 +0x0484=0x0000 +0x0586=0x196B +0x0344=0x0000 +0x0561=0xAB08 +0x0343=0x0000 +0x0342=0x0000 +0x0380=0x0000 +0x0327=0x0000 +0x0322=0x0000 +0x059B=0x0000 +0x0321=0x0000 +0x045E=0x0000 +0x0440=0x0020 +0x031D=0x0000 +0x0363=0x0000 +0x031A=0x0000 +0x031C=0x0000 +0x028F=0x0000 +0x0341=0x0000 +0x0287=0x0000 +0x0318=0x0000 +0x031F=0x0000 +0x0316=0x0000 +0x030D=0x0000 +0x040E=0x0000 +0x0352=0x0000 +0x028C=0x0000 +0x0360=0x0000 +0x0313=0x0000 +0x0461=0x0000 +0x010A=0x104C +0x051B=0xB77F +0x0312=0x0000 +0x0346=0x0000 +0x024E=0x0000 +0x0311=0x0000 +0x02D6=0x0000 +0x030C=0x0000 +0x04DF=0x0000 +0x030B=0x0000 +0x0392=0x0000 +0x030A=0x0000 +0x029F=0x0000 +0x0309=0x0000 +0x048A=0x0000 +0x0308=0x0000 +0x0588=0xE6C7 +0x0397=0x0000 +0x02E3=0x0000 +0x049C=0x0000 +0x044A=0x0000 +0x04A4=0x0000 +0x0306=0x0000 +0x0304=0x0000 +0x04D5=0x0000 +0x0303=0x0000 +0x0302=0x0000 +0x0510=0xE6C7 +0x044E=0x0000 +0x0300=0x0000 +0x034F=0x0000 +0x045B=0x0000 +0x02E6=0x0000 +0x00A3=0x6565 +0x04DA=0x0000 +0x025E=0x0000 +0x020A=0x0000 +0x0102=0x3180 +0x020C=0x8000 +0x05A2=0x0000 +0x040A=0x0003 +0x0556=0xA2B5 +0x0243=0x0000 +0x051D=0x4F91 +0x0259=0x0000 +0x02D5=0x0000 +0x02E1=0x0000 +0x011D=0xB555 +0x039E=0x0000 +0x0252=0x0000 +0x0204=0x0000 +0x0255=0x0000 +0x0281=0x0000 +0x0200=0x0081 +0x0594=0xF40D +0x02C5=0x0000 +0x0406=0x0000 +0x030F=0x0000 +0x025D=0x0000 +0x0319=0x0000 +0x0121=0x323C +0x0101=0x7800 +0x025B=0x0000 +0x02C6=0x0000 +0x0558=0x5009 +0x0021=0x0E9F +0x04C2=0x0000 +0x0290=0x0000 +0x02DF=0x0000 +0x0291=0x0000 +0x0296=0x0000 +0x029C=0x0000 +0x028D=0x0000 +0x02A1=0x0000 +0x008B=0x21A6 +0x02A3=0x0000 +0x05A4=0x0000 +0x02A7=0x0000 +0x0483=0x0000 +0x0201=0x07FF +0x02C2=0x0000 +0x02C4=0x0000 +0x044D=0x0000 +0x02E2=0x0000 +0x02D1=0x0000 +0x0546=0x8D44 +0x04C8=0x0000 +0x0207=0x0000 +0x04C6=0x0000 +0x0096=0x0000 +0x0093=0x0000 +0x0250=0x0000 +0x02CB=0x0000 +0x02D3=0x0000 +0x0494=0x0000 +0x04CF=0x0000 +0x025F=0x0000 +0x0251=0x0000 +0x0488=0x0000 +0x0496=0x0000 +0x04C3=0x0000 +0x0100=0x7409 +0x04CC=0x0000 +0x02A5=0x0000 +0x0257=0x0000 +0x04D6=0x0000 +0x04A6=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x0097=0x0000 +0x011E=0x068E +0x0285=0x0000 +0x0280=0x0000 +0x049E=0x0000 +0x0020=0xFFFD +0x02DD=0x0000 +0x0297=0x0000 +0x049F=0x0000 +0x0522=0xDB10 +0x044C=0x0000 +0x0355=0x0000 +0x04A0=0x0000 +0x02CF=0x0000 +0x04D1=0x0000 +0x0526=0xBE2A +0x0092=0x0001 +0x031B=0x0000 +0x0541=0x4C24 +0x0518=0xEFF2 +0x0543=0xBD96 +0x02C0=0x0000 +0x0499=0x0000 +0x04A1=0x0000 +0x058D=0xF5EF +0x02D7=0x0000 +0x0513=0xDAA2 +0x0549=0x18C9 +0x0552=0x8D44 +0x0521=0x5852 +0x0509=0x0605 +0x0286=0x0000 +0x024F=0x0000 +0x04E0=0x0000 +0x0545=0x364E +0x0349=0x0000 +0x0555=0xBD96 +0x04E4=0x0000 +0x02E4=0x0000 +0x0551=0xD7B7 +0x055D=0xA6B5 +0x0298=0x0000 +0x055F=0x5852 +0x009E=0x658C +0x0547=0xD7B7 +0x0598=0xF61D +0x0123=0x267B +0x0497=0x0000 +0x04A5=0x0000 +0x0565=0xB77F +0x0124=0x0000 +0x0592=0x0DF1 +0x0591=0xFCFE +0x0548=0x79FA +0x04D2=0x0000 +0x0599=0x0000 +0x0511=0x1D10 +0x0506=0x0DF1 +0x0595=0x00BC +0x0584=0xE7E2 +0x0242=0x0000 +0x025A=0x0000 +0x04E2=0x0000 +0x04C5=0x0000 +0x058C=0xEA50 +0x0450=0x0000 +0x0596=0x0A94 +0x05A7=0x0000 +0x058A=0x17DC +0x059D=0x0000 +0x0485=0x0000 +0x058E=0x1316 +0x0550=0x79FA +0x0554=0x6901 +0x0593=0x00D8 +0x0542=0xA2B5 +0x0553=0x364E +0x0563=0x4F91 +0x024D=0x0000 +0x0567=0x4049 +0x055A=0xBE2A +0x0295=0x0000 +0x0566=0x0906 +0x028A=0x0000 +0x059C=0x0000 +0x04DD=0x0000 +0x054C=0x7FFF +0x0582=0x150F +0x0585=0xDAA2 +0x0109=0x61C1 +0x04A2=0x0000 +0x0292=0x0000 +0x059F=0x0000 +0x0583=0x2E45 +0x050E=0x17DC +0x0516=0x150F +0x0523=0xA6B5 +0x0525=0x57AC +0x0206=0x0000 +0x051A=0x0906 +0x055C=0x3347 +0x0514=0xE7E2 +0x050F=0xEA5F +0x05A6=0x0000 +0x051E=0xF524 +0x050A=0x1316 +0x04C7=0x0000 +0x049D=0x0000 +0x0527=0xACB9 +0x050C=0xEA50 +0x0087=0x0000 +0x0399=0x0000 +0x050B=0xF5EF +0x0507=0xFCFE +0x010D=0x015B +0x04C4=0x0000 +0x0495=0x0000 +0x0246=0x0000 +0x0503=0x00BC +0x0320=0x0000 +0x0323=0x0000 +0x02E5=0x0000 +0x055B=0x57AC +0x0114=0x008D +0x04D8=0x0000 +0x04E7=0x0000 +0x04D0=0x0000 +0x04E6=0x0000 +0x00AE=0x0000 +0x0544=0x6901 +0x0258=0x0000 +0x0502=0x0A94 +0x04DE=0x0000 +0x058B=0x0F45 +0x0028=0x0101 +0x029E=0x0000 +0x04DC=0x0000 +0x04D9=0x0000 +0x0557=0x4C24 +0x058F=0x0605 +0x04DB=0x0000 +0x04D7=0x0000 +0x059E=0x0000 +0x024C=0x0000 +0x02DC=0x0000 +0x04D4=0x0000 +0x0504=0xF40D +0x02C3=0x0000 +0x04C1=0x0000 +0x04D3=0x0000 +0x0590=0xEF99 +0x04CE=0x0000 +0x05A5=0x0000 +0x04A7=0x0000 +0x0489=0x0000 +0x02E0=0x0000 +0x0118=0x018C +0x002A=0x0086 +0x0245=0x0000 +0x045D=0x0000 +0x0581=0xC89D +0x02D2=0x0000 +0x039C=0x0000 +0x002B=0x0038 +0x02A0=0x0000 +0x010E=0x0000 +0x0394=0x0000 +0x0459=0x0000 +0x0088=0x0550 +0x0085=0x0001 +0x0089=0x1150 +0x0256=0x0000 +0x0111=0x0083 +0x0095=0x0000 +0x0203=0x0000 +0x030E=0x0000 +0x0482=0x0000 +0x05A0=0x0000 +0x009C=0x658C +0x0381=0x0000 +0x0122=0x033F +0x0110=0x0BFF +0x0026=0x0101 +0x0294=0x0000 +0x009D=0x6565 +0x0524=0x3347 +0x0106=0x3182 +0x028E=0x0000 +0x0326=0x0000 +0x0113=0x03C3 +0x0391=0x0000 +0x04CB=0x0000 +0x010F=0x3042 +0x0119=0x18CB +0x02A6=0x0000 +0x05A1=0x0000 +0x02C9=0x0000 +0x0500=0xF61D +0x039D=0x0000 +0x011F=0x3680 +0x0395=0x0000 +0x024B=0x0000 +0x045C=0x0000 +0x0247=0x0000 +0x0512=0x196B +0x04E5=0x0000 +0x0024=0xE4E4 +0x0353=0x0000 +0x050D=0x0F45 +0x02CD=0x0000 +0x0490=0x0000 +0x0501=0xFDFB +0x034C=0x0000 +0x00AA=0x0000 +0x0350=0x0000 +0x0445=0xDA02 +0x048F=0x0000 +0x008A=0x0514 +0x0453=0x0000 +0x0260=0x0000 +0x00A1=0x6565 +0x0356=0x0000 +0x0241=0x0000 +0x008C=0x267B +0x038F=0x0000 +0x054A=0x8184 +0x00A4=0x6565 +0x0401=0x07FF +0x04CD=0x0000 +0x0249=0x0000 +0x002C=0x0000 +0x054D=0xF7A3 +0x00A6=0x0001 +0x002D=0xFFFF +0x00AC=0x2000 +0x0253=0x0000 +0x028B=0x0000 +0x040C=0x00FC +0x0310=0x0000 +0x0099=0x6565 +0x00A2=0x6565 +0x0589=0xEA5F +0x002F=0x3840 +0x035F=0x0000 +0x0597=0xFDFB +0x0116=0x8180 +0x02CC=0x0000 +0x0025=0x0101 +0x0562=0xF524 +0x011C=0xAD41 +0x0289=0x0000 +0x0282=0x0000 +0x0307=0x0000 +0x038C=0x0000 +0x02C7=0x0000 +0x054B=0xF7A3 +0x0519=0x4049 +0x009F=0x658C +0x025C=0x0000 +0x0515=0x2E45 +0x00A5=0x6565 +0x0301=0x0000 +0x02C1=0x0000 +0x0481=0x0000 +0x0517=0xC89D +0x00A8=0x0000 +0x0564=0x0000 +0x00AB=0x0040 +0x0261=0x0000 +0x002E=0x0000 +0x02DE=0x0000 +0x02A4=0x0000 +0x0540=0x5009 +0x00AD=0x03FF +0x0029=0x0101 +0x024A=0x0000 +0x00A7=0x6565 +0x0027=0xB1E4 +0x0117=0x280C +0x0098=0x0000 +0x0108=0x3042 +0x020B=0x0000 +0x0383=0x0000 +0x0202=0x07FF +0x0086=0x4101 +0x010C=0x8865 +0x02D8=0x0000 +0x0347=0x0000 +0x0457=0x0000 +0x0103=0x0A12 +0x0104=0x0088 +0x0357=0x0000 +0x02DB=0x0000 +0x0400=0x0081 +0x009B=0x6565 +0x0105=0x0007 +0x05A3=0x0000 +0x0240=0x0020 +0x0367=0x0000 +0x044F=0x0000 +0x038B=0x0000 +0x02D9=0x0000 +0x02CE=0x0000 +0x0284=0x0000 +0x0396=0x0000 +0x029A=0x0000 +0x051F=0xAB08 +0x0361=0x0000 +0x0205=0x0000 +0x031E=0x0000 +0x04C0=0x0000 +0x0587=0x1D10 +0x0023=0x5550 +0x048C=0x0000 +0x0112=0xC0E6 +0x039A=0x0000 +0x0115=0x0009 +0x00A9=0x8000 +0x0317=0x0000 +0x0244=0x0000 +0x0094=0x0000 +0x0340=0x0000 +0x0208=0x0170 +0x04A3=0x0000 +0x029D=0x0000 +0x0388=0x0000 +0x0120=0xB9FF +0x04C9=0x0000 +0x02CA=0x0000 +0x0209=0x0000 +0x0082=0x8001 +0x02D4=0x0000 +0x0107=0x318C +[lms7002_registers_b] +0x04E1=0x0000 +0x03A1=0x0000 +0x02A2=0x0000 +0x04E0=0x0000 +0x04DE=0x0000 +0x058B=0x0000 +0x04DC=0x0000 +0x04DB=0x0000 +0x04D9=0x0000 +0x04D5=0x0000 +0x0304=0x0000 +0x04D4=0x0000 +0x0504=0x0000 +0x04D3=0x0000 +0x04D2=0x0000 +0x0548=0x0000 +0x04D0=0x0000 +0x04CF=0x0000 +0x025F=0x0000 +0x04CE=0x0000 +0x04CC=0x0000 +0x02A5=0x0000 +0x04C6=0x0000 +0x0207=0x0000 +0x04C1=0x0000 +0x02C3=0x0000 +0x04C9=0x0000 +0x02CA=0x0000 +0x04C0=0x0000 +0x031E=0x0000 +0x04D6=0x0000 +0x0257=0x0000 +0x04A6=0x0000 +0x04A5=0x0000 +0x04A2=0x0000 +0x0109=0x61C1 +0x049D=0x0000 +0x04C7=0x0000 +0x049C=0x0000 +0x0397=0x0000 +0x02E3=0x0000 +0x0499=0x0000 +0x02C0=0x0000 +0x0496=0x0000 +0x04C3=0x0000 +0x0493=0x0000 +0x04A1=0x0000 +0x0492=0x0000 +0x0491=0x0000 +0x029B=0x0000 +0x048E=0x0000 +0x0283=0x0000 +0x048C=0x0000 +0x048B=0x0000 +0x0358=0x0000 +0x0487=0x0000 +0x0486=0x0000 +0x045F=0x0000 +0x0480=0x0000 +0x0460=0x0000 +0x0447=0x0000 +0x045A=0x0000 +0x02DA=0x0000 +0x0458=0x0000 +0x0314=0x0000 +0x0456=0x0000 +0x0559=0x0000 +0x0453=0x0000 +0x0451=0x0000 +0x0390=0x0000 +0x044D=0x0000 +0x02E2=0x0000 +0x044B=0x0000 +0x0448=0x0000 +0x0454=0x0000 +0x0446=0x0000 +0x04CA=0x0000 +0x0444=0x0000 +0x0443=0x0000 +0x0508=0x0000 +0x0441=0x0000 +0x040D=0x0000 +0x040B=0x7FFF +0x0409=0x0000 +0x0580=0x0000 +0x0407=0x0000 +0x0405=0x0000 +0x0254=0x0000 +0x0404=0x0000 +0x0560=0x0000 +0x04D8=0x0000 +0x0403=0x0000 +0x0402=0x07FF +0x055E=0x0000 +0x03A7=0x0000 +0x0520=0x0000 +0x03A5=0x0000 +0x03A4=0x0000 +0x03A3=0x0000 +0x03A2=0x0000 +0x051C=0x0000 +0x048D=0x0000 +0x059A=0x0000 +0x049E=0x0000 +0x039F=0x0000 +0x0248=0x0000 +0x039B=0x0000 +0x0399=0x0000 +0x0408=0x0000 +0x0398=0x0000 +0x0497=0x0000 +0x0123=0x267B +0x0394=0x0000 +0x0459=0x0000 +0x0393=0x0000 +0x0305=0x0000 +0x038E=0x0000 +0x0324=0x0000 +0x02E7=0x0000 +0x038D=0x0000 +0x0395=0x0000 +0x038A=0x0000 +0x0362=0x0000 +0x0387=0x0000 +0x0200=0x0101 +0x0594=0x0000 +0x02C5=0x0000 +0x02A7=0x0000 +0x0318=0x0000 +0x0544=0x0000 +0x049A=0x0000 +0x0388=0x0000 +0x0120=0xB9FF +0x020A=0x0080 +0x0102=0x3180 +0x0290=0x0000 +0x02DF=0x0000 +0x0291=0x0000 +0x0295=0x0000 +0x055A=0x0000 +0x029C=0x0000 +0x010E=0x2000 +0x02A0=0x0000 +0x010F=0x3042 +0x02A6=0x0000 +0x0119=0x18CB +0x02D2=0x0000 +0x039C=0x0000 +0x028D=0x0000 +0x02A1=0x0000 +0x02C2=0x0000 +0x045E=0x0000 +0x031D=0x0000 +0x0440=0x0020 +0x02C4=0x0000 +0x04D1=0x0000 +0x02CF=0x0000 +0x02C1=0x0000 +0x02C7=0x0000 +0x054B=0x0000 +0x02D3=0x0000 +0x04C8=0x0000 +0x02D1=0x0000 +0x0546=0x0000 +0x0306=0x0000 +0x02D7=0x0000 +0x058D=0x0000 +0x0457=0x0000 +0x02D8=0x0000 +0x0347=0x0000 +0x0103=0x0A12 +0x0104=0x0088 +0x0357=0x0000 +0x02DB=0x0000 +0x0400=0x0101 +0x0209=0x0000 +0x0297=0x0000 +0x02DD=0x0000 +0x029E=0x0000 +0x02DE=0x0000 +0x0527=0x0000 +0x02D5=0x0000 +0x02E1=0x0000 +0x0259=0x0000 +0x0481=0x0000 +0x0517=0x0000 +0x029A=0x0000 +0x051F=0x0000 +0x0483=0x0000 +0x0201=0x07FF +0x0507=0x0000 +0x0321=0x0000 +0x034F=0x0000 +0x0296=0x0000 +0x0510=0x0000 +0x0302=0x0000 +0x038C=0x0000 +0x0307=0x0000 +0x0282=0x0000 +0x0392=0x0000 +0x030B=0x0000 +0x0588=0x0000 +0x0308=0x0000 +0x048A=0x0000 +0x044A=0x0000 +0x04A4=0x0000 +0x04C4=0x0000 +0x010D=0x019C +0x0300=0x0000 +0x0587=0x0000 +0x044E=0x0000 +0x0309=0x0000 +0x0585=0x0000 +0x02E5=0x0000 +0x055B=0x0000 +0x0114=0x008D +0x0323=0x0000 +0x0320=0x0000 +0x0503=0x0000 +0x0513=0x0000 +0x0319=0x0000 +0x0260=0x0000 +0x0549=0x0000 +0x0552=0x0000 +0x0509=0x0000 +0x0521=0x0000 +0x0286=0x0000 +0x04D7=0x0000 +0x059E=0x0000 +0x0557=0x0000 +0x058F=0x0000 +0x0322=0x0000 +0x059B=0x0000 +0x0545=0x0000 +0x0349=0x0000 +0x0555=0x0000 +0x02E4=0x0000 +0x04E4=0x0000 +0x0551=0x0000 +0x0312=0x0000 +0x055D=0x0000 +0x0298=0x0000 +0x055F=0x0000 +0x011D=0x7555 +0x039E=0x0000 +0x0547=0x0000 +0x0598=0x0000 +0x0449=0x0000 +0x0564=0x0000 +0x0242=0x0000 +0x0525=0x0000 +0x0523=0x0000 +0x0565=0x0000 +0x0124=0x0000 +0x0592=0x0000 +0x0591=0x0000 +0x0563=0x0000 +0x024D=0x0000 +0x0567=0x0000 +0x05A5=0x0000 +0x0566=0x0000 +0x030A=0x0000 +0x029F=0x0000 +0x054C=0x0000 +0x0582=0x0000 +0x0599=0x0000 +0x0511=0x0000 +0x0506=0x0000 +0x0301=0x0000 +0x0595=0x0000 +0x0584=0x0000 +0x058C=0x0000 +0x051E=0x0000 +0x05A6=0x0000 +0x050F=0x0000 +0x0590=0x0000 +0x05A0=0x0000 +0x0596=0x0000 +0x05A7=0x0000 +0x0562=0x0000 +0x058A=0x0000 +0x059D=0x0000 +0x0485=0x0000 +0x0581=0x0000 +0x045D=0x0000 +0x0245=0x0000 +0x0310=0x0000 +0x058E=0x0000 +0x05A2=0x0000 +0x054D=0x0000 +0x020C=0x7FFF +0x0589=0x0000 +0x0522=0x0000 +0x049F=0x0000 +0x031F=0x0000 +0x0292=0x0000 +0x059F=0x0000 +0x0583=0x0000 +0x0543=0x0000 +0x0317=0x0000 +0x0244=0x0000 +0x0554=0x0000 +0x0593=0x0000 +0x05A4=0x0000 +0x02A3=0x0000 +0x0553=0x0000 +0x0542=0x0000 +0x0519=0x0000 +0x024F=0x0000 +0x0524=0x0000 +0x0518=0x0000 +0x0354=0x0000 +0x0526=0x0000 +0x031B=0x0000 +0x050E=0x0000 +0x0516=0x0000 +0x02CB=0x0000 +0x0250=0x0000 +0x031C=0x0000 +0x028F=0x0000 +0x051A=0x0000 +0x055C=0x0000 +0x0514=0x0000 +0x050A=0x0000 +0x050C=0x0000 +0x050B=0x0000 +0x04E7=0x0000 +0x04E6=0x0000 +0x04E5=0x0000 +0x0512=0x0000 +0x0206=0x0000 +0x0550=0x0000 +0x0360=0x0000 +0x030E=0x0000 +0x0203=0x0000 +0x0482=0x0000 +0x0541=0x0000 +0x0122=0x033F +0x0110=0x0BF4 +0x0204=0x0000 +0x0252=0x0000 +0x011E=0x06EC +0x049B=0x0000 +0x0294=0x0000 +0x011C=0xAD41 +0x02D6=0x0000 +0x0311=0x0000 +0x0117=0x280C +0x02A4=0x0000 +0x0540=0x0000 +0x02E0=0x0000 +0x0118=0x018C +0x0489=0x0000 +0x04A7=0x0000 +0x0101=0x7800 +0x0558=0x0000 +0x02C6=0x0000 +0x05A1=0x0000 +0x02C9=0x0000 +0x039D=0x0000 +0x0500=0x0000 +0x0450=0x0000 +0x011F=0x3680 +0x030C=0x0000 +0x04DF=0x0000 +0x0281=0x0000 +0x0106=0x3182 +0x028E=0x0000 +0x0326=0x0000 +0x0113=0x03C3 +0x04CB=0x0000 +0x0391=0x0000 +0x0105=0x0007 +0x02D9=0x0000 +0x02CE=0x0000 +0x038B=0x0000 +0x044F=0x0000 +0x02D4=0x0000 +0x0107=0x318C +0x0495=0x0000 +0x0246=0x0000 +0x0303=0x0000 +0x02E6=0x0000 +0x045B=0x0000 +0x0100=0x3409 +0x0340=0x0000 +0x0208=0x0170 +0x0111=0x0083 +0x0247=0x0000 +0x024B=0x0000 +0x045C=0x0000 +0x0383=0x0000 +0x0202=0x07FF +0x054A=0x0000 +0x0401=0x07FF +0x0341=0x0000 +0x0287=0x0000 +0x034C=0x0000 +0x0501=0x0000 +0x030F=0x0000 +0x025D=0x0000 +0x0406=0x0000 +0x0313=0x0000 +0x010A=0x104C +0x0461=0x0000 +0x051B=0x0000 +0x0121=0x348C +0x0115=0x0009 +0x0112=0xC0E6 +0x039A=0x0000 +0x02CC=0x0000 +0x0116=0x8180 +0x04A0=0x0000 +0x0108=0x3042 +0x020B=0x4000 +0x0251=0x0000 +0x0488=0x0000 +0x0241=0x0000 +0x038F=0x0000 +0x02DC=0x0000 +0x024C=0x0000 +0x0494=0x0000 +0x051D=0x0000 +0x0243=0x0000 +0x0556=0x0000 +0x040A=0x0000 +0x04CD=0x0000 +0x0249=0x0000 +0x0261=0x0000 +0x024A=0x0000 +0x0285=0x0000 +0x0280=0x0000 +0x0346=0x0000 +0x024E=0x0000 +0x0253=0x0000 +0x028B=0x0000 +0x040C=0x00FC +0x0255=0x0000 +0x0258=0x0000 +0x0502=0x0000 +0x05A3=0x0000 +0x0367=0x0000 +0x0240=0x0020 +0x0256=0x0000 +0x025A=0x0000 +0x04E2=0x0000 +0x04C5=0x0000 +0x025B=0x0000 +0x0205=0x0000 +0x0361=0x0000 +0x0515=0x0000 +0x025C=0x0000 +0x0355=0x0000 +0x044C=0x0000 +0x010C=0x8865 +0x0284=0x0000 +0x0396=0x0000 +0x0363=0x0000 +0x031A=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x04DD=0x0000 +0x059C=0x0000 +0x0352=0x0000 +0x028C=0x0000 +0x04C2=0x0000 +0x04DA=0x0000 +0x025E=0x0000 +0x0327=0x0000 +0x0380=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0561=0x0000 +0x035A=0x0000 +0x02C8=0x0000 +0x0484=0x0000 +0x0586=0x0000 +0x0597=0x0000 +0x035F=0x0000 +0x0345=0x0000 +0x0505=0x0000 +0x035B=0x0000 +0x034A=0x0000 +0x0455=0x0000 +0x011A=0x2E02 +0x034B=0x0000 +0x034D=0x0000 +0x035C=0x0000 +0x034E=0x0000 +0x0293=0x0000 +0x03A6=0x0000 +0x0350=0x0000 +0x0445=0x0000 +0x048F=0x0000 +0x0351=0x0000 +0x0353=0x0000 +0x050D=0x0000 +0x02CD=0x0000 +0x0490=0x0000 +0x0498=0x0000 +0x0348=0x0000 +0x0356=0x0000 +0x030D=0x0000 +0x0316=0x0000 +0x040E=0x0000 +0x04A3=0x0000 +0x029D=0x0000 +0x0359=0x0000 +0x0299=0x0000 +0x0452=0x0000 +0x0442=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x0325=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0381=0x0000 +0x0288=0x0000 +0x0382=0x0000 +0x0384=0x0000 +0x0315=0x0000 +0x0385=0x0000 +0x04E3=0x0000 +0x040F=0x0000 +0x0389=0x0000 +0x054F=0x0000 +0x0386=0x0000 +0x02D0=0x0000 +0x054E=0x0000 +0x03A0=0x0000 +[reference_clocks] +sxt_ref_clk_mhz=30.72 +sxr_ref_clk_mhz=30.72 From c9780626edb32606c2958d51bbd8bcf91d369497 Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Tue, 26 Jan 2016 14:09:47 +0100 Subject: [PATCH 030/122] further RF configuration for SoDeRa --- .../ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp | 69 ++++++++++++++++--- 1 file changed, 60 insertions(+), 9 deletions(-) diff --git a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp index ddd608d0a1..0ddc3ef4a9 100644 --- a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp +++ b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp @@ -354,7 +354,7 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair printf("Configuring LMS7002\n"); - + int bw_gain_adjust=0; @@ -404,14 +404,65 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair printf("Failed to load configuration file %s\n",openair0_cfg[0].configFilename); exit(-1); } - /* - for(i=0;iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i); - s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); - printf("Setting rx freq/gain on channel %lu/%lu : BW %f (readback %f)\n",i,s->usrp->get_rx_num_channels(),openair0_cfg[0].rx_bw/1e6,s->usrp->get_rx_bandwidth(i)/1e6); - s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); - set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust); + opStatus = lmsControl.UploadAll(); + if (opStatus != LIBLMS7_SUCCESS) { + printf("Failed to upload configuration file\n"); + exit(-1); + } + + opStatus = lmsControl.SetFrequencySX(LMS7002M::Tx, openair0_cfg[0].tx_freq[0]/1e6,30.72); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot set TX frequency %f MHz\n",openair0_cfg[0].tx_freq[0]/1e6); + exit(-1); + } + + opStatus = lmsControl.SetFrequencySX(LMS7002M::Rx, openair0_cfg[0].rx_freq[0]/1e6,30.72); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot set RX frequency %f MHz\n",openair0_cfg[0].rx_freq[0]/1e6); + exit(-1); + } + + + + // this makes RX/TX sampling rates equal + opStatus = lmsControl.Modify_SPI_Reg_bits(EN_ADCCLKH_CLKGN,0); + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot modify SPI (EN_ADCCLKH_CLKGN)\n"); + exit(-1); + } + opStatus = lmsControl.Modify_SPI_Reg_bits(CLKH_OV_CLKL_CGEN,2); + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot modify SPI (CLKH_OV_CLKL_CGEN)\n"); + exit(-1); + } + + const float cgen_freq_MHz = 245.76; + const int interpolation = 0; // real interpolation = 2 + const int decimation = 0; // real decimation = 2 + opStatus = lmsControl.SetInterfaceFrequency(cgen_freq_MHz,interpolation,decimation); + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot SetInterfaceFrequency (%f,%d,%d)\n",cgen_freq_MHz,interpolation,decimation); + exit(-1); + } + // Run calibration procedure + float txrx_calibrationBandwidth_MHz = 5; + opStatus = lmsControl.CalibrateTx(txrx_calibrationBandwidth_MHz); + if (opStatus != LIBLMS7_SUCCESS){ + printf("TX Calibration failed\n"); + exit(-1); + } + opStatus = lmsControl.CalibrateRx(txrx_calibrationBandwidth_MHz); + if (opStatus != LIBLMS7_SUCCESS){ + printf("RX Calibration failed\n"); + exit(-1); + } + + // this will configure that sampling rate at output of FPGA + // LMS_StreamBoard::ConfigurePLL(&s->Port,openair0_cfg[0].sample_rate,openair0_cfg[0].sample_rate,90); + /* ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); // limit to maximum gain if (openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] > gain_range.stop()) { @@ -482,6 +533,6 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair s->sample_rate = openair0_cfg[0].sample_rate; // TODO: - + exit(-1); return 0; } From 10a764c4727693520f9822a6e581940906367cae Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 26 Jan 2016 16:45:48 +0100 Subject: [PATCH 031/122] Traces + shift timing bug --- openair3/TEST/EPC_TEST/play_scenario.c | 45 ++++++++++--------- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 12 +++-- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index c633cedfa7..cafdd93d31 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -141,10 +141,14 @@ void et_get_shift_arg( char * line_argument, shift_packet_t * const shift) while ((line_argument[i] != ':') && (i < len)) { - my_num[i] = line_argument[i]; + if (isdigit(line_argument[i])) { // may occur '\"' + my_num[j++] = line_argument[i]; + } i += 1; } - my_num[i++] = '\0'; + AssertFatal(':' == line_argument[i], "Bad format"); + i += 1; // ':' + my_num[j++] = '\0'; shift->frame_number = atoi(my_num); AssertFatal(ilist_packet; while (packet) { -// fprintf(stdout, "*shift: %p\n", shift); -// fprintf(stdout, "\tframe_number: %p\n", shift->frame_number); -// fprintf(stdout, "\tshift_seconds: %ld\n", shift->shift_seconds); -// fprintf(stdout, "\tshift_microseconds: %ld\n", shift->shift_microseconds); -// fprintf(stdout, "\tsingle: %d\n\n", shift->single); -// fprintf(stdout, "\tshift_all_packets_seconds: %ld\n", shift_all_packets.tv_sec); -// fprintf(stdout, "\tshift_all_packets_microseconds: %ld\n", shift_all_packets.tv_usec); + fprintf(stdout, "*shift: %p\n", shift); + fprintf(stdout, "\tframe_number: %d\n", shift->frame_number); + fprintf(stdout, "\tshift_seconds: %ld\n", shift->shift_seconds); + fprintf(stdout, "\tshift_microseconds: %ld\n", shift->shift_microseconds); + fprintf(stdout, "\tsingle: %d\n\n", shift->single); + fprintf(stdout, "\tshift_all_packets_seconds: %ld\n", shift_all_packets.tv_sec); + fprintf(stdout, "\tshift_all_packets_microseconds: %ld\n", shift_all_packets.tv_usec); AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", @@ -891,11 +896,11 @@ int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s shift_all_packets.tv_sec = shift->shift_seconds; shift_all_packets.tv_usec = shift->shift_microseconds; timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, &shift_all_packets); -// fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", -// packet->packet_number, -// packet->original_frame_number, -// packet->time_relative_to_first_packet.tv_sec, -// packet->time_relative_to_first_packet.tv_usec); + fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", + packet->packet_number, + packet->original_frame_number, + packet->time_relative_to_first_packet.tv_sec, + packet->time_relative_to_first_packet.tv_usec); AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", packet->time_relative_to_first_packet.tv_sec, @@ -904,11 +909,11 @@ int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s packet->original_frame_number); } else if ((0 == shift->single) && (shift->frame_number < packet->original_frame_number)) { timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, &shift_all_packets); -// fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", -// packet->packet_number, -// packet->original_frame_number, -// packet->time_relative_to_first_packet.tv_sec, -// packet->time_relative_to_first_packet.tv_usec); + fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", + packet->packet_number, + packet->original_frame_number, + packet->time_relative_to_first_packet.tv_sec, + packet->time_relative_to_first_packet.tv_usec); AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", packet->time_relative_to_first_packet.tv_sec, @@ -1107,8 +1112,8 @@ et_config_parse_opt_line ( shift = shift->next; } shift->single = 1; - et_get_shift_arg(optarg, shift); printf("Arg Shift packet %s\n", optarg); + et_get_shift_arg(optarg, shift); } break; diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 2242a63bd6..1e79c38963 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -467,7 +467,7 @@ void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, con int size = 0; int pos = 0; int go_deeper_in_tree = 1; - S1AP_DEBUG("%s() mme_ue_s1ap_id %u\n", __FUNCTION__, new_id); + S1AP_INFO("%s() mme_ue_s1ap_id %u\n", __FUNCTION__, new_id); // modify for (cur_node = (xmlNode *)node; cur_node; cur_node = cur_node->next) { @@ -527,7 +527,7 @@ void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, con } while (pos2 < (2*5)); // update ASN1 et_decode_s1ap(s1ap); - S1AP_DEBUG("Updated ASN1 for %s\n", showname); + S1AP_INFO("Updated ASN1 for %s\n", showname); } } } @@ -553,6 +553,7 @@ void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSe xmlNode *s1ap_node = NULL; size = (nodes) ? nodes->nodeNr : 0; + S1AP_DEBUG("%s() num nodes %u\n", __FUNCTION__, size); /* * NOTE: the nodes are processed in reverse order, i.e. reverse document @@ -614,14 +615,19 @@ int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_ // Evaluate xpath expression xpath_obj = xmlXPathEvalExpression(xpath_expression, xpath_ctx); + xmlXPathFreeContext(xpath_ctx); AssertFatal(xpath_obj != NULL, "Unable to evaluate XPATH expression \"%s\"\n", xpath_expression); + if(xmlXPathNodeSetIsEmpty(xpath_obj->nodesetval)){ + xmlXPathFreeObject(xpath_obj); + S1AP_DEBUG("%s() No match packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number, old_id, new_id); + return -1; + } // update selected nodes update_xpath_nodes_mme_ue_s1ap_id(&packet->sctp_hdr.u.data_hdr.payload, xpath_obj->nodesetval, new_id); // Cleanup of XPath data xmlXPathFreeObject(xpath_obj); - xmlXPathFreeContext(xpath_ctx); return 0; } From 5319fcba38008b1c99c2eab6e82926471b965a19 Mon Sep 17 00:00:00 2001 From: gauthier Date: Wed, 27 Jan 2016 08:39:44 +0100 Subject: [PATCH 032/122] Bug, needed unsigned instead of signed --- openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 1e79c38963..f9c7d9c822 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -601,7 +601,7 @@ int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_ S1AP_DEBUG("%s() packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number, old_id, new_id); - ret = snprintf(xpath_expression, ET_XPATH_EXPRESSION_MAX_LENGTH, "//field[@name=\"s1ap.MME_UE_S1AP_ID\"][@show=\"%d\"]", old_id); + ret = snprintf(xpath_expression, ET_XPATH_EXPRESSION_MAX_LENGTH, "//field[@name=\"s1ap.MME_UE_S1AP_ID\"][@show=\"%u\"]", old_id); AssertFatal((ret > 0) && (ret < ET_XPATH_EXPRESSION_MAX_LENGTH), "Could not build XPATH expression err=%d", ret); doc = packet->sctp_hdr.u.data_hdr.payload.doc; @@ -620,7 +620,8 @@ int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_ if(xmlXPathNodeSetIsEmpty(xpath_obj->nodesetval)){ xmlXPathFreeObject(xpath_obj); - S1AP_DEBUG("%s() No match packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number, old_id, new_id); + S1AP_DEBUG("%s() No match \"%s\"packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n", + __FUNCTION__, xpath_expression, packet->packet_number, packet->original_frame_number, old_id, new_id); return -1; } // update selected nodes From 9e28189d9b815a24a05de1998d03b438be1e9a69 Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Wed, 27 Jan 2016 17:20:19 +0100 Subject: [PATCH 033/122] PLL Configuration --- cmake_targets/CMakeLists.txt | 7 +- .../ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp | 78 +++++++++---------- 2 files changed, 45 insertions(+), 40 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 84bf183991..a8af214ce1 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -441,15 +441,20 @@ elseif (${RF_BOARD} STREQUAL "OAI_SODERA") include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB") include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/lms7002m") include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/Si5351C") + include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/LMS_StreamBoard") set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp ) LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/lms7002m") LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/Si5351C") + LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/LMS_StreamBoard") + LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/kissFFT") LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu") set(option_HW_lib "usb-1.0") set(LMS7002_LIB "libLMS7002M.a") set(Si5351C_LIB "libSi5351C.a") + set(LMSStreamBoard_LIB "libLMS_StreamBoard.a") + set(KISSFFT_LIB "libkissFFT.a") #set(LOWLATENCY False) elseif (${RF_BOARD} STREQUAL "ETHERNET") @@ -1449,7 +1454,7 @@ add_executable(lte-softmodem target_link_libraries (lte-softmodem -Wl,--start-group - RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${LMS7002_LIB} ${Si5351C_LIB} + RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${LMS7002_LIB} ${Si5351C_LIB} ${LMSStreamBoard_LIB} ${KISSFFT_LIB} -Wl,--end-group ) diff --git a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp index 0ddc3ef4a9..5914ff5be6 100644 --- a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp +++ b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp @@ -52,6 +52,8 @@ #include "lmsComms.h" #include "LMS7002M.h" #include "Si5351C.h" +#include "LMS_StreamBoard.h" + #ifdef __SSE4_1__ # include #endif @@ -72,24 +74,12 @@ typedef struct // -------------------------------- // variables for SoDeRa configuration // -------------------------------- - /* - uhd::usrp::multi_usrp::sptr usrp; - //uhd::usrp::multi_usrp::sptr rx_usrp; - - //create a send streamer and a receive streamer - uhd::tx_streamer::sptr tx_stream; - uhd::rx_streamer::sptr rx_stream; - - uhd::tx_metadata_t tx_md; - uhd::rx_metadata_t rx_md; - - uhd::time_spec_t tm_spec; - //setup variables and allocate buffer - uhd::async_metadata_t async_md; - */ LMScomms Port; Si5351C Si; + LMS7002M lmsControl; + LMS_StreamBoard *lmsStream; + double sample_rate; // time offset between transmiter timestamp and receiver timestamp; double tdiff; @@ -105,13 +95,13 @@ typedef struct int64_t rx_count; openair0_timestamp rx_timestamp; -} sodera_state_t; +} sodera_t; -sodera_state_t sodera_state; +sodera_t sodera_state; static int trx_sodera_start(openair0_device *device) { - sodera_state_t *s = (sodera_state_t*)device->priv; + sodera_t *s = (sodera_t*)device->priv; // init recv and send streaming @@ -124,7 +114,7 @@ static int trx_sodera_start(openair0_device *device) static void trx_sodera_end(openair0_device *device) { - sodera_state_t *s = (sodera_state_t*)device->priv; + sodera_t *s = (sodera_t*)device->priv; @@ -132,7 +122,7 @@ static void trx_sodera_end(openair0_device *device) static int trx_sodera_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { - sodera_state_t *s = (sodera_state_t*)device->priv; + sodera_t *s = (sodera_t*)device->priv; if (cc>1) { // s->tx_stream->send(buff_ptrs, nsamps, s->tx_md); @@ -145,7 +135,7 @@ static int trx_sodera_write(openair0_device *device, openair0_timestamp timestam static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { - sodera_state_t *s = (sodera_state_t*)device->priv; + sodera_t *s = (sodera_t*)device->priv; int samples_received=0,i,j; int nsamps2; // aligned to upper 32 or 16 byte boundary #if defined(__x86_64) || defined(__i386__) @@ -193,7 +183,7 @@ static bool is_equal(double a, double b) int trx_sodera_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) { - sodera_state_t *s = (sodera_state_t*)device->priv; + sodera_t *s = (sodera_t*)device->priv; // s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[0]); // s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[0]); @@ -204,7 +194,7 @@ int trx_sodera_set_freq(openair0_device* device, openair0_config_t *openair0_cfg int openair0_set_rx_frequencies(openair0_device* device, openair0_config_t *openair0_cfg) { - sodera_state_t *s = (sodera_state_t*)device->priv; + sodera_t *s = (sodera_t*)device->priv; static int first_call=1; static double rf_freq,diff; @@ -222,7 +212,7 @@ int openair0_set_rx_frequencies(openair0_device* device, openair0_config_t *open int trx_sodera_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { - sodera_state_t *s = (sodera_state_t*)device->priv; + sodera_t *s = (sodera_t*)device->priv; // s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[0]); // ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(0); @@ -313,7 +303,7 @@ int trx_sodera_reset_stats(openair0_device* device) { int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair0_cfg) { - sodera_state_t *s=&sodera_state; + sodera_t *s=&sodera_state; size_t i; @@ -332,8 +322,7 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair (int)devInfo.hardware, (int)devInfo.firmware, (int)devInfo.protocol); - LMS7002M lmsControl(&s->Port); - + printf("Configuring Si5351C\n"); s->Si.Initialize(&s->Port); s->Si.SetPLL(0, 25000000, 0); @@ -396,29 +385,32 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair break; } + + s->lmsControl = LMS7002M(&s->Port); + liblms7_status opStatus; - lmsControl.ResetChip(); - opStatus = lmsControl.LoadConfig(openair0_cfg[0].configFilename); + s->lmsControl.ResetChip(); + opStatus = s->lmsControl.LoadConfig(openair0_cfg[0].configFilename); if (opStatus != LIBLMS7_SUCCESS) { printf("Failed to load configuration file %s\n",openair0_cfg[0].configFilename); exit(-1); } - opStatus = lmsControl.UploadAll(); + opStatus = s->lmsControl.UploadAll(); if (opStatus != LIBLMS7_SUCCESS) { printf("Failed to upload configuration file\n"); exit(-1); } - opStatus = lmsControl.SetFrequencySX(LMS7002M::Tx, openair0_cfg[0].tx_freq[0]/1e6,30.72); + opStatus = s->lmsControl.SetFrequencySX(LMS7002M::Tx, openair0_cfg[0].tx_freq[0]/1e6,30.72); if (opStatus != LIBLMS7_SUCCESS) { printf("Cannot set TX frequency %f MHz\n",openair0_cfg[0].tx_freq[0]/1e6); exit(-1); } - opStatus = lmsControl.SetFrequencySX(LMS7002M::Rx, openair0_cfg[0].rx_freq[0]/1e6,30.72); + opStatus = s->lmsControl.SetFrequencySX(LMS7002M::Rx, openair0_cfg[0].rx_freq[0]/1e6,30.72); if (opStatus != LIBLMS7_SUCCESS) { printf("Cannot set RX frequency %f MHz\n",openair0_cfg[0].rx_freq[0]/1e6); @@ -428,12 +420,12 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair // this makes RX/TX sampling rates equal - opStatus = lmsControl.Modify_SPI_Reg_bits(EN_ADCCLKH_CLKGN,0); + opStatus = s->lmsControl.Modify_SPI_Reg_bits(EN_ADCCLKH_CLKGN,0); if (opStatus != LIBLMS7_SUCCESS) { printf("Cannot modify SPI (EN_ADCCLKH_CLKGN)\n"); exit(-1); } - opStatus = lmsControl.Modify_SPI_Reg_bits(CLKH_OV_CLKL_CGEN,2); + opStatus = s->lmsControl.Modify_SPI_Reg_bits(CLKH_OV_CLKL_CGEN,2); if (opStatus != LIBLMS7_SUCCESS) { printf("Cannot modify SPI (CLKH_OV_CLKL_CGEN)\n"); exit(-1); @@ -442,26 +434,34 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair const float cgen_freq_MHz = 245.76; const int interpolation = 0; // real interpolation = 2 const int decimation = 0; // real decimation = 2 - opStatus = lmsControl.SetInterfaceFrequency(cgen_freq_MHz,interpolation,decimation); + opStatus = s->lmsControl.SetInterfaceFrequency(cgen_freq_MHz,interpolation,decimation); if (opStatus != LIBLMS7_SUCCESS) { printf("Cannot SetInterfaceFrequency (%f,%d,%d)\n",cgen_freq_MHz,interpolation,decimation); exit(-1); } // Run calibration procedure float txrx_calibrationBandwidth_MHz = 5; - opStatus = lmsControl.CalibrateTx(txrx_calibrationBandwidth_MHz); + opStatus = s->lmsControl.CalibrateTx(txrx_calibrationBandwidth_MHz); if (opStatus != LIBLMS7_SUCCESS){ printf("TX Calibration failed\n"); exit(-1); } - opStatus = lmsControl.CalibrateRx(txrx_calibrationBandwidth_MHz); + opStatus = s->lmsControl.CalibrateRx(txrx_calibrationBandwidth_MHz); if (opStatus != LIBLMS7_SUCCESS){ printf("RX Calibration failed\n"); exit(-1); } - + + + s->lmsStream = new LMS_StreamBoard(&s->Port); + LMS_StreamBoard::Status opStreamStatus; // this will configure that sampling rate at output of FPGA - // LMS_StreamBoard::ConfigurePLL(&s->Port,openair0_cfg[0].sample_rate,openair0_cfg[0].sample_rate,90); + opStreamStatus = s->lmsStream->ConfigurePLL(&s->Port,openair0_cfg[0].sample_rate,openair0_cfg[0].sample_rate,90); + if (opStatus != LIBLMS7_SUCCESS){ + printf("Sample rate programming failed\n"); + exit(-1); + } + /* ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); // limit to maximum gain From 9d4f383421836dff5bc62acc47dd240bfa623485 Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Thu, 28 Jan 2016 20:21:38 +0100 Subject: [PATCH 034/122] first integration. doesn't compile. --- .../ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp | 212 +++++++++++++++--- 1 file changed, 186 insertions(+), 26 deletions(-) diff --git a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp index 5914ff5be6..e5b9107251 100644 --- a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp +++ b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp @@ -68,6 +68,8 @@ int num_devices=0; /*These items configure the underlying asynch stream used by the the sync interface. */ +#define BUFFERSIZE 65536 +#define BUFFERSCOUNT 16 // must be a power of 2 typedef struct { @@ -80,10 +82,16 @@ typedef struct LMS7002M lmsControl; LMS_StreamBoard *lmsStream; + uint8_t buffers_rx[BUFFERSIZE*BUFFERSCOUNT]; + int handles[BUFFERSCOUNT]; + int last_handle; + int samples_left_buffer; + double sample_rate; // time offset between transmiter timestamp and receiver timestamp; double tdiff; + int channelscount; // -------------------------------- // Debug and output control // -------------------------------- @@ -97,17 +105,86 @@ typedef struct } sodera_t; +typedef struct { + uint8_t reserved[8]; + uint64_t counter; + uint8_t data[4080]; +} StreamPacket_t; + sodera_t sodera_state; +enum STATUS { + SUCCESS, + FAILURE +}; + +STATUS SPI_write(LMScomms* dataPort, uint16_t address, uint16_t data) +{ + assert(dataPort != nullptr); + LMScomms::GenericPacket ctrPkt; + ctrPkt.cmd = CMD_BRDSPI_WR; + ctrPkt.outBuffer.push_back((address >> 8) & 0xFF); + ctrPkt.outBuffer.push_back(address & 0xFF); + ctrPkt.outBuffer.push_back((data >> 8) & 0xFF); + ctrPkt.outBuffer.push_back(data & 0xFF); + dataPort->TransferPacket(ctrPkt); + return ctrPkt.status == 1 ? SUCCESS : FAILURE; +} + +uint16_t SPI_read(LMScomms* dataPort, uint16_t address) +{ + assert(dataPort != nullptr); + LMScomms::GenericPacket ctrPkt; + ctrPkt.cmd = CMD_BRDSPI_RD; + ctrPkt.outBuffer.push_back((address >> 8) & 0xFF); + ctrPkt.outBuffer.push_back(address & 0xFF); + dataPort->TransferPacket(ctrPkt); + if (ctrPkt.inBuffer.size() > 4) + return ctrPkt.inBuffer[2] * 256 + ctrPkt.inBuffer[3]; + else + return 0; +} + static int trx_sodera_start(openair0_device *device) { sodera_t *s = (sodera_t*)device->priv; + const int buffersCountMask = buffersCount-1; + // init recv and send streaming s->rx_count = 0; s->tx_count = 0; s->rx_timestamp = 0; + s->current_handle = 0; + + // switch off RX + uint16_t regVal = SPI_read(s->Port,0x0005); + SPI_write(s->port,0x0005,regVal & ~0x6); + + if (s->channelscount==2) { + SPI_write(s->Port,0x0001,0x0003); + SPI_write(s->Port,0x0007,0x000A); + } + else { + SPI_write(s->Port,0x0001,0x0001); + SPI_write(s->Port,0x0007,0x0008); + } + + // USB FIFO reset + LMScomms::GenericPacket ctrPkt; + ctrPkt.cmd = CMD_USR_FIFO_RST; + ctrPkt.outBuffer.push_back(0x01); + s->Port.TransferPacket(ctrPkt); + ctrPkt.outBuffer[0]=0x00; + s->Port.TransferPacket(ctrPkt); + + uint16_t regVal = SPI_read(s->Port,0x0005); + // provide timestamp, set streamTXEN, set TX/RX enable + SPI_write(s->port,0x0005,(regVal & ~0x20) | 0x6); + + for (int i=0; i< BUFFERSCOUNT ; i++) + s->handles[i] = s->Port.BeginDataReading(&s->buffers[i*BUFFERSIZE],BUFFERSIZE); return 0; } @@ -117,7 +194,10 @@ static void trx_sodera_end(openair0_device *device) sodera_t *s = (sodera_t*)device->priv; - + // stop TX/RX if they were active + regVal = SPI_read(s->Port,0x0005); + SPI_write(s->Port,0x0005,regVal & ~0x6); + } static int trx_sodera_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) @@ -138,36 +218,114 @@ static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimesta sodera_t *s = (sodera_t*)device->priv; int samples_received=0,i,j; int nsamps2; // aligned to upper 32 or 16 byte boundary -#if defined(__x86_64) || defined(__i386__) -#ifdef __AVX2__ - __m256i buff_tmp[2][nsamps>>3]; - nsamps2 = (nsamps+7)>>3; -#else - __m128i buff_tmp[2][nsamps>>2]; - nsamps2 = (nsamps+3)>>2; -#endif -#elif defined(__arm__) - int16x8_t buff_tmp[2][nsamps>>2]; - nsamps2 = (nsamps+3)>>2; -#endif + StreamPacket_t *p; + int16_t sampleI,sampleQ; + uint8_t *pktStart; + int offset = 0; + int num_p; + int ind=0; - - if (cc>1) { - // receive multiple channels (e.g. RF A and RF B) - - } else { - // receive a single channel (e.g. from connector RF A) - - } + // this assumes that each request is of size 4096 bytes (spp = 4080/4/channelscount) - if (samples_received < nsamps) { - printf("[recv] received %d samples out of %d\n",samples_received,nsamps); + // first get rid of remaining samples + if (s->samples_left_buffer > 0) { + buffsize = min(s->samples_left_buffer,nsamps); + pktStart = &s->buffers_rx[(s->last_handle-1)*BUFFERSIZE].data; + pktStart -= (spp-s->samples_left_buffer); + const int stepSize = s->channelscount * 3; + + for (int b=0;bchannelscount;ch++) { + // I sample + sampleI = (pktStart[b + 1 + 3*ch]&0x0F)<<8; + sampleI |= (pktStart[b + 3*ch]&0xFF); + sampleI = (sampleI<<4)>>4; + // Q sample + sampleQ = (pktStart[b + 2 + 3*ch]&0x0F)<<8; + sampleQ |= (pktStart[b + 1 + 3*ch]&0xFF); + sampleQ = (sampleQ<<4)>>4; + ((uint32_t*)buff[ch])[ind] = ((uint32_t)sampleI) | (((uint32_t)sampleQ)<<16); + } + ind++; + } + } + if (ind == nsamps) { + s->samples_left_buffer -= nsamps; + s->rx_count += nsamps; + s->rx_timestamp += s->last_transfer; + *ptimestamp = s->rx_timestamp; + s->last_transfer = nsamps; + + return(nsamps); + } + else { + s->samples_left_buffer = 0; + nsamps -= ind; + samples_received = ind; + } + + // This is for the left-over part => READ from USB + + + spp = sizeof(p->data)>>2; // spp = size of payload in samples + spp /= s->channelscount; + + num_p = nsamps / spp; + if ((nsamps%spp) > 0) + num_p++; + s->samples_left_buffer = (num_p*spp)-nsamps; + for (int i=0;ihandles[i] = s->Port.BeginDataReading(&buffers_rx[i*BUFFERSIZE],BUFFERSIZE); + s->last_handle = num_p; + + + const int stepSize = s->channelscount * 3; + + for (i=0;iPort.WaitForReading(s->handles[i],1000) == false) { + printf("[recv] Error: request %d samples (%d/%d) WaitForReading timed out\n",nsamps,i,num_p); + return(samples_received); + } + if ((ret=Port.FinishDataReading(&s->buffers_rx[i*BUFFERSIZE],BUFFERSIZE,s->handles[i])) != BUFFERSIZE) { + printf("[recv] Error: request %d samples (%d/%d) WaitForReading timed out\n",nsamps,i,num_p); + return(samples_received); + } - } + p = (StreamPacket_t*)&s->buffers_rx[i*BUFFERSIZE]; + // handle timestamp + if ((i==0) & (ind==0)) { // grab the timestamp from HW + s->rx_timestamp = p->counter; + } + else { // check the timestamp + if (i==0) { + if ((s->rx_timestamp + ind) != p->counter) { + printf("Error, RX timestamp error, got %llu, should be %llu\n",p->counter,s->rx_timestamp+ind); + return(ind); + } + } + } + pktStart = &p->data; + for (uint16_t b=0;bdata);n+=stepSize) { + for (int ch=0;ch < s->channelscount;ch++) { + // I sample + sampleI = (pktStart[b + 1 + 3*ch]&0x0F)<<8; + sampleI |= (pktStart[b + 3*ch]&0xFF); + sampleI = (sampleI<<4)>>4; + // Q sample + sampleQ = (pktStart[b + 2 + 3*ch]&0x0F)<<8; + sampleQ |= (pktStart[b + 1 + 3*ch]&0xFF); + sampleQ = (sampleQ<<4)>>4; + ((uint32_t*)buff[ch])[ind] = ((uint32_t)sampleI) | (((uint32_t)sampleQ)<<16); + } + ind++; + } + samples_received+=spp; + } //handle the error code - s->rx_count += nsamps; + s->rx_count += samples_received; // s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate); *ptimestamp = s->rx_timestamp; @@ -531,7 +689,9 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair device->trx_set_freq_func = trx_sodera_set_freq; device->trx_set_gains_func = trx_sodera_set_gains; - s->sample_rate = openair0_cfg[0].sample_rate; + s->sample_rate = openair0_cfg[0].sample_rate; + s->channelscount = openair0_cfg[0].rx_num_channels; + // TODO: exit(-1); return 0; From ec96a43dc35b7cdaaf3251b45d223145ebfa4b1a Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 28 Jan 2016 23:24:17 -0800 Subject: [PATCH 035/122] integration, compiles now. --- .../ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp index e5b9107251..85dd0a6032 100644 --- a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp +++ b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp @@ -68,8 +68,8 @@ int num_devices=0; /*These items configure the underlying asynch stream used by the the sync interface. */ -#define BUFFERSIZE 65536 -#define BUFFERSCOUNT 16 // must be a power of 2 +#define BUFFERSIZE 4096 +#define BUFFERSCOUNT 32 typedef struct { @@ -82,10 +82,11 @@ typedef struct LMS7002M lmsControl; LMS_StreamBoard *lmsStream; - uint8_t buffers_rx[BUFFERSIZE*BUFFERSCOUNT]; + char buffers_rx[BUFFERSIZE*BUFFERSCOUNT]; int handles[BUFFERSCOUNT]; - int last_handle; + int current_handle; int samples_left_buffer; + int last_transfer; double sample_rate; // time offset between transmiter timestamp and receiver timestamp; @@ -108,7 +109,7 @@ typedef struct typedef struct { uint8_t reserved[8]; uint64_t counter; - uint8_t data[4080]; + char data[4080]; } StreamPacket_t; sodera_t sodera_state; @@ -149,7 +150,6 @@ static int trx_sodera_start(openair0_device *device) { sodera_t *s = (sodera_t*)device->priv; - const int buffersCountMask = buffersCount-1; // init recv and send streaming @@ -157,34 +157,35 @@ static int trx_sodera_start(openair0_device *device) s->tx_count = 0; s->rx_timestamp = 0; s->current_handle = 0; + s->last_transfer = 0; // switch off RX - uint16_t regVal = SPI_read(s->Port,0x0005); - SPI_write(s->port,0x0005,regVal & ~0x6); + uint16_t regVal = SPI_read(&s->Port,0x0005); + SPI_write(&s->Port,0x0005,regVal & ~0x6); if (s->channelscount==2) { - SPI_write(s->Port,0x0001,0x0003); - SPI_write(s->Port,0x0007,0x000A); + SPI_write(&s->Port,0x0001,0x0003); + SPI_write(&s->Port,0x0007,0x000A); } else { - SPI_write(s->Port,0x0001,0x0001); - SPI_write(s->Port,0x0007,0x0008); + SPI_write(&s->Port,0x0001,0x0001); + SPI_write(&s->Port,0x0007,0x0008); } // USB FIFO reset LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_USR_FIFO_RST; + ctrPkt.cmd = CMD_USB_FIFO_RST; ctrPkt.outBuffer.push_back(0x01); s->Port.TransferPacket(ctrPkt); ctrPkt.outBuffer[0]=0x00; s->Port.TransferPacket(ctrPkt); - uint16_t regVal = SPI_read(s->Port,0x0005); + regVal = SPI_read(&s->Port,0x0005); // provide timestamp, set streamTXEN, set TX/RX enable - SPI_write(s->port,0x0005,(regVal & ~0x20) | 0x6); + SPI_write(&s->Port,0x0005,(regVal & ~0x20) | 0x6); for (int i=0; i< BUFFERSCOUNT ; i++) - s->handles[i] = s->Port.BeginDataReading(&s->buffers[i*BUFFERSIZE],BUFFERSIZE); + s->handles[i] = s->Port.BeginDataReading(&s->buffers_rx[i*BUFFERSIZE],BUFFERSIZE); return 0; } @@ -195,8 +196,8 @@ static void trx_sodera_end(openair0_device *device) // stop TX/RX if they were active - regVal = SPI_read(s->Port,0x0005); - SPI_write(s->Port,0x0005,regVal & ~0x6); + uint16_t regVal = SPI_read(&s->Port,0x0005); + SPI_write(&s->Port,0x0005,regVal & ~0x6); } @@ -204,11 +205,6 @@ static int trx_sodera_write(openair0_device *device, openair0_timestamp timestam { sodera_t *s = (sodera_t*)device->priv; - if (cc>1) { - // s->tx_stream->send(buff_ptrs, nsamps, s->tx_md); - } - else - // s->tx_stream->send(buff[0], nsamps, s->tx_md); return 0; } @@ -220,18 +216,23 @@ static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimesta int nsamps2; // aligned to upper 32 or 16 byte boundary StreamPacket_t *p; int16_t sampleI,sampleQ; - uint8_t *pktStart; + char *pktStart; int offset = 0; int num_p; int ind=0; + int buffsize; + int spp; // this assumes that each request is of size 4096 bytes (spp = 4080/4/channelscount) - + spp = sizeof(p->data)>>2; // spp = size of payload in samples + spp /= s->channelscount; + + // first get rid of remaining samples if (s->samples_left_buffer > 0) { buffsize = min(s->samples_left_buffer,nsamps); - pktStart = &s->buffers_rx[(s->last_handle-1)*BUFFERSIZE].data; - pktStart -= (spp-s->samples_left_buffer); + pktStart = ((StreamPacket_t*)&s->buffers_rx[(s->current_handle-1)*BUFFERSIZE])->data; + pktStart += (spp-s->samples_left_buffer); const int stepSize = s->channelscount * 3; for (int b=0;b READ from USB - spp = sizeof(p->data)>>2; // spp = size of payload in samples - spp /= s->channelscount; num_p = nsamps / spp; if ((nsamps%spp) > 0) num_p++; s->samples_left_buffer = (num_p*spp)-nsamps; for (int i=0;ihandles[i] = s->Port.BeginDataReading(&buffers_rx[i*BUFFERSIZE],BUFFERSIZE); - s->last_handle = num_p; + s->handles[i] = s->Port.BeginDataReading(&s->buffers_rx[i*BUFFERSIZE],BUFFERSIZE); + s->current_handle = num_p; const int stepSize = s->channelscount * 3; @@ -287,7 +286,8 @@ static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimesta printf("[recv] Error: request %d samples (%d/%d) WaitForReading timed out\n",nsamps,i,num_p); return(samples_received); } - if ((ret=Port.FinishDataReading(&s->buffers_rx[i*BUFFERSIZE],BUFFERSIZE,s->handles[i])) != BUFFERSIZE) { + long bytesToRead=BUFFERSIZE; + if (s->Port.FinishDataReading(&s->buffers_rx[i*BUFFERSIZE],bytesToRead,s->handles[i]) != BUFFERSIZE) { printf("[recv] Error: request %d samples (%d/%d) WaitForReading timed out\n",nsamps,i,num_p); return(samples_received); } @@ -305,8 +305,8 @@ static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimesta } } } - pktStart = &p->data; - for (uint16_t b=0;bdata);n+=stepSize) { + pktStart = p->data; + for (uint16_t b=0;bdata);b+=stepSize) { for (int ch=0;ch < s->channelscount;ch++) { // I sample sampleI = (pktStart[b + 1 + 3*ch]&0x0F)<<8; From 2b5f756d47c6ae578f00a1a05ff59b84f5784dda Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Fri, 29 Jan 2016 09:45:28 +0100 Subject: [PATCH 036/122] getting ready for rename --- .../ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp | 89 +- targets/ARCH/SODERA/lms7_trx_LTE_mimo_RF.ini | 1128 ----------------- targets/ARCH/SODERA/lms7_trx_LTE_mimo_TSG.ini | 1128 ----------------- .../CONF/enb.band7.tm1.50PRB.bladerfx40.conf | 8 +- 4 files changed, 61 insertions(+), 2292 deletions(-) delete mode 100644 targets/ARCH/SODERA/lms7_trx_LTE_mimo_RF.ini delete mode 100644 targets/ARCH/SODERA/lms7_trx_LTE_mimo_TSG.ini diff --git a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp index 85dd0a6032..30a2106b34 100644 --- a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp +++ b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp @@ -86,7 +86,6 @@ typedef struct int handles[BUFFERSCOUNT]; int current_handle; int samples_left_buffer; - int last_transfer; double sample_rate; // time offset between transmiter timestamp and receiver timestamp; @@ -153,16 +152,34 @@ static int trx_sodera_start(openair0_device *device) // init recv and send streaming + printf("Starting LMS Streaming\n"); s->rx_count = 0; s->tx_count = 0; s->rx_timestamp = 0; s->current_handle = 0; - s->last_transfer = 0; // switch off RX uint16_t regVal = SPI_read(&s->Port,0x0005); SPI_write(&s->Port,0x0005,regVal & ~0x6); + + + + + + // USB FIFO reset + LMScomms::GenericPacket ctrPkt; + ctrPkt.cmd = CMD_USB_FIFO_RST; + ctrPkt.outBuffer.push_back(0x01); + s->Port.TransferPacket(ctrPkt); + ctrPkt.outBuffer[0]=0x00; + s->Port.TransferPacket(ctrPkt); + + regVal = SPI_read(&s->Port,0x0005); + // provide timestamp, set streamTXEN, set TX/RX enable + SPI_write(&s->Port,0x0005,(regVal & ~0x20) | 0x6); + + if (s->channelscount==2) { SPI_write(&s->Port,0x0001,0x0003); SPI_write(&s->Port,0x0007,0x000A); @@ -172,21 +189,10 @@ static int trx_sodera_start(openair0_device *device) SPI_write(&s->Port,0x0007,0x0008); } - // USB FIFO reset - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_USB_FIFO_RST; - ctrPkt.outBuffer.push_back(0x01); - s->Port.TransferPacket(ctrPkt); - ctrPkt.outBuffer[0]=0x00; - s->Port.TransferPacket(ctrPkt); - - regVal = SPI_read(&s->Port,0x0005); - // provide timestamp, set streamTXEN, set TX/RX enable - SPI_write(&s->Port,0x0005,(regVal & ~0x20) | 0x6); for (int i=0; i< BUFFERSCOUNT ; i++) s->handles[i] = s->Port.BeginDataReading(&s->buffers_rx[i*BUFFERSIZE],BUFFERSIZE); - + printf("Armed %d transfers\n",BUFFERSCOUNT); return 0; } @@ -209,6 +215,8 @@ static int trx_sodera_write(openair0_device *device, openair0_timestamp timestam return 0; } +#define DEBUG_READ 1 + static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { sodera_t *s = (sodera_t*)device->priv; @@ -222,16 +230,21 @@ static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimesta int ind=0; int buffsize; int spp; + int bufindex; // this assumes that each request is of size 4096 bytes (spp = 4080/4/channelscount) spp = sizeof(p->data)>>2; // spp = size of payload in samples spp /= s->channelscount; - +#ifdef DEBUG_READ + printf("\nIn trx_read\n"); + printf("s->current_handle %d\n", s->current_handle); + printf("s->samples_left_buffer %d\n",s->samples_left_buffer); +#endif // first get rid of remaining samples if (s->samples_left_buffer > 0) { buffsize = min(s->samples_left_buffer,nsamps); - pktStart = ((StreamPacket_t*)&s->buffers_rx[(s->current_handle-1)*BUFFERSIZE])->data; + pktStart = ((StreamPacket_t*)&s->buffers_rx[s->current_handle*BUFFERSIZE])->data; pktStart += (spp-s->samples_left_buffer); const int stepSize = s->channelscount * 3; @@ -253,10 +266,9 @@ static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimesta if (ind == nsamps) { s->samples_left_buffer -= nsamps; s->rx_count += nsamps; - s->rx_timestamp += s->last_transfer; *ptimestamp = s->rx_timestamp; - s->last_transfer = nsamps; - + s->rx_timestamp+=nsamps; + return(nsamps); } else { @@ -273,29 +285,38 @@ static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimesta if ((nsamps%spp) > 0) num_p++; s->samples_left_buffer = (num_p*spp)-nsamps; - for (int i=0;ihandles[i] = s->Port.BeginDataReading(&s->buffers_rx[i*BUFFERSIZE],BUFFERSIZE); - s->current_handle = num_p; - + +#ifdef DEBUG_READ + printf("num_p %d\n",num_p); +#endif const int stepSize = s->channelscount * 3; for (i=0;iPort.WaitForReading(s->handles[i],1000) == false) { - printf("[recv] Error: request %d samples (%d/%d) WaitForReading timed out\n",nsamps,i,num_p); + bufindex = (s->current_handle+i)&(BUFFERSCOUNT-1); + if (s->Port.WaitForReading(s->handles[bufindex],1000) == false) { + printf("[recv] Error: request %d samples (%d/%d) WaitForReading timed out\n",nsamps,bufindex,num_p); + *ptimestamp = s->rx_timestamp; + s->rx_timestamp+=samples_received; return(samples_received); } long bytesToRead=BUFFERSIZE; - if (s->Port.FinishDataReading(&s->buffers_rx[i*BUFFERSIZE],bytesToRead,s->handles[i]) != BUFFERSIZE) { - printf("[recv] Error: request %d samples (%d/%d) WaitForReading timed out\n",nsamps,i,num_p); + if (s->Port.FinishDataReading(&s->buffers_rx[bufindex*BUFFERSIZE],bytesToRead,s->handles[bufindex]) != BUFFERSIZE) { + printf("[recv] Error: request %d samples (%d/%d) WaitForReading timed out\n",nsamps,bufindex,num_p); + *ptimestamp = s->rx_timestamp; + s->rx_timestamp+=samples_received; return(samples_received); } - p = (StreamPacket_t*)&s->buffers_rx[i*BUFFERSIZE]; + p = (StreamPacket_t*)&s->buffers_rx[bufindex*BUFFERSIZE]; // handle timestamp if ((i==0) & (ind==0)) { // grab the timestamp from HW - s->rx_timestamp = p->counter; + *ptimestamp = p->counter; + s->rx_timestamp = p->counter+nsamps; // for next time +#ifdef DEBUG_READ + printf("RX timestamp %d\n",s->rx_timestamp); +#endif } else { // check the timestamp if (i==0) { @@ -304,6 +325,8 @@ static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimesta return(ind); } } + *ptimestamp = s->rx_timestamp; + s->rx_timestamp+=nsamps; } pktStart = p->data; for (uint16_t b=0;bdata);b+=stepSize) { @@ -321,13 +344,15 @@ static int trx_sodera_read(openair0_device *device, openair0_timestamp *ptimesta ind++; } samples_received+=spp; + // schedule a new transmission for this index + s->handles[bufindex] = s->Port.BeginDataReading(&s->buffers_rx[bufindex*BUFFERSIZE],BUFFERSIZE); + s->current_handle=(s->current_handle+1)&(BUFFERSCOUNT-1); } //handle the error code s->rx_count += samples_received; // s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate); - *ptimestamp = s->rx_timestamp; return samples_received; } @@ -597,6 +622,7 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair printf("Cannot SetInterfaceFrequency (%f,%d,%d)\n",cgen_freq_MHz,interpolation,decimation); exit(-1); } + /* // Run calibration procedure float txrx_calibrationBandwidth_MHz = 5; opStatus = s->lmsControl.CalibrateTx(txrx_calibrationBandwidth_MHz); @@ -609,7 +635,7 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair printf("RX Calibration failed\n"); exit(-1); } - + */ s->lmsStream = new LMS_StreamBoard(&s->Port); LMS_StreamBoard::Status opStreamStatus; @@ -693,6 +719,5 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair s->channelscount = openair0_cfg[0].rx_num_channels; // TODO: - exit(-1); return 0; } diff --git a/targets/ARCH/SODERA/lms7_trx_LTE_mimo_RF.ini b/targets/ARCH/SODERA/lms7_trx_LTE_mimo_RF.ini deleted file mode 100644 index e0e313b23e..0000000000 --- a/targets/ARCH/SODERA/lms7_trx_LTE_mimo_RF.ini +++ /dev/null @@ -1,1128 +0,0 @@ -[file_info] -type=lms7002m_minimal_config -version=1 -[lms7002_registers_a] -0x0020=0xFFFD -0x0021=0x0E9F -0x0022=0x07FF -0x0023=0x5550 -0x0024=0xE4E4 -0x0025=0x0101 -0x0026=0x0101 -0x0027=0xB1E4 -0x0028=0x0101 -0x0029=0x0101 -0x002A=0x0086 -0x002B=0x0038 -0x002C=0x0000 -0x002D=0xFFFF -0x002E=0x0000 -0x002F=0x3840 -0x0081=0x0000 -0x0082=0x8001 -0x0084=0x0400 -0x0085=0x0001 -0x0086=0x4101 -0x0087=0xB13B -0x0088=0x0303 -0x0089=0x1078 -0x008A=0x0514 -0x008B=0x2182 -0x008C=0x267B -0x0092=0x0001 -0x0093=0x0000 -0x0094=0x0000 -0x0095=0x0000 -0x0096=0x0000 -0x0097=0x0000 -0x0098=0x0000 -0x0099=0x6565 -0x009A=0x658C -0x009B=0x6565 -0x009C=0x658C -0x009D=0x6565 -0x009E=0x658C -0x009F=0x658C -0x00A0=0x6565 -0x00A1=0x6565 -0x00A2=0x6565 -0x00A3=0x6565 -0x00A4=0x6565 -0x00A5=0x6565 -0x00A6=0x0001 -0x00A7=0x6565 -0x00A8=0x0000 -0x00A9=0x8000 -0x00AA=0x0000 -0x00AB=0x0040 -0x00AC=0x2000 -0x00AD=0x03FF -0x00AE=0x0000 -0x0100=0x7409 -0x0101=0x7800 -0x0102=0x3180 -0x0103=0x0A12 -0x0104=0x0088 -0x0105=0x0007 -0x0106=0x3182 -0x0107=0x318C -0x0108=0x3042 -0x0109=0x61C1 -0x010A=0x104C -0x010C=0x8865 -0x010D=0x019D -0x010E=0x2040 -0x010F=0x3042 -0x0110=0x0BF4 -0x0111=0x0083 -0x0112=0xC0E6 -0x0113=0x03C3 -0x0114=0x008D -0x0115=0x0009 -0x0116=0x8180 -0x0117=0x280C -0x0118=0x018C -0x0119=0x18CB -0x011A=0x2E02 -0x011C=0xA941 -0x011D=0x4EC4 -0x011E=0x048C -0x011F=0x3640 -0x0120=0xB9FF -0x0121=0x3158 -0x0122=0x033F -0x0123=0x267B -0x0124=0x0000 -0x0200=0x0081 -0x0201=0x07B0 -0x0202=0x06F2 -0x0203=0x0FC2 -0x0204=0xD51F -0x0205=0x0000 -0x0206=0x0000 -0x0207=0x0000 -0x0208=0x0170 -0x0209=0x0000 -0x020A=0x0080 -0x020B=0x4000 -0x020C=0x7FFF -0x0240=0x0020 -0x0241=0x0000 -0x0242=0x0000 -0x0243=0x0000 -0x0244=0x0000 -0x0245=0x0000 -0x0246=0x0000 -0x0247=0x0000 -0x0248=0x0000 -0x0249=0x0000 -0x024A=0x0000 -0x024B=0x0000 -0x024C=0x0000 -0x024D=0x0000 -0x024E=0x0000 -0x024F=0x0000 -0x0250=0x0000 -0x0251=0x0000 -0x0252=0x0000 -0x0253=0x0000 -0x0254=0x0000 -0x0255=0x0000 -0x0256=0x0000 -0x0257=0x0000 -0x0258=0x0000 -0x0259=0x0000 -0x025A=0x0000 -0x025B=0x0000 -0x025C=0x0000 -0x025D=0x0000 -0x025E=0x0000 -0x025F=0x0000 -0x0260=0x0000 -0x0261=0x0000 -0x0280=0x0000 -0x0281=0x0000 -0x0282=0x0000 -0x0283=0x0000 -0x0284=0x0000 -0x0285=0x0000 -0x0286=0x0000 -0x0287=0x0000 -0x0288=0x0000 -0x0289=0x0000 -0x028A=0x0000 -0x028B=0x0000 -0x028C=0x0000 -0x028D=0x0000 -0x028E=0x0000 -0x028F=0x0000 -0x0290=0x0000 -0x0291=0x0000 -0x0292=0x0000 -0x0293=0x0000 -0x0294=0x0000 -0x0295=0x0000 -0x0296=0x0000 -0x0297=0x0000 -0x0298=0x0000 -0x0299=0x0000 -0x029A=0x0000 -0x029B=0x0000 -0x029C=0x0000 -0x029D=0x0000 -0x029E=0x0000 -0x029F=0x0000 -0x02A0=0x0000 -0x02A1=0x0000 -0x02A2=0x0000 -0x02A3=0x0000 -0x02A4=0x0000 -0x02A5=0x0000 -0x02A6=0x0000 -0x02A7=0x0000 -0x02C0=0x0000 -0x02C1=0x0000 -0x02C2=0x0000 -0x02C3=0x0000 -0x02C4=0x0000 -0x02C5=0x0000 -0x02C6=0x0000 -0x02C7=0x0000 -0x02C8=0x0000 -0x02C9=0x0000 -0x02CA=0x0000 -0x02CB=0x0000 -0x02CC=0x0000 -0x02CD=0x0000 -0x02CE=0x0000 -0x02CF=0x0000 -0x02D0=0x0000 -0x02D1=0x0000 -0x02D2=0x0000 -0x02D3=0x0000 -0x02D4=0x0000 -0x02D5=0x0000 -0x02D6=0x0000 -0x02D7=0x0000 -0x02D8=0x0000 -0x02D9=0x0000 -0x02DA=0x0000 -0x02DB=0x0000 -0x02DC=0x0000 -0x02DD=0x0000 -0x02DE=0x0000 -0x02DF=0x0000 -0x02E0=0x0000 -0x02E1=0x0000 -0x02E2=0x0000 -0x02E3=0x0000 -0x02E4=0x0000 -0x02E5=0x0000 -0x02E6=0x0000 -0x02E7=0x0000 -0x0300=0x0000 -0x0301=0x0000 -0x0302=0x0000 -0x0303=0x0000 -0x0304=0x0000 -0x0305=0x0000 -0x0306=0x0000 -0x0307=0x0000 -0x0308=0x0000 -0x0309=0x0000 -0x030A=0x0000 -0x030B=0x0000 -0x030C=0x0000 -0x030D=0x0000 -0x030E=0x0000 -0x030F=0x0000 -0x0310=0x0000 -0x0311=0x0000 -0x0312=0x0000 -0x0313=0x0000 -0x0314=0x0000 -0x0315=0x0000 -0x0316=0x0000 -0x0317=0x0000 -0x0318=0x0000 -0x0319=0x0000 -0x031A=0x0000 -0x031B=0x0000 -0x031C=0x0000 -0x031D=0x0000 -0x031E=0x0000 -0x031F=0x0000 -0x0320=0x0000 -0x0321=0x0000 -0x0322=0x0000 -0x0323=0x0000 -0x0324=0x0000 -0x0325=0x0000 -0x0326=0x0000 -0x0327=0x0000 -0x0340=0x0000 -0x0341=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0344=0x0000 -0x0345=0x0000 -0x0346=0x0000 -0x0347=0x0000 -0x0348=0x0000 -0x0349=0x0000 -0x034A=0x0000 -0x034B=0x0000 -0x034C=0x0000 -0x034D=0x0000 -0x034E=0x0000 -0x034F=0x0000 -0x0350=0x0000 -0x0351=0x0000 -0x0352=0x0000 -0x0353=0x0000 -0x0354=0x0000 -0x0355=0x0000 -0x0356=0x0000 -0x0357=0x0000 -0x0358=0x0000 -0x0359=0x0000 -0x035A=0x0000 -0x035B=0x0000 -0x035C=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x035F=0x0000 -0x0360=0x0000 -0x0361=0x0000 -0x0362=0x0000 -0x0363=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0367=0x0000 -0x0380=0x0000 -0x0381=0x0000 -0x0382=0x0000 -0x0383=0x0000 -0x0384=0x0000 -0x0385=0x0000 -0x0386=0x0000 -0x0387=0x0000 -0x0388=0x0000 -0x0389=0x0000 -0x038A=0x0000 -0x038B=0x0000 -0x038C=0x0000 -0x038D=0x0000 -0x038E=0x0000 -0x038F=0x0000 -0x0390=0x0000 -0x0391=0x0000 -0x0392=0x0000 -0x0393=0x0000 -0x0394=0x0000 -0x0395=0x0000 -0x0396=0x0000 -0x0397=0x0000 -0x0398=0x0000 -0x0399=0x0000 -0x039A=0x0000 -0x039B=0x0000 -0x039C=0x0000 -0x039D=0x0000 -0x039E=0x0000 -0x039F=0x0000 -0x03A0=0x0000 -0x03A1=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x03A6=0x0000 -0x03A7=0x0000 -0x0400=0x0081 -0x0401=0x07FF -0x0402=0x07FF -0x0403=0x0000 -0x0404=0x0000 -0x0405=0x0000 -0x0406=0x0000 -0x0407=0x0000 -0x0408=0x0000 -0x0409=0x0000 -0x040A=0x0003 -0x040B=0x000F -0x040C=0x00FC -0x040D=0x0000 -0x040E=0x0000 -0x040F=0x0000 -0x0440=0x0020 -0x0441=0x0000 -0x0442=0x0563 -0x0443=0xB490 -0x0444=0x02B1 -0x0445=0xDA48 -0x0446=0x0000 -0x0447=0x0000 -0x0448=0x0000 -0x0449=0x0000 -0x044A=0x0000 -0x044B=0x0000 -0x044C=0x0000 -0x044D=0x0000 -0x044E=0x0000 -0x044F=0x0000 -0x0450=0x0000 -0x0451=0x0000 -0x0452=0x0000 -0x0453=0x0000 -0x0454=0x0000 -0x0455=0x0000 -0x0456=0x0000 -0x0457=0x0000 -0x0458=0x0000 -0x0459=0x0000 -0x045A=0x0000 -0x045B=0x0000 -0x045C=0x0000 -0x045D=0x0000 -0x045E=0x0000 -0x045F=0x0000 -0x0460=0x0000 -0x0461=0x0000 -0x0480=0x0000 -0x0481=0x0000 -0x0482=0x0000 -0x0483=0x0000 -0x0484=0x0000 -0x0485=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0488=0x0000 -0x0489=0x0000 -0x048A=0x0000 -0x048B=0x0000 -0x048C=0x0000 -0x048D=0x0000 -0x048E=0x0000 -0x048F=0x0000 -0x0490=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x0493=0x0000 -0x0494=0x0000 -0x0495=0x0000 -0x0496=0x0000 -0x0497=0x0000 -0x0498=0x0000 -0x0499=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x049C=0x0000 -0x049D=0x0000 -0x049E=0x0000 -0x049F=0x0000 -0x04A0=0x0000 -0x04A1=0x0000 -0x04A2=0x0000 -0x04A3=0x0000 -0x04A4=0x0000 -0x04A5=0x0000 -0x04A6=0x0000 -0x04A7=0x0000 -0x04C0=0x0000 -0x04C1=0x0000 -0x04C2=0x0000 -0x04C3=0x0000 -0x04C4=0x0000 -0x04C5=0x0000 -0x04C6=0x0000 -0x04C7=0x0000 -0x04C8=0x0000 -0x04C9=0x0000 -0x04CA=0x0000 -0x04CB=0x0000 -0x04CC=0x0000 -0x04CD=0x0000 -0x04CE=0x0000 -0x04CF=0x0000 -0x04D0=0x0000 -0x04D1=0x0000 -0x04D2=0x0000 -0x04D3=0x0000 -0x04D4=0x0000 -0x04D5=0x0000 -0x04D6=0x0000 -0x04D7=0x0000 -0x04D8=0x0000 -0x04D9=0x0000 -0x04DA=0x0000 -0x04DB=0x0000 -0x04DC=0x0000 -0x04DD=0x0000 -0x04DE=0x0000 -0x04DF=0x0000 -0x04E0=0x0000 -0x04E1=0x0000 -0x04E2=0x0000 -0x04E3=0x0000 -0x04E4=0x0000 -0x04E5=0x0000 -0x04E6=0x0000 -0x04E7=0x0000 -0x0500=0x0000 -0x0501=0x0000 -0x0502=0x0000 -0x0503=0x0000 -0x0504=0x0000 -0x0505=0x0000 -0x0506=0x0000 -0x0507=0x0000 -0x0508=0x0000 -0x0509=0x0000 -0x050A=0x0000 -0x050B=0x0000 -0x050C=0x0000 -0x050D=0x0000 -0x050E=0x0000 -0x050F=0x0000 -0x0510=0x0000 -0x0511=0x0000 -0x0512=0x0000 -0x0513=0x0000 -0x0514=0x0000 -0x0515=0x0000 -0x0516=0x0000 -0x0517=0x0000 -0x0518=0x0000 -0x0519=0x0000 -0x051A=0x0000 -0x051B=0x0000 -0x051C=0x0000 -0x051D=0x0000 -0x051E=0x0000 -0x051F=0x0000 -0x0520=0x0000 -0x0521=0x0000 -0x0522=0x0000 -0x0523=0x0000 -0x0524=0x0000 -0x0525=0x0000 -0x0526=0x0000 -0x0527=0x0000 -0x0540=0x0000 -0x0541=0x0000 -0x0542=0x0000 -0x0543=0x0000 -0x0544=0x0000 -0x0545=0x0000 -0x0546=0x0000 -0x0547=0x0000 -0x0548=0x0000 -0x0549=0x0000 -0x054A=0x0000 -0x054B=0x0000 -0x054C=0x0000 -0x054D=0x0000 -0x054E=0x0000 -0x054F=0x0000 -0x0550=0x0000 -0x0551=0x0000 -0x0552=0x0000 -0x0553=0x0000 -0x0554=0x0000 -0x0555=0x0000 -0x0556=0x0000 -0x0557=0x0000 -0x0558=0x0000 -0x0559=0x0000 -0x055A=0x0000 -0x055B=0x0000 -0x055C=0x0000 -0x055D=0x0000 -0x055E=0x0000 -0x055F=0x0000 -0x0560=0x0000 -0x0561=0x0000 -0x0562=0x0000 -0x0563=0x0000 -0x0564=0x0000 -0x0565=0x0000 -0x0566=0x0000 -0x0567=0x0000 -0x0580=0x0000 -0x0581=0x0000 -0x0582=0x0000 -0x0583=0x0000 -0x0584=0x0000 -0x0585=0x0000 -0x0586=0x0000 -0x0587=0x0000 -0x0588=0x0000 -0x0589=0x0000 -0x058A=0x0000 -0x058B=0x0000 -0x058C=0x0000 -0x058D=0x0000 -0x058E=0x0000 -0x058F=0x0000 -0x0590=0x0000 -0x0591=0x0000 -0x0592=0x0000 -0x0593=0x0000 -0x0594=0x0000 -0x0595=0x0000 -0x0596=0x0000 -0x0597=0x0000 -0x0598=0x0000 -0x0599=0x0000 -0x059A=0x0000 -0x059B=0x0000 -0x059C=0x0000 -0x059D=0x0000 -0x059E=0x0000 -0x059F=0x0000 -0x05A0=0x0000 -0x05A1=0x0000 -0x05A2=0x0000 -0x05A3=0x0000 -0x05A4=0x0000 -0x05A5=0x0000 -0x05A6=0x0000 -0x05A7=0x0000 -[lms7002_registers_b] -0x0100=0x3409 -0x0101=0x7800 -0x0102=0x3180 -0x0103=0x0A12 -0x0104=0x0088 -0x0105=0x0007 -0x0106=0x3182 -0x0107=0x318C -0x0108=0x3042 -0x0109=0x61C1 -0x010A=0x104C -0x010C=0x8865 -0x010D=0x019C -0x010E=0x2040 -0x010F=0x3042 -0x0110=0x0BF4 -0x0111=0x0083 -0x0112=0xC0E6 -0x0113=0x03C3 -0x0114=0x008D -0x0115=0x0009 -0x0116=0x8180 -0x0117=0x280C -0x0118=0x018C -0x0119=0x18CB -0x011A=0x2E02 -0x011C=0xA941 -0x011D=0x3B13 -0x011E=0x0631 -0x011F=0x3600 -0x0120=0xB9FF -0x0121=0x31DA -0x0122=0x033F -0x0123=0x267B -0x0124=0x0000 -0x0200=0x0101 -0x0201=0x05BD -0x0202=0x0779 -0x0203=0x0F9E -0x0204=0xBCC2 -0x0205=0x0000 -0x0206=0x0000 -0x0207=0x0000 -0x0208=0x0170 -0x0209=0x0000 -0x020A=0x0080 -0x020B=0x4000 -0x020C=0x7FFF -0x0240=0x0020 -0x0241=0x0000 -0x0242=0x0000 -0x0243=0x0000 -0x0244=0x0000 -0x0245=0x0000 -0x0246=0x0000 -0x0247=0x0000 -0x0248=0x0000 -0x0249=0x0000 -0x024A=0x0000 -0x024B=0x0000 -0x024C=0x0000 -0x024D=0x0000 -0x024E=0x0000 -0x024F=0x0000 -0x0250=0x0000 -0x0251=0x0000 -0x0252=0x0000 -0x0253=0x0000 -0x0254=0x0000 -0x0255=0x0000 -0x0256=0x0000 -0x0257=0x0000 -0x0258=0x0000 -0x0259=0x0000 -0x025A=0x0000 -0x025B=0x0000 -0x025C=0x0000 -0x025D=0x0000 -0x025E=0x0000 -0x025F=0x0000 -0x0260=0x0000 -0x0261=0x0000 -0x0280=0x0000 -0x0281=0x0000 -0x0282=0x0000 -0x0283=0x0000 -0x0284=0x0000 -0x0285=0x0000 -0x0286=0x0000 -0x0287=0x0000 -0x0288=0x0000 -0x0289=0x0000 -0x028A=0x0000 -0x028B=0x0000 -0x028C=0x0000 -0x028D=0x0000 -0x028E=0x0000 -0x028F=0x0000 -0x0290=0x0000 -0x0291=0x0000 -0x0292=0x0000 -0x0293=0x0000 -0x0294=0x0000 -0x0295=0x0000 -0x0296=0x0000 -0x0297=0x0000 -0x0298=0x0000 -0x0299=0x0000 -0x029A=0x0000 -0x029B=0x0000 -0x029C=0x0000 -0x029D=0x0000 -0x029E=0x0000 -0x029F=0x0000 -0x02A0=0x0000 -0x02A1=0x0000 -0x02A2=0x0000 -0x02A3=0x0000 -0x02A4=0x0000 -0x02A5=0x0000 -0x02A6=0x0000 -0x02A7=0x0000 -0x02C0=0x0000 -0x02C1=0x0000 -0x02C2=0x0000 -0x02C3=0x0000 -0x02C4=0x0000 -0x02C5=0x0000 -0x02C6=0x0000 -0x02C7=0x0000 -0x02C8=0x0000 -0x02C9=0x0000 -0x02CA=0x0000 -0x02CB=0x0000 -0x02CC=0x0000 -0x02CD=0x0000 -0x02CE=0x0000 -0x02CF=0x0000 -0x02D0=0x0000 -0x02D1=0x0000 -0x02D2=0x0000 -0x02D3=0x0000 -0x02D4=0x0000 -0x02D5=0x0000 -0x02D6=0x0000 -0x02D7=0x0000 -0x02D8=0x0000 -0x02D9=0x0000 -0x02DA=0x0000 -0x02DB=0x0000 -0x02DC=0x0000 -0x02DD=0x0000 -0x02DE=0x0000 -0x02DF=0x0000 -0x02E0=0x0000 -0x02E1=0x0000 -0x02E2=0x0000 -0x02E3=0x0000 -0x02E4=0x0000 -0x02E5=0x0000 -0x02E6=0x0000 -0x02E7=0x0000 -0x0300=0x0000 -0x0301=0x0000 -0x0302=0x0000 -0x0303=0x0000 -0x0304=0x0000 -0x0305=0x0000 -0x0306=0x0000 -0x0307=0x0000 -0x0308=0x0000 -0x0309=0x0000 -0x030A=0x0000 -0x030B=0x0000 -0x030C=0x0000 -0x030D=0x0000 -0x030E=0x0000 -0x030F=0x0000 -0x0310=0x0000 -0x0311=0x0000 -0x0312=0x0000 -0x0313=0x0000 -0x0314=0x0000 -0x0315=0x0000 -0x0316=0x0000 -0x0317=0x0000 -0x0318=0x0000 -0x0319=0x0000 -0x031A=0x0000 -0x031B=0x0000 -0x031C=0x0000 -0x031D=0x0000 -0x031E=0x0000 -0x031F=0x0000 -0x0320=0x0000 -0x0321=0x0000 -0x0322=0x0000 -0x0323=0x0000 -0x0324=0x0000 -0x0325=0x0000 -0x0326=0x0000 -0x0327=0x0000 -0x0340=0x0000 -0x0341=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0344=0x0000 -0x0345=0x0000 -0x0346=0x0000 -0x0347=0x0000 -0x0348=0x0000 -0x0349=0x0000 -0x034A=0x0000 -0x034B=0x0000 -0x034C=0x0000 -0x034D=0x0000 -0x034E=0x0000 -0x034F=0x0000 -0x0350=0x0000 -0x0351=0x0000 -0x0352=0x0000 -0x0353=0x0000 -0x0354=0x0000 -0x0355=0x0000 -0x0356=0x0000 -0x0357=0x0000 -0x0358=0x0000 -0x0359=0x0000 -0x035A=0x0000 -0x035B=0x0000 -0x035C=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x035F=0x0000 -0x0360=0x0000 -0x0361=0x0000 -0x0362=0x0000 -0x0363=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0367=0x0000 -0x0380=0x0000 -0x0381=0x0000 -0x0382=0x0000 -0x0383=0x0000 -0x0384=0x0000 -0x0385=0x0000 -0x0386=0x0000 -0x0387=0x0000 -0x0388=0x0000 -0x0389=0x0000 -0x038A=0x0000 -0x038B=0x0000 -0x038C=0x0000 -0x038D=0x0000 -0x038E=0x0000 -0x038F=0x0000 -0x0390=0x0000 -0x0391=0x0000 -0x0392=0x0000 -0x0393=0x0000 -0x0394=0x0000 -0x0395=0x0000 -0x0396=0x0000 -0x0397=0x0000 -0x0398=0x0000 -0x0399=0x0000 -0x039A=0x0000 -0x039B=0x0000 -0x039C=0x0000 -0x039D=0x0000 -0x039E=0x0000 -0x039F=0x0000 -0x03A0=0x0000 -0x03A1=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x03A6=0x0000 -0x03A7=0x0000 -0x0400=0x0101 -0x0401=0x07FF -0x0402=0x079B -0x0403=0x0FF5 -0x0404=0x0000 -0x0405=0x0000 -0x0406=0x0000 -0x0407=0x0000 -0x0408=0x0000 -0x0409=0x0000 -0x040A=0x0000 -0x040B=0x7FFF -0x040C=0x00FC -0x040D=0x0000 -0x040E=0x0000 -0x040F=0x0000 -0x0440=0x0020 -0x0441=0x0000 -0x0442=0x0000 -0x0443=0x0000 -0x0444=0x0000 -0x0445=0x0000 -0x0446=0x0000 -0x0447=0x0000 -0x0448=0x0000 -0x0449=0x0000 -0x044A=0x0000 -0x044B=0x0000 -0x044C=0x0000 -0x044D=0x0000 -0x044E=0x0000 -0x044F=0x0000 -0x0450=0x0000 -0x0451=0x0000 -0x0452=0x0000 -0x0453=0x0000 -0x0454=0x0000 -0x0455=0x0000 -0x0456=0x0000 -0x0457=0x0000 -0x0458=0x0000 -0x0459=0x0000 -0x045A=0x0000 -0x045B=0x0000 -0x045C=0x0000 -0x045D=0x0000 -0x045E=0x0000 -0x045F=0x0000 -0x0460=0x0000 -0x0461=0x0000 -0x0480=0x0000 -0x0481=0x0000 -0x0482=0x0000 -0x0483=0x0000 -0x0484=0x0000 -0x0485=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0488=0x0000 -0x0489=0x0000 -0x048A=0x0000 -0x048B=0x0000 -0x048C=0x0000 -0x048D=0x0000 -0x048E=0x0000 -0x048F=0x0000 -0x0490=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x0493=0x0000 -0x0494=0x0000 -0x0495=0x0000 -0x0496=0x0000 -0x0497=0x0000 -0x0498=0x0000 -0x0499=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x049C=0x0000 -0x049D=0x0000 -0x049E=0x0000 -0x049F=0x0000 -0x04A0=0x0000 -0x04A1=0x0000 -0x04A2=0x0000 -0x04A3=0x0000 -0x04A4=0x0000 -0x04A5=0x0000 -0x04A6=0x0000 -0x04A7=0x0000 -0x04C0=0x0000 -0x04C1=0x0000 -0x04C2=0x0000 -0x04C3=0x0000 -0x04C4=0x0000 -0x04C5=0x0000 -0x04C6=0x0000 -0x04C7=0x0000 -0x04C8=0x0000 -0x04C9=0x0000 -0x04CA=0x0000 -0x04CB=0x0000 -0x04CC=0x0000 -0x04CD=0x0000 -0x04CE=0x0000 -0x04CF=0x0000 -0x04D0=0x0000 -0x04D1=0x0000 -0x04D2=0x0000 -0x04D3=0x0000 -0x04D4=0x0000 -0x04D5=0x0000 -0x04D6=0x0000 -0x04D7=0x0000 -0x04D8=0x0000 -0x04D9=0x0000 -0x04DA=0x0000 -0x04DB=0x0000 -0x04DC=0x0000 -0x04DD=0x0000 -0x04DE=0x0000 -0x04DF=0x0000 -0x04E0=0x0000 -0x04E1=0x0000 -0x04E2=0x0000 -0x04E3=0x0000 -0x04E4=0x0000 -0x04E5=0x0000 -0x04E6=0x0000 -0x04E7=0x0000 -0x0500=0x0000 -0x0501=0x0000 -0x0502=0x0000 -0x0503=0x0000 -0x0504=0x0000 -0x0505=0x0000 -0x0506=0x0000 -0x0507=0x0000 -0x0508=0x0000 -0x0509=0x0000 -0x050A=0x0000 -0x050B=0x0000 -0x050C=0x0000 -0x050D=0x0000 -0x050E=0x0000 -0x050F=0x0000 -0x0510=0x0000 -0x0511=0x0000 -0x0512=0x0000 -0x0513=0x0000 -0x0514=0x0000 -0x0515=0x0000 -0x0516=0x0000 -0x0517=0x0000 -0x0518=0x0000 -0x0519=0x0000 -0x051A=0x0000 -0x051B=0x0000 -0x051C=0x0000 -0x051D=0x0000 -0x051E=0x0000 -0x051F=0x0000 -0x0520=0x0000 -0x0521=0x0000 -0x0522=0x0000 -0x0523=0x0000 -0x0524=0x0000 -0x0525=0x0000 -0x0526=0x0000 -0x0527=0x0000 -0x0540=0x0000 -0x0541=0x0000 -0x0542=0x0000 -0x0543=0x0000 -0x0544=0x0000 -0x0545=0x0000 -0x0546=0x0000 -0x0547=0x0000 -0x0548=0x0000 -0x0549=0x0000 -0x054A=0x0000 -0x054B=0x0000 -0x054C=0x0000 -0x054D=0x0000 -0x054E=0x0000 -0x054F=0x0000 -0x0550=0x0000 -0x0551=0x0000 -0x0552=0x0000 -0x0553=0x0000 -0x0554=0x0000 -0x0555=0x0000 -0x0556=0x0000 -0x0557=0x0000 -0x0558=0x0000 -0x0559=0x0000 -0x055A=0x0000 -0x055B=0x0000 -0x055C=0x0000 -0x055D=0x0000 -0x055E=0x0000 -0x055F=0x0000 -0x0560=0x0000 -0x0561=0x0000 -0x0562=0x0000 -0x0563=0x0000 -0x0564=0x0000 -0x0565=0x0000 -0x0566=0x0000 -0x0567=0x0000 -0x0580=0x0000 -0x0581=0x0000 -0x0582=0x0000 -0x0583=0x0000 -0x0584=0x0000 -0x0585=0x0000 -0x0586=0x0000 -0x0587=0x0000 -0x0588=0x0000 -0x0589=0x0000 -0x058A=0x0000 -0x058B=0x0000 -0x058C=0x0000 -0x058D=0x0000 -0x058E=0x0000 -0x058F=0x0000 -0x0590=0x0000 -0x0591=0x0000 -0x0592=0x0000 -0x0593=0x0000 -0x0594=0x0000 -0x0595=0x0000 -0x0596=0x0000 -0x0597=0x0000 -0x0598=0x0000 -0x0599=0x0000 -0x059A=0x0000 -0x059B=0x0000 -0x059C=0x0000 -0x059D=0x0000 -0x059E=0x0000 -0x059F=0x0000 -0x05A0=0x0000 -0x05A1=0x0000 -0x05A2=0x0000 -0x05A3=0x0000 -0x05A4=0x0000 -0x05A5=0x0000 -0x05A6=0x0000 -0x05A7=0x0000 -[reference_clocks] -sxr_ref_clk_mhz=52 -sxt_ref_clk_mhz=52 diff --git a/targets/ARCH/SODERA/lms7_trx_LTE_mimo_TSG.ini b/targets/ARCH/SODERA/lms7_trx_LTE_mimo_TSG.ini deleted file mode 100644 index fb25b06527..0000000000 --- a/targets/ARCH/SODERA/lms7_trx_LTE_mimo_TSG.ini +++ /dev/null @@ -1,1128 +0,0 @@ -[file_info] -type=lms7002m_minimal_config -version=1 -[lms7002_registers_a] -0x0020=0xFFFD -0x0021=0x0E9F -0x0022=0x07FF -0x0023=0x5550 -0x0024=0xE4E4 -0x0025=0x0101 -0x0026=0x0101 -0x0027=0xE4E4 -0x0028=0x0101 -0x0029=0x0101 -0x002A=0x0086 -0x002B=0x0038 -0x002C=0x0000 -0x002D=0xFFFF -0x002E=0x0000 -0x002F=0x3840 -0x0081=0x0000 -0x0082=0x8001 -0x0084=0x0400 -0x0085=0x0001 -0x0086=0x4101 -0x0087=0xB13B -0x0088=0x0303 -0x0089=0x1078 -0x008A=0x0514 -0x008B=0x2184 -0x008C=0x267B -0x0092=0x0001 -0x0093=0x0000 -0x0094=0x0000 -0x0095=0x0000 -0x0096=0x0000 -0x0097=0x0000 -0x0098=0x0000 -0x0099=0x6565 -0x009A=0x658C -0x009B=0x6565 -0x009C=0x658C -0x009D=0x6565 -0x009E=0x658C -0x009F=0x658C -0x00A0=0x6565 -0x00A1=0x6565 -0x00A2=0x6565 -0x00A3=0x6565 -0x00A4=0x6565 -0x00A5=0x6565 -0x00A6=0x0001 -0x00A7=0x6565 -0x00A8=0x0000 -0x00A9=0x8000 -0x00AA=0x0000 -0x00AB=0x0040 -0x00AC=0x2000 -0x00AD=0x03FF -0x00AE=0x0000 -0x0100=0x7409 -0x0101=0x7800 -0x0102=0x3180 -0x0103=0x0A12 -0x0104=0x0088 -0x0105=0x0007 -0x0106=0x3182 -0x0107=0x318C -0x0108=0x9442 -0x0109=0x61C1 -0x010A=0x104C -0x010C=0x8865 -0x010D=0x011A -0x010E=0x2040 -0x010F=0x3042 -0x0110=0x0BF4 -0x0111=0x0083 -0x0112=0xC0E6 -0x0113=0x03C3 -0x0114=0x008D -0x0115=0x0009 -0x0116=0x8180 -0x0117=0x280C -0x0118=0x018C -0x0119=0x18CB -0x011A=0x2E02 -0x011C=0xAD41 -0x011D=0x9D89 -0x011E=0x0398 -0x011F=0x3680 -0x0120=0xB9FF -0x0121=0x3692 -0x0122=0x033F -0x0123=0x267B -0x0124=0x0000 -0x0200=0x0081 -0x0201=0x07B0 -0x0202=0x06F2 -0x0203=0x0FC2 -0x0204=0xD51F -0x0205=0x0000 -0x0206=0x0000 -0x0207=0x0000 -0x0208=0x0070 -0x0209=0x0000 -0x020A=0x0080 -0x020B=0x4000 -0x020C=0x7FFF -0x0240=0x0020 -0x0241=0x0000 -0x0242=0x0000 -0x0243=0x0000 -0x0244=0x0000 -0x0245=0x0000 -0x0246=0x0000 -0x0247=0x0000 -0x0248=0x0000 -0x0249=0x0000 -0x024A=0x0000 -0x024B=0x0000 -0x024C=0x0000 -0x024D=0x0000 -0x024E=0x0000 -0x024F=0x0000 -0x0250=0x0000 -0x0251=0x0000 -0x0252=0x0000 -0x0253=0x0000 -0x0254=0x0000 -0x0255=0x0000 -0x0256=0x0000 -0x0257=0x0000 -0x0258=0x0000 -0x0259=0x0000 -0x025A=0x0000 -0x025B=0x0000 -0x025C=0x0000 -0x025D=0x0000 -0x025E=0x0000 -0x025F=0x0000 -0x0260=0x0000 -0x0261=0x0000 -0x0280=0x0000 -0x0281=0x0000 -0x0282=0x0000 -0x0283=0x0000 -0x0284=0x0000 -0x0285=0x0000 -0x0286=0x0000 -0x0287=0x0000 -0x0288=0x0000 -0x0289=0x0000 -0x028A=0x0000 -0x028B=0x0000 -0x028C=0x0000 -0x028D=0x0000 -0x028E=0x0000 -0x028F=0x0000 -0x0290=0x0000 -0x0291=0x0000 -0x0292=0x0000 -0x0293=0x0000 -0x0294=0x0000 -0x0295=0x0000 -0x0296=0x0000 -0x0297=0x0000 -0x0298=0x0000 -0x0299=0x0000 -0x029A=0x0000 -0x029B=0x0000 -0x029C=0x0000 -0x029D=0x0000 -0x029E=0x0000 -0x029F=0x0000 -0x02A0=0x0000 -0x02A1=0x0000 -0x02A2=0x0000 -0x02A3=0x0000 -0x02A4=0x0000 -0x02A5=0x0000 -0x02A6=0x0000 -0x02A7=0x0000 -0x02C0=0x0000 -0x02C1=0x0000 -0x02C2=0x0000 -0x02C3=0x0000 -0x02C4=0x0000 -0x02C5=0x0000 -0x02C6=0x0000 -0x02C7=0x0000 -0x02C8=0x0000 -0x02C9=0x0000 -0x02CA=0x0000 -0x02CB=0x0000 -0x02CC=0x0000 -0x02CD=0x0000 -0x02CE=0x0000 -0x02CF=0x0000 -0x02D0=0x0000 -0x02D1=0x0000 -0x02D2=0x0000 -0x02D3=0x0000 -0x02D4=0x0000 -0x02D5=0x0000 -0x02D6=0x0000 -0x02D7=0x0000 -0x02D8=0x0000 -0x02D9=0x0000 -0x02DA=0x0000 -0x02DB=0x0000 -0x02DC=0x0000 -0x02DD=0x0000 -0x02DE=0x0000 -0x02DF=0x0000 -0x02E0=0x0000 -0x02E1=0x0000 -0x02E2=0x0000 -0x02E3=0x0000 -0x02E4=0x0000 -0x02E5=0x0000 -0x02E6=0x0000 -0x02E7=0x0000 -0x0300=0x0000 -0x0301=0x0000 -0x0302=0x0000 -0x0303=0x0000 -0x0304=0x0000 -0x0305=0x0000 -0x0306=0x0000 -0x0307=0x0000 -0x0308=0x0000 -0x0309=0x0000 -0x030A=0x0000 -0x030B=0x0000 -0x030C=0x0000 -0x030D=0x0000 -0x030E=0x0000 -0x030F=0x0000 -0x0310=0x0000 -0x0311=0x0000 -0x0312=0x0000 -0x0313=0x0000 -0x0314=0x0000 -0x0315=0x0000 -0x0316=0x0000 -0x0317=0x0000 -0x0318=0x0000 -0x0319=0x0000 -0x031A=0x0000 -0x031B=0x0000 -0x031C=0x0000 -0x031D=0x0000 -0x031E=0x0000 -0x031F=0x0000 -0x0320=0x0000 -0x0321=0x0000 -0x0322=0x0000 -0x0323=0x0000 -0x0324=0x0000 -0x0325=0x0000 -0x0326=0x0000 -0x0327=0x0000 -0x0340=0x0000 -0x0341=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0344=0x0000 -0x0345=0x0000 -0x0346=0x0000 -0x0347=0x0000 -0x0348=0x0000 -0x0349=0x0000 -0x034A=0x0000 -0x034B=0x0000 -0x034C=0x0000 -0x034D=0x0000 -0x034E=0x0000 -0x034F=0x0000 -0x0350=0x0000 -0x0351=0x0000 -0x0352=0x0000 -0x0353=0x0000 -0x0354=0x0000 -0x0355=0x0000 -0x0356=0x0000 -0x0357=0x0000 -0x0358=0x0000 -0x0359=0x0000 -0x035A=0x0000 -0x035B=0x0000 -0x035C=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x035F=0x0000 -0x0360=0x0000 -0x0361=0x0000 -0x0362=0x0000 -0x0363=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0367=0x0000 -0x0380=0x0000 -0x0381=0x0000 -0x0382=0x0000 -0x0383=0x0000 -0x0384=0x0000 -0x0385=0x0000 -0x0386=0x0000 -0x0387=0x0000 -0x0388=0x0000 -0x0389=0x0000 -0x038A=0x0000 -0x038B=0x0000 -0x038C=0x0000 -0x038D=0x0000 -0x038E=0x0000 -0x038F=0x0000 -0x0390=0x0000 -0x0391=0x0000 -0x0392=0x0000 -0x0393=0x0000 -0x0394=0x0000 -0x0395=0x0000 -0x0396=0x0000 -0x0397=0x0000 -0x0398=0x0000 -0x0399=0x0000 -0x039A=0x0000 -0x039B=0x0000 -0x039C=0x0000 -0x039D=0x0000 -0x039E=0x0000 -0x039F=0x0000 -0x03A0=0x0000 -0x03A1=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x03A6=0x0000 -0x03A7=0x0000 -0x0400=0x0085 -0x0401=0x07FF -0x0402=0x07FF -0x0403=0x0000 -0x0404=0x0000 -0x0405=0x0000 -0x0406=0x0000 -0x0407=0x0000 -0x0408=0x0000 -0x0409=0x0000 -0x040A=0x0003 -0x040B=0x000F -0x040C=0x00FC -0x040D=0x0000 -0x040E=0x0000 -0x040F=0x0000 -0x0440=0x0020 -0x0441=0x0000 -0x0442=0x0563 -0x0443=0xB490 -0x0444=0x02B1 -0x0445=0xDA48 -0x0446=0x0000 -0x0447=0x0000 -0x0448=0x0000 -0x0449=0x0000 -0x044A=0x0000 -0x044B=0x0000 -0x044C=0x0000 -0x044D=0x0000 -0x044E=0x0000 -0x044F=0x0000 -0x0450=0x0000 -0x0451=0x0000 -0x0452=0x0000 -0x0453=0x0000 -0x0454=0x0000 -0x0455=0x0000 -0x0456=0x0000 -0x0457=0x0000 -0x0458=0x0000 -0x0459=0x0000 -0x045A=0x0000 -0x045B=0x0000 -0x045C=0x0000 -0x045D=0x0000 -0x045E=0x0000 -0x045F=0x0000 -0x0460=0x0000 -0x0461=0x0000 -0x0480=0x0000 -0x0481=0x0000 -0x0482=0x0000 -0x0483=0x0000 -0x0484=0x0000 -0x0485=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0488=0x0000 -0x0489=0x0000 -0x048A=0x0000 -0x048B=0x0000 -0x048C=0x0000 -0x048D=0x0000 -0x048E=0x0000 -0x048F=0x0000 -0x0490=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x0493=0x0000 -0x0494=0x0000 -0x0495=0x0000 -0x0496=0x0000 -0x0497=0x0000 -0x0498=0x0000 -0x0499=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x049C=0x0000 -0x049D=0x0000 -0x049E=0x0000 -0x049F=0x0000 -0x04A0=0x0000 -0x04A1=0x0000 -0x04A2=0x0000 -0x04A3=0x0000 -0x04A4=0x0000 -0x04A5=0x0000 -0x04A6=0x0000 -0x04A7=0x0000 -0x04C0=0x0000 -0x04C1=0x0000 -0x04C2=0x0000 -0x04C3=0x0000 -0x04C4=0x0000 -0x04C5=0x0000 -0x04C6=0x0000 -0x04C7=0x0000 -0x04C8=0x0000 -0x04C9=0x0000 -0x04CA=0x0000 -0x04CB=0x0000 -0x04CC=0x0000 -0x04CD=0x0000 -0x04CE=0x0000 -0x04CF=0x0000 -0x04D0=0x0000 -0x04D1=0x0000 -0x04D2=0x0000 -0x04D3=0x0000 -0x04D4=0x0000 -0x04D5=0x0000 -0x04D6=0x0000 -0x04D7=0x0000 -0x04D8=0x0000 -0x04D9=0x0000 -0x04DA=0x0000 -0x04DB=0x0000 -0x04DC=0x0000 -0x04DD=0x0000 -0x04DE=0x0000 -0x04DF=0x0000 -0x04E0=0x0000 -0x04E1=0x0000 -0x04E2=0x0000 -0x04E3=0x0000 -0x04E4=0x0000 -0x04E5=0x0000 -0x04E6=0x0000 -0x04E7=0x0000 -0x0500=0x0000 -0x0501=0x0000 -0x0502=0x0000 -0x0503=0x0000 -0x0504=0x0000 -0x0505=0x0000 -0x0506=0x0000 -0x0507=0x0000 -0x0508=0x0000 -0x0509=0x0000 -0x050A=0x0000 -0x050B=0x0000 -0x050C=0x0000 -0x050D=0x0000 -0x050E=0x0000 -0x050F=0x0000 -0x0510=0x0000 -0x0511=0x0000 -0x0512=0x0000 -0x0513=0x0000 -0x0514=0x0000 -0x0515=0x0000 -0x0516=0x0000 -0x0517=0x0000 -0x0518=0x0000 -0x0519=0x0000 -0x051A=0x0000 -0x051B=0x0000 -0x051C=0x0000 -0x051D=0x0000 -0x051E=0x0000 -0x051F=0x0000 -0x0520=0x0000 -0x0521=0x0000 -0x0522=0x0000 -0x0523=0x0000 -0x0524=0x0000 -0x0525=0x0000 -0x0526=0x0000 -0x0527=0x0000 -0x0540=0x0000 -0x0541=0x0000 -0x0542=0x0000 -0x0543=0x0000 -0x0544=0x0000 -0x0545=0x0000 -0x0546=0x0000 -0x0547=0x0000 -0x0548=0x0000 -0x0549=0x0000 -0x054A=0x0000 -0x054B=0x0000 -0x054C=0x0000 -0x054D=0x0000 -0x054E=0x0000 -0x054F=0x0000 -0x0550=0x0000 -0x0551=0x0000 -0x0552=0x0000 -0x0553=0x0000 -0x0554=0x0000 -0x0555=0x0000 -0x0556=0x0000 -0x0557=0x0000 -0x0558=0x0000 -0x0559=0x0000 -0x055A=0x0000 -0x055B=0x0000 -0x055C=0x0000 -0x055D=0x0000 -0x055E=0x0000 -0x055F=0x0000 -0x0560=0x0000 -0x0561=0x0000 -0x0562=0x0000 -0x0563=0x0000 -0x0564=0x0000 -0x0565=0x0000 -0x0566=0x0000 -0x0567=0x0000 -0x0580=0x0000 -0x0581=0x0000 -0x0582=0x0000 -0x0583=0x0000 -0x0584=0x0000 -0x0585=0x0000 -0x0586=0x0000 -0x0587=0x0000 -0x0588=0x0000 -0x0589=0x0000 -0x058A=0x0000 -0x058B=0x0000 -0x058C=0x0000 -0x058D=0x0000 -0x058E=0x0000 -0x058F=0x0000 -0x0590=0x0000 -0x0591=0x0000 -0x0592=0x0000 -0x0593=0x0000 -0x0594=0x0000 -0x0595=0x0000 -0x0596=0x0000 -0x0597=0x0000 -0x0598=0x0000 -0x0599=0x0000 -0x059A=0x0000 -0x059B=0x0000 -0x059C=0x0000 -0x059D=0x0000 -0x059E=0x0000 -0x059F=0x0000 -0x05A0=0x0000 -0x05A1=0x0000 -0x05A2=0x0000 -0x05A3=0x0000 -0x05A4=0x0000 -0x05A5=0x0000 -0x05A6=0x0000 -0x05A7=0x0000 -[lms7002_registers_b] -0x0100=0x3409 -0x0101=0x7800 -0x0102=0x3180 -0x0103=0x0A12 -0x0104=0x0088 -0x0105=0x0007 -0x0106=0x3182 -0x0107=0x318C -0x0108=0x9442 -0x0109=0x61C1 -0x010A=0x104C -0x010C=0x88FD -0x010D=0x009E -0x010E=0x2040 -0x010F=0x3042 -0x0110=0x0BF4 -0x0111=0x0083 -0x0112=0xC0E6 -0x0113=0x03C3 -0x0114=0x008D -0x0115=0x0009 -0x0116=0x8180 -0x0117=0x280C -0x0118=0x018C -0x0119=0x18CB -0x011A=0x2E02 -0x011C=0xA941 -0x011D=0xEC4E -0x011E=0x04E4 -0x011F=0x3600 -0x0120=0xB9FF -0x0121=0x3348 -0x0122=0x033F -0x0123=0x267B -0x0124=0x0000 -0x0200=0x0101 -0x0201=0x05BD -0x0202=0x0779 -0x0203=0x0F9E -0x0204=0xBCC2 -0x0205=0x0000 -0x0206=0x0000 -0x0207=0x0000 -0x0208=0x0070 -0x0209=0x0000 -0x020A=0x0080 -0x020B=0x4000 -0x020C=0x7FFF -0x0240=0x0020 -0x0241=0x0000 -0x0242=0x0000 -0x0243=0x0000 -0x0244=0x0000 -0x0245=0x0000 -0x0246=0x0000 -0x0247=0x0000 -0x0248=0x0000 -0x0249=0x0000 -0x024A=0x0000 -0x024B=0x0000 -0x024C=0x0000 -0x024D=0x0000 -0x024E=0x0000 -0x024F=0x0000 -0x0250=0x0000 -0x0251=0x0000 -0x0252=0x0000 -0x0253=0x0000 -0x0254=0x0000 -0x0255=0x0000 -0x0256=0x0000 -0x0257=0x0000 -0x0258=0x0000 -0x0259=0x0000 -0x025A=0x0000 -0x025B=0x0000 -0x025C=0x0000 -0x025D=0x0000 -0x025E=0x0000 -0x025F=0x0000 -0x0260=0x0000 -0x0261=0x0000 -0x0280=0x0000 -0x0281=0x0000 -0x0282=0x0000 -0x0283=0x0000 -0x0284=0x0000 -0x0285=0x0000 -0x0286=0x0000 -0x0287=0x0000 -0x0288=0x0000 -0x0289=0x0000 -0x028A=0x0000 -0x028B=0x0000 -0x028C=0x0000 -0x028D=0x0000 -0x028E=0x0000 -0x028F=0x0000 -0x0290=0x0000 -0x0291=0x0000 -0x0292=0x0000 -0x0293=0x0000 -0x0294=0x0000 -0x0295=0x0000 -0x0296=0x0000 -0x0297=0x0000 -0x0298=0x0000 -0x0299=0x0000 -0x029A=0x0000 -0x029B=0x0000 -0x029C=0x0000 -0x029D=0x0000 -0x029E=0x0000 -0x029F=0x0000 -0x02A0=0x0000 -0x02A1=0x0000 -0x02A2=0x0000 -0x02A3=0x0000 -0x02A4=0x0000 -0x02A5=0x0000 -0x02A6=0x0000 -0x02A7=0x0000 -0x02C0=0x0000 -0x02C1=0x0000 -0x02C2=0x0000 -0x02C3=0x0000 -0x02C4=0x0000 -0x02C5=0x0000 -0x02C6=0x0000 -0x02C7=0x0000 -0x02C8=0x0000 -0x02C9=0x0000 -0x02CA=0x0000 -0x02CB=0x0000 -0x02CC=0x0000 -0x02CD=0x0000 -0x02CE=0x0000 -0x02CF=0x0000 -0x02D0=0x0000 -0x02D1=0x0000 -0x02D2=0x0000 -0x02D3=0x0000 -0x02D4=0x0000 -0x02D5=0x0000 -0x02D6=0x0000 -0x02D7=0x0000 -0x02D8=0x0000 -0x02D9=0x0000 -0x02DA=0x0000 -0x02DB=0x0000 -0x02DC=0x0000 -0x02DD=0x0000 -0x02DE=0x0000 -0x02DF=0x0000 -0x02E0=0x0000 -0x02E1=0x0000 -0x02E2=0x0000 -0x02E3=0x0000 -0x02E4=0x0000 -0x02E5=0x0000 -0x02E6=0x0000 -0x02E7=0x0000 -0x0300=0x0000 -0x0301=0x0000 -0x0302=0x0000 -0x0303=0x0000 -0x0304=0x0000 -0x0305=0x0000 -0x0306=0x0000 -0x0307=0x0000 -0x0308=0x0000 -0x0309=0x0000 -0x030A=0x0000 -0x030B=0x0000 -0x030C=0x0000 -0x030D=0x0000 -0x030E=0x0000 -0x030F=0x0000 -0x0310=0x0000 -0x0311=0x0000 -0x0312=0x0000 -0x0313=0x0000 -0x0314=0x0000 -0x0315=0x0000 -0x0316=0x0000 -0x0317=0x0000 -0x0318=0x0000 -0x0319=0x0000 -0x031A=0x0000 -0x031B=0x0000 -0x031C=0x0000 -0x031D=0x0000 -0x031E=0x0000 -0x031F=0x0000 -0x0320=0x0000 -0x0321=0x0000 -0x0322=0x0000 -0x0323=0x0000 -0x0324=0x0000 -0x0325=0x0000 -0x0326=0x0000 -0x0327=0x0000 -0x0340=0x0000 -0x0341=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0344=0x0000 -0x0345=0x0000 -0x0346=0x0000 -0x0347=0x0000 -0x0348=0x0000 -0x0349=0x0000 -0x034A=0x0000 -0x034B=0x0000 -0x034C=0x0000 -0x034D=0x0000 -0x034E=0x0000 -0x034F=0x0000 -0x0350=0x0000 -0x0351=0x0000 -0x0352=0x0000 -0x0353=0x0000 -0x0354=0x0000 -0x0355=0x0000 -0x0356=0x0000 -0x0357=0x0000 -0x0358=0x0000 -0x0359=0x0000 -0x035A=0x0000 -0x035B=0x0000 -0x035C=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x035F=0x0000 -0x0360=0x0000 -0x0361=0x0000 -0x0362=0x0000 -0x0363=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0367=0x0000 -0x0380=0x0000 -0x0381=0x0000 -0x0382=0x0000 -0x0383=0x0000 -0x0384=0x0000 -0x0385=0x0000 -0x0386=0x0000 -0x0387=0x0000 -0x0388=0x0000 -0x0389=0x0000 -0x038A=0x0000 -0x038B=0x0000 -0x038C=0x0000 -0x038D=0x0000 -0x038E=0x0000 -0x038F=0x0000 -0x0390=0x0000 -0x0391=0x0000 -0x0392=0x0000 -0x0393=0x0000 -0x0394=0x0000 -0x0395=0x0000 -0x0396=0x0000 -0x0397=0x0000 -0x0398=0x0000 -0x0399=0x0000 -0x039A=0x0000 -0x039B=0x0000 -0x039C=0x0000 -0x039D=0x0000 -0x039E=0x0000 -0x039F=0x0000 -0x03A0=0x0000 -0x03A1=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x03A6=0x0000 -0x03A7=0x0000 -0x0400=0x0105 -0x0401=0x07FF -0x0402=0x079B -0x0403=0x0FF5 -0x0404=0x0000 -0x0405=0x0000 -0x0406=0x0000 -0x0407=0x0000 -0x0408=0x0000 -0x0409=0x0000 -0x040A=0x0000 -0x040B=0x7FFF -0x040C=0x00FC -0x040D=0x0000 -0x040E=0x0000 -0x040F=0x0000 -0x0440=0x0020 -0x0441=0x0000 -0x0442=0x0000 -0x0443=0x0000 -0x0444=0x0000 -0x0445=0x0000 -0x0446=0x0000 -0x0447=0x0000 -0x0448=0x0000 -0x0449=0x0000 -0x044A=0x0000 -0x044B=0x0000 -0x044C=0x0000 -0x044D=0x0000 -0x044E=0x0000 -0x044F=0x0000 -0x0450=0x0000 -0x0451=0x0000 -0x0452=0x0000 -0x0453=0x0000 -0x0454=0x0000 -0x0455=0x0000 -0x0456=0x0000 -0x0457=0x0000 -0x0458=0x0000 -0x0459=0x0000 -0x045A=0x0000 -0x045B=0x0000 -0x045C=0x0000 -0x045D=0x0000 -0x045E=0x0000 -0x045F=0x0000 -0x0460=0x0000 -0x0461=0x0000 -0x0480=0x0000 -0x0481=0x0000 -0x0482=0x0000 -0x0483=0x0000 -0x0484=0x0000 -0x0485=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0488=0x0000 -0x0489=0x0000 -0x048A=0x0000 -0x048B=0x0000 -0x048C=0x0000 -0x048D=0x0000 -0x048E=0x0000 -0x048F=0x0000 -0x0490=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x0493=0x0000 -0x0494=0x0000 -0x0495=0x0000 -0x0496=0x0000 -0x0497=0x0000 -0x0498=0x0000 -0x0499=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x049C=0x0000 -0x049D=0x0000 -0x049E=0x0000 -0x049F=0x0000 -0x04A0=0x0000 -0x04A1=0x0000 -0x04A2=0x0000 -0x04A3=0x0000 -0x04A4=0x0000 -0x04A5=0x0000 -0x04A6=0x0000 -0x04A7=0x0000 -0x04C0=0x0000 -0x04C1=0x0000 -0x04C2=0x0000 -0x04C3=0x0000 -0x04C4=0x0000 -0x04C5=0x0000 -0x04C6=0x0000 -0x04C7=0x0000 -0x04C8=0x0000 -0x04C9=0x0000 -0x04CA=0x0000 -0x04CB=0x0000 -0x04CC=0x0000 -0x04CD=0x0000 -0x04CE=0x0000 -0x04CF=0x0000 -0x04D0=0x0000 -0x04D1=0x0000 -0x04D2=0x0000 -0x04D3=0x0000 -0x04D4=0x0000 -0x04D5=0x0000 -0x04D6=0x0000 -0x04D7=0x0000 -0x04D8=0x0000 -0x04D9=0x0000 -0x04DA=0x0000 -0x04DB=0x0000 -0x04DC=0x0000 -0x04DD=0x0000 -0x04DE=0x0000 -0x04DF=0x0000 -0x04E0=0x0000 -0x04E1=0x0000 -0x04E2=0x0000 -0x04E3=0x0000 -0x04E4=0x0000 -0x04E5=0x0000 -0x04E6=0x0000 -0x04E7=0x0000 -0x0500=0x0000 -0x0501=0x0000 -0x0502=0x0000 -0x0503=0x0000 -0x0504=0x0000 -0x0505=0x0000 -0x0506=0x0000 -0x0507=0x0000 -0x0508=0x0000 -0x0509=0x0000 -0x050A=0x0000 -0x050B=0x0000 -0x050C=0x0000 -0x050D=0x0000 -0x050E=0x0000 -0x050F=0x0000 -0x0510=0x0000 -0x0511=0x0000 -0x0512=0x0000 -0x0513=0x0000 -0x0514=0x0000 -0x0515=0x0000 -0x0516=0x0000 -0x0517=0x0000 -0x0518=0x0000 -0x0519=0x0000 -0x051A=0x0000 -0x051B=0x0000 -0x051C=0x0000 -0x051D=0x0000 -0x051E=0x0000 -0x051F=0x0000 -0x0520=0x0000 -0x0521=0x0000 -0x0522=0x0000 -0x0523=0x0000 -0x0524=0x0000 -0x0525=0x0000 -0x0526=0x0000 -0x0527=0x0000 -0x0540=0x0000 -0x0541=0x0000 -0x0542=0x0000 -0x0543=0x0000 -0x0544=0x0000 -0x0545=0x0000 -0x0546=0x0000 -0x0547=0x0000 -0x0548=0x0000 -0x0549=0x0000 -0x054A=0x0000 -0x054B=0x0000 -0x054C=0x0000 -0x054D=0x0000 -0x054E=0x0000 -0x054F=0x0000 -0x0550=0x0000 -0x0551=0x0000 -0x0552=0x0000 -0x0553=0x0000 -0x0554=0x0000 -0x0555=0x0000 -0x0556=0x0000 -0x0557=0x0000 -0x0558=0x0000 -0x0559=0x0000 -0x055A=0x0000 -0x055B=0x0000 -0x055C=0x0000 -0x055D=0x0000 -0x055E=0x0000 -0x055F=0x0000 -0x0560=0x0000 -0x0561=0x0000 -0x0562=0x0000 -0x0563=0x0000 -0x0564=0x0000 -0x0565=0x0000 -0x0566=0x0000 -0x0567=0x0000 -0x0580=0x0000 -0x0581=0x0000 -0x0582=0x0000 -0x0583=0x0000 -0x0584=0x0000 -0x0585=0x0000 -0x0586=0x0000 -0x0587=0x0000 -0x0588=0x0000 -0x0589=0x0000 -0x058A=0x0000 -0x058B=0x0000 -0x058C=0x0000 -0x058D=0x0000 -0x058E=0x0000 -0x058F=0x0000 -0x0590=0x0000 -0x0591=0x0000 -0x0592=0x0000 -0x0593=0x0000 -0x0594=0x0000 -0x0595=0x0000 -0x0596=0x0000 -0x0597=0x0000 -0x0598=0x0000 -0x0599=0x0000 -0x059A=0x0000 -0x059B=0x0000 -0x059C=0x0000 -0x059D=0x0000 -0x059E=0x0000 -0x059F=0x0000 -0x05A0=0x0000 -0x05A1=0x0000 -0x05A2=0x0000 -0x05A3=0x0000 -0x05A4=0x0000 -0x05A5=0x0000 -0x05A6=0x0000 -0x05A7=0x0000 -[reference_clocks] -sxr_ref_clk_mhz=52 -sxt_ref_clk_mhz=52 diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.bladerfx40.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.bladerfx40.conf index 5f7ac3d65f..eb3895dc6d 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.bladerfx40.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.bladerfx40.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "92"; + mobile_network_code = "93"; ////////// Physical parameters: @@ -132,7 +132,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; + mme_ip_address = ( { ipv4 = "192.168.12.11"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -142,10 +142,10 @@ eNBs = NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; From fb7f4ab9d995d74e030ce6a4916a482683fbd396 Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Fri, 29 Jan 2016 09:49:36 +0100 Subject: [PATCH 037/122] removed old stuff --- targets/ARCH/{SODERA => LMSSDR}/SoDeRa_MIMO.ini | 0 targets/ARCH/{SODERA => LMSSDR}/USERSPACE/LIB/sodera_lib.cpp | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename targets/ARCH/{SODERA => LMSSDR}/SoDeRa_MIMO.ini (100%) rename targets/ARCH/{SODERA => LMSSDR}/USERSPACE/LIB/sodera_lib.cpp (100%) diff --git a/targets/ARCH/SODERA/SoDeRa_MIMO.ini b/targets/ARCH/LMSSDR/SoDeRa_MIMO.ini similarity index 100% rename from targets/ARCH/SODERA/SoDeRa_MIMO.ini rename to targets/ARCH/LMSSDR/SoDeRa_MIMO.ini diff --git a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp similarity index 100% rename from targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp rename to targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp From d30eeea8e5827f803d21be68345f7b075761e56b Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Sat, 30 Jan 2016 23:44:14 +0100 Subject: [PATCH 038/122] integration with Lime contribution for LMSSDR library. Renamed everything from SODERA to LMSSDR --- cmake_targets/CMakeLists.txt | 31 ++++++++----------- cmake_targets/build_oai | 8 ++--- targets/ARCH/COMMON/common_lib.c | 11 ++++--- targets/ARCH/COMMON/common_lib.h | 6 ++-- .../CONF/enb.band7.tm1.bladerfx40.conf | 4 +-- targets/RT/USER/lte-softmodem.c | 4 +++ 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index a8af214ce1..eb19864e95 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -405,7 +405,7 @@ add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4 add_list1_option(NB_ANTENNAS_TX "2" "Number of antennas in transmission" "1" "2" "4") add_list1_option(NB_ANTENNAS_TXRX "2" "Number of antennas in ????" "1" "2" "4") -add_list2_option(RF_BOARD "EXMIMO" "RF head type" "False" "EXMIMO" "OAI_USRP" "ETHERNET" "OAI_BLADERF" "OAI_SODERA" "CPRIGW") +add_list2_option(RF_BOARD "EXMIMO" "RF head type" "False" "EXMIMO" "OAI_USRP" "ETHERNET" "OAI_BLADERF" "OAI_LMSSDR" "CPRIGW") Message("RF_BOARD is ${RF_BOARD}") @@ -437,25 +437,19 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF") set(option_HW_lib "bladeRF") #set(LOWLATENCY False) -elseif (${RF_BOARD} STREQUAL "OAI_SODERA") - include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB") - include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/lms7002m") - include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/Si5351C") - include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/LMS_StreamBoard") +elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR") + include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB") + include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR") + include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m") +# include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C") + include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/LMS_StreamBoard") set(HW_SOURCE ${HW_SOURCE} - ${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp + ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp ) - LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/lms7002m") - LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/Si5351C") - LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/LMS_StreamBoard") - LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/kissFFT") LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu") - set(option_HW_lib "usb-1.0") - set(LMS7002_LIB "libLMS7002M.a") - set(Si5351C_LIB "libSi5351C.a") - set(LMSStreamBoard_LIB "libLMS_StreamBoard.a") - set(KISSFFT_LIB "libkissFFT.a") - #set(LOWLATENCY False) + set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp) + set(LIB_LMS_LIBRARIES "${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/build/libLMS_SDR.so" "${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/build/libLMS7002M.a") + set(LOWLATENCY False) elseif (${RF_BOARD} STREQUAL "ETHERNET") include_directories ("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB") @@ -1454,13 +1448,14 @@ add_executable(lte-softmodem target_link_libraries (lte-softmodem -Wl,--start-group - RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${LMS7002_LIB} ${Si5351C_LIB} ${LMSStreamBoard_LIB} ${KISSFFT_LIB} + RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} -Wl,--end-group ) target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES}) target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${XFORMS_LIBRARIES} ) target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES}) +target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES}) # lte-softmodem-nos1 is both eNB and UE implementation ################################################### diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 4a18e53f47..6d2021eb01 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -90,7 +90,7 @@ Options default is Rel10, Rel8 limits the implementation to 3GPP Release 8 version -w | --hardware - EXMIMO (Default), USRP, BLADERF, SODERA, ETHERNET, None + EXMIMO (Default), USRP, BLADERF, LMSSDR, ETHERNET, None Adds this RF board support (in external packages installation and in compilation) --oaisim Makes the oaisim simulator. Hardware will be defaulted to "NONE". @@ -181,8 +181,8 @@ function main() { if [ "$HW" == "BLADERF" ] ; then HW="OAI_BLADERF" fi - if [ "$HW" == "SODERA" ] ; then - HW="OAI_SODERA" + if [ "$HW" == "LMSSDR" ] ; then + HW="OAI_LMSSDR" fi echo_info "setting hardware to: $HW" shift 2;; @@ -266,7 +266,7 @@ function main() { LOWLATENCY_FLAG_USER="False" elif [ "$HW" = "OAI_BLADERF" ] ; then LOWLATENCY_FLAG_USER="False" - elif [ "$HW" = "OAI_SODERA" ] ; then + elif [ "$HW" = "OAI_LMSSDR" ] ; then LOWLATENCY_FLAG_USER="False" elif [ "$HW" = "None" ] ; then LOWLATENCY_FLAG_USER="False" diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c index 278d8ed79f..69496f69ef 100644 --- a/targets/ARCH/COMMON/common_lib.c +++ b/targets/ARCH/COMMON/common_lib.c @@ -61,15 +61,16 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf device->type=BLADERF_IF; printf("openair0_dev_init_bladerf ...\n"); return(openair0_dev_init_bladerf(device, openair0_cfg)); -#elif OAI_SODERA - device->type=OAI_SODERA; - printf("openair0_dev_init_sodera ...\n"); +#elif OAI_LMSSDR + device->type=LMSSDR_IF; + printf("openair0_dev_init_lmssdr ...\n"); + /* if (openair0_cfg[0].configFilename==NULL) { printf("Please provide a configuration file for SoDeRa\n"); exit(-1); - } + }*/ - return(openair0_dev_init_sodera(device, openair0_cfg)); + return(openair0_dev_init_lms(device, openair0_cfg)); #endif } diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 3f814a9e55..8255b8f2ab 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -165,8 +165,8 @@ typedef enum { USRP_X300_IF, /*!\brief device is BLADE RF*/ BLADERF_IF, - /*!\brief device is SODERA RF*/ - SODERARF_IF, + /*!\brief device is LMSSDR*/ + LMSSDR_IF, /*!\brief device is NONE*/ NONE_IF, MAX_DEV_TYPE @@ -298,7 +298,7 @@ extern "C" /*! \brief Initialize Openair ETHERNET target. It returns 0 if OK */ int openair0_dev_init_eth(openair0_device *device, openair0_config_t *openair0_cfg); int openair0_dev_init_bladerf(openair0_device *device, openair0_config_t *openair0_cfg); - int openair0_dev_init_sodera(openair0_device *device, openair0_config_t *openair0_cfg); + int openair0_dev_init_lms(openair0_device *device, openair0_config_t *openair0_cfg); int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_cfg); int openair0_dev_init_exmimo(openair0_device *device, openair0_config_t *openair0_cfg); /*@}*/ diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf index 5c53803c4d..5a6a9a462b 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf @@ -142,10 +142,10 @@ eNBs = NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.212/24"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 612239bec3..a431b35498 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -956,6 +956,8 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) ((short*)dummy_tx_b)[2*i]<<4; #elif OAI_BLADERF ((short*)dummy_tx_b)[2*i]; +#elif OAI_LMSSDR + ((short*)dummy_tx_b)[2*i]; #else ((short*)dummy_tx_b)[2*i]<<4; #endif @@ -964,6 +966,8 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) ((short*)dummy_tx_b)[2*i+1]<<4; #elif OAI_BLADERF ((short*)dummy_tx_b)[2*i+1]; +#elif OAI_LMSSDR + ((short*)dummy_tx_b)[2*i+1]; #else ((short*)dummy_tx_b)[2*i+1]<<4; #endif From 39e497b80db0713d142fa1a84ba78bcbadb27410 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 3 Feb 2016 22:01:51 +0100 Subject: [PATCH 039/122] gain control init to lower value removed strage exit in UE receiver --- openair1/SCHED/phy_procedures_lte_ue.c | 6 +++--- targets/SIMU/USER/oaisim_functions.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index bc84beae43..65784331c9 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -2684,9 +2684,9 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); - // if (abstraction_flag ==0 ) - dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid); - mac_xface->macphy_exit(""); + //if (abstraction_flag ==0 ) + //dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid); + //mac_xface->macphy_exit("Hello?"); //#endif } else { LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n", diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index ca1ec9fccb..134401785d 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -982,7 +982,7 @@ void init_openair1(void) PHY_vars_UE_g[UE_id][CC_id]->tx_power_max_dBm=23; - PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB=160; + PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB=100; // update UE_mode for each eNB_id not just 0 if (abstraction_flag == 0) From 1769eca225102485dc1d7bee3276d12556dfd442 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 4 Feb 2016 14:42:16 +0100 Subject: [PATCH 040/122] improved gain control when not synched --- openair1/PHY/LTE_ESTIMATION/adjust_gain.c | 15 ++--- openair1/PHY/LTE_ESTIMATION/defs.h | 1 + openair1/PHY/LTE_TRANSPORT/initial_sync.c | 75 +++++++++++++++-------- openair1/SCHED/phy_procedures_lte_ue.c | 4 +- 4 files changed, 55 insertions(+), 40 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index 52f26a2562..59c89b5651 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -38,23 +38,16 @@ extern int card; #endif void -phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) +phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB_id) { - uint16_t rx_power_fil_dB; #ifdef EXMIMO exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr; uint16_t i; #endif - int rssi; - rssi = dB_fixed(phy_vars_ue->PHY_measurements.rssi); - - if (rssi>0) rx_power_fil_dB = rssi; - else rx_power_fil_dB = phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]; - - LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n", - rssi, + LOG_I(PHY,"Gain control: rssi %d (%d,%d)\n", + rx_power_fil_dB, phy_vars_ue->PHY_measurements.rssi, phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] ); @@ -87,7 +80,7 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) phy_vars_ue->rx_total_gain_dB = MIN_RF_GAIN; } - LOG_D(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",phy_vars_ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB); + LOG_I(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",phy_vars_ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB); #ifdef EXMIMO diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h index 903793c2b5..c20d24e34f 100644 --- a/openair1/PHY/LTE_ESTIMATION/defs.h +++ b/openair1/PHY/LTE_ESTIMATION/defs.h @@ -213,6 +213,7 @@ int8_t set_RSRQ_filtered(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index,floa //! Automatic gain control void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, + uint32_t rx_power_fil_dB, unsigned char eNB_id); int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 5c6b479b20..7948ccf3d1 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -280,7 +280,6 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) uint8_t flip_fdd_ncp,flip_fdd_ecp,flip_tdd_ncp,flip_tdd_ecp; // uint16_t Nid_cell_fdd_ncp=0,Nid_cell_fdd_ecp=0,Nid_cell_tdd_ncp=0,Nid_cell_tdd_ecp=0; LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - int i; int ret=-1; int aarx,rx_power=0; /*#ifdef OAI_USRP @@ -316,32 +315,6 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",phy_vars_ue->Mod_id,sync_pos,phy_vars_ue->lte_ue_common_vars.eNb_id); #endif - - for (aarx=0; aarxnb_antennas_rx; aarx++) - rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][sync_pos2], - frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples); - - phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] = dB_fixed(rx_power/frame_parms->nb_antennas_rx); - -#ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",phy_vars_ue->Mod_id,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] ); -#endif - -#ifdef EXMIMO - - if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && - (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) - //phy_adjust_gain(phy_vars_ue,0); - gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0); - -#else -#ifndef OAI_USRP - #ifndef OAI_BLADERF - phy_adjust_gain(phy_vars_ue,0); - #endif -#endif -#endif - // SSS detection // PSS is hypothesized in last symbol of first slot in Frame @@ -597,6 +570,54 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) } + // gain control + if (ret!=0) { //we are not synched, so do a measurement on the full frame + rx_power = 0; + + for (aarx=0; aarxnb_antennas_rx; aarx++) + rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][0], + frame_parms->samples_per_tti*10); + + // we might add a low-pass filter here later + phy_vars_ue->PHY_measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx; + + phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] = dB_fixed(phy_vars_ue->PHY_measurements.rx_power_avg[0]); + +#ifdef DEBUG_INITIAL_SYNCH + LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",phy_vars_ue->Mod_id,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] ); +#endif + +#ifdef EXMIMO + if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && + (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) + //phy_adjust_gain(phy_vars_ue,0); + gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0); + +#else +#ifndef OAI_USRP + #ifndef OAI_BLADERF + phy_adjust_gain(phy_vars_ue,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0); + #endif +#endif +#endif + } + else { +#ifdef EXMIMO + if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && + (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) + //phy_adjust_gain(phy_vars_ue,0); + gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); + +#else +#ifndef OAI_USRP + #ifndef OAI_BLADERF + phy_adjust_gain(phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); + #endif +#endif +#endif + } + + // exit_fun("debug exit"); return ret; } diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 65784331c9..9ecf49de73 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1549,12 +1549,12 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) if (phy_vars_ue->frame_rx%100==0) - gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id],0); + gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); #else #ifndef OAI_USRP #ifndef OAI_BLADERF - phy_adjust_gain (phy_vars_ue,0); + phy_adjust_gain (phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); #endif #endif #endif From 8b533eb133acc2b628e311293dd4707d06419d2a Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 8 Feb 2016 16:42:02 +0100 Subject: [PATCH 041/122] adding config file for TDD --- ...nb.band38.generic.oaisim.local_no_mme.conf | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf new file mode 100644 index 0000000000..ae989b5c8d --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf @@ -0,0 +1,146 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "10"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "TDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 38; + downlink_frequency = 2580000000L; + uplink_frequency_offset = 0; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 25; + rx_gain = 20; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = 0; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 0; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -108; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -108; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 2; + rach_preambleInitialReceivedTargetPower = -100; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + } + ); + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "0.0.0.0"; + ipv6 = "0::0"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "none"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "0.0.0.0/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "none"; + ENB_IPV4_ADDRESS_FOR_S1U = "0.0.0.0/24"; + ENB_PORT_FOR_S1U = 2153; # Spec 2152 + }; + + log_config : + { + global_log_level ="trace"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="trace"; + phy_log_verbosity ="medium"; + mac_log_level ="trace"; + mac_log_verbosity ="medium"; + rlc_log_level ="trace"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="trace"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="trace"; + rrc_log_verbosity ="medium"; + gtpu_log_level ="debug"; + gtpu_log_verbosity ="medium"; + udp_log_level ="debug"; + udp_log_verbosity ="medium"; + osa_log_level ="debug"; + osa_log_verbosity ="low"; + }; + + } +); From ad88d4780224ad6e1d180edc9efbd89c0e23c0f4 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 8 Feb 2016 16:52:46 +0100 Subject: [PATCH 042/122] xforms is now a command line option in oaisim and the flag XFORMS can be always enabled --- targets/SIMU/USER/oaisim.c | 82 +++++++++++++++------------- targets/SIMU/USER/oaisim_functions.c | 11 ++++ 2 files changed, 56 insertions(+), 37 deletions(-) diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index c1d4d64ef6..9e4880906d 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -75,9 +75,9 @@ #include "SCHED/defs.h" #include "SCHED/vars.h" -#ifdef XFORMS +//#ifdef XFORMS #include "PHY/TOOLS/lte_phy_scope.h" -#endif +//#endif #ifdef SMBV // Rohde&Schwarz SMBV100A vector signal generator @@ -163,9 +163,10 @@ extern uint16_t Nid_cell; extern LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; -#ifdef XFORMS +//#ifdef XFORMS int otg_enabled; -#endif +int xforms=0; +//#endif time_stats_t oaisim_stats; time_stats_t oaisim_stats_f; @@ -446,17 +447,18 @@ l2l1_task (void *args_p) char fname[64], vname[64]; int sf; protocol_ctxt_t ctxt; -#ifdef XFORMS + //#ifdef XFORMS // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) // at eNB 0, an UL scope for every UE - FD_lte_phy_scope_ue *form_ue[NUMBER_OF_UE_MAX]; + FD_lte_phy_scope_ue *form_ue[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; FD_lte_phy_scope_enb *form_enb[NUMBER_OF_UE_MAX]; char title[255]; char xname[32] = "oaisim"; int xargc = 1; char *xargv[1]; -#endif + //#endif +#define PRINT_STATS #ifdef PRINT_STATS int len; FILE *UE_stats[NUMBER_OF_UE_MAX]; @@ -485,31 +487,34 @@ l2l1_task (void *args_p) PHY_vars_eNB_g[eNB_inst][CC_id]->proc[9].frame_tx = 1; } -#ifdef XFORMS - xargv[0] = xname; - fl_initialize (&xargc, xargv, NULL, 0, 0); - eNB_inst = 0; + //#ifdef XFORMS + if (xforms==1) { + xargv[0] = xname; + fl_initialize (&xargc, xargv, NULL, 0, 0); + eNB_inst = 0; + + for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) { + for (CC_id=0;CC_idlte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) { - // DL scope at UEs - form_ue[UE_inst] = create_lte_phy_scope_ue(); - sprintf (title, "LTE DL SCOPE eNB %d to UE %d", eNB_inst, UE_inst); - fl_show_form (form_ue[UE_inst]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - - // UL scope at eNB 0 - form_enb[UE_inst] = create_lte_phy_scope_enb(); - sprintf (title, "LTE UL SCOPE UE %d to eNB %d", UE_inst, eNB_inst); - fl_show_form (form_enb[UE_inst]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - - if (openair_daq_vars.use_ia_receiver == 1) { - fl_set_button(form_ue[UE_inst]->button_0,1); - fl_set_object_label(form_ue[UE_inst]->button_0, "IA Receiver ON"); - fl_set_object_color(form_ue[UE_inst]->button_0, FL_GREEN, FL_GREEN); + if (openair_daq_vars.use_ia_receiver == 1) { + fl_set_button(form_ue[CC_id][UE_inst]->button_0,1); + fl_set_object_label(form_ue[CC_id][UE_inst]->button_0, "IA Receiver ON"); + fl_set_object_color(form_ue[CC_id][UE_inst]->button_0, FL_GREEN, FL_GREEN); + } + + } + // UL scope at eNB 0 + form_enb[UE_inst] = create_lte_phy_scope_enb(); + sprintf (title, "LTE UL SCOPE UE %d to eNB %d", UE_inst, eNB_inst); + fl_show_form (form_enb[UE_inst]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); + } - } - -#endif + //#endif #ifdef PRINT_STATS @@ -1176,23 +1181,26 @@ l2l1_task (void *args_p) 1, 1); } -#ifdef XFORMS + //#ifdef XFORMS + if (xforms==1) { eNB_inst = 0; for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) { - phy_scope_UE(form_ue[UE_inst], - PHY_vars_UE_g[UE_inst][0], - eNB_inst, - UE_inst, - 7); + for (CC_id=0;CC_id Date: Mon, 8 Feb 2016 16:53:54 +0100 Subject: [PATCH 043/122] reverting to LOG_D in gain control --- openair1/PHY/LTE_ESTIMATION/adjust_gain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index 59c89b5651..ead0ed7d99 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -46,7 +46,7 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB uint16_t i; #endif - LOG_I(PHY,"Gain control: rssi %d (%d,%d)\n", + LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n", rx_power_fil_dB, phy_vars_ue->PHY_measurements.rssi, phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] @@ -80,7 +80,7 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB phy_vars_ue->rx_total_gain_dB = MIN_RF_GAIN; } - LOG_I(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",phy_vars_ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB); + LOG_D(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",phy_vars_ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB); #ifdef EXMIMO From 2b61863abb857541f9ca7f13e8b9003df0f1dad9 Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Tue, 9 Feb 2016 09:29:26 +0100 Subject: [PATCH 044/122] TX/RX Calibration procedures (lighter than full LMS procedures) --- cmake_targets/CMakeLists.txt | 6 +++--- targets/RT/USER/lte-softmodem.c | 12 ++++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index eb19864e95..23325ace81 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -441,14 +441,14 @@ elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR") include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB") include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR") include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m") -# include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C") - include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/LMS_StreamBoard") + include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C") + include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard") set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp ) LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu") set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp) - set(LIB_LMS_LIBRARIES "${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/build/libLMS_SDR.so" "${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/build/libLMS7002M.a") + set(LIB_LMS_LIBRARIES "${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/build/libLMS_SDR.so" "${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/build/libLMS7002M.a" "${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/libSi5351C.a") set(LOWLATENCY False) elseif (${RF_BOARD} STREQUAL "ETHERNET") diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index a431b35498..7bfb56c6cb 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -941,10 +941,17 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) len = phy_vars_eNB->lte_frame_parms.samples_per_tti>>1; else len = phy_vars_eNB->lte_frame_parms.samples_per_tti; - - for (i=0; ilte_frame_parms.samples_per_tti; @@ -957,6 +964,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) #elif OAI_BLADERF ((short*)dummy_tx_b)[2*i]; #elif OAI_LMSSDR + //phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset]=dummy_tx_b[i]; ((short*)dummy_tx_b)[2*i]; #else ((short*)dummy_tx_b)[2*i]<<4; From 36fb0aae16d94b3e8b246b590023731d1d0ce170 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 9 Feb 2016 10:18:00 +0100 Subject: [PATCH 045/122] initial synch gain control measurement when unsynchronized reverted to take measurement around PSS --- openair1/PHY/LTE_ESTIMATION/lte_sync_time.c | 9 +++------ openair1/PHY/LTE_TRANSPORT/initial_sync.c | 11 +++++++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index 6e2311789e..edbdbda2d1 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -483,13 +483,10 @@ int lte_sync_time(int **rxdata, ///rx data in time domain *eNB_id = sync_source; + LOG_D(PHY,"[UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d (%d dB)\n",sync_source,peak_pos,peak_val,dB_fixed(peak_val)/2); + + #ifdef DEBUG_PHY - msg("[PHY][UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d\n", - sync_source,peak_pos,peak_val); - - - - if (debug_cnt == 0) { write_output("sync_corr0_ue.m","synccorr0",sync_corr_ue0,2*length,1,2); write_output("sync_corr1_ue.m","synccorr1",sync_corr_ue1,2*length,1,2); diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 7948ccf3d1..17ad0542f2 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -571,12 +571,20 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) } // gain control - if (ret!=0) { //we are not synched, so do a measurement on the full frame + if (ret!=0) { //we are not synched, so we cannot use rssi measurement (which is based on channel estimates) rx_power = 0; + // do a measurement on the best guess of the PSS + for (aarx=0; aarxnb_antennas_rx; aarx++) + rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][sync_pos2], + frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples); + + /* + // do a measurement on the full frame for (aarx=0; aarxnb_antennas_rx; aarx++) rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][0], frame_parms->samples_per_tti*10); + */ // we might add a low-pass filter here later phy_vars_ue->PHY_measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx; @@ -617,7 +625,6 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) #endif } - // exit_fun("debug exit"); return ret; } From b60c3c9556d53c5f88fda8bbe95fd04a965fcab0 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 9 Feb 2016 10:23:57 +0100 Subject: [PATCH 046/122] phy test for UE first version --- openair1/PHY/defs.h | 4 + openair1/SCHED/phy_procedures_lte_ue.c | 3 - targets/RT/USER/lte-softmodem.c | 135 +++++++++++-------------- targets/RT/USER/lte-ue.c | 5 +- 4 files changed, 63 insertions(+), 84 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 8b2ae72608..3cabe46d4a 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -271,6 +271,7 @@ typedef struct PHY_VARS_eNB_s { int **dl_precoder_SeNB[3]; char log2_maxp; /// holds the maximum channel/precoder coefficient + /// if ==0 enables phy only test mode int mac_enabled; /// For emulation only (used by UE abstraction to retrieve DCI) @@ -574,6 +575,9 @@ typedef struct { /// holds the maximum channel/precoder coefficient char log2_maxp; + /// if ==0 enables phy only test mode + int mac_enabled; + /// Flag to initialize averaging of PHY measurements int init_averaging; diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index bc84beae43..65e8d502f5 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -87,9 +87,6 @@ fifo_dump_emos_UE emos_dump_UE; # endif #endif -#ifndef OPENAIR2 -//#define DIAG_PHY -#endif #define DLSCH_RB_ALLOC 0x1fbf // skip DC RB (total 23/25 RBs) #define DLSCH_RB_ALLOC_12 0x0aaa // skip DC RB (total 23/25 RBs) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index e67bcb6b07..6fea0e5b42 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -291,6 +291,7 @@ double bw = 10.0e6; static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/; int chain_offset=0; +int phy_test = 0; #ifndef EXMIMO char ref[128] = "internal"; @@ -532,12 +533,12 @@ static void *scope_thread(void *arg) 0,7); } else { -#ifdef OPENAIR2 - len = dump_eNB_l2_stats (stats_buffer, 0); - //fl_set_object_label(form_stats_l2->stats_text, stats_buffer); - fl_clear_browser(form_stats_l2->stats_text); - fl_add_browser_line(form_stats_l2->stats_text, stats_buffer); -#endif + if (PHY_vars_eNB_g[0][0]->mac_enabled==1) { + len = dump_eNB_l2_stats (stats_buffer, 0); + //fl_set_object_label(form_stats_l2->stats_text, stats_buffer); + fl_clear_browser(form_stats_l2->stats_text); + fl_add_browser_line(form_stats_l2->stats_text, stats_buffer); + } len = dump_eNB_stats (PHY_vars_eNB_g[0][0], stats_buffer, 0); if (MAX_NUM_CCs>1) @@ -2063,7 +2064,8 @@ static void get_options (int argc, char **argv) LONG_OPTION_SCANCARRIER, LONG_OPTION_MAXPOWER, LONG_OPTION_DUMP_FRAME, - LONG_OPTION_LOOPMEMORY + LONG_OPTION_LOOPMEMORY, + LONG_OPTION_PHYTEST }; static const struct option long_options[] = { @@ -2080,6 +2082,7 @@ static void get_options (int argc, char **argv) {"ue-max-power", required_argument, NULL, LONG_OPTION_MAXPOWER}, {"ue-dump-frame", no_argument, NULL, LONG_OPTION_DUMP_FRAME}, {"loop-memory", required_argument, NULL, LONG_OPTION_LOOPMEMORY}, + {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST}, {NULL, 0, NULL, 0} }; @@ -2152,6 +2155,10 @@ static void get_options (int argc, char **argv) mode = rx_dump_frame; break; + case LONG_OPTION_PHYTEST: + phy_test = 1; + break; + case 'M': #ifdef ETHERNET strcpy(rrh_eNB_ip,optarg); @@ -2213,7 +2220,6 @@ static void get_options (int argc, char **argv) case 't': target_ul_mcs = atoi (optarg); break; -#ifdef OPENAIR2 case 'W': opt_enabled=1; @@ -2248,7 +2254,6 @@ static void get_options (int argc, char **argv) } break; -#endif case 'V': ouput_vcd = 1; @@ -2417,8 +2422,6 @@ static void get_options (int argc, char **argv) } -#ifdef OPENAIR2 - init_all_otg(0); g_otg->seed = 0; init_seeds(g_otg->seed); @@ -2436,7 +2439,6 @@ static void get_options (int argc, char **argv) init_predef_traffic(enb_properties->properties[i]->num_otg_elements, 1); -#endif glog_level = enb_properties->properties[i]->glog_level; glog_verbosity = enb_properties->properties[i]->glog_verbosity; @@ -2498,9 +2500,7 @@ int main( int argc, char **argv ) int CC_id; uint16_t Nid_cell = 0; uint8_t cooperation_flag=0, abstraction_flag=0; -#ifndef OPENAIR2 uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; -#endif #ifdef ENABLE_TCXO unsigned int tcxo = 114; @@ -2581,15 +2581,9 @@ int main( int argc, char **argv ) printf("configuring for eNB\n"); set_comp_log(HW, hw_log_level, hw_log_verbosity, 1); -#ifdef OPENAIR2 set_comp_log(PHY, phy_log_level, phy_log_verbosity, 1); - if (opt_enabled == 1 ) set_comp_log(OPT, opt_log_level, opt_log_verbosity, 1); - -#else - set_comp_log(PHY, LOG_INFO, LOG_HIGH, 1); -#endif set_comp_log(MAC, mac_log_level, mac_log_verbosity, 1); set_comp_log(RLC, rlc_log_level, rlc_log_verbosity, 1); set_comp_log(PDCP, pdcp_log_level, pdcp_log_verbosity, 1); @@ -2645,8 +2639,6 @@ int main( int argc, char **argv ) MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX); #endif -#ifdef OPENAIR2 - if (opt_type != OPT_NONE) { radio_type_t radio_type; @@ -2659,7 +2651,6 @@ int main( int argc, char **argv ) LOG_E(OPT,"failed to run OPT \n"); } -#endif #ifdef PDCP_USE_NETLINK netlink_init(); #if defined(PDCP_USE_NETLINK_QUEUES) @@ -2729,21 +2720,24 @@ int main( int argc, char **argv ) PHY_vars_UE_g[0][CC_id] = init_lte_UE(frame_parms[CC_id], 0,abstraction_flag,transmission_mode); UE[CC_id] = PHY_vars_UE_g[0][CC_id]; printf("PHY_vars_UE_g[0][%d] = %p\n",CC_id,UE[CC_id]); -#ifndef OPENAIR2 - for (i=0; ipusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; - UE[CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; - UE[CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; + if (phy_test==1) + UE[CC_id]->mac_enabled = 0; + else + UE[CC_id]->mac_enabled = 1; - UE[CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = 0; - UE[CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(0%3); - UE[CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4; + if (UE[CC_id]->mac_enabled == 0) { + for (i=0; ipusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; + UE[CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; + UE[CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; + + UE[CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = 0; + UE[CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(0%3); + UE[CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4; + } } -#endif - - UE[CC_id]->UE_scan = UE_scan; UE[CC_id]->UE_scan_carrier = UE_scan_carrier; UE[CC_id]->mode = mode; @@ -2752,13 +2746,12 @@ int main( int argc, char **argv ) UE[CC_id]->lte_frame_parms.frame_type, UE[CC_id]->X_u); - UE[CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1234; -#ifndef OPENAIR2 - UE[CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235; -#endif + if (UE[CC_id]->mac_enabled == 1) + UE[CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1234; + else + UE[CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235; #ifdef EXMIMO - for (i=0; i<4; i++) { UE[CC_id]->rx_gain_max[i] = rxg_max[i]; UE[CC_id]->rx_gain_med[i] = rxg_med[i]; @@ -2792,9 +2785,7 @@ int main( int argc, char **argv ) UE[CC_id]->tx_power_max_dBm = tx_max_power[CC_id]; - #ifdef EXMIMO - //N_TA_offset if (UE[CC_id]->lte_frame_parms.frame_type == TDD) { if (UE[CC_id]->lte_frame_parms.N_RB_DL == 100) @@ -2806,7 +2797,6 @@ int main( int argc, char **argv ) } else { UE[CC_id]->N_TA_offset = 0; } - #else //already taken care of in lte-softmodem UE[CC_id]->N_TA_offset = 0; @@ -2830,20 +2820,23 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0][CC_id] = init_lte_eNB(frame_parms[CC_id],0,frame_parms[CC_id]->Nid_cell,cooperation_flag,transmission_mode,abstraction_flag); PHY_vars_eNB_g[0][CC_id]->CC_id = CC_id; -#ifndef OPENAIR2 + if (phy_test==1) + PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0; + else + PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1; - for (i=0; ipusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; - PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; - PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; - - PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = i; - PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(i%3); - PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4; + if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { + for (i=0; ipusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; + PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; + PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; + + PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = i; + PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(i%3); + PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4; + } } -#endif - compute_prach_seq(&PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.prach_config_common, PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.frame_type, PHY_vars_eNB_g[0][CC_id]->X_u); @@ -3044,16 +3037,12 @@ int main( int argc, char **argv ) mac_xface = malloc(sizeof(MAC_xface)); -#ifdef OPENAIR2 int eMBMS_active=0; - + l2_init(frame_parms[0],eMBMS_active,(uecap_xer_in==1)?uecap_xer:NULL, - 0,// cba_group_active - 0); // HO flag - - -#endif - + 0,// cba_group_active + 0); // HO flag + mac_xface->macphy_exit = &exit_fun; #if defined(ENABLE_ITTI) @@ -3066,15 +3055,14 @@ int main( int argc, char **argv ) printf("ITTI tasks created\n"); #endif -#ifdef OPENAIR2 - if (UE_flag==1) { - printf("Filling UE band info\n"); - fill_ue_band_info(); - mac_xface->dl_phy_sync_success (0, 0, 0, 1); - } else - mac_xface->mrbch_phy_sync_failure (0, 0, 0); - -#endif + if (phy_test==0) { + if (UE_flag==1) { + printf("Filling UE band info\n"); + fill_ue_band_info(); + mac_xface->dl_phy_sync_success (0, 0, 0, 1); + } else + mac_xface->mrbch_phy_sync_failure (0, 0, 0); + } /* #ifdef OPENAIR2 //if (otg_enabled) { @@ -3466,9 +3454,6 @@ int main( int argc, char **argv ) } } -#ifdef OPENAIR2 - //cleanup_pdcp_thread(); -#endif #ifdef RTAI stop_rt_timer(); @@ -3503,13 +3488,9 @@ int main( int argc, char **argv ) if (ouput_vcd) VCD_SIGNAL_DUMPER_CLOSE(); -#ifdef OPENAIR2 - if (opt_enabled == 1) terminate_opt(); -#endif - logClean(); return 0; diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 6293ad4264..ef29df87dc 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -925,9 +925,7 @@ static void *UE_thread_rx(void *arg) phy_procedures_UE_RX( UE, 0, 0, UE->mode, no_relay, NULL ); } -#ifdef OPENAIR2 - - if (i==0) { + if ((UE->mac_enabled==1) && (i==0)) { ret = mac_xface->ue_scheduler(UE->Mod_id, UE->frame_tx, UE->slot_rx>>1, @@ -950,7 +948,6 @@ static void *UE_thread_rx(void *arg) } } -#endif UE->slot_rx++; if (UE->slot_rx == 20) { From 1d27c988fdd9005a9332e5e7321819b797b16446 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 9 Feb 2016 15:05:22 +0100 Subject: [PATCH 047/122] adding option -s15 to all oaisim testcases except the ones that use OCG (-c) tdd testcases now use dedicted config file --- cmake_targets/autotests/test_case_list.xml | 116 +++++++++------------ 1 file changed, 49 insertions(+), 67 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index cec3963c4e..bb91ed1516 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -10,7 +10,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; uname -a; dmesg|tail 36000 - 0104+ 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016002 016005 016102 016105 016302 016305 + 010202 010203 010204 010205 0104+ 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016002 016005 016102 016105 016302 016305 3 mozart calisson stevens nano amerique @@ -317,22 +317,19 @@ execution Run OAISIM Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit - cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf + cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_DIR/cmake_targets/build_oai --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\" - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38 - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0 + $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -s15 oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" segmentation fault|assertion|exiting|fatal @@ -342,22 +339,19 @@ execution Run OAISIM Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) in PHY_ABSTRACTION mode and search for errors, segmentation fault or exit - cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf + cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_DIR/cmake_targets/build_oai --oaisim --noS1 -c - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\" - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38 - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0 + $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -a -s15 oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" segmentation fault|assertion|exiting|fatal @@ -367,22 +361,19 @@ execution Run OAISIM Rel10 TDD, 1 eNB + 3 UEs (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit -cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf +cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_DIR/cmake_targets/build_oai --oaisim --noS1 -c - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\" - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38 - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0 + $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -s15 oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2" segmentation fault|assertion|exiting|fatal @@ -392,22 +383,19 @@ execution Run OAISIM Rel10 TDD, 1 eNB + 3 UEs (5 MHz) in PHY_ABSTRACTION mode and search for errors, segmentation fault or exit - cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf + cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_DIR/cmake_targets/build_oai --oaisim --noS1 -c - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\" - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38 - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0 + $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -a -s15 oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_nos1.tdd.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2" segmentation fault|assertion|exiting|fatal @@ -417,22 +405,19 @@ execution Run OAI Rel10 TDD, 1 eNB + 1 UE (5 MHz) without abstraction mode, send ping from from eNB to UE, and check that there is no packet losses - cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf + cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_DIR/cmake_targets/build_oai --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\" - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38 - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0 + $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -c26 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -c26 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -c26 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -c26 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -c26 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -c26 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -c26 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -c26 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -c26 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -c26 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -c26 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -c26 oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2 "DL and UL loss rate below 10" segmentation fault|assertion|exiting|fatal @@ -442,22 +427,19 @@ execution Run OAI Rel10 TDD, 1 eNB + 1 UE (5 MHz) in PHY_ABSTRACTION mode, send ping from from eNB to UE, and check that there is no packet losses - cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf + cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_DIR/cmake_targets/build_oai --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\" - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38 - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L - $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0 + $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -c26 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -c26 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -c26 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -c26 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -c26 -a - -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -c26 -a oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2 "DL and UL loss rate below 10" segmentation fault|assertion|exiting|fatal From 051e8ba5cf7b4185d554413eda26f7df8be0e22a Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 9 Feb 2016 15:05:22 +0100 Subject: [PATCH 048/122] adding option -s15 to all oaisim testcases except the ones that use OCG (-c) tdd testcases now use dedicted config file --- cmake_targets/autotests/test_case_list.xml | 48 +++++++++++----------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index bb91ed1516..64e580877e 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -455,12 +455,12 @@ $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F -s15 oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" segmentation fault|assertion|exiting|fatal @@ -476,12 +476,12 @@ $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F -a + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F -a -s15 oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" segmentation fault|assertion|exiting|fatal @@ -497,12 +497,12 @@ $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -F - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -F - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -F - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -F - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -F - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -F + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -F -s15 oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2" segmentation fault|assertion|exiting|fatal @@ -518,12 +518,12 @@ $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -F -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -F -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -F -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -F -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -F -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -F -a + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -F -a -s15 oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2" segmentation fault|assertion|exiting|fatal From 7ed596fe95a42a698d905d224000502cdb37ca3e Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 9 Feb 2016 15:36:23 +0100 Subject: [PATCH 049/122] build_script: enabling XFORMS by default, making HW=None default --- cmake_targets/build_oai | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index c723d8d6dc..1e2528f750 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -42,13 +42,13 @@ THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) source $THIS_SCRIPT_PATH/tools/build_helper MSC_GEN="False" -XFORMS="False" +XFORMS="True" PRINT_STATS="False" VCD_TIMING="False" LOWLATENCY_FLAG_USER="False" FORCE_LOWLATENCY_FLAG_USER="" REL="Rel10" -HW="EXMIMO" +HW="None" NOS1=0 EPC=0 VERBOSE_COMPILE=0 @@ -90,7 +90,7 @@ Options default is Rel10, Rel8 limits the implementation to 3GPP Release 8 version -w | --hardware - EXMIMO (Default), USRP, BLADERF, ETHERNET, None + EXMIMO, USRP, BLADERF, ETHERNET, None (Default) Adds this RF board support (in external packages installation and in compilation) --oaisim Makes the oaisim simulator. Hardware will be defaulted to "NONE". @@ -175,6 +175,9 @@ function main() { -w | --hardware) HW="$2" #"${i#*=}" # Use OAI_USRP as the key word USRP is used inside UHD driver + if [ "$HW" == "EXMIMO" ] ; then + HW="EXMIMO" + fi if [ "$HW" == "USRP" ] ; then HW="OAI_USRP" fi From 6412b22658423ed8ff4b8164971216f5c5afd9d7 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 11 Feb 2016 09:41:37 +0100 Subject: [PATCH 050/122] phy test for UE --- openair1/PHY/LTE_TRANSPORT/initial_sync.c | 22 +- openair1/PHY/LTE_TRANSPORT/print_stats.c | 11 +- openair1/SCHED/phy_procedures_lte_ue.c | 299 ++++++++++------------ openair2/LAYER2/MAC/l1_helpers.c | 7 +- targets/SIMU/USER/oaisim_functions.c | 22 ++ 5 files changed, 173 insertions(+), 188 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 5c6b479b20..31bf94cc51 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -530,20 +530,20 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) #endif if (phy_vars_ue->UE_scan_carrier == 0) { -#ifdef OPENAIR2 - LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",phy_vars_ue->Mod_id); - //mac_resynch(); - mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,0,1);//phy_vars_ue->lte_ue_common_vars.eNb_id); -#endif //OPENAIR2 - + if (phy_vars_ue->mac_enabled==1) { + LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",phy_vars_ue->Mod_id); + //mac_resynch(); + mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,0,1);//phy_vars_ue->lte_ue_common_vars.eNb_id); + phy_vars_ue->UE_mode[0] = PRACH; + } + else { + phy_vars_ue->UE_mode[0] = PUSCH; + } + generate_pcfich_reg_mapping(frame_parms); generate_phich_reg_mapping(frame_parms); // init_prach625(frame_parms); -#ifndef OPENAIR2 - phy_vars_ue->UE_mode[0] = PUSCH; -#else - phy_vars_ue->UE_mode[0] = PRACH; -#endif + //phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors=0; phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_conseq=0; //phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_last=0; diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index a386e1cb30..ceb5237efb 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -107,10 +107,10 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",phy_vars_ue->timing_advance); if (phy_vars_ue->UE_mode[0]==PUSCH) { len += sprintf(&buffer[len], "[UE PROC] Po_PUSCH = %d dBm (PL %d dB, Po_NOMINAL_PUSCH %d dBm, PHR %d dB)\n", - PHY_vars_UE_g[0][0]->ulsch_ue[0]->Po_PUSCH, + phy_vars_ue->ulsch_ue[0]->Po_PUSCH, get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0), - mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id,0), - PHY_vars_UE_g[0][0]->ulsch_ue[0]->PHR); + phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH, + phy_vars_ue->ulsch_ue[0]->PHR); len += sprintf(&buffer[len], "[UE PROC] Po_PUCCH = %d dBm (Po_NOMINAL_PUCCH %d dBm, g_pucch %d dB)\n", get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0)+ phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ @@ -582,9 +582,7 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) len += sprintf(&buffer[len],"%4d ", phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dBm[i]); if ((i>0) && ((i%25) == 0)) - len += sprintf(&buffer[len],"\n ", - phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dBm[i]); - + len += sprintf(&buffer[len],"\n"); } len += sprintf(&buffer[len],"\n"); len += sprintf(&buffer[len],"\n[eNB PROC] PERFORMANCE PARAMETERS\n"); @@ -644,7 +642,6 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB, phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB, - dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB, PUCCH1_THRES+phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm-dB_fixed(phy_vars_eNB->lte_frame_parms.N_RB_UL), phy_vars_eNB->eNB_UE_stats[UE_id].sector); diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 65e8d502f5..e3be52cb92 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -59,20 +59,15 @@ extern int card; #endif #endif -//#define DEBUG_PHY_PROC -#define UE_TX_POWER (-10) +#define DEBUG_PHY_PROC -//#ifdef OPENAIR2 #ifndef PUCCH #define PUCCH #endif -//#endif -//#ifdef OPENAIR2 #include "LAYER2/MAC/extern.h" #include "LAYER2/MAC/defs.h" #include "UTIL/LOG/log.h" -//#endif #ifdef EMOS fifo_dump_emos_UE emos_dump_UE; @@ -639,16 +634,12 @@ void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) { #endif int dummy_tx_buffer[3840*4] __attribute__((aligned(16))); -#ifndef OPENAIR2 PRACH_RESOURCES_t prach_resources_local; -#endif void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) { -#ifndef OPENAIR2 int i; -#endif uint16_t first_rb, nb_rb; uint8_t harq_pid; unsigned int input_buffer_length; @@ -721,8 +712,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra subframe_tx); -#ifdef OPENAIR2 - + if (phy_vars_ue->mac_enabled == 1) { if ((phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) && (phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id] == frame_tx) && (phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3 @@ -753,8 +743,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra Msg3_flag=0; } - -#endif + } if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { @@ -853,19 +842,17 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #endif stop_meas(&phy_vars_ue->ulsch_encoding_stats); - -#ifdef OPENAIR2 - // signal MAC that Msg3 was sent - mac_xface->Msg3_transmitted(Mod_id, - CC_id, - frame_tx, - eNB_id); -#endif + if (phy_vars_ue->mac_enabled == 1) { + // signal MAC that Msg3 was sent + mac_xface->Msg3_transmitted(Mod_id, + CC_id, + frame_tx, + eNB_id); + } } else { input_buffer_length = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS/8; -#ifdef OPENAIR2 - + if (phy_vars_ue->mac_enabled==1) { // LOG_D(PHY,"[UE %d] ULSCH : Searching for MAC SDUs\n",Mod_id); if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0) { //if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { @@ -902,7 +889,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra LOG_T(PHY,"\n"); #endif #endif -#else //OPENAIR2 + } + else { // the following lines were necessary for the calibration in CROWN /* if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { @@ -925,8 +913,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra for (i=0;iulsch_encoding_stats); if (abstraction_flag==0) { @@ -958,12 +946,13 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra } if (abstraction_flag == 0) { -#ifdef OPENAIR2 - pusch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,1, abstraction_flag); - phy_vars_ue->tx_power_dBm = phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH; -#else - phy_vars_ue->tx_power_dBm = UE_TX_POWER; -#endif + if (phy_vars_ue->mac_enabled==1) { + pusch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,1, abstraction_flag); + phy_vars_ue->tx_power_dBm = phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH; + } + else { + phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm; + } phy_vars_ue->tx_total_RE = nb_rb*12; #if defined(EXMIMO) || defined(OAI_USRP) @@ -1020,17 +1009,19 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra if (is_SR_TXOp(phy_vars_ue,eNB_id,subframe_tx)==1) { LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n", Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx); -#ifdef OPENAIR2 - SR_payload = mac_xface->ue_get_SR(Mod_id, - CC_id, - frame_tx, - eNB_id, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, - subframe_tx); // subframe used for meas gap -#else - SR_payload = 1; -#endif + if (phy_vars_ue->mac_enabled==1) { + SR_payload = mac_xface->ue_get_SR(Mod_id, + CC_id, + frame_tx, + eNB_id, + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, + subframe_tx); // subframe used for meas gap + } + else { + SR_payload = 1; + } + if (SR_payload>0) { generate_ul_signal = 1; LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n", @@ -1038,8 +1029,9 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra } else { phy_vars_ue->sr[subframe_tx]=0; } - } else + } else { SR_payload=0; + } if (get_ack(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack, @@ -1054,12 +1046,13 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra pucch_ack_payload, SR_payload); -#ifdef OPENAIR2 - Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format); - phy_vars_ue->tx_power_dBm = Po_PUCCH; -#else - phy_vars_ue->tx_power_dBm = UE_TX_POWER; -#endif + if (phy_vars_ue->mac_enabled == 1) { + Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format); + } + else { + Po_PUCCH = phy_vars_ue->tx_power_max_dBm; + } + phy_vars_ue->tx_power_dBm = Po_PUCCH; phy_vars_ue->tx_total_RE = 12; #if defined(EXMIMO) || defined(OAI_USRP) @@ -1117,12 +1110,13 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra } } else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC -#ifdef OPENAIR2 - Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1); - phy_vars_ue->tx_power_dBm = Po_PUCCH; -#else - phy_vars_ue->tx_power_dBm = UE_TX_POWER; -#endif + if (phy_vars_ue->mac_enabled == 1) { + Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1); + } + else { + Po_PUCCH = phy_vars_ue->tx_power_max_dBm; + } + phy_vars_ue->tx_power_dBm = Po_PUCCH; phy_vars_ue->tx_total_RE = 12; #if defined(EXMIMO) || defined(OAI_USRP) @@ -1342,30 +1336,23 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra // }// slot_tx is even // else { // slot_tx is odd, do the PRACH here -#ifdef OPENAIR2 - if ((phy_vars_ue->UE_mode[eNB_id] == PRACH) && (phy_vars_ue->lte_frame_parms.prach_config_common.prach_Config_enabled==1)) { -#else - - if (1) { -#endif - // check if we have PRACH opportunity if (is_prach_subframe(&phy_vars_ue->lte_frame_parms,frame_tx,subframe_tx)) { phy_vars_ue->generate_prach=0; -#ifdef OPENAIR2 - // ask L2 for RACH transport - if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) { - phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id, - CC_id, - frame_tx, - eNB_id, - subframe_tx); - // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,phy_vars_ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon); - } -#endif + if (phy_vars_ue->mac_enabled==1){ + // ask L2 for RACH transport + if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) { + phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id, + CC_id, + frame_tx, + eNB_id, + subframe_tx); + // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,phy_vars_ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon); + } + } if (phy_vars_ue->prach_resources[eNB_id]!=NULL) { @@ -1388,16 +1375,13 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra phy_vars_ue->prach_resources[eNB_id]->ra_TDD_map_index, phy_vars_ue->prach_resources[eNB_id]->ra_RNTI); -#ifdef OPENAIR2 - if (mode != calib_prach_tx) + if ((phy_vars_ue->mac_enabled==1) && (mode != calib_prach_tx)) { phy_vars_ue->tx_power_dBm = phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id); + } else { phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm; phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; } -#else - phy_vars_ue->tx_power_dBm = UE_TX_POWER; -#endif phy_vars_ue->tx_total_RE = 96; @@ -1428,12 +1412,12 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra } else { UE_transport_info[Mod_id][CC_id].cntl.prach_flag=1; UE_transport_info[Mod_id][CC_id].cntl.prach_id=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex; -#ifdef OPENAIR2 - mac_xface->Msg1_transmitted(Mod_id, - CC_id, - frame_tx, - eNB_id); -#endif + if (phy_vars_ue->mac_enabled==1){ + mac_xface->Msg1_transmitted(Mod_id, + CC_id, + frame_tx, + eNB_id); + } } LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n", @@ -1817,11 +1801,11 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst frame_tx += ((int)(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1]&0xfc)); frame_tx += pbch_phase; -#ifdef OPENAIR2 - mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,frame_rx,eNB_id, - phy_vars_ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0); -#endif - + if (phy_vars_ue->mac_enabled==1) { + mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,frame_rx,eNB_id, + phy_vars_ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0); + } + #ifdef EMOS //emos_dump_UE.frame_tx = frame_tx; //emos_dump_UE.mimo_mode = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1]; @@ -1901,16 +1885,15 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst phy_vars_ue->Mod_id,frame_rx, slot_rx); phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq++; phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors++; -#ifdef OPENAIR2 - mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id); -#else - - if (phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq>=100) { - LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n"); - mac_xface->macphy_exit("More that 100 consecutive PBCH errors!"); + if (phy_vars_ue->mac_enabled == 1) { + mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id); + } + else{ + if (phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq>=100) { + LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n"); + mac_xface->macphy_exit("More that 100 consecutive PBCH errors!"); + } } - -#endif } if (frame_rx % 100 == 0) { @@ -2411,9 +2394,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac int eNB_id_i = 1; uint8_t dual_stream_UE = 0; #endif -#ifndef OPENAIR2 uint8_t *rar; -#endif int pmch_flag=0; uint8_t sync_area=255; int pmch_mcs=-1; @@ -2422,9 +2403,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac int slot_rx = phy_vars_ue->slot_rx; int subframe_rx = slot_rx>>1; int subframe_prev = (subframe_rx+9)%10; -#ifdef OPENAIR2 int CC_id = phy_vars_ue->CC_id; -#endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN); @@ -2681,10 +2660,11 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); - // if (abstraction_flag ==0 ) - dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid); - mac_xface->macphy_exit(""); - //#endif + /* + if (abstraction_flag ==0 ) + dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid); + mac_xface->macphy_exit(""); + */ } else { LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n", phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, @@ -2703,14 +2683,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac LOG_T(PHY,"\n"); #endif #endif -#ifdef OPENAIR2 - mac_xface->ue_send_sdu(phy_vars_ue->Mod_id, - CC_id, - frame_rx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3, - eNB_id); -#endif + if (phy_vars_ue->mac_enabled == 1) { + mac_xface->ue_send_sdu(phy_vars_ue->Mod_id, + CC_id, + frame_rx, + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b, + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3, + eNB_id); + } phy_vars_ue->total_TBS[eNB_id] = phy_vars_ue->total_TBS[eNB_id] + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS; phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_TBS[eNB_id] + @@ -2880,24 +2860,20 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); #endif -#ifdef OPENAIR2 - /* - printf("\n\n"); - for (i=0;idlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3;i++) - printf("%02x ",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b[i]); - printf("\n"); - */ - mac_xface->ue_decode_si(phy_vars_ue->Mod_id, - CC_id, - frame_rx, - eNB_id, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3); - /* - if ((frame_rx % 160) < 10) - printf("sending SI to L2 in frame %d\n",frame_rx); - */ -#endif + if (phy_vars_ue->mac_enabled == 1) { + /* + printf("\n\n"); + for (i=0;idlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3;i++) + printf("%02x ",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b[i]); + printf("\n"); + */ + mac_xface->ue_decode_si(phy_vars_ue->Mod_id, + CC_id, + frame_rx, + eNB_id, + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b, + phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3); + } } } @@ -3013,8 +2989,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac subframe_prev, phy_vars_ue->UE_mode[eNB_id]); #endif -#ifdef OPENAIR2 - + if (phy_vars_ue->mac_enabled == 1) { if ((phy_vars_ue->UE_mode[eNB_id] != PUSCH) && (phy_vars_ue->prach_resources[eNB_id]->Msg3!=NULL)) { LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n", phy_vars_ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0), @@ -3071,14 +3046,13 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex); } } // mode != PUSCH - -#else //OPENAIR2 - - rar = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b+1; - timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); - //timing_advance = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0]; - process_timing_advance_rar(phy_vars_ue,timing_advance); -#endif + } + else { + rar = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b+1; + timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); + //timing_advance = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0]; + process_timing_advance_rar(phy_vars_ue,timing_advance); + } } //ret <= MAX_ITERATIONS /* @@ -3630,24 +3604,21 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr int CC_id =0; #endif int frame_rx = phy_vars_ue->frame_rx; -#ifdef OPENAIR2 int frame_tx = phy_vars_ue->frame_tx; -#endif int slot_rx = phy_vars_ue->slot_rx; int slot_tx = phy_vars_ue->slot_tx; int subframe_tx = slot_tx>>1; int subframe_rx = slot_rx>>1; #undef DEBUG_PHY_PROC -#ifdef OPENAIR2 UE_L2_STATE_t ret; -#endif -#ifndef OPENAIR2 - phy_vars_ue->UE_mode[eNB_id]=PUSCH; - phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local; - prach_resources_local.ra_RNTI = 0xbeef; - prach_resources_local.ra_PreambleIndex = 0; -#endif + + if (phy_vars_ue->mac_enabled == 0) { + phy_vars_ue->UE_mode[eNB_id]=PUSCH; + phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local; + prach_resources_local.ra_RNTI = 0xbeef; + prach_resources_local.ra_PreambleIndex = 0; + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1); @@ -3846,16 +3817,14 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); } -#ifdef OPENAIR2 - - if (slot_rx%2==0) { - - ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id, - frame_tx, - subframe_rx, - subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx), - eNB_id, - 0/*FIXME CC_id*/); + if (phy_vars_ue->mac_enabled==1) { + if (slot_rx%2==0) { + ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id, + frame_tx, + subframe_rx, + subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx), + eNB_id, + 0/*FIXME CC_id*/); if (ret == CONNECTION_LOST) { LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",phy_vars_ue->Mod_id, @@ -3874,11 +3843,7 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr phy_vars_ue->UE_mode[eNB_id] = PRACH; } } - -#endif - - // if (last_slot == 19) - // phy_vars_ue->frame++; + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0); stop_meas(&phy_vars_ue->phy_proc); diff --git a/openair2/LAYER2/MAC/l1_helpers.c b/openair2/LAYER2/MAC/l1_helpers.c index 3b4c78ea92..44bdbfe00e 100644 --- a/openair2/LAYER2/MAC/l1_helpers.c +++ b/openair2/LAYER2/MAC/l1_helpers.c @@ -47,8 +47,8 @@ int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP,uint8_t CC_id) if (CC_id>0) { LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return 0; // not reached + //mac_xface->macphy_exit("MAC FATAL CC_id>0"); + return 0; } if (UE_mac_inst[module_idP].radioResourceConfigCommon) { @@ -56,7 +56,8 @@ int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP,uint8_t CC_id) } else { LOG_E(MAC,"[UE %d] CCid %d FATAL radioResourceConfigCommon is NULL !!!\n",module_idP,CC_id); - mac_xface->macphy_exit("FATAL radioResourceConfigCommon is NULL"); + //mac_xface->macphy_exit("FATAL radioResourceConfigCommon is NULL"); + return 0; } return(-120 + (rach_ConfigCommon->powerRampingParameters.preambleInitialReceivedTargetPower<<1) + diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index ca1ec9fccb..75e4d40504 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -136,6 +136,8 @@ int td = 0; int td_avg = 0; int sleep_time_us = 0; +int phy_test = 0; + #ifdef OPENAIR2 // omv related info //pid_t omv_pid; @@ -206,6 +208,7 @@ void get_simulation_options(int argc, char *argv[]) LONG_OPTION_MALLOC_TRACE_ENABLED, LONG_OPTION_CBA_BACKOFF_TIMER, + LONG_OPTION_PHYTEST, }; static struct option long_options[] = { @@ -237,11 +240,17 @@ void get_simulation_options(int argc, char *argv[]) {"cba-backoff", required_argument, 0, LONG_OPTION_CBA_BACKOFF_TIMER}, + {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST}, + {NULL, 0, NULL, 0} }; while ((option = getopt_long (argc, argv, "aA:b:B:c:C:D:d:eE:f:FGg:hHi:IJ:j:k:K:l:L:m:M:n:N:oO:p:P:qQ:rR:s:S:t:T:u:U:vV:w:W:x:X:y:Y:z:Z:", long_options, NULL)) != -1) { switch (option) { + case LONG_OPTION_PHYTEST: + phy_test = 1; + break; + case LONG_OPTION_ENB_CONF: if (optarg) { free(conf_config_file_name); // prevent memory leak if option is used multiple times @@ -976,6 +985,14 @@ void init_openair1(void) } } + for (eNB_id=0; eNB_idmac_enabled=0; + else + PHY_vars_eNB_g[eNB_id][CC_id]->mac_enabled=1; + } + // init_ue_status(); for (UE_id=0; UE_idUE_mode[0] = PRACH; } + if (phy_test==1) + PHY_vars_UE_g[UE_id][CC_id]->mac_enabled=0; + else + PHY_vars_UE_g[UE_id][CC_id]->mac_enabled=1; + PHY_vars_UE_g[UE_id][CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235 + UE_id; PHY_vars_UE_g[UE_id][CC_id]->current_dlsch_cqi[0] = 10; From 051a4e2aa550ad3ac886e05149c498c18ab622a2 Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Thu, 11 Feb 2016 10:04:36 +0100 Subject: [PATCH 051/122] added Si5351C directory changes in lmslib.cpp --- openair1/PHY/LTE_REFSIG/primary_synch.h | 28 - openair1/PHY/LTE_TRANSPORT/initial_sync.c | 25 +- openair1/PHY/LTE_TRANSPORT/print_stats.c | 6 +- openair1/SCHED/phy_procedures_lte_ue.c | 30 +- .../USERSPACE/LIB/Si5351C/CMakeLists.txt | 11 + .../LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp | 872 ++++++++++++++++++ .../LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h | 100 ++ .../LIB/Si5351C/build/CMakeCache.txt | 326 +++++++ .../CMakeFiles/2.8.12.2/CMakeCCompiler.cmake | 56 ++ .../2.8.12.2/CMakeCXXCompiler.cmake | 57 ++ .../2.8.12.2/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 8587 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 8600 bytes .../CMakeFiles/2.8.12.2/CMakeSystem.cmake | 15 + .../2.8.12.2/CompilerIdC/CMakeCCompilerId.c | 389 ++++++++ .../CMakeFiles/2.8.12.2/CompilerIdC/a.out | Bin 0 -> 8683 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 377 ++++++++ .../CMakeFiles/2.8.12.2/CompilerIdCXX/a.out | Bin 0 -> 8692 bytes .../CMakeDirectoryInformation.cmake | 16 + .../Si5351C/build/CMakeFiles/CMakeOutput.log | 263 ++++++ .../Si5351C/build/CMakeFiles/Makefile.cmake | 43 + .../LIB/Si5351C/build/CMakeFiles/Makefile2 | 102 ++ .../CMakeFiles/Si5351C.dir/CXX.includecache | 8 + .../CMakeFiles/Si5351C.dir/DependInfo.cmake | 22 + .../build/CMakeFiles/Si5351C.dir/Si5351C.o | Bin 0 -> 144184 bytes .../build/CMakeFiles/Si5351C.dir/build.make | 106 +++ .../CMakeFiles/Si5351C.dir/cmake_clean.cmake | 10 + .../Si5351C.dir/cmake_clean_target.cmake | 3 + .../CMakeFiles/Si5351C.dir/depend.internal | 6 + .../build/CMakeFiles/Si5351C.dir/depend.make | 6 + .../build/CMakeFiles/Si5351C.dir/flags.make | 8 + .../build/CMakeFiles/Si5351C.dir/link.txt | 2 + .../CMakeFiles/Si5351C.dir/progress.make | 2 + .../build/CMakeFiles/TargetDirectories.txt | 1 + .../build/CMakeFiles/cmake.check_cache | 1 + .../Si5351C/build/CMakeFiles/progress.marks | 1 + .../USERSPACE/LIB/Si5351C/build/Makefile | 157 ++++ .../LIB/Si5351C/build/cmake_install.cmake | 44 + .../USERSPACE/LIB/Si5351C/build/libSi5351C.a | Bin 0 -> 162342 bytes targets/RT/USER/lte-softmodem.c | 4 +- targets/RT/USER/lte-ue.c | 6 +- 40 files changed, 3038 insertions(+), 65 deletions(-) create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeCache.txt create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake create mode 100755 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin create mode 100755 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c create mode 100755 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeOutput.log create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile.cmake create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile2 create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/CXX.includecache create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/DependInfo.cmake create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/Si5351C.o create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/build.make create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean.cmake create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean_target.cmake create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.internal create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.make create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/flags.make create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/link.txt create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/progress.make create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/TargetDirectories.txt create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/cmake.check_cache create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/progress.marks create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/Makefile create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/cmake_install.cmake create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/libSi5351C.a diff --git a/openair1/PHY/LTE_REFSIG/primary_synch.h b/openair1/PHY/LTE_REFSIG/primary_synch.h index f9cf6fc171..717f2e552c 100644 --- a/openair1/PHY/LTE_REFSIG/primary_synch.h +++ b/openair1/PHY/LTE_REFSIG/primary_synch.h @@ -1,31 +1,3 @@ -/******************************************************************************* - 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 . - - 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 - - *******************************************************************************/ short primary_synch0[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-26120,-19785,11971,-30502,-24020,-22288,32117,6492,31311,9658,-16384,-28378,25100,-21063,-7292,-31946,20429,25618,14948,29158,11971,-30502,31311,9658,25100,-21063,-16384,28377,-24020,22287,32117,6492,-7292,31945,20429,25618,-26120,-19785,-16384,-28378,-16384,28377,-26120,-19785,-32402,4883,31311,-9659,32117,6492,-7292,-31946,32767,-1,25100,-21063,-24020,22287,-32402,4883,-32402,4883,-24020,22287,25100,-21063,32767,-1,-7292,-31946,32117,6492,31311,-9659,-32402,4883,-26120,-19785,-16384,28377,-16384,-28378,-26120,-19785,20429,25618,-7292,31945,32117,6492,-24020,22287,-16384,28377,25100,-21063,31311,9658,11971,-30502,14948,29158,20429,25618,-7292,-31946,25100,-21063,-16384,-28378,31311,9658,32117,6492,-24020,-22288,11971,-30502,-26120,-19785,32767,0,0,0,0,0,0,0,0,0,0,0}; short primary_synch1[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,-8086,-24020,-22288,2448,32675,-26120,19784,27073,18458,-16384,28377,25100,21062,-29523,14217,-7292,31945,-13477,-29868,-24020,-22288,27073,18458,25100,21062,-16384,-28378,2448,-32676,-26120,19784,-29523,-14218,-7292,31945,-31754,-8086,-16384,28377,-16384,-28378,-31754,-8086,31311,-9659,27073,-18459,-26120,19784,-29523,14217,32767,-1,25100,21062,2448,-32676,31311,-9659,31311,-9659,2448,-32676,25100,21062,32767,0,-29523,14217,-26120,19784,27073,-18459,31311,-9659,-31754,-8086,-16384,-28378,-16384,28377,-31754,-8086,-7292,31945,-29523,-14218,-26120,19784,2448,-32676,-16384,-28378,25100,21062,27073,18458,-24020,-22288,-13477,-29868,-7292,31945,-29523,14217,25100,21062,-16384,28377,27073,18458,-26120,19784,2448,32675,-24020,-22288,-31754,-8086,32767,0,0,0,0,0,0,0,0,0,0,0}; short primary_synch2[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,8085,-24020,22287,2448,-32676,-26120,-19785,27073,-18459,-16384,-28378,25100,-21063,-29523,-14218,-7292,-31946,-13477,29867,-24020,22287,27073,-18459,25100,-21063,-16384,28377,2448,32675,-26120,-19785,-29523,14217,-7292,-31946,-31754,8085,-16384,-28378,-16384,28377,-31754,8085,31311,9658,27073,18458,-26120,-19785,-29523,-14218,32767,0,25100,-21063,2448,32675,31311,9658,31311,9658,2448,32675,25100,-21063,32767,0,-29523,-14218,-26120,-19785,27073,18458,31311,9658,-31754,8085,-16384,28377,-16384,-28378,-31754,8085,-7292,-31946,-29523,14217,-26120,-19785,2448,32675,-16384,28377,25100,-21063,27073,-18459,-24020,22287,-13477,29867,-7292,-31946,-29523,-14218,25100,-21063,-16384,-28378,27073,-18459,-26120,-19785,2448,-32676,-24020,22287,-31754,8085,32767,-1,0,0,0,0,0,0,0,0,0,0}; diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 5c6b479b20..b8be6305de 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -48,7 +48,7 @@ #include "gain_control.h" #endif -#if defined(OAI_USRP) || defined(EXMIMO) +#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR) #include "common_lib.h" extern openair0_config_t openair0_cfg[]; #endif @@ -291,17 +291,10 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) frame_parms->Ncp=NORMAL; frame_parms->frame_type=FDD; init_frame_parms(frame_parms,1); - - // write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); - - /*#ifdef OAI_USRP - for (aarx = 0; aarxnb_antennas_rx;aarx++) { - rxdata128 = (__m128i*)phy_vars_ue->lte_ue_common_vars.rxdata[aarx]; - for (i=0; i<(frame_parms->samples_per_tti*10)>>2; i++) { - rxdata128[i] = _mm_srai_epi16(rxdata128[i],4); - } - } - #endif*/ + /* + write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + exit(-1); + */ sync_pos = lte_sync_time(phy_vars_ue->lte_ue_common_vars.rxdata, frame_parms, (int *)&phy_vars_ue->lte_ue_common_vars.eNb_id); @@ -336,9 +329,11 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) #else #ifndef OAI_USRP - #ifndef OAI_BLADERF +#ifndef OAI_BLADERF +#ifndef OAI_LMSSDR phy_adjust_gain(phy_vars_ue,0); - #endif +#endif +#endif #endif #endif @@ -569,7 +564,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration, phich_string[phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource], phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB); -#if defined(OAI_USRP) || defined(EXMIMO) +#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR) LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n", phy_vars_ue->Mod_id, phy_vars_ue->frame_rx, diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index a386e1cb30..8f6483a3e3 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -50,7 +50,7 @@ #endif extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index); -#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) +#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) #include "common_lib.h" extern openair0_config_t openair0_cfg[]; #endif @@ -97,10 +97,10 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t #ifdef EXMIMO len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",phy_vars_ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]); #endif -#if defined(OAI_USRP) || defined(OAI_BLADERF) +#if defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB); #endif -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz (%d), estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset); #endif len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]); diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index bc84beae43..c746fe7254 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -121,7 +121,7 @@ extern int rx_sig_fifo; #endif -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; #endif @@ -197,7 +197,7 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) exit(-1); } -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) //unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162}; /* unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL) @@ -669,7 +669,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra uint8_t ack_status=0; int8_t Po_PUCCH; int32_t ulsch_start=0; -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) int overflow=0; int k,l; #endif @@ -969,7 +969,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #endif phy_vars_ue->tx_total_RE = nb_rb*12; -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) tx_amp = get_tx_amp(phy_vars_ue->tx_power_dBm, phy_vars_ue->tx_power_max_dBm, phy_vars_ue->lte_frame_parms.N_RB_UL, @@ -1065,7 +1065,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #endif phy_vars_ue->tx_total_RE = 12; -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) tx_amp = get_tx_amp(Po_PUCCH, phy_vars_ue->tx_power_max_dBm, phy_vars_ue->lte_frame_parms.N_RB_UL, @@ -1128,7 +1128,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #endif phy_vars_ue->tx_total_RE = 12; -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) tx_amp = get_tx_amp(Po_PUCCH, phy_vars_ue->tx_power_max_dBm, phy_vars_ue->lte_frame_parms.N_RB_UL, @@ -1230,7 +1230,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra if (abstraction_flag == 0) { nsymb = (frame_parms->Ncp == 0) ? 14 : 12; -#if defined(EXMIMO) || defined(OAI_USRP) //this is the EXPRESS MIMO case +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- openair_daq_vars.timing_advance- phy_vars_ue->timing_advance- @@ -1257,7 +1257,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra for (aa=0; aanb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) dummy_tx_buffer, #else &phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start], @@ -1268,7 +1268,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra CYCLIC_PREFIX); else normal_prefix_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) dummy_tx_buffer, #else &phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start], @@ -1289,7 +1289,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra } */ #ifndef OFDMA_ULSCH -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,0); apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,1); #else @@ -1304,7 +1304,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra */ #endif -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) overflow = ulsch_start - 9*frame_parms->samples_per_tti; //if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow); @@ -1404,7 +1404,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra phy_vars_ue->tx_total_RE = 96; -#if defined(EXMIMO) || defined(OAI_USRP) +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm, phy_vars_ue->tx_power_max_dBm, phy_vars_ue->lte_frame_parms.N_RB_UL, @@ -1553,9 +1553,11 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t #else #ifndef OAI_USRP - #ifndef OAI_BLADERF +#ifndef OAI_BLADERF +#ifndef OAI_LMSSDR phy_adjust_gain (phy_vars_ue,0); - #endif +#endif +#endif #endif #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT); diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt new file mode 100644 index 0000000000..88a021ae00 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt @@ -0,0 +1,11 @@ +set(si5351_src_files + Si5351C.cpp +) +set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 " +) + + +add_library(Si5351C STATIC ${si5351_src_files}) +target_include_directories(Si5351C PUBLIC ../lms7002m ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(Si5351C LMS7002M) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp new file mode 100644 index 0000000000..88bcb74f3d --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp @@ -0,0 +1,872 @@ +/** +@file Si5351C.cpp +@author Lime Microsystems +@brief Configuring of Si5351C +*/ + +#include "Si5351C.h" +#include "lmsComms.h" +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +#define Log(msg, type) cout << (msg) << endl; + +/// Splits float into fraction integers A + B/C +void realToFrac(const float real, int &A, int &B, int &C) +{ + A = (int)real; + B = (int)((real - A) * 1048576 + 0.5); + C = 1048576; + + int a = B; + int b = C; + int temp; + while( b!= 0) // greatest common divider + { + temp = a % b; + a = b; + b = temp; + } + B = B/a; + C = C/a; +} + +/// Default configuration +const unsigned char Si5351C::m_defaultConfiguration[] = +{ 0,0x00, + 1,0x00, + 2,0x08, + 3,0x00, + 4,0x00, + 5,0x00, + 6,0x00, + 7,0x00, + 8,0x00, + 9,0x00, + 10,0x00, + 11,0x00, + 12,0x00, + 13,0x00, + 14,0x00, + 15,0x04, + 16,0x4F, + 17,0x4F, + 18,0x4F, + 19,0x4F, + 20,0x4F, + 21,0x4F, + 22,0x0F, + 23,0x0F, + 24,0x00, + 25,0x00, + 26,0x00, + 27,0x80, + 28,0x00, + 29,0x0B, + 30,0x2F, + 31,0x00, + 32,0x00, + 33,0x00, + 34,0x00, + 35,0x00, + 36,0x00, + 37,0x00, + 38,0x00, + 39,0x00, + 40,0x00, + 41,0x00, + 42,0x00, + 43,0x01, + 44,0x00, + 45,0x0D, + 46,0x00, + 47,0x00, + 48,0x00, + 49,0x00, + 50,0x00, + 51,0x01, + 52,0x00, + 53,0x0D, + 54,0x00, + 55,0x00, + 56,0x00, + 57,0x00, + 58,0x00, + 59,0x01, + 60,0x00, + 61,0x0D, + 62,0x00, + 63,0x00, + 64,0x00, + 65,0x00, + 66,0x00, + 67,0x01, + 68,0x00, + 69,0x0D, + 70,0x00, + 71,0x00, + 72,0x00, + 73,0x00, + 74,0x00, + 75,0x01, + 76,0x00, + 77,0x0D, + 78,0x00, + 79,0x00, + 80,0x00, + 81,0x00, + 82,0x00, + 83,0x01, + 84,0x00, + 85,0x0D, + 86,0x00, + 87,0x00, + 88,0x00, + 89,0x00, + 90,0x1E, + 91,0x1E, + 92,0x00, + 93,0x00, + 94,0x00, + 95,0x00, + 96,0x00, + 97,0x00, + 98,0x00, + 99,0x00, +100,0x00, +101,0x00, +102,0x00, +103,0x00, +104,0x00, +105,0x00, +106,0x00, +107,0x00, +108,0x00, +109,0x00, +110,0x00, +111,0x00, +112,0x00, +113,0x00, +114,0x00, +115,0x00, +116,0x00, +117,0x00, +118,0x00, +119,0x00, +120,0x00, +121,0x00, +122,0x00, +123,0x00, +124,0x00, +125,0x00, +126,0x00, +127,0x00, +128,0x00, +129,0x00, +130,0x00, +131,0x00, +132,0x00, +133,0x00, +134,0x00, +135,0x00, +136,0x00, +137,0x00, +138,0x00, +139,0x00, +140,0x00, +141,0x00, +142,0x00, +143,0x00, +144,0x00, +145,0x00, +146,0x00, +147,0x00, +148,0x00, +149,0x00, +150,0x00, +151,0x00, +152,0x00, +153,0x00, +154,0x00, +155,0x00, +156,0x00, +157,0x00, +158,0x00, +159,0x00, +160,0x00, +161,0x00, +162,0x00, +163,0x00, +164,0x00, +165,0x00, +166,0x00, +167,0x00, +168,0x00, +169,0x00, +170,0x00, +171,0x00, +172,0x00, +173,0x00, +174,0x00, +175,0x00, +176,0x00, +177,0x00, +178,0x00, +179,0x00, +180,0x00, +181,0x30, +182,0x00, +183,0xD2, +184,0x60, +185,0x60, +186,0x00, +187,0xC0, +188,0x00, +189,0x00, +190,0x00, +191,0x00, +192,0x00, +193,0x00, +194,0x00, +195,0x00, +196,0x00, +197,0x00, +198,0x00, +199,0x00, +200,0x00, +201,0x00, +202,0x00, +203,0x00, +204,0x00, +205,0x00, +206,0x00, +207,0x00, +208,0x00, +209,0x00, +210,0x00, +211,0x00, +212,0x00, +213,0x00, +214,0x00, +215,0x00, +216,0x00, +217,0x00, +218,0x00, +219,0x00, +220,0x00, +221,0x0D, +222,0x00, +223,0x00, +224,0x00, +225,0x00, +226,0x00, +227,0x00, +228,0x00, +229,0x00, +230,0x00, +231,0x00, +232,0x00}; + +// --------------------------------------------------------------------------- +Si5351C::Si5351C() +{ + memset(m_newConfiguration, 0, 255); + for(unsigned int i=0; iIsOpen() ) + { + return FAILED; + } + LMScomms::TransferStatus status; + status = device->TransferPacket(pkt); + if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) + { + return FAILED; + } + return SUCCESS; +} + +// --------------------------------------------------------------------------- +/** + @brief Sets connection manager to use for data transferring Si5351C + @param mng connection manager for data transferring +*/ +void Si5351C::Initialize(LMScomms *mng) +{ + assert(mng != nullptr); + device = mng; +} + +/** + @brief Loads register values for Si5356A from file + @param FName input filename +*/ +bool Si5351C::LoadRegValuesFromFile(string FName) +{ + fstream fin; + fin.open(FName.c_str(), ios::in); + + const int len = 1024; + char line[len]; + + int addr; + int value; + + while(!fin.eof()) + { + fin.getline(line, len); + if( line[0] == '#') + continue; + if( strcmp(line, "#END_PROFILE") == 0) + break; + sscanf(line, "%i,%x",&addr,&value); + m_newConfiguration[addr] = value; + } + + fin.close(); + return false; +}; + +/** @brief Calculates multisynth dividers and VCO frequencies + @param clocks output clocks configuration + @param plls plls configurations + @param Fmin lowest VCO frequency + @param Fmax highest VCO frequency +*/ +void Si5351C::FindVCO(Si5351_Channel *clocks, Si5351_PLL *plls, const unsigned long Fmin, const unsigned long Fmax) +{ + int clockCount = 8; + //reset output parameters + for(int i=0; i availableFrequenciesPLLA; //all available frequencies for VCO + map< unsigned long, int> availableFrequenciesPLLB; //all available frequencies for VCO + + //if clk6 or clk7 is used make available frequencies according to them + if(clocks[6].powered || clocks[7].powered) + { + set clk6freqs; + set clk7freqs; + set sharedFreqs; + unsigned int mult = 6; + if(!clk6satisfied) + { + unsigned long freq = clocks[6].outputFreqHz; + while(freq <= Fmax && mult <= 254) + { + freq = clocks[6].outputFreqHz*mult; + if(freq >= Fmin && freq <= Fmax) + { + clk6freqs.insert(freq); + } + mult += 2; + } + } + mult = 6; + if(!clk7satisfied) + { + unsigned long freq = clocks[7].outputFreqHz; + while(freq <= Fmax && mult <= 254) + { + freq = clocks[7].outputFreqHz*mult; + if(freq >= Fmin && freq <= Fmax) + { + clk7freqs.insert(freq); + } + mult += 2; + } + } + bool canShare = false; + //find if clk6 and clk7 can share the same pll + for (set::iterator it6=clk6freqs.begin(); it6!=clk6freqs.end(); ++it6) + { + for (set::iterator it7=clk7freqs.begin(); it7!=clk7freqs.end(); ++it7) + { + if(*it6 == *it7) + { + canShare = true; + sharedFreqs.insert(*it6); + } + } + } + if(canShare) //assign PLLA for both clocks + { + clocks[6].pllSource = 0; + clocks[7].pllSource = 0; + pllAused = true; + for (set::iterator it=sharedFreqs.begin(); it!=sharedFreqs.end(); ++it) + { + availableFrequenciesPLLA.insert( pair (*it, 0) ); + } + clk6satisfied = true; + clk7satisfied = true; + } + else //if clocks 6 and 7 can't share pll, assign pllA to clk6 and pllB to clk7 + { + if(!clk6satisfied) + { + clocks[6].pllSource = 0; + clk6satisfied = true; + pllAused = true; + for (set::iterator it6=clk6freqs.begin(); it6!=clk6freqs.end(); ++it6) + { + availableFrequenciesPLLA.insert( pair(*it6, 0) ); + } + } + if(!clk7satisfied) + { + clocks[7].pllSource = 1; + clk7satisfied = true; + pllBused = true; + for (set::iterator it7=clk7freqs.begin(); it7!=clk7freqs.end(); ++it7) + { + availableFrequenciesPLLB.insert( pair (*it7, 0) ); + } + } + } + } + + //PLLA stage, find all clocks that have integer coefficients with PLLA + //if pllA is not used by clk6 or clk7, fill available frequencies according to clk1-clk5 clocks + if( availableFrequenciesPLLA.size() == 0 && !pllAused) + { + for(int i=0; i<6; ++i) + { + unsigned long freq = clocks[i].outputFreqHz > Fmin ? clocks[i].outputFreqHz : (clocks[i].outputFreqHz*((Fmin/clocks[i].outputFreqHz) + ((Fmin%clocks[i].outputFreqHz)!=0))); + while(freq >= Fmin && freq <= Fmax) + { + //add all output frequency multiples that are in VCO interval + availableFrequenciesPLLA.insert( pair (freq, 0)); + freq += clocks[i].outputFreqHz; + } + } + } + + unsigned int bestScore = 0; //score shows how many outputs have integer dividers + //calculate scores for all available frequencies + unsigned long bestVCOA = 0; + for (map::iterator it=availableFrequenciesPLLA.begin(); it!=availableFrequenciesPLLA.end(); ++it) + { + for(int i=0; i<8; ++i) + { + if(clocks[i].outputFreqHz == 0 || !clocks[i].powered) + continue; + + if( (it->first % clocks[i].outputFreqHz) == 0) + { + it->second = it->second+1; + } + } + if(it->second >= bestScore) + { + bestScore = it->second; + bestVCOA = it->first; + } + } + //scores calculated + //cout << "PLLA stage: " << endl; + //cout << "best score: " << bestScore << " best VCO: " << bestVCOA << endl; + plls[0].VCO_Hz = bestVCOA; + plls[0].feedbackDivider = (double)bestVCOA/plls[0].inputFreqHz; + + for(int i=0; i Fmin ? clocks[i].outputFreqHz : (clocks[i].outputFreqHz*((Fmin/clocks[i].outputFreqHz) + ((Fmin%clocks[i].outputFreqHz)!=0))); + while(freq >= Fmin && freq <= Fmax) + { + availableFrequenciesPLLB.insert( pair (freq, 0)); + freq += clocks[i].outputFreqHz; + } + } + } + + bestScore = 0; + //calculate scores for all available frequencies + unsigned long bestVCOB = 0; + for (map::iterator it=availableFrequenciesPLLB.begin(); it!=availableFrequenciesPLLB.end(); ++it) + { + for(int i=0; i<8; ++i) + { + if(clocks[i].outputFreqHz == 0 || !clocks[i].powered) + continue; + + if( (it->first % clocks[i].outputFreqHz) == 0) + { + it->second = it->second+1; + } + } + if(it->second >= bestScore) + { + bestScore = it->second; + bestVCOB = it->first; + } + } + //scores calculated +// cout << "PLLB stage: " << endl; +// cout << "best score: " << bestScore << " best VCO: " << bestVCOB << endl; + if(bestVCOB == 0) //just in case if pllb is not used make it the same frequency as plla + bestVCOB = bestVCOA; + plls[1].VCO_Hz = bestVCOB; + plls[1].feedbackDivider = (double)bestVCOB/plls[0].inputFreqHz; + for(int i=0; i> 8; + m_newConfiguration[addr+1] = MSX_P3; + + m_newConfiguration[addr+2] = 0; + m_newConfiguration[addr+2] |= (MSX_P1 >> 16 ) & 0x03; + m_newConfiguration[addr+3] = MSX_P1 >> 8; + m_newConfiguration[addr+4] = MSX_P1; + + m_newConfiguration[addr+5] = 0; + m_newConfiguration[addr+5] = (MSX_P2 >> 16) & 0x0F; + m_newConfiguration[addr+5] |= (MSX_P3 >> 16) << 4; + + m_newConfiguration[addr+6] = MSX_P2; + m_newConfiguration[addr+7] = MSX_P2 >> 8; + } + else if( CLK[i].outputFreqHz <= 160000000) // AVAILABLE ONLY ON 0-5 MULTISYNTHS + { + Log("Si5351C - clock configuring for more than 150 MHz not implemented\n", LOG_ERROR); + return FAILED; + } + } + else // CLK6 and CLK7 only integer mode + { + if(CLK[i].outputFreqHz <= 150000000) + { + if(i==6) + { + m_newConfiguration[90] = DivA; + if(DivA%2 != 0) + { + Log("Si5351C - CLK6 multisynth divider is not even integer\n", LOG_ERROR); + return FAILED; + } + } + else + { + m_newConfiguration[91] = DivA; + if(DivA%2 != 0) + { + Log("Si5351C - CLK7 multisynth divider is not even integer\n", LOG_ERROR); + return FAILED; + } + } + } + else if( CLK[i].outputFreqHz <= 160000000) // AVAILABLE ONLY ON 0-5 MULTISYNTHS + { + Log("Si5351C - clock configuring for more than 150 MHz not implemented\n", LOG_ERROR); + return FAILED; + } + } + } + + //configure pll + //set input clk source + m_newConfiguration[15] = m_newConfiguration[15] & 0xF3; + m_newConfiguration[15] |= (PLL[0].CLK_SRC & 1) << 2; + m_newConfiguration[15] |= (PLL[1].CLK_SRC & 1) << 3; + for(int i=0; i<2; ++i) + { + addr = 26+i*8; + if(PLL[i].feedbackDivider < 15 || PLL[i].feedbackDivider > 90) + { + Log("Si5351C - VCO frequency divider out of range [15:90].\n", LOG_ERROR); + return FAILED; + } + if( PLL[i].VCO_Hz < 600000000 || PLL[i].VCO_Hz > 900000000) + { + Log("Si5351C - Can't calculate valid VCO frequency.\n", LOG_ERROR); + return FAILED; + } + ss.clear(); + ss.str(string()); + ss << "Si5351C : VCO" << (i==0 ? "A" : "B") << " = " << PLL[i].VCO_Hz/1000000.0 << " MHz"; + + //calculate MSNx_P1, MSNx_P2, MSNx_P3 + int MSNx_P1; + int MSNx_P2; + int MSNx_P3; + + int DivA; + int DivB; + int DivC; + realToFrac(PLL[i].feedbackDivider, DivA, DivB, DivC); + ss << " Feedback Divider " << DivA << " " << DivB << "/" << DivC << endl; + Log(ss.str(), LOG_INFO); + + MSNx_P1 = 128 * DivA + floor(128 * ( (float)DivB/DivC)) - 512; + MSNx_P2 = 128 * DivB - DivC * floor( 128 * DivB/DivC ); + MSNx_P3 = DivC; + + m_newConfiguration[addr+4] = MSNx_P1; + m_newConfiguration[addr+3] = MSNx_P1 >> 8; + m_newConfiguration[addr+2] = MSNx_P1 >> 16; + + m_newConfiguration[addr+7] = MSNx_P2; + m_newConfiguration[addr+6] = MSNx_P2 >> 8; + m_newConfiguration[addr+5] = 0; + m_newConfiguration[addr+5] = (MSNx_P2 >> 16) & 0x0F; + + m_newConfiguration[addr+5] |= (MSNx_P3 >> 16) << 4; + m_newConfiguration[addr+1] |= MSNx_P3; + m_newConfiguration[addr] |= MSNx_P3 >> 8; + } + return SUCCESS; +} + +/** @brief Sets output clock parameters + @param id clock id 0-CLK0 1-CLK1 ... + @param fOut_Hz output frequency in Hz + @param enabled is this output powered + @param inverted invert clock +*/ +void Si5351C::SetClock(unsigned char id, unsigned long fOut_Hz, bool enabled, bool inverted) +{ + if( id < 8) + { + if(fOut_Hz < 8000 || fOut_Hz > 160000000) + { + stringstream ss; + ss << "Si5351C - CLK" << (int)id << " output frequency must be between 8kHz and 160MHz. fOut_MHz = " << fOut_Hz/1000000.0 << endl; + Log(ss.str(), LOG_ERROR); + return; + } + CLK[id].powered = enabled; + CLK[id].inverted = inverted; + CLK[id].outputFreqHz = fOut_Hz; + } +} + +/** @brief Sets PLL input frequency + @param id PLL id 0-PLLA 1-PLLB + @param CLKIN_Hz clock input in Hz +*/ +void Si5351C::SetPLL(unsigned char id, unsigned long CLKIN_Hz, int CLK_SRC) +{ + if (id < 2) + { + PLL[id].inputFreqHz = CLKIN_Hz; + PLL[id].CLK_SRC = CLK_SRC; + } +} + +/** @brief Resets configuration registers to default values +*/ +void Si5351C::Reset() +{ + memset(m_newConfiguration, 0, 255); + for(unsigned int i=0; iTransferPacket(pkt); + if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) + { + return stat; + } + + stat.sys_init = (pkt.inBuffer[0] >> 7); + stat.lol_b = (pkt.inBuffer[0] >> 6) & 0x1; + stat.lol_a = (pkt.inBuffer[0] >> 5) & 0x1; + stat.los = (pkt.inBuffer[0] >> 4) & 0x1; + stat.sys_init_stky = (pkt.inBuffer[1] >> 7); + stat.lol_b_stky = (pkt.inBuffer[1] >> 6) & 0x1; + stat.lol_a_stky = (pkt.inBuffer[1] >> 5) & 0x1; + stat.los_stky = (pkt.inBuffer[1] >> 4) & 0x1; + return stat; +} + +Si5351C::Status Si5351C::ClearStatus() +{ + LMScomms::GenericPacket pkt; + pkt.cmd = CMD_SI5351_WR; + pkt.outBuffer.push_back(1); + pkt.outBuffer.push_back(0x0); + LMScomms::TransferStatus status; + status = device->TransferPacket(pkt); + if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) + return FAILED; + return SUCCESS; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h new file mode 100644 index 0000000000..971a2d1d69 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h @@ -0,0 +1,100 @@ +/** +@file Si5351C.h +@brief Header for Si5351C.cpp +@author Lime Microsystems +*/ + +#ifndef SI5351C_MODULE +#define SI5351C_MODULE + +#include +#include +using namespace std; +//--------------------------------------------------------------------------- + +enum eSi_CLOCK_INPUT +{ + Si_CLKIN, + Si_XTAL, + Si_CMOS +}; + +struct Si5351_Channel +{ + Si5351_Channel() : outputDivider(1), outputFreqHz(1), multisynthDivider(1), pllSource(0), + phaseOffset(0), powered(true), inverted(false), int_mode(false) {}; + int outputDivider; + unsigned long outputFreqHz; + float multisynthDivider; + int pllSource; + float phaseOffset; + bool powered; + bool inverted; + bool int_mode; +}; + +struct Si5351_PLL +{ + Si5351_PLL() : inputFreqHz(0), VCO_Hz(0), feedbackDivider(0), CLKIN_DIV(1), CLK_SRC(1) {} + unsigned long inputFreqHz; + float VCO_Hz; + float feedbackDivider; + int CLKIN_DIV; + int CLK_SRC; //0-XTAL, 1-CLKIN +}; + +class LMScomms; +class Si5351C +{ +public: + enum Status + { + SUCCESS, + FAILED, + }; + + struct StatusBits + { + StatusBits() : sys_init(0), sys_init_stky(0), lol_b(0), lol_b_stky(0), lol_a(0), lol_a_stky(0), los(0), los_stky(0) + { + + } + int sys_init; + int sys_init_stky; + int lol_b; + int lol_b_stky; + int lol_a; + int lol_a_stky; + int los; + int los_stky; + }; + + StatusBits GetStatusBits(); + Status ClearStatus(); + + Si5351C(); + ~Si5351C(); + void Initialize(LMScomms *mng); + bool LoadRegValuesFromFile(string FName); + + void SetPLL(unsigned char id, unsigned long CLKIN_Hz, int CLK_SRC); + void SetClock(unsigned char id, unsigned long fOut_Hz, bool enabled = true, bool inverted = false); + + Status UploadConfiguration(); + Status ConfigureClocks(); + void Reset(); + +private: + void FindVCO(Si5351_Channel *clocks, Si5351_PLL *plls, const unsigned long Fmin, const unsigned long Fmax); + LMScomms *device; + + Si5351_PLL PLL[2]; + Si5351_Channel CLK[8]; + + static const unsigned char m_defaultConfiguration[]; + unsigned char m_newConfiguration[255]; + + +}; + +#endif // SI5351C_MODULE diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeCache.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeCache.txt new file mode 100644 index 0000000000..2bd212843c --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeCache.txt @@ -0,0 +1,326 @@ +# This is the CMakeCache file. +# For build in directory: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//For backwards compatibility, what version of CMake commands and +// syntax should this version of CMake try to support. +CMAKE_BACKWARDS_COMPATIBILITY:STRING=2.4 + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING= + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler. +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler. +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=Project + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If true, cmake will use relative paths in makefiles and projects. +CMAKE_USE_RELATIVE_PATHS:BOOL=OFF + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Single output directory for building all executables. +EXECUTABLE_OUTPUT_PATH:PATH= + +//Single output directory for building all libraries. +LIBRARY_OUTPUT_PATH:PATH= + +//Value Computed by CMake +Project_BINARY_DIR:STATIC=/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build + +//Value Computed by CMake +Project_SOURCE_DIR:STATIC=/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C + +//Dependencies for the target +Si5351C_LIB_DEPENDS:STATIC=general;LMS7002M; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_BUILD_TOOL +CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1 +//What is the target build tool cmake is generating for. +CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/make +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=8 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=12 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Start directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake-2.8 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/bin/uname +//ADVANCED property for variable: CMAKE_USE_RELATIVE_PATHS +CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake new file mode 100644 index 0000000000..f4a508bee8 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake @@ -0,0 +1,56 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "4.8.4") +set(CMAKE_C_PLATFORM_ID "Linux") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + + + + +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "c") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/4.8;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") + + + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake new file mode 100644 index 0000000000..1ca40dbcd6 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake @@ -0,0 +1,57 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "4.8.4") +set(CMAKE_CXX_PLATFORM_ID "Linux") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;CPP) +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + + + + +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;c") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/4.8;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") + + + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..3458fc29190dbceb43a4fb44955cbce374660b02 GIT binary patch literal 8587 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 YSNpGT_qcN9OFrx7@!z`XldUEG1u+4vi~s-t literal 0 HcmV?d00001 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..ea701432becf6a6bd7cb452c08f7c7645d0f8607 GIT binary patch literal 8600 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 Qh0vf8p8U7sgQ9cbUvrV1<^TWy literal 0 HcmV?d00001 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake new file mode 100644 index 0000000000..bbcd260466 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-3.17.0-031700-lowlatency") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "3.17.0-031700-lowlatency") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-3.17.0-031700-lowlatency") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "3.17.0-031700-lowlatency") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000000..cba81d4a6b --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,389 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH HEX(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__WATCOMC__ % 100) + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_C = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) +# if defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" +# else +# if __IBMC__ >= 800 +# define COMPILER_ID "XL" +# else +# define COMPILER_ID "VisualAge" +# endif + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +/* Analog VisualDSP++ >= 4.5.6 */ +#elif defined(__VISUALDSPVERSION__) +# define COMPILER_ID "ADSP" + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) + +/* Analog VisualDSP++ < 4.5.6 */ +#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" + +/* IAR Systems compiler for embedded systems. + http://www.iar.com */ +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +/* sdcc, the small devices C compiler for embedded systems, + http://sdcc.sourceforge.net */ +#elif defined(SDCC) +# define COMPILER_ID "SDCC" + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + +/* This compiler is either not known or is too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" + +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# define ARCHITECTURE_ID "ARM" + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID "" +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif + (void)argv; + return require; +} +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out new file mode 100755 index 0000000000000000000000000000000000000000..1d7e438b92300abaac114123c512167b14d7d259 GIT binary patch literal 8683 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 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH HEX(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__WATCOMC__ % 100) + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) +# if defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" +# else +# if __IBMCPP__ >= 800 +# define COMPILER_ID "XL" +# else +# define COMPILER_ID "VisualAge" +# endif + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +/* Analog VisualDSP++ >= 4.5.6 */ +#elif defined(__VISUALDSPVERSION__) +# define COMPILER_ID "ADSP" + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) + +/* Analog VisualDSP++ < 4.5.6 */ +#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" + +/* IAR Systems compiler for embedded systems. + http://www.iar.com */ +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + +/* This compiler is either not known or is too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" + +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# define ARCHITECTURE_ID "ARM" + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID "" +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif + (void)argv; + return require; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..aeee00b0724a9ab52a33c118ab316ac8e587fac6 GIT binary patch literal 8692 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 literal 0 HcmV?d00001 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeDirectoryInformation.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000000..335b0cbcf2 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Relative path conversion top directories. +SET(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C") +SET(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build") + +# Force unix paths in dependencies. +SET(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +SET(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +SET(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +SET(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +SET(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeOutput.log b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000000..10bdcf5f63 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeOutput.log @@ -0,0 +1,263 @@ +The system is: Linux - 3.17.0-031700-lowlatency - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /usr/bin/cc +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + +The C compiler identification is GNU, found in "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out" + +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: /usr/bin/c++ +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + +The CXX compiler identification is GNU, found in "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out" + +Determining if the C compiler works passed with the following output: +Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/make "cmTryCompileExec4097118404/fast" +/usr/bin/make -f CMakeFiles/cmTryCompileExec4097118404.dir/build.make CMakeFiles/cmTryCompileExec4097118404.dir/build +make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building C object CMakeFiles/cmTryCompileExec4097118404.dir/testCCompiler.c.o +/usr/bin/cc -o CMakeFiles/cmTryCompileExec4097118404.dir/testCCompiler.c.o -c /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/testCCompiler.c +Linking C executable cmTryCompileExec4097118404 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec4097118404.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTryCompileExec4097118404.dir/testCCompiler.c.o -o cmTryCompileExec4097118404 -rdynamic +make[1]: Leaving directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' + + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/make "cmTryCompileExec3603593924/fast" +/usr/bin/make -f CMakeFiles/cmTryCompileExec3603593924.dir/build.make CMakeFiles/cmTryCompileExec3603593924.dir/build +make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building C object CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o +/usr/bin/cc -o CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-2.8/Modules/CMakeCCompilerABI.c +Linking C executable cmTryCompileExec3603593924 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec3603593924.dir/link.txt --verbose=1 +/usr/bin/cc -v CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -o cmTryCompileExec3603593924 -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/cc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec3603593924' '-rdynamic' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTryCompileExec3603593924 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o +make[1]: Leaving directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:/usr/bin/make "cmTryCompileExec3603593924/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTryCompileExec3603593924.dir/build.make CMakeFiles/cmTryCompileExec3603593924.dir/build] + ignore line: [make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp'] + ignore line: [/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1] + ignore line: [Building C object CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -o CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-2.8/Modules/CMakeCCompilerABI.c] + ignore line: [Linking C executable cmTryCompileExec3603593924] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec3603593924.dir/link.txt --verbose=1] + ignore line: [/usr/bin/cc -v CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -o cmTryCompileExec3603593924 -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec3603593924' '-rdynamic' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTryCompileExec3603593924 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTryCompileExec3603593924] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] + arg [CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o] ==> ignore + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8] ==> [/usr/lib/gcc/x86_64-linux-gnu/4.8] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] ==> [/usr/lib] + implicit libs: [c] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/4.8;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + +Determining if the CXX compiler works passed with the following output: +Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/make "cmTryCompileExec997608794/fast" +/usr/bin/make -f CMakeFiles/cmTryCompileExec997608794.dir/build.make CMakeFiles/cmTryCompileExec997608794.dir/build +make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building CXX object CMakeFiles/cmTryCompileExec997608794.dir/testCXXCompiler.cxx.o +/usr/bin/c++ -o CMakeFiles/cmTryCompileExec997608794.dir/testCXXCompiler.cxx.o -c /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/testCXXCompiler.cxx +Linking CXX executable cmTryCompileExec997608794 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec997608794.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTryCompileExec997608794.dir/testCXXCompiler.cxx.o -o cmTryCompileExec997608794 -rdynamic +make[1]: Leaving directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/make "cmTryCompileExec2573420878/fast" +/usr/bin/make -f CMakeFiles/cmTryCompileExec2573420878.dir/build.make CMakeFiles/cmTryCompileExec2573420878.dir/build +make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building CXX object CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o +/usr/bin/c++ -o CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-2.8/Modules/CMakeCXXCompilerABI.cpp +Linking CXX executable cmTryCompileExec2573420878 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec2573420878.dir/link.txt --verbose=1 +/usr/bin/c++ -v CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -o cmTryCompileExec2573420878 -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/c++ +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec2573420878' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTryCompileExec2573420878 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o +make[1]: Leaving directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' + + +Parsed CXX implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:/usr/bin/make "cmTryCompileExec2573420878/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTryCompileExec2573420878.dir/build.make CMakeFiles/cmTryCompileExec2573420878.dir/build] + ignore line: [make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp'] + ignore line: [/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1] + ignore line: [Building CXX object CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -o CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-2.8/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Linking CXX executable cmTryCompileExec2573420878] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec2573420878.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -o cmTryCompileExec2573420878 -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec2573420878' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTryCompileExec2573420878 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTryCompileExec2573420878] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] + arg [CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o] ==> ignore + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8] ==> [/usr/lib/gcc/x86_64-linux-gnu/4.8] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] ==> [/usr/lib] + implicit libs: [stdc++;m;c] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/4.8;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000000..119272f1f1 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile.cmake @@ -0,0 +1,43 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# The generator used is: +SET(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +SET(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "../CMakeLists.txt" + "CMakeFiles/2.8.12.2/CMakeCCompiler.cmake" + "CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake" + "CMakeFiles/2.8.12.2/CMakeSystem.cmake" + "/usr/share/cmake-2.8/Modules/CMakeCInformation.cmake" + "/usr/share/cmake-2.8/Modules/CMakeCXXInformation.cmake" + "/usr/share/cmake-2.8/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/share/cmake-2.8/Modules/CMakeGenericSystem.cmake" + "/usr/share/cmake-2.8/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/share/cmake-2.8/Modules/Compiler/GNU-C.cmake" + "/usr/share/cmake-2.8/Modules/Compiler/GNU-CXX.cmake" + "/usr/share/cmake-2.8/Modules/Compiler/GNU.cmake" + "/usr/share/cmake-2.8/Modules/Platform/Linux-GNU-C.cmake" + "/usr/share/cmake-2.8/Modules/Platform/Linux-GNU-CXX.cmake" + "/usr/share/cmake-2.8/Modules/Platform/Linux-GNU.cmake" + "/usr/share/cmake-2.8/Modules/Platform/Linux.cmake" + "/usr/share/cmake-2.8/Modules/Platform/UnixPaths.cmake" + ) + +# The corresponding makefile is: +SET(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +SET(CMAKE_MAKEFILE_PRODUCTS + "CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +SET(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/Si5351C.dir/DependInfo.cmake" + ) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile2 b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile2 new file mode 100644 index 0000000000..16016a9bd2 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile2 @@ -0,0 +1,102 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# The main recursive all target +all: +.PHONY : all + +# The main recursive preinstall target +preinstall: +.PHONY : preinstall + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The program to use to edit the cache. +CMAKE_EDIT_COMMAND = /usr/bin/ccmake + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build + +#============================================================================= +# Target rules for target CMakeFiles/Si5351C.dir + +# All Build rule for target. +CMakeFiles/Si5351C.dir/all: + $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/depend + $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles 1 + @echo "Built target Si5351C" +.PHONY : CMakeFiles/Si5351C.dir/all + +# Include target in all. +all: CMakeFiles/Si5351C.dir/all +.PHONY : all + +# Build rule for subdir invocation for target. +CMakeFiles/Si5351C.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles 1 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/Si5351C.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles 0 +.PHONY : CMakeFiles/Si5351C.dir/rule + +# Convenience name for target. +Si5351C: CMakeFiles/Si5351C.dir/rule +.PHONY : Si5351C + +# clean rule for target. +CMakeFiles/Si5351C.dir/clean: + $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/clean +.PHONY : CMakeFiles/Si5351C.dir/clean + +# clean rule for target. +clean: CMakeFiles/Si5351C.dir/clean +.PHONY : clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/CXX.includecache b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/CXX.includecache new file mode 100644 index 0000000000..b84d7a1def --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/CXX.includecache @@ -0,0 +1,8 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/DependInfo.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/DependInfo.cmake new file mode 100644 index 0000000000..8fbd267efc --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/DependInfo.cmake @@ -0,0 +1,22 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_CXX + "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp" "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/Si5351C.o" + ) +SET(CMAKE_CXX_COMPILER_ID "GNU") + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../../lms7002m" + ".." + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/Si5351C.o b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/Si5351C.o new file mode 100644 index 0000000000000000000000000000000000000000..9c3483db4eb7c2c2bfd8b4bd29d4f87b7c961757 GIT binary patch literal 144184 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 DuMANa literal 0 HcmV?d00001 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/build.make b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/build.make new file mode 100644 index 0000000000..55f2ff4765 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/build.make @@ -0,0 +1,106 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The program to use to edit the cache. +CMAKE_EDIT_COMMAND = /usr/bin/ccmake + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build + +# Include any dependencies generated for this target. +include CMakeFiles/Si5351C.dir/depend.make + +# Include the progress variables for this target. +include CMakeFiles/Si5351C.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/Si5351C.dir/flags.make + +CMakeFiles/Si5351C.dir/Si5351C.o: CMakeFiles/Si5351C.dir/flags.make +CMakeFiles/Si5351C.dir/Si5351C.o: ../Si5351C.cpp + $(CMAKE_COMMAND) -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building CXX object CMakeFiles/Si5351C.dir/Si5351C.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_FLAGS) -o CMakeFiles/Si5351C.dir/Si5351C.o -c /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp + +CMakeFiles/Si5351C.dir/Si5351C.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/Si5351C.dir/Si5351C.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_FLAGS) -E /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp > CMakeFiles/Si5351C.dir/Si5351C.i + +CMakeFiles/Si5351C.dir/Si5351C.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/Si5351C.dir/Si5351C.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_FLAGS) -S /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp -o CMakeFiles/Si5351C.dir/Si5351C.s + +CMakeFiles/Si5351C.dir/Si5351C.o.requires: +.PHONY : CMakeFiles/Si5351C.dir/Si5351C.o.requires + +CMakeFiles/Si5351C.dir/Si5351C.o.provides: CMakeFiles/Si5351C.dir/Si5351C.o.requires + $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/Si5351C.o.provides.build +.PHONY : CMakeFiles/Si5351C.dir/Si5351C.o.provides + +CMakeFiles/Si5351C.dir/Si5351C.o.provides.build: CMakeFiles/Si5351C.dir/Si5351C.o + +# Object files for target Si5351C +Si5351C_OBJECTS = \ +"CMakeFiles/Si5351C.dir/Si5351C.o" + +# External object files for target Si5351C +Si5351C_EXTERNAL_OBJECTS = + +libSi5351C.a: CMakeFiles/Si5351C.dir/Si5351C.o +libSi5351C.a: CMakeFiles/Si5351C.dir/build.make +libSi5351C.a: CMakeFiles/Si5351C.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking CXX static library libSi5351C.a" + $(CMAKE_COMMAND) -P CMakeFiles/Si5351C.dir/cmake_clean_target.cmake + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/Si5351C.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +CMakeFiles/Si5351C.dir/build: libSi5351C.a +.PHONY : CMakeFiles/Si5351C.dir/build + +CMakeFiles/Si5351C.dir/requires: CMakeFiles/Si5351C.dir/Si5351C.o.requires +.PHONY : CMakeFiles/Si5351C.dir/requires + +CMakeFiles/Si5351C.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/Si5351C.dir/cmake_clean.cmake +.PHONY : CMakeFiles/Si5351C.dir/clean + +CMakeFiles/Si5351C.dir/depend: + cd /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/Si5351C.dir/depend + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean.cmake new file mode 100644 index 0000000000..e300fd2668 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/Si5351C.dir/Si5351C.o" + "libSi5351C.pdb" + "libSi5351C.a" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang CXX) + INCLUDE(CMakeFiles/Si5351C.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean_target.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean_target.cmake new file mode 100644 index 0000000000..bb2fb4b00e --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +FILE(REMOVE_RECURSE + "libSi5351C.a" +) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.internal b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.internal new file mode 100644 index 0000000000..2b377e7bc4 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.internal @@ -0,0 +1,6 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +CMakeFiles/Si5351C.dir/Si5351C.o + /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp + /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.make b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.make new file mode 100644 index 0000000000..f55fdb2688 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.make @@ -0,0 +1,6 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +CMakeFiles/Si5351C.dir/Si5351C.o: ../Si5351C.cpp +CMakeFiles/Si5351C.dir/Si5351C.o: ../Si5351C.h + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/flags.make b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/flags.make new file mode 100644 index 0000000000..3515e5e131 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -std=c++11 -I/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/../lms7002m -I/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C + +CXX_DEFINES = + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/link.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/link.txt new file mode 100644 index 0000000000..000b6e0ee0 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar cr libSi5351C.a CMakeFiles/Si5351C.dir/Si5351C.o +/usr/bin/ranlib libSi5351C.a diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/progress.make b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/progress.make new file mode 100644 index 0000000000..781c7de277 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 1 + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/TargetDirectories.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000000..8bed4f4e60 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/TargetDirectories.txt @@ -0,0 +1 @@ +/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/cmake.check_cache b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000000..3dccd73172 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/progress.marks b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/progress.marks new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/progress.marks @@ -0,0 +1 @@ +1 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/Makefile b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/Makefile new file mode 100644 index 0000000000..45a34a03b1 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/Makefile @@ -0,0 +1,157 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The program to use to edit the cache. +CMAKE_EDIT_COMMAND = /usr/bin/ccmake + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /usr/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named Si5351C + +# Build rule for target. +Si5351C: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 Si5351C +.PHONY : Si5351C + +# fast build rule for target. +Si5351C/fast: + $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/build +.PHONY : Si5351C/fast + +# target to build an object file +Si5351C.o: + $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/Si5351C.o +.PHONY : Si5351C.o + +# target to preprocess a source file +Si5351C.i: + $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/Si5351C.i +.PHONY : Si5351C.i + +# target to generate assembly for a file +Si5351C.s: + $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/Si5351C.s +.PHONY : Si5351C.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... Si5351C" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... Si5351C.o" + @echo "... Si5351C.i" + @echo "... Si5351C.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/cmake_install.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/cmake_install.cmake new file mode 100644 index 0000000000..d7797d84e9 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/cmake_install.cmake @@ -0,0 +1,44 @@ +# Install script for directory: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C + +# Set the install prefix +IF(NOT DEFINED CMAKE_INSTALL_PREFIX) + SET(CMAKE_INSTALL_PREFIX "/usr/local") +ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) +STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + IF(BUILD_TYPE) + STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + ELSE(BUILD_TYPE) + SET(CMAKE_INSTALL_CONFIG_NAME "") + ENDIF(BUILD_TYPE) + MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + +# Set the component getting installed. +IF(NOT CMAKE_INSTALL_COMPONENT) + IF(COMPONENT) + MESSAGE(STATUS "Install component: \"${COMPONENT}\"") + SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + ELSE(COMPONENT) + SET(CMAKE_INSTALL_COMPONENT) + ENDIF(COMPONENT) +ENDIF(NOT CMAKE_INSTALL_COMPONENT) + +# Install shared libraries without execute permission? +IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + SET(CMAKE_INSTALL_SO_NO_EXE "1") +ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + +IF(CMAKE_INSTALL_COMPONENT) + SET(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +ELSE(CMAKE_INSTALL_COMPONENT) + SET(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +ENDIF(CMAKE_INSTALL_COMPONENT) + +FILE(WRITE "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/${CMAKE_INSTALL_MANIFEST}" "") +FOREACH(file ${CMAKE_INSTALL_MANIFEST_FILES}) + FILE(APPEND "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/${CMAKE_INSTALL_MANIFEST}" "${file}\n") +ENDFOREACH(file) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/libSi5351C.a b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/libSi5351C.a new file mode 100644 index 0000000000000000000000000000000000000000..bc5d760e0aedfec3c12ab319e446c9ce801c5bcc GIT binary patch literal 162342 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.samples_per_tti>>1; else len = phy_vars_eNB->lte_frame_parms.samples_per_tti; - + /* for (i=0;irx_total_gain_dB;//-USRP_GAIN_OFFSET; - +#if 0 switch(UE->lte_frame_parms.N_RB_DL) { case 6: openair0_cfg[card].rx_gain[i] -= 12; @@ -555,7 +555,7 @@ static void *UE_thread_synch(void *arg) printf("Unknown number of RBs %d\n",UE->lte_frame_parms.N_RB_DL); break; } - +#endif #endif } } From 98a05dfbb816cc6d2346a3fec408c865f5780557 Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Thu, 11 Feb 2016 10:13:43 +0100 Subject: [PATCH 052/122] deleted unnecessary files and added lmsSDR, lms7002m directories --- .../LIB/Si5351C/build/CMakeCache.txt | 326 -- .../CMakeFiles/2.8.12.2/CMakeCCompiler.cmake | 56 - .../2.8.12.2/CMakeCXXCompiler.cmake | 57 - .../2.8.12.2/CMakeDetermineCompilerABI_C.bin | Bin 8587 -> 0 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 8600 -> 0 bytes .../CMakeFiles/2.8.12.2/CMakeSystem.cmake | 15 - .../2.8.12.2/CompilerIdC/CMakeCCompilerId.c | 389 --- .../CMakeFiles/2.8.12.2/CompilerIdC/a.out | Bin 8683 -> 0 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 377 --- .../CMakeFiles/2.8.12.2/CompilerIdCXX/a.out | Bin 8692 -> 0 bytes .../CMakeDirectoryInformation.cmake | 16 - .../Si5351C/build/CMakeFiles/CMakeOutput.log | 263 -- .../Si5351C/build/CMakeFiles/Makefile.cmake | 43 - .../LIB/Si5351C/build/CMakeFiles/Makefile2 | 102 - .../CMakeFiles/Si5351C.dir/CXX.includecache | 8 - .../CMakeFiles/Si5351C.dir/DependInfo.cmake | 22 - .../build/CMakeFiles/Si5351C.dir/Si5351C.o | Bin 144184 -> 0 bytes .../build/CMakeFiles/Si5351C.dir/build.make | 106 - .../CMakeFiles/Si5351C.dir/cmake_clean.cmake | 10 - .../Si5351C.dir/cmake_clean_target.cmake | 3 - .../CMakeFiles/Si5351C.dir/depend.internal | 6 - .../build/CMakeFiles/Si5351C.dir/depend.make | 6 - .../build/CMakeFiles/Si5351C.dir/flags.make | 8 - .../build/CMakeFiles/Si5351C.dir/link.txt | 2 - .../CMakeFiles/Si5351C.dir/progress.make | 2 - .../build/CMakeFiles/TargetDirectories.txt | 1 - .../build/CMakeFiles/cmake.check_cache | 1 - .../Si5351C/build/CMakeFiles/progress.marks | 1 - .../USERSPACE/LIB/Si5351C/build/Makefile | 157 - .../LIB/Si5351C/build/cmake_install.cmake | 44 - .../USERSPACE/LIB/Si5351C/build/libSi5351C.a | Bin 162342 -> 0 bytes .../USERSPACE/LIB/lms7002m/CMakeLists.txt | 63 + .../USERSPACE/LIB/lms7002m/LMS7002M.cpp | 2612 +++++++++++++++++ .../LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h | 177 ++ .../LIB/lms7002m/LMS7002M_RegistersMap.cpp | 68 + .../LIB/lms7002m/LMS7002M_RegistersMap.h | 35 + .../lms7002m/LMS7002M_filtersCalibration.cpp | 861 ++++++ .../LIB/lms7002m/LMS7002M_parameters.cpp | 601 ++++ .../LIB/lms7002m/LMS7002M_parameters.h | 613 ++++ .../LIB/lms7002m/LMS7002M_statuses.cpp | 16 + .../LIB/lms7002m/LMS7002M_statuses.h | 48 + .../connectionManager/ConnectionCOM.cpp | 596 ++++ .../connectionManager/ConnectionCOM.h | 62 + .../connectionManager/ConnectionManager.cpp | 314 ++ .../connectionManager/ConnectionManager.h | 60 + .../connectionManager/ConnectionSPI.cpp | 290 ++ .../connectionManager/ConnectionSPI.h | 41 + .../connectionManager/ConnectionUSB.cpp | 762 +++++ .../connectionManager/ConnectionUSB.h | 144 + .../lms7002m/connectionManager/IConnection.h | 68 + .../USERSPACE/LIB/lms7002m/lms7002_defines.h | 218 ++ .../USERSPACE/LIB/lms7002m/lmsComms.cpp | 326 ++ .../LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h | 111 + .../LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h | 18 + .../LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp | 334 +++ .../LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h | 143 + .../LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt | 22 + .../LMS_StreamBoard/LMS_StreamBoard.cpp | 770 +++++ .../lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h | 107 + .../LMS_StreamBoard/LMS_StreamBoard_FIFO.h | 122 + .../lmsSDR/LMS_StreamBoard/lms7002_defines.h | 215 ++ .../lmsSDR/connectionManager/CMakeLists.txt | 34 + .../connectionManager/ConnectionCOM.cpp | 596 ++++ .../lmsSDR/connectionManager/ConnectionCOM.h | 62 + .../connectionManager/ConnectionManager.cpp | 319 ++ .../connectionManager/ConnectionManager.h | 60 + .../connectionManager/ConnectionSPI.cpp | 313 ++ .../lmsSDR/connectionManager/ConnectionSPI.h | 41 + .../connectionManager/ConnectionUSB.cpp | 771 +++++ .../lmsSDR/connectionManager/ConnectionUSB.h | 144 + .../lmsSDR/connectionManager/IConnection.h | 68 + .../LIB/lmsSDR/connectionManager/lmsComms.cpp | 325 ++ .../LIB/lmsSDR/connectionManager/lmsComms.h | 111 + .../LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h | 33 + .../ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h | 180 ++ .../LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h | 143 + targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 862 ++++++ 77 files changed, 13879 insertions(+), 2021 deletions(-) delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeCache.txt delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake delete mode 100755 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin delete mode 100755 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c delete mode 100755 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdCXX/CMakeCXXCompilerId.cpp delete mode 100755 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeDirectoryInformation.cmake delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeOutput.log delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile.cmake delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile2 delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/CXX.includecache delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/DependInfo.cmake delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/Si5351C.o delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/build.make delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean.cmake delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean_target.cmake delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.internal delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.make delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/flags.make delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/link.txt delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/progress.make delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/TargetDirectories.txt delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/cmake.check_cache delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/progress.marks delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/Makefile delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/cmake_install.cmake delete mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/libSi5351C.a create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeCache.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeCache.txt deleted file mode 100644 index 2bd212843c..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeCache.txt +++ /dev/null @@ -1,326 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build -# It was generated by CMake: /usr/bin/cmake -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//Path to a program. -CMAKE_AR:FILEPATH=/usr/bin/ar - -//For backwards compatibility, what version of CMake commands and -// syntax should this version of CMake try to support. -CMAKE_BACKWARDS_COMPATIBILITY:STRING=2.4 - -//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or -// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. -CMAKE_BUILD_TYPE:STRING= - -//Enable/Disable color output during build. -CMAKE_COLOR_MAKEFILE:BOOL=ON - -//CXX compiler. -CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ - -//Flags used by the compiler during all build types. -CMAKE_CXX_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_CXX_FLAGS_DEBUG:STRING=-g - -//Flags used by the compiler during release minsize builds. -CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds (/MD /Ob1 /Oi -// /Ot /Oy /Gs will produce slightly less optimized but smaller -// files). -CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the compiler during Release with Debug Info builds. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//C compiler. -CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc - -//Flags used by the compiler during all build types. -CMAKE_C_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_C_FLAGS_DEBUG:STRING=-g - -//Flags used by the compiler during release minsize builds. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds (/MD /Ob1 /Oi -// /Ot /Oy /Gs will produce slightly less optimized but smaller -// files). -CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the compiler during Release with Debug Info builds. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Flags used by the linker. -CMAKE_EXE_LINKER_FLAGS:STRING=' ' - -//Flags used by the linker during debug builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during release minsize builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during release builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Enable/Disable output of compile commands during generation. -CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=/usr/local - -//Path to a program. -CMAKE_LINKER:FILEPATH=/usr/bin/ld - -//Path to a program. -CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make - -//Flags used by the linker during the creation of modules. -CMAKE_MODULE_LINKER_FLAGS:STRING=' ' - -//Flags used by the linker during debug builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during release minsize builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during release builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_NM:FILEPATH=/usr/bin/nm - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=Project - -//Path to a program. -CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib - -//Flags used by the linker during the creation of dll's. -CMAKE_SHARED_LINKER_FLAGS:STRING=' ' - -//Flags used by the linker during debug builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during release minsize builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during release builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//If set, runtime paths are not added when installing shared libraries, -// but are added when building. -CMAKE_SKIP_INSTALL_RPATH:BOOL=NO - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Flags used by the linker during the creation of static libraries. -CMAKE_STATIC_LINKER_FLAGS:STRING= - -//Flags used by the linker during debug builds. -CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during release minsize builds. -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during release builds. -CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_STRIP:FILEPATH=/usr/bin/strip - -//If true, cmake will use relative paths in makefiles and projects. -CMAKE_USE_RELATIVE_PATHS:BOOL=OFF - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//Single output directory for building all executables. -EXECUTABLE_OUTPUT_PATH:PATH= - -//Single output directory for building all libraries. -LIBRARY_OUTPUT_PATH:PATH= - -//Value Computed by CMake -Project_BINARY_DIR:STATIC=/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build - -//Value Computed by CMake -Project_SOURCE_DIR:STATIC=/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C - -//Dependencies for the target -Si5351C_LIB_DEPENDS:STATIC=general;LMS7002M; - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_BUILD_TOOL -CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1 -//What is the target build tool cmake is generating for. -CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/make -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=8 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=12 -//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE -CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=/usr/bin/cmake -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest -//ADVANCED property for variable: CMAKE_CXX_COMPILER -CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS -CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER -CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//Path to cache edit program executable. -CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Unix Makefiles -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Start directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C -//Install .so files without execute permission. -CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MAKE_PROGRAM -CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=/usr/share/cmake-2.8 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//uname command -CMAKE_UNAME:INTERNAL=/bin/uname -//ADVANCED property for variable: CMAKE_USE_RELATIVE_PATHS -CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake deleted file mode 100644 index f4a508bee8..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake +++ /dev/null @@ -1,56 +0,0 @@ -set(CMAKE_C_COMPILER "/usr/bin/cc") -set(CMAKE_C_COMPILER_ARG1 "") -set(CMAKE_C_COMPILER_ID "GNU") -set(CMAKE_C_COMPILER_VERSION "4.8.4") -set(CMAKE_C_PLATFORM_ID "Linux") - -set(CMAKE_AR "/usr/bin/ar") -set(CMAKE_RANLIB "/usr/bin/ranlib") -set(CMAKE_LINKER "/usr/bin/ld") -set(CMAKE_COMPILER_IS_GNUCC 1) -set(CMAKE_C_COMPILER_LOADED 1) -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_C_ABI_COMPILED TRUE) -set(CMAKE_COMPILER_IS_MINGW ) -set(CMAKE_COMPILER_IS_CYGWIN ) -if(CMAKE_COMPILER_IS_CYGWIN) - set(CYGWIN 1) - set(UNIX 1) -endif() - -set(CMAKE_C_COMPILER_ENV_VAR "CC") - -if(CMAKE_COMPILER_IS_MINGW) - set(MINGW 1) -endif() -set(CMAKE_C_COMPILER_ID_RUN 1) -set(CMAKE_C_SOURCE_FILE_EXTENSIONS c) -set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_C_LINKER_PREFERENCE 10) - -# Save compiler ABI information. -set(CMAKE_C_SIZEOF_DATA_PTR "8") -set(CMAKE_C_COMPILER_ABI "ELF") -set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") - -if(CMAKE_C_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_C_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -endif() - -if(CMAKE_C_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") -endif() - - - - -set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "c") -set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/4.8;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") -set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") - - - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake deleted file mode 100644 index 1ca40dbcd6..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake +++ /dev/null @@ -1,57 +0,0 @@ -set(CMAKE_CXX_COMPILER "/usr/bin/c++") -set(CMAKE_CXX_COMPILER_ARG1 "") -set(CMAKE_CXX_COMPILER_ID "GNU") -set(CMAKE_CXX_COMPILER_VERSION "4.8.4") -set(CMAKE_CXX_PLATFORM_ID "Linux") - -set(CMAKE_AR "/usr/bin/ar") -set(CMAKE_RANLIB "/usr/bin/ranlib") -set(CMAKE_LINKER "/usr/bin/ld") -set(CMAKE_COMPILER_IS_GNUCXX 1) -set(CMAKE_CXX_COMPILER_LOADED 1) -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_CXX_ABI_COMPILED TRUE) -set(CMAKE_COMPILER_IS_MINGW ) -set(CMAKE_COMPILER_IS_CYGWIN ) -if(CMAKE_COMPILER_IS_CYGWIN) - set(CYGWIN 1) - set(UNIX 1) -endif() - -set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") - -if(CMAKE_COMPILER_IS_MINGW) - set(MINGW 1) -endif() -set(CMAKE_CXX_COMPILER_ID_RUN 1) -set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;CPP) -set(CMAKE_CXX_LINKER_PREFERENCE 30) -set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) - -# Save compiler ABI information. -set(CMAKE_CXX_SIZEOF_DATA_PTR "8") -set(CMAKE_CXX_COMPILER_ABI "ELF") -set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") - -if(CMAKE_CXX_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_CXX_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -endif() - -if(CMAKE_CXX_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") -endif() - - - - -set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;c") -set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/4.8;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") -set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") - - - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin deleted file mode 100755 index 3458fc29190dbceb43a4fb44955cbce374660b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8587 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 YSNpGT_qcN9OFrx7@!z`XldUEG1u+4vi~s-t diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin deleted file mode 100755 index ea701432becf6a6bd7cb452c08f7c7645d0f8607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8600 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 Qh0vf8p8U7sgQ9cbUvrV1<^TWy diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake deleted file mode 100644 index bbcd260466..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake +++ /dev/null @@ -1,15 +0,0 @@ -set(CMAKE_HOST_SYSTEM "Linux-3.17.0-031700-lowlatency") -set(CMAKE_HOST_SYSTEM_NAME "Linux") -set(CMAKE_HOST_SYSTEM_VERSION "3.17.0-031700-lowlatency") -set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") - - - -set(CMAKE_SYSTEM "Linux-3.17.0-031700-lowlatency") -set(CMAKE_SYSTEM_NAME "Linux") -set(CMAKE_SYSTEM_VERSION "3.17.0-031700-lowlatency") -set(CMAKE_SYSTEM_PROCESSOR "x86_64") - -set(CMAKE_CROSSCOMPILING "FALSE") - -set(CMAKE_SYSTEM_LOADED 1) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c deleted file mode 100644 index cba81d4a6b..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c +++ /dev/null @@ -1,389 +0,0 @@ -#ifdef __cplusplus -# error "A C++ compiler has been selected for C." -#endif - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__18CXX) -# define ID_VOID_MAIN -#endif - -#if defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" - /* __INTEL_COMPILER = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH HEX(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC(__WATCOMC__ % 100) - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_C = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) -# if defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" -# else -# if __IBMC__ >= 800 -# define COMPILER_ID "XL" -# else -# define COMPILER_ID "VisualAge" -# endif - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -/* Analog VisualDSP++ >= 4.5.6 */ -#elif defined(__VISUALDSPVERSION__) -# define COMPILER_ID "ADSP" - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) - -/* Analog VisualDSP++ < 4.5.6 */ -#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" - -/* IAR Systems compiler for embedded systems. - http://www.iar.com */ -#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" - -/* sdcc, the small devices C compiler for embedded systems, - http://sdcc.sourceforge.net */ -#elif defined(SDCC) -# define COMPILER_ID "SDCC" - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) - -#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) -# define COMPILER_ID "MIPSpro" -# if defined(_SGI_COMPILER_VERSION) - /* _SGI_COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) -# else - /* _COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) -# endif - -/* This compiler is either not known or is too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__sgi) -# define COMPILER_ID "MIPSpro" - -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" - -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) -# define PLATFORM_ID "IRIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#else /* unknown platform */ -# define PLATFORM_ID "" - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM) -# define ARCHITECTURE_ID "ARM" - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID "" -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number components. */ -#ifdef COMPILER_VERSION_MAJOR -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif - (void)argv; - return require; -} -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out deleted file mode 100755 index 1d7e438b92300abaac114123c512167b14d7d259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8683 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 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH HEX(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC(__WATCOMC__ % 100) - -#elif defined(__SUNPRO_CC) -# define COMPILER_ID "SunPro" -# if __SUNPRO_CC >= 0x5100 - /* __SUNPRO_CC = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# endif - -#elif defined(__HP_aCC) -# define COMPILER_ID "HP" - /* __HP_aCC = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) - -#elif defined(__DECCXX) -# define COMPILER_ID "Compaq" - /* __DECCXX_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) - -#elif defined(__IBMCPP__) -# if defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" -# else -# if __IBMCPP__ >= 800 -# define COMPILER_ID "XL" -# else -# define COMPILER_ID "VisualAge" -# endif - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -/* Analog VisualDSP++ >= 4.5.6 */ -#elif defined(__VISUALDSPVERSION__) -# define COMPILER_ID "ADSP" - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) - -/* Analog VisualDSP++ < 4.5.6 */ -#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" - -/* IAR Systems compiler for embedded systems. - http://www.iar.com */ -#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" - -#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) -# define COMPILER_ID "MIPSpro" -# if defined(_SGI_COMPILER_VERSION) - /* _SGI_COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) -# else - /* _COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) -# endif - -/* This compiler is either not known or is too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__sgi) -# define COMPILER_ID "MIPSpro" - -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" - -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) -# define PLATFORM_ID "IRIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#else /* unknown platform */ -# define PLATFORM_ID "" - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM) -# define ARCHITECTURE_ID "ARM" - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID "" -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number components. */ -#ifdef COMPILER_VERSION_MAJOR -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -/*--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif - (void)argv; - return require; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out deleted file mode 100755 index aeee00b0724a9ab52a33c118ab316ac8e587fac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8692 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 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeDirectoryInformation.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeDirectoryInformation.cmake deleted file mode 100644 index 335b0cbcf2..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeDirectoryInformation.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 2.8 - -# Relative path conversion top directories. -SET(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C") -SET(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build") - -# Force unix paths in dependencies. -SET(CMAKE_FORCE_UNIX_PATHS 1) - - -# The C and CXX include file regular expressions for this directory. -SET(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") -SET(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") -SET(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) -SET(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeOutput.log b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeOutput.log deleted file mode 100644 index 10bdcf5f63..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeOutput.log +++ /dev/null @@ -1,263 +0,0 @@ -The system is: Linux - 3.17.0-031700-lowlatency - x86_64 -Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. -Compiler: /usr/bin/cc -Build flags: -Id flags: - -The output was: -0 - - -Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" - -The C compiler identification is GNU, found in "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out" - -Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. -Compiler: /usr/bin/c++ -Build flags: -Id flags: - -The output was: -0 - - -Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" - -The CXX compiler identification is GNU, found in "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out" - -Determining if the C compiler works passed with the following output: -Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp - -Run Build Command:/usr/bin/make "cmTryCompileExec4097118404/fast" -/usr/bin/make -f CMakeFiles/cmTryCompileExec4097118404.dir/build.make CMakeFiles/cmTryCompileExec4097118404.dir/build -make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' -/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1 -Building C object CMakeFiles/cmTryCompileExec4097118404.dir/testCCompiler.c.o -/usr/bin/cc -o CMakeFiles/cmTryCompileExec4097118404.dir/testCCompiler.c.o -c /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/testCCompiler.c -Linking C executable cmTryCompileExec4097118404 -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec4097118404.dir/link.txt --verbose=1 -/usr/bin/cc CMakeFiles/cmTryCompileExec4097118404.dir/testCCompiler.c.o -o cmTryCompileExec4097118404 -rdynamic -make[1]: Leaving directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' - - -Detecting C compiler ABI info compiled with the following output: -Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp - -Run Build Command:/usr/bin/make "cmTryCompileExec3603593924/fast" -/usr/bin/make -f CMakeFiles/cmTryCompileExec3603593924.dir/build.make CMakeFiles/cmTryCompileExec3603593924.dir/build -make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' -/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1 -Building C object CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -/usr/bin/cc -o CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-2.8/Modules/CMakeCCompilerABI.c -Linking C executable cmTryCompileExec3603593924 -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec3603593924.dir/link.txt --verbose=1 -/usr/bin/cc -v CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -o cmTryCompileExec3603593924 -rdynamic -Using built-in specs. -COLLECT_GCC=/usr/bin/cc -COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper -Target: x86_64-linux-gnu -Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu -Thread model: posix -gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) -COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ -LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec3603593924' '-rdynamic' '-mtune=generic' '-march=x86-64' - /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTryCompileExec3603593924 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o -make[1]: Leaving directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' - - -Parsed C implicit link information from above output: - link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] - ignore line: [Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp] - ignore line: [] - ignore line: [Run Build Command:/usr/bin/make "cmTryCompileExec3603593924/fast"] - ignore line: [/usr/bin/make -f CMakeFiles/cmTryCompileExec3603593924.dir/build.make CMakeFiles/cmTryCompileExec3603593924.dir/build] - ignore line: [make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp'] - ignore line: [/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1] - ignore line: [Building C object CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o] - ignore line: [/usr/bin/cc -o CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-2.8/Modules/CMakeCCompilerABI.c] - ignore line: [Linking C executable cmTryCompileExec3603593924] - ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec3603593924.dir/link.txt --verbose=1] - ignore line: [/usr/bin/cc -v CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -o cmTryCompileExec3603593924 -rdynamic ] - ignore line: [Using built-in specs.] - ignore line: [COLLECT_GCC=/usr/bin/cc] - ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper] - ignore line: [Target: x86_64-linux-gnu] - ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] - ignore line: [Thread model: posix] - ignore line: [gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) ] - ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/] - ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec3603593924' '-rdynamic' '-mtune=generic' '-march=x86-64'] - link line: [ /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTryCompileExec3603593924 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o] - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2] ==> ignore - arg [--sysroot=/] ==> ignore - arg [--build-id] ==> ignore - arg [--eh-frame-hdr] ==> ignore - arg [-m] ==> ignore - arg [elf_x86_64] ==> ignore - arg [--hash-style=gnu] ==> ignore - arg [--as-needed] ==> ignore - arg [-export-dynamic] ==> ignore - arg [-dynamic-linker] ==> ignore - arg [/lib64/ld-linux-x86-64.so.2] ==> ignore - arg [-zrelro] ==> ignore - arg [-o] ==> ignore - arg [cmTryCompileExec3603593924] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o] ==> ignore - arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] - arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] - arg [-L/lib/../lib] ==> dir [/lib/../lib] - arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] - arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] - arg [CMakeFiles/cmTryCompileExec3603593924.dir/CMakeCCompilerABI.c.o] ==> ignore - arg [-lgcc] ==> lib [gcc] - arg [--as-needed] ==> ignore - arg [-lgcc_s] ==> lib [gcc_s] - arg [--no-as-needed] ==> ignore - arg [-lc] ==> lib [c] - arg [-lgcc] ==> lib [gcc] - arg [--as-needed] ==> ignore - arg [-lgcc_s] ==> lib [gcc_s] - arg [--no-as-needed] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o] ==> ignore - remove lib [gcc] - remove lib [gcc_s] - remove lib [gcc] - remove lib [gcc_s] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8] ==> [/usr/lib/gcc/x86_64-linux-gnu/4.8] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] ==> [/usr/lib] - collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] - collapse library dir [/lib/../lib] ==> [/lib] - collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] - collapse library dir [/usr/lib/../lib] ==> [/usr/lib] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] ==> [/usr/lib] - implicit libs: [c] - implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/4.8;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] - implicit fwks: [] - - -Determining if the CXX compiler works passed with the following output: -Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp - -Run Build Command:/usr/bin/make "cmTryCompileExec997608794/fast" -/usr/bin/make -f CMakeFiles/cmTryCompileExec997608794.dir/build.make CMakeFiles/cmTryCompileExec997608794.dir/build -make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' -/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1 -Building CXX object CMakeFiles/cmTryCompileExec997608794.dir/testCXXCompiler.cxx.o -/usr/bin/c++ -o CMakeFiles/cmTryCompileExec997608794.dir/testCXXCompiler.cxx.o -c /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/testCXXCompiler.cxx -Linking CXX executable cmTryCompileExec997608794 -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec997608794.dir/link.txt --verbose=1 -/usr/bin/c++ CMakeFiles/cmTryCompileExec997608794.dir/testCXXCompiler.cxx.o -o cmTryCompileExec997608794 -rdynamic -make[1]: Leaving directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' - - -Detecting CXX compiler ABI info compiled with the following output: -Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp - -Run Build Command:/usr/bin/make "cmTryCompileExec2573420878/fast" -/usr/bin/make -f CMakeFiles/cmTryCompileExec2573420878.dir/build.make CMakeFiles/cmTryCompileExec2573420878.dir/build -make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' -/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1 -Building CXX object CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -/usr/bin/c++ -o CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-2.8/Modules/CMakeCXXCompilerABI.cpp -Linking CXX executable cmTryCompileExec2573420878 -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec2573420878.dir/link.txt --verbose=1 -/usr/bin/c++ -v CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -o cmTryCompileExec2573420878 -rdynamic -Using built-in specs. -COLLECT_GCC=/usr/bin/c++ -COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper -Target: x86_64-linux-gnu -Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu -Thread model: posix -gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) -COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ -LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec2573420878' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64' - /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTryCompileExec2573420878 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o -make[1]: Leaving directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp' - - -Parsed CXX implicit link information from above output: - link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] - ignore line: [Change Dir: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp] - ignore line: [] - ignore line: [Run Build Command:/usr/bin/make "cmTryCompileExec2573420878/fast"] - ignore line: [/usr/bin/make -f CMakeFiles/cmTryCompileExec2573420878.dir/build.make CMakeFiles/cmTryCompileExec2573420878.dir/build] - ignore line: [make[1]: Entering directory `/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp'] - ignore line: [/usr/bin/cmake -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/CMakeTmp/CMakeFiles 1] - ignore line: [Building CXX object CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o] - ignore line: [/usr/bin/c++ -o CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-2.8/Modules/CMakeCXXCompilerABI.cpp] - ignore line: [Linking CXX executable cmTryCompileExec2573420878] - ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec2573420878.dir/link.txt --verbose=1] - ignore line: [/usr/bin/c++ -v CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -o cmTryCompileExec2573420878 -rdynamic ] - ignore line: [Using built-in specs.] - ignore line: [COLLECT_GCC=/usr/bin/c++] - ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper] - ignore line: [Target: x86_64-linux-gnu] - ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] - ignore line: [Thread model: posix] - ignore line: [gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) ] - ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/] - ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec2573420878' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] - link line: [ /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTryCompileExec2573420878 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o] - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2] ==> ignore - arg [--sysroot=/] ==> ignore - arg [--build-id] ==> ignore - arg [--eh-frame-hdr] ==> ignore - arg [-m] ==> ignore - arg [elf_x86_64] ==> ignore - arg [--hash-style=gnu] ==> ignore - arg [--as-needed] ==> ignore - arg [-export-dynamic] ==> ignore - arg [-dynamic-linker] ==> ignore - arg [/lib64/ld-linux-x86-64.so.2] ==> ignore - arg [-zrelro] ==> ignore - arg [-o] ==> ignore - arg [cmTryCompileExec2573420878] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o] ==> ignore - arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] - arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] - arg [-L/lib/../lib] ==> dir [/lib/../lib] - arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] - arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] - arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] - arg [CMakeFiles/cmTryCompileExec2573420878.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore - arg [-lstdc++] ==> lib [stdc++] - arg [-lm] ==> lib [m] - arg [-lgcc_s] ==> lib [gcc_s] - arg [-lgcc] ==> lib [gcc] - arg [-lc] ==> lib [c] - arg [-lgcc_s] ==> lib [gcc_s] - arg [-lgcc] ==> lib [gcc] - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o] ==> ignore - arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o] ==> ignore - remove lib [gcc_s] - remove lib [gcc] - remove lib [gcc_s] - remove lib [gcc] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8] ==> [/usr/lib/gcc/x86_64-linux-gnu/4.8] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] ==> [/usr/lib] - collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] - collapse library dir [/lib/../lib] ==> [/lib] - collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] - collapse library dir [/usr/lib/../lib] ==> [/usr/lib] - collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] ==> [/usr/lib] - implicit libs: [stdc++;m;c] - implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/4.8;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] - implicit fwks: [] - - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile.cmake deleted file mode 100644 index 119272f1f1..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile.cmake +++ /dev/null @@ -1,43 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 2.8 - -# The generator used is: -SET(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") - -# The top level Makefile was generated from the following files: -SET(CMAKE_MAKEFILE_DEPENDS - "CMakeCache.txt" - "../CMakeLists.txt" - "CMakeFiles/2.8.12.2/CMakeCCompiler.cmake" - "CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake" - "CMakeFiles/2.8.12.2/CMakeSystem.cmake" - "/usr/share/cmake-2.8/Modules/CMakeCInformation.cmake" - "/usr/share/cmake-2.8/Modules/CMakeCXXInformation.cmake" - "/usr/share/cmake-2.8/Modules/CMakeCommonLanguageInclude.cmake" - "/usr/share/cmake-2.8/Modules/CMakeGenericSystem.cmake" - "/usr/share/cmake-2.8/Modules/CMakeSystemSpecificInformation.cmake" - "/usr/share/cmake-2.8/Modules/Compiler/GNU-C.cmake" - "/usr/share/cmake-2.8/Modules/Compiler/GNU-CXX.cmake" - "/usr/share/cmake-2.8/Modules/Compiler/GNU.cmake" - "/usr/share/cmake-2.8/Modules/Platform/Linux-GNU-C.cmake" - "/usr/share/cmake-2.8/Modules/Platform/Linux-GNU-CXX.cmake" - "/usr/share/cmake-2.8/Modules/Platform/Linux-GNU.cmake" - "/usr/share/cmake-2.8/Modules/Platform/Linux.cmake" - "/usr/share/cmake-2.8/Modules/Platform/UnixPaths.cmake" - ) - -# The corresponding makefile is: -SET(CMAKE_MAKEFILE_OUTPUTS - "Makefile" - "CMakeFiles/cmake.check_cache" - ) - -# Byproducts of CMake generate step: -SET(CMAKE_MAKEFILE_PRODUCTS - "CMakeFiles/CMakeDirectoryInformation.cmake" - ) - -# Dependency information for all targets: -SET(CMAKE_DEPEND_INFO_FILES - "CMakeFiles/Si5351C.dir/DependInfo.cmake" - ) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile2 b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile2 deleted file mode 100644 index 16016a9bd2..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Makefile2 +++ /dev/null @@ -1,102 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 2.8 - -# Default target executed when no arguments are given to make. -default_target: all -.PHONY : default_target - -# The main recursive all target -all: -.PHONY : all - -# The main recursive preinstall target -preinstall: -.PHONY : preinstall - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/bin/cmake - -# The command to remove a file. -RM = /usr/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The program to use to edit the cache. -CMAKE_EDIT_COMMAND = /usr/bin/ccmake - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build - -#============================================================================= -# Target rules for target CMakeFiles/Si5351C.dir - -# All Build rule for target. -CMakeFiles/Si5351C.dir/all: - $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/depend - $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/build - $(CMAKE_COMMAND) -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles 1 - @echo "Built target Si5351C" -.PHONY : CMakeFiles/Si5351C.dir/all - -# Include target in all. -all: CMakeFiles/Si5351C.dir/all -.PHONY : all - -# Build rule for subdir invocation for target. -CMakeFiles/Si5351C.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles 1 - $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/Si5351C.dir/all - $(CMAKE_COMMAND) -E cmake_progress_start /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles 0 -.PHONY : CMakeFiles/Si5351C.dir/rule - -# Convenience name for target. -Si5351C: CMakeFiles/Si5351C.dir/rule -.PHONY : Si5351C - -# clean rule for target. -CMakeFiles/Si5351C.dir/clean: - $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/clean -.PHONY : CMakeFiles/Si5351C.dir/clean - -# clean rule for target. -clean: CMakeFiles/Si5351C.dir/clean -.PHONY : clean - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/CXX.includecache b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/CXX.includecache deleted file mode 100644 index b84d7a1def..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/CXX.includecache +++ /dev/null @@ -1,8 +0,0 @@ -#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) - -#IncludeRegexScan: ^.*$ - -#IncludeRegexComplain: ^$ - -#IncludeRegexTransform: - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/DependInfo.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/DependInfo.cmake deleted file mode 100644 index 8fbd267efc..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/DependInfo.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# The set of languages for which implicit dependencies are needed: -SET(CMAKE_DEPENDS_LANGUAGES - "CXX" - ) -# The set of files for implicit dependencies of each language: -SET(CMAKE_DEPENDS_CHECK_CXX - "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp" "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/Si5351C.o" - ) -SET(CMAKE_CXX_COMPILER_ID "GNU") - -# Targets to which this target links. -SET(CMAKE_TARGET_LINKED_INFO_FILES - ) - -# The include file search paths: -SET(CMAKE_C_TARGET_INCLUDE_PATH - "../../lms7002m" - ".." - ) -SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) -SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) -SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/Si5351C.o b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/Si5351C.o deleted file mode 100644 index 9c3483db4eb7c2c2bfd8b4bd29d4f87b7c961757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144184 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 DuMANa diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/build.make b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/build.make deleted file mode 100644 index 55f2ff4765..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/build.make +++ /dev/null @@ -1,106 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 2.8 - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/bin/cmake - -# The command to remove a file. -RM = /usr/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The program to use to edit the cache. -CMAKE_EDIT_COMMAND = /usr/bin/ccmake - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build - -# Include any dependencies generated for this target. -include CMakeFiles/Si5351C.dir/depend.make - -# Include the progress variables for this target. -include CMakeFiles/Si5351C.dir/progress.make - -# Include the compile flags for this target's objects. -include CMakeFiles/Si5351C.dir/flags.make - -CMakeFiles/Si5351C.dir/Si5351C.o: CMakeFiles/Si5351C.dir/flags.make -CMakeFiles/Si5351C.dir/Si5351C.o: ../Si5351C.cpp - $(CMAKE_COMMAND) -E cmake_progress_report /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles $(CMAKE_PROGRESS_1) - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building CXX object CMakeFiles/Si5351C.dir/Si5351C.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_FLAGS) -o CMakeFiles/Si5351C.dir/Si5351C.o -c /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp - -CMakeFiles/Si5351C.dir/Si5351C.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/Si5351C.dir/Si5351C.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_FLAGS) -E /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp > CMakeFiles/Si5351C.dir/Si5351C.i - -CMakeFiles/Si5351C.dir/Si5351C.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/Si5351C.dir/Si5351C.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_FLAGS) -S /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp -o CMakeFiles/Si5351C.dir/Si5351C.s - -CMakeFiles/Si5351C.dir/Si5351C.o.requires: -.PHONY : CMakeFiles/Si5351C.dir/Si5351C.o.requires - -CMakeFiles/Si5351C.dir/Si5351C.o.provides: CMakeFiles/Si5351C.dir/Si5351C.o.requires - $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/Si5351C.o.provides.build -.PHONY : CMakeFiles/Si5351C.dir/Si5351C.o.provides - -CMakeFiles/Si5351C.dir/Si5351C.o.provides.build: CMakeFiles/Si5351C.dir/Si5351C.o - -# Object files for target Si5351C -Si5351C_OBJECTS = \ -"CMakeFiles/Si5351C.dir/Si5351C.o" - -# External object files for target Si5351C -Si5351C_EXTERNAL_OBJECTS = - -libSi5351C.a: CMakeFiles/Si5351C.dir/Si5351C.o -libSi5351C.a: CMakeFiles/Si5351C.dir/build.make -libSi5351C.a: CMakeFiles/Si5351C.dir/link.txt - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking CXX static library libSi5351C.a" - $(CMAKE_COMMAND) -P CMakeFiles/Si5351C.dir/cmake_clean_target.cmake - $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/Si5351C.dir/link.txt --verbose=$(VERBOSE) - -# Rule to build all files generated by this target. -CMakeFiles/Si5351C.dir/build: libSi5351C.a -.PHONY : CMakeFiles/Si5351C.dir/build - -CMakeFiles/Si5351C.dir/requires: CMakeFiles/Si5351C.dir/Si5351C.o.requires -.PHONY : CMakeFiles/Si5351C.dir/requires - -CMakeFiles/Si5351C.dir/clean: - $(CMAKE_COMMAND) -P CMakeFiles/Si5351C.dir/cmake_clean.cmake -.PHONY : CMakeFiles/Si5351C.dir/clean - -CMakeFiles/Si5351C.dir/depend: - cd /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/DependInfo.cmake --color=$(COLOR) -.PHONY : CMakeFiles/Si5351C.dir/depend - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean.cmake deleted file mode 100644 index e300fd2668..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean.cmake +++ /dev/null @@ -1,10 +0,0 @@ -FILE(REMOVE_RECURSE - "CMakeFiles/Si5351C.dir/Si5351C.o" - "libSi5351C.pdb" - "libSi5351C.a" -) - -# Per-language clean rules from dependency scanning. -FOREACH(lang CXX) - INCLUDE(CMakeFiles/Si5351C.dir/cmake_clean_${lang}.cmake OPTIONAL) -ENDFOREACH(lang) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean_target.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean_target.cmake deleted file mode 100644 index bb2fb4b00e..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/cmake_clean_target.cmake +++ /dev/null @@ -1,3 +0,0 @@ -FILE(REMOVE_RECURSE - "libSi5351C.a" -) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.internal b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.internal deleted file mode 100644 index 2b377e7bc4..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.internal +++ /dev/null @@ -1,6 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 2.8 - -CMakeFiles/Si5351C.dir/Si5351C.o - /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp - /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.make b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.make deleted file mode 100644 index f55fdb2688..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/depend.make +++ /dev/null @@ -1,6 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 2.8 - -CMakeFiles/Si5351C.dir/Si5351C.o: ../Si5351C.cpp -CMakeFiles/Si5351C.dir/Si5351C.o: ../Si5351C.h - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/flags.make b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/flags.make deleted file mode 100644 index 3515e5e131..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/flags.make +++ /dev/null @@ -1,8 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 2.8 - -# compile CXX with /usr/bin/c++ -CXX_FLAGS = -std=c++11 -I/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/../lms7002m -I/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C - -CXX_DEFINES = - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/link.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/link.txt deleted file mode 100644 index 000b6e0ee0..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/link.txt +++ /dev/null @@ -1,2 +0,0 @@ -/usr/bin/ar cr libSi5351C.a CMakeFiles/Si5351C.dir/Si5351C.o -/usr/bin/ranlib libSi5351C.a diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/progress.make b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/progress.make deleted file mode 100644 index 781c7de277..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir/progress.make +++ /dev/null @@ -1,2 +0,0 @@ -CMAKE_PROGRESS_1 = 1 - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/TargetDirectories.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/TargetDirectories.txt deleted file mode 100644 index 8bed4f4e60..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/TargetDirectories.txt +++ /dev/null @@ -1 +0,0 @@ -/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/Si5351C.dir diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/cmake.check_cache b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd73172..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/progress.marks b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/progress.marks deleted file mode 100644 index d00491fd7e..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/progress.marks +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/Makefile b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/Makefile deleted file mode 100644 index 45a34a03b1..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/Makefile +++ /dev/null @@ -1,157 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 2.8 - -# Default target executed when no arguments are given to make. -default_target: all -.PHONY : default_target - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/bin/cmake - -# The command to remove a file. -RM = /usr/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The program to use to edit the cache. -CMAKE_EDIT_COMMAND = /usr/bin/ccmake - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." - /usr/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache -.PHONY : edit_cache/fast - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache -.PHONY : rebuild_cache/fast - -# The main all target -all: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles/progress.marks - $(MAKE) -f CMakeFiles/Makefile2 all - $(CMAKE_COMMAND) -E cmake_progress_start /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - $(MAKE) -f CMakeFiles/Makefile2 clean -.PHONY : clean - -# The main clean target -clean/fast: clean -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - $(MAKE) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - $(MAKE) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -#============================================================================= -# Target rules for targets named Si5351C - -# Build rule for target. -Si5351C: cmake_check_build_system - $(MAKE) -f CMakeFiles/Makefile2 Si5351C -.PHONY : Si5351C - -# fast build rule for target. -Si5351C/fast: - $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/build -.PHONY : Si5351C/fast - -# target to build an object file -Si5351C.o: - $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/Si5351C.o -.PHONY : Si5351C.o - -# target to preprocess a source file -Si5351C.i: - $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/Si5351C.i -.PHONY : Si5351C.i - -# target to generate assembly for a file -Si5351C.s: - $(MAKE) -f CMakeFiles/Si5351C.dir/build.make CMakeFiles/Si5351C.dir/Si5351C.s -.PHONY : Si5351C.s - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... Si5351C" - @echo "... edit_cache" - @echo "... rebuild_cache" - @echo "... Si5351C.o" - @echo "... Si5351C.i" - @echo "... Si5351C.s" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/cmake_install.cmake b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/cmake_install.cmake deleted file mode 100644 index d7797d84e9..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/cmake_install.cmake +++ /dev/null @@ -1,44 +0,0 @@ -# Install script for directory: /home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C - -# Set the install prefix -IF(NOT DEFINED CMAKE_INSTALL_PREFIX) - SET(CMAKE_INSTALL_PREFIX "/usr/local") -ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) -STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - IF(BUILD_TYPE) - STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - ELSE(BUILD_TYPE) - SET(CMAKE_INSTALL_CONFIG_NAME "") - ENDIF(BUILD_TYPE) - MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - -# Set the component getting installed. -IF(NOT CMAKE_INSTALL_COMPONENT) - IF(COMPONENT) - MESSAGE(STATUS "Install component: \"${COMPONENT}\"") - SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - ELSE(COMPONENT) - SET(CMAKE_INSTALL_COMPONENT) - ENDIF(COMPONENT) -ENDIF(NOT CMAKE_INSTALL_COMPONENT) - -# Install shared libraries without execute permission? -IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) - SET(CMAKE_INSTALL_SO_NO_EXE "1") -ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) - -IF(CMAKE_INSTALL_COMPONENT) - SET(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -ELSE(CMAKE_INSTALL_COMPONENT) - SET(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -ENDIF(CMAKE_INSTALL_COMPONENT) - -FILE(WRITE "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/${CMAKE_INSTALL_MANIFEST}" "") -FOREACH(file ${CMAKE_INSTALL_MANIFEST_FILES}) - FILE(APPEND "/home/papillon/openairinterface5g/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/${CMAKE_INSTALL_MANIFEST}" "${file}\n") -ENDFOREACH(file) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/libSi5351C.a b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build/libSi5351C.a deleted file mode 100644 index bc5d760e0aedfec3c12ab319e446c9ce801c5bcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162342 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 +#include +#include "lmsComms.h" +#include "INI.h" +#include +#include +#include +#include "LMS7002M_RegistersMap.h" + +#include +#include + +float_type LMS7002M::gVCO_frequency_table[3][2] = { { 3800, 5222 }, { 4961, 6754 }, {6306, 7714} }; +float_type LMS7002M::gCGEN_VCO_frequencies[2] = {2000, 2700}; + +///define for parameter enumeration if prefix might be needed +#define LMS7param(id) id + +//module addresses needs to be sorted in ascending order +const uint16_t LMS7002M::readOnlyRegisters[] = { 0x002F, 0x008C, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x0123, 0x0209, 0x020A, 0x020B, 0x040E, 0x040F }; +const uint16_t LMS7002M::readOnlyRegistersMasks[] = { 0x0000, 0x0FFF, 0x007F, 0x0000, 0x0000, 0x0000, 0x0000, 0x003F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; + +/** @brief Simple logging function to print status messages + @param text message to print + @param type message type for filtering specific information +*/ +void LMS7002M::Log(const char* text, LogType type) +{ + switch(type) + { + case LOG_INFO: + printf("%s\n", text); + break; + case LOG_WARNING: + printf("Warning: %s\n", text); + break; + case LOG_ERROR: + printf("ERROR: %s\n", text); + break; + case LOG_DATA: + printf("DATA: %s\n", text); + break; + } +} + +LMS7002M::LMS7002M() : controlPort(NULL), mRegistersMap(new LMS7002M_RegistersMap()) +{ + mRefClkSXR_MHz = 30.72; + mRefClkSXT_MHz = 30.72; +} + +/** @brief Creates LMS7002M main control object, it requires LMScomms to communicate with chip + @param controlPort data connection for controlling LMS7002 chip registers +*/ +LMS7002M::LMS7002M(LMScomms* controlPort) : + controlPort(controlPort), mRegistersMap(new LMS7002M_RegistersMap()) +{ + mRefClkSXR_MHz = 30.72; + mRefClkSXT_MHz = 30.72; + + //memory intervals for registers tests and calibration algorithms + MemorySectionAddresses[LimeLight][0] = 0x0020; + MemorySectionAddresses[LimeLight][1] = 0x002F; + MemorySectionAddresses[EN_DIR][0] = 0x0081; + MemorySectionAddresses[EN_DIR][1] = 0x0081; + MemorySectionAddresses[AFE][0] = 0x0082; + MemorySectionAddresses[AFE][1] = 0x0082; + MemorySectionAddresses[BIAS][0] = 0x0084; + MemorySectionAddresses[BIAS][1] = 0x0084; + MemorySectionAddresses[XBUF][0] = 0x0085; + MemorySectionAddresses[XBUF][1] = 0x0085; + MemorySectionAddresses[CGEN][0] = 0x0086; + MemorySectionAddresses[CGEN][1] = 0x008C; + MemorySectionAddresses[LDO][0] = 0x0092; + MemorySectionAddresses[LDO][1] = 0x00A7; + MemorySectionAddresses[BIST][0] = 0x00A8; + MemorySectionAddresses[BIST][1] = 0x00AC; + MemorySectionAddresses[CDS][0] = 0x00AD; + MemorySectionAddresses[CDS][1] = 0x00AE; + MemorySectionAddresses[TRF][0] = 0x0100; + MemorySectionAddresses[TRF][1] = 0x0104; + MemorySectionAddresses[TBB][0] = 0x0105; + MemorySectionAddresses[TBB][1] = 0x010A; + MemorySectionAddresses[RFE][0] = 0x010C; + MemorySectionAddresses[RFE][1] = 0x0114; + MemorySectionAddresses[RBB][0] = 0x0115; + MemorySectionAddresses[RBB][1] = 0x011A; + MemorySectionAddresses[SX][0] = 0x011C; + MemorySectionAddresses[SX][1] = 0x0124; + MemorySectionAddresses[TxTSP][0] = 0x0200; + MemorySectionAddresses[TxTSP][1] = 0x020C; + MemorySectionAddresses[TxNCO][0] = 0x0240; + MemorySectionAddresses[TxNCO][1] = 0x0261; + MemorySectionAddresses[TxGFIR1][0] = 0x0280; + MemorySectionAddresses[TxGFIR1][1] = 0x02A7; + MemorySectionAddresses[TxGFIR2][0] = 0x02C0; + MemorySectionAddresses[TxGFIR2][1] = 0x02E7; + MemorySectionAddresses[TxGFIR3a][0] = 0x0300; + MemorySectionAddresses[TxGFIR3a][1] = 0x0327; + MemorySectionAddresses[TxGFIR3b][0] = 0x0340; + MemorySectionAddresses[TxGFIR3b][1] = 0x0367; + MemorySectionAddresses[TxGFIR3c][0] = 0x0380; + MemorySectionAddresses[TxGFIR3c][1] = 0x03A7; + MemorySectionAddresses[RxTSP][0] = 0x0400; + MemorySectionAddresses[RxTSP][1] = 0x040F; + MemorySectionAddresses[RxNCO][0] = 0x0440; + MemorySectionAddresses[RxNCO][1] = 0x0461; + MemorySectionAddresses[RxGFIR1][0] = 0x0480; + MemorySectionAddresses[RxGFIR1][1] = 0x04A7; + MemorySectionAddresses[RxGFIR2][0] = 0x04C0; + MemorySectionAddresses[RxGFIR2][1] = 0x04E7; + MemorySectionAddresses[RxGFIR3a][0] = 0x0500; + MemorySectionAddresses[RxGFIR3a][1] = 0x0527; + MemorySectionAddresses[RxGFIR3b][0] = 0x0540; + MemorySectionAddresses[RxGFIR3b][1] = 0x0567; + MemorySectionAddresses[RxGFIR3c][0] = 0x0580; + MemorySectionAddresses[RxGFIR3c][1] = 0x05A7; + + mRegistersMap->InitializeDefaultValues(LMS7parameterList); +} + +LMS7002M::~LMS7002M() +{ + +} + +/** @brief Sends reset signal to chip, after reset enables B channel controls + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::ResetChip() +{ + if (controlPort == NULL) + return LIBLMS7_NO_CONNECTION_MANAGER; + if (controlPort->IsOpen() == false) + return LIBLMS7_NOT_CONNECTED; + + LMScomms::GenericPacket pkt; + pkt.cmd = CMD_LMS7002_RST; + pkt.outBuffer.push_back(LMS_RST_PULSE); + controlPort->TransferPacket(pkt); + if (pkt.status == STATUS_COMPLETED_CMD) + { + Modify_SPI_Reg_bits(LMS7param(MIMO_SISO), 0); //enable B channel after reset + return LIBLMS7_SUCCESS; + } + else + return LIBLMS7_FAILURE; +} + +liblms7_status LMS7002M::LoadConfigLegacyFile(const char* filename) +{ + ifstream f(filename); + if (f.good() == false) //file not found + { + f.close(); + return LIBLMS7_FILE_NOT_FOUND; + } + f.close(); + uint16_t addr = 0; + uint16_t value = 0; + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel + liblms7_status status; + typedef INI ini_t; + ini_t parser(filename, true); + if (parser.select("FILE INFO") == false) + return LIBLMS7_FILE_INVALID_FORMAT; + + string type = ""; + type = parser.get("type", "undefined"); + stringstream ss; + if (type.find("LMS7002 configuration") == string::npos) + { + ss << "File " << filename << " not recognized" << endl; + return LIBLMS7_FILE_INVALID_FORMAT; + } + + int fileVersion = 0; + fileVersion = parser.get("version", 0); + + vector addrToWrite; + vector dataToWrite; + if (fileVersion == 1) + { + if (parser.select("Reference clocks")) + { + mRefClkSXR_MHz = parser.get("SXR reference frequency MHz", 30.72); + mRefClkSXT_MHz = parser.get("SXT reference frequency MHz", 30.72); + } + + if (parser.select("LMS7002 registers ch.A") == true) + { + ini_t::sectionsit_t section = parser.sections.find("LMS7002 registers ch.A"); + + uint16_t x0020_value = 0; + Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel + for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) + { + sscanf(pairs->first.c_str(), "%hx", &addr); + sscanf(pairs->second.c_str(), "%hx", &value); + if (addr == LMS7param(MAC).address) //skip register containing channel selection + { + x0020_value = value; + continue; + } + addrToWrite.push_back(addr); + dataToWrite.push_back(value); + } + status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); + if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) + return status; + + //parse FCW or PHO + if (parser.select("NCO Rx ch.A") == true) + { + char varname[64]; + int mode = Get_SPI_Reg_bits(LMS7param(MODE_RX)); + if (mode == 0) //FCW + { + for (int i = 0; i < 16; ++i) + { + sprintf(varname, "FCW%02i", i); + SetNCOFrequency(LMS7002M::Rx, i, parser.get(varname, 0.0)); + } + } + else + { + for (int i = 0; i < 16; ++i) + { + sprintf(varname, "PHO%02i", i); + SetNCOPhaseOffset(LMS7002M::Rx, i, parser.get(varname, 0.0)); + } + } + } + if (parser.select("NCO Tx ch.A") == true) + { + char varname[64]; + int mode = Get_SPI_Reg_bits(LMS7param(MODE_TX)); + if (mode == 0) //FCW + { + for (int i = 0; i < 16; ++i) + { + sprintf(varname, "FCW%02i", i); + SetNCOFrequency(LMS7002M::Tx, i, parser.get(varname, 0.0)); + } + } + else + { + for (int i = 0; i < 16; ++i) + { + sprintf(varname, "PHO%02i", i); + SetNCOPhaseOffset(LMS7002M::Tx, i, parser.get(varname, 0.0)); + } + } + } + status = SPI_write(0x0020, x0020_value); + if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) + return status; + } + + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + + if (parser.select("LMS7002 registers ch.B") == true) + { + addrToWrite.clear(); + dataToWrite.clear(); + ini_t::sectionsit_t section = parser.sections.find("LMS7002 registers ch.B"); + for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) + { + sscanf(pairs->first.c_str(), "%hx", &addr); + sscanf(pairs->second.c_str(), "%hx", &value); + addrToWrite.push_back(addr); + dataToWrite.push_back(value); + } + Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel + status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); + if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) + return status; + + //parse FCW or PHO + if (parser.select("NCO Rx ch.B") == true) + { + char varname[64]; + int mode = Get_SPI_Reg_bits(LMS7param(MODE_RX)); + if (mode == 0) //FCW + { + for (int i = 0; i < 16; ++i) + { + sprintf(varname, "FCW%02i", i); + SetNCOFrequency(LMS7002M::Rx, i, parser.get(varname, 0.0)); + } + } + else + { + for (int i = 0; i < 16; ++i) + { + sprintf(varname, "PHO%02i", i); + SetNCOPhaseOffset(LMS7002M::Rx, i, parser.get(varname, 0.0)); + } + } + } + if (parser.select("NCO Tx ch.A") == true) + { + char varname[64]; + int mode = Get_SPI_Reg_bits(LMS7param(MODE_TX)); + if (mode == 0) //FCW + { + for (int i = 0; i < 16; ++i) + { + sprintf(varname, "FCW%02i", i); + SetNCOFrequency(LMS7002M::Tx, i, parser.get(varname, 0.0)); + } + } + else + { + for (int i = 0; i < 16; ++i) + { + sprintf(varname, "PHO%02i", i); + SetNCOPhaseOffset(LMS7002M::Tx, i, parser.get(varname, 0.0)); + } + } + } + } + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + return LIBLMS7_SUCCESS; + } + else + return LIBLMS7_FILE_INVALID_FORMAT; + return LIBLMS7_FAILURE; +} + +/** @brief Reads configuration file and uploads registers to chip + @param filename Configuration source file + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::LoadConfig(const char* filename) +{ + ifstream f(filename); + if (f.good() == false) //file not found + { + f.close(); + return LIBLMS7_FILE_NOT_FOUND; + } + f.close(); + uint16_t addr = 0; + uint16_t value = 0; + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel + + liblms7_status status; + typedef INI ini_t; + ini_t parser(filename, true); + if (parser.select("file_info") == false) + { + //try loading as legacy format + status = LoadConfigLegacyFile(filename); + Modify_SPI_Reg_bits(MAC, 1); + return status; + } + string type = ""; + type = parser.get("type", "undefined"); + stringstream ss; + if (type.find("lms7002m_minimal_config") == string::npos) + { + ss << "File " << filename << " not recognized" << endl; + return LIBLMS7_FILE_INVALID_FORMAT; + } + + int fileVersion = 0; + fileVersion = parser.get("version", 0); + + vector addrToWrite; + vector dataToWrite; + + if (fileVersion == 1) + { + if(parser.select("lms7002_registers_a") == true) + { + ini_t::sectionsit_t section = parser.sections.find("lms7002_registers_a"); + + uint16_t x0020_value = 0; + Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel + for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) + { + sscanf(pairs->first.c_str(), "%hx", &addr); + sscanf(pairs->second.c_str(), "%hx", &value); + if (addr == LMS7param(MAC).address) //skip register containing channel selection + { + x0020_value = value; + continue; + } + addrToWrite.push_back(addr); + dataToWrite.push_back(value); + } + status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); + if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) + return status; + status = SPI_write(0x0020, x0020_value); + if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) + return status; + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) + return status; + } + + if (parser.select("lms7002_registers_b") == true) + { + addrToWrite.clear(); + dataToWrite.clear(); + ini_t::sectionsit_t section = parser.sections.find("lms7002_registers_b"); + for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) + { + sscanf(pairs->first.c_str(), "%hx", &addr); + sscanf(pairs->second.c_str(), "%hx", &value); + addrToWrite.push_back(addr); + dataToWrite.push_back(value); + } + Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel + status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); + if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) + return status; + } + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + + parser.select("reference_clocks"); + mRefClkSXR_MHz = parser.get("sxr_ref_clk_mhz", 30.72); + mRefClkSXT_MHz = parser.get("sxt_ref_clk_mhz", 30.72); + } + + Modify_SPI_Reg_bits(MAC, 1); + if (controlPort == NULL) + return LIBLMS7_NO_CONNECTION_MANAGER; + if (controlPort->IsOpen() == false) + return LIBLMS7_NOT_CONNECTED; + return LIBLMS7_SUCCESS; +} + +/** @brief Reads all registers from chip and saves to file + @param filename destination filename + @return 0-success, other failure +*/ +liblms7_status LMS7002M::SaveConfig(const char* filename) +{ + liblms7_status status; + typedef INI<> ini_t; + ini_t parser(filename, true); + parser.create("file_info"); + parser.set("type", "lms7002m_minimal_config"); + parser.set("version", 1); + + char addr[80]; + char value[80]; + + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + + vector addrToRead; + for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) + for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) + addrToRead.push_back(addr); + vector dataReceived; + dataReceived.resize(addrToRead.size(), 0); + + parser.create("lms7002_registers_a"); + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + for (uint16_t i = 0; i < addrToRead.size(); ++i) + { + dataReceived[i] = Get_SPI_Reg_bits(addrToRead[i], 15, 0, false); + sprintf(addr, "0x%04X", addrToRead[i]); + sprintf(value, "0x%04X", dataReceived[i]); + parser.set(addr, value); + } + + parser.create("lms7002_registers_b"); + addrToRead.clear(); //add only B channel addresses + for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) + for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) + if (addr >= 0x0100) + addrToRead.push_back(addr); + + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + for (uint16_t i = 0; i < addrToRead.size(); ++i) + { + dataReceived[i] = Get_SPI_Reg_bits(addrToRead[i], 15, 0, false); + sprintf(addr, "0x%04X", addrToRead[i]); + sprintf(value, "0x%04X", dataReceived[i]); + parser.set(addr, value); + } + + Modify_SPI_Reg_bits(LMS7param(MAC), ch); //retore previously used channel + + parser.create("reference_clocks"); + parser.set("sxt_ref_clk_mhz", mRefClkSXT_MHz); + parser.set("sxr_ref_clk_mhz", mRefClkSXR_MHz); + parser.save(filename); + return LIBLMS7_SUCCESS; +} + +/** @brief Returns reference clock in MHz used for SXT or SXR + @param Tx transmitter or receiver selection +*/ +float_type LMS7002M::GetReferenceClk_SX(bool tx) +{ + return tx ? mRefClkSXT_MHz : mRefClkSXR_MHz; +} + +/** @return Current CLKGEN frequency in MHz + Returned frequency depends on reference clock used for Receiver +*/ +float_type LMS7002M::GetFrequencyCGEN_MHz() +{ + float_type dMul = (mRefClkSXR_MHz/2.0)/(Get_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN))+1); //DIV_OUTCH_CGEN + uint16_t gINT = Get_SPI_Reg_bits(0x0088, 13, 0); //read whole register to reduce SPI transfers + uint32_t gFRAC = ((gINT & 0xF) * 65536) | Get_SPI_Reg_bits(0x0087, 15, 0); + return dMul * (((gINT>>4) + 1 + gFRAC/1048576.0)); +} + +/** @brief Returns TSP reference frequency + @param tx TxTSP or RxTSP selection + @return TSP reference frequency in MHz +*/ +float_type LMS7002M::GetReferenceClk_TSP_MHz(bool tx) +{ + float_type cgenFreq = GetFrequencyCGEN_MHz(); + float_type clklfreq = cgenFreq/pow(2.0, Get_SPI_Reg_bits(LMS7param(CLKH_OV_CLKL_CGEN))); + if(Get_SPI_Reg_bits(LMS7param(EN_ADCCLKH_CLKGN)) == 0) + return tx ? clklfreq : cgenFreq/4.0; + else + return tx ? cgenFreq : clklfreq/4.0; +} + +/** @brief Sets CLKGEN frequency, calculations use receiver'r reference clock + @param freq_MHz desired frequency in MHz + @return 0-succes, other-cannot deliver desired frequency +*/ +liblms7_status LMS7002M::SetFrequencyCGEN(const float_type freq_MHz) +{ + float_type dFvco; + float_type dFrac; + int16_t iHdiv; + + //VCO frequency selection according to F_CLKH + iHdiv = (int16_t)((gCGEN_VCO_frequencies[1]/ 2) / freq_MHz) - 1; + dFvco = 2*(iHdiv+1) * freq_MHz; + + //Integer division + uint16_t gINT = (uint16_t)(dFvco/mRefClkSXR_MHz - 1); + + //Fractional division + dFrac = dFvco/mRefClkSXR_MHz - (uint32_t)(dFvco/mRefClkSXR_MHz); + uint32_t gFRAC = (uint32_t)(dFrac * 1048576); + + Modify_SPI_Reg_bits(LMS7param(INT_SDM_CGEN), gINT); //INT_SDM_CGEN + Modify_SPI_Reg_bits(0x0087, 15, 0, gFRAC&0xFFFF); //INT_SDM_CGEN[15:0] + Modify_SPI_Reg_bits(0x0088, 3, 0, gFRAC>>16); //INT_SDM_CGEN[19:16] + Modify_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN), iHdiv); //DIV_OUTCH_CGEN + + return TuneVCO(VCO_CGEN); +} + +/** @brief Performs VCO tuning operations for CLKGEN, SXR, SXT modules + @param module module selection for tuning 0-cgen, 1-SXR, 2-SXT + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::TuneVCO(VCO_Module module) // 0-cgen, 1-SXR, 2-SXT +{ + if (controlPort == NULL) + return LIBLMS7_NO_CONNECTION_MANAGER; + if (controlPort->IsOpen() == false) + return LIBLMS7_NOT_CONNECTED; + int8_t i; + uint8_t cmphl; //comparators + int16_t csw_lowest = -1; + uint16_t addrVCOpd; // VCO power down address + uint16_t addrCSW_VCO; + uint16_t addrCMP; //comparator address + uint8_t lsb; //SWC lsb index + uint8_t msb; //SWC msb index + + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel + + if(module != VCO_CGEN) //set addresses to SX module + { + Modify_SPI_Reg_bits(LMS7param(MAC), module); + addrVCOpd = LMS7param(PD_VCO).address; + addrCSW_VCO = LMS7param(CSW_VCO).address; + lsb = LMS7param(CSW_VCO).lsb; + msb = LMS7param(CSW_VCO).msb; + addrCMP = LMS7param(VCO_CMPHO).address; + } + else //set addresses to CGEN module + { + addrVCOpd = LMS7param(PD_VCO_CGEN).address; + addrCSW_VCO = LMS7param(CSW_VCO_CGEN).address; + lsb = LMS7param(CSW_VCO_CGEN).lsb; + msb = LMS7param(CSW_VCO_CGEN).msb; + addrCMP = LMS7param(VCO_CMPHO_CGEN).address; + } + // Initialization + Modify_SPI_Reg_bits (addrVCOpd, 2, 1, 0); //activate VCO and comparator + if (Get_SPI_Reg_bits(addrVCOpd, 2, 1) != 0) + return LIBLMS7_VCO_IS_POWERED_DOWN; + if(module == VCO_CGEN) + Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO_CGEN), 1); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time + else + Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO), 1); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time + Modify_SPI_Reg_bits (addrCSW_VCO , msb, lsb , 0); //Set SWC_VCO<7:0>=<00000000> + + i=7; + while(i>=0) + { + Modify_SPI_Reg_bits (addrCSW_VCO, lsb + i, lsb + i, 1); // CSW_VCO=1 + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + cmphl = (uint8_t)Get_SPI_Reg_bits(addrCMP, 13, 12); + if ( (cmphl&0x01) == 1) // reduce CSW + Modify_SPI_Reg_bits (addrCSW_VCO, lsb + i, lsb + i, 0); // CSW_VCO=0 + if( cmphl == 2 && csw_lowest < 0) + csw_lowest = Get_SPI_Reg_bits(addrCSW_VCO, msb, lsb); + --i; + } + if(csw_lowest >= 0) + { + uint16_t csw_highest = Get_SPI_Reg_bits(addrCSW_VCO, msb, lsb); + if(csw_lowest == csw_highest) + { + while(csw_lowest>=0) + { + Modify_SPI_Reg_bits(addrCSW_VCO, msb, lsb, csw_lowest); + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + if(Get_SPI_Reg_bits(addrCMP, 13, 12) == 0) + { + ++csw_lowest; + break; + } + else + --csw_lowest; + } + } + Modify_SPI_Reg_bits(addrCSW_VCO, msb, lsb, csw_lowest+(csw_highest-csw_lowest)/2); + } + if (module == VCO_CGEN) + Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO_CGEN), 0); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time + else + Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO), 0); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time + cmphl = (uint8_t)Get_SPI_Reg_bits(addrCMP, 13, 12); + Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore previously used channel + if(cmphl == 2) + return LIBLMS7_SUCCESS; + else + return LIBLMS7_FAILURE; +} + +/** @brief Returns given parameter value from chip register + @param param LMS7002M control parameter + @param fromChip read directly from chip + @return parameter value +*/ +uint16_t LMS7002M::Get_SPI_Reg_bits(const LMS7Parameter ¶m, bool fromChip) +{ + return Get_SPI_Reg_bits(param.address, param.msb, param.lsb, fromChip); +} + +/** @brief Returns given parameter value from chip register + @param address register address + @param msb most significant bit index + @param lsb least significant bit index + @param fromChip read directly from chip + @return register bits from selected interval, shifted to right by lsb bits +*/ +uint16_t LMS7002M::Get_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, bool fromChip) +{ + return (SPI_read(address, fromChip) & (~(~0<<(msb+1)))) >> lsb; //shift bits to LSB +} + +/** @brief Change given parameter value + @param param LMS7002M control parameter + @param fromChip read initial value directly from chip + @param value new parameter value +*/ +liblms7_status LMS7002M::Modify_SPI_Reg_bits(const LMS7Parameter ¶m, const uint16_t value, bool fromChip) +{ + return Modify_SPI_Reg_bits(param.address, param.msb, param.lsb, value, fromChip); +} + +/** @brief Change given parameter value + @param address register address + @param value new bits value, the value is shifted left by lsb bits + @param fromChip read initial value directly from chip +*/ +liblms7_status LMS7002M::Modify_SPI_Reg_bits(const uint16_t address, const uint8_t msb, const uint8_t lsb, const uint16_t value, bool fromChip) +{ + uint16_t spiDataReg = SPI_read(address, fromChip); //read current SPI reg data + uint16_t spiMask = (~(~0 << (msb - lsb + 1))) << (lsb); // creates bit mask + spiDataReg = (spiDataReg & (~spiMask)) | ((value << lsb) & spiMask);//clear bits + return SPI_write(address, spiDataReg); //write modified data back to SPI reg +} + +/** @brief Modifies given registers with values applied using masks + @param addr array of register addresses + @param masks array of applied masks + @param values array of values to be written + @param start starting index of given arrays + @param stop end index of given arrays +*/ +liblms7_status LMS7002M::Modify_SPI_Reg_mask(const uint16_t *addr, const uint16_t *masks, const uint16_t *values, uint8_t start, uint8_t stop) +{ + liblms7_status status; + uint16_t reg_data; + vector addresses; + vector data; + while (start <= stop) + { + reg_data = SPI_read(addr[start], true, &status); //read current SPI reg data + reg_data &= ~masks[start];//clear bits + reg_data |= (values[start] & masks[start]); + addresses.push_back(addr[start]); + data.push_back(reg_data); + ++start; + } + if (status != LIBLMS7_SUCCESS) + return status; + SPI_write_batch(&addresses[0], &data[0], addresses.size()); + return status; +} + +/** @brief Sets SX frequency + @param Tx Rx/Tx module selection + @param freq_MHz desired frequency in MHz + @param refClk_MHz reference clock in MHz + @return 0-success, other-cannot deliver requested frequency +*/ +liblms7_status LMS7002M::SetFrequencySX(bool tx, float_type freq_MHz, float_type refClk_MHz) +{ + if (controlPort == NULL) + return LIBLMS7_NO_CONNECTION_MANAGER; + if (controlPort->IsOpen() == false) + return LIBLMS7_NOT_CONNECTED; + const uint8_t sxVCO_N = 2; //number of entries in VCO frequencies + const float_type m_dThrF = 5500; //threshold to enable additional divider + uint8_t ch; //remember used channel + float_type VCOfreq; + int8_t div_loch; + int8_t sel_vco; + bool canDeliverFrequency = false; + uint16_t integerPart; + uint32_t fractionalPart; + int8_t i; + + //find required VCO frequency + for (div_loch = 6; div_loch >= 0; --div_loch) + { + VCOfreq = (1 << (div_loch + 1)) * freq_MHz; + if ((VCOfreq >= gVCO_frequency_table[0][0]) && (VCOfreq <= gVCO_frequency_table[2][sxVCO_N - 1])) + { + canDeliverFrequency = true; + break; + } + } + if (canDeliverFrequency == false) + return LIBLMS7_CANNOT_DELIVER_FREQUENCY; + + integerPart = (uint16_t)(VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))) - 4); + fractionalPart = (uint32_t)((VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))) - (uint32_t)(VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))))) * 1048576); + + ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + Modify_SPI_Reg_bits(LMS7param(MAC), tx + 1); + Modify_SPI_Reg_bits(LMS7param(INT_SDM), integerPart); //INT_SDM + Modify_SPI_Reg_bits(0x011D, 15, 0, fractionalPart & 0xFFFF); //FRAC_SDM[15:0] + Modify_SPI_Reg_bits(0x011E, 3, 0, (fractionalPart >> 16)); //FRAC_SDM[19:16] + Modify_SPI_Reg_bits(LMS7param(DIV_LOCH), div_loch); //DIV_LOCH + Modify_SPI_Reg_bits(LMS7param(EN_DIV2_DIVPROG), (VCOfreq > m_dThrF)); //EN_DIV2_DIVPROG + + //find which VCO supports required frequency + Modify_SPI_Reg_bits(LMS7param(PD_VCO), 0); // + Modify_SPI_Reg_bits(LMS7param(PD_VCO_COMP), 0); // + int cswBackup = Get_SPI_Reg_bits(LMS7param(CSW_VCO)); //remember to restore previous tune value + canDeliverFrequency = false; + int tuneScore[] = { -128, -128, -128 }; //best is closest to 0 + for (sel_vco = 0; sel_vco < 3; ++sel_vco) + { + Modify_SPI_Reg_bits(LMS7param(SEL_VCO), sel_vco); + liblms7_status status = TuneVCO(tx ? VCO_SXT : VCO_SXR); + int csw = Get_SPI_Reg_bits(LMS7param(CSW_VCO), true); + tuneScore[sel_vco] = -128 + csw; + if (status == LIBLMS7_SUCCESS) + canDeliverFrequency = true; + } + if (abs(tuneScore[0]) < abs(tuneScore[1])) + { + if (abs(tuneScore[0]) < abs(tuneScore[2])) + sel_vco = 0; + else + sel_vco = 2; + } + else + { + if (abs(tuneScore[1]) < abs(tuneScore[2])) + sel_vco = 1; + else + sel_vco = 2; + } + Modify_SPI_Reg_bits(LMS7param(SEL_VCO), sel_vco); + Modify_SPI_Reg_bits(LMS7param(CSW_VCO), cswBackup); + Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore used channel + if (tx) + mRefClkSXT_MHz = refClk_MHz; + else + mRefClkSXR_MHz = refClk_MHz; + if (canDeliverFrequency == false) + return LIBLMS7_CANNOT_DELIVER_FREQUENCY; + return TuneVCO( tx ? VCO_SXT : VCO_SXR); //Rx-1, Tx-2 +} + +/** @brief Returns currently set SXR/SXT frequency + @return SX frequency MHz +*/ +float_type LMS7002M::GetFrequencySX_MHz(bool Tx, float_type refClk_MHz) +{ + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember previously used channel + float_type dMul; + if(Tx) + Modify_SPI_Reg_bits(LMS7param(MAC), 2); // Rx mac = 1, Tx max = 2 + else + Modify_SPI_Reg_bits(LMS7param(MAC), 1); // Rx mac = 1, Tx max = 2 + uint16_t gINT = Get_SPI_Reg_bits(0x011E, 13, 0); // read whole register to reduce SPI transfers + uint32_t gFRAC = ((gINT&0xF) * 65536) | Get_SPI_Reg_bits(0x011D, 15, 0); + + dMul = (float_type)refClk_MHz / (1 << (Get_SPI_Reg_bits(LMS7param(DIV_LOCH)) + 1)); + //Calculate real frequency according to the calculated parameters + dMul = dMul * ((gINT >> 4) + 4 + (float_type)gFRAC / 1048576.0) * (Get_SPI_Reg_bits(LMS7param(EN_DIV2_DIVPROG)) + 1); + Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore used channel + return dMul; +} + +/** @brief Loads given DC_REG values into registers + @param tx TxTSP or RxTSP selection + @param I DC_REG I value + @param Q DC_REG Q value +*/ +liblms7_status LMS7002M::LoadDC_REG_IQ(bool tx, int16_t I, int16_t Q) +{ + if(tx) + { + Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), I); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 0); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 1); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 0); + Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), Q); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 0); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 1); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 0); + Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP + } + else + { + Modify_SPI_Reg_bits(LMS7param(DC_REG_RXTSP), I); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 0); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 1); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 0); + Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), Q); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 0); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 1); + Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 0); + Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); //DC_BYP + } + return LIBLMS7_SUCCESS; +} + +/** @brief Sets chosen NCO's frequency + @param tx transmitter or receiver selection + @param index NCO index from 0 to 15 + @param freq_MHz desired NCO frequency + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::SetNCOFrequency(bool tx, uint8_t index, float_type freq_MHz) +{ + if(index > 15) + return LIBLMS7_INDEX_OUT_OF_RANGE; + float_type refClk_MHz = GetReferenceClk_TSP_MHz(tx); + uint16_t addr = tx ? 0x0240 : 0x0440; + uint32_t fcw = (uint32_t)((freq_MHz/refClk_MHz)*4294967296); + SPI_write(addr+2+index*2, (fcw >> 16)); //NCO frequency control word register MSB part. + SPI_write(addr+3+index*2, fcw); //NCO frequency control word register LSB part. + return LIBLMS7_SUCCESS; +} + +/** @brief Returns chosen NCO's frequency in MHz + @param tx transmitter or receiver selection + @param index NCO index from 0 to 15 + @param fromChip read frequency directly from chip or local registers + @return NCO frequency in MHz +*/ +float_type LMS7002M::GetNCOFrequency_MHz(bool tx, uint8_t index, const float_type refClk_MHz, bool fromChip) +{ + if(index > 15) + return LIBLMS7_INDEX_OUT_OF_RANGE; + uint16_t addr = tx ? 0x0240 : 0x0440; + uint32_t fcw = 0; + fcw |= SPI_read(addr + 2 + index * 2, fromChip) << 16; //NCO frequency control word register MSB part. + fcw |= SPI_read(addr + 3 + index * 2, fromChip); //NCO frequency control word register LSB part. + return refClk_MHz*(fcw/4294967296.0); +} + +/** @brief Sets chosen NCO phase offset angle when memory table MODE is 0 +@param tx transmitter or receiver selection +@param angle_deg phase offset angle in degrees +@return 0-success, other-failure +*/ +liblms7_status LMS7002M::SetNCOPhaseOffsetForMode0(bool tx, float_type angle_deg) +{ + uint16_t addr = tx ? 0x0241 : 0x0441; + uint16_t pho = (uint16_t)(65536 * (angle_deg / 360 )); + SPI_write(addr, pho); + return LIBLMS7_SUCCESS; +} + +/** @brief Sets chosen NCO's phase offset angle + @param tx transmitter or receiver selection + @param index PHO index from 0 to 15 + @param angle_deg phase offset angle in degrees + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::SetNCOPhaseOffset(bool tx, uint8_t index, float_type angle_deg) +{ + if(index > 15) + return LIBLMS7_INDEX_OUT_OF_RANGE; + uint16_t addr = tx ? 0x0244 : 0x0444; + uint16_t pho = (uint16_t)(65536*(angle_deg / 360)); + SPI_write(addr+index, pho); + return LIBLMS7_SUCCESS; +} + +/** @brief Returns chosen NCO's phase offset angle in radians + @param tx transmitter or receiver selection + @param index PHO index from 0 to 15 + @return phase offset angle in degrees +*/ +float_type LMS7002M::GetNCOPhaseOffset_Deg(bool tx, uint8_t index) +{ + uint16_t addr = tx ? 0x0244 : 0x0444; + uint16_t pho = SPI_read(addr+index); + float_type angle = 360*pho/65536.0; + return angle; +} + +/** @brief Uploads given FIR coefficients to chip + @param tx Transmitter or receiver selection + @param GFIR_index GIR index from 0 to 2 + @param coef array of coefficients + @param coefCount number of coefficients + @return 0-success, other-failure + + This function does not change GFIR*_L or GFIR*_N parameters, they have to be set manually +*/ +liblms7_status LMS7002M::SetGFIRCoefficients(bool tx, uint8_t GFIR_index, const int16_t *coef, uint8_t coefCount) +{ + uint8_t index; + uint8_t coefLimit; + uint16_t startAddr; + if (GFIR_index == 0) + startAddr = 0x0280; + else if (GFIR_index == 1) + startAddr = 0x02C0; + else + startAddr = 0x0300; + + if (tx == false) + startAddr += 0x0200; + if (GFIR_index < 2) + coefLimit = 40; + else + coefLimit = 120; + if (coefCount > coefLimit) + return LIBLMS7_TOO_MANY_VALUES; + vector addresses; + for (index = 0; index < coefCount; ++index) + addresses.push_back(startAddr + index + 24 * (index / 40)); + SPI_write_batch(&addresses[0], (uint16_t*)coef, coefCount); + return LIBLMS7_SUCCESS; +} + +/** @brief Returns currently loaded FIR coefficients + @param tx Transmitter or receiver selection + @param GFIR_index GIR index from 0 to 2 + @param coef array of returned coefficients + @param coefCount number of coefficients to read + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::GetGFIRCoefficients(bool tx, uint8_t GFIR_index, int16_t *coef, uint8_t coefCount) +{ + liblms7_status status = LIBLMS7_FAILURE; + uint8_t index; + uint8_t coefLimit; + uint16_t startAddr; + if(GFIR_index == 0) + startAddr = 0x0280; + else if (GFIR_index == 1) + startAddr = 0x02C0; + else + startAddr = 0x0300; + + if (tx == false) + startAddr += 0x0200; + if (GFIR_index < 2) + coefLimit = 40; + else + coefLimit = 120; + if (coefCount > coefLimit) + return LIBLMS7_TOO_MANY_VALUES; + + std::vector addresses; + for (index = 0; index < coefCount; ++index) + addresses.push_back(startAddr + index + 24 * (index / 40)); + uint16_t spiData[120]; + memset(spiData, 0, 120 * sizeof(uint16_t)); + if (controlPort->IsOpen()) + { + status = SPI_read_batch(&addresses[0], spiData, coefCount); + for (index = 0; index < coefCount; ++index) + coef[index] = spiData[index]; + } + else + { + const int channel = Get_SPI_Reg_bits(LMS7param(MAC), false) > 1 ? 1 : 0; + for (index = 0; index < coefCount; ++index) + coef[index] = mRegistersMap->GetValue(channel, addresses[index]); + status = LIBLMS7_SUCCESS; + } + + return status; +} + +/** @brief Write given data value to whole register + @param address SPI address + @param data new register value + @return 0-succes, other-failure +*/ +liblms7_status LMS7002M::SPI_write(uint16_t address, uint16_t data) +{ + if (controlPort == NULL) + return LIBLMS7_NO_CONNECTION_MANAGER; + + if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1 && address >= 0x0100) + mRegistersMap->SetValue(1, address, data); + else + mRegistersMap->SetValue(0, address, data); + + if (controlPort->IsOpen() == false) + return LIBLMS7_NOT_CONNECTED; + + LMScomms::GenericPacket pkt; + pkt.cmd = CMD_LMS7002_WR; + pkt.outBuffer.push_back(address >> 8); + pkt.outBuffer.push_back(address & 0xFF); + pkt.outBuffer.push_back(data >> 8); + pkt.outBuffer.push_back(data & 0xFF); + controlPort->TransferPacket(pkt); + if (pkt.status == STATUS_COMPLETED_CMD) + return LIBLMS7_SUCCESS; + else + return LIBLMS7_FAILURE; +} + +/** @brief Reads whole register value from given address + @param address SPI address + @param status operation status(optional) + @param fromChip read value directly from chip + @return register value +*/ +uint16_t LMS7002M::SPI_read(uint16_t address, bool fromChip, liblms7_status *status) +{ + if (controlPort == NULL) + { + if (status) + *status = LIBLMS7_NO_CONNECTION_MANAGER; + } + if (controlPort->IsOpen() == false || fromChip == false) + { + if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1 && address >= 0x0100) + return mRegistersMap->GetValue(1, address); + else + return mRegistersMap->GetValue(0, address); + } + + LMScomms::GenericPacket pkt; + pkt.cmd = CMD_LMS7002_RD; + pkt.outBuffer.push_back(address >> 8); + pkt.outBuffer.push_back(address & 0xFF); + if (controlPort->TransferPacket(pkt) == LMScomms::TRANSFER_SUCCESS) + { + if (status) + *status = (pkt.status == STATUS_COMPLETED_CMD ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE); + return (pkt.inBuffer[2] << 8) | pkt.inBuffer[3]; + } + else + return 0; +} + +/** @brief Batches multiple register writes into least ammount of transactions + @param spiAddr spi register addresses to be written + @param spiData registers data to be written + @param cnt number of registers to write + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::SPI_write_batch(const uint16_t* spiAddr, const uint16_t* spiData, uint16_t cnt) +{ + LMScomms::GenericPacket pkt; + pkt.cmd = CMD_LMS7002_WR; + uint32_t index = 0; + for (uint32_t i = 0; i < cnt; ++i) + { + pkt.outBuffer.push_back(spiAddr[i] >> 8); + pkt.outBuffer.push_back(spiAddr[i] & 0xFF); + pkt.outBuffer.push_back(spiData[i] >> 8); + pkt.outBuffer.push_back(spiData[i] & 0xFF); + + if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1) + mRegistersMap->SetValue(1, spiAddr[i], spiData[i]); + else + mRegistersMap->SetValue(0, spiAddr[i], spiData[i]); + + } + if (controlPort == NULL) + return LIBLMS7_NO_CONNECTION_MANAGER; + if (controlPort->IsOpen() == false) + return LIBLMS7_NOT_CONNECTED; + + controlPort->TransferPacket(pkt); + if (pkt.status == STATUS_COMPLETED_CMD) + return LIBLMS7_SUCCESS; + else + return LIBLMS7_FAILURE; +} + +/** @brief Batches multiple register reads into least amount of transactions + @param spiAddr SPI addresses to read + @param spiData array for read data + @param cnt number of registers to read + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::SPI_read_batch(const uint16_t* spiAddr, uint16_t* spiData, uint16_t cnt) +{ + LMScomms::GenericPacket pkt; + pkt.cmd = CMD_LMS7002_RD; + uint32_t index = 0; + for (uint32_t i = 0; i < cnt; ++i) + { + pkt.outBuffer.push_back(spiAddr[i] >> 8); + pkt.outBuffer.push_back(spiAddr[i] & 0xFF); + } + if (controlPort == NULL) + return LIBLMS7_NO_CONNECTION_MANAGER; + if (controlPort->IsOpen() == false) + return LIBLMS7_NOT_CONNECTED; + + LMScomms::TransferStatus status = controlPort->TransferPacket(pkt); + if (status != LMScomms::TRANSFER_SUCCESS) + return LIBLMS7_FAILURE; + + for (uint32_t i = 0; i < cnt; ++i) + { + spiData[i] = (pkt.inBuffer[2*sizeof(uint16_t)*i + 2] << 8) | pkt.inBuffer[2*sizeof(uint16_t)*i + 3]; + if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1) + mRegistersMap->SetValue(1, spiAddr[i], spiData[i]); + else + mRegistersMap->SetValue(0, spiAddr[i], spiData[i]); + } + return pkt.status == STATUS_COMPLETED_CMD ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; + /* + for(int i=0; iGetValue(0, LMS7param(MAC).address) & 0x0003) > 1) + mRegistersMap->SetValue(1, spiAddr[i], spiData[i]); + else + mRegistersMap->SetValue(0, spiAddr[i], spiData[i]); + } + return LIBLMS7_SUCCESS;*/ +} + +/** @brief Performs registers test by writing known data and confirming readback data + @return 0-registers test passed, other-failure +*/ +liblms7_status LMS7002M::RegistersTest() +{ + char chex[16]; + if (controlPort == NULL) + return LIBLMS7_NO_CONNECTION_MANAGER; + if (controlPort->IsOpen() == false) + return LIBLMS7_NOT_CONNECTED; + + liblms7_status status; + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + + //backup both channel data for restoration after test + vector ch1Addresses; + for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) + for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) + ch1Addresses.push_back(addr); + vector ch1Data; + ch1Data.resize(ch1Addresses.size(), 0); + + //backup A channel + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + status = SPI_read_batch(&ch1Addresses[0], &ch1Data[0], ch1Addresses.size()); + if (status != LIBLMS7_SUCCESS) + return status; + + vector ch2Addresses; + for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) + for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) + if (addr >= 0x0100) + ch2Addresses.push_back(addr); + vector ch2Data; + ch2Data.resize(ch2Addresses.size(), 0); + + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + status = SPI_read_batch(&ch2Addresses[0], &ch2Data[0], ch2Addresses.size()); + if (status != LIBLMS7_SUCCESS) + return status; + + //test registers + ResetChip(); + Modify_SPI_Reg_bits(LMS7param(MIMO_SISO), 0); + Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); + Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + + stringstream ss; + + //check single channel memory sections + vector modulesToCheck = { AFE, BIAS, XBUF, CGEN, LDO, BIST, CDS, TRF, TBB, RFE, RBB, SX, + TxTSP, TxNCO, TxGFIR1, TxGFIR2, TxGFIR3a, TxGFIR3b, TxGFIR3c, + RxTSP, RxNCO, RxGFIR1, RxGFIR2, RxGFIR3a, RxGFIR3b, RxGFIR3c, LimeLight }; + const char* moduleNames[] = { "AFE", "BIAS", "XBUF", "CGEN", "LDO", "BIST", "CDS", "TRF", "TBB", "RFE", "RBB", "SX", + "TxTSP", "TxNCO", "TxGFIR1", "TxGFIR2", "TxGFIR3a", "TxGFIR3b", "TxGFIR3c", + "RxTSP", "RxNCO", "RxGFIR1", "RxGFIR2", "RxGFIR3a", "RxGFIR3b", "RxGFIR3c", "LimeLight" }; + + const uint16_t patterns[] = { 0xAAAA, 0x5555 }; + const uint8_t patternsCount = 2; + + bool allTestSuccess = true; + + for (unsigned i = 0; i < modulesToCheck.size(); ++i) + { + bool moduleTestsSuccess = true; + uint16_t startAddr = MemorySectionAddresses[modulesToCheck[i]][0]; + uint16_t endAddr = MemorySectionAddresses[modulesToCheck[i]][1]; + uint8_t channelCount = startAddr >= 0x0100 ? 2 : 1; + for (int cc = 1; cc <= channelCount; ++cc) + { + Modify_SPI_Reg_bits(LMS7param(MAC), cc); + sprintf(chex, "0x%04X", startAddr); + ss << moduleNames[i] << " [" << chex << ":"; + sprintf(chex, "0x%04X", endAddr); + ss << chex << "]"; + if (startAddr >= 0x0100) + ss << " Ch." << (cc == 1 ? "A" : "B"); + ss << endl; + for (uint8_t p = 0; p < patternsCount; ++p) + moduleTestsSuccess &= RegistersTestInterval(startAddr, endAddr, patterns[p], ss) == LIBLMS7_SUCCESS; + } + allTestSuccess &= moduleTestsSuccess; + } + + //restore register values + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + SPI_write_batch(&ch1Addresses[0], &ch1Data[0], ch1Addresses.size()); + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + SPI_write_batch(&ch2Addresses[0], &ch2Data[0], ch2Addresses.size()); + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + + fstream fout; + fout.open("registersTest.txt", ios::out); + fout << ss.str() << endl; + fout.close(); + + return allTestSuccess ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; +} + +/** @brief Performs registers test for given address interval by writing given pattern data + @param startAddr first register address + @param endAddr last reigster address + @param pattern data to be written into registers + @return 0-register test passed, other-failure +*/ +liblms7_status LMS7002M::RegistersTestInterval(uint16_t startAddr, uint16_t endAddr, uint16_t pattern, stringstream &ss) +{ + vector addrToWrite; + vector dataToWrite; + vector dataReceived; + vector dataMasks; + + for (uint16_t addr = startAddr; addr <= endAddr; ++addr) + { + addrToWrite.push_back(addr); + } + dataMasks.resize(addrToWrite.size(), 0xFFFF); + for (uint16_t j = 0; j < sizeof(readOnlyRegisters)/sizeof(uint16_t); ++j) + for (uint16_t k = 0; k < addrToWrite.size(); ++k) + if (readOnlyRegisters[j] == addrToWrite[k]) + { + dataMasks[k] = readOnlyRegistersMasks[j]; + break; + } + + dataToWrite.clear(); + dataReceived.clear(); + for (uint16_t j = 0; j < addrToWrite.size(); ++j) + { + if (addrToWrite[j] == 0x00A6) + dataToWrite.push_back(0x1 | pattern & ~0x2); + else if (addrToWrite[j] == 0x0084) + dataToWrite.push_back(pattern & ~0x19); + else + dataToWrite.push_back(pattern & dataMasks[j]); + } + dataReceived.resize(addrToWrite.size(), 0); + liblms7_status status; + status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); + if (status != LIBLMS7_SUCCESS) + return status; + status = SPI_read_batch(&addrToWrite[0], &dataReceived[0], addrToWrite.size()); + if (status != LIBLMS7_SUCCESS) + return status; + bool registersMatch = true; + char ctemp[16]; + for (uint16_t j = 0; j < dataToWrite.size(); ++j) + { + if (dataToWrite[j] != (dataReceived[j] & dataMasks[j])) + { + registersMatch = false; + sprintf(ctemp, "0x%04X", addrToWrite[j]); + ss << "\t" << ctemp << "(wr/rd): "; + sprintf(ctemp, "0x%04X", dataToWrite[j]); + ss << ctemp << "/"; + sprintf(ctemp, "0x%04X", dataReceived[j]); + ss << ctemp << endl; + } + } + if (registersMatch) + { + sprintf(ctemp, "0x%04X", pattern); + ss << "\tRegisters OK (" << ctemp << ")\n"; + } + return registersMatch ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; +} + +/** @brief Parameters setup instructions for Tx calibration + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::CalibrateTxSetup(float_type bandwidth_MHz) +{ + //Stage 2 + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + uint8_t sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); + uint8_t sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); + + //rfe + //reset RFE to defaults + SetDefaults(RFE); + if (sel_band1_trf == 1) + Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 3); //SEL_PATH_RFE 3 + else if (sel_band2_trf == 1) + Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 2); + else + return LIBLMS7_BAND_NOT_SELECTED; + + if (ch == 2) + Modify_SPI_Reg_bits(LMS7param(EN_NEXTRX_RFE), 1); // EN_NEXTTX_RFE 1 + + Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 8); //G_RXLOOPB_RFE 8 + Modify_SPI_Reg_bits(0x010C, 4, 3, 0); //PD_MXLOBUF_RFE 0, PD_QGEN_RFE 0 + Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), 10); //CCOMP_TIA_RFE 10 + Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), 2600); //CFB_TIA_RFE 2600 + Modify_SPI_Reg_bits(LMS7param(ICT_LODC_RFE), 31); //ICT_LODC_RFE 31 + Modify_SPI_Reg_bits(LMS7param(PD_LNA_RFE), 1); + + //RBB + //reset RBB to defaults + SetDefaults(RBB); + Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 0); //PD_LPFL_RBB 0 + Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 0); //RCC_CTL_LPFL_RBB 0 + Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), 1500); //C_CTL_LPFL_RBB 1500 + Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB), 22); //G_PGA_RBB 22 + + //TRF + //reset TRF to defaults + //SetDefaults(TRF); + Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); //L_LOOPB_TXPAD_TRF 0 + Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); //EN_LOOPB_TXPAD_TRF 1 + Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); //EN_G_TRF 0 + if (ch == 2) + Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); //EN_NEXTTX_TRF 1 + Modify_SPI_Reg_bits(LMS7param(LOSS_LIN_TXPAD_TRF), 0); //LOSS_LIN_TXPAD_TRF 5 + Modify_SPI_Reg_bits(LMS7param(LOSS_MAIN_TXPAD_TRF), 0); //LOSS_MAIN_TXPAD_TRF 5 + + //TBB + //reset TBB to defaults + /*SetDefaults(TBB); + Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 9); //CG_IAMP_TBB 9 + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); //ICT_IAMP_FRP_TBB 1 + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); //ICT_IAMP_GG_FRP_TBB 6 + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), 125); //RCAL_LPFH_TBB 0 + */ + //AFE + //reset AFE to defaults + uint8_t isel_dac_afe =(uint8_t) Get_SPI_Reg_bits(LMS7param(ISEL_DAC_AFE)); + SetDefaults(AFE); + Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2 0 + Modify_SPI_Reg_bits(LMS7param(ISEL_DAC_AFE), isel_dac_afe); + + if (ch == 2) + Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); + //BIAS + uint16_t backup = Get_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS)); + SetDefaults(BIAS); + Modify_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS), backup); //RP_CALIB_BIAS + + //XBUF + Modify_SPI_Reg_bits(0x0085, 2, 0, 1); //PD_XBUF_RX 0, PD_XBUF_TX 0, EN_G_XBUF 1 + + //CGEN + //reset CGEN to defaults + SetDefaults(CGEN); + //power up VCO + Modify_SPI_Reg_bits(LMS7param(PD_VCO_CGEN), 0); + + if (SetFrequencyCGEN(122.88) != LIBLMS7_SUCCESS) + return LIBLMS7_FAILURE; + if (TuneVCO(VCO_CGEN) != LIBLMS7_SUCCESS) + return LIBLMS7_FAILURE; + + //SXR + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + SetDefaults(SX); + float_type SXTfreqMHz = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz); + + float_type SXRfreqMHz = SXTfreqMHz - bandwidth_MHz / 4 - 1; + if (SetFrequencySX(Rx, SXRfreqMHz, mRefClkSXR_MHz) != LIBLMS7_SUCCESS) + return LIBLMS7_FAILURE; + if (TuneVCO(VCO_SXR) != LIBLMS7_SUCCESS) + return LIBLMS7_FAILURE; + + //SXT + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + Modify_SPI_Reg_bits(LMS7param(PD_LOCH_T2RBUF), 1); //PD_LOCH_T2RBUF 1 + if (SetFrequencySX(Tx, SXTfreqMHz, mRefClkSXT_MHz) != LIBLMS7_SUCCESS) + return LIBLMS7_FAILURE; + if (TuneVCO(VCO_SXT) != LIBLMS7_SUCCESS) + return LIBLMS7_FAILURE; + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + + //TXTSP + SetDefaults(TxTSP); + Modify_SPI_Reg_bits(0x0200, 3, 2, 0x3); //TSGMODE 1, INSEL 1 + Modify_SPI_Reg_bits(0x0208, 6, 4, 0x7); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 + LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + Modify_SPI_Reg_bits(0x0440, 4, 0, 0); //TX SEL[3:0] = 0 & MODE = 0 + + float_type offset = 0.2; + if (bandwidth_MHz == 8) + { + //SXR + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + SetDefaults(SX); + float_type SXTfreqMHz = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz); + + float_type sxrFreq = SXTfreqMHz - bandwidth_MHz / 4 - 1 - offset; + if (SetFrequencySX(Rx, sxrFreq, mRefClkSXR_MHz) != LIBLMS7_SUCCESS) + return LIBLMS7_FAILURE; + SetNCOFrequency(Tx, 0, bandwidth_MHz / 4 + offset); + } + else + SetNCOFrequency(Tx, 0, bandwidth_MHz / 4); + + //RXTSP + SetDefaults(RxTSP); + Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); //AGC_MODE 1 + Modify_SPI_Reg_bits(0x040C, 7, 0, 0xBF); + Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); + Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 0); //Decimation HBD ratio + Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 0x7); //agc_avg iq corr + + return LIBLMS7_SUCCESS; +} + +/** @brief Flips the CAPTURE bit and returns digital RSSI value +*/ +uint32_t LMS7002M::GetRSSI() +{ + Modify_SPI_Reg_bits(LMS7param(CAPTURE), 0); + Modify_SPI_Reg_bits(LMS7param(CAPTURE), 1); + return (Get_SPI_Reg_bits(0x040F, 15, 0) << 2) | Get_SPI_Reg_bits(0x040E, 1, 0); +} + +/** @brief Sets Rx Dc offsets by converting two's complementary numbers to sign and magnitude +*/ +void LMS7002M::SetRxDCOFF(int8_t offsetI, int8_t offsetQ) +{ + uint16_t valToSend = 0; + if (offsetI < 0) + valToSend |= 0x40; + valToSend |= labs(offsetI); + valToSend = valToSend << 7; + if (offsetQ < 0) + valToSend |= 0x40; + valToSend |= labs(offsetQ); + SPI_write(0x010E, valToSend); +} + +/** @brief Calibrates Transmitter. DC correction, IQ gains, IQ phase correction + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::CalibrateTx(float_type bandwidth_MHz) +{ + liblms7_status status; + Log("Tx calibration started", LOG_INFO); + BackupAllRegisters(); + + int16_t iqcorr = 0; + uint16_t gcorrq = 0; + uint16_t gcorri = 0; + uint16_t dccorri; + uint16_t dccorrq; + int16_t corrI = 0; + int16_t corrQ = 0; + uint32_t minRSSI_i; + uint32_t minRSSI_q; + uint32_t minRSSI_iq; + int16_t i; + int16_t offsetI = 0; + int16_t offsetQ = 0; + + const short firCoefs[] = + { + -2531, + -517, + 2708, + 188, + -3059, + 216, + 3569, + -770, + -4199, + 1541, + 4886, + -2577, + -5552, + 3909, + 6108, + -5537, + -6457, + 7440, + 6507, + -9566, + -6174, + 11845, + 5391, + -14179, + -4110, + 16457, + 2310, + -18561, + 0, + 20369, + -2780, + -21752, + 5963, + 22610, + -9456, + -22859, + 13127, + 22444, + -16854, + -21319, + 20489, + 19492, + -23883, + -17002, + 26881, + 13902, + -29372, + -10313, + 31226, + 6345, + -32380, + -2141, + 32767, + -2141, + -32380, + 6345, + 31226, + -10313, + -29372, + 13902, + 26881, + -17002, + -23883, + 19492, + 20489, + -21319, + -16854, + 22444, + 13127, + -22859, + -9456, + 22610, + 5963, + -21752, + -2780, + 20369, + 0, + -18561, + 2310, + 16457, + -4110, + -14179, + 5391, + 11845, + -6174, + -9566, + 6507, + 7440, + -6457, + -5537, + 6108, + 3909, + -5552, + -2577, + 4886, + 1541, + -4199, + -770, + 3569, + 216, + -3059, + 188, + 2708, + -517, + -2531 + }; + + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + //Stage 1 + uint8_t sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); + uint8_t sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); + Log("Setup stage", LOG_INFO); + status = CalibrateTxSetup(bandwidth_MHz); + if (status != LIBLMS7_SUCCESS) + goto TxCalibrationEnd; //go to ending stage to restore registers + + //Stage 3 + //Calibrate Rx DC + Log("Rx DC calibration", LOG_INFO); + { + uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C }; + uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses + uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD }; + + Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3); + } + + for (i = 0; i<6; ++i) + { + FindMinRSSI(LMS7param(DCOFFI_RFE), offsetI, &offsetI, 3, 2, 32 >> i); + FindMinRSSI(LMS7param(DCOFFQ_RFE), offsetQ, &offsetQ, 3, 2, 32 >> i); + } + SetRxDCOFF((int8_t)offsetI, (int8_t)offsetQ); + Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); // DC_BYP 0 + + sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); + sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); + //B + Modify_SPI_Reg_bits(0x0100, 0, 0, 1); //EN_G_TRF 1 + if (sel_band1_trf == 1) + { + Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0); //PD_RLOOPB_1_RFE 0 + Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0); //EN_INSHSW_LB1 0 + } + if (sel_band2_trf == 1) + { + Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); //PD_RLOOPB_2_RFE 0 + Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); // EN_INSHSW_LB2 0 + } + FixRXSaturation(); + + Modify_SPI_Reg_bits(LMS7param(GFIR3_BYP_RXTSP), 0); //GFIR3_BYP 0 + Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); + Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7); + Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7); + + SetGFIRCoefficients(Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t)); + + Log("IQ correction stage", LOG_INFO); + Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), 2047); + Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), 2047); + + Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), 0); + + Log("I gain", LOG_INFO); + minRSSI_i = FindMinRSSI_Gain(LMS7param(GCORRI_TXTSP), &gcorri); + + Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), 2047); + Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), 2047); + + Log("Q gain", LOG_INFO); + minRSSI_q = FindMinRSSI_Gain(LMS7param(GCORRQ_TXTSP), &gcorrq); + + if (minRSSI_i < minRSSI_q) + gcorrq = 2047; + else + gcorri = 2047; + + Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); + Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); + + Log("Phase", LOG_INFO); + iqcorr = 0; + for (uint8_t i = 0; i<9; ++i) + minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_TXTSP), iqcorr, &iqcorr, 3, 1, 256 >> i); + + Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); + Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); + Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr); + + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz)-1, mRefClkSXR_MHz); + if (status != LIBLMS7_SUCCESS) + goto TxCalibrationEnd; //go to ending stage to restore registers + + //C + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); + Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); + + Log("TX LO calibration", LOG_INFO); + + //Calibrate Tx DC + for (uint8_t i = 0; i<7; ++i) + { + FindMinRSSI(LMS7param(DCCORRI_TXTSP), corrI, &corrI, 3, 1, 64 >> i); + FindMinRSSI(LMS7param(DCCORRQ_TXTSP), corrQ, &corrQ, 3, 1, 64 >> i); + } + + dccorri = Get_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP)); + dccorrq = Get_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP)); + + // Stage 4 +TxCalibrationEnd: + Log("Restoring registers state", LOG_INFO); + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + RestoreAllRegisters(); + if (status != LIBLMS7_SUCCESS) + { + Log("Tx calibration failed", LOG_WARNING); + return status; + } + + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + Modify_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP), dccorri); + Modify_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP), dccorrq); + Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); + Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); + Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr); + + Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP + Modify_SPI_Reg_bits(0x0208, 1, 0, 0); //GC_BYP PH_BYP + Log("Tx calibration finished", LOG_INFO); + return LIBLMS7_SUCCESS; +} + +/** @brief Performs Rx DC offsets calibration +*/ +void LMS7002M::CalibrateRxDC_RSSI() +{ + int16_t i; + int16_t offsetI = 0; + int16_t offsetQ = 0; + uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C }; + uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses + uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD }; + + Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3); + for (i = 0; i<6; ++i) + { + FindMinRSSI(LMS7param(DCOFFI_RFE), offsetI, &offsetI, 3, 2, 32 >> i); + FindMinRSSI(LMS7param(DCOFFQ_RFE), offsetQ, &offsetQ, 3, 2, 32 >> i); + } + Modify_SPI_Reg_bits(LMS7param(EN_DCOFF_RXFE_RFE), 1); + SetRxDCOFF((int8_t)offsetI, (int8_t)offsetQ); + Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); // DC_BYP 0 +} + +/** @brief Tries to detect and fix gains if Rx is saturated + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::FixRXSaturation() +{ + uint8_t g_rxloopb = 0; + Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb); + Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 3); + + int8_t lLoopb = 3; + const uint32_t rssi_saturation_level = 0xD000; + while (g_rxloopb < 15) + { + g_rxloopb += 1; + Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb); + Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 3); + if (GetRSSI() < rssi_saturation_level) + { + for (lLoopb = 3; lLoopb >= 0; --lLoopb) + { + Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), lLoopb); + if (GetRSSI() > rssi_saturation_level) + { + ++lLoopb; + Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), lLoopb); + goto finished; + } + } + } + else + { + g_rxloopb -= 1; + Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb); + break; + } + } +finished: + return GetRSSI() < rssi_saturation_level ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; +} + +uint32_t LMS7002M::FindMinRSSI(const LMS7Parameter ¶m, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult) +{ + return FindMinRSSI(param.address, param.msb, param.lsb, startValue, result, scanWidth, twoCompl, stepMult); +} + +/** @brief Searches for minimal RSSI value while changing given address bits +@param addr address of parameter being changed +@param msb most significant bit index +@param lsb least significant bit index +@param startValue initial value where to start search +@param result found minimal parameter value will be set here +@param twoCompl varying parameter value is treated as two's complement +@return found minimal RSSI value +*/ +uint32_t LMS7002M::FindMinRSSI(const uint16_t addr, const uint8_t msb, const uint8_t lsb, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult) +{ + if (scanWidth < 1) + return ~0; + int minI; + int min = startValue; + int globMin = 0; + uint32_t minRSSI = ~0; + unsigned int *rssiField = new unsigned int[scanWidth]; + int minRSSIindex; + int i; + int maxVal; + int minVal = 0; + if (twoCompl) + { + maxVal = (~(~0x0 << (msb - lsb + 1))) / 2; + minVal = -(~(~0x0 << (msb - lsb + 1))) / 2 - 1; + } + else + maxVal = (~(~0x0 << (msb - lsb + 1))); + + Modify_SPI_Reg_bits(addr, msb, lsb, startValue); + + Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); + Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); + + minRSSIindex = 0; + for (i = 0; i maxVal) + currentValue = maxVal; + if (twoCompl == 2) + { + uint16_t valToSend = 0; + if (currentValue < 0) + valToSend |= 0x40; + valToSend |= labs(currentValue); + Modify_SPI_Reg_bits(addr, msb, lsb, valToSend); + } + else + Modify_SPI_Reg_bits(addr, msb, lsb, currentValue); + + rssiField[i] = GetRSSI(); + } + minI = min; + minRSSIindex = 0; + for (i = 0; i maxVal) + minI = maxVal; + else if (minI < minVal) + minI = minVal; + globMin = minI; + } + min = minI; + + Modify_SPI_Reg_bits(addr, msb, lsb, min); + + *result = min; + return minRSSI; +} + +/** @brief Sets given module registers to default values + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::SetDefaults(MemorySection module) +{ + liblms7_status status = LIBLMS7_SUCCESS; + vector addrs; + vector values; + for(uint32_t address = MemorySectionAddresses[module][0]; address <= MemorySectionAddresses[module][1]; ++address) + { + addrs.push_back(address); + values.push_back(mRegistersMap->GetDefaultValue(address)); + } + status = SPI_write_batch(&addrs[0], &values[0], addrs.size()); + return status; +} + +/** @brief Parameters setup instructions for Rx calibration + @param bandwidth_MHz filter bandwidth in MHz + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::CalibrateRxSetup(float_type bandwidth_MHz) +{ + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + + //rfe + if (ch == 2) + Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); // EN_NEXTTX_TRF 0 + + Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 15); //G_RXLOOPB_RFE 15 + Modify_SPI_Reg_bits(0x010C, 4, 3, 0); //PD_MXLOBUF_RFE 0, PD_QGEN_RFE 0 + Modify_SPI_Reg_bits(0x010C, 1, 1, 0); //PD_TIA 0 + Modify_SPI_Reg_bits(0x010C, 7, 7, 1); //PD_LNA 1 + + Modify_SPI_Reg_bits(0x0110, 4, 0, 31); //ICT_LO_RFE 31 + Modify_SPI_Reg_bits(0x010D, 4, 1, 0xFF); // all short switches are enabled + + //RBB + Modify_SPI_Reg_bits(0x0115, 15, 14, 0); //Loopback switches disable + Modify_SPI_Reg_bits(0x0119, 15, 15, 0); //OSW_PGA 0 + + //TRF + //reset TRF to defaults + SetDefaults(TRF); + Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); //L_LOOPB_TXPAD_TRF 0 + Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); //EN_LOOPB_TXPAD_TRF 1 + Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); //EN_G_TRF 0 + if (ch == 2) + Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); //EN_NEXTTX_TRF 1 + Modify_SPI_Reg_bits(LMS7param(LOSS_LIN_TXPAD_TRF), 0); //LOSS_LIN_TXPAD_TRF 5 + Modify_SPI_Reg_bits(LMS7param(LOSS_MAIN_TXPAD_TRF), 0); //LOSS_MAIN_TXPAD_TRF 5 + + //TBB + //reset TBB to defaults + SetDefaults(TBB); + Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 9); //CG_IAMP_TBB 9 + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); //ICT_IAMP_FRP_TBB 1 + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); //ICT_IAMP_GG_FRP_TBB 6 + + //AFE + //reset AFE to defaults + SetDefaults(AFE); + Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2 + if (ch == 2) + { + Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); //PD_TX_AFE2 + } + //BIAS + uint16_t backup = Get_SPI_Reg_bits(0x0084, 10, 6); + SetDefaults(BIAS); + Modify_SPI_Reg_bits(0x0084, 10, 6, backup); //RP_CALIB_BIAS + + //XBUF + Modify_SPI_Reg_bits(0x0085, 2, 0, 1); //PD_XBUF_RX 0, PD_XBUF_TX 0, EN_G_XBUF 1 + + //CGEN + //reset CGEN to defaults + SetDefaults(CGEN); + //power up VCO + Modify_SPI_Reg_bits(0x0086, 2, 2, 0); + + liblms7_status status = SetFrequencyCGEN(122.88); + if (status != LIBLMS7_SUCCESS) + return status; + + // //SXR + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + float_type SXRfreqMHz = GetFrequencySX_MHz(Rx, mRefClkSXR_MHz); + + //SXT + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + Modify_SPI_Reg_bits(LMS7param(PD_LOCH_T2RBUF), 1); //PD_LOCH_t2RBUF 1 + status = SetFrequencySX(Tx, SXRfreqMHz + bandwidth_MHz / 4, mRefClkSXT_MHz); + if ( status != LIBLMS7_SUCCESS) + return status; + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + + //TXTSP + SetDefaults(TxTSP); + Modify_SPI_Reg_bits(0x0200, 3, 2, 0x3); //TSGMODE 1, INSEL 1 + //Modify_SPI_Reg_bits(0x0208, 6, 4, 0xFFFF); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 + Modify_SPI_Reg_bits(0x0208, 6, 6, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 + Modify_SPI_Reg_bits(0x0208, 5, 5, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 + Modify_SPI_Reg_bits(0x0208, 4, 4, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 + LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); + SetNCOFrequency(Tx, 0, 0); + + //RXTSP + SetDefaults(RxTSP); + Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); //AGC_MODE 1 + Modify_SPI_Reg_bits(0x040C, 7, 7, 0x1); //CMIX_BYP 1 + Modify_SPI_Reg_bits(0x040C, 6, 6, 0x0); //AGC_BYP 0 + Modify_SPI_Reg_bits(0x040C, 5, 5, 1); // + Modify_SPI_Reg_bits(0x040C, 4, 4, 1); // + Modify_SPI_Reg_bits(0x040C, 3, 3, 1); // + Modify_SPI_Reg_bits(0x040C, 2, 2, 1); // DC_BYP + Modify_SPI_Reg_bits(0x040C, 1, 1, 1); // + Modify_SPI_Reg_bits(0x040C, 0, 0, 1); // + + Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); + Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); + Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 0x7); //agc_avg iq corr + return LIBLMS7_SUCCESS; +} + +/** @brief Calibrates Receiver. DC offset, IQ gains, IQ phase correction + @return 0-success, other-failure +*/ +liblms7_status LMS7002M::CalibrateRx(float_type bandwidth_MHz) +{ + liblms7_status status; + uint32_t minRSSI_i; + uint32_t minRSSI_q; + int16_t iqcorr_rx = 0; + uint32_t minRSSI_iq; + int16_t dcoffi; + int16_t dcoffq; + + const int16_t firCoefs[] = + { + -2531, + -517, + 2708, + 188, + -3059, + 216, + 3569, + -770, + -4199, + 1541, + 4886, + -2577, + -5552, + 3909, + 6108, + -5537, + -6457, + 7440, + 6507, + -9566, + -6174, + 11845, + 5391, + -14179, + -4110, + 16457, + 2310, + -18561, + 0, + 20369, + -2780, + -21752, + 5963, + 22610, + -9456, + -22859, + 13127, + 22444, + -16854, + -21319, + 20489, + 19492, + -23883, + -17002, + 26881, + 13902, + -29372, + -10313, + 31226, + 6345, + -32380, + -2141, + 32767, + -2141, + -32380, + 6345, + 31226, + -10313, + -29372, + 13902, + 26881, + -17002, + -23883, + 19492, + 20489, + -21319, + -16854, + 22444, + 13127, + -22859, + -9456, + 22610, + 5963, + -21752, + -2780, + 20369, + 0, + -18561, + 2310, + 16457, + -4110, + -14179, + 5391, + 11845, + -6174, + -9566, + 6507, + 7440, + -6457, + -5537, + 6108, + 3909, + -5552, + -2577, + 4886, + 1541, + -4199, + -770, + 3569, + 216, + -3059, + 188, + 2708, + -517, + -2531 + }; + + Log("Rx calibration started", LOG_INFO); + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + Log("Saving registers state", LOG_INFO); + BackupAllRegisters(); + uint8_t sel_path_rfe = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE)); + if (sel_path_rfe == 1 || sel_path_rfe == 0) + return LIBLMS7_BAD_SEL_PATH; + + Log("Setup stage", LOG_INFO); + status = CalibrateRxSetup(bandwidth_MHz); + if (status != LIBLMS7_SUCCESS) + goto RxCalibrationEndStage; + + Log("Rx DC calibration", LOG_INFO); + CalibrateRxDC_RSSI(); + dcoffi = Get_SPI_Reg_bits(LMS7param(DCOFFI_RFE)); + dcoffq = Get_SPI_Reg_bits(LMS7param(DCOFFQ_RFE)); + Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 1); + + if (sel_path_rfe == 2) + { + Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); + Modify_SPI_Reg_bits(0x0103, 10, 10, 1); + Modify_SPI_Reg_bits(0x0103, 11, 11, 0); + Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); + } + if (sel_path_rfe == 3) + { + Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0); + Modify_SPI_Reg_bits(0x0103, 11, 11, 1); + Modify_SPI_Reg_bits(0x0103, 10, 10, 0); + Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0); + } + + Modify_SPI_Reg_bits(0x040C, 7, 7, 0); //CMIX_BYP 0 + Modify_SPI_Reg_bits(0x040C, 2, 0, 0); //DC_BYP 0, GC_BYP 0, PH_BYP 0 + Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1); //CMIX_GAIN 1 +6 db + Modify_SPI_Reg_bits(0x040C, 13, 13, 1); //CMIX_SC 1 + + FixRXSaturation(); + + Modify_SPI_Reg_bits(0x040C, 5, 5, 0); //GFIR3_BYP 0 + Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); + Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7); + Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7); + + SetGFIRCoefficients(Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t)); + + SetNCOFrequency(Rx, 0, bandwidth_MHz / 4 + 1); + Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), 2047); + Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), 2047); + + Log("IQ correction stage", LOG_INFO); + iqcorr_rx = 0; + for (int i = 0; i<9; ++i) + minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_RXTSP), iqcorr_rx, &iqcorr_rx, 3, 1, 256 >> i); + Modify_SPI_Reg_bits(LMS7param(IQCORR_RXTSP), iqcorr_rx); + + uint16_t mingcorri; + Log("I gain", LOG_INFO); + minRSSI_i = FindMinRSSI_Gain(LMS7param(GCORRI_RXTSP), &mingcorri); + + Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), 2047); + Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), 2047); + + Log("Q gain", LOG_INFO); + uint16_t mingcorrq; + minRSSI_q = FindMinRSSI_Gain(LMS7param(GCORRQ_RXTSP), &mingcorrq); + + if (minRSSI_i < minRSSI_q) + mingcorrq = 2047; + else + mingcorri = 2047; + + Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), mingcorri); + Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), mingcorrq); + + Log("Phase", LOG_INFO); + for (int i = 0; i<9; ++i) + minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_RXTSP), iqcorr_rx, &iqcorr_rx, 3, 1, 256 >> i); + +RxCalibrationEndStage: + Log("Restoring registers state", LOG_INFO); + RestoreAllRegisters(); + if (status != LIBLMS7_SUCCESS) + { + Log("Rx calibration failed", LOG_WARNING); + return status; + } + + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + SetRxDCOFF((int8_t)dcoffi, (int8_t)dcoffq); + Modify_SPI_Reg_bits(LMS7param(EN_DCOFF_RXFE_RFE), 1); + Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), mingcorri); + Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), mingcorrq); + Modify_SPI_Reg_bits(LMS7param(IQCORR_RXTSP), iqcorr_rx); + Modify_SPI_Reg_bits(0x040C, 2, 0, 0); //DC_BYP 0, GC_BYP 0, PH_BYP 0 + Modify_SPI_Reg_bits(0x0110, 4, 0, 31); //ICT_LO_RFE 31 + Log("Rx calibration finished", LOG_INFO); + return LIBLMS7_SUCCESS; +} + +const uint16_t backupAddrs[] = { + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, + 0x0029, 0x002A, 0x002B, 0x002C, 0x002E, 0x0081, 0x0082, 0x0084, 0x0085, + 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0092, 0x0093, 0x0094, + 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, + 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, + 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0100, 0x0101, 0x0102, 0x0103, + 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010C, 0x010D, 0x010E, + 0x010F, 0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, + 0x0119, 0x011A, 0x011C, 0x011D, 0x011E, 0x011F, 0x0120, 0x0121, 0x0122, 0x0123, + 0x0124, 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, + 0x0240, 0x0242, 0x0243, 0x0400, 0x0401, 0x0402, + 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, + 0x0440, 0x0442, 0x0443 }; +uint16_t backupRegs[sizeof(backupAddrs) / 2]; +const uint16_t backupSXAddr[] = { 0x011C, 0x011D, 0x011E, 0x011F, 0x01200, 0x0121, 0x0122, 0x0123, 0x0124 }; +uint16_t backupRegsSXR[sizeof(backupSXAddr) / 2]; +uint16_t backupRegsSXT[sizeof(backupSXAddr) / 2]; + +/** @brief Stores chip current registers state into memory for later restoration +*/ +void LMS7002M::BackupAllRegisters() +{ + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + SPI_read_batch(backupAddrs, backupRegs, sizeof(backupAddrs) / sizeof(uint16_t)); + Modify_SPI_Reg_bits(LMS7param(MAC), 1); // channel A + SPI_read_batch(backupSXAddr, backupRegsSXR, sizeof(backupRegsSXR) / sizeof(uint16_t)); + Modify_SPI_Reg_bits(LMS7param(MAC), 2); // channel B + SPI_read_batch(backupSXAddr, backupRegsSXT, sizeof(backupRegsSXR) / sizeof(uint16_t)); + Modify_SPI_Reg_bits(LMS7param(MAC), ch); +} + +/** @brief Sets chip registers to state that was stored in memory using BackupAllRegisters() +*/ +void LMS7002M::RestoreAllRegisters() +{ + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + SPI_write_batch(backupAddrs, backupRegs, sizeof(backupAddrs) / sizeof(uint16_t)); + Modify_SPI_Reg_bits(LMS7param(MAC), 1); // channel A + SPI_write_batch(backupSXAddr, backupRegsSXR, sizeof(backupRegsSXR) / sizeof(uint16_t)); + Modify_SPI_Reg_bits(LMS7param(MAC), 2); // channel B + SPI_write_batch(backupSXAddr, backupRegsSXT, sizeof(backupRegsSXR) / sizeof(uint16_t)); + Modify_SPI_Reg_bits(LMS7param(MAC), ch); +} + +/** @brief Searches for minimal digital RSSI value by changing given gain parameter + @param param LMS7002M gain correction parameter + @param foundValue returns value which achieved minimal RSSI + @return minimal found RSSI value +*/ +uint32_t LMS7002M::FindMinRSSI_Gain(const LMS7Parameter ¶m, uint16_t *foundValue) +{ + uint32_t RSSI = ~0 - 2; + uint32_t prevRSSI = RSSI + 1; + uint8_t decrement = 2; + uint16_t gcorr = 2047; + while (gcorr > 1024) + { + Modify_SPI_Reg_bits(param, gcorr); + RSSI = GetRSSI(); + if (RSSI < prevRSSI) + { + prevRSSI = RSSI; + *foundValue = gcorr; + gcorr -= decrement; + decrement *= 2; + } + else + { + if (decrement == 2) + break; + gcorr -= decrement; + decrement = 2; + } + } + return prevRSSI; +} + +/** @brief Reads all chip configuration and checks if it matches with local registers copy +*/ +bool LMS7002M::IsSynced() +{ + if (controlPort->IsOpen() == false) + return false; + bool isSynced = true; + liblms7_status status; + + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + + vector addrToRead = mRegistersMap->GetUsedAddresses(0); + vector dataReceived; + dataReceived.resize(addrToRead.size(), 0); + + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); + if (status != LIBLMS7_SUCCESS) + { + isSynced = false; + goto isSyncedEnding; + } + + //mask out readonly bits + for (uint16_t j = 0; j < sizeof(readOnlyRegisters) / sizeof(uint16_t); ++j) + for (uint16_t k = 0; k < addrToRead.size(); ++k) + if (readOnlyRegisters[j] == addrToRead[k]) + { + dataReceived[k] &= readOnlyRegistersMasks[j]; + break; + } + + //check if local copy matches chip + for (uint16_t i = 0; i < addrToRead.size(); ++i) + { + if (dataReceived[i] != mRegistersMap->GetValue(0, addrToRead[i])) + { + isSynced = false; + goto isSyncedEnding; + } + } + + addrToRead.clear(); //add only B channel addresses + addrToRead = mRegistersMap->GetUsedAddresses(1); + + //mask out readonly bits + for (uint16_t j = 0; j < sizeof(readOnlyRegisters) / sizeof(uint16_t); ++j) + for (uint16_t k = 0; k < addrToRead.size(); ++k) + if (readOnlyRegisters[j] == addrToRead[k]) + { + dataReceived[k] &= readOnlyRegistersMasks[j]; + break; + } + + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); + if (status != LIBLMS7_SUCCESS) + return false; + //check if local copy matches chip + for (uint16_t i = 0; i < addrToRead.size(); ++i) + if (dataReceived[i] != mRegistersMap->GetValue(1, addrToRead[i])) + { + isSynced = false; + break; + } + +isSyncedEnding: + Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore previously used channel + return isSynced; +} + +/** @brief Writes all registers from host to chip + +When used on Novena board, also changes gpios to match rx path and tx band selections +*/ +liblms7_status LMS7002M::UploadAll() +{ + if (controlPort == NULL) + return LIBLMS7_NO_CONNECTION_MANAGER; + if (controlPort->IsOpen() == false) + return LIBLMS7_NOT_CONNECTED; + + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel + + liblms7_status status; + + vector addrToWrite; + vector dataToWrite; + + uint16_t x0020_value = mRegistersMap->GetValue(0, 0x0020); + Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel + + addrToWrite = mRegistersMap->GetUsedAddresses(0); + //remove 0x0020 register from list, to not change MAC + addrToWrite.erase( find(addrToWrite.begin(), addrToWrite.end(), 0x0020) ); + for (auto address : addrToWrite) + dataToWrite.push_back(mRegistersMap->GetValue(0, address)); + + status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); + status = LIBLMS7_SUCCESS; + if (status != LIBLMS7_SUCCESS) + return status; + //after all channel A registers have been written, update 0x0020 register value + status = SPI_write(0x0020, x0020_value); + if (status != LIBLMS7_SUCCESS) + return status; + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + if (status != LIBLMS7_SUCCESS) + return status; + + addrToWrite = mRegistersMap->GetUsedAddresses(1); + dataToWrite.clear(); + for (auto address : addrToWrite) + { + dataToWrite.push_back(mRegistersMap->GetValue(1, address)); + } + Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel + status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); + if (status != LIBLMS7_SUCCESS) + return status; + Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore last used channel + + //in case of Novena board, need to update GPIO + if(controlPort->GetInfo().device == LMS_DEV_NOVENA) + { + uint16_t regValue = SPI_read(0x0706) & 0xFFF8; + //lms_gpio2 - tx output selection: + // 0 - TX1_A and TX1_B (Band 1), + // 1 - TX2_A and TX2_B (Band 2) + regValue |= Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)) << 2; //gpio2 + //RX active paths + //lms_gpio0 | lms_gpio1 RX_A RX_B + // 0 0 => no active path + // 1 0 => LNAW_A LNAW_B + // 0 1 => LNAH_A LNAH_B + // 1 1 => LNAL_A LNAL_B + switch(Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE))) + { + //set gpio1:gpio0 + case 0: regValue |= 0x0; break; + case 1: regValue |= 0x2; break; + case 2: regValue |= 0x3; break; + case 3: regValue |= 0x1; break; + } + SPI_write(0x0706, regValue); + } + return LIBLMS7_SUCCESS; +} + +/** @brief Reads all registers from the chip to host + +When used on Novena board, also updates gpios to match rx path and tx band selections +*/ +liblms7_status LMS7002M::DownloadAll() +{ + if (controlPort == nullptr) + return LIBLMS7_NO_CONNECTION_MANAGER; + if (controlPort->IsOpen() == false) + return LIBLMS7_NOT_CONNECTED; + liblms7_status status; + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC), false); + + vector addrToRead = mRegistersMap->GetUsedAddresses(0); + vector dataReceived; + dataReceived.resize(addrToRead.size(), 0); + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); + if (status != LIBLMS7_SUCCESS) + return status; + + for (uint16_t i = 0; i < addrToRead.size(); ++i) + { + uint16_t adr = addrToRead[i]; + uint16_t val = dataReceived[i]; + mRegistersMap->SetValue(0, addrToRead[i], dataReceived[i]); + } + + addrToRead.clear(); //add only B channel addresses + addrToRead = mRegistersMap->GetUsedAddresses(1); + dataReceived.resize(addrToRead.size(), 0); + + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); + if (status != LIBLMS7_SUCCESS) + return status; + for (uint16_t i = 0; i < addrToRead.size(); ++i) + mRegistersMap->SetValue(1, addrToRead[i], dataReceived[i]); + + Modify_SPI_Reg_bits(LMS7param(MAC), ch); //retore previously used channel + + //in case of Novena board, update GPIO + if(controlPort->GetInfo().device == LMS_DEV_NOVENA) + { + uint16_t regValue = SPI_read(0x0706) & 0xFFF8; + //lms_gpio2 - tx output selection: + // 0 - TX1_A and TX1_B (Band 1), + // 1 - TX2_A and TX2_B (Band 2) + regValue |= Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)) << 2; //gpio2 + //RX active paths + //lms_gpio0 | lms_gpio1 RX_A RX_B + // 0 0 => no active path + // 1 0 => LNAW_A LNAW_B + // 0 1 => LNAH_A LNAH_B + // 1 1 => LNAL_A LNAL_B + switch(Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE))) + { + //set gpio1:gpio0 + case 0: regValue |= 0x0; break; + case 1: regValue |= 0x2; break; + case 2: regValue |= 0x3; break; + case 3: regValue |= 0x1; break; + } + SPI_write(0x0706, regValue); + } + + return LIBLMS7_SUCCESS; +} + +/** @brief Configures interfaces for desired frequency + Sets interpolation and decimation, changes MCLK sources and TSP clock dividers accordingly to selected interpolation and decimation +*/ +liblms7_status LMS7002M::SetInterfaceFrequency(float_type cgen_freq_MHz, const uint8_t interpolation, const uint8_t decimation) +{ + Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), decimation); + Modify_SPI_Reg_bits(LMS7param(HBI_OVR_TXTSP), interpolation); + liblms7_status status = SetFrequencyCGEN(cgen_freq_MHz); + if (status != LIBLMS7_SUCCESS) + return status; + + if (decimation == 7 || decimation == 0) //bypass + { + Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), 0); + Modify_SPI_Reg_bits(LMS7param(RXDIVEN), false); + Modify_SPI_Reg_bits(LMS7param(MCLK2SRC), 3); + } + else + { + uint8_t divider = (uint8_t)pow(2.0, decimation); + if (divider > 1) + Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), (divider / 2) - 1); + else + Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), 0); + Modify_SPI_Reg_bits(LMS7param(RXDIVEN), true); + Modify_SPI_Reg_bits(LMS7param(MCLK2SRC), 1); + } + if (interpolation == 7 || interpolation == 0) //bypass + { + Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), 0); + Modify_SPI_Reg_bits(LMS7param(TXDIVEN), false); + Modify_SPI_Reg_bits(LMS7param(MCLK1SRC), 2); + } + else + { + uint8_t divider = (uint8_t)pow(2.0, interpolation); + if (divider > 1) + Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), (divider / 2) - 1); + else + Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), 0); + Modify_SPI_Reg_bits(LMS7param(TXDIVEN), true); + Modify_SPI_Reg_bits(LMS7param(MCLK1SRC), 0); + } + return status; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h new file mode 100644 index 0000000000..81234c28a3 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h @@ -0,0 +1,177 @@ +/** +@file LMS7002M.h +@author Lime Microsystems (www.limemicro.com) +@brief LMS7002M transceiver configuration interface +*/ + +#ifndef LMS7API_H +#define LMS7API_H + +#include "LMS7002M_statuses.h" +#include "LMS7002M_parameters.h" +#include "typedefs.h" + +#include + +class LMScomms; +class LMS7002M_RegistersMap; + +class LMS7002M +{ +public: + enum + { + Rx, Tx + }; + + LMS7002M(); + LMS7002M(LMScomms* controlPort); + virtual ~LMS7002M(); + + ///@name Registers writing and reading + liblms7_status UploadAll(); + liblms7_status DownloadAll(); + bool IsSynced(); + + liblms7_status ResetChip(); + liblms7_status LoadConfig(const char* filename); + liblms7_status SaveConfig(const char* filename); + ///@} + + ///@name Registers writing and reading + uint16_t Get_SPI_Reg_bits(const LMS7Parameter ¶m, bool fromChip = true); + uint16_t Get_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, bool fromChip = true); + liblms7_status Modify_SPI_Reg_bits(const LMS7Parameter ¶m, const uint16_t value, bool fromChip = true); + liblms7_status Modify_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, uint16_t value, bool fromChip = true); + liblms7_status SPI_write(uint16_t address, uint16_t data); + uint16_t SPI_read(uint16_t address, bool fromChip = true, liblms7_status *status = 0); + liblms7_status RegistersTest(); + ///@} + + ///@name Transmitter, Receiver calibrations + liblms7_status CalibrateRx(float_type bandwidth_MHz); + liblms7_status CalibrateTx(float_type bandwidth_MHz); + ///@} + + ///@name Filters tuning + enum TxFilter + { + TX_LADDER, TX_REALPOLE, TX_HIGHBAND + }; + enum RxFilter + { + RX_TIA, RX_LPF_LOWBAND, RX_LPF_HIGHBAND + }; + liblms7_status TuneTxFilter(TxFilter filterType, float_type bandwidth_MHz); + liblms7_status TuneTxFilterLowBandChain(float_type ladder_bw_MHz, float_type realpole_bw_MHz); + liblms7_status TuneRxFilter(RxFilter filterType, float_type bandwidth_MHz); + ///@} + + ///@name CGEN and PLL + float_type GetReferenceClk_SX(bool tx); + float_type GetFrequencyCGEN_MHz(); + liblms7_status SetFrequencyCGEN(float_type freq_MHz); + float_type GetFrequencySX_MHz(bool tx, float_type refClk_MHz); + liblms7_status SetFrequencySX(bool tx, float_type freq_MHz, float_type refClk_MHz); + ///VCO modules available for tuning + enum VCO_Module + { + VCO_CGEN, VCO_SXR, VCO_SXT + }; + liblms7_status TuneVCO(VCO_Module module); + ///@} + + ///@name TSP + liblms7_status LoadDC_REG_IQ(bool tx, int16_t I, int16_t Q); + liblms7_status SetNCOFrequency(bool tx, uint8_t index, float_type freq_MHz); + float_type GetNCOFrequency_MHz(bool tx, uint8_t index, float_type refClk_MHz, bool fromChip = true); + liblms7_status SetNCOPhaseOffsetForMode0(bool tx, float_type angle_Deg); + liblms7_status SetNCOPhaseOffset(bool tx, uint8_t index, float_type angle_Deg); + float_type GetNCOPhaseOffset_Deg(bool tx, uint8_t index); + liblms7_status SetGFIRCoefficients(bool tx, uint8_t GFIR_index, const int16_t *coef, uint8_t coefCount); + liblms7_status GetGFIRCoefficients(bool tx, uint8_t GFIR_index, int16_t *coef, uint8_t coefCount); + float_type GetReferenceClk_TSP_MHz(bool tx); + ///@} + + liblms7_status SetInterfaceFrequency(float_type cgen_freq_MHz, const uint8_t interpolation, const uint8_t decimation); + + ///enumeration to indicate module registers intervals + enum MemorySection + { + LimeLight = 0, EN_DIR, AFE, BIAS, XBUF, CGEN, LDO, BIST, CDS, + TRF, TBB, RFE, RBB, SX, TxTSP, + TxNCO, TxGFIR1, TxGFIR2, TxGFIR3a, TxGFIR3b, TxGFIR3c, + RxTSP, RxNCO, RxGFIR1, RxGFIR2, RxGFIR3a, RxGFIR3b, RxGFIR3c, + MEMORY_SECTIONS_COUNT + }; + virtual liblms7_status SetDefaults(MemorySection module); + LMScomms* GetControlPort() const { return controlPort;}; + + static const float_type gLadder_lower_limit; + static const float_type gLadder_higher_limit; + static const float_type gRealpole_lower_limit; + static const float_type gRealpole_higher_limit; + static const float_type gHighband_lower_limit; + static const float_type gHighband_higher_limit; + + static const float_type gRxTIA_higher_limit; + static const float_type gRxTIA_lower_limit_g1; + static const float_type gRxTIA_lower_limit_g23; + static const float_type gRxLPF_low_lower_limit; + static const float_type gRxLPF_low_higher_limit; + static const float_type gRxLPF_high_lower_limit; + static const float_type gRxLPF_high_higher_limit; + + static float_type gVCO_frequency_table[3][2]; + static float_type gCGEN_VCO_frequencies[2]; + + //protected: + LMS7002M_RegistersMap *mRegistersMap; + static const uint16_t readOnlyRegisters[]; + static const uint16_t readOnlyRegistersMasks[]; + + uint16_t MemorySectionAddresses[MEMORY_SECTIONS_COUNT][2]; + ///@name Algorithms functions + void BackupAllRegisters(); + void RestoreAllRegisters(); + uint32_t GetRSSI(); + void SetRxDCOFF(int8_t offsetI, int8_t offsetQ); + uint32_t FindMinRSSI_Gain(const LMS7Parameter ¶m, uint16_t *foundValue); + uint32_t FindMinRSSI(const LMS7Parameter ¶m, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult = 1); + uint32_t FindMinRSSI(const uint16_t addr, const uint8_t msb, const uint8_t lsb, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult = 1); + void CalibrateRxDC_RSSI(); + liblms7_status CalibrateTxSetup(float_type bandwidth_MHz); + liblms7_status CalibrateRxSetup(float_type bandwidth_MHz); + liblms7_status FixRXSaturation(); + void FilterTuning_AdjustGains(); + liblms7_status TuneTxFilterSetup(TxFilter type, float_type cutoff_MHz); + liblms7_status TuneRxFilterSetup(RxFilter type, float_type cutoff_MHz); + liblms7_status RFE_TIA_Calibration(float_type TIA_freq_MHz); + liblms7_status RxLPFLow_Calibration(float_type RxLPFL_freq_MHz); + liblms7_status RxLPFHigh_Calibration(float_type RxLPFH_freq_MHz); + + liblms7_status RegistersTestInterval(uint16_t startAddr, uint16_t endAddr, uint16_t pattern, std::stringstream &ss); + liblms7_status SPI_write_batch(const uint16_t* spiAddr, const uint16_t* spiData, uint16_t cnt); + liblms7_status SPI_read_batch(const uint16_t* spiAddr, uint16_t* spiData, uint16_t cnt); + liblms7_status Modify_SPI_Reg_mask(const uint16_t *addr, const uint16_t *masks, const uint16_t *values, uint8_t start, uint8_t stop); + ///@} + ///Reference clock used for Receiver frequency calculations + float_type mRefClkSXR_MHz; + ///Reference clock used for Transmitter frequency calculations + float_type mRefClkSXT_MHz; + + enum LogType + { + LOG_INFO, + LOG_WARNING, + LOG_ERROR, + LOG_DATA + }; + virtual void Log(const char* text, LogType type); + + ///port used for communicating with LMS7002M + LMScomms* controlPort; + + liblms7_status LoadConfigLegacyFile(const char* filename); +}; +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp new file mode 100644 index 0000000000..8c870ffcc0 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp @@ -0,0 +1,68 @@ +#include "LMS7002M_RegistersMap.h" +#include "LMS7002M_parameters.h" + +LMS7002M_RegistersMap::LMS7002M_RegistersMap() +{ + +} + +LMS7002M_RegistersMap::~LMS7002M_RegistersMap() +{ + +} + +uint16_t LMS7002M_RegistersMap::GetDefaultValue(uint16_t address) const +{ + std::map::const_iterator iter = mChannelA.find(address); + if( iter != mChannelA.end()) + return iter->second.defaultValue; + else + return 0; +} + +void LMS7002M_RegistersMap::InitializeDefaultValues(const std::vector parameterList) +{ + for(auto parameter : parameterList) + { + uint16_t regValue = mChannelA[parameter->address].defaultValue; + mChannelA[parameter->address].defaultValue = regValue | (parameter->defaultValue << parameter->lsb); + mChannelA[parameter->address].value = mChannelA[parameter->address].defaultValue; + if(parameter->address >= 0x0100) + mChannelB[parameter->address].value = mChannelA[parameter->address].value; + } +} + +void LMS7002M_RegistersMap::SetValue(uint8_t channel, const uint16_t address, const uint16_t value) +{ + if(channel == 0) + mChannelA[address].value = value; + else if(channel == 1) + mChannelB[address].value = value; +} + +uint16_t LMS7002M_RegistersMap::GetValue(uint8_t channel, uint16_t address) const +{ + const std::map *regMap; + if(channel == 0) + regMap = &mChannelA; + else if(channel == 1) + regMap = &mChannelB; + std::map::const_iterator iter; + iter = regMap->find(address); + if (iter != regMap->end()) + return iter->second.value; + else + return 0; +} + +std::vector LMS7002M_RegistersMap::GetUsedAddresses(const uint8_t channel) const +{ + std::vector addresses; + if(channel == 0) + for(auto iter : mChannelA) + addresses.push_back(iter.first); + else if(channel == 1) + for(auto iter : mChannelB) + addresses.push_back(iter.first); + return addresses; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h new file mode 100644 index 0000000000..5ccda752db --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h @@ -0,0 +1,35 @@ +#ifndef LMS7002M_REGISTERS_MAP_H +#define LMS7002M_REGISTERS_MAP_H + +#include +#include +#include + +struct LMS7Parameter; + +class LMS7002M_RegistersMap +{ +public: + struct Register + { + uint16_t value; + uint16_t defaultValue; + uint16_t mask; + }; + + LMS7002M_RegistersMap(); + ~LMS7002M_RegistersMap(); + + uint16_t GetValue(uint8_t channel, uint16_t address) const; + void SetValue(uint8_t channel, const uint16_t address, const uint16_t value); + + void InitializeDefaultValues(const std::vector parameterList); + uint16_t GetDefaultValue(uint16_t address) const; + std::vector GetUsedAddresses(const uint8_t channel) const; + +protected: + std::map mChannelA; + std::map mChannelB; +}; + +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp new file mode 100644 index 0000000000..2f3d38c1b5 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp @@ -0,0 +1,861 @@ +/** +@file LMS7002M_filtersCalibration.cpp +@author Lime Microsystems (www.limemicro.com) +@brief Implementation of LMS7002M transceiver filters calibration algorithms +*/ + +#include "LMS7002M.h" +#include + +///define for parameter enumeration if prefix might be needed +#define LMS7param(id) id + +const float_type LMS7002M::gLadder_lower_limit = 2; +const float_type LMS7002M::gLadder_higher_limit = 16; +const float_type LMS7002M::gRealpole_lower_limit = 0.8; +const float_type LMS7002M::gRealpole_higher_limit = 3.2; +const float_type LMS7002M::gHighband_lower_limit = 28; +const float_type LMS7002M::gHighband_higher_limit = 70; + +const float_type LMS7002M::gRxTIA_higher_limit = 60; +const float_type LMS7002M::gRxTIA_lower_limit_g1 = 1.5; +const float_type LMS7002M::gRxTIA_lower_limit_g23 = 0.5; +const float_type LMS7002M::gRxLPF_low_lower_limit = 1; +const float_type LMS7002M::gRxLPF_low_higher_limit = 20; +const float_type LMS7002M::gRxLPF_high_lower_limit = 20; +const float_type LMS7002M::gRxLPF_high_higher_limit = 70; + +liblms7_status LMS7002M::TuneTxFilterSetup(LMS7002M::TxFilter type, float_type cutoff_MHz) +{ + Modify_SPI_Reg_bits(LMS7param(EN_G_RFE), 0); + Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); + + //RBB + SetDefaults(RBB); + Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 1); + Modify_SPI_Reg_bits(LMS7param(INPUT_CTL_PGA_RBB), 3); + Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), 20); + Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), 20); + Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), 3); + + //TBB + SetDefaults(TBB); + Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 1); + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); + + //AFE + uint8_t isel_dac_afe = (uint8_t)Get_SPI_Reg_bits(0x0082, 15, 13); + SetDefaults(AFE); + if (Get_SPI_Reg_bits(LMS7param(MAC)) == 2) + { + Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); //PD_RX_AFE2 0 + Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2 0 + } + Modify_SPI_Reg_bits(0x0082, 15, 13, isel_dac_afe); + + //BIAS + uint8_t rpcalib_bias = (uint8_t)Get_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS)); + SetDefaults(BIAS); + Modify_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS), rpcalib_bias); + + //XBUF + Modify_SPI_Reg_bits(LMS7param(PD_XBUF_RX), 0); + Modify_SPI_Reg_bits(LMS7param(PD_XBUF_TX), 0); + Modify_SPI_Reg_bits(LMS7param(EN_G_XBUF), 1); + + //CGEN + SetDefaults(CGEN); + + //txtsp + SetDefaults(TxTSP); + Modify_SPI_Reg_bits(LMS7param(TSGMODE_TXTSP), 1); + Modify_SPI_Reg_bits(LMS7param(INSEL_TXTSP), 1); + Modify_SPI_Reg_bits(0x0208, 6, 4, 7); + LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); + float_type txNCOfreq = 0.05; + SetNCOFrequency(Tx, 0, txNCOfreq); + + //rxtsp + SetDefaults(RxTSP); + SetNCOFrequency(Rx, 0, txNCOfreq - 1); + + Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); + Modify_SPI_Reg_bits(0x040C, 6, 3, 0x07); + + Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 7); + Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1); + + return LIBLMS7_SUCCESS; +} + + +liblms7_status LMS7002M::TuneTxFilter(LMS7002M::TxFilter type, float_type cutoff_MHz) +{ + liblms7_status status; + float_type lowLimit = 0; + float_type highLimit = 1000; + uint32_t rssi = 0; + int8_t dir; + uint8_t ccal_lpflad_tbb; + uint32_t rssi_value_100k; + int16_t rcal; + + float_type ncoFreq = 0.05; + float_type cgenFreq; + uint8_t loopb_tbb; + uint8_t cg_iamp_tbb = 1; + uint8_t bypladder_tbb; + uint8_t pd_lpfh_tbb; + uint8_t pd_lpflad_tbb; + uint8_t pd_lpfs5; + uint8_t en_g_tbb = 1; + uint8_t pd_iamp_tbb = 0; + uint8_t tstin_tbb = 0; + + BackupAllRegisters(); + //float_type userCLKGENfreq = GetFrequencyCGEN_MHz(); + + status = TuneTxFilterSetup(type, cutoff_MHz); + if (status != LIBLMS7_SUCCESS) + goto TxFilterTuneEnd; + cgenFreq = cutoff_MHz * 20; + if (cgenFreq < 60) + cgenFreq = 60; + if (cgenFreq > 640) + cgenFreq = 640; + if (type == TX_LADDER) + { + loopb_tbb = 2; + bypladder_tbb = 0; + pd_lpfh_tbb = 1; + pd_lpflad_tbb = 0; + pd_lpfs5 = 1; + lowLimit = gLadder_lower_limit; + highLimit = gLadder_higher_limit; + } + else if (type == TX_REALPOLE) + { + loopb_tbb = 3; + bypladder_tbb = 1; + pd_lpfh_tbb = 1; + pd_lpflad_tbb = 1; + pd_lpfs5 = 0; + lowLimit = gRealpole_lower_limit; + highLimit = gRealpole_higher_limit; + } + else if (type == TX_HIGHBAND) + { + loopb_tbb = 3; + bypladder_tbb = 0; + pd_lpfh_tbb = 0; + pd_lpflad_tbb = 1; + pd_lpfs5 = 1; + lowLimit = gHighband_lower_limit; + highLimit = gHighband_higher_limit; + } + if (cutoff_MHz == cgenFreq / 16) + cgenFreq -= 10; + + if (cutoff_MHz < lowLimit || cutoff_MHz > highLimit) + { + status = LIBLMS7_FREQUENCY_OUT_OF_RANGE; + goto TxFilterTuneEnd; + } + + status = SetFrequencyCGEN(cgenFreq); + if (status != LIBLMS7_SUCCESS) + goto TxFilterTuneEnd; + + Modify_SPI_Reg_bits(LMS7param(LOOPB_TBB), loopb_tbb); + Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), cg_iamp_tbb); + Modify_SPI_Reg_bits(LMS7param(BYPLADDER_TBB), bypladder_tbb); + Modify_SPI_Reg_bits(LMS7param(TSTIN_TBB), tstin_tbb); + Modify_SPI_Reg_bits(LMS7param(PD_LPFH_TBB), pd_lpfh_tbb); + Modify_SPI_Reg_bits(LMS7param(PD_LPFIAMP_TBB), pd_iamp_tbb); + Modify_SPI_Reg_bits(LMS7param(PD_LPFLAD_TBB), pd_lpflad_tbb); + Modify_SPI_Reg_bits(LMS7param(PD_LPFS5_TBB), pd_lpfs5); + Modify_SPI_Reg_bits(LMS7param(EN_G_TBB), en_g_tbb); + + //B + //LADDER coefficients + float_type p1, p2, p3, p4, p5; + switch (type) + { + case TX_LADDER: + p1 = 1.29858903647958E-16; + p2 = -0.000110746929967704; + p3 = 0.00277593485991029; + p4 = 21.0384293169607; + p5 = -48.4092606238297; + break; + case TX_REALPOLE: + p1 = 1.93821841029921E-15; + p2 = -0.0429694461214244; + p3 = 0.253501254059498; + p4 = 88.9545445989649; + p5 = -48.0847491316861; + break; + case TX_HIGHBAND: + p1 = 1.10383E-06; + p2 = -0.0002108; + p3 = 0.019049487; + p4 = 1.433174459; + p5 = -47.69507793; + break; + } + rcal = (int16_t)(pow(cutoff_MHz, 4)*p1 + pow(cutoff_MHz, 3)*p2 + pow(cutoff_MHz, 2)*p3 + cutoff_MHz * p4 + p5); + if (rcal < 0) + rcal = 0; + if (rcal > 255) + rcal = 255; + + if (type == TX_REALPOLE) + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); + else if (type == TX_LADDER) + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), rcal); + else if (type == TX_HIGHBAND) + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), rcal); + + FilterTuning_AdjustGains(); + + rssi_value_100k = (uint32_t)( GetRSSI()*0.707 ); + + SetNCOFrequency(Tx, 0, cutoff_MHz); + SetNCOFrequency(Rx, 0, cutoff_MHz - 1); + + for (ccal_lpflad_tbb = 31; ccal_lpflad_tbb > 0; --ccal_lpflad_tbb) + { + Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ccal_lpflad_tbb); + rssi = GetRSSI(); + if (rssi > rssi_value_100k && ccal_lpflad_tbb == 31) + break; //skip this search, continue to advanced search + if (rssi > rssi_value_100k) + { + status = LIBLMS7_SUCCESS; + goto TxFilterTuneEnd; //found correct value + } + } + + + //advanced search for c and r values + status = LIBLMS7_FAILURE; + dir = ccal_lpflad_tbb == 31 ? -1 : 1; + while (rcal > 0 && rcal < 255) + { + rcal += 5 * dir; + if (rcal < 0 && rcal > 255) + break; + if (type == TX_REALPOLE) + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); + else if (type == TX_LADDER) + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), rcal); + else if (type == TX_HIGHBAND) + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), rcal); + SetNCOFrequency(Tx, 0, ncoFreq); + SetNCOFrequency(Rx, 0, ncoFreq - 1); + Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), 16); + rssi_value_100k = GetRSSI(); + SetNCOFrequency(Tx, 0, cutoff_MHz); + SetNCOFrequency(Rx, 0, cutoff_MHz - 1); + for (ccal_lpflad_tbb = 31; ccal_lpflad_tbb > 0; --ccal_lpflad_tbb) + { + Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ccal_lpflad_tbb); + rssi = GetRSSI(); + if (rssi > rssi_value_100k*0.707 && ccal_lpflad_tbb == 31) + break; //skip c search, need to change r value + if (rssi > rssi_value_100k*0.707) + { + status = LIBLMS7_SUCCESS; + goto TxFilterTuneEnd; + } + } + } + + //end +TxFilterTuneEnd: + RestoreAllRegisters(); + if (status != LIBLMS7_SUCCESS) + return status; + Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ccal_lpflad_tbb); + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); + + if (type == TX_REALPOLE) + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); + else if (type == TX_LADDER) + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), rcal); + else if (type == TX_HIGHBAND) + { + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), rcal); + Modify_SPI_Reg_bits(0x0105, 4, 0, 0x7); //set powerdowns + } + return LIBLMS7_SUCCESS; +} + +void LMS7002M::FilterTuning_AdjustGains() +{ + uint8_t cg_iamp_tbb; + uint32_t rssi = 0; + const uint32_t rssi_required = 0x8400; + uint8_t g_pga_rbb = (uint8_t)Get_SPI_Reg_bits(LMS7param(G_PGA_RBB)); + + while (g_pga_rbb < 31) + { + cg_iamp_tbb = 0; + while (cg_iamp_tbb < 63 && rssi < rssi_required) + { + Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), cg_iamp_tbb); + rssi = GetRSSI(); + if (rssi > rssi_required) + return; + ++cg_iamp_tbb; + } + g_pga_rbb += 6; + if (g_pga_rbb > 31) + g_pga_rbb = 31; + Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB), g_pga_rbb); + } +} + +liblms7_status LMS7002M::TuneTxFilterLowBandChain(float_type bandwidth, float_type realpole_MHz) +{ + uint32_t rssi; + uint32_t rssi_value_10k; + bool prevRSSIbigger; + int16_t rcal; + float_type p1,p2,p3,p4,p5; + float_type ncoFreq = 0.05; + float_type cgenFreq; + BackupAllRegisters(); + + liblms7_status status = TuneTxFilter(TX_LADDER, bandwidth); + uint8_t ladder_c_value = (uint8_t)Get_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB)); + uint8_t ladder_r_value = (uint8_t)Get_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB)); + status = TuneTxFilterSetup(TX_LADDER, bandwidth); + + if (bandwidth < gLadder_lower_limit || bandwidth > gLadder_higher_limit) + { + status = LIBLMS7_FREQUENCY_OUT_OF_RANGE; + goto TxFilterLowBandChainEnd; + } + + //realpole calibration + //float userCLKGENfreq = GetFrequencyCGEN(); + + cgenFreq = realpole_MHz * 20; + if (cgenFreq < 60) + cgenFreq = 60; + if (cgenFreq > 640) + cgenFreq = 640; + + if (realpole_MHz < gRealpole_lower_limit || realpole_MHz > gRealpole_higher_limit) + { + status = LIBLMS7_FREQUENCY_OUT_OF_RANGE; + goto TxFilterLowBandChainEnd; + } + + status = SetFrequencyCGEN(cgenFreq); + if (status != LIBLMS7_SUCCESS) + goto TxFilterLowBandChainEnd; + + Modify_SPI_Reg_bits(LMS7param(LOOPB_TBB), 3); + Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 1); + Modify_SPI_Reg_bits(LMS7param(BYPLADDER_TBB), 1); + Modify_SPI_Reg_bits(LMS7param(TSTIN_TBB), 0); + Modify_SPI_Reg_bits(LMS7param(PD_LPFH_TBB), 1); + Modify_SPI_Reg_bits(LMS7param(PD_LPFIAMP_TBB), 0); + Modify_SPI_Reg_bits(LMS7param(PD_LPFLAD_TBB), 1); + Modify_SPI_Reg_bits(LMS7param(PD_LPFS5_TBB), 0); + Modify_SPI_Reg_bits(LMS7param(EN_G_TBB), 1); + + //B + p1 = 1.93821841029921E-15; + p2 = -0.0429694461214244; + p3 = 0.253501254059498; + p4 = 88.9545445989649; + p5 = -48.0847491316861; + rcal = (int16_t)(pow(realpole_MHz, 4)*p1 + pow(realpole_MHz, 3)*p2 + pow(realpole_MHz, 2)*p3 + realpole_MHz * p4 + p5); + if (rcal < 0) + rcal = 0; + if (rcal > 255) + rcal = 255; + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); + + FilterTuning_AdjustGains(); + + rssi_value_10k = GetRSSI(); + SetNCOFrequency(Tx, 0, realpole_MHz); + SetNCOFrequency(Rx, 0, realpole_MHz - 1); + + prevRSSIbigger = GetRSSI() > rssi_value_10k*0.707; + status = LIBLMS7_FAILURE; //assuming r value is not found + while (rcal >= 0 && rcal < 256) + { + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); + SetNCOFrequency(Tx, 0, ncoFreq); + SetNCOFrequency(Rx, 0, ncoFreq - 1); + rssi_value_10k = (uint32_t)( GetRSSI()*0.707 ); + + SetNCOFrequency(Tx, 0, realpole_MHz); + SetNCOFrequency(Rx, 0, realpole_MHz - 1); + + rssi = GetRSSI(); + if (rssi > rssi_value_10k) + --rcal; + else + { + if (prevRSSIbigger) + { + --rcal; + status = LIBLMS7_SUCCESS; + goto TxFilterLowBandChainEnd; + } + ++rcal; + } + prevRSSIbigger = rssi > rssi_value_10k; + } + + //end +TxFilterLowBandChainEnd: + RestoreAllRegisters(); + if (status != LIBLMS7_SUCCESS) + return status; + + Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ladder_c_value); + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), ladder_r_value); + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); + Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); + Modify_SPI_Reg_bits(0x0105, 4, 0, 0x11); //set powerdowns + + return LIBLMS7_SUCCESS; +} + +liblms7_status LMS7002M::TuneRxFilter(RxFilter filter, float_type bandwidth_MHz) +{ + liblms7_status status; + uint16_t cfb_tia_rfe; + uint16_t c_ctl_lpfl_rbb; + uint8_t ccomp_tia_rfe; + uint8_t rcomp_tia_rfe; + uint8_t c_ctl_lpfh_rbb; + uint8_t ict_pga_out; + uint8_t ict_pga_in; + uint8_t r_ctl_lpf_rbb; + uint8_t c_ctl_pga_rbb; + uint8_t rcc_ctl_lpfl_rbb; + uint8_t rcc_ctl_lpfh_rbb; + float_type lowerLimit; + float_type higherLimit; + if (filter == RX_TIA) + { + lowerLimit = Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)) == 1 ? gRxTIA_lower_limit_g1 : gRxTIA_lower_limit_g23; + higherLimit = gRxTIA_higher_limit; + } + else if (filter == RX_LPF_LOWBAND) + { + lowerLimit = gRxLPF_low_lower_limit; + higherLimit = gRxLPF_low_higher_limit; + } + else if (filter == RX_LPF_HIGHBAND) + { + lowerLimit = gRxLPF_high_lower_limit; + higherLimit = gRxLPF_high_higher_limit; + } + if (bandwidth_MHz < lowerLimit || bandwidth_MHz > higherLimit) + return LIBLMS7_FREQUENCY_OUT_OF_RANGE; + + BackupAllRegisters(); + + status = TuneRxFilterSetup(filter, bandwidth_MHz); + if (status != LIBLMS7_SUCCESS) + goto RxFilterTuneEnd; + + if (filter == RX_TIA) + status = RFE_TIA_Calibration(bandwidth_MHz); + else if (filter == RX_LPF_LOWBAND) + status = RxLPFLow_Calibration(bandwidth_MHz); + else if (filter == RX_LPF_HIGHBAND) + status = RxLPFHigh_Calibration(bandwidth_MHz); + + cfb_tia_rfe = Get_SPI_Reg_bits(LMS7param(CFB_TIA_RFE)); + c_ctl_lpfl_rbb = Get_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB)); + ccomp_tia_rfe = (int8_t)Get_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE)); + rcomp_tia_rfe = (int8_t)Get_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE)); + c_ctl_lpfh_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB)); + ict_pga_out = (int8_t)Get_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB)); + ict_pga_in = (int8_t)Get_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB)); + r_ctl_lpf_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(R_CTL_LPF_RBB)); + c_ctl_pga_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB)); + rcc_ctl_lpfl_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB)); + rcc_ctl_lpfh_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(RCC_CTL_LPFH_RBB)); + +RxFilterTuneEnd: + RestoreAllRegisters(); + if (status != LIBLMS7_SUCCESS) + return status; + + if (filter == RX_TIA) + { + Modify_SPI_Reg_bits(LMS7param(ICT_TIAMAIN_RFE), 2); + Modify_SPI_Reg_bits(LMS7param(ICT_TIAOUT_RFE), 2); + Modify_SPI_Reg_bits(LMS7param(RFB_TIA_RFE), 16); + Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), cfb_tia_rfe); + Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), ccomp_tia_rfe); + Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), rcomp_tia_rfe); + Modify_SPI_Reg_bits(0x010c, 1, 0, 0x1); + } + else if (filter == RX_LPF_LOWBAND) + { + Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), rcc_ctl_lpfl_rbb); + Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), c_ctl_lpfl_rbb); + Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), ict_pga_out); + Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), ict_pga_in); + Modify_SPI_Reg_bits(LMS7param(R_CTL_LPF_RBB), r_ctl_lpf_rbb); + Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), c_ctl_pga_rbb); + Modify_SPI_Reg_bits(0x0115, 3, 0, 0x9); + Modify_SPI_Reg_bits(0x0118, 15, 13, 0x1); + } + else if (filter == RX_LPF_HIGHBAND) + { + Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFH_RBB), rcc_ctl_lpfh_rbb); + Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB), c_ctl_lpfh_rbb); + Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), ict_pga_out); + Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), ict_pga_in); + Modify_SPI_Reg_bits(LMS7param(R_CTL_LPF_RBB), r_ctl_lpf_rbb); + Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), c_ctl_pga_rbb); + Modify_SPI_Reg_bits(0x0115, 3, 0, 0x5); + Modify_SPI_Reg_bits(0x0118, 15, 13, 0x0); + } + return LIBLMS7_SUCCESS; +} + +liblms7_status LMS7002M::TuneRxFilterSetup(RxFilter type, float_type cutoff_MHz) +{ + liblms7_status status; + uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); + + //RFE + uint8_t g_tia_rfe = (uint8_t)Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)); + SetDefaults(RFE); + Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 2); + + if (ch == 2) + Modify_SPI_Reg_bits(LMS7param(EN_NEXTRX_RFE), 1); + else + Modify_SPI_Reg_bits(LMS7param(EN_NEXTRX_RFE), 0); + + Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 8); + Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); + Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); + Modify_SPI_Reg_bits(LMS7param(PD_MXLOBUF_RFE), 0); + Modify_SPI_Reg_bits(LMS7param(PD_QGEN_RFE), 0); + Modify_SPI_Reg_bits(LMS7param(ICT_TIAMAIN_RFE), 2); + Modify_SPI_Reg_bits(LMS7param(ICT_TIAOUT_RFE), 2); + Modify_SPI_Reg_bits(LMS7param(RFB_TIA_RFE), 16); + Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE), g_tia_rfe); + + //RBB + SetDefaults(RBB); + Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), 20); + Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), 20); + Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), 3); + + //TRF + SetDefaults(TRF); + Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); + Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); + if (ch == 2) + Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); + else + Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 0); + Modify_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF), 0); + Modify_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF), 1); + + //TBB + SetDefaults(TBB); + Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 1); + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); + Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); + + //AFE + SetDefaults(AFE); + if (ch == 2) + { + Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); + Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); + } + //BIAS + uint8_t rp_calib_bias = (uint8_t)Get_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS)); + SetDefaults(BIAS); + Modify_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS), rp_calib_bias); + + //XBUF + Modify_SPI_Reg_bits(LMS7param(PD_XBUF_RX), 0); + Modify_SPI_Reg_bits(LMS7param(PD_XBUF_TX), 0); + Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 1); + + //CLKGEN + SetDefaults(CGEN); + + //SXR + Modify_SPI_Reg_bits(LMS7param(MAC), 1); + SetDefaults(SX); + status = SetFrequencySX(Rx, 499.95, mRefClkSXR_MHz); + if (status != LIBLMS7_SUCCESS) + return status; + Modify_SPI_Reg_bits(LMS7param(PD_VCO), 0); + + //SXT + Modify_SPI_Reg_bits(LMS7param(MAC), 2); + SetDefaults(SX); + status = SetFrequencySX(Tx, 500, mRefClkSXT_MHz); + if (status != LIBLMS7_SUCCESS) + return status; + Modify_SPI_Reg_bits(LMS7param(PD_VCO), 0); + + Modify_SPI_Reg_bits(LMS7param(MAC), ch); + //TxTSP + SetDefaults(TxTSP); + Modify_SPI_Reg_bits(LMS7param(TSGMODE_TXTSP), 1); + Modify_SPI_Reg_bits(LMS7param(INSEL_TXTSP), 1); + Modify_SPI_Reg_bits(0x0208, 8, 8, 1); + Modify_SPI_Reg_bits(0x0208, 6, 4, 0x7); + LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); + SetNCOFrequency(Tx, 0, 0); + + //RxTSP + SetDefaults(RxTSP); + Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); + Modify_SPI_Reg_bits(0x040C, 5, 3, 0x7); + Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 7); + Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1); + + float_type sxtfreq = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz); + float_type sxrfreq = GetFrequencySX_MHz(Rx, mRefClkSXR_MHz); + SetNCOFrequency(Rx, 0, sxtfreq - sxrfreq - 1); + return LIBLMS7_SUCCESS; +} + +liblms7_status LMS7002M::RFE_TIA_Calibration(float_type TIA_freq_MHz) +{ + liblms7_status status; + bool prevRSSIbigger; + uint8_t ccomp_tia_rfe_value; + int16_t rcomp_tia_rfe; + float_type cgenFreq = TIA_freq_MHz * 20; + uint32_t rssi; + uint32_t rssi_value_50k; + //RFE + uint8_t g_tia_rfe = (uint8_t)Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)); + int16_t cfb_tia_rfe_value; + if (g_tia_rfe == 1) + cfb_tia_rfe_value = (uint16_t)(5400 / TIA_freq_MHz - 15); + else if (g_tia_rfe > 1) + cfb_tia_rfe_value = (uint16_t)(1680 / TIA_freq_MHz - 10); + else + return LIBLMS7_FAILURE; + Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), cfb_tia_rfe_value); + + if (g_tia_rfe == 1) + ccomp_tia_rfe_value = (uint8_t)(cfb_tia_rfe_value / 100 + 1); + else if (g_tia_rfe > 1) + ccomp_tia_rfe_value = (uint8_t)(cfb_tia_rfe_value / 100); + else + return LIBLMS7_FAILURE; + if (ccomp_tia_rfe_value > 15) + ccomp_tia_rfe_value = 15; + + Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), ccomp_tia_rfe_value); + + rcomp_tia_rfe = (int16_t)(15 - cfb_tia_rfe_value * 2 / 100); + if (rcomp_tia_rfe < 0) + rcomp_tia_rfe = 0; + Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), rcomp_tia_rfe); + + //RBB + Modify_SPI_Reg_bits(LMS7param(INPUT_CTL_PGA_RBB), 2); + Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 1); + + //CLKGEN + if (cgenFreq < 60) + cgenFreq = 60; + if (cgenFreq > 640) + cgenFreq = 640; + + if (cgenFreq / 16 == TIA_freq_MHz) + status = SetFrequencyCGEN(cgenFreq - 10); + else + status = SetFrequencyCGEN(cgenFreq); + if (status != LIBLMS7_SUCCESS) + return status; + + FilterTuning_AdjustGains(); + + rssi_value_50k = (uint32_t)( GetRSSI() * 0.707 ); + status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - TIA_freq_MHz, mRefClkSXR_MHz); + if (status != LIBLMS7_SUCCESS) + return status; + SetNCOFrequency(Rx, 0, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - GetFrequencySX_MHz(Rx, mRefClkSXR_MHz) - 1); + + prevRSSIbigger = GetRSSI() > rssi_value_50k; + while (cfb_tia_rfe_value >= 0 && cfb_tia_rfe_value < 4096) + { + Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), cfb_tia_rfe_value); + rssi = GetRSSI(); + if (rssi > rssi_value_50k) + ++cfb_tia_rfe_value; + else + { + --cfb_tia_rfe_value; + if (prevRSSIbigger) + return LIBLMS7_SUCCESS; //found correct value + } + prevRSSIbigger = rssi > rssi_value_50k; + } + return LIBLMS7_FAILURE; +} + +liblms7_status LMS7002M::RxLPFLow_Calibration(float_type RxLPFL_freq_MHz) +{ + liblms7_status status; + uint32_t rssi; + uint32_t rssi_value_50k; + int32_t c_ctl_lpfl_rbb; + bool prevRSSIbigger; + float_type cgenFreq_MHz = RxLPFL_freq_MHz * 20; + //RFE + Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), 15); + Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), 1); + Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), 15); + Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE), 1); + + //RBB + c_ctl_lpfl_rbb = (int32_t)(2160 / RxLPFL_freq_MHz - 103); + if (c_ctl_lpfl_rbb < 0) + c_ctl_lpfl_rbb = 0; + if (c_ctl_lpfl_rbb > 2047) + c_ctl_lpfl_rbb = 2047; + Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), c_ctl_lpfl_rbb); + + if (RxLPFL_freq_MHz >= 15) + Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 5); + else if (RxLPFL_freq_MHz >= 10) + Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 4); + else if (RxLPFL_freq_MHz >= 5) + Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 3); + else if (RxLPFL_freq_MHz >= 3) + Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 2); + else if (RxLPFL_freq_MHz >= 1.4) + Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 1); + else + Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 0); + + //CLKGEN + if (cgenFreq_MHz < 60) + cgenFreq_MHz = 60; + if (cgenFreq_MHz > 640) + cgenFreq_MHz = 640; + if (cgenFreq_MHz / 16 == RxLPFL_freq_MHz) + status = SetFrequencyCGEN(cgenFreq_MHz - 10); + else + status = SetFrequencyCGEN(cgenFreq_MHz); + if (status != LIBLMS7_SUCCESS) + return status; + + FilterTuning_AdjustGains(); + + rssi_value_50k = (uint32_t)( GetRSSI() * 0.707 ); + status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - RxLPFL_freq_MHz, mRefClkSXR_MHz); + if (status != LIBLMS7_SUCCESS) + return status; + SetNCOFrequency(Rx, 0, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - GetFrequencySX_MHz(Rx, mRefClkSXR_MHz) - 1); + + prevRSSIbigger = GetRSSI() > rssi_value_50k; + while (c_ctl_lpfl_rbb >= 0 && c_ctl_lpfl_rbb < 2048) + { + Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), c_ctl_lpfl_rbb); + rssi = GetRSSI(); + if (rssi > rssi_value_50k) + ++c_ctl_lpfl_rbb; + else + { + --c_ctl_lpfl_rbb; + if (prevRSSIbigger) + return LIBLMS7_SUCCESS; //found correct value + } + prevRSSIbigger = rssi > rssi_value_50k; + } + return LIBLMS7_FAILURE; +} + +liblms7_status LMS7002M::RxLPFHigh_Calibration(float_type RxLPFH_freq_MHz) +{ + liblms7_status status; + int16_t c_ctl_lpfh_rbb; + int16_t rcc_ctl_lpfh_rbb; + float_type cgenFreq = RxLPFH_freq_MHz * 20; + uint32_t rssi; + uint32_t rssi_value_50k; + bool prevRSSIbigger; + //RFE + Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), 15); + Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), 1); + Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), 15); + Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE), 1); + + //RBB + c_ctl_lpfh_rbb = (int16_t)(6000 / RxLPFH_freq_MHz - 50); + if (c_ctl_lpfh_rbb < 0) + c_ctl_lpfh_rbb = 0; + if (c_ctl_lpfh_rbb > 255) + c_ctl_lpfh_rbb = 255; + Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB), c_ctl_lpfh_rbb); + + rcc_ctl_lpfh_rbb = (int16_t)(RxLPFH_freq_MHz / 10 - 3); + if (rcc_ctl_lpfh_rbb < 0) + rcc_ctl_lpfh_rbb = 0; + Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFH_RBB), rcc_ctl_lpfh_rbb); + + Modify_SPI_Reg_bits(LMS7param(INPUT_CTL_PGA_RBB), 1); + Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 1); + Modify_SPI_Reg_bits(LMS7param(PD_LPFH_RBB), 0); + + //CLKGEN + if (cgenFreq < 60) + cgenFreq = 60; + if (cgenFreq > 640) + cgenFreq = 640; + if (cgenFreq / 16 == RxLPFH_freq_MHz) + status = SetFrequencyCGEN(cgenFreq - 10); + else + status = SetFrequencyCGEN(cgenFreq); + if (status != LIBLMS7_SUCCESS) + return status; + + FilterTuning_AdjustGains(); + + rssi_value_50k = (uint32_t)( GetRSSI() * 0.707); + status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - RxLPFH_freq_MHz, mRefClkSXR_MHz); + if (status != LIBLMS7_SUCCESS) + return status; + SetNCOFrequency(Rx, 0, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - GetFrequencySX_MHz(Rx, mRefClkSXR_MHz) - 1); + + prevRSSIbigger = GetRSSI() > rssi_value_50k; + while (c_ctl_lpfh_rbb >= 0 && c_ctl_lpfh_rbb < 256) + { + Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB), c_ctl_lpfh_rbb); + rssi = GetRSSI(); + if (rssi > rssi_value_50k) + ++c_ctl_lpfh_rbb; + else + { + --c_ctl_lpfh_rbb; + if (prevRSSIbigger) + return LIBLMS7_SUCCESS; //found correct value + } + prevRSSIbigger = rssi > rssi_value_50k; + } + return LIBLMS7_FAILURE; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp new file mode 100644 index 0000000000..b28887d776 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp @@ -0,0 +1,601 @@ +/** +@file LMS7002M_parameters.cpp +@author Lime Microsystems (www.limemicro.com) +@brief Definition of LMS7002M transceiver control parameters registers +*/ + +#include "LMS7002M_parameters.h" + +std::vector LMS7parameterList; + +const struct LMS7Parameter LRST_TX_B = { 0x0020, 15, 15, 1, "LRST_TX_B", "Resets all the logic registers to the default state for Tx MIMO channel B" }; +const struct LMS7Parameter MRST_TX_B = { 0x0020, 14, 14, 1, "MRST_TX_B", "Resets all the configuration memory to the default state for Tx MIMO channel B" }; +const struct LMS7Parameter LRST_TX_A = { 0x0020, 13, 13, 1, "LRST_TX_A", "Resets all the logic registers to the default state for Tx MIMO channel A" }; +const struct LMS7Parameter MRST_TX_A = { 0x0020, 12, 12, 1, "MRST_TX_A", "Resets all the configuration memory to the default state for Tx MIMO channel A" }; +const struct LMS7Parameter LRST_RX_B = { 0x0020, 11, 11, 1, "LRST_RX_B", "Resets all the logic registers to the default state for Rx MIMO channel B" }; +const struct LMS7Parameter MRST_RX_B = { 0x0020, 10, 10, 1, "MRST_RX_B", "Resets all the configuration memory to the default state for Rx MIMO channel B" }; +const struct LMS7Parameter LRST_RX_A = { 0x0020, 9, 9, 1, "LRST_RX_A", "Resets all the logic registers to the default state for Rx MIMO channel A" }; +const struct LMS7Parameter MRST_RX_A = { 0x0020, 8, 8, 1, "MRST_RX_A", "Resets all the configuration memory to the default state for Rx MIMO channel A" }; +const struct LMS7Parameter SRST_RXFIFO = { 0x0020, 7, 7, 1, "SRST_RXFIFO", "RX FIFO soft reset (LimeLight Interface)" }; +const struct LMS7Parameter SRST_TXFIFO = { 0x0020, 6, 6, 1, "SRST_TXFIFO", "TX FIFO soft reset (LimeLight Interface)" }; +const struct LMS7Parameter RXEN_B = { 0x0020, 5, 5, 1, "RXEN_B", "Power control for Rx MIMO channel B" }; +const struct LMS7Parameter RXEN_A = { 0x0020, 4, 4, 1, "RXEN_A", "Power control for Rx MIMO channel A" }; +const struct LMS7Parameter TXEN_B = { 0x0020, 3, 3, 1, "TXEN_B", "Power control for Tx MIMO channel B" }; +const struct LMS7Parameter TXEN_A = { 0x0020, 2, 2, 1, "TXEN_A", "Power control for Tx MIMO channel A" }; +const struct LMS7Parameter MAC = { 0x0020, 1, 0, 3, "MAC", "Selects MIMO channel for communication" }; +const struct LMS7Parameter TX_CLK_PE = { 0x0021, 11, 11, 1, "TX_CLK_PE", "Pull up control of TX_CLK pad" }; +const struct LMS7Parameter RX_CLK_PE = { 0x0021, 10, 10, 1, "RX_CLK_PE", "Pull up control of RX_CLK pad" }; +const struct LMS7Parameter SDA_PE = { 0x0021, 9, 9, 1, "SDA_PE", "Pull up control of SDA pad" }; +const struct LMS7Parameter SDA_DS = { 0x0021, 8, 8, 0, "SDA_DS", "Driver strength of SDA pad" }; +const struct LMS7Parameter SCL_PE = { 0x0021, 7, 7, 1, "SCL_PE", "Pull up control of SCL pad" }; +const struct LMS7Parameter SCL_DS = { 0x0021, 6, 6, 0, "SCL_DS", "Driver strength of SCL pad" }; +const struct LMS7Parameter SDIO_DS = { 0x0021, 5, 5, 0, "SDIO_DS", "Driver strength of SDIO pad" }; +const struct LMS7Parameter SDIO_PE = { 0x0021, 4, 4, 1, "SDIO_PE", "Pull up control of SDIO pad" }; +const struct LMS7Parameter SDO_PE = { 0x0021, 3, 3, 1, "SDO_PE", "Pull up control of SDO pad" }; +const struct LMS7Parameter SCLK_PE = { 0x0021, 2, 2, 1, "SCLK_PE", "Pull up control of SCLK pad" }; +const struct LMS7Parameter SEN_PE = { 0x0021, 1, 1, 1, "SEN_PE", "Pull up control of SEN pad" }; +const struct LMS7Parameter SPIMODE = { 0x0021, 0, 0, 1, "SPIMODE", "SPI communication mode" }; +const struct LMS7Parameter DIQ2_DS = { 0x0022, 11, 11, 0, "DIQ2_DS", "Driver strength of DIQ2 pad" }; +const struct LMS7Parameter DIQ2_PE = { 0x0022, 10, 10, 1, "DIQ2_PE", "Pull up control of DIQ2 pad" }; +const struct LMS7Parameter IQ_SEL_EN_2_PE = { 0x0022, 9, 9, 1, "IQ_SEL_EN_2_PE", "Pull up control of IQ_SEL_EN_2 pad" }; +const struct LMS7Parameter TXNRX2_PE = { 0x0022, 8, 8, 1, "TXNRX2_PE", "Pull up control of TXNRX2 pad" }; +const struct LMS7Parameter FCLK2_PE = { 0x0022, 7, 7, 1, "FCLK2_PE", "Pull up control of FCLK2 pad" }; +const struct LMS7Parameter MCLK2_PE = { 0x0022, 6, 6, 1, "MCLK2_PE", "Pull up control of MCLK2 pad" }; +const struct LMS7Parameter DIQ1_DS = { 0x0022, 5, 5, 0, "DIQ1_DS", "Pull up control of MCLK2 pad" }; +const struct LMS7Parameter DIQ1_PE = { 0x0022, 4, 4, 1, "DIQ1_PE", "Pull up control of DIQ1 pad" }; +const struct LMS7Parameter IQ_SEL_EN_1_PE = { 0x0022, 3, 3, 1, "IQ_SEL_EN_1_PE", "Pull up control of IQ_SEL_EN_1 pad" }; +const struct LMS7Parameter TXNRX1_PE = { 0x0022, 2, 2, 1, "TXNRX1_PE", "Pull up control of TXNRX1 pad" }; +const struct LMS7Parameter FCLK1_PE = { 0x0022, 1, 1, 1, "FCLK1_PE", "Pull up control of FCLK1 pad" }; +const struct LMS7Parameter MCLK1_PE = { 0x0022, 0, 0, 1, "MCLK1_PE", "Pull up control of MCLK1 pad" }; +const struct LMS7Parameter DIQDIRCTR2 = { 0x0023, 15, 15, 0, "DIQDIRCTR2", "DIQ2 direction control mode" }; +const struct LMS7Parameter DIQDIR2 = { 0x0023, 14, 14, 1, "DIQDIR2", "DIQ2 direction" }; +const struct LMS7Parameter DIQDIRCTR1 = { 0x0023, 13, 13, 0, "DIQDIRCTR1", "DIQ1 direction control mode" }; +const struct LMS7Parameter DIQDIR1 = { 0x0023, 12, 12, 1, "DIQDIR1", "DIQ1 direction" }; +const struct LMS7Parameter ENABLEDIRCTR2 = { 0x0023, 11, 11, 0, "ENABLEDIRCTR2", "ENABLE2 direction control mode" }; +const struct LMS7Parameter ENABLEDIR2 = { 0x0023, 10, 10, 1, "ENABLEDIR2", "ENABLE2 direction" }; +const struct LMS7Parameter ENABLEDIRCTR1 = { 0x0023, 9, 9, 0, "ENABLEDIRCTR1", "ENABLE1 direction control mode" }; +const struct LMS7Parameter ENABLEDIR1 = { 0x0023, 8, 8, 1, "ENABLEDIR1", "ENABLE1 direction." }; +const struct LMS7Parameter MOD_EN = { 0x0023, 6, 6, 1, "MOD_EN", "LimeLight interface enable" }; +const struct LMS7Parameter LML2_FIDM = { 0x0023, 5, 5, 0, "LML2_FIDM", "Frame start ID selection for Port 2 when LML_MODE2 = 0" }; +const struct LMS7Parameter LML2_TXNRXIQ = { 0x0023, 4, 4, 1, "LML2_TXNRXIQ", "TXIQ/RXIQ mode selection for Port 2 when LML_MODE2 = 0" }; +const struct LMS7Parameter LML2_MODE = { 0x0023, 3, 3, 1, "LML2_MODE", "Mode of LimeLight Port 2" }; +const struct LMS7Parameter LML1_FIDM = { 0x0023, 2, 2, 0, "LML1_FIDM", "Frame start ID selection for Port 1 when LML_MODE1 = 0" }; +const struct LMS7Parameter LML1_TXNRXIQ = { 0x0023, 1, 1, 0, "LML1_TXNRXIQ", "TXIQ/RXIQ mode selection for Port 1 when LML_MODE1 = 0" }; +const struct LMS7Parameter LML1_MODE = { 0x0023, 0, 0, 1, "LML1_MODE", "Mode of LimeLight Port 1" }; +const struct LMS7Parameter LML1_S3S = { 0x0024, 15, 14, 3, "LML1_S3S", "Sample source in position 3, when Port 1 is RF2BB" }; +const struct LMS7Parameter LML1_S2S = { 0x0024, 13, 12, 2, "LML1_S2S", "Sample source in position 2, when Port 1 is RF2BB" }; +const struct LMS7Parameter LML1_S1S = { 0x0024, 11, 10, 1, "LML1_S1S", "Sample source in position 1, when Port 1 is RF2BB" }; +const struct LMS7Parameter LML1_S0S = { 0x0024, 9, 8, 0, "LML1_S0S", "Sample source in position 0, when Port 1 is RF2BB" }; +const struct LMS7Parameter LML1_BQP = { 0x0024, 7, 6, 3, "LML1_BQP", "BQ sample position in frame, when Port 1 is BB2RF" }; +const struct LMS7Parameter LML1_BIP = { 0x0024, 5, 4, 2, "LML1_BIP", "BI sample position in frame, when Port 1 is BB2RF" }; +const struct LMS7Parameter LML1_AQP = { 0x0024, 3, 2, 1, "LML1_AQP", "AQ sample position in frame, when Port 1 is BB2RF" }; +const struct LMS7Parameter LML1_AIP = { 0x0024, 1, 0, 0, "LML1_AIP", "AI sample position in frame, when Port 1 is BB2RF" }; +const struct LMS7Parameter LML1_BB2RF_PST = { 0x0025, 15, 8, 1, "LML1_BB2RF_PST", "Number of clock cycles to wait before data drive stop after burst stop is detected in JESD207 mode on Port 1 and Port 1 BB2RF" }; +const struct LMS7Parameter LML1_BB2RF_PRE = { 0x0025, 7, 0, 1, "LML1_BB2RF_PRE", "Number of clock cycles to wait before data drive start after burst start is detected in JESD207 mode on Port 1 and Port 1 BB2RF" }; +const struct LMS7Parameter LML1_RF2BB_PST = { 0x0026, 15, 8, 1, "LML1_RF2BB_PST", "Number of clock cycles to wait before data capture stop after burst stop is detected in JESD207 mode on Port 1 and Port 1 is RF2BB" }; +const struct LMS7Parameter LML1_RF2BB_PRE = { 0x0026, 7, 0, 1, "LML1_RF2BB_PRE", "Number of clock cycles to wait before data capture start after burst start is detected in JESD207 mode on Port 1 and Port 1 RF2BB" }; +const struct LMS7Parameter LML2_S3S = { 0x0027, 15, 14, 3, "LML2_S3S", "Sample source in position 3, when Port 2 is RF2BB" }; +const struct LMS7Parameter LML2_S2S = { 0x0027, 13, 12, 2, "LML2_S2S", "Sample source in position 2, when Port 2 is RF2BB" }; +const struct LMS7Parameter LML2_S1S = { 0x0027, 11, 10, 1, "LML2_S1S", "Sample source in position 1, when Port 2 is RF2BB" }; +const struct LMS7Parameter LML2_S0S = { 0x0027, 9, 8, 0, "LML2_S0S", "Sample source in position 0, when Port 2 is RF2BB" }; +const struct LMS7Parameter LML2_BQP = { 0x0027, 7, 6, 3, "LML2_BQP", "BQ sample position in frame, when Port 2 is BB2RF" }; +const struct LMS7Parameter LML2_BIP = { 0x0027, 5, 4, 2, "LML2_BIP", "BI sample position in frame, when Port 2 is BB2RF" }; +const struct LMS7Parameter LML2_AQP = { 0x0027, 3, 2, 1, "LML2_AQP", "AQ sample position in frame, when Port 2 is BB2RF" }; +const struct LMS7Parameter LML2_AIP = { 0x0027, 1, 0, 0, "LML2_AIP", "AI sample position in frame, when Port 2 is BB2RF" }; +const struct LMS7Parameter LML2_BB2RF_PST = { 0x0028, 15, 8, 1, "LML2_BB2RF_PST", "Number of clock cycles to wait before data drive stop after burst stop is detected in JESD207 mode on Port 2 and Port 2 BB2RF" }; +const struct LMS7Parameter LML2_BB2RF_PRE = { 0x0028, 7, 0, 1, "LML2_BB2RF_PRE", "Number of clock cycles to wait before data drive start after burst start is detected in JESD207 mode on Port 2 and Port 2 BB2RF" }; +const struct LMS7Parameter LML2_RF2BB_PST = { 0x0029, 15, 8, 1, "LML2_RF2BB_PST", "Number of clock cycles to wait before data capture stop after burst stop is detected in JESD207 mode on Port 2 and Port 2 RF2BB" }; +const struct LMS7Parameter LML2_RF2BB_PRE = { 0x0029, 7, 0, 1, "LML2_RF2BB_PRE", "Number of clock cycles to wait before data capture start after burst start is detected in JESD207 mode on Port 2 and Port 2 RF2BB" }; +const struct LMS7Parameter FCLK2_DLY = { 0x002A, 15, 14, 0, "FCLK2_DLY", "" }; +const struct LMS7Parameter FCLK1_DLY = { 0x002A, 13, 12, 0, "FCLK1_DLY", "" }; +const struct LMS7Parameter RX_MUX = { 0x002A, 11, 10, 0, "RX_MUX", "RxFIFO data source selection" }; +const struct LMS7Parameter TX_MUX = { 0x002A, 9, 8, 0, "TX_MUX", "Port selection for data transmit to TSP" }; +const struct LMS7Parameter TXRDCLK_MUX = { 0x002A, 7, 6, 2, "TXRDCLK_MUX", "TX FIFO read clock selection" }; +const struct LMS7Parameter TXWRCLK_MUX = { 0x002A, 5, 4, 0, "TXWRCLK_MUX", "TX FIFO write clock selection" }; +const struct LMS7Parameter RXRDCLK_MUX = { 0x002A, 3, 2, 1, "RXRDCLK_MUX", "RX FIFO read clock selection" }; +const struct LMS7Parameter RXWRCLK_MUX = { 0x002A, 1, 0, 2, "RXWRCLK_MUX", "RX FIFO write clock selection" }; +const struct LMS7Parameter FCLK2_INV = { 0x002B, 15, 15, 0, "FCLK2_INV", "FCLK2 clock inversion" }; +const struct LMS7Parameter FCLK1_INV = { 0x002B, 14, 14, 0, "FCLK1_INV", "FCLK1 clock inversion" }; +const struct LMS7Parameter MCLK2DLY = { 0x002B, 13, 12, 0, "MCLK2DLY", "MCLK2 clock internal delay" }; +const struct LMS7Parameter MCLK1DLY = { 0x002B, 11, 10, 0, "MCLK1DLY", "MCLK1 clock internal delay" }; +const struct LMS7Parameter MCLK2SRC = { 0x002B, 5, 4, 1, "MCLK2SRC", "MCLK2 clock source" }; +const struct LMS7Parameter MCLK1SRC = { 0x002B, 3, 2, 0, "MCLK1SRC", "MCLK1 clock source" }; +const struct LMS7Parameter TXDIVEN = { 0x002B, 1, 1, 0, "TXDIVEN", "TX clock divider enable" }; +const struct LMS7Parameter RXDIVEN = { 0x002B, 0, 0, 0, "RXDIVEN", "RX clock divider enable" }; +const struct LMS7Parameter TXTSPCLKA_DIV = { 0x002C, 15, 8, 255, "TXTSPCLKA_DIV", "TxTSP clock divider, used to produce MCLK(1/2). Clock division ratio is 2(TXTSPCLKA_DIV + 1)"}; +const struct LMS7Parameter RXTSPCLKA_DIV = { 0x002C, 7, 0, 255, "RXTSPCLKA_DIV", "RxTSP clock divider, used to produce MCLK(1/2). Clock division ratio is 2(RXTSPCLKA_DIV + 1)"}; +const struct LMS7Parameter MIMO_SISO = { 0x002E, 15, 15, 0, "MIMO_SISO", "MIMO channel B enable control" }; +const struct LMS7Parameter VER = { 0x002F, 15, 11, 7, "VER", "" }; +const struct LMS7Parameter REV = { 0x002F, 10, 6, 1, "REV", "" }; +const struct LMS7Parameter MASK = { 0x002F, 5, 0, 0, "MASK", "" }; +const struct LMS7Parameter EN_DIR_LDO = { 0x0081, 3, 3, 0, "EN_DIR_LDO", "" }; +const struct LMS7Parameter EN_DIR_CGEN = { 0x0081, 2, 2, 0, "EN_DIR_CGEN", "" }; +const struct LMS7Parameter EN_DIR_XBUF = { 0x0081, 1, 1, 0, "EN_DIR_XBUF", "" }; +const struct LMS7Parameter EN_DIR_AFE = { 0x0081, 0, 0, 0, "EN_DIR_AFE", "" }; +const struct LMS7Parameter ISEL_DAC_AFE = { 0x0082, 15, 13, 4, "ISEL_DAC_AFE", "Controls the peak current of the DAC output current" }; +const struct LMS7Parameter MODE_INTERLEAVE_AFE = { 0x0082, 12, 12, 0, "MODE_INTERLEAVE_AFE", "time interleaves the two ADCs into one ADC" }; +const struct LMS7Parameter MUX_AFE_1 = { 0x0082, 11, 10, 0, "MUX_AFE_1", "Controls the MUX at the input of the ADC channel 1" }; +const struct LMS7Parameter MUX_AFE_2 = { 0x0082, 9, 8, 0, "MUX_AFE_2", "Controls the MUX at the input of the ADC channel 2" }; +const struct LMS7Parameter PD_AFE = { 0x0082, 5, 5, 0, "PD_AFE", "Power down control for the AFE current mirror in BIAS_TOP" }; +const struct LMS7Parameter PD_RX_AFE1 = { 0x0082, 4, 4, 0, "PD_RX_AFE1", "Power down control for the ADC of channel 1" }; +const struct LMS7Parameter PD_RX_AFE2 = { 0x0082, 3, 3, 1, "PD_RX_AFE2", "Power down control for the ADC of channel 2" }; +const struct LMS7Parameter PD_TX_AFE1 = { 0x0082, 2, 2, 0, "PD_TX_AFE1", "Power down control for the DAC of channel 1" }; +const struct LMS7Parameter PD_TX_AFE2 = { 0x0082, 1, 1, 1, "PD_TX_AFE2", "Power down control for the DAC of channel 2" }; +const struct LMS7Parameter EN_G_AFE = { 0x0082, 0, 0, 1, "EN_G_AFE", "Enable control for all the AFE power downs" }; +const struct LMS7Parameter MUX_BIAS_OUT = { 0x0084, 12, 11, 0, "MUX_BIAS_OUT", "Test mode of the BIAS_TOP" }; +const struct LMS7Parameter RP_CALIB_BIAS = { 0x0084, 10, 6, 16, "RP_CALIB_BIAS", "Calibration code for rppolywo. This code is set by the calibration algorithm: BIAS_RPPOLY_calibration" }; +const struct LMS7Parameter PD_FRP_BIAS = { 0x0084, 4, 4, 0, "PD_FRP_BIAS", "Power down signal for Fix/RP block" }; +const struct LMS7Parameter PD_F_BIAS = { 0x0084, 3, 3, 0, "PD_F_BIAS", "Power down signal for Fix" }; +const struct LMS7Parameter PD_PTRP_BIAS = { 0x0084, 2, 2, 0, "PD_PTRP_BIAS", "Power down signal for PTAT/RP block" }; +const struct LMS7Parameter PD_PT_BIAS = { 0x0084, 1, 1, 0, "PD_PT_BIAS", "Power down signal for PTAT block" }; +const struct LMS7Parameter PD_BIAS_MASTER = { 0x0084, 0, 0, 0, "PD_BIAS_MASTER", "Enable signal for central bias block" }; +const struct LMS7Parameter SLFB_XBUF_RX = { 0x0085, 8, 8, 0, "SLFB_XBUF_RX", "Self biasing digital contol SLFB_XBUF_RX" }; +const struct LMS7Parameter SLFB_XBUF_TX = { 0x0085, 7, 7, 0, "SLFB_XBUF_TX", "Self biasing digital contol SLFB_XBUF_TX" }; +const struct LMS7Parameter BYP_XBUF_RX = { 0x0085, 6, 6, 0, "BYP_XBUF_RX", "Shorts the Input 3.3V buffer in XBUF" }; +const struct LMS7Parameter BYP_XBUF_TX = { 0x0085, 5, 5, 0, "BYP_XBUF_TX", "Shorts the Input 3.3V buffer in XBUF" }; +const struct LMS7Parameter EN_OUT2_XBUF_TX = { 0x0085, 4, 4, 0, "EN_OUT2_XBUF_TX", "Enables the 2nd output of TX XBUF. This 2nd buffer goes to XBUF_RX. This should be active when only 1 XBUF is to be used" }; +const struct LMS7Parameter EN_TBUFIN_XBUF_RX = { 0x0085, 3, 3, 0, "EN_TBUFIN_XBUF_RX", "Disables the input from the external XOSC and buffers the 2nd input signal (from TX XBUF 2nd output) to the RX. This should be active when only 1 XBUF is to be used" }; +const struct LMS7Parameter PD_XBUF_RX = { 0x0085, 2, 2, 0, "PD_XBUF_RX", "Power down signal PD_XBUF_RX" }; +const struct LMS7Parameter PD_XBUF_TX = { 0x0085, 1, 1, 0, "PD_XBUF_TX", "Power down signal PD_XBUF_TX" }; +const struct LMS7Parameter EN_G_XBUF = { 0x0085, 0, 0, 1, "EN_G_XBUF", "Enable control for all the XBUF power downs" }; +const struct LMS7Parameter SPDUP_VCO_CGEN = { 0x0086, 15, 15, 0, "SPDUP_VCO_CGEN", "Bypasses the noise filter resistor for fast setlling time. It should be connected to a 1us pulse" }; +const struct LMS7Parameter RESET_N_CGEN = { 0x0086, 14, 14, 1, "RESET_N_CGEN", "A pulse should be used in the start-up to reset ( 1-normal operation)" }; +const struct LMS7Parameter EN_ADCCLKH_CLKGN = { 0x0086, 11, 11, 1, "EN_ADCCLKH_CLKGN", "Selects if F_CLKH or F_CLKL is connected to FCLK_ADC" }; +const struct LMS7Parameter EN_COARSE_CKLGEN = { 0x0086, 10, 10, 0, "EN_COARSE_CKLGEN", "Enable signal for coarse tuning block" }; +const struct LMS7Parameter EN_INTONLY_SDM_CGEN = { 0x0086, 9, 9, 0, "EN_INTONLY_SDM_CGEN", "Enables INTEGER-N mode of the SX " }; +const struct LMS7Parameter EN_SDM_CLK_CGEN = { 0x0086, 8, 8, 1, "EN_SDM_CLK_CGEN", "Enables/Disables SDM clock. In INT-N mode or for noise testing, SDM clock can be disabled" }; +const struct LMS7Parameter PD_CP_CGEN = { 0x0086, 6, 6, 0, "PD_CP_CGEN", "Power down for Charge Pump" }; +const struct LMS7Parameter PD_FDIV_FB_CGEN = { 0x0086, 5, 5, 0, "PD_FDIV_FB_CGEN", "Power down for feedback frequency divider" }; +const struct LMS7Parameter PD_FDIV_O_CGEN = { 0x0086, 4, 4, 0, "PD_FDIV_O_CGEN", "Power down for forward frequency divider of the CGEN block" }; +const struct LMS7Parameter PD_SDM_CGEN = { 0x0086, 3, 3, 0, "PD_SDM_CGEN", "Power down for SDM" }; +const struct LMS7Parameter PD_VCO_CGEN = { 0x0086, 2, 2, 0, "PD_VCO_CGEN", "Power down for VCO" }; +const struct LMS7Parameter PD_VCO_COMP_CGEN = { 0x0086, 1, 1, 0, "PD_VCO_COMP_CGEN", "Power down for VCO comparator" }; +const struct LMS7Parameter EN_G_CGEN = { 0x0086, 0, 0, 1, "EN_G_CGEN", "Enable control for all the CGEN power downs" }; +const struct LMS7Parameter FRAC_SDM_CGEN_LSB = { 0x0087, 15, 0, 0x0400, "FRAC_SDM_CGEN_LSB", "" }; +const struct LMS7Parameter INT_SDM_CGEN = { 0x0088, 13, 4, 120, "INT_SDM_CGEN", "" }; +const struct LMS7Parameter FRAC_SDM_CGEN_MSB = { 0x0088, 3, 0, 0, "FRAC_SDM_CGEN_MSB", "" }; +const struct LMS7Parameter REV_SDMCLK_CGEN = { 0x0089, 15, 15, 0, "REV_SDMCLK_CGEN", "Reverses the SDM clock" }; +const struct LMS7Parameter SEL_SDMCLK_CGEN = { 0x0089, 14, 14, 0, "SEL_SDMCLK_CGEN", "Selects between the feedback divider output and Fref for SDM" }; +const struct LMS7Parameter SX_DITHER_EN_CGEN = { 0x0089, 13, 13, 0, "SX_DITHER_EN_CGEN", "Enabled dithering in SDM" }; +const struct LMS7Parameter CLKH_OV_CLKL_CGEN = { 0x0089, 12, 11, 0, "CLKH_OV_CLKL_CGEN", "FCLKL here is ADC clock. FCLKH is the clock to the DAC and if no division is added to the ADC as well" }; +const struct LMS7Parameter DIV_OUTCH_CGEN = { 0x0089, 10, 3, 4, "DIV_OUTCH_CGEN", "" }; +const struct LMS7Parameter TST_CGEN = { 0x0089, 2, 0, 0, "TST_CGEN", +"Controls the test mode of the SX\n\ +0 - TST disabled; RSSI analog outputs enabled if RSSI blocks active and when all PLL test signals are off\n\ +1 - tstdo[0] = ADC clock; tstdo[1] = DAC clock; tstao = High impedance;\n\ +2 - tstdo[0] = SDM clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 60kOhm resistor;\n\ +3 - tstdo[0] = Reference clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 10kOhm resistor;\n\ +4 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = High impedance;\n\ +5 - tstdo[0] = Charge pump Down signal; tstdo[1] = Charge pump Up signal; tstao = High impedance;\n\ +6 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 60kOhm resistor;\n\ +7 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 10kOhm resistor;\n\ +if TST_SX[2] = 1 --> VCO_TSTBUF active generating VCO_TST_DIV20 and VCO_TST_DIV40"}; +const struct LMS7Parameter REV_CLKDAC_CGEN = { 0x008A, 14, 14, 0, "REV_CLKDAC_CGEN", "Inverts the clock F_CLKL" }; +const struct LMS7Parameter CMPLO_CTRL_CGEN = { 0x008A, 27, 14, 0, "CMPLO_CTRL_CGEN", "" }; +const struct LMS7Parameter REV_CLKADC_CGEN = { 0x008A, 13, 13, 0, "REV_CLKADC_CGEN", "Inverts the clock F_CLKL" }; +const struct LMS7Parameter REVPH_PFD_CGEN = { 0x008A, 12, 12, 0, "REVPH_PFD_CGEN", "Reverse the pulses of PFD. It can be used to reverse the polarity of the PLL loop (positive feedback to negative feedback)" }; +const struct LMS7Parameter IOFFSET_CP_CGEN = { 0x008A, 11, 6, 20, "IOFFSET_CP_CGEN", "Scales the offset current of the charge pump, 0-->63. This current is used in Fran-N mode to create an offset in the CP response and avoide the non-linear section" }; +const struct LMS7Parameter IPULSE_CP_CGEN = { 0x008A, 5, 0, 20, "IPULSE_CP_CGEN", "Scales the pulse current of the charge pump" }; +const struct LMS7Parameter ICT_VCO_CGEN = { 0x008B, 13, 9, 16, "ICT_VCO_CGEN", "Scales the VCO bias current from 0 to 2.5xInom" }; +const struct LMS7Parameter CSW_VCO_CGEN = { 0x008B, 8, 1, 128, "CSW_VCO_CGEN", "" }; +const struct LMS7Parameter COARSE_START_CGEN = { 0x008B, 0, 0, 0, "COARSE_START_CGEN", "Control signal for coarse tuning algorithm (SX_SWC_calibration)" }; +const struct LMS7Parameter COARSE_STEPDONE_CGEN = { 0x008C, 15, 15, 0, "COARSE_STEPDONE_CGEN", "" }; +const struct LMS7Parameter COARSEPLL_COMPO_CGEN = { 0x008C, 14, 14, 0, "COARSEPLL_COMPO_CGEN", "" }; +const struct LMS7Parameter VCO_CMPHO_CGEN = { 0x008C, 13, 13, 0, "VCO_CMPHO_CGEN", "" }; +const struct LMS7Parameter VCO_CMPLO_CGEN = { 0x008C, 12, 12, 0, "VCO_CMPLO_CGEN", "" }; +const struct LMS7Parameter CP2_CGEN = { 0x008C, 11, 8, 6, "CP2_CGEN", "Controls the value of CP2 (cap from CP output to GND) in the PLL filter" }; +const struct LMS7Parameter CP3_CGEN = { 0x008C, 7, 4, 7, "CP3_CGEN", "Controls the value of CP3 (cap from VCO Vtune input to GND) in the PLL filter" }; +const struct LMS7Parameter CZ_CGEN = { 0x008C, 3, 0, 11, "CZ_CGEN", "Controls the value of CZ (Zero capacitor) in the PLL filter" }; +const struct LMS7Parameter EN_LDO_DIG = { 0x0092, 15, 15, 0, "EN_LDO_DIG", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_DIGGN = { 0x0092, 14, 14, 0, "EN_LDO_DIGGN", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_DIGSXR = { 0x0092, 13, 13, 0, "EN_LDO_DIGSXR", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_DIGSXT = { 0x0092, 12, 12, 0, "EN_LDO_DIGSXT", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_DIVGN = { 0x0092, 11, 11, 0, "EN_LDO_DIVGN", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_DIVSXR = { 0x0092, 10, 10, 0, "EN_LDO_DIVSXR", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_DIVSXT = { 0x0092, 9, 9, 0, "EN_LDO_DIVSXT", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_LNA12 = { 0x0092, 8, 8, 0, "EN_LDO_LNA12", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_LNA14 = { 0x0092, 7, 7, 0, "EN_LDO_LNA14", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_MXRFE = { 0x0092, 6, 6, 0, "EN_LDO_MXRFE", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_RBB = { 0x0092, 5, 5, 0, "EN_LDO_RBB", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_RXBUF = { 0x0092, 4, 4, 0, "EN_LDO_RXBUF", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_TBB = { 0x0092, 3, 3, 0, "EN_LDO_TBB", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_TIA12 = { 0x0092, 2, 2, 0, "EN_LDO_TIA12", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_TIA14 = { 0x0092, 1, 1, 0, "EN_LDO_TIA14", "Enables the LDO" }; +const struct LMS7Parameter EN_G_LDO = { 0x0092, 0, 0, 1, "EN_G_LDO", "Enable control for all the LDO power downs" }; +const struct LMS7Parameter EN_LOADIMP_LDO_TLOB = { 0x0093, 15, 15, 0, "EN_LOADIMP_LDO_TLOB", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_TPAD = { 0x0093, 14, 14, 0, "EN_LOADIMP_LDO_TPAD", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_TXBUF = { 0x0093, 13, 13, 0, "EN_LOADIMP_LDO_TXBUF", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_VCOGN = { 0x0093, 12, 12, 0, "EN_LOADIMP_LDO_VCOGN", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXR = { 0x0093, 11, 11, 0, "EN_LOADIMP_LDO_VCOSXR", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXT = { 0x0093, 10, 10, 0, "EN_LOADIMP_LDO_VCOSXT", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LDO_AFE = { 0x0093, 9, 9, 0, "EN_LDO_AFE", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_CPGN = { 0x0093, 8, 8, 0, "EN_LDO_CPGN", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_CPSXR = { 0x0093, 7, 7, 0, "EN_LDO_CPSXR", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_TLOB = { 0x0093, 6, 6, 0, "EN_LDO_TLOB", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_TPAD = { 0x0093, 5, 5, 0, "EN_LDO_TPAD", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_TXBUF = { 0x0093, 4, 4, 0, "EN_LDO_TXBUF", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_VCOGN = { 0x0093, 3, 3, 0, "EN_LDO_VCOGN", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_VCOSXR = { 0x0093, 2, 2, 0, "EN_LDO_VCOSXR", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_VCOSXT = { 0x0093, 1, 1, 0, "EN_LDO_VCOSXT", "Enables the LDO" }; +const struct LMS7Parameter EN_LDO_CPSXT = { 0x0093, 0, 0, 0, "EN_LDO_CPSXT", "Enables the LDO" }; +const struct LMS7Parameter EN_LOADIMP_LDO_CPSXT = { 0x0094, 15, 15, 0, "EN_LOADIMP_LDO_CPSXT", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_DIG = { 0x0094, 14, 14, 0, "EN_LOADIMP_LDO_DIG", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_DIGGN = { 0x0094, 13, 13, 0, "EN_LOADIMP_LDO_DIGGN", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXR = { 0x0094, 12, 12, 0, "EN_LOADIMP_LDO_DIGSXR", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXT = { 0x0094, 11, 11, 0, "EN_LOADIMP_LDO_DIGSXT", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_DIVGN = { 0x0094, 10, 10, 0, "EN_LOADIMP_LDO_DIVGN", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXR = { 0x0094, 9, 9, 0, "EN_LOADIMP_LDO_DIVSXR", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXT = { 0x0094, 8, 8, 0, "EN_LOADIMP_LDO_DIVSXT", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_LNA12 = { 0x0094, 7, 7, 0, "EN_LOADIMP_LDO_LNA12", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_LNA14 = { 0x0094, 6, 6, 0, "EN_LOADIMP_LDO_LNA14", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_MXRFE = { 0x0094, 5, 5, 0, "EN_LOADIMP_LDO_MXRFE", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_RBB = { 0x0094, 4, 4, 0, "EN_LOADIMP_LDO_RBB", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_RXBUF = { 0x0094, 3, 3, 0, "EN_LOADIMP_LDO_RXBUF", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_TBB = { 0x0094, 2, 2, 0, "EN_LOADIMP_LDO_TBB", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_TIA12 = { 0x0094, 1, 1, 0, "EN_LOADIMP_LDO_TIA12", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_TIA14 = { 0x0094, 0, 0, 0, "EN_LOADIMP_LDO_TIA14", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter BYP_LDO_TBB = { 0x0095, 15, 15, 0, "BYP_LDO_TBB", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_TIA12 = { 0x0095, 14, 14, 0, "BYP_LDO_TIA12", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_TIA14 = { 0x0095, 13, 13, 0, "BYP_LDO_TIA14", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_TLOB = { 0x0095, 12, 12, 0, "BYP_LDO_TLOB", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_TPAD = { 0x0095, 11, 11, 0, "BYP_LDO_TPAD", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_TXBUF = { 0x0095, 10, 10, 0, "BYP_LDO_TXBUF", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_VCOGN = { 0x0095, 9, 9, 0, "BYP_LDO_VCOGN", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_VCOSXR = { 0x0095, 8, 8, 0, "BYP_LDO_VCOSXR", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_VCOSXT = { 0x0095, 7, 7, 0, "BYP_LDO_VCOSXT", "Bypass signal for the LDO" }; +const struct LMS7Parameter EN_LOADIMP_LDO_AFE = { 0x0095, 2, 2, 0, "EN_LOADIMP_LDO_AFE", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_CPGN = { 0x0095, 1, 1, 0, "EN_LOADIMP_LDO_CPGN", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_CPSXR = { 0x0095, 0, 0, 0, "EN_LOADIMP_LDO_CPSXR", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter BYP_LDO_AFE = { 0x0096, 15, 15, 0, "BYP_LDO_AFE", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_CPGN = { 0x0096, 14, 14, 0, "BYP_LDO_CPGN", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_CPSXR = { 0x0096, 13, 13, 0, "BYP_LDO_CPSXR", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_CPSXT = { 0x0096, 12, 12, 0, "BYP_LDO_CPSXT", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_DIG = { 0x0096, 11, 11, 0, "BYP_LDO_DIG", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_DIGGN = { 0x0096, 10, 10, 0, "BYP_LDO_DIGGN", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_DIGSXR = { 0x0096, 9, 9, 0, "BYP_LDO_DIGSXR", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_DIGSXT = { 0x0096, 8, 8, 0, "BYP_LDO_DIGSXT", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_DIVGN = { 0x0096, 7, 7, 0, "BYP_LDO_DIVGN", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_DIVSXR = { 0x0096, 6, 6, 0, "BYP_LDO_DIVSXR", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_DIVSXT = { 0x0096, 5, 5, 0, "BYP_LDO_DIVSXT", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_LNA12 = { 0x0096, 4, 4, 0, "BYP_LDO_LNA12", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_LNA14 = { 0x0096, 3, 3, 0, "BYP_LDO_LNA14", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_MXRFE = { 0x0096, 2, 2, 0, "BYP_LDO_MXRFE", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_RBB = { 0x0096, 1, 1, 0, "BYP_LDO_RBB", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_RXBUF = { 0x0096, 0, 0, 0, "BYP_LDO_RXBUF", "Bypass signal for the LDO" }; +const struct LMS7Parameter SPDUP_LDO_DIVSXR = { 0x0097, 15, 15, 0, "SPDUP_LDO_DIVSXR", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_DIVSXT = { 0x0097, 14, 14, 0, "SPDUP_LDO_DIVSXT", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_LNA12 = { 0x0097, 13, 13, 0, "SPDUP_LDO_LNA12", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_LNA14 = { 0x0097, 12, 12, 0, "SPDUP_LDO_LNA14", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_MXRFE = { 0x0097, 11, 11, 0, "SPDUP_LDO_MXRFE", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_RBB = { 0x0097, 10, 10, 0, "SPDUP_LDO_RBB", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_RXBUF = { 0x0097, 9, 9, 0, "SPDUP_LDO_RXBUF", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_TBB = { 0x0097, 8, 8, 0, "SPDUP_LDO_TBB", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_TIA12 = { 0x0097, 7, 7, 0, "SPDUP_LDO_TIA12", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_TIA14 = { 0x0097, 6, 6, 0, "SPDUP_LDO_TIA14", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_TLOB = { 0x0097, 5, 5, 0, "SPDUP_LDO_TLOB", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_TPAD = { 0x0097, 4, 4, 0, "SPDUP_LDO_TPAD", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_TXBUF = { 0x0097, 3, 3, 0, "SPDUP_LDO_TXBUF", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_VCOGN = { 0x0097, 2, 2, 0, "SPDUP_LDO_VCOGN", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_VCOSXR = { 0x0097, 1, 1, 0, "SPDUP_LDO_VCOSXR", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_VCOSXT = { 0x0097, 0, 0, 0, "SPDUP_LDO_VCOSXT", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_AFE = { 0x0098, 8, 8, 0, "SPDUP_LDO_AFE", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_CPGN = { 0x0098, 7, 7, 0, "SPDUP_LDO_CPGN", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_CPSXR = { 0x0098, 6, 6, 0, "SPDUP_LDO_CPSXR", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_CPSXT = { 0x0098, 5, 5, 0, "SPDUP_LDO_CPSXT", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_DIG = { 0x0098, 4, 4, 0, "SPDUP_LDO_DIG", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_DIGGN = { 0x0098, 3, 3, 0, "SPDUP_LDO_DIGGN", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_DIGSXR = { 0x0098, 2, 2, 0, "SPDUP_LDO_DIGSXR", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_DIGSXT = { 0x0098, 1, 1, 0, "SPDUP_LDO_DIGSXT", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_DIVGN = { 0x0098, 0, 0, 0, "SPDUP_LDO_DIVGN", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter RDIV_VCOSXR = { 0x0099, 15, 8, 101, "RDIV_VCOSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_VCOSXT = { 0x0099, 7, 0, 101, "RDIV_VCOSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_TXBUF = { 0x009A, 15, 8, 101, "RDIV_TXBUF", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_VCOGN = { 0x009A, 7, 0, 140, "RDIV_VCOGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_TLOB = { 0x009B, 15, 8, 101, "RDIV_TLOB", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_TPAD = { 0x009B, 7, 0, 101, "RDIV_TPAD", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_TIA12 = { 0x009C, 15, 8, 101, "RDIV_TIA12", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_TIA14 = { 0x009C, 7, 0, 140, "RDIV_TIA14", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_RXBUF = { 0x009D, 15, 8, 101, "RDIV_RXBUF", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_TBB = { 0x009D, 7, 0, 101, "RDIV_TBB", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_MXRFE = { 0x009E, 15, 8, 101, "RDIV_MXRFE", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_RBB = { 0x009E, 7, 0, 140, "RDIV_RBB", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_LNA12 = { 0x009F, 15, 8, 101, "RDIV_LNA12", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_LNA14 = { 0x009F, 7, 0, 140, "RDIV_LNA14", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_DIVSXR = { 0x00A0, 15, 8, 101, "RDIV_DIVSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_DIVSXT = { 0x00A0, 7, 0, 101, "RDIV_DIVSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_DIGSXT = { 0x00A1, 15, 8, 101, "RDIV_DIGSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_DIVGN = { 0x00A1, 7, 0, 101, "RDIV_DIVGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_DIGGN = { 0x00A2, 15, 8, 101, "RDIV_DIGGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_DIGSXR = { 0x00A2, 7, 0, 101, "RDIV_DIGSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_CPSXT = { 0x00A3, 15, 8, 101, "RDIV_CPSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_DIG = { 0x00A3, 7, 0, 101, "RDIV_DIG", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_CPGN = { 0x00A4, 15, 8, 101, "RDIV_CPGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_CPSXR = { 0x00A4, 7, 0, 101, "RDIV_CPSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_SPIBUF = { 0x00A5, 15, 8, 101, "RDIV_SPIBUF", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_AFE = { 0x00A5, 7, 0, 101, "RDIV_AFE", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter SPDUP_LDO_SPIBUF = { 0x00A6, 12, 12, 0, "SPDUP_LDO_SPIBUF", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_DIGIp2 = { 0x00A6, 11, 11, 0, "SPDUP_LDO_DIGIp2", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter SPDUP_LDO_DIGIp1 = { 0x00A6, 10, 10, 0, "SPDUP_LDO_DIGIp1", "Short the noise filter resistor to speed up the settling time" }; +const struct LMS7Parameter BYP_LDO_SPIBUF = { 0x00A6, 9, 9, 0, "BYP_LDO_SPIBUF", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_DIGIp2 = { 0x00A6, 8, 8, 0, "BYP_LDO_DIGIp2", "Bypass signal for the LDO" }; +const struct LMS7Parameter BYP_LDO_DIGIp1 = { 0x00A6, 7, 7, 0, "BYP_LDO_DIGIp1", "Bypass signal for the LDO" }; +const struct LMS7Parameter EN_LOADIMP_LDO_SPIBUF = { 0x00A6, 6, 6, 0, "EN_LOADIMP_LDO_SPIBUF", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp2 = { 0x00A6, 5, 5, 0, "EN_LOADIMP_LDO_DIGIp2", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp1 = { 0x00A6, 4, 4, 0, "EN_LOADIMP_LDO_DIGIp1", "Enables the load dependent bias to optimize the load regulation" }; +const struct LMS7Parameter PD_LDO_SPIBUF = { 0x00A6, 3, 3, 1, "PD_LDO_SPIBUF", "Enables the LDO" }; +const struct LMS7Parameter PD_LDO_DIGIp2 = { 0x00A6, 2, 2, 1, "PD_LDO_DIGIp2", "Enables the LDO" }; +const struct LMS7Parameter PD_LDO_DIGIp1 = { 0x00A6, 1, 1, 1, "PD_LDO_DIGIp1", "Enables the LDO" }; +const struct LMS7Parameter EN_G_LDOP = { 0x00A6, 0, 0, 1, "EN_G_LDOP", "Enable control for all the LDO power downs" }; +const struct LMS7Parameter RDIV_DIGIp2 = { 0x00A7, 15, 8, 101, "RDIV_DIGIp2", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter RDIV_DIGIp1 = { 0x00A7, 7, 0, 101, "RDIV_DIGIp1", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; +const struct LMS7Parameter BSIGT = { 0x00A8, 31, 9, 0, "BSIGT", "" }; +const struct LMS7Parameter BSTATE = { 0x00A8, 8, 8, 0, "BSTATE", "" }; +const struct LMS7Parameter EN_SDM_TSTO_SXT = { 0x00A8, 6, 6, 0, "EN_SDM_TSTO_SXT", "Enables the SDM_TSTO_SXT" }; +const struct LMS7Parameter EN_SDM_TSTO_SXR = { 0x00A8, 5, 5, 0, "EN_SDM_TSTO_SXR", "Enables the SDM_TSTO_SXR" }; +const struct LMS7Parameter EN_SDM_TSTO_CGEN = { 0x00A8, 4, 4, 0, "EN_SDM_TSTO_CGEN", "Enables the SDM_TSTO_CGEN" }; +const struct LMS7Parameter BENC = { 0x00A8, 3, 3, 0, "BENC", "enables CGEN BIST" }; +const struct LMS7Parameter BENR = { 0x00A8, 2, 2, 0, "BENR", "enables SXR BIST" }; +const struct LMS7Parameter BENT = { 0x00A8, 1, 1, 0, "BENT", "enables SXT BIST" }; +const struct LMS7Parameter BSTART = { 0x00A8, 0, 0, 0, "BSTART", "Starts delta sigma built in self test. Keep it at 1 one at least three clock cycles" }; +const struct LMS7Parameter BSIGR = { 0x00AA, 22, 0, 0, "BSIGR", "" }; +const struct LMS7Parameter BSIGC = { 0x00AB, 29, 7, 0, "BSIGC", "" }; +const struct LMS7Parameter CDS_MCLK2 = { 0x00AD, 15, 14, 0, "CDS_MCLK2", "MCLK2 clock delay" }; +const struct LMS7Parameter CDS_MCLK1 = { 0x00AD, 13, 12, 0, "CDS_MCLK1", "MCLK1 clock delay" }; +const struct LMS7Parameter CDSN_TXBTSP = { 0x00AD, 9, 9, 1, "CDSN_TXBTSP", "TX TSPB clock inversion control" }; +const struct LMS7Parameter CDSN_TXATSP = { 0x00AD, 8, 8, 1, "CDSN_TXATSP", "TX TSPA clock inversion control" }; +const struct LMS7Parameter CDSN_RXBTSP = { 0x00AD, 7, 7, 1, "CDSN_RXBTSP", "RX TSPB clock inversion control" }; +const struct LMS7Parameter CDSN_RXATSP = { 0x00AD, 6, 6, 1, "CDSN_RXATSP", "RX TSPA clock inversion control" }; +const struct LMS7Parameter CDSN_TXBLML = { 0x00AD, 5, 5, 1, "CDSN_TXBLML", "TX LMLB clock inversion control" }; +const struct LMS7Parameter CDSN_TXALML = { 0x00AD, 4, 4, 1, "CDSN_TXALML", "TX LMLA clock inversion control" }; +const struct LMS7Parameter CDSN_RXBLML = { 0x00AD, 3, 3, 1, "CDSN_RXBLML", "RX LMLB clock inversion control" }; +const struct LMS7Parameter CDSN_RXALML = { 0x00AD, 2, 2, 1, "CDSN_RXALML", "RX LMLA clock inversion control" }; +const struct LMS7Parameter CDSN_MCLK2 = { 0x00AD, 1, 1, 1, "CDSN_MCLK2", "MCLK2 clock inversion control" }; +const struct LMS7Parameter CDSN_MCLK1 = { 0x00AD, 0, 0, 1, "CDSN_MCLK1", "MCLK1 clock inversion control" }; +const struct LMS7Parameter CDS_TXBTSP = { 0x00AE, 15, 14, 0, "CDS_TXBTSP", "TX TSP B clock delay" }; +const struct LMS7Parameter CDS_TXATSP = { 0x00AE, 13, 12, 0, "CDS_TXATSP", "TX TSP A clock delay" }; +const struct LMS7Parameter CDS_RXBTSP = { 0x00AE, 11, 10, 0, "CDS_RXBTSP", "RX TSP B clock delay" }; +const struct LMS7Parameter CDS_RXATSP = { 0x00AE, 9, 8, 0, "CDS_RXATSP", "RX TSP A clock delay" }; +const struct LMS7Parameter CDS_TXBLML = { 0x00AE, 7, 6, 0, "CDS_TXBLML", "TX LML B clock delay" }; +const struct LMS7Parameter CDS_TXALML = { 0x00AE, 5, 4, 0, "CDS_TXALML", "TX LML A clock delay" }; +const struct LMS7Parameter CDS_RXBLML = { 0x00AE, 3, 2, 0, "CDS_RXBLML", "RX LML B clock delay" }; +const struct LMS7Parameter CDS_RXALML = { 0x00AE, 1, 0, 0, "CDS_RXALML", "RX LML A clock delay" }; +const struct LMS7Parameter EN_LOWBWLOMX_TMX_TRF = { 0x0100, 15, 15, 0, "EN_LOWBWLOMX_TMX_TRF", "Controls the high pass pole frequency of the RC biasing the gate of the mixer switches" }; +const struct LMS7Parameter EN_NEXTTX_TRF = { 0x0100, 14, 14, 0, "EN_NEXTTX_TRF", "Enables the daisy change LO buffer going from TRF_1 to TRF2" }; +const struct LMS7Parameter EN_AMPHF_PDET_TRF = { 0x0100, 13, 12, 3, "EN_AMPHF_PDET_TRF", "Enables the TXPAD power detector preamplifier" }; +const struct LMS7Parameter LOADR_PDET_TRF = { 0x0100, 11, 10, 1, "LOADR_PDET_TRF", "Controls the resistive load of the Power detector" }; +const struct LMS7Parameter PD_PDET_TRF = { 0x0100, 3, 3, 1, "PD_PDET_TRF", "Powerdown signal for Power Detector" }; +const struct LMS7Parameter PD_TLOBUF_TRF = { 0x0100, 2, 2, 0, "PD_TLOBUF_TRF", "Powerdown signal for TX LO buffer" }; +const struct LMS7Parameter PD_TXPAD_TRF = { 0x0100, 1, 1, 0, "PD_TXPAD_TRF", "Powerdown signal for TXPAD" }; +const struct LMS7Parameter EN_G_TRF = { 0x0100, 0, 0, 1, "EN_G_TRF", "Enable control for all the TRF_1 power downs" }; +const struct LMS7Parameter F_TXPAD_TRF = { 0x0101, 15, 13, 3, "F_TXPAD_TRF", "Controls the switched capacitor at the TXPAD output. Is used for fine tuning of the TXPAD output" }; +const struct LMS7Parameter L_LOOPB_TXPAD_TRF = { 0x0101, 12, 11, 3, "L_LOOPB_TXPAD_TRF", "Controls the loss of the of the loopback path at the TX side" }; +const struct LMS7Parameter LOSS_LIN_TXPAD_TRF = { 0x0101, 10, 6, 0, "LOSS_LIN_TXPAD_TRF", "Controls the gain of the linearizing part of of the TXPAD" }; +const struct LMS7Parameter LOSS_MAIN_TXPAD_TRF = { 0x0101, 5, 1, 0, "LOSS_MAIN_TXPAD_TRF", "Controls the gain output power of the TXPAD" }; +const struct LMS7Parameter EN_LOOPB_TXPAD_TRF = { 0x0101, 0, 0, 0, "EN_LOOPB_TXPAD_TRF", "Enables the TXPAD loopback path" }; +const struct LMS7Parameter GCAS_GNDREF_TXPAD_TRF = { 0x0102, 15, 15, 0, "GCAS_GNDREF_TXPAD_TRF", "Controls if the TXPAD cascode transistor gate bias is referred to VDD or GND" }; +const struct LMS7Parameter ICT_LIN_TXPAD_TRF = { 0x0102, 14, 10, 12, "ICT_LIN_TXPAD_TRF", "Control the bias current of the linearization section of the TXPAD" }; +const struct LMS7Parameter ICT_MAIN_TXPAD_TRF = { 0x0102, 9, 5, 12, "ICT_MAIN_TXPAD_TRF", "Control the bias current of the main gm section of the TXPAD" }; +const struct LMS7Parameter VGCAS_TXPAD_TRF = { 0x0102, 4, 0, 0, "VGCAS_TXPAD_TRF", "Controls the bias voltage at the gate of TXPAD cascade" }; +const struct LMS7Parameter SEL_BAND1_TRF = { 0x0103, 11, 11, 1, "SEL_BAND1_TRF", "" }; +const struct LMS7Parameter SEL_BAND2_TRF = { 0x0103, 10, 10, 0, "SEL_BAND2_TRF", "" }; +const struct LMS7Parameter LOBIASN_TXM_TRF = { 0x0103, 9, 5, 16, "LOBIASN_TXM_TRF", "Controls the bias at the gate of the mixer NMOS" }; +const struct LMS7Parameter LOBIASP_TXX_TRF = { 0x0103, 4, 0, 18, "LOBIASP_TXX_TRF", "Controls the bias at the gate of the mixer PMOS" }; +const struct LMS7Parameter CDC_I_TRF = { 0x0104, 7, 4, 8, "CDC_I_TRF", "" }; +const struct LMS7Parameter CDC_Q_TRF = { 0x0104, 3, 0, 8, "CDC_Q_TRF", "" }; +const struct LMS7Parameter STATPULSE_TBB = { 0x0105, 15, 15, 0, "STATPULSE_TBB", "" }; +const struct LMS7Parameter LOOPB_TBB = { 0x0105, 14, 12, 0, "LOOPB_TBB", "This controls which signal is connected to the loopback output pins. Note: when both the lowpass ladder and real pole are powered down, the output of the active highband biquad is routed to the loopb output" }; +const struct LMS7Parameter PD_LPFH_TBB = { 0x0105, 4, 4, 0, "PD_LPFH_TBB", "This selectively powers down the LPFH_TBB biquad" }; +const struct LMS7Parameter PD_LPFIAMP_TBB = { 0x0105, 3, 3, 0, "PD_LPFIAMP_TBB", "selectively powers down the LPFIAMP_TBB front-end current amp of the transmitter baseband" }; +const struct LMS7Parameter PD_LPFLAD_TBB = { 0x0105, 2, 2, 1, "PD_LPFLAD_TBB", "This selectively powers down the LPFLAD_TBB low pass ladder filter of the transmitter baseband" }; +const struct LMS7Parameter PD_LPFS5_TBB = { 0x0105, 1, 1, 1, "PD_LPFS5_TBB", "This selectively powers down the LPFS5_TBB low pass real-pole filter of the transmitter baseband" }; +const struct LMS7Parameter EN_G_TBB = { 0x0105, 0, 0, 1, "EN_G_TBB", "Enable control for all the TBB_TOP power downs" }; +const struct LMS7Parameter ICT_LPFS5_F_TBB = { 0x0106, 14, 10, 12, "ICT_LPFS5_F_TBB", "This controls the operational amplifier's output stage bias current of the low band real pole filter of the transmitter's baseband" }; +const struct LMS7Parameter ICT_LPFS5_PT_TBB = { 0x0106, 9, 5, 12, "ICT_LPFS5_PT_TBB", "This controls the operational amplifier's input stage bias current of the low band real pole filter of the transmitter's baseband" }; +const struct LMS7Parameter ICT_LPF_H_PT_TBB = { 0x0106, 4, 0, 12, "ICT_LPF_H_PT_TBB", "This controls the operational amplifiers input stage bias reference current of the high band low pass filter of the transmitter's baseband " }; +const struct LMS7Parameter ICT_LPFH_F_TBB = { 0x0107, 14, 10, 12, "ICT_LPFH_F_TBB", "controls the operational amplifiers output stage bias reference current of the high band low pass filter of the transmitter's baseband (LPFH_TBB)" }; +const struct LMS7Parameter ICT_LPFLAD_F_TBB = { 0x0107, 9, 5, 12, "ICT_LPFLAD_F_TBB", "This controls the operational amplfiers' output stages bias referene current of the low band ladder filter of the transmisster's baseband" }; +const struct LMS7Parameter ICT_LPFLAD_PT_TBB = { 0x0107, 4, 0, 12, "ICT_LPFLAD_PT_TBB", "This controls the operational amplifers' input stages bias reference current of the low band ladder filter of the transmitter's baseband" }; +const struct LMS7Parameter CG_IAMP_TBB = { 0x0108, 15, 10, 37, "CG_IAMP_TBB", "This controls the frontend gain of the TBB. For a given gain value, this control value varies with the set TX mode. After resistance calibration, the following table gives the nominal values for each frequency setting. However, this table is to be updated and corrected after calibration" }; +const struct LMS7Parameter ICT_IAMP_FRP_TBB = { 0x0108, 9, 5, 1, "ICT_IAMP_FRP_TBB", "This controls the reference bias current of the IAMP main bias current sources" }; +const struct LMS7Parameter ICT_IAMP_GG_FRP_TBB = { 0x0108, 4, 0, 6, "ICT_IAMP_GG_FRP_TBB", "This controls the reference bias current of the IAMP's cascode transistors gate voltages that set the IAMP's input voltage level. The IAMP's input is connected to the DAC output" }; +const struct LMS7Parameter RCAL_LPFH_TBB = { 0x0109, 15, 8, 97, "RCAL_LPFH_TBB", "This controls the value of the equivalent resistance of the resistor banks of the biquad filter stage (of the high band section) of the transmitter baseband(TBB)" }; +const struct LMS7Parameter RCAL_LPFLAD_TBB = { 0x0109, 7, 0, 193, "RCAL_LPFLAD_TBB", "This controls the value of the equivalent resistance of the resistor banks of the low pass filter ladder (of the low band section) of the transmitter baseband(TBB)" }; +const struct LMS7Parameter TSTIN_TBB = { 0x010A, 15, 14, 0, "TSTIN_TBB", "This control selects where the input test signal (vinp/n_aux_bbq/i) is routed to as well as disabling the route." }; +const struct LMS7Parameter BYPLADDER_TBB = { 0x010A, 13, 13, 0, "BYPLADDER_TBB", "This signal bypasses the LPF ladder of TBB and directly connects the output of current amplifier to the null port of the real pole stage of TBB low pass filter" }; +const struct LMS7Parameter CCAL_LPFLAD_TBB = { 0x010A, 12, 8, 16, "CCAL_LPFLAD_TBB", "A common control signal for all the capacitor banks of TBB filters (including the ladder, real pole, and the high band biquad). It is the calibrated value of the banks control that sets the value of the banks' equivalent capacitor to their respective nominal values" }; +const struct LMS7Parameter RCAL_LPFS5_TBB = { 0x010A, 7, 0, 76, "RCAL_LPFS5_TBB", "This controls the value of the equivalent resistance of the resistor banks of the real pole filter stage (of the low band section) of the transmitter baseband (TBB). Following is a nominal values table that are corrected for any process variation after calibration" }; +const struct LMS7Parameter CDC_I_RFE = { 0x010C, 15, 12, 8, "CDC_I_RFE", "" }; +const struct LMS7Parameter CDC_Q_RFE = { 0x010C, 11, 8, 8, "CDC_Q_RFE", "" }; +const struct LMS7Parameter PD_LNA_RFE = { 0x010C, 7, 7, 1, "PD_LNA_RFE", "Power control signal for LNA_RFE" }; +const struct LMS7Parameter PD_RLOOPB_1_RFE = { 0x010C, 6, 6, 1, "PD_RLOOPB_1_RFE", "Power control signal for RXFE loopback 1" }; +const struct LMS7Parameter PD_RLOOPB_2_RFE = { 0x010C, 5, 5, 1, "PD_RLOOPB_2_RFE", "Power control signal for RXFE loopback 2" }; +const struct LMS7Parameter PD_MXLOBUF_RFE = { 0x010C, 4, 4, 1, "PD_MXLOBUF_RFE", "Power control signal for RXFE mixer lo buffer" }; +const struct LMS7Parameter PD_QGEN_RFE = { 0x010C, 3, 3, 1, "PD_QGEN_RFE", "Power control signal for RXFE Quadrature LO generator" }; +const struct LMS7Parameter PD_RSSI_RFE = { 0x010C, 2, 2, 1, "PD_RSSI_RFE", "Power control signal for RXFE RSSI" }; +const struct LMS7Parameter PD_TIA_RFE = { 0x010C, 1, 1, 0, "PD_TIA_RFE", "Power control signal for RXFE TIA" }; +const struct LMS7Parameter EN_G_RFE = { 0x010C, 0, 0, 1, "EN_G_RFE", "Enable control for all the RFE_1 power downs" }; +const struct LMS7Parameter SEL_PATH_RFE = { 0x010D, 8, 7, 1, "SEL_PATH_RFE", "Selects the active path of the RXFE" }; +const struct LMS7Parameter EN_DCOFF_RXFE_RFE = { 0x010D, 6, 6, 0, "EN_DCOFF_RXFE_RFE", "Enables the DCOFFSET block for the RXFE" }; +const struct LMS7Parameter EN_INSHSW_LB1_RFE = { 0x010D, 4, 4, 1, "EN_INSHSW_LB1_RFE", "Enables the input shorting switch at the input of the loopback 1 (in parallel with LNAL mixer)" }; +const struct LMS7Parameter EN_INSHSW_LB2_RFE = { 0x010D, 3, 3, 1, "EN_INSHSW_LB2_RFE", "Enables the input shorting switch at the input of the loopback 2 (in parallel with LNAW mixer)" }; +const struct LMS7Parameter EN_INSHSW_L_RFE = { 0x010D, 2, 2, 1, "EN_INSHSW_L_RFE", "Enables the input shorting switch at the input of the LNAL" }; +const struct LMS7Parameter EN_INSHSW_W_RFE = { 0x010D, 1, 1, 1, "EN_INSHSW_W_RFE", "Enables the input shorting switch at the input of the LNAW" }; +const struct LMS7Parameter EN_NEXTRX_RFE = { 0x010D, 0, 0, 0, "EN_NEXTRX_RFE", "Enables the daisy chain LO buffer going from RXFE1 to RXFE2" }; +const struct LMS7Parameter DCOFFI_RFE = { 0x010E, 13, 7, 64, "DCOFFI_RFE", "Controls DC offset at the output of the TIA by injecting current to the input of the TIA (I side)" }; +const struct LMS7Parameter DCOFFQ_RFE = { 0x010E, 6, 0, 64, "DCOFFQ_RFE", "Controls DC offset at the output of the TIA by injecting current to the input of the TIA (Q side)" }; +const struct LMS7Parameter ICT_LOOPB_RFE = { 0x010F, 14, 10, 12, "ICT_LOOPB_RFE", "Controls the reference current of the RXFE loopback amplifier" }; +const struct LMS7Parameter ICT_TIAMAIN_RFE = { 0x010F, 9, 5, 2, "ICT_TIAMAIN_RFE", "Controls the reference current of the RXFE TIA first stage" }; +const struct LMS7Parameter ICT_TIAOUT_RFE = { 0x010F, 4, 0, 2, "ICT_TIAOUT_RFE", "Controls the reference current of the RXFE TIA 2nd stage" }; +const struct LMS7Parameter ICT_LNACMO_RFE = { 0x0110, 14, 10, 2, "ICT_LNACMO_RFE", "Controls the current generating LNA output common mode voltage" }; +const struct LMS7Parameter ICT_LNA_RFE = { 0x0110, 9, 5, 31, "ICT_LNA_RFE", "Controls the current of the LNA core" }; +const struct LMS7Parameter ICT_LODC_RFE = { 0x0110, 4, 0, 20, "ICT_LODC_RFE", "Controls the DC of the mixer LO signal at the gate of the mixer switches" }; +const struct LMS7Parameter CAP_RXMXO_RFE = { 0x0111, 9, 5, 4, "CAP_RXMXO_RFE", "Control the decoupling cap at the output of the RX Mixer" }; +const struct LMS7Parameter CGSIN_LNA_RFE = { 0x0111, 4, 0, 3, "CGSIN_LNA_RFE", "Controls the cap parallel with the LNA input input NMOS CGS to control the Q of the maching circuit and provides trade off between gain/NF and IIP. The higher the frequency, the lower CGSIN_LNA_RFE should be. Also, the higher CGSIN, the lower the Q, The lower the gain, the higher the NF, and the higher the IIP3" }; +const struct LMS7Parameter CCOMP_TIA_RFE = { 0x0112, 15, 12, 12, "CCOMP_TIA_RFE", "Compensation capacitor for TIA" }; +const struct LMS7Parameter CFB_TIA_RFE = { 0x0112, 11, 0, 230, "CFB_TIA_RFE", "Feeback capacitor for TIA. Controls the 3dB BW of the TIA. Should be set with calibration through digital baseband" }; +const struct LMS7Parameter G_LNA_RFE = { 0x0113, 9, 6, 15, "G_LNA_RFE", "Controls the gain of the LNA" }; +const struct LMS7Parameter G_RXLOOPB_RFE = { 0x0113, 5, 2, 0, "G_RXLOOPB_RFE", "Controls RXFE loopback gain" }; +const struct LMS7Parameter G_TIA_RFE = { 0x0113, 1, 0, 3, "G_TIA_RFE", "Controls the Gain of the TIA" }; +const struct LMS7Parameter RCOMP_TIA_RFE = { 0x0114, 8, 5, 4, "RCOMP_TIA_RFE", "Controls the compensation resistors of the TIA opamp" }; +const struct LMS7Parameter RFB_TIA_RFE = { 0x0114, 4, 0, 13, "RFB_TIA_RFE", "Sets the feedback resistor to the nominal value" }; +const struct LMS7Parameter EN_LB_LPFH_RBB = { 0x0115, 15, 15, 0, "EN_LB_LPFH_RBB", "" }; +const struct LMS7Parameter EN_LB_LPFL_RBB = { 0x0115, 14, 14, 0, "EN_LB_LPFL_RBB", "" }; +const struct LMS7Parameter PD_LPFH_RBB = { 0x0115, 3, 3, 1, "PD_LPFH_RBB", "Power down of the LPFH block" }; +const struct LMS7Parameter PD_LPFL_RBB = { 0x0115, 2, 2, 0, "PD_LPFL_RBB", "Power down of the LPFL block" }; +const struct LMS7Parameter PD_PGA_RBB = { 0x0115, 1, 1, 0, "PD_PGA_RBB", "Power down of the PGA block" }; +const struct LMS7Parameter EN_G_RBB = { 0x0115, 0, 0, 1, "EN_G_RBB", "Enable control for all the RBB_1 power downs" }; +const struct LMS7Parameter R_CTL_LPF_RBB = { 0x0116, 15, 11, 16, "R_CTL_LPF_RBB", "Controls the absolute value of the resistance of the RC time constant of the RBB_LPF blocks (both Low and High)" }; +const struct LMS7Parameter RCC_CTL_LPFH_RBB = { 0x0116, 10, 8, 1, "RCC_CTL_LPFH_RBB", "Controls the stability passive compensation of the LPFH_RBB operational amplifier" }; +const struct LMS7Parameter C_CTL_LPFH_RBB = { 0x0116, 7, 0, 128, "C_CTL_LPFH_RBB", "Controls the capacitance value of the RC time constant of RBB_LPFH and it varies with the respective rxMode from 37MHz to 108MHz" }; +const struct LMS7Parameter RCC_CTL_LPFL_RBB = { 0x0117, 13, 11, 5, "RCC_CTL_LPFL_RBB", "Controls the stability passive compensation of the LPFL_RBB operational amplifier" }; +const struct LMS7Parameter C_CTL_LPFL_RBB = { 0x0117, 10, 0, 12, "C_CTL_LPFL_RBB", "Controls the capacitance value of the RC time constant of RBB_LPFH and it varies with the respective rxMode from 1.4MHz to 20MHz." }; +const struct LMS7Parameter INPUT_CTL_PGA_RBB = { 0x0118, 15, 13, 0, "INPUT_CTL_PGA_RBB", "There are a total of four different differential inputs to the PGA. Only one of them is active at a time" }; +const struct LMS7Parameter ICT_LPF_IN_RBB = { 0x0118, 9, 5, 12, "ICT_LPF_IN_RBB", "Controls the reference bias current of the input stage of the operational amplifier used in RBB_LPF blocks (Low or High). " }; +const struct LMS7Parameter ICT_LPF_OUT_RBB = { 0x0118, 4, 0, 12, "ICT_LPF_OUT_RBB", "The reference bias current of the output stage of the operational amplifier used in RBB_LPF blocks (low or High)" }; +const struct LMS7Parameter OSW_PGA_RBB = { 0x0119, 15, 15, 0, "OSW_PGA_RBB", "There are two instances of the PGA circuit in the design. The output of the RBB_LPF blocks are connected the input of these PGA blocks (common). The output of one of them is connected to two pads pgaoutn and pgaoutp and the output of the other PGA is connected directly to the ADC input" }; +const struct LMS7Parameter ICT_PGA_OUT_RBB = { 0x0119, 14, 10, 6, "ICT_PGA_OUT_RBB", "Controls the output stage reference bias current of the operational amplifier used in the PGA circuit" }; +const struct LMS7Parameter ICT_PGA_IN_RBB = { 0x0119, 9, 5, 6, "ICT_PGA_IN_RBB", "Controls the input stage reference bias current of the operational amplifier used in the PGA circuit" }; +const struct LMS7Parameter G_PGA_RBB = { 0x0119, 4, 0, 11, "G_PGA_RBB", "This is the gain of the PGA" }; +const struct LMS7Parameter RCC_CTL_PGA_RBB = { 0x011A, 13, 9, 23, "RCC_CTL_PGA_RBB", "Controls the stability passive compensation of the PGA_RBB operational amplifier" }; +const struct LMS7Parameter C_CTL_PGA_RBB = { 0x011A, 6, 0, 2, "C_CTL_PGA_RBB", "Control the value of the feedback capacitor of the PGA that is used to help against the parasitic cap at the virtual node for stability" }; +const struct LMS7Parameter RESET_N = { 0x011C, 15, 15, 1, "RESET_N", "Resets SX. A pulse should be used in the start-up to reset" }; +const struct LMS7Parameter SPDUP_VCO = { 0x011C, 14, 14, 0, "SPDUP_VCO", "Bypasses the noise filter resistor for fast settling time. It should be connected to a 1uS pulse" }; +const struct LMS7Parameter BYPLDO_VCO = { 0x011C, 13, 13, 1, "BYPLDO_VCO", "Controls the bypass signal for the SX LDO" }; +const struct LMS7Parameter EN_COARSEPLL = { 0x011C, 12, 12, 0, "EN_COARSEPLL", "Enable signal for coarse tuning block" }; +const struct LMS7Parameter CURLIM_VCO = { 0x011C, 11, 11, 1, "CURLIM_VCO", "Enables the output current limitation in the VCO regulator" }; +const struct LMS7Parameter EN_DIV2_DIVPROG = { 0x011C, 10, 10, 1, "EN_DIV2_DIVPROG", "" }; +const struct LMS7Parameter EN_INTONLY_SDM = { 0x011C, 9, 9, 0, "EN_INTONLY_SDM", "Enables INTEGER-N mode of the SX " }; +const struct LMS7Parameter EN_SDM_CLK = { 0x011C, 8, 8, 1, "EN_SDM_CLK", "Enables/Disables SDM clock. In INT-N mode or for noise testing, SDM clock can be disabled" }; +const struct LMS7Parameter PD_FBDIV = { 0x011C, 7, 7, 0, "PD_FBDIV", "Power down the feedback divider block" }; +const struct LMS7Parameter PD_LOCH_T2RBUF = { 0x011C, 6, 6, 1, "PD_LOCH_T2RBUF", "Power down for LO buffer from SXT to SXR. To be active only in the TDD mode" }; +const struct LMS7Parameter PD_CP = { 0x011C, 5, 5, 0, "PD_CP", "Power down for Charge Pump" }; +const struct LMS7Parameter PD_FDIV = { 0x011C, 4, 4, 0, "PD_FDIV", "Power down for feedback frequency and forward dividers" }; +const struct LMS7Parameter PD_SDM = { 0x011C, 3, 3, 0, "PD_SDM", "Power down for SDM" }; +const struct LMS7Parameter PD_VCO_COMP = { 0x011C, 2, 2, 0, "PD_VCO_COMP", "Power down for VCO comparator" }; +const struct LMS7Parameter PD_VCO = { 0x011C, 1, 1, 1, "PD_VCO", "Power down for VCO" }; +const struct LMS7Parameter EN_G = { 0x011C, 0, 0, 1, "EN_G", "Enable control for all the SXT power downs" }; +const struct LMS7Parameter FRAC_SDM_LSB = { 0x011D, 15, 0, 0x0400, "FRAC_SDM_LSB", "" }; +const struct LMS7Parameter INT_SDM = { 0x011E, 13, 4, 120, "INT_SDM", "" }; +const struct LMS7Parameter FRAC_SDM_MSB = { 0x011E, 3, 0, 0, "FRAC_SDM_MSB", "" }; +const struct LMS7Parameter PW_DIV2_LOCH = { 0x011F, 14, 12, 3, "PW_DIV2_LOCH", "trims the duty cycle of DIV2 LOCH. Only works when forward divider is dividing by at least 2 (excluding quadrature block division). If in bypass mode, this does not work" }; +const struct LMS7Parameter PW_DIV4_LOCH = { 0x011F, 11, 9, 3, "PW_DIV4_LOCH", "trims the duty cycle of DIV4 LOCH. Only works when forward divider is dividing by at least 4 (excluding quadrature block division). If in bypass mode, this does not work" }; +const struct LMS7Parameter DIV_LOCH = { 0x011F, 8, 6, 1, "DIV_LOCH", "Controls the division ratio in the LOCH_DIV" }; +const struct LMS7Parameter TST_SX = { 0x011F, 5, 3, 0, "TST_SX", +"Controls the test mode of PLLs. TST signal lines are shared between all PLLs (CGEN, RX and TX). Only one TST signal of any PLL should be active at a given time.\n\ +0 - TST disabled; RSSI analog outputs enabled if RSSI blocks active and when all PLL test signals are off(default)\n\ +1 - tstdo[0] = VCO / 20 clock*; tstdo[1] = VCO / 40 clock*; tstao = High impedance;\n\ +2 - tstdo[0] = SDM clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 60kOhm resistor;\n\ +3 - tstdo[0] = Reference clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 10kOhm resistor;\n\ +4 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = High impedance;\n\ +5 - tstdo[0] = Charge pump Down signal; tstdo[1] = Charge pump Up signal; tstao = High impedance;\n\ +6 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 60kOhm resistor;\n\ +7 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 10kOhm resistor;\n\ +if TST_SX[2] = 1 --> VCO_TSTBUF active generating VCO_TST_DIV20 and VCO_TST_DIV40\n\ +* When EN_DIV2_DIVPROG_(SXR, SXT) is active, the division ratio must be multiplied by 2 (40 / 80)"}; +const struct LMS7Parameter SEL_SDMCLK = { 0x011F, 2, 2, 0, "SEL_SDMCLK", "Selects between the feedback divider output and Fref for SDM" }; +const struct LMS7Parameter SX_DITHER_EN = { 0x011F, 1, 1, 0, "SX_DITHER_EN", "Enabled dithering in SDM" }; +const struct LMS7Parameter REV_SDMCLK = { 0x011F, 0, 0, 0, "REV_SDMCLK", "Reverses the SDM clock" }; +const struct LMS7Parameter VDIV_VCO = { 0x0120, 15, 8, 185, "VDIV_VCO", "Controls VCO LDO output voltage" }; +const struct LMS7Parameter ICT_VCO = { 0x0120, 7, 0, 255, "ICT_VCO", "Scales the VCO bias current from 0 to 2.5xInom" }; +const struct LMS7Parameter RSEL_LDO_VCO = { 0x0121, 15, 11, 6, "RSEL_LDO_VCO", "Set the reference voltage that supplies bias voltage of switch-cap array and varactor" }; +const struct LMS7Parameter CSW_VCO = { 0x0121, 10, 3, 128, "CSW_VCO", "Coarse control of VCO frequency, 0 for lowest frequency and 255 for highest. This control is set by SX_SWC_calibration" }; +const struct LMS7Parameter SEL_VCO = { 0x0121, 2, 1, 2, "SEL_VCO", "Selects the active VCO. It is set by SX_SWC_calibration" }; +const struct LMS7Parameter COARSE_START = { 0x0121, 0, 0, 0, "COARSE_START", "" }; +const struct LMS7Parameter REVPH_PFD = { 0x0122, 12, 12, 0, "REVPH_PFD", "Reverse the pulses of PFD. It can be used to reverse the polarity of the PLL loop (positive feedback to negative feedback)" }; +const struct LMS7Parameter IOFFSET_CP = { 0x0122, 11, 6, 12, "IOFFSET_CP", "Scales the offset current of the charge pump, 0-->63. This current is used in Fran-N mode to create an offset in the CP response and avoid the non-linear section" }; +const struct LMS7Parameter IPULSE_CP = { 0x0122, 5, 0, 63, "IPULSE_CP", "Scales the pulse current of the charge pump" }; +const struct LMS7Parameter COARSE_STEPDONE = { 0x0123, 15, 15, 0, "COARSE_STEPDONE", "" }; +const struct LMS7Parameter COARSEPLL_COMPO = { 0x0123, 14, 14, 0, "COARSEPLL_COMPO", "" }; +const struct LMS7Parameter VCO_CMPHO = { 0x0123, 13, 13, 0, "VCO_CMPHO", "" }; +const struct LMS7Parameter VCO_CMPLO = { 0x0123, 12, 12, 0, "VCO_CMPLO", "" }; +const struct LMS7Parameter CP2_PLL = { 0x0123, 11, 8, 6, "CP2_PLL", "Controls the value of CP2 (cap from CP output to GND) in the PLL filter" }; +const struct LMS7Parameter CP3_PLL = { 0x0123, 7, 4, 7, "CP3_PLL", "Controls the value of CP3 (cap from VCO Vtune input to GND) in the PLL filter" }; +const struct LMS7Parameter CZ = { 0x0123, 3, 0, 11, "CZ", "Controls the value of CZ (Zero capacitor) in the PLL filter" }; +const struct LMS7Parameter EN_DIR_SXRSXT = { 0x0124, 4, 4, 0, "EN_DIR_SXRSXT", "Enables direct control of PDs and ENs for SXR/SXT module" }; +const struct LMS7Parameter EN_DIR_RBB = { 0x0124, 3, 3, 0, "EN_DIR_RBB", "Enables direct control of PDs and ENs for RBB module" }; +const struct LMS7Parameter EN_DIR_RFE = { 0x0124, 2, 2, 0, "EN_DIR_RFE", "Enables direct control of PDs and ENs for RFE module" }; +const struct LMS7Parameter EN_DIR_TBB = { 0x0124, 1, 1, 0, "EN_DIR_TBB", "Enables direct control of PDs and ENs for TBB module" }; +const struct LMS7Parameter EN_DIR_TRF = { 0x0124, 0, 0, 0, "EN_DIR_TRF", "Enables direct control of PDs and ENs for TRF module" }; +const struct LMS7Parameter TSGFC_TXTSP = { 0x0200, 9, 9, 0, "TSGFC_TXTSP", "TSG full scale control" }; +const struct LMS7Parameter TSGFCW_TXTSP = { 0x0200, 8, 7, 1, "TSGFCW_TXTSP", "Set frequency of TSG's NCO" }; +const struct LMS7Parameter TSGDCLDQ_TXTSP = { 0x0200, 6, 6, 0, "TSGDCLDQ_TXTSP", "" }; +const struct LMS7Parameter TSGDCLDI_TXTSP = { 0x0200, 5, 5, 0, "TSGDCLDI_TXTSP", "" }; +const struct LMS7Parameter TSGSWAPIQ_TXTSP = { 0x0200, 4, 4, 0, "TSGSWAPIQ_TXTSP", "Swap signals at test signal generator's output" }; +const struct LMS7Parameter TSGMODE_TXTSP = { 0x0200, 3, 3, 0, "TSGMODE_TXTSP", "Test signal generator mode" }; +const struct LMS7Parameter INSEL_TXTSP = { 0x0200, 2, 2, 0, "INSEL_TXTSP", "Input source of TxTSP" }; +const struct LMS7Parameter BSTART_TXTSP = { 0x0200, 1, 1, 0, "BSTART_TXTSP", "Starts delta sigma built in self test. Keep it at 1 one at least three clock cycles" }; +const struct LMS7Parameter EN_TXTSP = { 0x0200, 0, 0, 1, "EN_TXTSP", "TxTSP modules enable" }; +const struct LMS7Parameter GCORRQ_TXTSP = { 0x0201, 10, 0, 2047, "GCORRQ_TXTSP", "corrector value, channel Q Unsigned integer" }; +const struct LMS7Parameter GCORRI_TXTSP = { 0x0202, 10, 0, 2047, "GCORRI_TXTSP", "corrector value, channel I Unsigned integer" }; +const struct LMS7Parameter HBI_OVR_TXTSP = { 0x0203, 14, 12, 0, "HBI_OVR_TXTSP", "HBI interpolation ratio" }; +const struct LMS7Parameter IQCORR_TXTSP = { 0x0203, 11, 0, 0, "IQCORR_TXTSP", "Phase corrector value (tan(Alpha/2)). Integer, 2's complement" }; +const struct LMS7Parameter DCCORRI_TXTSP = { 0x0204, 15, 8, 0, "DCCORRI_TXTSP", "DC corrector value, channel I. Integer, 2's complement" }; +const struct LMS7Parameter DCCORRQ_TXTSP = { 0x0204, 7, 0, 0, "DCCORRQ_TXTSP", "DC corrector value, channel Q. Integer, 2's complement" }; +const struct LMS7Parameter GFIR1_L_TXTSP = { 0x0205, 10, 8, 0, "GFIR1_L_TXTSP", "Parameter l of GFIR1 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; +const struct LMS7Parameter GFIR1_N_TXTSP = { 0x0205, 7, 0, 0, "GFIR1_N_TXTSP", "Clock division ratio of GFIR1 is GFIR1_N + 1. Unsigned integer" }; +const struct LMS7Parameter GFIR2_L_TXTSP = { 0x0206, 10, 8, 0, "GFIR2_L_TXTSP", "Parameter l of GFIR2 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; +const struct LMS7Parameter GFIR2_N_TXTSP = { 0x0206, 7, 0, 0, "GFIR2_N_TXTSP", "Clock division ratio of GFIR2 is GFIR2_N + 1. Unsigned integer" }; +const struct LMS7Parameter GFIR3_L_TXTSP = { 0x0207, 10, 8, 0, "GFIR3_L_TXTSP", "Parameter l of GFIR3 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; +const struct LMS7Parameter GFIR3_N_TXTSP = { 0x0207, 7, 0, 0, "GFIR3_N_TXTSP", "Clock division ratio of GFIR3 is GFIR3_N + 1. Unsigned integer" }; +const struct LMS7Parameter CMIX_GAIN_TXTSP = { 0x0208, 15, 14, 0, "CMIX_GAIN_TXTSP", "Gain of CMIX output" }; +const struct LMS7Parameter CMIX_SC_TXTSP = { 0x0208, 13, 13, 0, "CMIX_SC_TXTSP", "Spectrum control of CMIX" }; +const struct LMS7Parameter CMIX_BYP_TXTSP = { 0x0208, 8, 8, 0, "CMIX_BYP_TXTSP", "CMIX bypass" }; +const struct LMS7Parameter ISINC_BYP_TXTSP = { 0x0208, 7, 7, 0, "ISINC_BYP_TXTSP", "ISINC bypass" }; +const struct LMS7Parameter GFIR3_BYP_TXTSP = { 0x0208, 6, 6, 0, "GFIR3_BYP_TXTSP", "GFIR3 bypass" }; +const struct LMS7Parameter GFIR2_BYP_TXTSP = { 0x0208, 5, 5, 0, "GFIR2_BYP_TXTSP", "GFIR2 bypass" }; +const struct LMS7Parameter GFIR1_BYP_TXTSP = { 0x0208, 4, 4, 0, "GFIR1_BYP_TXTSP", "GFIR1 bypass" }; +const struct LMS7Parameter DC_BYP_TXTSP = { 0x0208, 3, 3, 0, "DC_BYP_TXTSP", "DC corrector bypass" }; +const struct LMS7Parameter GC_BYP_TXTSP = { 0x0208, 1, 1, 0, "GC_BYP_TXTSP", "Gain corrector bypass" }; +const struct LMS7Parameter PH_BYP_TXTSP = { 0x0208, 0, 0, 0, "PH_BYP_TXTSP", "Phase corrector bypass" }; +const struct LMS7Parameter BSIGI_TXTSP = { 0x0209, 23, 1, 0, "BSIGI_TXTSP", "" }; +const struct LMS7Parameter BSTATE_TXTSP = { 0x0209, 0, 0, 0, "BSTATE_TXTSP", "" }; +const struct LMS7Parameter BSIGQ_TXTSP = { 0x020A, 30, 8, 0, "BSIGQ_TXTSP", "" }; +const struct LMS7Parameter DC_REG_TXTSP = { 0x020C, 15, 0, 0, "DC_REG_TXTSP", "" }; +const struct LMS7Parameter DTHBIT_TX = { 0x0240, 8, 5, 1, "DTHBIT_TX", "NCO bits to dither" }; +const struct LMS7Parameter SEL_TX = { 0x0240, 4, 1, 0, "SEL_TX", "" }; +const struct LMS7Parameter MODE_TX = { 0x0240, 0, 0, 0, "MODE_TX", "" }; +const struct LMS7Parameter CAPTURE = { 0x0400, 15, 15, 0, "CAPTURE", "" }; +const struct LMS7Parameter CAPSEL = { 0x0400, 14, 13, 0, "CAPSEL", "" }; +const struct LMS7Parameter CAPSEL_ADC = { 0x0400, 12, 12, 0, "CAPSEL_ADC", "" }; +const struct LMS7Parameter TSGFC_RXTSP = { 0x0400, 9, 9, 0, "TSGFC_RXTSP", "TSG full scale control" }; +const struct LMS7Parameter TSGFCW_RXTSP = { 0x0400, 8, 7, 1, "TSGFCW_RXTSP", "Set frequency of TSG's NCO" }; +const struct LMS7Parameter TSGDCLDQ_RXTSP = { 0x0400, 6, 6, 0, "TSGDCLDQ_RXTSP", "" }; +const struct LMS7Parameter TSGDCLDI_RXTSP = { 0x0400, 5, 5, 0, "TSGDCLDI_RXTSP", "" }; +const struct LMS7Parameter TSGSWAPIQ_RXTSP = { 0x0400, 4, 4, 0, "TSGSWAPIQ_RXTSP", "Swap signals at test signal generator's output" }; +const struct LMS7Parameter TSGMODE_RXTSP = { 0x0400, 3, 3, 0, "TSGMODE_RXTSP", "Test signal generator mode" }; +const struct LMS7Parameter INSEL_RXTSP = { 0x0400, 2, 2, 0, "INSEL_RXTSP", "Input source of RxTSP" }; +const struct LMS7Parameter BSTART_RXTSP = { 0x0400, 1, 1, 0, "BSTART_RXTSP", "Starts delta sigma built in self test. Keep it at 1 one at least three clock cycles" }; +const struct LMS7Parameter EN_RXTSP = { 0x0400, 0, 0, 1, "EN_RXTSP", "RxTSP modules enable" }; +const struct LMS7Parameter GCORRQ_RXTSP = { 0x0401, 10, 0, 2047, "GCORRQ_RXTSP", "corrector value, channel Q Unsigned integer" }; +const struct LMS7Parameter GCORRI_RXTSP = { 0x0402, 10, 0, 2047, "GCORRI_RXTSP", "corrector value, channel I Unsigned integer" }; +const struct LMS7Parameter HBD_OVR_RXTSP = { 0x0403, 14, 12, 0, "HBD_OVR_RXTSP", "HBD interpolation ratio. Interpolation ratio is 2HBD_OVR+1" }; +const struct LMS7Parameter IQCORR_RXTSP = { 0x0403, 11, 0, 0, "IQCORR_RXTSP", "Phase corrector value (tan(Alpha/2)). Integer, 2's complement" }; +const struct LMS7Parameter HBD_DLY = { 0x0404, 15, 13, 0, "HBD_DLY", "" }; +const struct LMS7Parameter DCLOOP_BYP = { 0x0404, 8, 8, 0, "DCLOOP_BYP", "" }; +const struct LMS7Parameter DCCORR_AVG_RXTSP = { 0x0404, 2, 0, 0, "DCCORR_AVG_RXTSP", "Number of samples to average for Automatic DC corrector. Number of samples to average is 2DCCORR_AVG + 12" }; +const struct LMS7Parameter GFIR1_L_RXTSP = { 0x0405, 10, 8, 0, "GFIR1_L_RXTSP", "Parameter l of GFIR1 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; +const struct LMS7Parameter GFIR1_N_RXTSP = { 0x0405, 7, 0, 0, "GFIR1_N_RXTSP", "Clock division ratio of GFIR1 is GFIR1_N + 1. Unsigned integer" }; +const struct LMS7Parameter GFIR2_L_RXTSP = { 0x0406, 10, 8, 0, "GFIR2_L_RXTSP", "Parameter l of GFIR2 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; +const struct LMS7Parameter GFIR2_N_RXTSP = { 0x0406, 7, 0, 0, "GFIR2_N_RXTSP", "Clock division ratio of GFIR2 is GFIR2_N + 1. Unsigned integer" }; +const struct LMS7Parameter GFIR3_L_RXTSP = { 0x0407, 10, 8, 0, "GFIR3_L_RXTSP", "Parameter l of GFIR3 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; +const struct LMS7Parameter GFIR3_N_RXTSP = { 0x0407, 7, 0, 0, "GFIR3_N_RXTSP", "Clock division ratio of GFIR3 is GFIR3_N + 1. Unsigned integer" }; +const struct LMS7Parameter AGC_K_RXTSP = { 0x0408, 17, 0, 0, "AGC_K_RXTSP", "AGC loop gain" }; +const struct LMS7Parameter AGC_ADESIRED_RXTSP = { 0x0409, 15, 4, 0, "AGC_ADESIRED_RXTSP", "AGC_ADESIRED" }; +const struct LMS7Parameter RSSI_MODE = { 0x040A, 15, 14, 0, "RSSI_MODE", "" }; +const struct LMS7Parameter AGC_MODE_RXTSP = { 0x040A, 13, 12, 0, "AGC_MODE_RXTSP", "" }; +const struct LMS7Parameter AGC_AVG_RXTSP = { 0x040A, 2, 0, 0, "AGC_AVG_RXTSP", "AGC Averaging window size" }; +const struct LMS7Parameter DC_REG_RXTSP = { 0x040B, 15, 0, 0, "DC_REG_RXTSP", "" }; +const struct LMS7Parameter CMIX_GAIN_RXTSP = { 0x040C, 15, 14, 0, "CMIX_GAIN_RXTSP", "Gain of CMIX output" }; +const struct LMS7Parameter CMIX_SC_RXTSP = { 0x040C, 13, 13, 0, "CMIX_SC_RXTSP", "Spectrum control of CMIX" }; +const struct LMS7Parameter CMIX_BYP_RXTSP = { 0x040C, 7, 7, 0, "CMIX_BYP_RXTSP", "CMIX bypass" }; +const struct LMS7Parameter AGC_BYP_RXTSP = { 0x040C, 6, 6, 0, "AGC_BYP_RXTSP", "AGC bypass" }; +const struct LMS7Parameter GFIR3_BYP_RXTSP = { 0x040C, 5, 5, 0, "GFIR3_BYP_RXTSP", "GFIR3 bypass" }; +const struct LMS7Parameter GFIR2_BYP_RXTSP = { 0x040C, 4, 4, 0, "GFIR2_BYP_RXTSP", "GFIR2 bypass" }; +const struct LMS7Parameter GFIR1_BYP_RXTSP = { 0x040C, 3, 3, 0, "GFIR1_BYP_RXTSP", "GFIR1 bypass" }; +const struct LMS7Parameter DC_BYP_RXTSP = { 0x040C, 2, 2, 0, "DC_BYP_RXTSP", "DC corrector bypass" }; +const struct LMS7Parameter GC_BYP_RXTSP = { 0x040C, 1, 1, 0, "GC_BYP_RXTSP", "Gain corrector bypass" }; +const struct LMS7Parameter PH_BYP_RXTSP = { 0x040C, 0, 0, 0, "PH_BYP_RXTSP", "Phase corrector bypass" }; +const struct LMS7Parameter CAPD = { 0x040E, 31, 0, 0, "CAPD", "" }; +const struct LMS7Parameter DTHBIT_RX = { 0x0440, 8, 5, 1, "DTHBIT_RX", "NCO bits to dither" }; +const struct LMS7Parameter SEL_RX = { 0x0440, 4, 1, 0, "SEL_RX", "" }; +const struct LMS7Parameter MODE_RX = { 0x0440, 0, 0, 0, "MODE_RX", "" }; diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h new file mode 100644 index 0000000000..3fc4e0be6b --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h @@ -0,0 +1,613 @@ +/** +@file LMS7002M_parameters.h +@author Lime Microsystems (www.limemicro.com) +@brief List of LMS7002M transceiver control parameters +*/ + +#ifndef LMS7002M_PARAMETERS_H +#define LMS7002M_PARAMETERS_H + +#include "typedefs.h" +#include + +struct LMS7Parameter; +extern std::vector LMS7parameterList; + +struct LMS7Parameter +{ + LMS7Parameter() : address(0), msb(0), lsb(0), defaultValue(0), name(nullptr), tooltip(nullptr) + { + } + + LMS7Parameter(uint16_t address, uint8_t msb, uint8_t lsb, uint16_t defaultValue, const char *name, const char* tooltip) + : address(address), msb(msb), lsb(lsb), defaultValue(defaultValue), name(name), tooltip(tooltip) + { + LMS7parameterList.push_back(this); + } + + uint16_t address; + uint8_t msb; + uint8_t lsb; + uint16_t defaultValue; + const char* name; + const char* tooltip; + inline bool operator==(const LMS7Parameter& obj) + { + if (address == obj.address && msb == obj.msb && lsb == obj.lsb) + return true; + return false; + }; +}; + +extern const struct LMS7Parameter LRST_TX_B; +extern const struct LMS7Parameter MRST_TX_B; +extern const struct LMS7Parameter LRST_TX_A; +extern const struct LMS7Parameter MRST_TX_A; +extern const struct LMS7Parameter LRST_RX_B; +extern const struct LMS7Parameter MRST_RX_B; +extern const struct LMS7Parameter LRST_RX_A; +extern const struct LMS7Parameter MRST_RX_A; +extern const struct LMS7Parameter SRST_RXFIFO; +extern const struct LMS7Parameter SRST_TXFIFO; +extern const struct LMS7Parameter RXEN_B; +extern const struct LMS7Parameter RXEN_A; +extern const struct LMS7Parameter TXEN_B; +extern const struct LMS7Parameter TXEN_A; +extern const struct LMS7Parameter MAC; +extern const struct LMS7Parameter TX_CLK_PE; +extern const struct LMS7Parameter RX_CLK_PE; +extern const struct LMS7Parameter SDA_PE; +extern const struct LMS7Parameter SDA_DS; +extern const struct LMS7Parameter SCL_PE; +extern const struct LMS7Parameter SCL_DS; +extern const struct LMS7Parameter SDIO_DS; +extern const struct LMS7Parameter SDIO_PE; +extern const struct LMS7Parameter SDO_PE; +extern const struct LMS7Parameter SCLK_PE; +extern const struct LMS7Parameter SEN_PE; +extern const struct LMS7Parameter SPIMODE; +extern const struct LMS7Parameter DIQ2_DS; +extern const struct LMS7Parameter DIQ2_PE; +extern const struct LMS7Parameter IQ_SEL_EN_2_PE; +extern const struct LMS7Parameter TXNRX2_PE; +extern const struct LMS7Parameter FCLK2_PE; +extern const struct LMS7Parameter MCLK2_PE; +extern const struct LMS7Parameter DIQ1_DS; +extern const struct LMS7Parameter DIQ1_PE; +extern const struct LMS7Parameter IQ_SEL_EN_1_PE; +extern const struct LMS7Parameter TXNRX1_PE; +extern const struct LMS7Parameter FCLK1_PE; +extern const struct LMS7Parameter MCLK1_PE; +extern const struct LMS7Parameter DIQDIRCTR2; +extern const struct LMS7Parameter DIQDIR2; +extern const struct LMS7Parameter DIQDIRCTR1; +extern const struct LMS7Parameter DIQDIR1; +extern const struct LMS7Parameter ENABLEDIRCTR2; +extern const struct LMS7Parameter ENABLEDIR2; +extern const struct LMS7Parameter ENABLEDIRCTR1; +extern const struct LMS7Parameter ENABLEDIR1; +extern const struct LMS7Parameter MOD_EN; +extern const struct LMS7Parameter LML2_FIDM; +extern const struct LMS7Parameter LML2_TXNRXIQ; +extern const struct LMS7Parameter LML2_MODE; +extern const struct LMS7Parameter LML1_FIDM; +extern const struct LMS7Parameter LML1_TXNRXIQ; +extern const struct LMS7Parameter LML1_MODE; +extern const struct LMS7Parameter LML1_S3S; +extern const struct LMS7Parameter LML1_S2S; +extern const struct LMS7Parameter LML1_S1S; +extern const struct LMS7Parameter LML1_S0S; +extern const struct LMS7Parameter LML1_BQP; +extern const struct LMS7Parameter LML1_BIP; +extern const struct LMS7Parameter LML1_AQP; +extern const struct LMS7Parameter LML1_AIP; +extern const struct LMS7Parameter LML1_BB2RF_PST; +extern const struct LMS7Parameter LML1_BB2RF_PRE; +extern const struct LMS7Parameter LML1_RF2BB_PST; +extern const struct LMS7Parameter LML1_RF2BB_PRE; +extern const struct LMS7Parameter LML2_S3S; +extern const struct LMS7Parameter LML2_S2S; +extern const struct LMS7Parameter LML2_S1S; +extern const struct LMS7Parameter LML2_S0S; +extern const struct LMS7Parameter LML2_BQP; +extern const struct LMS7Parameter LML2_BIP; +extern const struct LMS7Parameter LML2_AQP; +extern const struct LMS7Parameter LML2_AIP; +extern const struct LMS7Parameter LML2_BB2RF_PST; +extern const struct LMS7Parameter LML2_BB2RF_PRE; +extern const struct LMS7Parameter LML2_RF2BB_PST; +extern const struct LMS7Parameter LML2_RF2BB_PRE; +extern const struct LMS7Parameter FCLK2_DLY; +extern const struct LMS7Parameter FCLK1_DLY; +extern const struct LMS7Parameter RX_MUX; +extern const struct LMS7Parameter TX_MUX; +extern const struct LMS7Parameter TXRDCLK_MUX; +extern const struct LMS7Parameter TXWRCLK_MUX; +extern const struct LMS7Parameter RXRDCLK_MUX; +extern const struct LMS7Parameter RXWRCLK_MUX; +extern const struct LMS7Parameter FCLK2_INV; +extern const struct LMS7Parameter FCLK1_INV; +extern const struct LMS7Parameter MCLK2DLY; +extern const struct LMS7Parameter MCLK1DLY; +extern const struct LMS7Parameter MCLK2SRC; +extern const struct LMS7Parameter MCLK1SRC; +extern const struct LMS7Parameter TXDIVEN; +extern const struct LMS7Parameter RXDIVEN; +extern const struct LMS7Parameter TXTSPCLKA_DIV; +extern const struct LMS7Parameter RXTSPCLKA_DIV; +extern const struct LMS7Parameter MIMO_SISO; +extern const struct LMS7Parameter VER; +extern const struct LMS7Parameter REV; +extern const struct LMS7Parameter MASK; +extern const struct LMS7Parameter EN_DIR_LDO; +extern const struct LMS7Parameter EN_DIR_CGEN; +extern const struct LMS7Parameter EN_DIR_XBUF; +extern const struct LMS7Parameter EN_DIR_AFE; +extern const struct LMS7Parameter ISEL_DAC_AFE; +extern const struct LMS7Parameter MODE_INTERLEAVE_AFE; +extern const struct LMS7Parameter MUX_AFE_1; +extern const struct LMS7Parameter MUX_AFE_2; +extern const struct LMS7Parameter PD_AFE; +extern const struct LMS7Parameter PD_RX_AFE1; +extern const struct LMS7Parameter PD_RX_AFE2; +extern const struct LMS7Parameter PD_TX_AFE1; +extern const struct LMS7Parameter PD_TX_AFE2; +extern const struct LMS7Parameter EN_G_AFE; +extern const struct LMS7Parameter MUX_BIAS_OUT; +extern const struct LMS7Parameter RP_CALIB_BIAS; +extern const struct LMS7Parameter PD_FRP_BIAS; +extern const struct LMS7Parameter PD_F_BIAS; +extern const struct LMS7Parameter PD_PTRP_BIAS; +extern const struct LMS7Parameter PD_PT_BIAS; +extern const struct LMS7Parameter PD_BIAS_MASTER; +extern const struct LMS7Parameter SLFB_XBUF_RX; +extern const struct LMS7Parameter SLFB_XBUF_TX; +extern const struct LMS7Parameter BYP_XBUF_RX; +extern const struct LMS7Parameter BYP_XBUF_TX; +extern const struct LMS7Parameter EN_OUT2_XBUF_TX; +extern const struct LMS7Parameter EN_TBUFIN_XBUF_RX; +extern const struct LMS7Parameter PD_XBUF_RX; +extern const struct LMS7Parameter PD_XBUF_TX; +extern const struct LMS7Parameter EN_G_XBUF; +extern const struct LMS7Parameter SPDUP_VCO_CGEN; +extern const struct LMS7Parameter RESET_N_CGEN; +extern const struct LMS7Parameter EN_ADCCLKH_CLKGN; +extern const struct LMS7Parameter EN_COARSE_CKLGEN; +extern const struct LMS7Parameter EN_INTONLY_SDM_CGEN; +extern const struct LMS7Parameter EN_SDM_CLK_CGEN; +extern const struct LMS7Parameter PD_CP_CGEN; +extern const struct LMS7Parameter PD_FDIV_FB_CGEN; +extern const struct LMS7Parameter PD_FDIV_O_CGEN; +extern const struct LMS7Parameter PD_SDM_CGEN; +extern const struct LMS7Parameter PD_VCO_CGEN; +extern const struct LMS7Parameter PD_VCO_COMP_CGEN; +extern const struct LMS7Parameter EN_G_CGEN; +extern const struct LMS7Parameter FRAC_SDM_CGEN_LSB; +extern const struct LMS7Parameter INT_SDM_CGEN; +extern const struct LMS7Parameter FRAC_SDM_CGEN_MSB; +extern const struct LMS7Parameter REV_SDMCLK_CGEN; +extern const struct LMS7Parameter SEL_SDMCLK_CGEN; +extern const struct LMS7Parameter SX_DITHER_EN_CGEN; +extern const struct LMS7Parameter CLKH_OV_CLKL_CGEN; +extern const struct LMS7Parameter DIV_OUTCH_CGEN; +extern const struct LMS7Parameter TST_CGEN; +extern const struct LMS7Parameter REV_CLKDAC_CGEN; +extern const struct LMS7Parameter CMPLO_CTRL_CGEN; +extern const struct LMS7Parameter REV_CLKADC_CGEN; +extern const struct LMS7Parameter REVPH_PFD_CGEN; +extern const struct LMS7Parameter IOFFSET_CP_CGEN; +extern const struct LMS7Parameter IPULSE_CP_CGEN; +extern const struct LMS7Parameter ICT_VCO_CGEN; +extern const struct LMS7Parameter CSW_VCO_CGEN; +extern const struct LMS7Parameter COARSE_START_CGEN; +extern const struct LMS7Parameter COARSE_STEPDONE_CGEN; +extern const struct LMS7Parameter COARSEPLL_COMPO_CGEN; +extern const struct LMS7Parameter VCO_CMPHO_CGEN; +extern const struct LMS7Parameter VCO_CMPLO_CGEN; +extern const struct LMS7Parameter CP2_CGEN; +extern const struct LMS7Parameter CP3_CGEN; +extern const struct LMS7Parameter CZ_CGEN; +extern const struct LMS7Parameter EN_LDO_DIG; +extern const struct LMS7Parameter EN_LDO_DIGGN; +extern const struct LMS7Parameter EN_LDO_DIGSXR; +extern const struct LMS7Parameter EN_LDO_DIGSXT; +extern const struct LMS7Parameter EN_LDO_DIVGN; +extern const struct LMS7Parameter EN_LDO_DIVSXR; +extern const struct LMS7Parameter EN_LDO_DIVSXT; +extern const struct LMS7Parameter EN_LDO_LNA12; +extern const struct LMS7Parameter EN_LDO_LNA14; +extern const struct LMS7Parameter EN_LDO_MXRFE; +extern const struct LMS7Parameter EN_LDO_RBB; +extern const struct LMS7Parameter EN_LDO_RXBUF; +extern const struct LMS7Parameter EN_LDO_TBB; +extern const struct LMS7Parameter EN_LDO_TIA12; +extern const struct LMS7Parameter EN_LDO_TIA14; +extern const struct LMS7Parameter EN_G_LDO; +extern const struct LMS7Parameter EN_LOADIMP_LDO_TLOB; +extern const struct LMS7Parameter EN_LOADIMP_LDO_TPAD; +extern const struct LMS7Parameter EN_LOADIMP_LDO_TXBUF; +extern const struct LMS7Parameter EN_LOADIMP_LDO_VCOGN; +extern const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXR; +extern const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXT; +extern const struct LMS7Parameter EN_LDO_AFE; +extern const struct LMS7Parameter EN_LDO_CPGN; +extern const struct LMS7Parameter EN_LDO_CPSXR; +extern const struct LMS7Parameter EN_LDO_TLOB; +extern const struct LMS7Parameter EN_LDO_TPAD; +extern const struct LMS7Parameter EN_LDO_TXBUF; +extern const struct LMS7Parameter EN_LDO_VCOGN; +extern const struct LMS7Parameter EN_LDO_VCOSXR; +extern const struct LMS7Parameter EN_LDO_VCOSXT; +extern const struct LMS7Parameter EN_LDO_CPSXT; +extern const struct LMS7Parameter EN_LOADIMP_LDO_CPSXT; +extern const struct LMS7Parameter EN_LOADIMP_LDO_DIG; +extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGGN; +extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXR; +extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXT; +extern const struct LMS7Parameter EN_LOADIMP_LDO_DIVGN; +extern const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXR; +extern const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXT; +extern const struct LMS7Parameter EN_LOADIMP_LDO_LNA12; +extern const struct LMS7Parameter EN_LOADIMP_LDO_LNA14; +extern const struct LMS7Parameter EN_LOADIMP_LDO_MXRFE; +extern const struct LMS7Parameter EN_LOADIMP_LDO_RBB; +extern const struct LMS7Parameter EN_LOADIMP_LDO_RXBUF; +extern const struct LMS7Parameter EN_LOADIMP_LDO_TBB; +extern const struct LMS7Parameter EN_LOADIMP_LDO_TIA12; +extern const struct LMS7Parameter EN_LOADIMP_LDO_TIA14; +extern const struct LMS7Parameter BYP_LDO_TBB; +extern const struct LMS7Parameter BYP_LDO_TIA12; +extern const struct LMS7Parameter BYP_LDO_TIA14; +extern const struct LMS7Parameter BYP_LDO_TLOB; +extern const struct LMS7Parameter BYP_LDO_TPAD; +extern const struct LMS7Parameter BYP_LDO_TXBUF; +extern const struct LMS7Parameter BYP_LDO_VCOGN; +extern const struct LMS7Parameter BYP_LDO_VCOSXR; +extern const struct LMS7Parameter BYP_LDO_VCOSXT; +extern const struct LMS7Parameter EN_LOADIMP_LDO_AFE; +extern const struct LMS7Parameter EN_LOADIMP_LDO_CPGN; +extern const struct LMS7Parameter EN_LOADIMP_LDO_CPSXR; +extern const struct LMS7Parameter BYP_LDO_AFE; +extern const struct LMS7Parameter BYP_LDO_CPGN; +extern const struct LMS7Parameter BYP_LDO_CPSXR; +extern const struct LMS7Parameter BYP_LDO_CPSXT; +extern const struct LMS7Parameter BYP_LDO_DIG; +extern const struct LMS7Parameter BYP_LDO_DIGGN; +extern const struct LMS7Parameter BYP_LDO_DIGSXR; +extern const struct LMS7Parameter BYP_LDO_DIGSXT; +extern const struct LMS7Parameter BYP_LDO_DIVGN; +extern const struct LMS7Parameter BYP_LDO_DIVSXR; +extern const struct LMS7Parameter BYP_LDO_DIVSXT; +extern const struct LMS7Parameter BYP_LDO_LNA12; +extern const struct LMS7Parameter BYP_LDO_LNA14; +extern const struct LMS7Parameter BYP_LDO_MXRFE; +extern const struct LMS7Parameter BYP_LDO_RBB; +extern const struct LMS7Parameter BYP_LDO_RXBUF; +extern const struct LMS7Parameter SPDUP_LDO_DIVSXR; +extern const struct LMS7Parameter SPDUP_LDO_DIVSXT; +extern const struct LMS7Parameter SPDUP_LDO_LNA12; +extern const struct LMS7Parameter SPDUP_LDO_LNA14; +extern const struct LMS7Parameter SPDUP_LDO_MXRFE; +extern const struct LMS7Parameter SPDUP_LDO_RBB; +extern const struct LMS7Parameter SPDUP_LDO_RXBUF; +extern const struct LMS7Parameter SPDUP_LDO_TBB; +extern const struct LMS7Parameter SPDUP_LDO_TIA12; +extern const struct LMS7Parameter SPDUP_LDO_TIA14; +extern const struct LMS7Parameter SPDUP_LDO_TLOB; +extern const struct LMS7Parameter SPDUP_LDO_TPAD; +extern const struct LMS7Parameter SPDUP_LDO_TXBUF; +extern const struct LMS7Parameter SPDUP_LDO_VCOGN; +extern const struct LMS7Parameter SPDUP_LDO_VCOSXR; +extern const struct LMS7Parameter SPDUP_LDO_VCOSXT; +extern const struct LMS7Parameter SPDUP_LDO_AFE; +extern const struct LMS7Parameter SPDUP_LDO_CPGN; +extern const struct LMS7Parameter SPDUP_LDO_CPSXR; +extern const struct LMS7Parameter SPDUP_LDO_CPSXT; +extern const struct LMS7Parameter SPDUP_LDO_DIG; +extern const struct LMS7Parameter SPDUP_LDO_DIGGN; +extern const struct LMS7Parameter SPDUP_LDO_DIGSXR; +extern const struct LMS7Parameter SPDUP_LDO_DIGSXT; +extern const struct LMS7Parameter SPDUP_LDO_DIVGN; +extern const struct LMS7Parameter RDIV_VCOSXR; +extern const struct LMS7Parameter RDIV_VCOSXT; +extern const struct LMS7Parameter RDIV_TXBUF; +extern const struct LMS7Parameter RDIV_VCOGN; +extern const struct LMS7Parameter RDIV_TLOB; +extern const struct LMS7Parameter RDIV_TPAD; +extern const struct LMS7Parameter RDIV_TIA12; +extern const struct LMS7Parameter RDIV_TIA14; +extern const struct LMS7Parameter RDIV_RXBUF; +extern const struct LMS7Parameter RDIV_TBB; +extern const struct LMS7Parameter RDIV_MXRFE; +extern const struct LMS7Parameter RDIV_RBB; +extern const struct LMS7Parameter RDIV_LNA12; +extern const struct LMS7Parameter RDIV_LNA14; +extern const struct LMS7Parameter RDIV_DIVSXR; +extern const struct LMS7Parameter RDIV_DIVSXT; +extern const struct LMS7Parameter RDIV_DIGSXT; +extern const struct LMS7Parameter RDIV_DIVGN; +extern const struct LMS7Parameter RDIV_DIGGN; +extern const struct LMS7Parameter RDIV_DIGSXR; +extern const struct LMS7Parameter RDIV_CPSXT; +extern const struct LMS7Parameter RDIV_DIG; +extern const struct LMS7Parameter RDIV_CPGN; +extern const struct LMS7Parameter RDIV_CPSXR; +extern const struct LMS7Parameter RDIV_SPIBUF; +extern const struct LMS7Parameter RDIV_AFE; +extern const struct LMS7Parameter SPDUP_LDO_SPIBUF; +extern const struct LMS7Parameter SPDUP_LDO_DIGIp2; +extern const struct LMS7Parameter SPDUP_LDO_DIGIp1; +extern const struct LMS7Parameter BYP_LDO_SPIBUF; +extern const struct LMS7Parameter BYP_LDO_DIGIp2; +extern const struct LMS7Parameter BYP_LDO_DIGIp1; +extern const struct LMS7Parameter EN_LOADIMP_LDO_SPIBUF; +extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp2; +extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp1; +extern const struct LMS7Parameter PD_LDO_SPIBUF; +extern const struct LMS7Parameter PD_LDO_DIGIp2; +extern const struct LMS7Parameter PD_LDO_DIGIp1; +extern const struct LMS7Parameter EN_G_LDOP; +extern const struct LMS7Parameter RDIV_DIGIp2; +extern const struct LMS7Parameter RDIV_DIGIp1; +extern const struct LMS7Parameter BSIGT; +extern const struct LMS7Parameter BSTATE; +extern const struct LMS7Parameter EN_SDM_TSTO_SXT; +extern const struct LMS7Parameter EN_SDM_TSTO_SXR; +extern const struct LMS7Parameter EN_SDM_TSTO_CGEN; +extern const struct LMS7Parameter BENC; +extern const struct LMS7Parameter BENR; +extern const struct LMS7Parameter BENT; +extern const struct LMS7Parameter BSTART; +extern const struct LMS7Parameter BSIGR; +extern const struct LMS7Parameter BSIGC; +extern const struct LMS7Parameter CDS_MCLK2; +extern const struct LMS7Parameter CDS_MCLK1; +extern const struct LMS7Parameter CDSN_TXBTSP; +extern const struct LMS7Parameter CDSN_TXATSP; +extern const struct LMS7Parameter CDSN_RXBTSP; +extern const struct LMS7Parameter CDSN_RXATSP; +extern const struct LMS7Parameter CDSN_TXBLML; +extern const struct LMS7Parameter CDSN_TXALML; +extern const struct LMS7Parameter CDSN_RXBLML; +extern const struct LMS7Parameter CDSN_RXALML; +extern const struct LMS7Parameter CDSN_MCLK2; +extern const struct LMS7Parameter CDSN_MCLK1; +extern const struct LMS7Parameter CDS_TXBTSP; +extern const struct LMS7Parameter CDS_TXATSP; +extern const struct LMS7Parameter CDS_RXBTSP; +extern const struct LMS7Parameter CDS_RXATSP; +extern const struct LMS7Parameter CDS_TXBLML; +extern const struct LMS7Parameter CDS_TXALML; +extern const struct LMS7Parameter CDS_RXBLML; +extern const struct LMS7Parameter CDS_RXALML; +extern const struct LMS7Parameter EN_LOWBWLOMX_TMX_TRF; +extern const struct LMS7Parameter EN_NEXTTX_TRF; +extern const struct LMS7Parameter EN_AMPHF_PDET_TRF; +extern const struct LMS7Parameter LOADR_PDET_TRF; +extern const struct LMS7Parameter PD_PDET_TRF; +extern const struct LMS7Parameter PD_TLOBUF_TRF; +extern const struct LMS7Parameter PD_TXPAD_TRF; +extern const struct LMS7Parameter EN_G_TRF; +extern const struct LMS7Parameter F_TXPAD_TRF; +extern const struct LMS7Parameter L_LOOPB_TXPAD_TRF; +extern const struct LMS7Parameter LOSS_LIN_TXPAD_TRF; +extern const struct LMS7Parameter LOSS_MAIN_TXPAD_TRF; +extern const struct LMS7Parameter EN_LOOPB_TXPAD_TRF; +extern const struct LMS7Parameter GCAS_GNDREF_TXPAD_TRF; +extern const struct LMS7Parameter ICT_LIN_TXPAD_TRF; +extern const struct LMS7Parameter ICT_MAIN_TXPAD_TRF; +extern const struct LMS7Parameter VGCAS_TXPAD_TRF; +extern const struct LMS7Parameter SEL_BAND1_TRF; +extern const struct LMS7Parameter SEL_BAND2_TRF; +extern const struct LMS7Parameter LOBIASN_TXM_TRF; +extern const struct LMS7Parameter LOBIASP_TXX_TRF; +extern const struct LMS7Parameter CDC_I_TRF; +extern const struct LMS7Parameter CDC_Q_TRF; +extern const struct LMS7Parameter STATPULSE_TBB; +extern const struct LMS7Parameter LOOPB_TBB; +extern const struct LMS7Parameter PD_LPFH_TBB; +extern const struct LMS7Parameter PD_LPFIAMP_TBB; +extern const struct LMS7Parameter PD_LPFLAD_TBB; +extern const struct LMS7Parameter PD_LPFS5_TBB; +extern const struct LMS7Parameter EN_G_TBB; +extern const struct LMS7Parameter ICT_LPFS5_F_TBB; +extern const struct LMS7Parameter ICT_LPFS5_PT_TBB; +extern const struct LMS7Parameter ICT_LPF_H_PT_TBB; +extern const struct LMS7Parameter ICT_LPFH_F_TBB; +extern const struct LMS7Parameter ICT_LPFLAD_F_TBB; +extern const struct LMS7Parameter ICT_LPFLAD_PT_TBB; +extern const struct LMS7Parameter CG_IAMP_TBB; +extern const struct LMS7Parameter ICT_IAMP_FRP_TBB; +extern const struct LMS7Parameter ICT_IAMP_GG_FRP_TBB; +extern const struct LMS7Parameter RCAL_LPFH_TBB; +extern const struct LMS7Parameter RCAL_LPFLAD_TBB; +extern const struct LMS7Parameter TSTIN_TBB; +extern const struct LMS7Parameter BYPLADDER_TBB; +extern const struct LMS7Parameter CCAL_LPFLAD_TBB; +extern const struct LMS7Parameter RCAL_LPFS5_TBB; +extern const struct LMS7Parameter CDC_I_RFE; +extern const struct LMS7Parameter CDC_Q_RFE; +extern const struct LMS7Parameter PD_LNA_RFE; +extern const struct LMS7Parameter PD_RLOOPB_1_RFE; +extern const struct LMS7Parameter PD_RLOOPB_2_RFE; +extern const struct LMS7Parameter PD_MXLOBUF_RFE; +extern const struct LMS7Parameter PD_QGEN_RFE; +extern const struct LMS7Parameter PD_RSSI_RFE; +extern const struct LMS7Parameter PD_TIA_RFE; +extern const struct LMS7Parameter EN_G_RFE; +extern const struct LMS7Parameter SEL_PATH_RFE; +extern const struct LMS7Parameter EN_DCOFF_RXFE_RFE; +extern const struct LMS7Parameter EN_INSHSW_LB1_RFE; +extern const struct LMS7Parameter EN_INSHSW_LB2_RFE; +extern const struct LMS7Parameter EN_INSHSW_L_RFE; +extern const struct LMS7Parameter EN_INSHSW_W_RFE; +extern const struct LMS7Parameter EN_NEXTRX_RFE; +extern const struct LMS7Parameter DCOFFI_RFE; +extern const struct LMS7Parameter DCOFFQ_RFE; +extern const struct LMS7Parameter ICT_LOOPB_RFE; +extern const struct LMS7Parameter ICT_TIAMAIN_RFE; +extern const struct LMS7Parameter ICT_TIAOUT_RFE; +extern const struct LMS7Parameter ICT_LNACMO_RFE; +extern const struct LMS7Parameter ICT_LNA_RFE; +extern const struct LMS7Parameter ICT_LODC_RFE; +extern const struct LMS7Parameter CAP_RXMXO_RFE; +extern const struct LMS7Parameter CGSIN_LNA_RFE; +extern const struct LMS7Parameter CCOMP_TIA_RFE; +extern const struct LMS7Parameter CFB_TIA_RFE; +extern const struct LMS7Parameter G_LNA_RFE; +extern const struct LMS7Parameter G_RXLOOPB_RFE; +extern const struct LMS7Parameter G_TIA_RFE; +extern const struct LMS7Parameter RCOMP_TIA_RFE; +extern const struct LMS7Parameter RFB_TIA_RFE; +extern const struct LMS7Parameter EN_LB_LPFH_RBB; +extern const struct LMS7Parameter EN_LB_LPFL_RBB; +extern const struct LMS7Parameter PD_LPFH_RBB; +extern const struct LMS7Parameter PD_LPFL_RBB; +extern const struct LMS7Parameter PD_PGA_RBB; +extern const struct LMS7Parameter EN_G_RBB; +extern const struct LMS7Parameter R_CTL_LPF_RBB; +extern const struct LMS7Parameter RCC_CTL_LPFH_RBB; +extern const struct LMS7Parameter C_CTL_LPFH_RBB; +extern const struct LMS7Parameter RCC_CTL_LPFL_RBB; +extern const struct LMS7Parameter C_CTL_LPFL_RBB; +extern const struct LMS7Parameter INPUT_CTL_PGA_RBB; +extern const struct LMS7Parameter ICT_LPF_IN_RBB; +extern const struct LMS7Parameter ICT_LPF_OUT_RBB; +extern const struct LMS7Parameter OSW_PGA_RBB; +extern const struct LMS7Parameter ICT_PGA_OUT_RBB; +extern const struct LMS7Parameter ICT_PGA_IN_RBB; +extern const struct LMS7Parameter G_PGA_RBB; +extern const struct LMS7Parameter RCC_CTL_PGA_RBB; +extern const struct LMS7Parameter C_CTL_PGA_RBB; +extern const struct LMS7Parameter RESET_N; +extern const struct LMS7Parameter SPDUP_VCO; +extern const struct LMS7Parameter BYPLDO_VCO; +extern const struct LMS7Parameter EN_COARSEPLL; +extern const struct LMS7Parameter CURLIM_VCO; +extern const struct LMS7Parameter EN_DIV2_DIVPROG; +extern const struct LMS7Parameter EN_INTONLY_SDM; +extern const struct LMS7Parameter EN_SDM_CLK; +extern const struct LMS7Parameter PD_FBDIV; +extern const struct LMS7Parameter PD_LOCH_T2RBUF; +extern const struct LMS7Parameter PD_CP; +extern const struct LMS7Parameter PD_FDIV; +extern const struct LMS7Parameter PD_SDM; +extern const struct LMS7Parameter PD_VCO_COMP; +extern const struct LMS7Parameter PD_VCO; +extern const struct LMS7Parameter EN_G; +extern const struct LMS7Parameter FRAC_SDM_LSB; +extern const struct LMS7Parameter INT_SDM; +extern const struct LMS7Parameter FRAC_SDM_MSB; +extern const struct LMS7Parameter PW_DIV2_LOCH; +extern const struct LMS7Parameter PW_DIV4_LOCH; +extern const struct LMS7Parameter DIV_LOCH; +extern const struct LMS7Parameter TST_SX; +extern const struct LMS7Parameter SEL_SDMCLK; +extern const struct LMS7Parameter SX_DITHER_EN; +extern const struct LMS7Parameter REV_SDMCLK; +extern const struct LMS7Parameter VDIV_VCO; +extern const struct LMS7Parameter ICT_VCO; +extern const struct LMS7Parameter RSEL_LDO_VCO; +extern const struct LMS7Parameter CSW_VCO; +extern const struct LMS7Parameter SEL_VCO; +extern const struct LMS7Parameter COARSE_START; +extern const struct LMS7Parameter REVPH_PFD; +extern const struct LMS7Parameter IOFFSET_CP; +extern const struct LMS7Parameter IPULSE_CP; +extern const struct LMS7Parameter COARSE_STEPDONE; +extern const struct LMS7Parameter COARSEPLL_COMPO; +extern const struct LMS7Parameter VCO_CMPHO; +extern const struct LMS7Parameter VCO_CMPLO; +extern const struct LMS7Parameter CP2_PLL; +extern const struct LMS7Parameter CP3_PLL; +extern const struct LMS7Parameter CZ; +extern const struct LMS7Parameter EN_DIR_SXRSXT; +extern const struct LMS7Parameter EN_DIR_RBB; +extern const struct LMS7Parameter EN_DIR_RFE; +extern const struct LMS7Parameter EN_DIR_TBB; +extern const struct LMS7Parameter EN_DIR_TRF; +extern const struct LMS7Parameter TSGFC_TXTSP; +extern const struct LMS7Parameter TSGFCW_TXTSP; +extern const struct LMS7Parameter TSGDCLDQ_TXTSP; +extern const struct LMS7Parameter TSGDCLDI_TXTSP; +extern const struct LMS7Parameter TSGSWAPIQ_TXTSP; +extern const struct LMS7Parameter TSGMODE_TXTSP; +extern const struct LMS7Parameter INSEL_TXTSP; +extern const struct LMS7Parameter BSTART_TXTSP; +extern const struct LMS7Parameter EN_TXTSP; +extern const struct LMS7Parameter GCORRQ_TXTSP; +extern const struct LMS7Parameter GCORRI_TXTSP; +extern const struct LMS7Parameter HBI_OVR_TXTSP; +extern const struct LMS7Parameter IQCORR_TXTSP; +extern const struct LMS7Parameter DCCORRI_TXTSP; +extern const struct LMS7Parameter DCCORRQ_TXTSP; +extern const struct LMS7Parameter GFIR1_L_TXTSP; +extern const struct LMS7Parameter GFIR1_N_TXTSP; +extern const struct LMS7Parameter GFIR2_L_TXTSP; +extern const struct LMS7Parameter GFIR2_N_TXTSP; +extern const struct LMS7Parameter GFIR3_L_TXTSP; +extern const struct LMS7Parameter GFIR3_N_TXTSP; +extern const struct LMS7Parameter CMIX_GAIN_TXTSP; +extern const struct LMS7Parameter CMIX_SC_TXTSP; +extern const struct LMS7Parameter CMIX_BYP_TXTSP; +extern const struct LMS7Parameter ISINC_BYP_TXTSP; +extern const struct LMS7Parameter GFIR3_BYP_TXTSP; +extern const struct LMS7Parameter GFIR2_BYP_TXTSP; +extern const struct LMS7Parameter GFIR1_BYP_TXTSP; +extern const struct LMS7Parameter DC_BYP_TXTSP; +extern const struct LMS7Parameter GC_BYP_TXTSP; +extern const struct LMS7Parameter PH_BYP_TXTSP; +extern const struct LMS7Parameter BSIGI_TXTSP; +extern const struct LMS7Parameter BSTATE_TXTSP; +extern const struct LMS7Parameter BSIGQ_TXTSP; +extern const struct LMS7Parameter DC_REG_TXTSP; +extern const struct LMS7Parameter DTHBIT_TX; +extern const struct LMS7Parameter SEL_TX; +extern const struct LMS7Parameter MODE_TX; +extern const struct LMS7Parameter CAPTURE; +extern const struct LMS7Parameter CAPSEL; +extern const struct LMS7Parameter CAPSEL_ADC; +extern const struct LMS7Parameter TSGFC_RXTSP; +extern const struct LMS7Parameter TSGFCW_RXTSP; +extern const struct LMS7Parameter TSGDCLDQ_RXTSP; +extern const struct LMS7Parameter TSGDCLDI_RXTSP; +extern const struct LMS7Parameter TSGSWAPIQ_RXTSP; +extern const struct LMS7Parameter TSGMODE_RXTSP; +extern const struct LMS7Parameter INSEL_RXTSP; +extern const struct LMS7Parameter BSTART_RXTSP; +extern const struct LMS7Parameter EN_RXTSP; +extern const struct LMS7Parameter GCORRQ_RXTSP; +extern const struct LMS7Parameter GCORRI_RXTSP; +extern const struct LMS7Parameter HBD_OVR_RXTSP; +extern const struct LMS7Parameter IQCORR_RXTSP; +extern const struct LMS7Parameter HBD_DLY; +extern const struct LMS7Parameter DCLOOP_BYP; +extern const struct LMS7Parameter DCCORR_AVG_RXTSP; +extern const struct LMS7Parameter GFIR1_L_RXTSP; +extern const struct LMS7Parameter GFIR1_N_RXTSP; +extern const struct LMS7Parameter GFIR2_L_RXTSP; +extern const struct LMS7Parameter GFIR2_N_RXTSP; +extern const struct LMS7Parameter GFIR3_L_RXTSP; +extern const struct LMS7Parameter GFIR3_N_RXTSP; +extern const struct LMS7Parameter AGC_K_RXTSP; +extern const struct LMS7Parameter AGC_ADESIRED_RXTSP; +extern const struct LMS7Parameter RSSI_MODE; +extern const struct LMS7Parameter AGC_MODE_RXTSP; +extern const struct LMS7Parameter AGC_AVG_RXTSP; +extern const struct LMS7Parameter DC_REG_RXTSP; +extern const struct LMS7Parameter CMIX_GAIN_RXTSP; +extern const struct LMS7Parameter CMIX_SC_RXTSP; +extern const struct LMS7Parameter CMIX_BYP_RXTSP; +extern const struct LMS7Parameter AGC_BYP_RXTSP; +extern const struct LMS7Parameter GFIR3_BYP_RXTSP; +extern const struct LMS7Parameter GFIR2_BYP_RXTSP; +extern const struct LMS7Parameter GFIR1_BYP_RXTSP; +extern const struct LMS7Parameter DC_BYP_RXTSP; +extern const struct LMS7Parameter GC_BYP_RXTSP; +extern const struct LMS7Parameter PH_BYP_RXTSP; +extern const struct LMS7Parameter CAPD; +extern const struct LMS7Parameter DTHBIT_RX; +extern const struct LMS7Parameter SEL_RX; +extern const struct LMS7Parameter MODE_RX; + +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp new file mode 100644 index 0000000000..4e00854e14 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp @@ -0,0 +1,16 @@ +/** +@file LMS7002M_statuses.cpp +@author Lime Microsystems (www.limemicro.com) +*/ + +#include "LMS7002M_statuses.h" + +const char* undefinedStatusStr = "undefined status"; + +const char* liblms7_status2string(liblms7_status status) +{ + if (status >= 0 && status < LIBLMS7_STATUS_COUNT) + return liblms7_status_strings[status]; + else + return undefinedStatusStr; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h new file mode 100644 index 0000000000..43b736bfd5 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h @@ -0,0 +1,48 @@ +/** +@file LMS7002M_statuses.h +@author Lime Microsystems (www.limemicro.com) +@brief LMS7002M control library statuses enumerations +*/ + +#ifndef LMS7API_STATUSES_H +#define LMS7API_STATUSES_H + +const char liblms7_status_strings[][64] = +{ +"success", +"failure", +"index out of range", +"too many values", +"connection manager is NULL", +"port not connected", +"frequency out of range", +"cannot deliver frequency", +"VCO is powered down", +"Bad SEL_PATH_RFE", +"Band not selected", +"file not found", +"file invalid format", +}; + +enum liblms7_status +{ + LIBLMS7_SUCCESS = 0, + LIBLMS7_FAILURE, + LIBLMS7_INDEX_OUT_OF_RANGE, + LIBLMS7_TOO_MANY_VALUES, + LIBLMS7_NO_CONNECTION_MANAGER, + LIBLMS7_NOT_CONNECTED, + LIBLMS7_FREQUENCY_OUT_OF_RANGE, + LIBLMS7_CANNOT_DELIVER_FREQUENCY, + LIBLMS7_VCO_IS_POWERED_DOWN, + LIBLMS7_BAD_SEL_PATH, + LIBLMS7_BAND_NOT_SELECTED, + LIBLMS7_FILE_NOT_FOUND, + LIBLMS7_FILE_INVALID_FORMAT, + + LIBLMS7_STATUS_COUNT +}; + +const char* liblms7_status2string(liblms7_status status); + +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp new file mode 100644 index 0000000000..6c7fc0d829 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp @@ -0,0 +1,596 @@ +/** + @file ConnectionCOM.cpp + @author Lime Microsystems (www.limemicro.com) + @brief Implementation of communications through COM port +*/ + +#include "ConnectionCOM.h" + +#include "string.h" +#ifdef __unix__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // LINUX + +const int COM_RETRY_INTERVAL = 20; //ms +const int COM_TOTAL_TIMEOUT = 300; //ms + +/** @brief Initializes com port connection +*/ +ConnectionCOM::ConnectionCOM() +{ + currentDeviceIndex = -1; + connected = false; + comPortList.clear(); + m_deviceNames.clear(); + m_connectionType = COM_PORT; +#ifndef __unix__ + hComm = INVALID_HANDLE_VALUE; +#else + hComm = -1; +#endif + comBaudrate = 9600; +} + +/** @brief When object is destroyed it closes it's opened COM port +*/ +ConnectionCOM::~ConnectionCOM() +{ + Close(); +} + +/** @brief Opens connection to first found chip + @return 0-success +*/ +IConnection::DeviceStatus ConnectionCOM::Open() +{ + comPortList.clear(); + if(comPortList.size() == 0) + FindAllComPorts(); + + m_deviceNames.clear(); + if(m_deviceNames.size() == 0) + RefreshDeviceList(); + + for(unsigned int i=0; i 0 ) + { + comPortName = m_deviceNames[toOpen]; + IConnection::DeviceStatus status = Open(comPortName.c_str(), comBaudrate); + if( status == SUCCESS ) + currentDeviceIndex = toOpen; + return status; + } + return FAILURE; +} + +/** @brief Closes connection to chip +*/ +void ConnectionCOM::Close() +{ + connected = false; + currentDeviceIndex = -1; +#ifndef __unix__ + if (hComm != INVALID_HANDLE_VALUE) + { + SetCommTimeouts(hComm, &m_ctmoOld); + CloseHandle(hComm); + } + hComm = INVALID_HANDLE_VALUE; +#else + if( hComm >= 0) + { + close(hComm); + } + hComm = -1; +#endif +} + +/** @brief Returns whether chip is connected + @return chip is connected +*/ +bool ConnectionCOM::IsOpen() +{ +#ifndef __unix__ + if (hComm != INVALID_HANDLE_VALUE && TestConnectivity() ) + return true; +#else + if( hComm != -1 && TestConnectivity() ) + return true; +#endif + return false; +} + +int ConnectionCOM::GetOpenedIndex() +{ + return currentDeviceIndex; +} + +/** @brief Sends data through COM port + @param buffer data buffer to send + @param length size of data buffer + @param timeout_ms timeout limit for operation in milliseconds + @return Number of bytes sent +*/ +int ConnectionCOM::Write(const unsigned char *buffer, int length, int timeout_ms) +{ + if(timeout_ms == 0) + { + timeout_ms = COM_TOTAL_TIMEOUT; + } + int retryCount = 0; + const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; + bool status = false; +#ifndef __unix__ + unsigned long bytesWriten = 0; + m_osWOverlap.InternalHigh = 0; + + for(int i = 0; iwrite("COM PORT: error writing data\n", LOG_ERROR); +// if(bytesWriten == 0) +// MessageLog::getInstance()->write("COM PORT: data bytes sent 0\n", LOG_WARNING); + status = false; + } + else + status = true; + ++retryCount; + } +#endif + if(bytesWriten == length) + status = true; + + return bytesWriten; +} + +/** @brief Reads data from COM port + @param buffer pointer to data buffer for receiving + @param length number of bytes to read + @param timeout_ms timeout limit for operation in milliseconds + @return Number of bytes received +*/ +int ConnectionCOM::Read(unsigned char *buffer, int length, int timeout_ms) +{ + if(timeout_ms == 0) + { + timeout_ms = COM_TOTAL_TIMEOUT; + } + int retryCount = 0; + const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; + bool status = false; + + memset(buffer, 0, length); + long bytesReaded = 0; + unsigned long totalBytesReaded = 0; + char cRawData[COM_BUFFER_LENGTH]; + unsigned long bytesToRead = length; + + memset(cRawData, '\0', sizeof(cRawData[0])*COM_BUFFER_LENGTH); + + for(int i=0; iwrite("COM PORT: error reading data\n", LOG_ERROR); +// if(bytesReaded == 0) +// MessageLog::getInstance()->write("COM PORT: reading 0 bytes\n", LOG_WARNING); + status = false; + } +#endif + retryCount++; + + for(int j=0; jwrite(ss.str(), LOG_DATA); + +// if(retryCount == maxRetries) +// MessageLog::getInstance()->write("COM PORT: read data timeout\n", LOG_WARNING); +// +// if(totalBytesReaded > length) +// MessageLog::getInstance()->write("COM PORT: read data corrupted, received length > requested length\n", LOG_ERROR); + return totalBytesReaded; +} + +/** @brief Searches for available COM ports and adds them to list +*/ +void ConnectionCOM::FindAllComPorts() +{ + Close(); + comPortList.clear(); +#ifndef __unix__ + HKEY hSERIALCOMM; + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hSERIALCOMM) == ERROR_SUCCESS) + { + // Get the max value name and max value lengths + DWORD dwMaxValueNameLen; + DWORD dwMaxValueLen; + DWORD dwQueryInfo = RegQueryInfoKey(hSERIALCOMM, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &dwMaxValueNameLen, &dwMaxValueLen, NULL, NULL); + if (dwQueryInfo == ERROR_SUCCESS) + { + DWORD dwMaxValueNameSizeInChars = dwMaxValueNameLen + 1; + // Include space for the NULL terminator + DWORD dwMaxValueNameSizeInBytes = dwMaxValueNameSizeInChars*sizeof(TCHAR); + DWORD dwMaxValueDataSizeInChars = dwMaxValueLen / sizeof(TCHAR) + 1; + // Include space for the NULL terminator + DWORD dwMaxValueDataSizeInBytes = dwMaxValueDataSizeInChars*sizeof(TCHAR); + + // Allocate some space for the value name and value data + TCHAR* szValueName = new TCHAR[dwMaxValueNameSizeInChars]; + TCHAR* byValue = new TCHAR[dwMaxValueDataSizeInBytes]; + if (szValueName && byValue) + { + // Enumerate all the values underneath HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM + DWORD dwIndex = 0; + DWORD dwType; + DWORD dwValueNameSize = dwMaxValueNameSizeInChars; + DWORD dwDataSize = dwMaxValueDataSizeInBytes; + memset(szValueName, 0, dwMaxValueNameSizeInBytes); + memset(byValue, 0, dwMaxValueDataSizeInBytes); + LONG nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); + while (nEnum == ERROR_SUCCESS) + { + // If the value is of the correct type, then add it to the array + if (dwType == REG_SZ) + { + char portname[512]; + TCHAR* szPort = byValue; + int nUserNameLenUnicode = lstrlen( szPort ); // Convert all UNICODE characters + int nUserNameLen = WideCharToMultiByte( CP_ACP, // ANSI Code Page + 0, // No special handling of unmapped chars + (LPCWSTR)szPort, // wide-character string to be converted + nUserNameLenUnicode, + NULL, 0, // No output buffer since we are calculating length + NULL, NULL ); // Unrepresented char replacement - Use Default + TCHAR* pszUserName = new TCHAR[ nUserNameLen ]; // nUserNameLen includes the NULL character + WideCharToMultiByte( CP_ACP, // ANSI Code Page + 0, // No special handling of unmapped chars + (LPCWSTR)szPort, // wide-character string to be converted + nUserNameLenUnicode, + portname, + nUserNameLen, + NULL, NULL ); // Unrepresented char replacement - Use Default + portname[nUserNameLen] = 0; +#ifdef UNICODE + comPortList.push_back(portname); +#else + comPortList.push_back(szPort); +#endif + } + // Prepare for the next time around + dwValueNameSize = dwMaxValueNameSizeInChars; + dwDataSize = dwMaxValueDataSizeInBytes; + memset(szValueName, 0, dwMaxValueNameSizeInBytes); + memset(byValue, 0, dwMaxValueDataSizeInBytes); + ++dwIndex; + nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); + } + } + delete szValueName; + delete byValue; + } + // Close the registry key now that we are finished with it + RegCloseKey(hSERIALCOMM); + + if (dwQueryInfo != ERROR_SUCCESS) + SetLastError(dwQueryInfo); + } +#else + char tempBuffer[256]; + string result = ""; +#warning Currently searching only for ACM connections + system( "ls /dev | grep ttyACM > /tmp/foundSerialPorts.txt"); + + fstream fin; + fin.open("/tmp/foundSerialPorts.txt", ios::in); + while(!fin.eof()) + { + fin.getline(tempBuffer, 256); + result = "/dev/"; + result.append(tempBuffer); + if( strlen(tempBuffer) > 3 ) //longer than tty + comPortList.push_back(result); + } + fin.close(); +#endif +} + +/** @brief Opens COM port + @param comName COM port name + @param baudrate COM port baudrate + @return 0 on success +*/ +IConnection::DeviceStatus ConnectionCOM::Open(const char *comName, int baudrate) +{ + Close(); + if (strlen(comName) == 0) + return FAILURE; + + DeviceStatus errorCode = SUCCESS; + +#ifndef __unix__ + // Initialize Overlap structures + m_osROverlap.Internal = 0; + m_osROverlap.InternalHigh = 0; + m_osROverlap.Offset = 0; + m_osROverlap.OffsetHigh = 0; + m_osROverlap.hEvent = CreateEvent(NULL, false, false, NULL); + + m_osWOverlap.Internal = 0; + m_osWOverlap.InternalHigh = 0; + m_osWOverlap.Offset = 0; + m_osWOverlap.OffsetHigh = 0; + m_osWOverlap.hEvent = CreateEvent(NULL, false, false, NULL); + + // Initialize DSB structure + memset(&m_dcbCommPort, 0, sizeof(m_dcbCommPort)); + + m_dcbCommPort.BaudRate = comBaudrate; + m_dcbCommPort.fBinary = 1; + m_dcbCommPort.fParity = 0; + m_dcbCommPort.fOutxCtsFlow = 0; + m_dcbCommPort.fOutxDsrFlow = 0; + m_dcbCommPort.fDtrControl = 0; + m_dcbCommPort.fDsrSensitivity = 0; + m_dcbCommPort.fTXContinueOnXoff = 0; + m_dcbCommPort.fOutX = 0; + m_dcbCommPort.fInX = 0; + m_dcbCommPort.fErrorChar = 0; + m_dcbCommPort.fNull = 0; + m_dcbCommPort.fRtsControl = 0; + m_dcbCommPort.fAbortOnError = 0; + m_dcbCommPort.fDummy2 = 0; + // m_dcbCommPort.wReserved = 0; + m_dcbCommPort.XonLim = 512; + m_dcbCommPort.XoffLim = 512; + m_dcbCommPort.ByteSize = 8; + m_dcbCommPort.Parity = 0; + m_dcbCommPort.StopBits = 0; + //m_dcbCommPort.StopBits = 1; + m_dcbCommPort.XonChar = 17; + m_dcbCommPort.XoffChar = 19; + m_dcbCommPort.ErrorChar = 0; + m_dcbCommPort.EofChar = 26; + m_dcbCommPort.EvtChar = 0; + m_dcbCommPort.wReserved1 = 0; + m_dcbCommPort.DCBlength = sizeof(DCB); + + // Initialize Timeout's + m_ctmoNew.ReadIntervalTimeout = 50; + m_ctmoNew.ReadTotalTimeoutMultiplier = 0; + m_ctmoNew.ReadTotalTimeoutConstant = 100; // 1; + m_ctmoNew.WriteTotalTimeoutMultiplier = 0; + m_ctmoNew.WriteTotalTimeoutConstant = 100; + + // Open COM port + string stmp; + stmp = "\\\\.\\"; + stmp.append(comName); + hComm = CreateFileA(stmp.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + + if (hComm != INVALID_HANDLE_VALUE) + { + // Set Events + if (!SetCommMask(hComm, 0)) + errorCode = FAILURE; + + // Set Timeouts + GetCommTimeouts(hComm, &m_ctmoOld); + if (!SetCommTimeouts(hComm, &m_ctmoNew)) + errorCode = FAILURE; + + // Set DCB + if (!SetCommState(hComm, &m_dcbCommPort)) + errorCode = FAILURE; + } + else + { + errorCode = FAILURE; + }; + + // Check the results + if (errorCode != 0) + { + //unsigned long err = GetLastError(); + CloseHandle(hComm); + hComm = INVALID_HANDLE_VALUE; + return errorCode; + } + else + { + PurgeComm(hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); + return SUCCESS; + } +#else + hComm = open(comName, O_RDWR | O_NOCTTY | O_SYNC); + if(hComm < 0) + { +// printf("%s",strerror(errno)); +// MessageLog::getInstance()->write("Connection manager: failed opening COM port\n", LOG_ERROR); + return FAILURE; + } + + struct termios tty; + memset(&tty, 0, sizeof(tty)); + if( tcgetattr(hComm, &tty) != 0) + { +// MessageLog::getInstance()->write("Connection Manager: error from tcgetattr\n", LOG_ERROR); + return FAILURE; + } + int speed = B9600; + cfsetospeed(&tty, speed); + cfsetispeed(&tty, speed); + + tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; + tty.c_iflag &= ~IGNBRK; + tty.c_lflag = 0; + tty.c_oflag = 0; + tty.c_cc[VMIN] = 0; // read non blocking + tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout + + tty.c_iflag &= ~(IXON | IXOFF | IXANY); + tty.c_cflag |= (CLOCAL | CREAD); + + if(tcsetattr(hComm, TCSANOW, &tty) != 0) + { +// MessageLog::getInstance()->write("Connection manager: error from tcsetattr\n", LOG_ERROR); + return FAILURE; + } +#endif + return SUCCESS; +} + +/** @brief Checks if chip is connected to currently open port + @return chip is connected +*/ +bool ConnectionCOM::TestConnectivity() +{ +//currently set to always return true to show all com ports + return true; +#ifndef __unix__ + if (hComm != INVALID_HANDLE_VALUE) +#else + if( hComm >= 0) +#endif + { +// unsigned char out[64]; +// unsigned char in[64]; +// memset(in, 0, 64); +// out[0] = CMD_GET_INFO; +// SendData(out, 64); +// ReadData(in, 64); +// if(in[0] == CMD_GET_INFO && in[1] == 0x01) +// return true; +// else +// return false; + } + return false; +} + +/** @brief Finds all chips connected to com ports + @return number of devices found +*/ +int ConnectionCOM::RefreshDeviceList() +{ + int wasOpen = -1; + string wasOpenName = ""; + if(IsOpen()) + { + wasOpen = GetOpenedIndex(); + wasOpenName = comPortName; + } + Close(); + comPortList.clear(); + if(comPortList.size() == 0) + FindAllComPorts(); + + m_deviceNames.clear(); + string comName; + for(unsigned int i=0; i ConnectionCOM::GetDeviceNames() +{ + return m_deviceNames; +} + +/** @brief Purges communication buffers +*/ +void ConnectionCOM::ClearComm() +{ +#ifndef __unix__ + PurgeComm(hComm, PURGE_TXCLEAR|PURGE_RXCLEAR); +#endif +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h new file mode 100644 index 0000000000..0549472db1 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h @@ -0,0 +1,62 @@ +/** +@file ConnectionCOM.h +@author Lime Microsystems (www.limemicro.com) +@brief Class for data communications through COM port +*/ + +#ifndef CONNECTION_COM_PORT_H +#define CONNECTION_COM_PORT_H + +#ifndef __unix__ + #include "windows.h" +#endif + +#include "IConnection.h" + +class ConnectionCOM : public IConnection +{ +public: + static const int COM_BUFFER_LENGTH = 1024; //max buffer size for data + + ConnectionCOM(); + ~ConnectionCOM(); + + DeviceStatus Open(); + DeviceStatus Open(unsigned i); + void Close(); + bool IsOpen(); + int GetOpenedIndex(); + + int Write(const unsigned char *buffer, int length, int timeout_ms = 0); + int Read(unsigned char *buffer, int length, int timeout_ms = 0); + + std::vector GetDeviceNames(); + int RefreshDeviceList(); + void ClearComm(); +private: + void FindAllComPorts(); + DeviceStatus Open(const char *comName, int baudrate); + + bool TestConnectivity(); + + std::string comPortName; + int comBaudrate; + bool connected; + + int currentDeviceIndex; + std::vector comPortList; + std::vector m_deviceNames; + +#ifndef __unix__ + HANDLE hComm; + COMMTIMEOUTS m_ctmoNew; + COMMTIMEOUTS m_ctmoOld; + OVERLAPPED m_osROverlap; + OVERLAPPED m_osWOverlap; + DCB m_dcbCommPort; +#else + int hComm; //com port file descriptor +#endif + +}; +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp new file mode 100644 index 0000000000..36f73da5d7 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp @@ -0,0 +1,314 @@ +/** + @file ConnectionManager.cpp + @author Lime Microsystems (www.limemicro.com) + @brief Implementation of various connection types to devices +*/ + +#include "ConnectionManager.h" +#include "ConnectionCOM.h" + +#ifdef ENABLE_USB_CONNECTION + #include "ConnectionUSB.h" +#endif +#ifdef ENABLE_SPI_CONNECTION + #include "ConnectionSPI.h" +#endif + +#include +#include +#include + +/** @brief Creates connection interfaces +*/ +ConnectionManager::ConnectionManager() : activeControlPort(NULL) +{ + mLogData = false; + mOpenedDevice = -1; + m_connections[IConnection::COM_PORT] = new ConnectionCOM(); +#ifdef ENABLE_USB_CONNECTION + m_connections[IConnection::USB_PORT] = new ConnectionUSB(); +#endif +#ifdef ENABLE_SPI_CONNECTION + m_connections[IConnection::SPI_PORT] = new ConnectionSPI(); +#endif +} + +/** @brief Destroys connection interfaces +*/ +ConnectionManager::~ConnectionManager() +{ + for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) + { + delete iter->second; + } +} + +/** @brief Checks if connection to device is opened + @return True if device is connected +*/ +bool ConnectionManager::IsOpen() +{ + return activeControlPort ? activeControlPort->IsOpen() : false; +} + +/** @brief Opens connection to first available device + @return True if connected to device +*/ +bool ConnectionManager::Open() +{ + return Open(0); +} + +/** @brief Connects to selected device + @param i device index from device list + @return 1:Success, 0:failure +*/ +int ConnectionManager::Open(unsigned i) +{ + if(i >= mDevices.size()) + return 0; + + if(activeControlPort) + activeControlPort->Close(); + switch(mDevices[i].port) + { + case IConnection::COM_PORT: + activeControlPort = m_connections[IConnection::COM_PORT]; + break; + case IConnection::USB_PORT: + activeControlPort = m_connections[IConnection::USB_PORT]; + break; + case IConnection::SPI_PORT: + activeControlPort = m_connections[IConnection::SPI_PORT]; + break; + default: + return 0; + } + mOpenedDevice = -1; + if( i < mDevices.size() ) + { + if( activeControlPort->Open(mDevices[i].portIndex) ) + { + mOpenedDevice = i; + return 1; + } + } + return 0; +} + +/** @brief Closes connection to device +*/ +void ConnectionManager::Close() +{ + if(activeControlPort) + { + activeControlPort->Close(); + //Notify(LMS_Message(MSG_BOARD_DISCONNECTED, "", 0, 0)); + } + mOpenedDevice = -1; +} + +/** @brief Finds all currently connected devices and forms device list + @return number of devices found +*/ +int ConnectionManager::RefreshDeviceList() +{ + mDeviceList.clear(); + mDevices.clear(); + DeviceInfo dev; + for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) + { + vector names; + IConnection *port = iter->second; + if(port->RefreshDeviceList() > 0) + { + names = port->GetDeviceNames(); + for(unsigned i=0; ifirst; + dev.portIndex = i; + mDevices.push_back(dev); + } + } + } + for(unsigned i=0; iWrite(buffer, length, timeout_ms); +#ifndef NDEBUG + if(mLogData) + { + stringstream ss; + ss << "WR(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; + ss << std::hex << std::setfill('0'); + int repeatedZeros = 0; + for(int i=length-1; i>=0; --i) + if(buffer[i] == 0) + ++repeatedZeros; + else break; + if(repeatedZeros == 1) + repeatedZeros = 0; + repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); + for(int i=0; i 1) + ss << " (00 x " << std::dec << repeatedZeros << " times)"; + cout << ss.str() << endl; + } +#endif + return bytesTransferred; + } + return -1; +} + +/** @brief Receives data from currently opened connection + @param buffer incomming data buffer, must be big enough for length bytes + @param length bytes to read + @param timeout_ms timeout in milliseconds + @return number of bytes received +*/ +int ConnectionManager::Read(unsigned char *buffer, int length, int timeout_ms) +{ + if(activeControlPort) + { + int bytesTransferred = activeControlPort->Read(buffer, length, timeout_ms); +#ifndef NDEBUG + if(mLogData) + { + stringstream ss; + ss << "RD(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; + ss << std::hex << std::setfill('0'); + int repeatedZeros = 0; + for(int i=length-1; i>=0; --i) + if(buffer[i] == 0) + ++repeatedZeros; + else break; + if(repeatedZeros == 2) + repeatedZeros = 0; + repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); + for(int i=0; i 2) + ss << " (00 x " << std::dec << repeatedZeros << " times)"; + cout << ss.str() << endl; + } +#endif + return bytesTransferred; + } + return -1; +} + +int ConnectionManager::WriteStream(const char *buffer, int length) +{ + return 0; +} + +int ConnectionManager::ReadStream(char *buffer, int length, unsigned int timeout_ms) +{ + /*int handle = activeControlPort->BeginDataReading(buffer, length); + activeControlPort->WaitForReading(handle, timeout_ms); + long received = length; + activeControlPort->FinishDataReading(buffer, received, handle); + return received; + */ + long len = length; + int status = activeControlPort->ReadDataBlocking(buffer, len, 0); + return len; +} + + +int ConnectionManager::BeginDataReading(char *buffer, long length) +{ + return activeControlPort->BeginDataReading(buffer, length); +} +/** +@brief Blocks until data is received or set number of milliseconds have passed. +@param contextHandle handle returned by BeginDataReading() +@param timeout_ms number of milliseconds to wait +@return 1-data received, 0-data not received +*/ +int ConnectionManager::WaitForReading(int contextHandle, unsigned int timeout_ms) +{ + return activeControlPort->WaitForReading(contextHandle, timeout_ms); +} +/** +@brief Finished asynchronous data reading. +@param buffer where to put received data +@param length number of bytes to read, will be changed to actual number of bytes received +@param contextHandle context handle returned by BeginDataReading() +@return received data length +*/ +int ConnectionManager::FinishDataReading(char *buffer, long &length, int contextHandle) +{ + return activeControlPort->FinishDataReading(buffer, length, contextHandle); +} + +/** +@brief Aborts reading operations +*/ +void ConnectionManager::AbortReading() +{ + activeControlPort->AbortReading(); +} + +/** +@brief Start asynchronous data sending. +@param buffer data buffer to be sent +@param length number of bytes to send. +@return context handle +*/ +int ConnectionManager::BeginDataSending(const char *buffer, long length) +{ + return activeControlPort->BeginDataSending(buffer, length); +} +/** +@brief Blocks until data is sent or set number of miliseconds have passed. +@param contextHandle handle returned by BeginDataReading() +@param timeout_ms number of miliseconds to wait +@return 1-data sent, 0-data not sent +*/ +int ConnectionManager::WaitForSending(int contextHandle, unsigned int timeout_ms) +{ + return activeControlPort->WaitForSending(contextHandle, timeout_ms); +} +/** +@brief Finished asynchronous data sending. +@param buffer where to put received data +@param length number of bytes to send, will be changed to actual number of bytes sent +@param contextHandle context handle returned by BeginDataReading() +@return sent data length +*/ +int ConnectionManager::FinishDataSending(const char *buffer, long &length, int contextHandle) +{ + return activeControlPort->FinishDataSending(buffer, length, contextHandle); +} + +/** +@brief Aborts sending operations +*/ +void ConnectionManager::AbortSending() +{ + activeControlPort->AbortSending(); +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h new file mode 100644 index 0000000000..edd01d3833 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h @@ -0,0 +1,60 @@ +/** + @file ConnectionManager.h + @author Lime Microsystems (www.limemicro.com) + @brief Class for managing connection to devices +*/ + +#ifndef LMS_CONNECTION_MANAGER_H +#define LMS_CONNECTION_MANAGER_H + +#include "IConnection.h" +#include + +class ConnectionManager +{ +public: + struct DeviceInfo + { + std::string name; + IConnection::eConnectionType port; + int portIndex; + }; + + ConnectionManager(); + ~ConnectionManager(); + bool IsOpen(); + bool Open(); + int Open(unsigned i); + void Close(); + int RefreshDeviceList(); + int GetOpenedIndex(); + std::vector GetDeviceList(){return mDeviceList;}; + + int Write(const unsigned char *buffer, int length, int timeout_ms = 0); + int Read(unsigned char *buffer, int length, int timeout_ms = 0); + + int WriteStream(const char *buffer, int length); + int ReadStream(char *buffer, int length, unsigned int timeout_ms); + + int BeginDataReading(char *buffer, long length); + int WaitForReading(int contextHandle, unsigned int timeout_ms); + int FinishDataReading(char *buffer, long &length, int contextHandle); + void AbortReading(); + + int BeginDataSending(const char *buffer, long length); + int WaitForSending(int contextHandle, unsigned int timeout_ms); + int FinishDataSending(const char *buffer, long &length, int contextHandle); + void AbortSending(); + +protected: + bool mLogData; + /// Port used for communication. + IConnection *activeControlPort; + std::vector mDevices; + std::vector mDeviceList; + int mOpenedDevice; + std::map m_connections; +}; + +#endif // LMS_CONNECTION_MANAGER_H + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp new file mode 100644 index 0000000000..e490db4dab --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp @@ -0,0 +1,290 @@ +/** + @file ConnectionSPI.cpp + @author Lime Microsystems (www.limemicro.com) + @brief Implementation of communications through SPI port +*/ + +#include "ConnectionSPI.h" + +#include "string.h" +#ifdef __unix__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // LINUX + +#include +#include + +const int ConnectionSPI::cSPI_BUF_SIZE = 128; +const int ConnectionSPI::cSPI_SPEED_HZ = 2000000; + +/** @brief Tries to read EEPROM for Novena board signature + @return true if Novena board +*/ +bool IsNovenaBoard() +{ +#ifdef __unix__ + char data[8]; + int count = 6; + memset(data, 0, 8); + int addr = 0; + struct i2c_rdwr_ioctl_data session; + struct i2c_msg messages[2]; + char set_addr_buf[2]; + memset(set_addr_buf, 0, sizeof(set_addr_buf)); + memset(data, 0, count); + set_addr_buf[0] = addr>>8; + set_addr_buf[1] = addr; + messages[0].addr = 0xac>>1; + messages[0].flags = 0; + messages[0].len = sizeof(set_addr_buf); + messages[0].buf = set_addr_buf; + messages[1].addr = 0xac>>1; + messages[1].flags = I2C_M_RD; + messages[1].len = count; + messages[1].buf = data; + session.msgs = messages; + session.nmsgs = 2; + + bool isNovena = false; + + int fd = open("/dev/i2c-2", O_RDWR); + if(fd > 0) + { + if(ioctl(fd, I2C_RDWR, &session) < 0) + { + perror("Unable to communicate with i2c device"); + isNovena = false; + } + if(strcmp("Novena", data) == 0) + isNovena = true; + } + close(fd); + return isNovena; +#else + return false; +#endif +} + +/** @brief Initializes SPI port and exports needed GPIO +*/ +ConnectionSPI::ConnectionSPI() +{ + fd = -1; + m_connectionType = SPI_PORT; + std::fstream gpio; + //export SEN pin + gpio.open("/sys/class/gpio/export", ios::out); + if(gpio.good()) + { + gpio << 122; + gpio.flush(); + gpio.close(); + gpio.open("/sys/class/gpio/gpio122/direction", ios::out); + gpio << "out"; + gpio.flush(); + gpio.close(); + m_SEN.open("/sys/class/gpio/gpio122/value", ios::out); + m_SEN<< 1; + m_SEN.flush(); + cout << "GPIO122: set to 1" << endl; + } +} + +ConnectionSPI::~ConnectionSPI() +{ + Close(); + m_SEN.close(); +} + +/** @brief Opens connection to first found chip + @return 0-success +*/ +IConnection::DeviceStatus ConnectionSPI::Open() +{ + Close(); +#ifdef __unix__ + fd = open("/dev/spidev2.0", O_RDWR | O_SYNC); + if (fd < 0) + { + //MessageLog::getInstance()->write("SPI PORT: device not found\n", LOG_ERROR); + return IConnection::FAILURE; + } + int mode = SPI_MODE_0; + int ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); + if (ret == -1) + printf("can't set spi mode"); + + ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); + if (ret == -1) + printf("can't get spi mode"); + + /* + * bits per word + */ + int bits = 8; + ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); + if (ret == -1) + printf("can't set bits per word"); + + ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); + if (ret == -1) + printf("can't get bits per word"); + + /* + * max speed hz + */ + int speed = cSPI_SPEED_HZ; + ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); + if (ret == -1) + printf("can't set max speed hz"); + + ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); + if (ret == -1) + printf("can't get max speed hz"); + + printf("spi mode: 0x%x\n", mode); + printf("bits per word: %d\n", bits); + printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); + return IConnection::SUCCESS; +#else + return IConnection::FAILURE; +#endif +} + +/** @brief Opens connection to selected chip + @param index chip index in device list + @return 0-success +*/ +IConnection::DeviceStatus ConnectionSPI::Open(unsigned index) +{ + return Open(); +} + +/** @brief Closes connection to chip +*/ +void ConnectionSPI::Close() +{ +#ifdef __unix__ + close(fd); + fd = -1; +#endif +} + +/** @brief Returns whether chip is connected + @return chip is connected +*/ +bool ConnectionSPI::IsOpen() +{ + return (fd >= 0); +} + +/** @brief Sends data through SPI port + @param buffer data buffer to send + @param length size of data buffer + @param timeout_ms timeout limit for operation in milliseconds + @return Number of bytes sent +*/ +int ConnectionSPI::Write(const unsigned char *buffer, int length, int timeout_ms) +{ + #ifdef __unix__ + if(fd < 0) + return 0; + m_SEN << 0; + m_SEN.flush(); + unsigned long bytesWritten = 0; + rxbuf.clear(); + int bytesReceived = 0; + char rxbytes[2]; + while(bytesWritten < length) + { + int toWrite = length-bytesWritten > cSPI_BUF_SIZE ? cSPI_BUF_SIZE : length-bytesWritten; + for(int i=0; i rxbuf.size() ? rxbuf.size() : length; + memcpy(buffer, &rxbuf[0], tocpy); + rxbuf.clear(); + return tocpy; +#else + return 0; +#endif +} + +/** @brief Finds SPI port + @return number of devices found +*/ +int ConnectionSPI::RefreshDeviceList() +{ + m_deviceNames.clear(); +#ifdef __unix__ + int spidev = open("/dev/spidev2.0", O_RDWR); + if (spidev >= 0) + { + if(IsNovenaBoard() == true) + m_deviceNames.push_back("SPI (Novena)"); + else + m_deviceNames.push_back("SPI"); + } + close(spidev); +#endif + return m_deviceNames.size(); +} + +/** @brief Returns found devices names + @return vector of device names +*/ +vector ConnectionSPI::GetDeviceNames() +{ + return m_deviceNames; +} + +int ConnectionSPI::GetOpenedIndex() +{ + return 0; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h new file mode 100644 index 0000000000..79d9bd9b9b --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h @@ -0,0 +1,41 @@ +/** +@file ConnectionSPI.h +@author Lime Microsystems (www.limemicro.com) +@brief Class for data communications through SPI port +*/ + +#ifndef CONNECTION_SPI_PORT_H +#define CONNECTION_SPI_PORT_H + +#include "IConnection.h" +#include +#include +#include + +class ConnectionSPI : public IConnection +{ +public: + static const int cSPI_BUF_SIZE; + static const int cSPI_SPEED_HZ; + + ConnectionSPI(); + ~ConnectionSPI(); + + DeviceStatus Open(); + DeviceStatus Open(unsigned i); + void Close(); + bool IsOpen(); + int GetOpenedIndex(); + + int Write(const unsigned char *buffer, int length, int timeout_ms = 0); + int Read(unsigned char *buffer, int length, int timeout_ms = 0); + + std::vector GetDeviceNames(); + int RefreshDeviceList(); +protected: + std::vector m_deviceNames; + std::vector rxbuf; + int fd; + std::fstream m_SEN; +}; +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp new file mode 100644 index 0000000000..b99fe6490b --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp @@ -0,0 +1,762 @@ +/** +@file ConnectionUSB.cpp +@author Lime Microsystems (www.limemicro.com) +@brief Data writing and reading through USB port +*/ + +#include "ConnectionUSB.h" +#include + +#ifdef __unix__ + #include + #include +#endif + +#define USB_TIMEOUT 1000 + +#define HW_LDIGIRED L"DigiRed" +#define HW_LDIGIGREEN L"DigiGreen" +#define HW_LSTREAMER L"Stream" + +#define HW_DIGIRED "DigiRed" +#define HW_DIGIGREEN "DigiGreen" +#define HW_STREAMER "Stream" + +#define CTR_W_REQCODE 0xC1 +#define CTR_W_VALUE 0x0000 +#define CTR_W_INDEX 0x0000 + +#define CTR_R_REQCODE 0xC0 +#define CTR_R_VALUE 0x0000 +#define CTR_R_INDEX 0x0000 + +/** @brief Initializes port type and object necessary to communicate to usb device. +*/ +ConnectionUSB::ConnectionUSB() +{ + m_hardwareName = ""; + isConnected = false; + m_connectionType = USB_PORT; +#ifndef __unix__ + USBDevicePrimary = new CCyUSBDevice(NULL); + OutCtrEndPt = NULL; + InCtrEndPt = NULL; + InCtrlEndPt3 = NULL; + OutCtrlEndPt3 = NULL; +#else + dev_handle = 0; + devs = 0; + int r = libusb_init(&ctx); //initialize the library for the session we just declared + if(r < 0) + printf("Init Error %i\n", r); //there was an error + libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation +#endif + currentDeviceIndex = -1; +} + +/** @brief Closes connection to chip and deallocates used memory. +*/ +ConnectionUSB::~ConnectionUSB() +{ + Close(); +#ifndef __unix__ + delete USBDevicePrimary; +#else + libusb_exit(ctx); +#endif +} + +/** @brief Automatically open first available chip connected to usb port. + @return 0-success, other-failure +*/ +IConnection::DeviceStatus ConnectionUSB::Open() +{ + currentDeviceIndex = -1; + if(m_deviceNames.size() == 0) + RefreshDeviceList(); + +#ifndef __unix__ + for(int i=0; iDeviceCount(); ++i) + if( Open(i) == SUCCESS) + { + currentDeviceIndex = i; + return SUCCESS; + } +#else + if(Open(0) == SUCCESS) + return SUCCESS; +#endif + return FAILURE; +} + +/** @brief Tries to open connected USB device and find communication endpoints. + @return Returns 1-Success, 0-EndPoints not found or device didn't connect. +*/ +IConnection::DeviceStatus ConnectionUSB::Open(unsigned index) +{ +#ifndef __unix__ + wstring m_hardwareDesc = L""; + if( index < USBDevicePrimary->DeviceCount()) + { + if(USBDevicePrimary->Open(index)) + { + m_hardwareDesc = USBDevicePrimary->Product; + unsigned int pos; + //determine connected board type + pos = m_hardwareDesc.find(HW_LDIGIRED, 0); + if( pos != wstring::npos ) + m_hardwareName = HW_DIGIRED; + else if (m_hardwareDesc.find(HW_LSTREAMER, 0) != wstring::npos) + m_hardwareName = HW_STREAMER; + else + m_hardwareName = HW_STREAMER; + + + if (InCtrlEndPt3) + { + delete InCtrlEndPt3; + InCtrlEndPt3 = NULL; + } + InCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); + + if (OutCtrlEndPt3) + { + delete OutCtrlEndPt3; + OutCtrlEndPt3 = NULL; + } + OutCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); + + InCtrlEndPt3->ReqCode = CTR_R_REQCODE; + InCtrlEndPt3->Value = CTR_R_VALUE; + InCtrlEndPt3->Index = CTR_R_INDEX; + + OutCtrlEndPt3->ReqCode = CTR_W_REQCODE; + OutCtrlEndPt3->Value = CTR_W_VALUE; + OutCtrlEndPt3->Index = CTR_W_INDEX; + + for (int i=0; iEndPointCount(); i++) + if(USBDevicePrimary->EndPoints[i]->Address == 0x01) + { + OutEndPt = USBDevicePrimary->EndPoints[i]; + long len = OutEndPt->MaxPktSize * 64; + OutEndPt->SetXferSize(len); + break; + } + for (int i=0; iEndPointCount(); i++) + if(USBDevicePrimary->EndPoints[i]->Address == 0x81) + { + InEndPt = USBDevicePrimary->EndPoints[i]; + long len = InEndPt->MaxPktSize * 64; + InEndPt->SetXferSize(len); + break; + } + isConnected = true; + return SUCCESS; + } //successfully opened device + } //if has devices + return FAILURE; +#else + if(index >= 0 && index < m_dev_pid_vid.size()) + { + dev_handle = libusb_open_device_with_vid_pid(ctx, m_dev_pid_vid[index].second, m_dev_pid_vid[index].first); + + if(dev_handle == 0) + return FAILURE; + if(libusb_kernel_driver_active(dev_handle, 0) == 1) //find out if kernel driver is attached + { + printf("Kernel Driver Active\n"); + if(libusb_detach_kernel_driver(dev_handle, 0) == 0) //detach it + printf("Kernel Driver Detached!\n"); + } + int r = libusb_claim_interface(dev_handle, 0); //claim interface 0 (the first) of device + if(r < 0) + { + printf("Cannot Claim Interface\n"); + return CANNOT_CLAIM_INTERFACE; + } + printf("Claimed Interface\n"); + isConnected = true; + return SUCCESS; + } + else + { + return FAILURE; + } +#endif +} + +/** @brief Closes communication to device. +*/ +void ConnectionUSB::Close() +{ + #ifndef __unix__ + USBDevicePrimary->Close(); + InEndPt = NULL; + OutEndPt = NULL; + if (InCtrlEndPt3) + { + delete InCtrlEndPt3; + InCtrlEndPt3 = NULL; + } + if (OutCtrlEndPt3) + { + delete OutCtrlEndPt3; + OutCtrlEndPt3 = NULL; + } + #else + if(dev_handle != 0) + { + libusb_release_interface(dev_handle, 0); + libusb_close(dev_handle); + dev_handle = 0; + } + #endif + isConnected = false; +} + +/** @brief Returns connection status + @return 1-connection open, 0-connection closed. +*/ +bool ConnectionUSB::IsOpen() +{ + #ifndef __unix__ + return USBDevicePrimary->IsOpen() && isConnected; + #else + return isConnected; + #endif +} + +/** @brief Sends given data buffer to chip through USB port. + @param buffer data buffer, must not be longer than 64 bytes. + @param length given buffer size. + @param timeout_ms timeout limit for operation in milliseconds + @return number of bytes sent. +*/ +int ConnectionUSB::Write(const unsigned char *buffer, const int length, int timeout_ms) +{ + long len = length; + if(IsOpen()) + { + unsigned char* wbuffer = new unsigned char[length]; + memcpy(wbuffer, buffer, length); + if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) + { + #ifndef __unix__ + if(OutCtrlEndPt3) + OutCtrlEndPt3->Write(wbuffer, len); + else + len = 0; + #else + len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR,CTR_W_REQCODE ,CTR_W_VALUE, CTR_W_INDEX, wbuffer, length, USB_TIMEOUT); + #endif + } + else + { + #ifndef __unix__ + if(OutCtrEndPt) + OutCtrEndPt->XferData(wbuffer, len); + else + len = 0; + #else + int actual = 0; + libusb_bulk_transfer(dev_handle, 0x01, wbuffer, len, &actual, USB_TIMEOUT); + len = actual; + #endif + } + delete wbuffer; + } + else + return 0; + return len; +} + +/** @brief Reads data coming from the chip through USB port. + @param buffer pointer to array where received data will be copied, array must be + big enough to fit received data. + @param length number of bytes to read from chip. + @param timeout_ms timeout limit for operation in milliseconds + @return number of bytes received. +*/ +int ConnectionUSB::Read(unsigned char *buffer, const int length, int timeout_ms) +{ + long len = length; + if(IsOpen()) + { + if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) + { + #ifndef __unix__ + if(InCtrlEndPt3) + InCtrlEndPt3->Read(buffer, len); + else + len = 0; + #else + len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN ,CTR_R_REQCODE ,CTR_R_VALUE, CTR_R_INDEX, buffer, len, USB_TIMEOUT); + #endif + } + else + { + #ifndef __unix__ + if(InCtrEndPt) + InCtrEndPt->XferData(buffer, len); + else + len = 0; + #else + int actual = 0; + libusb_bulk_transfer(dev_handle, 0x81, buffer, len, &actual, USB_TIMEOUT); + len = actual; + #endif + } + } + return len; +} + +#ifdef __unix__ +/** @brief Function for handling libusb callbacks +*/ +void callback_libusbtransfer(libusb_transfer *trans) +{ + USBTransferContext *context = reinterpret_cast(trans->user_data); + switch(trans->status) + { + case LIBUSB_TRANSFER_CANCELLED: + printf("Transfer canceled\n" ); + context->bytesXfered = trans->actual_length; + context->done = true; + context->used = false; + context->reset(); + break; + case LIBUSB_TRANSFER_COMPLETED: + if(trans->actual_length == context->bytesExpected) + { + context->bytesXfered = trans->actual_length; + context->done = true; + } + //printf("Transfer complete %i\n", trans->actual_length); + break; + case LIBUSB_TRANSFER_ERROR: + printf("TRANSFER ERRRO\n"); + break; + case LIBUSB_TRANSFER_TIMED_OUT: + printf("transfer timed out\n"); + + break; + case LIBUSB_TRANSFER_OVERFLOW: + printf("transfer overflow\n"); + + break; + case LIBUSB_TRANSFER_STALL: + printf("transfer stalled\n"); + break; + } + context->mPacketProcessed.notify_one(); +} +#endif + +/** @brief Finds all chips connected to usb ports + @return number of devices found +*/ +int ConnectionUSB::RefreshDeviceList() +{ + #ifndef __unix__ + USBDevicePrimary->Close(); + currentDeviceIndex = -1; + m_deviceNames.clear(); + string name; + if (USBDevicePrimary->DeviceCount()) + { + for (int i=0; iDeviceCount(); ++i) + { + Open(i); + name = DeviceName(); + m_deviceNames.push_back(name); + } + currentDeviceIndex = -1; + } + #else + m_dev_pid_vid.clear(); + m_deviceNames.clear(); + int usbDeviceCount = libusb_get_device_list(ctx, &devs); + if(usbDeviceCount > 0) + { + libusb_device_descriptor desc; + for(int i=0; i(pid,vid)); + } + else if(pid == 241) + { + m_hardwareName = HW_DIGIRED; + libusb_device_handle *tempDev_handle; + tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid); + if(libusb_kernel_driver_active(tempDev_handle, 0) == 1) //find out if kernel driver is attached + { + if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it + printf("Kernel Driver Detached!\n"); + } + if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device + { + printf("Cannot Claim Interface\n"); + } + + string fullName; + //check operating speed + int speed = libusb_get_device_speed(devs[i]); + if(speed == LIBUSB_SPEED_HIGH) + fullName = "USB 2.0"; + else if(speed == LIBUSB_SPEED_SUPER) + fullName = "USB 3.0"; + else + fullName = "USB"; + fullName += " ("; + //read device name + char data[255]; + memset(data, 0, 255); + int st = libusb_get_string_descriptor_ascii(tempDev_handle, 2, (unsigned char*)data, 255); + if(strlen(data) > 0) + fullName += data; + fullName += ")"; + libusb_close(tempDev_handle); + + m_deviceNames.push_back(fullName); + m_dev_pid_vid.push_back( pair(pid,vid)); + } + } + } + } + else + { + libusb_free_device_list(devs, 1); + return 0; + } + #endif + return m_deviceNames.size(); +} + +void ConnectionUSB::ClearComm() +{ +} + +/** @return name of currently opened device as string. +*/ +string ConnectionUSB::DeviceName() +{ +#ifndef __unix__ + string name; + char tempName[USB_STRING_MAXLEN]; + //memcpy(tempName, USBDevicePrimary->FriendlyName, USB_STRING_MAXLEN); + //name = tempName; + + for (int i = 0; i < USB_STRING_MAXLEN; ++i) + tempName[i] = USBDevicePrimary->DeviceName[i]; + if (USBDevicePrimary->bSuperSpeed == true) + name = "USB 3.0"; + else if (USBDevicePrimary->bHighSpeed == true) + name = "USB 2.0"; + else + name = "USB"; + name += " ("; + name += tempName; + name += ")"; + return name; +#else + if(dev_handle != 0) + { + char data[255]; + int st = libusb_get_string_descriptor_ascii(dev_handle, 2, (unsigned char*)data, 255); + return string(data); + } + return "no name"; +#endif +} + +/** + @brief Starts asynchronous data reading from board + @param *buffer buffer where to store received data + @param length number of bytes to read + @return handle of transfer context +*/ +int ConnectionUSB::BeginDataReading(char *buffer, long length) +{ + int i = 0; + bool contextFound = false; + //find not used context + for(i = 0; iBeginDataXfer((unsigned char*)buffer, length, contexts[i].inOvLap); + return i; + #else + unsigned int Timeout = 1000; + libusb_transfer *tr = contexts[i].transfer; + libusb_fill_bulk_transfer(tr, dev_handle, 0x81, (unsigned char*)buffer, length, callback_libusbtransfer, &contexts[i], Timeout); + contexts[i].done = false; + contexts[i].bytesXfered = 0; + contexts[i].bytesExpected = length; + int status = libusb_submit_transfer(tr); + int actual = 0; + //int status = libusb_bulk_transfer(dev_handle, 0x81, (unsigned char*)buffer, length, &actual, USB_TIMEOUT); + if(status != 0) + printf("ERROR BEGIN DATA TRANSFER %s\n", libusb_error_name(status)); + #endif + return i; +} + +/** + @brief Waits for asynchronous data reception + @param contextHandle handle of which context data to wait + @param timeout_ms number of miliseconds to wait + @return 1-data received, 0-data not received +*/ +int ConnectionUSB::WaitForReading(int contextHandle, unsigned int timeout_ms) +{ + if( contexts[contextHandle].used == true && contextHandle >= 0) + { + int status = 0; + #ifndef __unix__ + if(InEndPt) + status = InEndPt->WaitForXfer(contexts[contextHandle].inOvLap, timeout_ms); + return status; + #else + auto t1 = chrono::high_resolution_clock::now(); + auto t2 = chrono::high_resolution_clock::now(); + while(contexts[contextHandle].done == false && std::chrono::duration_cast(t2 - t1).count() < timeout_ms) + { + struct timeval tv; + tv.tv_sec = 1; + tv.tv_usec = 0; + //if(libusb_handle_events(ctx) != 0) + if(libusb_handle_events_timeout_completed(ctx, &tv, NULL) != 0) + printf("error libusb_handle_events %i\n", status); + t2 = chrono::high_resolution_clock::now(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + std::unique_lock lck(contexts[contextHandle].m_lock); + while(contexts[contextHandle].done == false) //is changed in libusb callback + { + if(contexts[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return 0; + } + return contexts[contextHandle].done == true; + #endif + } + else + return 0; +} + +/** + @brief Finishes asynchronous data reading from board + @param buffer array where to store received data + @param length number of bytes to read, function changes this value to number of bytes actually received + @param contextHandle handle of which context to finish + @return false failure, true number of bytes received +*/ +int ConnectionUSB::FinishDataReading(char *buffer, long &length, int contextHandle) +{ + if( contexts[contextHandle].used == true && contextHandle >= 0) + { + #ifndef __unix__ + int status = 0; + if(InEndPt) + status = InEndPt->FinishDataXfer((unsigned char*)buffer, length, contexts[contextHandle].inOvLap, contexts[contextHandle].context); + contexts[contextHandle].used = false; + contexts[contextHandle].reset(); + return length; + #else + length = contexts[contextHandle].bytesXfered; + contexts[contextHandle].used = false; + contexts[contextHandle].reset(); + return length; + #endif + } + else + return 0; +} + +int ConnectionUSB::ReadDataBlocking(char *buffer, long &length, int timeout_ms) +{ +#ifndef __unix__ + return InEndPt->XferData((unsigned char*)buffer, length); +#else + return 0; +#endif +} + + +/** + @brief Aborts reading operations +*/ +void ConnectionUSB::AbortReading() +{ +#ifndef __unix__ + InEndPt->Abort(); +#else + for(int i=0; iBeginDataXfer((unsigned char*)buffer, length, contextsToSend[i].inOvLap); + return i; + #else + unsigned int Timeout = 1000; + libusb_transfer *tr = contextsToSend[i].transfer; + //libusb_set_iso_packet_lengths(contexts[i].transfer, 512*64); + libusb_fill_bulk_transfer(tr, dev_handle, 0x1, (unsigned char*)buffer, length, callback_libusbtransfer, &contextsToSend[i], Timeout); + contextsToSend[i].done = false; + contextsToSend[i].bytesXfered = 0; + contextsToSend[i].bytesExpected = length; + libusb_submit_transfer(tr); + #endif + return i; +} + +/** + @brief Waits for asynchronous data sending + @param contextHandle handle of which context data to wait + @param timeout_ms number of miliseconds to wait + @return 1-data received, 0-data not received +*/ +int ConnectionUSB::WaitForSending(int contextHandle, unsigned int timeout_ms) +{ + if( contextsToSend[contextHandle].used == true ) + { + #ifndef __unix__ + int status = 0; + if(OutEndPt) + status = OutEndPt->WaitForXfer(contextsToSend[contextHandle].inOvLap, timeout_ms); + return status; + #else + auto t1 = chrono::high_resolution_clock::now(); + auto t2 = chrono::high_resolution_clock::now(); + while(contextsToSend[contextHandle].done == false && std::chrono::duration_cast(t2 - t1).count() < timeout_ms) + { + struct timeval tv; + tv.tv_sec = 1; + tv.tv_usec = 0; + int status = libusb_handle_events_timeout_completed(ctx, &tv, NULL); + if(status != 0) + printf("error libusb_handle_events %i\n", status); + t2 = chrono::high_resolution_clock::now(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + std::unique_lock lck(contextsToSend[contextHandle].m_lock); + while(contextsToSend[contextHandle].done == false) //is changed in libusb callback + { + if(contextsToSend[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return 0; + } + return contextsToSend[contextHandle].done == true; + #endif + } + else + return 0; +} + +/** + @brief Finishes asynchronous data sending to board + @param buffer array where to store received data + @param length number of bytes to read, function changes this value to number of bytes acctually received + @param contextHandle handle of which context to finish + @return false failure, true number of bytes sent +*/ +int ConnectionUSB::FinishDataSending(const char *buffer, long &length, int contextHandle) +{ + if( contextsToSend[contextHandle].used == true) + { + #ifndef __unix__ + if(OutEndPt) + OutEndPt->FinishDataXfer((unsigned char*)buffer, length, contextsToSend[contextHandle].inOvLap, contextsToSend[contextHandle].context); + contextsToSend[contextHandle].used = false; + contextsToSend[contextHandle].reset(); + return length; + #else + length = contextsToSend[contextHandle].bytesXfered; + contextsToSend[contextHandle].used = false; + contextsToSend[contextHandle].reset(); + return length; + #endif + } + else + return 0; +} + +/** + @brief Aborts sending operations +*/ +void ConnectionUSB::AbortSending() +{ +#ifndef __unix__ + OutEndPt->Abort(); +#else + for (int i = 0; i ConnectionUSB::GetDeviceNames() +{ + return m_deviceNames; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h new file mode 100644 index 0000000000..f3048c1842 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h @@ -0,0 +1,144 @@ +/** +@file ConnectionUSB.h +@author Lime Microsystems (www.limemicro.com) +@brief Class for data writing and reading through USB port +*/ + +#ifndef USB_PORT_CONNECTION_H +#define USB_PORT_CONNECTION_H + +#include "IConnection.h" + +#ifndef __unix__ +#include "windows.h" +#include "CyAPI.h" +#else +#include +#include +#include +#include +#endif + +#define USB_MAX_CONTEXTS 64 //maximum number of contexts for asynchronous transfers + +/** @brief Wrapper class for holding USB asynchronous transfers contexts +*/ +class USBTransferContext +{ +public: + USBTransferContext() : used(false) + { + #ifndef __unix__ + inOvLap = new OVERLAPPED; + memset(inOvLap, 0, sizeof(OVERLAPPED)); + inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); + context = NULL; + #else + transfer = libusb_alloc_transfer(0); + bytesXfered = 0; + bytesExpected = 0; + done = 0; + #endif + } + ~USBTransferContext() + { + #ifndef __unix__ + CloseHandle(inOvLap->hEvent); + delete inOvLap; + #else + libusb_free_transfer(transfer); + #endif + } + bool reset() + { + if(used) + return false; + #ifndef __unix__ + CloseHandle(inOvLap->hEvent); + memset(inOvLap, 0, sizeof(OVERLAPPED)); + inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); + #endif + return true; + } + bool used; + #ifndef __unix__ + PUCHAR context; + OVERLAPPED *inOvLap; + #else + libusb_transfer* transfer; + long bytesXfered; + long bytesExpected; + bool done; + std::mutex m_lock; + std::condition_variable mPacketProcessed; + #endif +}; + +class ConnectionUSB : public IConnection +{ +public: + ConnectionUSB(); + ~ConnectionUSB(); + + void FindDevices(); + DeviceStatus Open(); + DeviceStatus Open(unsigned index); + void Close(); + bool IsOpen(); + int GetOpenedIndex(); + + int Write(const unsigned char *buffer, int length, int timeout_ms = 0); + int Read(unsigned char *buffer, int length, int timeout_ms = 0); + + virtual int BeginDataReading(char *buffer, long length); + virtual int WaitForReading(int contextHandle, unsigned int timeout_ms); + virtual int FinishDataReading(char *buffer, long &length, int contextHandle); + virtual void AbortReading(); + virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms); + + virtual int BeginDataSending(const char *buffer, long length); + virtual int WaitForSending(int contextHandle, unsigned int timeout_ms); + virtual int FinishDataSending(const char *buffer, long &length, int contextHandle); + virtual void AbortSending(); + + std::vector GetDeviceNames(); + int RefreshDeviceList(); + void ClearComm(); +private: + int currentDeviceIndex; + std::string DeviceName(); + + std::vector m_deviceNames; + std::string m_hardwareName; + int m_hardwareVer; + + USBTransferContext contexts[USB_MAX_CONTEXTS]; + USBTransferContext contextsToSend[USB_MAX_CONTEXTS]; + void Initialize(); + + bool isConnected; + int currentPortIndex; + + #ifndef __unix__ + CCyUSBDevice *USBDevicePrimary; + //control endpoints for DigiRed + CCyControlEndPoint *InCtrlEndPt3; + CCyControlEndPoint *OutCtrlEndPt3; + + //control endpoints for DigiGreen + CCyUSBEndPoint *OutCtrEndPt; + CCyUSBEndPoint *InCtrEndPt; + + //end points for samples reading and writing + CCyUSBEndPoint *InEndPt; + CCyUSBEndPoint *OutEndPt; + + #else + libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices + libusb_device_handle *dev_handle; //a device handle + libusb_context *ctx; //a libusb session + std::vector > m_dev_pid_vid; + #endif +}; + +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h new file mode 100644 index 0000000000..5804f1149f --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h @@ -0,0 +1,68 @@ +/** + @file IConnection.h + @author Lime Microsystems + @brief Interface class for connection types +*/ + +#ifndef ICONNECTION_H +#define ICONNECTION_H + +#include +#include + +using namespace std; + +class IConnection +{ +public: + /// Supported connection types. + enum eConnectionType + { + CONNECTION_UNDEFINED = -1, + COM_PORT = 0, + USB_PORT = 1, + SPI_PORT = 2, + //insert new types here + CONNECTION_TYPES_COUNT //used only for memory allocation + }; + + enum DeviceStatus + { + SUCCESS, + FAILURE, + END_POINTS_NOT_FOUND, + CANNOT_CLAIM_INTERFACE + }; + + IConnection() : m_connectionType(CONNECTION_UNDEFINED){}; + virtual ~IConnection(){}; + virtual int RefreshDeviceList() = 0; + virtual DeviceStatus Open(unsigned i) = 0; + virtual void Close() = 0; + virtual bool IsOpen() = 0; + virtual int GetOpenedIndex() = 0; + + virtual int Write(const unsigned char *buffer, int length, int timeout_ms = 0) = 0; + virtual int Read(unsigned char *buffer, int length, int timeout_ms = 0) = 0; + + virtual std::vector GetDeviceNames() = 0; + + virtual eConnectionType GetType() { return m_connectionType; }; + virtual bool SetParam(const char *name, const char* value) {return false;}; + + virtual int BeginDataReading(char *buffer, long length){ return -1; }; + virtual int WaitForReading(int contextHandle, unsigned int timeout_ms){ return 0;}; + virtual int FinishDataReading(char *buffer, long &length, int contextHandle){ return 0;} + virtual void AbortReading(){}; + virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms){ return 0; } + + virtual int BeginDataSending(const char *buffer, long length){ return -1; }; + virtual int WaitForSending(int contextHandle, unsigned int timeout_ms){ return 0;}; + virtual int FinishDataSending(const char *buffer, long &length, int contextHandle){ return 0;} + virtual void AbortSending(){}; +protected: + eConnectionType m_connectionType; +}; + +#endif + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h new file mode 100644 index 0000000000..6b06a51c7e --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h @@ -0,0 +1,218 @@ +/** +@file lms7002_defines.h +@author Lime Microsystems +@brief enumerations of available LMS7002M commands and statuses +*/ +#pragma once + +const int LMS_RST_DEACTIVATE = 0; +const int LMS_RST_ACTIVATE = 1; +const int LMS_RST_PULSE = 2; + +enum eLMS_DEV +{ + LMS_DEV_UNKNOWN, + LMS_DEV_EVB6, + LMS_DEV_DIGIGREEN, + LMS_DEV_DIGIRED, + LMS_DEV_EVB7, + LMS_DEV_ZIPPER, + LMS_DEV_SOCKETBOARD, + LMS_DEV_EVB7V2, + LMS_DEV_STREAM, + LMS_DEV_NOVENA, + LMS_DEV_DATASPARK, + LMS_DEV_RFSPARK, + LMS_DEV_LMS6002USB, + LMS_DEV_RFESPARK, + LMS_DEV_SODERA, + + LMS_DEV_COUNT +}; + +const char LMS_DEV_NAMES[][80] = +{ + "UNKNOWN", + "EVB6", + "DigiGreen", + "DigiRed", + "EVB7", + "ZIPPER", + "Socket Board", + "EVB7_v2", + "Stream", + "Novena", + "DataSpark", + "RF-Spark", + "LMS6002-USB Stick", + "RF-ESpark", + "SoDeRa", +}; + +static const char* GetDeviceName(const eLMS_DEV device) +{ + if (LMS_DEV_UNKNOWN < device && device < LMS_DEV_COUNT) + return LMS_DEV_NAMES[device]; + else + return LMS_DEV_NAMES[LMS_DEV_UNKNOWN]; +} + +enum eEXP_BOARD +{ + EXP_BOARD_UNKNOWN, + EXP_BOARD_UNSUPPORTED, + EXP_BOARD_NO, + EXP_BOARD_MYRIAD1, + EXP_BOARD_MYRIAD2, + EXP_BOARD_MYRIAD_NOVENA, + EXP_BOARD_HPM1000, + EXP_BOARD_MYRIAD7, + EXP_BOARD_HPM7, + + EXP_BOARD_COUNT +}; + +const char EXP_BOARD_NAMES[][80] = +{ + "UNKNOWN", + "UNSUPPORTED", + "NOT AVAILABLE", + "Myriad1", + "Myriad2", + "Novena", + "HPM1000", + "Myriad7", + "HMP7" +}; + +static const char* GetExpansionBoardName(const eEXP_BOARD board) +{ + if (EXP_BOARD_UNKNOWN < board && board < EXP_BOARD_COUNT) + return EXP_BOARD_NAMES[board]; + else + return EXP_BOARD_NAMES[EXP_BOARD_UNKNOWN]; +} + +struct LMS64C_Info +{ + unsigned char firmware; + unsigned char deviceType; + unsigned char protocol; + unsigned char hardware; + unsigned char expansionBoard; +}; + +enum eCMD_LMS +{ + CMD_GET_INFO = 0x00, + CMD_LMS6002_RST = 0x10, + ///Writes data to SI5356 synthesizer via I2C + CMD_SI5356_WR = 0x11, + ///Reads data from SI5356 synthesizer via I2C + CMD_SI5356_RD = 0x12, + ///Writes data to SI5351 synthesizer via I2C + CMD_SI5351_WR = 0x13, + ///Reads data from SI5351 synthesizer via I2C + CMD_SI5351_RD = 0x14, + ///PanelBus DVI (HDMI) Transmitter control + CMD_TFP410_WR = 0x15, + ///PanelBus DVI (HDMI) Transmitter control + CMD_TFP410_RD = 0x16, + ///Sets new LMS7002M chip’s RESET pin level (0, 1, pulse) + CMD_LMS7002_RST = 0x20, + ///Writes data to LMS7002M chip via SPI + CMD_LMS7002_WR = 0x21, + ///Reads data from LMS7002M chip via SPI + CMD_LMS7002_RD = 0x22, + ///Writes data to LMS6002 chip via SPI + CMD_LMS6002_WR = 0x23, + ///Reads data from LMS6002 chip via SPI + CMD_LMS6002_RD = 0x24, + + CMD_LMS_LNA = 0x2A, + CMD_LMS_PA = 0x2B, + + CMD_PROG_MCU = 0x2C, + ///Writes data to ADF4002 chip via SPI + CMD_ADF4002_WR = 0x31, + + CMD_USB_FIFO_RST = 0x40, + CMD_PE636040_WR = 0x41, + CMD_PE636040_RD = 0x42, + + CMD_GPIO_WR = 0x51, + CMD_GPIO_RD = 0x52, + + CMD_ALTERA_FPGA_GW_WR = 0x53, + CMD_ALTERA_FPGA_GW_RD = 0x54, + + CMD_BRDSPI_WR = 0x55,//16 bit spi for stream, dataspark control + CMD_BRDSPI_RD = 0x56,//16 bit spi for stream, dataspark control + CMD_BRDSPI8_WR = 0x57, //8 + 8 bit spi for stream, dataspark control + CMD_BRDSPI8_RD = 0x58, //8 + 8 bit spi for stream, dataspark control + + CMD_BRDCONF_WR = 0x5D, //write config data to board + CMD_BRDCONF_RD = 0x5E, //read config data from board + + CMD_ANALOG_VAL_WR = 0x61, //write analog value + CMD_ANALOG_VAL_RD = 0x62, //read analog value + + CMD_MYRIAD_RST = 0x80, + CMD_MYRIAD_WR = 0x81, + CMD_MYRIAD_RD = 0x82, + CMD_MYRIAD_PROG = 0x8C +}; + +enum eCMD_STATUS +{ + STATUS_UNDEFINED, + STATUS_COMPLETED_CMD, + STATUS_UNKNOWN_CMD, + STATUS_BUSY_CMD, + STATUS_MANY_BLOCKS_CMD, + STATUS_ERROR_CMD, + STATUS_WRONG_ORDER_CMD, + STATUS_RESOURCE_DENIED_CMD, + STATUS_COUNT +}; + +static const char status_text[][32]= +{ + "Undefined/Failure", + "Completed", + "Unknown command", + "Busy", + "Too many blocks", + "Error", + "Wrong order", + "Resource denied" +}; + +static const char* status2string(const int status) +{ + if(status >= 0 && status < STATUS_COUNT) + return status_text[status]; + else + return "Unknown status"; +} + +enum eADC_UNITS +{ + RAW, + VOLTAGE, + CURRENT, + RESISTANCE, + POWER, + TEMPERATURE, + ADC_UNITS_COUNT +}; + +static const char adc_units_text[][8] = {"", "V", "A", "Ohm", "W", "C"}; + +static const char* adcUnits2string(const unsigned units) +{ + if (units < ADC_UNITS_COUNT) + return adc_units_text[units]; + else + return " unknown"; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp new file mode 100644 index 0000000000..5b74ef8975 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp @@ -0,0 +1,326 @@ +/** +@file LMScomms.cpp +@author Lime Microsystems (www.limemicro.com) +@brief Implementation of data transmission to LMS boards +*/ + +#include "lmsComms.h" + +LMScomms::LMScomms() +{ + callback_logData = nullptr; + unsigned short test = 0x1234; + unsigned char* bytes = (unsigned char*)&test; + if(bytes[0] == 0x12 && bytes[1] == 0x34) + mSystemBigEndian = true; + else + mSystemBigEndian = false; +} + +LMScomms::~LMScomms() +{ +} + +/** @brief Transfers data between packet and connected device + @param pkt packet containing output data and to receive incomming data + @return 0: success, other: failure +*/ +LMScomms::TransferStatus LMScomms::TransferPacket(GenericPacket& pkt) +{ + std::lock_guard lock(mControlPortLock); + TransferStatus status = TRANSFER_SUCCESS; + if(IsOpen() == false) + return NOT_CONNECTED; + + int packetLen; + eLMS_PROTOCOL protocol = LMS_PROTOCOL_UNDEFINED; + if(activeControlPort->GetType() == IConnection::SPI_PORT) + protocol = LMS_PROTOCOL_NOVENA; + else + protocol = LMS_PROTOCOL_LMS64C; + switch(protocol) + { + case LMS_PROTOCOL_UNDEFINED: + return TRANSFER_FAILED; + case LMS_PROTOCOL_LMS64C: + packetLen = ProtocolLMS64C::pktLength; + break; + case LMS_PROTOCOL_NOVENA: + packetLen = pkt.outBuffer.size() > ProtocolNovena::pktLength ? ProtocolNovena::pktLength : pkt.outBuffer.size(); + break; + default: + packetLen = 0; + return TRANSFER_FAILED; + } + int outLen = 0; + unsigned char* outBuffer = NULL; + outBuffer = PreparePacket(pkt, outLen, protocol); + unsigned char* inBuffer = new unsigned char[outLen]; + memset(inBuffer, 0, outLen); + + int outBufPos = 0; + int inDataPos = 0; + if(outLen == 0) + { + //printf("packet outlen = 0\n"); + outLen = 1; + } + + if(protocol == LMS_PROTOCOL_NOVENA) + { + bool transferData = true; //some commands are fake, so don't need transferring + if(pkt.cmd == CMD_GET_INFO) + { + //spi does not have GET INFO, fake it to inform what device it is + pkt.status = STATUS_COMPLETED_CMD; + pkt.inBuffer.clear(); + pkt.inBuffer.resize(64, 0); + pkt.inBuffer[0] = 0; //firmware + pkt.inBuffer[1] = LMS_DEV_NOVENA; //device + pkt.inBuffer[2] = 0; //protocol + pkt.inBuffer[3] = 0; //hardware + pkt.inBuffer[4] = EXP_BOARD_UNSUPPORTED; //expansion + transferData = false; + } + + if(transferData) + { + if (callback_logData) + callback_logData(true, outBuffer, outLen); + int bytesWritten = Write(outBuffer, outLen); + if( bytesWritten == outLen) + { + if(pkt.cmd == CMD_LMS7002_RD) + { + inDataPos = Read(&inBuffer[inDataPos], outLen); + if(inDataPos != outLen) + status = TRANSFER_FAILED; + else + { + if (callback_logData) + callback_logData(false, inBuffer, inDataPos); + } + } + ParsePacket(pkt, inBuffer, inDataPos, protocol); + } + else + status = TRANSFER_FAILED; + } + } + else + { + for(int i=0; i= 5) + { + info.firmware = pkt.inBuffer[0]; + info.device = pkt.inBuffer[1] < LMS_DEV_COUNT ? (eLMS_DEV)pkt.inBuffer[1] : LMS_DEV_UNKNOWN; + info.protocol = pkt.inBuffer[2]; + info.hardware = pkt.inBuffer[3]; + info.expansion = pkt.inBuffer[4] < EXP_BOARD_COUNT ? (eEXP_BOARD)pkt.inBuffer[4] : EXP_BOARD_UNKNOWN; + } + return info; +} + +/** @brief Takes generic packet and converts to specific protocol buffer + @param pkt generic data packet to convert + @param length returns length of returned buffer + @param protocol which protocol to use for data + @return pointer to data buffer, must be manually deleted after use +*/ +unsigned char* LMScomms::PreparePacket(const GenericPacket& pkt, int& length, const eLMS_PROTOCOL protocol) +{ + unsigned char* buffer = NULL; + if(protocol == LMS_PROTOCOL_UNDEFINED) + return NULL; + + if(protocol == LMS_PROTOCOL_LMS64C) + { + ProtocolLMS64C packet; + int maxDataLength = packet.maxDataLength; + packet.cmd = pkt.cmd; + packet.status = pkt.status; + int byteBlockRatio = 1; //block ratio - how many bytes in one block + switch( packet.cmd ) + { + case CMD_PROG_MCU: + case CMD_GET_INFO: + case CMD_SI5351_RD: + case CMD_SI5356_RD: + byteBlockRatio = 1; + break; + case CMD_SI5351_WR: + case CMD_SI5356_WR: + byteBlockRatio = 2; + break; + case CMD_LMS7002_RD: + case CMD_BRDSPI_RD: + case CMD_BRDSPI8_RD: + byteBlockRatio = 2; + break; + case CMD_ADF4002_WR: + byteBlockRatio = 3; + break; + case CMD_LMS7002_WR: + case CMD_BRDSPI_WR: + case CMD_ANALOG_VAL_WR: + byteBlockRatio = 4; + break; + default: + byteBlockRatio = 1; + } + if (packet.cmd == CMD_LMS7002_RD || packet.cmd == CMD_BRDSPI_RD) + maxDataLength = maxDataLength/2; + if (packet.cmd == CMD_ANALOG_VAL_RD) + maxDataLength = maxDataLength / 4; + int blockCount = pkt.outBuffer.size()/byteBlockRatio; + int bufLen = blockCount/(maxDataLength/byteBlockRatio) + +(blockCount%(maxDataLength/byteBlockRatio)!=0); + bufLen *= packet.pktLength; + if(bufLen == 0) + bufLen = packet.pktLength; + buffer = new unsigned char[bufLen]; + memset(buffer, 0, bufLen); + int srcPos = 0; + for(int j=0; j*packet.pktLength (maxDataLength/byteBlockRatio)) + { + buffer[pktPos+2] = maxDataLength/byteBlockRatio; + blockCount -= buffer[pktPos+2]; + } + else + buffer[pktPos+2] = blockCount; + memcpy(&buffer[pktPos+3], packet.reserved, sizeof(packet.reserved)); + int bytesToPack = (maxDataLength/byteBlockRatio)*byteBlockRatio; + for (int k = 0; k> 8) | 0x80; + buffer[1] = NOVENA_GPIO_ADDR & 0xFF; + buffer[2] = 0x00; + buffer[3] = 0x18; + buffer[4] = (NOVENA_GPIO_ADDR >> 8) | 0x80; + buffer[5] = NOVENA_GPIO_ADDR & 0xFF; + buffer[6] = 0x00; + buffer[7] = 0x38; + length = 8; + } + else + { + buffer = new unsigned char[pkt.outBuffer.size()]; + memcpy(buffer, &pkt.outBuffer[0], pkt.outBuffer.size()); + if (pkt.cmd == CMD_LMS7002_WR) + { + for(int i=0; i callback) +{ + callback_logData = callback; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h new file mode 100644 index 0000000000..3d94d8ece2 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h @@ -0,0 +1,111 @@ +/** +@file LMScomms.h +@author Lime Microsystems (www.limemicro.com) +@brief Class for handling data transmission to LMS boards +*/ + +#ifndef LMS_COMMS_H +#define LMS_COMMS_H + +#include "lms7002_defines.h" +#include "connectionManager/ConnectionManager.h" +#include +#include + +struct LMSinfo +{ + eLMS_DEV device; + eEXP_BOARD expansion; + int firmware; + int hardware; + int protocol; +}; + +/* @brief Class for abstracting transfering data to and from chip +*/ +class LMScomms : public ConnectionManager +{ +public: + enum TransferStatus + { + TRANSFER_SUCCESS, + TRANSFER_FAILED, + NOT_CONNECTED + }; + + enum eLMS_PROTOCOL + { + LMS_PROTOCOL_UNDEFINED = 0, + LMS_PROTOCOL_DIGIC, + LMS_PROTOCOL_LMS64C, + LMS_PROTOCOL_NOVENA, + }; + struct ProtocolDIGIC + { + static const int pktLength = 64; + static const int maxDataLength = 60; + ProtocolDIGIC() : cmd(0), i2cAddr(0), blockCount(0) {}; + unsigned char cmd; + unsigned char i2cAddr; + unsigned char blockCount; + unsigned char reserved; + unsigned char data[maxDataLength]; + }; + + struct ProtocolLMS64C + { + static const int pktLength = 64; + static const int maxDataLength = 56; + ProtocolLMS64C() :cmd(0),status(STATUS_UNDEFINED),blockCount(0) + { + memset(reserved, 0, 5); + }; + unsigned char cmd; + unsigned char status; + unsigned char blockCount; + unsigned char reserved[5]; + unsigned char data[maxDataLength]; + }; + + struct ProtocolNovena + { + static const int pktLength = 128; + static const int maxDataLength = 128; + ProtocolNovena() :cmd(0),status(0) {}; + unsigned char cmd; + unsigned char status; + unsigned char blockCount; + unsigned char data[maxDataLength]; + }; + + struct GenericPacket + { + GenericPacket() + { + cmd = CMD_GET_INFO; + status = STATUS_UNDEFINED; + } + + eCMD_LMS cmd; + eCMD_STATUS status; + vector outBuffer; + vector inBuffer; + }; + + LMScomms(); + ~LMScomms(); + + virtual TransferStatus TransferPacket(GenericPacket &pkt); + LMSinfo GetInfo(); + void SetDataLogCallback(std::function callback); +protected: + std::function callback_logData; + std::mutex mControlPortLock; + unsigned char* PreparePacket(const GenericPacket &pkt, int &length, const eLMS_PROTOCOL protocol); + int ParsePacket(GenericPacket &pkt, const unsigned char* buffer, const int length, const eLMS_PROTOCOL protocol); +protected: + bool mSystemBigEndian; +}; + +#endif // LMS_COMMS_H + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h new file mode 100644 index 0000000000..9ae0c25d93 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h @@ -0,0 +1,18 @@ +/** +@file typedefs.h +@author Lime Microsystems (www.limemicro.com) +@brief Variables types definitions +*/ + +#ifndef LMS7002M_TYPEDEFS_H +#define LMS7002M_TYPEDEFS_H + +typedef unsigned int uint32_t; +typedef int int32_t; +typedef unsigned short uint16_t; +typedef short int16_t; +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef double float_type; + +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp new file mode 100644 index 0000000000..1ff4bbf1de --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp @@ -0,0 +1,334 @@ +/** +@author Lime Microsystems +@brief Stream board communications for Matlab +*/ + +#include "LMS_SDR.h" + +#include "lmsComms.h" +#include "LMS_StreamBoard.h" +#include "ringBuffer.h" +#include "IConnection.h" +#include "fifo.h" +#include "dataTypes.h" +#include +#include + +#include +#include +#include +#include +#include + +#define _USE_MATH_DEFINES +#include + +using namespace std; + +typedef enum +{ + LMS_SUCCESS = 0, + LMS_ERROR +} LMS_STATUS; + +LMS_SamplesFIFO rxBuffer(1); +static thread rxThread; +atomic rxStop(1); +atomic rxRunning(0); +atomic rxDroppedSamples(0); +atomic RxDataRate(0); +atomic rxSamplingRate(0); + +LMS_SamplesFIFO txBuffer(1); +static thread txThread; +atomic txStop(1); +atomic txRunning(0); +atomic txDroppedSamples(0); +atomic TxDataRate(0); +atomic txSamplingRate(0); + +LMScomms comPort(IConnection::COM_PORT); +LMScomms usbPort(IConnection::USB_PORT); +LMS_StreamBoard streamer(&usbPort); + +const int samplesInPacket = 1024; +unsigned int opMode = 0; + +DLL_EXPORT void LMS_Stats(uint32_t *RxBufSize, uint32_t *RxBufFilled, uint32_t *RxSamplingRate, uint32_t *TxBufSize, uint32_t *TxBufFilled, uint32_t *TxSamplingRate) +{ + LMS_SamplesFIFO::BufferInfo rxStats = rxBuffer.GetInfo(); + LMS_SamplesFIFO::BufferInfo txStats = txBuffer.GetInfo(); + if (RxBufSize) + *RxBufSize = rxStats.size*samplesInPacket; + if (RxBufFilled) + *RxBufFilled = rxStats.itemsFilled*samplesInPacket; + if (TxBufSize) + *TxBufSize = txStats.size*samplesInPacket; + if (TxBufFilled) + *TxBufFilled = txStats.itemsFilled*samplesInPacket; + if (TxSamplingRate) + *TxSamplingRate = txSamplingRate.load(); + if (RxSamplingRate) + *RxSamplingRate = rxSamplingRate.load(); +} + +DLL_EXPORT int LMS_Init(const int OperationMode, uint32_t trxBuffersLength) +{ + opMode = OperationMode; + unsigned int packetsNeeded = trxBuffersLength / samplesInPacket; + if (trxBuffersLength % samplesInPacket != 0) + ++packetsNeeded; + if (packetsNeeded >= (uint32_t)(1 << 31)) + packetsNeeded = (uint32_t)(1 << 31); + for (int i = 0; i < 32; ++i) + if ((1 << i) >= packetsNeeded) + { + packetsNeeded = (1 << i); + break; + } + rxBuffer.Reset(packetsNeeded); + txBuffer.Reset(packetsNeeded); + return LMS_SUCCESS; +} + +DLL_EXPORT int LMS_Destroy() +{ + LMS_RxStop(); + //buffers size is reduced to lower memory consumption when not used + rxBuffer.Reset(1); + txBuffer.Reset(1); + return LMS_SUCCESS; +} + +DLL_EXPORT LMScomms* LMS_GetUSBPort() +{ + return &usbPort; +} + +DLL_EXPORT LMScomms* LMS_GetCOMPort() +{ + return &comPort; +} + +const int maxDevListLen = 32; +const int maxDevNameLen = 256; //each device name not longer than 256 +static char DeviceNames[maxDevListLen][maxDevNameLen]; + +DLL_EXPORT int LMS_UpdateDeviceList(LMScomms* port) +{ + memset(DeviceNames, 0, maxDevListLen*maxDevNameLen); + port->Close(); + int devCount = port->RefreshDeviceList(); + vector names = port->GetDeviceList(); + int charsWritten = 0; + for (unsigned int i = 0; i < names.size() && i < maxDevListLen; ++i) + { + charsWritten += sprintf(DeviceNames[i], "[%i] %.*s", i, maxDevNameLen, names[i].c_str()); + } + return devCount; +} + +DLL_EXPORT const char* LMS_GetDeviceName(LMScomms* port, unsigned int deviceIndex) +{ + if (deviceIndex < maxDevListLen) + return DeviceNames[deviceIndex]; + else + return ""; +} + +DLL_EXPORT int LMS_DeviceOpen(LMScomms* port, const uint32_t deviceIndex) +{ + port->Close(); + int status = port->Open(deviceIndex); + if (status == 1) + { + return LMS_SUCCESS; + } + else + { + return LMS_ERROR; + } +} + +DLL_EXPORT void LMS_DeviceClose(LMScomms* port) +{ + port->Close(); +} + +DLL_EXPORT uint32_t LMS_ControlWrite(LMScomms* port, const uint8_t *buffer, const uint16_t bufLen) +{ + return port->Write(buffer, bufLen, 0); +} + +DLL_EXPORT uint32_t LMS_ControlRead(LMScomms* port, uint8_t* buffer, const uint16_t bufLen) +{ + return port->Read(buffer, bufLen, 0); +} + + + +const int RX_BUFF_SZ (1020*1024/4); +uint32_t rx_buffer[RX_BUFF_SZ]; +uint64_t start_timestamp = 0;; +uint32_t wr_pos = 0; +uint32_t rd_pos = 0; + +void ReceivePackets() +{ + rxRunning.store(true); + uint32_t samplesCollected = 0; + + const int bufferSize = 4096;// 4096; + const int buffersCount = 32; // must be power of 2 + const int buffersCountMask = buffersCount - 1; + int handles[buffersCount]= {0}; + char buffers[buffersCount*bufferSize]={0}; + + struct sched_param sp; + sp.sched_priority = sched_get_priority_max(SCHED_FIFO); + if (pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp)!=0) + { + printf("Shed prams failed\n"); + } + + //switch off Rx + uint16_t regVal = streamer.SPI_read(0x0005); + streamer.SPI_write(0x0005, regVal & ~0x6); + //USB FIFO reset + LMScomms::GenericPacket ctrPkt; + ctrPkt.cmd = CMD_USB_FIFO_RST; + ctrPkt.outBuffer.push_back(0x01); + usbPort.TransferPacket(ctrPkt); + ctrPkt.outBuffer[0] = 0x00; + usbPort.TransferPacket(ctrPkt); + + streamer.SPI_write(0x0005, regVal | 0x6); + + streamer.SPI_write(0x0001, 0x0001); + streamer.SPI_write(0x0007, 0x0000); + + for (int i = 0; i 0) + { + PacketLTE* pkt = (PacketLTE*)&buffers[bi*bufferSize]; + for(uint16_t sampleIndex = 0; sampleIndex < sizeof(pkt->samples)/sizeof(int16_t); sampleIndex++) + { + pkt->samples[sampleIndex] <<= 4; + pkt->samples[sampleIndex] >>= 4; + } + + rxBuffer.push_samples((complex16_t*)pkt->samples, 1020, pkt->counter, 100); + } + // Re-submit this request to keep the queue full + memset(&buffers[bi*bufferSize], 0, bufferSize); + handles[bi] = usbPort.BeginDataReading(&buffers[bi*bufferSize], bufferSize); + bi = (bi + 1) & buffersCountMask; + pthread_yield(); + } + + usbPort.AbortReading(); + for (int j = 0; jsamples)[index++]=(((uint32_t*)data)[i]& 0xFFF0FFF) | 0x1000; + + if (index == 1020) + { + pkt->counter = ts; + + if (bufferUsed[bi]) + { + if (usbPort.WaitForSending(handles[bi], 1000) == false) + return -1; + // Must always call FinishDataXfer to release memory of contexts[i] + long tempToSend = sizeof(PacketLTE); + usbPort.FinishDataSending(&buffers[bi*bufferSize], tempToSend, handles[bi]); + + bufferUsed[bi] = false; + } + handles[bi] = usbPort.BeginDataSending(&buffers[bi*bufferSize], sizeof(PacketLTE)); + bufferUsed[bi] = true; + bi = (bi + 1) & buffersCountMask; + pkt = (PacketLTE*)&buffers[bi*bufferSize]; + ts += 1020; + index = 0; + } + } +} + +vector PacketsBuffer(2048, PacketLTE()); +DLL_EXPORT uint32_t LMS_TRxRead(int16_t *buffer, const uint32_t samplesCount, const uint32_t antenna_id, uint64_t *timestamp, const uint32_t timeout_ms) +{ + if (usbPort.IsOpen() == false && opMode != -1) + return 0; + pthread_yield(); + uint32_t samplesPopped = rxBuffer.pop_samples((complex16_t*)buffer, samplesCount, timestamp, timeout_ms); + return samplesPopped; +} + + +DLL_EXPORT int LMS_RxStart() +{ + if (rxRunning.load()) + return 1; + if (usbPort.IsOpen() == false && opMode != -1) + return 1; + rxStop.store(false); + unsigned int bufSz = rxBuffer.GetInfo().size; + rxBuffer.Reset(bufSz); + rxThread = thread(ReceivePackets); + return 0; +} + +DLL_EXPORT int LMS_RxStop() +{ + if (rxRunning.load()) + { + if (rxThread.joinable()) + { + rxStop.store(true); + rxThread.join(); + } + rxStop.store(true); + } + return 0; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h new file mode 100644 index 0000000000..27a72e351a --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h @@ -0,0 +1,143 @@ +/** +@author Lime Microsystems +@brief Interface for implementing SDR using Lime microsystems boards +*/ + +#ifndef LMS_SDR_INTERFACE_H +#define LMS_SDR_INTERFACE_H + +#include + +#ifdef __cplusplus +class LMScomms; +#else +typedef void LMScomms; +#endif + +#define BUILD_DLL +#ifndef __unix__ +#ifdef BUILD_DLL + #define DLL_EXPORT __declspec(dllexport) +#else + #define DLL_EXPORT __declspec(dllimport) +#endif +#else +#define DLL_EXPORT +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** @brief Returns stats of internal buffers + @param RxBufSize Receiver buffer size in samples + @param RxBufFilled Number of samples currently in the receiver buffer + @param RxSamplingRate Approximate receiver sampling rate, calculated from incomming data + @param TxBufSize Transmitter buffer size in samples + @param TxBufFilled Number of samples currently in the transmitter buffer + @param TxSamplingRate Approximate transmitter sampling rate, calculated from incomming data +*/ +DLL_EXPORT void LMS_Stats(uint32_t *RxBufSize, uint32_t *RxBufFilled, uint32_t *RxSamplingRate, uint32_t *TxBufSize, uint32_t *TxBufFilled, uint32_t *TxSamplingRate); + +/** @brief Initializes internal memory for samples buffering to hardware + @param OperationMode samples transfering mode: 0-packets synchronized, 1-packets not synchronized + @param trxBuffersLength Rx and Tx internal buffers size in samples + @return 0 success, -1 failure + + Generally trxBuffersSamplesCount should be more than 65536 +*/ +DLL_EXPORT int LMS_Init(const int OperationMode, uint32_t trxBuffersLength); + +/** @brief Stops internal threads and frees internal buffers memory + @return 0 success, -1 failure +*/ +DLL_EXPORT int LMS_Destroy(); + +///@name Device connection +/** @return object for communicating over USB port +*/ +DLL_EXPORT LMScomms* LMS_GetUSBPort(); + +/** @return object for communicating over COM port +*/ +DLL_EXPORT LMScomms* LMS_GetCOMPort(); + +/** @brief Refreshes currently connected device list + @param port Communications port to update + @return number of devices connected +*/ +DLL_EXPORT int LMS_UpdateDeviceList(LMScomms* port); + +/** @brief Returns pointer to static null terminated c-string name of selected device + @param port Communications port object + @param deviceIndex index from communications port device list +*/ +DLL_EXPORT const char* LMS_GetDeviceName(LMScomms* port, unsigned int deviceIndex); + +/** @brief Connects to selected device on given port + @param port Communications port object + @param deviceIndex index from communications port device list + @return 0-success +*/ +DLL_EXPORT int LMS_DeviceOpen(LMScomms* port, const uint32_t deviceIndex); + +/** @brief Closes connection on given port + @param port Communications port to close +*/ +DLL_EXPORT void LMS_DeviceClose(LMScomms* port); +///@} + +///@name Communications +/** @brief Writes given data to control port + @param port Port for communications + @param buffer data to be written + @param bufLen buffer length in bytes + @return number of bytes written +*/ +DLL_EXPORT uint32_t LMS_ControlWrite(LMScomms* port, const uint8_t *buffer, const uint16_t bufLen); + +/** @brief Reads given data from SPI regiter + @param port Port for communications + @param buffer destination buffer for data + @param bufLen number of bytes to read + @return number of bytes read +*/ +DLL_EXPORT uint32_t LMS_ControlRead(LMScomms* port, uint8_t* buffer, const uint16_t bufLen); + +/** @brief Starts thread for samples receiving + @return 0-success +*/ +DLL_EXPORT int LMS_RxStart(); + +/** @brief Stops samples receiving thread + @return 0:success, 1:failed +*/ +DLL_EXPORT int LMS_RxStop(); + +/** @brief Adds given samples to transmitter buffer, to be sent at specified timestamp +@param buffer source array for interleaved values (IQIQIQ...), each value amplitude should be from -2048 to 2047 +@param samplesCount number of samples in buffer, 1 sample = 2 bytes I + 2 bytes Q +@param channel_id destination channel +@param timestamp timestamp when the first sample in buffer should be transmitted (used only in synchronized operating mode) +@param timeout_ms time amount in milliseconds to try adding samples +@return number of samples written +*/ +DLL_EXPORT uint32_t LMS_TRxWrite(const int16_t *buffer, const uint32_t samplesCount, const uint32_t channel_id, uint64_t timestamp); + +/** @brief Reads samples from receiver buffer +@param buffer destination array for interleaved values (IQIQIQ...), must be big enough to store requested number of samples, each value amplitude will be from -2048 to 2047 +@param samplesCount number of samples to read, 1 sample = 2 bytes I + 2 bytes Q +@param antenna_id source channel +@param timestamp returns timestamp of the first sample in the buffer (used only in synchronized operating mode) +@param timeout_ms time amount in milliseconds to try reading samples +@return number of samples read +*/ +DLL_EXPORT uint32_t LMS_TRxRead(int16_t *buffer, const uint32_t samplesCount, const uint32_t channel_id, uint64_t *timestamp, const uint32_t timeout_ms); + +///@} + +#ifdef __cplusplus +} //extern "C" +#endif + +#endif //LMS_SDR_INTERFACE_H diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt new file mode 100644 index 0000000000..02e6bb5ab9 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt @@ -0,0 +1,22 @@ +set(streamBoard_src_files + LMS_StreamBoard.cpp +) + +add_library(LMS_StreamBoard STATIC ${streamBoard_src_files}) +target_include_directories(LMS_StreamBoard PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +target_link_libraries(LMS_StreamBoard ConnectionManager) + +if(WIN32 AND ENABLE_USB_CONNECTION) + find_package(CyAPI REQUIRED) + LINK_DIRECTORIES(${CYAPI_LIBRARIES}) + include_directories(${CYAPI_INCLUDE_DIRS}) + set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) + target_link_libraries(LMS_StreamBoard ${CONNECTION_MANAGER_LIBS}) +endif() +if(UNIX AND ENABLE_USB_CONNECTION) + set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) + target_link_libraries(LMS_StreamBoard ${CONNECTION_MANAGER_LIBS}) +endif() + + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp new file mode 100644 index 0000000000..da9e4a7b8e --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp @@ -0,0 +1,770 @@ +#include "LMS_StreamBoard.h" +#include "lmsComms.h" +#include "lms7002_defines.h" +#include +#include + +/** @brief Configures Stream board FPGA clocks + @param serPort Communications port to send data + @param fOutTx_MHz transmitter frequency in MHz + @param fOutRx_MHz receiver frequency in MHz + @param phaseShift_deg IQ phase shift in degrees + @return 0-success, other-failure +*/ +LMS_StreamBoard::Status LMS_StreamBoard::ConfigurePLL(LMScomms *serPort, const float fOutTx_MHz, const float fOutRx_MHz, const float phaseShift_deg) +{ + assert(serPort != nullptr); + if (serPort == NULL) + return FAILURE; + if (serPort->IsOpen() == false) + return FAILURE; + const float vcoLimits_MHz[2] = { 600, 1300 }; + int M, C; + const short bufSize = 64; + + float fOut_MHz = fOutTx_MHz; + float coef = 0.8*vcoLimits_MHz[1] / fOut_MHz; + M = C = (int)coef; + int chigh = (((int)coef) / 2) + ((int)(coef) % 2); + int clow = ((int)coef) / 2; + + LMScomms::GenericPacket pkt; + pkt.cmd = CMD_BRDSPI_WR; + + if (fOut_MHz*M > vcoLimits_MHz[0] && fOut_MHz*M < vcoLimits_MHz[1]) + { + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x0F); + pkt.outBuffer.push_back(0x15); //c4-c2_bypassed + pkt.outBuffer.push_back(0x01 | ((M % 2 != 0) ? 0x08 : 0x00) | ((C % 2 != 0) ? 0x20 : 0x00)); //N_bypassed + + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x08); + pkt.outBuffer.push_back(1); //N_high_cnt + pkt.outBuffer.push_back(1);//N_low_cnt + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x09); + pkt.outBuffer.push_back(chigh); //M_high_cnt + pkt.outBuffer.push_back(clow); //M_low_cnt + for (int i = 0; i <= 1; ++i) + { + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x0A + i); + pkt.outBuffer.push_back(chigh); //cX_high_cnt + pkt.outBuffer.push_back(clow); //cX_low_cnt + } + + float Fstep_us = 1 / (8 * fOutTx_MHz*C); + float Fstep_deg = (360 * Fstep_us) / (1 / fOutTx_MHz); + short nSteps = phaseShift_deg / Fstep_deg; + unsigned short reg2 = 0x0400 | (nSteps & 0x3FF); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x02); + pkt.outBuffer.push_back((reg2 >> 8)); + pkt.outBuffer.push_back(reg2); //phase + + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x03); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x01); + + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x03); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x00); + + reg2 = reg2 | 0x800; + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x02); + pkt.outBuffer.push_back((reg2 >> 8)); + pkt.outBuffer.push_back(reg2); + + if(serPort->TransferPacket(pkt) != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) + return FAILURE; + } + else + return FAILURE; + + fOut_MHz = fOutRx_MHz; + coef = 0.8*vcoLimits_MHz[1] / fOut_MHz; + M = C = (int)coef; + chigh = (((int)coef) / 2) + ((int)(coef) % 2); + clow = ((int)coef) / 2; + if (fOut_MHz*M > vcoLimits_MHz[0] && fOut_MHz*M < vcoLimits_MHz[1]) + { + short index = 0; + pkt.outBuffer.clear(); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x0F); + pkt.outBuffer.push_back(0x15); //c4-c2_bypassed + pkt.outBuffer.push_back(0x41 | ((M % 2 != 0) ? 0x08 : 0x00) | ((C % 2 != 0) ? 0x20 : 0x00)); //N_bypassed, c1 bypassed + + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x08); + pkt.outBuffer.push_back(1); //N_high_cnt + pkt.outBuffer.push_back(1);//N_low_cnt + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x09); + pkt.outBuffer.push_back(chigh); //M_high_cnt + pkt.outBuffer.push_back(clow); //M_low_cnt + for (int i = 0; i <= 1; ++i) + { + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x0A + i); + pkt.outBuffer.push_back(chigh); //cX_high_cnt + pkt.outBuffer.push_back(clow); //cX_low_cnt + } + + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x03); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x02); + + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x03); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x00); + + if (serPort->TransferPacket(pkt) != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) + return FAILURE; + } + else + return FAILURE; + return SUCCESS; +} + +/** @brief Captures IQ samples from Stream board, this is blocking function, it blocks until desired frames count is captured + @param isamples destination array for I samples, must be big enough to contain samplesCount + @param qsamples destination array for Q samples, must be big enough to contain samplesCount + @param framesCount number of IQ frames to capture + @param frameStart frame start indicator 0 or 1 + @return 0-success, other-failure +*/ +LMS_StreamBoard::Status LMS_StreamBoard::CaptureIQSamples(LMScomms *dataPort, int16_t *isamples, int16_t *qsamples, const uint32_t framesCount, const bool frameStart) +{ + assert(dataPort != nullptr); + if (dataPort == NULL) + return FAILURE; + if (dataPort->IsOpen() == false) + return FAILURE; + + int16_t sample_value; + const uint32_t bufSize = framesCount * 2 * sizeof(uint16_t); + char *buffer = new char[bufSize]; + if (buffer == 0) + { +#ifndef NDEBUG + std::cout << "Failed to allocate memory for samples buffer" << std::endl; +#endif + return FAILURE; + } + memset(buffer, 0, bufSize); + + LMScomms::GenericPacket pkt; + pkt.cmd = CMD_BRDSPI_RD; + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x05); + dataPort->TransferPacket(pkt); + if (pkt.status != STATUS_COMPLETED_CMD) + return FAILURE; + + uint16_t regVal = (pkt.inBuffer[2] * 256) + pkt.inBuffer[3]; + pkt.cmd = CMD_BRDSPI_WR; + pkt.outBuffer.clear(); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x05); + pkt.outBuffer.push_back(0); + pkt.outBuffer.push_back(regVal | 0x4); + dataPort->TransferPacket(pkt); + if (pkt.status != STATUS_COMPLETED_CMD) + return FAILURE; + + int bytesReceived = 0; + for(int i = 0; i<3; ++i) + bytesReceived = dataPort->ReadStream(buffer, bufSize, 5000); + if (bytesReceived > 0) + { + bool iqSelect = false; + int16_t frameCounter = 0; + for (uint32_t b = 0; b < bufSize;) + { + sample_value = buffer[b++] & 0xFF; + sample_value |= (buffer[b++] & 0x0F) << 8; + sample_value = sample_value << 4; //shift left then right to fill sign bits + sample_value = sample_value >> 4; + if (iqSelect == false) + isamples[frameCounter] = sample_value; + else + qsamples[frameCounter] = sample_value; + frameCounter += iqSelect; + iqSelect = !iqSelect; + } + } + pkt.cmd = CMD_BRDSPI_RD; + pkt.outBuffer.clear(); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x01); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x05); + dataPort->TransferPacket(pkt); + + regVal = (pkt.inBuffer[2] * 256) + pkt.inBuffer[3]; + pkt.cmd = CMD_BRDSPI_WR; + pkt.outBuffer.clear(); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x05); + pkt.outBuffer.push_back(0); + pkt.outBuffer.push_back(regVal & ~0x4); + dataPort->TransferPacket(pkt); + + delete[] buffer; + return SUCCESS; +} + +/** @brief Blocking operation to upload IQ samples to Stream board RAM + @param serPort port to use for communication + @param isamples I channel samples + @param qsamples Q channel samples + @param framesCount number of samples in arrays + @return 0-success, other-failure +*/ +LMS_StreamBoard::Status LMS_StreamBoard::UploadIQSamples(LMScomms* serPort, int16_t *isamples, int16_t *qsamples, const uint32_t framesCount) +{ + int bufferSize = framesCount * 2; + uint16_t *buffer = new uint16_t[bufferSize]; + memset(buffer, 0, bufferSize*sizeof(uint16_t)); + int bufPos = 0; + for (unsigned i = 0; iTransferPacket(pkt); + pkt.cmd = CMD_BRDSPI_WR; + pkt.outBuffer.clear(); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x05); + pkt.outBuffer.push_back(pkt.inBuffer[2]); + pkt.outBuffer.push_back(pkt.inBuffer[3] & ~0x7); + serPort->TransferPacket(pkt); + + while (sent packetSize ? packetSize : outLen - sent; + long toSend = toSendBytes; + int context = serPort->BeginDataSending(&outBuf[sent], toSend); + if (serPort->WaitForSending(context, 5000) == false) + { + success = false; + serPort->FinishDataSending(&outBuf[sent], toSend, context); + break; + } + sent += serPort->FinishDataSending(&outBuf[sent], toSend, context); + } + + pkt.cmd = CMD_BRDSPI_RD; + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x05); + + serPort->TransferPacket(pkt); + pkt.cmd = CMD_BRDSPI_WR; + pkt.outBuffer.clear(); + pkt.outBuffer.push_back(0x00); + pkt.outBuffer.push_back(0x05); + pkt.outBuffer.push_back(pkt.inBuffer[2]); + pkt.outBuffer.push_back(pkt.inBuffer[3] | 0x3); + serPort->TransferPacket(pkt); + return success ? SUCCESS : FAILURE; +} + +LMS_StreamBoard::LMS_StreamBoard(LMScomms* dataPort) +{ + mRxFrameStart.store(true); + mDataPort = dataPort; + mRxFIFO = new LMS_StreamBoard_FIFO(1024*4); + mTxFIFO = new LMS_StreamBoard_FIFO(1024*4); + mStreamRunning.store(false); + mTxCyclicRunning.store(false); +} + +LMS_StreamBoard::~LMS_StreamBoard() +{ + StopReceiving(); + delete mRxFIFO; + delete mTxFIFO; +} + +/** @brief Crates threads for packets receiving, processing and transmitting +*/ +LMS_StreamBoard::Status LMS_StreamBoard::StartReceiving(unsigned int fftSize) +{ + if (mStreamRunning.load() == true) + return FAILURE; + if (mDataPort->IsOpen() == false) + return FAILURE; + mRxFIFO->reset(); + stopRx.store(false); + threadRx = std::thread(ReceivePackets, this); + mStreamRunning.store(true); + return SUCCESS; +} + +/** @brief Stops receiving, processing and transmitting threads +*/ +LMS_StreamBoard::Status LMS_StreamBoard::StopReceiving() +{ + if (mStreamRunning.load() == false) + return FAILURE; + stopTx.store(true); + stopRx.store(true); + threadRx.join(); + mStreamRunning.store(false); + return SUCCESS; +} + +/** @brief Function dedicated for receiving data samples from board +*/ +void LMS_StreamBoard::ReceivePackets(LMS_StreamBoard* pthis) +{ + SamplesPacket pkt; + int samplesCollected = 0; + auto t1 = chrono::high_resolution_clock::now(); + auto t2 = chrono::high_resolution_clock::now(); + + const int buffer_size = 65536;// 4096; + const int buffers_count = 16; // must be power of 2 + const int buffers_count_mask = buffers_count - 1; + int handles[buffers_count]; + memset(handles, 0, sizeof(int)*buffers_count); + char *buffers = NULL; + buffers = new char[buffers_count*buffer_size]; + if (buffers == 0) + { + printf("error allocating buffers\n"); + return; + } + memset(buffers, 0, buffers_count*buffer_size); + + //USB FIFO reset + LMScomms::GenericPacket ctrPkt; + ctrPkt.cmd = CMD_USB_FIFO_RST; + ctrPkt.outBuffer.push_back(0x01); + pthis->mDataPort->TransferPacket(ctrPkt); + ctrPkt.outBuffer[0] = 0x00; + pthis->mDataPort->TransferPacket(ctrPkt); + + uint16_t regVal = pthis->SPI_read(0x0005); + pthis->SPI_write(0x0005, regVal | 0x4); + + for (int i = 0; imDataPort->BeginDataReading(&buffers[i*buffer_size], buffer_size); + + int bi = 0; + int packetsReceived = 0; + unsigned long BytesReceived = 0; + int m_bufferFailures = 0; + short sample; + + bool frameStart = pthis->mRxFrameStart.load(); + while (pthis->stopRx.load() == false) + { + if (pthis->mDataPort->WaitForReading(handles[bi], 1000) == false) + ++m_bufferFailures; + + long bytesToRead = buffer_size; + long bytesReceived = pthis->mDataPort->FinishDataReading(&buffers[bi*buffer_size], bytesToRead, handles[bi]); + if (bytesReceived > 0) + { + ++packetsReceived; + BytesReceived += bytesReceived; + char* bufStart = &buffers[bi*buffer_size]; + + for (int p = 0; p < bytesReceived; p+=2) + { + if (samplesCollected == 0) //find frame start + { + int frameStartOffset = FindFrameStart(&bufStart[p], bytesReceived-p, frameStart); + if (frameStartOffset < 0) + break; //frame start was not found, move on to next buffer + p += frameStartOffset; + } + sample = (bufStart[p+1] & 0x0F); + sample = sample << 8; + sample |= (bufStart[p] & 0xFF); + sample = sample << 4; + sample = sample >> 4; + pkt.iqdata[samplesCollected] = sample; + ++samplesCollected; + if (pkt.samplesCount == samplesCollected) + { + samplesCollected = 0; + if (pthis->mRxFIFO->push_back(pkt, 200) == false) + ++m_bufferFailures; + } + } + } + else + { + ++m_bufferFailures; + } + + t2 = chrono::high_resolution_clock::now(); + long timePeriod = std::chrono::duration_cast(t2 - t1).count(); + if (timePeriod >= 1000) + { + // periodically update frame start, user might change it during operation + frameStart = pthis->mRxFrameStart.load(); + float m_dataRate = 1000.0*BytesReceived / timePeriod; + t1 = t2; + BytesReceived = 0; + LMS_StreamBoard_FIFO::Status rxstats = pthis->mRxFIFO->GetStatus(); + + pthis->mRxDataRate.store(m_dataRate); + pthis->mRxFIFOfilled.store(100.0*rxstats.filledElements / rxstats.maxElements); +#ifndef NDEBUG + printf("Rx: %.1f%% \t rate: %.0f kB/s failures:%i\n", 100.0*rxstats.filledElements / rxstats.maxElements, m_dataRate / 1000.0, m_bufferFailures); +#endif + m_bufferFailures = 0; + } + + // Re-submit this request to keep the queue full + memset(&buffers[bi*buffer_size], 0, buffer_size); + handles[bi] = pthis->mDataPort->BeginDataReading(&buffers[bi*buffer_size], buffer_size); + bi = (bi + 1) & buffers_count_mask; + } + pthis->mDataPort->AbortReading(); + for (int j = 0; jmDataPort->WaitForReading(handles[j], 1000); + pthis->mDataPort->FinishDataReading(&buffers[j*buffer_size], bytesToRead, handles[j]); + } + + regVal = pthis->SPI_read(0x0005); + pthis->SPI_write(0x0005, regVal & ~0x4); + + delete[] buffers; +#ifndef NDEBUG + printf("Rx finished\n"); +#endif +} + +/** @brief Function dedicated for transmitting samples to board +*/ +void LMS_StreamBoard::TransmitPackets(LMS_StreamBoard* pthis) +{ + const int packetsToBatch = 16; + const int buffer_size = sizeof(SamplesPacket)*packetsToBatch; + const int buffers_count = 16; // must be power of 2 + const int buffers_count_mask = buffers_count - 1; + int handles[buffers_count]; + memset(handles, 0, sizeof(int)*buffers_count); + char *buffers = NULL; + buffers = new char[buffers_count*buffer_size]; + if (buffers == 0) + { + printf("error allocating buffers\n"); + } + memset(buffers, 0, buffers_count*buffer_size); + bool *bufferUsed = new bool[buffers_count]; + memset(bufferUsed, 0, sizeof(bool)*buffers_count); + + int bi = 0; //buffer index + + SamplesPacket* pkt = new SamplesPacket[packetsToBatch]; + int m_bufferFailures = 0; + long bytesSent = 0; + auto t1 = chrono::high_resolution_clock::now(); + auto t2 = chrono::high_resolution_clock::now(); + long totalBytesSent = 0; + + unsigned long outputCounter = 0; + + while (pthis->stopTx.load() == false) + { + for (int i = 0; i < packetsToBatch; ++i) + { + if (pthis->mTxFIFO->pop_front(&pkt[i], 200) == false) + { + printf("Error popping from TX\n"); + if (pthis->stopTx.load() == false) + break; + continue; + } + } + //wait for desired slot buffer to be transferred + if (bufferUsed[bi]) + { + if (pthis->mDataPort->WaitForSending(handles[bi], 1000) == false) + { + ++m_bufferFailures; + } + // Must always call FinishDataXfer to release memory of contexts[i] + long bytesToSend = buffer_size; + bytesSent = pthis->mDataPort->FinishDataSending(&buffers[bi*buffer_size], bytesToSend, handles[bi]); + if (bytesSent > 0) + totalBytesSent += bytesSent; + else + ++m_bufferFailures; + bufferUsed[bi] = false; + } + + memcpy(&buffers[bi*buffer_size], &pkt[0], sizeof(SamplesPacket)*packetsToBatch); + handles[bi] = pthis->mDataPort->BeginDataSending(&buffers[bi*buffer_size], buffer_size); + bufferUsed[bi] = true; + + t2 = chrono::high_resolution_clock::now(); + long timePeriod = std::chrono::duration_cast(t2 - t1).count(); + if (timePeriod >= 1000) + { + float m_dataRate = 1000.0*totalBytesSent / timePeriod; + t1 = t2; + totalBytesSent = 0; +#ifndef NDEBUG + cout << "Tx rate: " << m_dataRate / 1000 << " kB/s\t failures: " << m_bufferFailures << endl; +#endif + LMS_StreamBoard_FIFO::Status txstats = pthis->mTxFIFO->GetStatus(); + pthis->mTxDataRate.store(m_dataRate); + pthis->mTxFIFOfilled.store(100.0*txstats.filledElements / txstats.maxElements); + m_bufferFailures = 0; + } + bi = (bi + 1) & buffers_count_mask; + } + + // Wait for all the queued requests to be cancelled + pthis->mDataPort->AbortSending(); + for (int j = 0; jmDataPort->WaitForSending(handles[j], 1000); + pthis->mDataPort->FinishDataSending(&buffers[j*buffer_size], bytesToSend, handles[j]); + } + } + + delete[] buffers; + delete[] bufferUsed; + delete[] pkt; +#ifndef NDEBUG + printf("Tx finished\n"); +#endif +} + +/** @brief Returns current data state for user interface +*/ +LMS_StreamBoard::DataToGUI LMS_StreamBoard::GetIncomingData() +{ + std::unique_lock lck(mLockIncomingPacket); + return mIncomingPacket; +} + +/** @brief Returns data rate info and Tx Rx FIFO fill percentage +*/ +LMS_StreamBoard::ProgressStats LMS_StreamBoard::GetStats() +{ + ProgressStats stats; + stats.RxRate_Bps = mRxDataRate.load(); + stats.TxRate_Bps = mTxDataRate.load(); + stats.RxFIFOfilled = mRxFIFOfilled.load(); + stats.TxFIFOfilled = mTxFIFOfilled.load(); + return stats; +} + +/** @brief Helper function to write board spi regiters + @param address spi address + @param data register value +*/ +LMS_StreamBoard::Status LMS_StreamBoard::SPI_write(uint16_t address, uint16_t data) +{ + assert(mDataPort != nullptr); + LMScomms::GenericPacket ctrPkt; + ctrPkt.cmd = CMD_BRDSPI_WR; + ctrPkt.outBuffer.push_back((address >> 8) & 0xFF); + ctrPkt.outBuffer.push_back(address & 0xFF); + ctrPkt.outBuffer.push_back((data >> 8) & 0xFF); + ctrPkt.outBuffer.push_back(data & 0xFF); + mDataPort->TransferPacket(ctrPkt); + return ctrPkt.status == 1 ? SUCCESS : FAILURE; +} + +/** @brief Helper function to read board spi registers + @param address spi address + @return register value +*/ +uint16_t LMS_StreamBoard::SPI_read(uint16_t address) +{ + assert(mDataPort != nullptr); + LMScomms::GenericPacket ctrPkt; + ctrPkt.cmd = CMD_BRDSPI_RD; + ctrPkt.outBuffer.push_back((address >> 8) & 0xFF); + ctrPkt.outBuffer.push_back(address & 0xFF); + mDataPort->TransferPacket(ctrPkt); + if (ctrPkt.status == STATUS_COMPLETED_CMD && ctrPkt.inBuffer.size() >= 4) + return ctrPkt.inBuffer[2] * 256 + ctrPkt.inBuffer[3]; + else + return 0; +} + +/** @brief Changes which frame start to look for when receiving data +*/ +void LMS_StreamBoard::SetRxFrameStart(const bool startValue) +{ + mRxFrameStart.store(startValue); +} + +/** @brief Searches for frame start index in given buffer + @return frameStart index in buffer, -1 if frame start was not found + Frame start indicator is 13th bit inside each I and Q sample +*/ +int LMS_StreamBoard::FindFrameStart(const char* buffer, const int bufLen, const bool frameStart) +{ + int startIndex = -1; + for (int i = 0; i < bufLen; i+=2) + if ((buffer[i+1] & 0x10)>0 == frameStart) + { + startIndex = i; + break; + } + return startIndex; +} + +/** @brief Starts a thread for continuous cyclic transmitting of given samples + @param isamples I channel samples + @param qsamples Q channel samples + @param framesCount number of samples in given arrays + @return 0:success, other:failure +*/ +LMS_StreamBoard::Status LMS_StreamBoard::StartCyclicTransmitting(const int16_t* isamples, const int16_t* qsamples, uint32_t framesCount) +{ + if (mDataPort->IsOpen() == false) + return FAILURE; + + stopTxCyclic.store(false); + threadTxCyclic = std::thread([](LMS_StreamBoard* pthis) + { + const int buffer_size = 65536; + const int buffers_count = 16; // must be power of 2 + const int buffers_count_mask = buffers_count - 1; + int handles[buffers_count]; + memset(handles, 0, sizeof(int)*buffers_count); + char *buffers = NULL; + buffers = new char[buffers_count*buffer_size]; + if (buffers == 0) + { + printf("error allocating buffers\n"); + return 0; + } + memset(buffers, 0, buffers_count*buffer_size); + + //timers for data rate calculation + auto t1 = chrono::high_resolution_clock::now(); + auto t2 = chrono::high_resolution_clock::now(); + + int bi = 0; //buffer index + + //setup output data + int dataIndex = 0; + for (int i = 0; i < buffers_count; ++i) + { + for (int j = 0; j < buffer_size; ++j) + { + buffers[i*buffer_size + j] = pthis->mCyclicTransmittingSourceData[dataIndex]; + ++dataIndex; + if (dataIndex > pthis->mCyclicTransmittingSourceData.size()) + dataIndex = 0; + } + } + + for (int i = 0; i < buffers_count; ++i) + handles[i] = pthis->mDataPort->BeginDataSending(&buffers[i*buffer_size], buffer_size); + + int m_bufferFailures = 0; + int bytesSent = 0; + int totalBytesSent = 0; + int sleepTime = 200; + while (pthis->stopTxCyclic.load() != true) + { + if (pthis->mDataPort->WaitForSending(handles[bi], 1000) == false) + { + ++m_bufferFailures; + } + long bytesToSend = buffer_size; + bytesSent = pthis->mDataPort->FinishDataSending(&buffers[bi*buffer_size], bytesToSend, handles[bi]); + if (bytesSent > 0) + totalBytesSent += bytesSent; + else + { + ++m_bufferFailures; + } + + t2 = chrono::high_resolution_clock::now(); + long timePeriod = std::chrono::duration_cast(t2 - t1).count(); + if (timePeriod >= 1000) + { + pthis->mTxDataRate.store(1000.0*totalBytesSent / timePeriod); + t1 = t2; + totalBytesSent = 0; +#ifndef NDEBUG + printf("Upload rate: %f\t failures:%li\n", 1000.0*totalBytesSent / timePeriod, m_bufferFailures); +#endif + m_bufferFailures = 0; + } + + //fill up next buffer + for (int j = 0; j < buffer_size; ++j) + { + buffers[bi*buffer_size + j] = pthis->mCyclicTransmittingSourceData[dataIndex]; + ++dataIndex; + if (dataIndex >= pthis->mCyclicTransmittingSourceData.size()) + dataIndex = 0; + } + + // Re-submit this request to keep the queue full + handles[bi] = pthis->mDataPort->BeginDataSending(&buffers[bi*buffer_size], buffer_size); + bi = (bi + 1) & buffers_count_mask; + } + + // Wait for all the queued requests to be cancelled + pthis->mDataPort->AbortSending(); + for (int j = 0; j < buffers_count; j++) + { + long bytesToSend = buffer_size; + pthis->mDataPort->WaitForSending(handles[j], 1000); + pthis->mDataPort->FinishDataSending(&buffers[j*buffer_size], bytesToSend, handles[j]); + } +#ifndef NDEBUG + printf("Cyclic transmitting FULLY STOPPED\n"); +#endif + delete[] buffers; + return 0; + }, this); + mTxCyclicRunning.store(true); + + return LMS_StreamBoard::SUCCESS; +} + +/** @brief Stops cyclic transmitting thread +*/ +LMS_StreamBoard::Status LMS_StreamBoard::StopCyclicTransmitting() +{ + stopTxCyclic.store(true); + if (mTxCyclicRunning.load() == true) + { + threadTxCyclic.join(); + mTxCyclicRunning.store(false); + } + return LMS_StreamBoard::SUCCESS; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h new file mode 100644 index 0000000000..99b3636336 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h @@ -0,0 +1,107 @@ +#ifndef STREAM_BOARD_API_H +#define STREAM_BOARD_API_H + +#include +#include +#include +#include +#include "LMS_StreamBoard_FIFO.h" + +class LMScomms; + +class LMS_StreamBoard +{ +public: + struct SamplesPacket + { + public: + SamplesPacket() : channel(0) + {} + ~SamplesPacket() + {} + + SamplesPacket& operator=(const SamplesPacket& obj) + { + memcpy(this->iqdata, obj.iqdata, sizeof(float)*samplesCount); + this->channel = obj.channel; + return *this; + } + const static int samplesCount = 32768; + float iqdata[samplesCount]; + int channel; + }; + + + enum Status + { + SUCCESS, + FAILURE, + }; + + static Status CaptureIQSamples(LMScomms* serPort, int16_t *isamples, int16_t *qsamples, uint32_t framesCount, bool frameStart); + static Status UploadIQSamples(LMScomms* serPort, int16_t *isamples, int16_t *qsamples, uint32_t framesCount); + static Status ConfigurePLL(LMScomms *serPort, const float fOutTx_MHz, const float fOutRx_MHz, const float phaseShift_deg); + + struct DataToGUI + { + std::vector samplesI; + std::vector samplesQ; + std::vector fftBins_dbFS; + float nyquist_MHz; + }; + + struct ProgressStats + { + float RxRate_Bps; + float TxRate_Bps; + float RxFIFOfilled; + float TxFIFOfilled; + }; + + LMS_StreamBoard(LMScomms* dataPort); + virtual ~LMS_StreamBoard(); + + void SetRxFrameStart(const bool startValue); + virtual Status StartReceiving(unsigned int fftSize); + virtual Status StopReceiving(); + + virtual Status StartCyclicTransmitting(const int16_t* isamples, const int16_t* qsamples, uint32_t framesCount); + virtual Status StopCyclicTransmitting(); + + DataToGUI GetIncomingData(); + ProgressStats GetStats(); + + Status SPI_write(uint16_t address, uint16_t data); + uint16_t SPI_read(uint16_t address); +protected: + static int FindFrameStart(const char* buffer, const int bufLen, const bool frameStart); + std::mutex mLockIncomingPacket; + DataToGUI mIncomingPacket; + + LMS_StreamBoard_FIFO *mRxFIFO; + LMS_StreamBoard_FIFO *mTxFIFO; + + static void ReceivePackets(LMS_StreamBoard* pthis); + static void TransmitPackets(LMS_StreamBoard* pthis); + + std::atomic_bool mRxFrameStart; + std::atomic_bool mStreamRunning; + std::atomic_bool stopRx; + std::atomic_bool stopTx; + + std::thread threadRx; + std::thread threadTx; + LMScomms* mDataPort; + + std::atomic mRxDataRate; + std::atomic mTxDataRate; + std::atomic mRxFIFOfilled; + std::atomic mTxFIFOfilled; + + std::vector mCyclicTransmittingSourceData; + std::atomic_bool mTxCyclicRunning; + std::thread threadTxCyclic; + std::atomic_bool stopTxCyclic; +}; +#endif + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h new file mode 100644 index 0000000000..833f7a37c0 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h @@ -0,0 +1,122 @@ +/** +@file LMS_StreamBoard_FIFO.h +@author Lime Microsystems (www.limemicro.com) +@brief blocking FIFO for packets storing +*/ + +#ifndef LMS_STREAMBOARD_FIFO_H +#define LMS_STREAMBOARD_FIFO_H + +#include +#include +#include +#include +#include +#include +#include + +template +class LMS_StreamBoard_FIFO +{ +private: + LMS_StreamBoard_FIFO(){}; +public: + struct Status + { + uint32_t maxElements; + uint32_t filledElements; + uint32_t head; + uint32_t tail; + }; + + LMS_StreamBoard_FIFO(uint64_t FIFO_length) + { + mHead = 0; + mTail = 0; + mElements.resize(FIFO_length); + mElementsFilled = 0; + } + + ~LMS_StreamBoard_FIFO() + { + + } + + /** @brief Copies given src element to queue. + @param src Source data + @return true if element was inserted + + Copies element to queue. This function blocks until element is copied to + queue or certain amount of time has passed. + */ + bool push_back(const T &src, unsigned int timeout_ms = 200) + { + std::unique_lock lck(mElementsLock); + while (mElementsFilled == mElements.size()) + { + if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return false; + } + memcpy(&mElements[mTail], &src, sizeof(T)); + mTail = (mTail+1) % mElements.size(); + ++mElementsFilled; + canRead.notify_one(); + return true; + } + + /** @brief Copies and removes first element from queue to dest. + @param dest destination container for data + @return true if element was copied + Copies element from queue to destination and then removes it. + This function blocks until element is returned, or certain amount of time + has passed. + */ + bool pop_front(T *dest, unsigned int timeout_ms = 200) + { + assert(dest != nullptr); + std::unique_lock lck(mElementsLock); + while (mElementsFilled == 0) + { + if (canRead.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return false; + } + if (mElementsFilled == 0) + return false; + *dest = mElements[mHead]; + memcpy(dest, &mElements[mHead], sizeof(T)); + mHead = (mHead + 1) % mElements.size(); + --mElementsFilled; + canWrite.notify_one(); + return true; + } + void reset() + { + std::unique_lock lck(mElementsLock); + mElementsFilled = 0; + mHead = 0; + mTail = 0; + } + + Status GetStatus() + { + Status stats; + std::unique_lock lck(mElementsLock); + stats.maxElements = mElements.size(); + stats.filledElements = mElementsFilled; + stats.head = mHead; + stats.tail = mTail; + return stats; + }; + +protected: + uint32_t mHead; //reading pos + uint32_t mTail; //writing pos + uint32_t mElementsFilled; + + std::mutex mElementsLock; // condition variable for critical section + std::vector mElements; + std::condition_variable canWrite; + std::condition_variable canRead; +}; + +#endif // LMS_STREAMBOARD_FIFO_H diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h new file mode 100644 index 0000000000..c098dfe965 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h @@ -0,0 +1,215 @@ +/** +@file lms7002_defines.h +@author Lime Microsystems +@brief enumerations of available LMS7002M commands and statuses +*/ +#pragma once + +const int LMS_RST_DEACTIVATE = 0; +const int LMS_RST_ACTIVATE = 1; +const int LMS_RST_PULSE = 2; + +enum eLMS_DEV +{ + LMS_DEV_UNKNOWN, + LMS_DEV_EVB6, + LMS_DEV_DIGIGREEN, + LMS_DEV_DIGIRED, + LMS_DEV_EVB7, + LMS_DEV_ZIPPER, + LMS_DEV_SOCKETBOARD, + LMS_DEV_EVB7V2, + LMS_DEV_STREAM, + LMS_DEV_NOVENA, + LMS_DEV_DATASPARK, + LMS_DEV_RFSPARK, + LMS_DEV_LMS6002USB, + LMS_DEV_RFESPARK, + + LMS_DEV_COUNT +}; + +const char LMS_DEV_NAMES[][80] = +{ + "UNKNOWN", + "EVB6", + "DigiGreen", + "DigiRed", + "EVB7", + "ZIPPER", + "Socket Board", + "EVB7_v2", + "Stream", + "Novena", + "DataSpark", + "RF-Spark", + "LMS6002-USB Stick", + "RF-ESpark" +}; + +static const char* GetDeviceName(const eLMS_DEV device) +{ + if (LMS_DEV_UNKNOWN < device && device < LMS_DEV_COUNT) + return LMS_DEV_NAMES[device]; + else + return LMS_DEV_NAMES[LMS_DEV_UNKNOWN]; +} + +enum eEXP_BOARD +{ + EXP_BOARD_UNKNOWN, + EXP_BOARD_UNSUPPORTED, + EXP_BOARD_NO, + EXP_BOARD_MYRIAD1, + EXP_BOARD_MYRIAD2, + EXP_BOARD_MYRIAD_NOVENA, + EXP_BOARD_HPM1000, + EXP_BOARD_MYRIAD7, + EXP_BOARD_HPM7, + + EXP_BOARD_COUNT +}; + +const char EXP_BOARD_NAMES[][80] = +{ + "UNKNOWN", + "UNSUPPORTED", + "NOT AVAILABLE", + "Myriad1", + "Myriad2", + "Novena", + "HPM1000", + "Myriad7", + "HMP7" +}; + +static const char* GetExpansionBoardName(const eEXP_BOARD board) +{ + if (EXP_BOARD_UNKNOWN < board && board < EXP_BOARD_COUNT) + return EXP_BOARD_NAMES[board]; + else + return EXP_BOARD_NAMES[EXP_BOARD_UNKNOWN]; +} + +struct LMS64C_Info +{ + unsigned char firmware; + unsigned char deviceType; + unsigned char protocol; + unsigned char hardware; + unsigned char expansionBoard; +}; + +enum eCMD_LMS +{ + CMD_GET_INFO = 0x00, + CMD_LMS6002_RST = 0x10, + ///Writes data to SI5356 synthesizer via I2C + CMD_SI5356_WR = 0x11, + ///Reads data from SI5356 synthesizer via I2C + CMD_SI5356_RD = 0x12, + ///Writes data to SI5351 synthesizer via I2C + CMD_SI5351_WR = 0x13, + ///Reads data from SI5351 synthesizer via I2C + CMD_SI5351_RD = 0x14, + ///PanelBus DVI (HDMI) Transmitter control + CMD_TFP410_WR = 0x15, + ///PanelBus DVI (HDMI) Transmitter control + CMD_TFP410_RD = 0x16, + ///Sets new LMS7002M chip’s RESET pin level (0, 1, pulse) + CMD_LMS7002_RST = 0x20, + ///Writes data to LMS7002M chip via SPI + CMD_LMS7002_WR = 0x21, + ///Reads data from LMS7002M chip via SPI + CMD_LMS7002_RD = 0x22, + ///Writes data to LMS6002 chip via SPI + CMD_LMS6002_WR = 0x23, + ///Reads data from LMS6002 chip via SPI + CMD_LMS6002_RD = 0x24, + + CMD_LMS_LNA = 0x2A, + CMD_LMS_PA = 0x2B, + + CMD_PROG_MCU = 0x2C, + ///Writes data to ADF4002 chip via SPI + CMD_ADF4002_WR = 0x31, + + CMD_USB_FIFO_RST = 0x40, + CMD_PE636040_WR = 0x41, + CMD_PE636040_RD = 0x42, + + CMD_GPIO_WR = 0x51, + CMD_GPIO_RD = 0x52, + + CMD_ALTERA_FPGA_GW_WR = 0x53, + CMD_ALTERA_FPGA_GW_RD = 0x54, + + CMD_BRDSPI_WR = 0x55,//16 bit spi for stream, dataspark control + CMD_BRDSPI_RD = 0x56,//16 bit spi for stream, dataspark control + CMD_BRDSPI8_WR = 0x57, //8 + 8 bit spi for stream, dataspark control + CMD_BRDSPI8_RD = 0x58, //8 + 8 bit spi for stream, dataspark control + + CMD_BRDCONF_WR = 0x5D, //write config data to board + CMD_BRDCONF_RD = 0x5E, //read config data from board + + CMD_ANALOG_VAL_WR = 0x61, //write analog value + CMD_ANALOG_VAL_RD = 0x62, //read analog value + + CMD_MYRIAD_RST = 0x80, + CMD_MYRIAD_WR = 0x81, + CMD_MYRIAD_RD = 0x82, + CMD_MYRIAD_PROG = 0x8C +}; + +enum eCMD_STATUS +{ + STATUS_UNDEFINED, + STATUS_COMPLETED_CMD, + STATUS_UNKNOWN_CMD, + STATUS_BUSY_CMD, + STATUS_MANY_BLOCKS_CMD, + STATUS_ERROR_CMD, + STATUS_WRONG_ORDER_CMD, + STATUS_RESOURCE_DENIED_CMD, + STATUS_COUNT +}; + +static const char status_text[][32]= +{ + "Undefined/Failure", + "Completed", + "Unknown command", + "Busy", + "Too many blocks", + "Error", + "Wrong order", + "Resource denied" +}; + +static const char* status2string(const int status) +{ + if(status >= 0 && status < STATUS_COUNT) + return status_text[status]; + else + return "Unknown status"; +} + +enum eADC_UNITS +{ + RAW, + VOLTAGE, + CURRENT, + RESISTANCE, + POWER, + ADC_UNITS_COUNT +}; + +static const char adc_units_text[][8] = {"", "V", "A", "Ohm", "W"}; + +static const char* adcUnits2string(const unsigned units) +{ + if (units < ADC_UNITS_COUNT) + return adc_units_text[units]; + else + return " unknown"; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt new file mode 100644 index 0000000000..d9124aaef1 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt @@ -0,0 +1,34 @@ +set(ENABLE_USB_CONNECTION "YES" CACHE BOOL INTERNAL) +set(ENABLE_SPI_CONNECTION "NO" CACHE BOOL INTERNAL) +set(CONNECTION_MANAGER_DIR connectionManager) +set(connectionManager_src_files + ConnectionManager.cpp + ConnectionCOM.cpp + ConnectionManager.h + ConnectionCOM.h + lmsComms.h + lmsComms.cpp +) +if(ENABLE_USB_CONNECTION) + list(APPEND connectionManager_src_files ConnectionUSB.cpp ConnectionUSB.h) + add_definitions(-DENABLE_USB_CONNECTION) +endif() +if(ENABLE_SPI_CONNECTION) + list(APPEND connectionManager_src_files ConnectionSPI.cpp ConnectionSPI.h) + add_definitions(-DENABLE_SPI_CONNECTION) +endif() + +add_library(ConnectionManager STATIC ${connectionManager_src_files}) +target_include_directories(ConnectionManager PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +if(WIN32 AND ENABLE_USB_CONNECTION) + find_package(CyAPI REQUIRED) + LINK_DIRECTORIES(${CYAPI_LIBRARIES}) + include_directories(${CYAPI_INCLUDE_DIRS}) + set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) + target_link_libraries(ConnectionManager ${CONNECTION_MANAGER_LIBS}) +endif() +if(UNIX AND ENABLE_USB_CONNECTION) + set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) + target_link_libraries(ConnectionManager ${CONNECTION_MANAGER_LIBS}) +endif() diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp new file mode 100644 index 0000000000..6c7fc0d829 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp @@ -0,0 +1,596 @@ +/** + @file ConnectionCOM.cpp + @author Lime Microsystems (www.limemicro.com) + @brief Implementation of communications through COM port +*/ + +#include "ConnectionCOM.h" + +#include "string.h" +#ifdef __unix__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // LINUX + +const int COM_RETRY_INTERVAL = 20; //ms +const int COM_TOTAL_TIMEOUT = 300; //ms + +/** @brief Initializes com port connection +*/ +ConnectionCOM::ConnectionCOM() +{ + currentDeviceIndex = -1; + connected = false; + comPortList.clear(); + m_deviceNames.clear(); + m_connectionType = COM_PORT; +#ifndef __unix__ + hComm = INVALID_HANDLE_VALUE; +#else + hComm = -1; +#endif + comBaudrate = 9600; +} + +/** @brief When object is destroyed it closes it's opened COM port +*/ +ConnectionCOM::~ConnectionCOM() +{ + Close(); +} + +/** @brief Opens connection to first found chip + @return 0-success +*/ +IConnection::DeviceStatus ConnectionCOM::Open() +{ + comPortList.clear(); + if(comPortList.size() == 0) + FindAllComPorts(); + + m_deviceNames.clear(); + if(m_deviceNames.size() == 0) + RefreshDeviceList(); + + for(unsigned int i=0; i 0 ) + { + comPortName = m_deviceNames[toOpen]; + IConnection::DeviceStatus status = Open(comPortName.c_str(), comBaudrate); + if( status == SUCCESS ) + currentDeviceIndex = toOpen; + return status; + } + return FAILURE; +} + +/** @brief Closes connection to chip +*/ +void ConnectionCOM::Close() +{ + connected = false; + currentDeviceIndex = -1; +#ifndef __unix__ + if (hComm != INVALID_HANDLE_VALUE) + { + SetCommTimeouts(hComm, &m_ctmoOld); + CloseHandle(hComm); + } + hComm = INVALID_HANDLE_VALUE; +#else + if( hComm >= 0) + { + close(hComm); + } + hComm = -1; +#endif +} + +/** @brief Returns whether chip is connected + @return chip is connected +*/ +bool ConnectionCOM::IsOpen() +{ +#ifndef __unix__ + if (hComm != INVALID_HANDLE_VALUE && TestConnectivity() ) + return true; +#else + if( hComm != -1 && TestConnectivity() ) + return true; +#endif + return false; +} + +int ConnectionCOM::GetOpenedIndex() +{ + return currentDeviceIndex; +} + +/** @brief Sends data through COM port + @param buffer data buffer to send + @param length size of data buffer + @param timeout_ms timeout limit for operation in milliseconds + @return Number of bytes sent +*/ +int ConnectionCOM::Write(const unsigned char *buffer, int length, int timeout_ms) +{ + if(timeout_ms == 0) + { + timeout_ms = COM_TOTAL_TIMEOUT; + } + int retryCount = 0; + const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; + bool status = false; +#ifndef __unix__ + unsigned long bytesWriten = 0; + m_osWOverlap.InternalHigh = 0; + + for(int i = 0; iwrite("COM PORT: error writing data\n", LOG_ERROR); +// if(bytesWriten == 0) +// MessageLog::getInstance()->write("COM PORT: data bytes sent 0\n", LOG_WARNING); + status = false; + } + else + status = true; + ++retryCount; + } +#endif + if(bytesWriten == length) + status = true; + + return bytesWriten; +} + +/** @brief Reads data from COM port + @param buffer pointer to data buffer for receiving + @param length number of bytes to read + @param timeout_ms timeout limit for operation in milliseconds + @return Number of bytes received +*/ +int ConnectionCOM::Read(unsigned char *buffer, int length, int timeout_ms) +{ + if(timeout_ms == 0) + { + timeout_ms = COM_TOTAL_TIMEOUT; + } + int retryCount = 0; + const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; + bool status = false; + + memset(buffer, 0, length); + long bytesReaded = 0; + unsigned long totalBytesReaded = 0; + char cRawData[COM_BUFFER_LENGTH]; + unsigned long bytesToRead = length; + + memset(cRawData, '\0', sizeof(cRawData[0])*COM_BUFFER_LENGTH); + + for(int i=0; iwrite("COM PORT: error reading data\n", LOG_ERROR); +// if(bytesReaded == 0) +// MessageLog::getInstance()->write("COM PORT: reading 0 bytes\n", LOG_WARNING); + status = false; + } +#endif + retryCount++; + + for(int j=0; jwrite(ss.str(), LOG_DATA); + +// if(retryCount == maxRetries) +// MessageLog::getInstance()->write("COM PORT: read data timeout\n", LOG_WARNING); +// +// if(totalBytesReaded > length) +// MessageLog::getInstance()->write("COM PORT: read data corrupted, received length > requested length\n", LOG_ERROR); + return totalBytesReaded; +} + +/** @brief Searches for available COM ports and adds them to list +*/ +void ConnectionCOM::FindAllComPorts() +{ + Close(); + comPortList.clear(); +#ifndef __unix__ + HKEY hSERIALCOMM; + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hSERIALCOMM) == ERROR_SUCCESS) + { + // Get the max value name and max value lengths + DWORD dwMaxValueNameLen; + DWORD dwMaxValueLen; + DWORD dwQueryInfo = RegQueryInfoKey(hSERIALCOMM, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &dwMaxValueNameLen, &dwMaxValueLen, NULL, NULL); + if (dwQueryInfo == ERROR_SUCCESS) + { + DWORD dwMaxValueNameSizeInChars = dwMaxValueNameLen + 1; + // Include space for the NULL terminator + DWORD dwMaxValueNameSizeInBytes = dwMaxValueNameSizeInChars*sizeof(TCHAR); + DWORD dwMaxValueDataSizeInChars = dwMaxValueLen / sizeof(TCHAR) + 1; + // Include space for the NULL terminator + DWORD dwMaxValueDataSizeInBytes = dwMaxValueDataSizeInChars*sizeof(TCHAR); + + // Allocate some space for the value name and value data + TCHAR* szValueName = new TCHAR[dwMaxValueNameSizeInChars]; + TCHAR* byValue = new TCHAR[dwMaxValueDataSizeInBytes]; + if (szValueName && byValue) + { + // Enumerate all the values underneath HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM + DWORD dwIndex = 0; + DWORD dwType; + DWORD dwValueNameSize = dwMaxValueNameSizeInChars; + DWORD dwDataSize = dwMaxValueDataSizeInBytes; + memset(szValueName, 0, dwMaxValueNameSizeInBytes); + memset(byValue, 0, dwMaxValueDataSizeInBytes); + LONG nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); + while (nEnum == ERROR_SUCCESS) + { + // If the value is of the correct type, then add it to the array + if (dwType == REG_SZ) + { + char portname[512]; + TCHAR* szPort = byValue; + int nUserNameLenUnicode = lstrlen( szPort ); // Convert all UNICODE characters + int nUserNameLen = WideCharToMultiByte( CP_ACP, // ANSI Code Page + 0, // No special handling of unmapped chars + (LPCWSTR)szPort, // wide-character string to be converted + nUserNameLenUnicode, + NULL, 0, // No output buffer since we are calculating length + NULL, NULL ); // Unrepresented char replacement - Use Default + TCHAR* pszUserName = new TCHAR[ nUserNameLen ]; // nUserNameLen includes the NULL character + WideCharToMultiByte( CP_ACP, // ANSI Code Page + 0, // No special handling of unmapped chars + (LPCWSTR)szPort, // wide-character string to be converted + nUserNameLenUnicode, + portname, + nUserNameLen, + NULL, NULL ); // Unrepresented char replacement - Use Default + portname[nUserNameLen] = 0; +#ifdef UNICODE + comPortList.push_back(portname); +#else + comPortList.push_back(szPort); +#endif + } + // Prepare for the next time around + dwValueNameSize = dwMaxValueNameSizeInChars; + dwDataSize = dwMaxValueDataSizeInBytes; + memset(szValueName, 0, dwMaxValueNameSizeInBytes); + memset(byValue, 0, dwMaxValueDataSizeInBytes); + ++dwIndex; + nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); + } + } + delete szValueName; + delete byValue; + } + // Close the registry key now that we are finished with it + RegCloseKey(hSERIALCOMM); + + if (dwQueryInfo != ERROR_SUCCESS) + SetLastError(dwQueryInfo); + } +#else + char tempBuffer[256]; + string result = ""; +#warning Currently searching only for ACM connections + system( "ls /dev | grep ttyACM > /tmp/foundSerialPorts.txt"); + + fstream fin; + fin.open("/tmp/foundSerialPorts.txt", ios::in); + while(!fin.eof()) + { + fin.getline(tempBuffer, 256); + result = "/dev/"; + result.append(tempBuffer); + if( strlen(tempBuffer) > 3 ) //longer than tty + comPortList.push_back(result); + } + fin.close(); +#endif +} + +/** @brief Opens COM port + @param comName COM port name + @param baudrate COM port baudrate + @return 0 on success +*/ +IConnection::DeviceStatus ConnectionCOM::Open(const char *comName, int baudrate) +{ + Close(); + if (strlen(comName) == 0) + return FAILURE; + + DeviceStatus errorCode = SUCCESS; + +#ifndef __unix__ + // Initialize Overlap structures + m_osROverlap.Internal = 0; + m_osROverlap.InternalHigh = 0; + m_osROverlap.Offset = 0; + m_osROverlap.OffsetHigh = 0; + m_osROverlap.hEvent = CreateEvent(NULL, false, false, NULL); + + m_osWOverlap.Internal = 0; + m_osWOverlap.InternalHigh = 0; + m_osWOverlap.Offset = 0; + m_osWOverlap.OffsetHigh = 0; + m_osWOverlap.hEvent = CreateEvent(NULL, false, false, NULL); + + // Initialize DSB structure + memset(&m_dcbCommPort, 0, sizeof(m_dcbCommPort)); + + m_dcbCommPort.BaudRate = comBaudrate; + m_dcbCommPort.fBinary = 1; + m_dcbCommPort.fParity = 0; + m_dcbCommPort.fOutxCtsFlow = 0; + m_dcbCommPort.fOutxDsrFlow = 0; + m_dcbCommPort.fDtrControl = 0; + m_dcbCommPort.fDsrSensitivity = 0; + m_dcbCommPort.fTXContinueOnXoff = 0; + m_dcbCommPort.fOutX = 0; + m_dcbCommPort.fInX = 0; + m_dcbCommPort.fErrorChar = 0; + m_dcbCommPort.fNull = 0; + m_dcbCommPort.fRtsControl = 0; + m_dcbCommPort.fAbortOnError = 0; + m_dcbCommPort.fDummy2 = 0; + // m_dcbCommPort.wReserved = 0; + m_dcbCommPort.XonLim = 512; + m_dcbCommPort.XoffLim = 512; + m_dcbCommPort.ByteSize = 8; + m_dcbCommPort.Parity = 0; + m_dcbCommPort.StopBits = 0; + //m_dcbCommPort.StopBits = 1; + m_dcbCommPort.XonChar = 17; + m_dcbCommPort.XoffChar = 19; + m_dcbCommPort.ErrorChar = 0; + m_dcbCommPort.EofChar = 26; + m_dcbCommPort.EvtChar = 0; + m_dcbCommPort.wReserved1 = 0; + m_dcbCommPort.DCBlength = sizeof(DCB); + + // Initialize Timeout's + m_ctmoNew.ReadIntervalTimeout = 50; + m_ctmoNew.ReadTotalTimeoutMultiplier = 0; + m_ctmoNew.ReadTotalTimeoutConstant = 100; // 1; + m_ctmoNew.WriteTotalTimeoutMultiplier = 0; + m_ctmoNew.WriteTotalTimeoutConstant = 100; + + // Open COM port + string stmp; + stmp = "\\\\.\\"; + stmp.append(comName); + hComm = CreateFileA(stmp.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + + if (hComm != INVALID_HANDLE_VALUE) + { + // Set Events + if (!SetCommMask(hComm, 0)) + errorCode = FAILURE; + + // Set Timeouts + GetCommTimeouts(hComm, &m_ctmoOld); + if (!SetCommTimeouts(hComm, &m_ctmoNew)) + errorCode = FAILURE; + + // Set DCB + if (!SetCommState(hComm, &m_dcbCommPort)) + errorCode = FAILURE; + } + else + { + errorCode = FAILURE; + }; + + // Check the results + if (errorCode != 0) + { + //unsigned long err = GetLastError(); + CloseHandle(hComm); + hComm = INVALID_HANDLE_VALUE; + return errorCode; + } + else + { + PurgeComm(hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); + return SUCCESS; + } +#else + hComm = open(comName, O_RDWR | O_NOCTTY | O_SYNC); + if(hComm < 0) + { +// printf("%s",strerror(errno)); +// MessageLog::getInstance()->write("Connection manager: failed opening COM port\n", LOG_ERROR); + return FAILURE; + } + + struct termios tty; + memset(&tty, 0, sizeof(tty)); + if( tcgetattr(hComm, &tty) != 0) + { +// MessageLog::getInstance()->write("Connection Manager: error from tcgetattr\n", LOG_ERROR); + return FAILURE; + } + int speed = B9600; + cfsetospeed(&tty, speed); + cfsetispeed(&tty, speed); + + tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; + tty.c_iflag &= ~IGNBRK; + tty.c_lflag = 0; + tty.c_oflag = 0; + tty.c_cc[VMIN] = 0; // read non blocking + tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout + + tty.c_iflag &= ~(IXON | IXOFF | IXANY); + tty.c_cflag |= (CLOCAL | CREAD); + + if(tcsetattr(hComm, TCSANOW, &tty) != 0) + { +// MessageLog::getInstance()->write("Connection manager: error from tcsetattr\n", LOG_ERROR); + return FAILURE; + } +#endif + return SUCCESS; +} + +/** @brief Checks if chip is connected to currently open port + @return chip is connected +*/ +bool ConnectionCOM::TestConnectivity() +{ +//currently set to always return true to show all com ports + return true; +#ifndef __unix__ + if (hComm != INVALID_HANDLE_VALUE) +#else + if( hComm >= 0) +#endif + { +// unsigned char out[64]; +// unsigned char in[64]; +// memset(in, 0, 64); +// out[0] = CMD_GET_INFO; +// SendData(out, 64); +// ReadData(in, 64); +// if(in[0] == CMD_GET_INFO && in[1] == 0x01) +// return true; +// else +// return false; + } + return false; +} + +/** @brief Finds all chips connected to com ports + @return number of devices found +*/ +int ConnectionCOM::RefreshDeviceList() +{ + int wasOpen = -1; + string wasOpenName = ""; + if(IsOpen()) + { + wasOpen = GetOpenedIndex(); + wasOpenName = comPortName; + } + Close(); + comPortList.clear(); + if(comPortList.size() == 0) + FindAllComPorts(); + + m_deviceNames.clear(); + string comName; + for(unsigned int i=0; i ConnectionCOM::GetDeviceNames() +{ + return m_deviceNames; +} + +/** @brief Purges communication buffers +*/ +void ConnectionCOM::ClearComm() +{ +#ifndef __unix__ + PurgeComm(hComm, PURGE_TXCLEAR|PURGE_RXCLEAR); +#endif +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h new file mode 100644 index 0000000000..0549472db1 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h @@ -0,0 +1,62 @@ +/** +@file ConnectionCOM.h +@author Lime Microsystems (www.limemicro.com) +@brief Class for data communications through COM port +*/ + +#ifndef CONNECTION_COM_PORT_H +#define CONNECTION_COM_PORT_H + +#ifndef __unix__ + #include "windows.h" +#endif + +#include "IConnection.h" + +class ConnectionCOM : public IConnection +{ +public: + static const int COM_BUFFER_LENGTH = 1024; //max buffer size for data + + ConnectionCOM(); + ~ConnectionCOM(); + + DeviceStatus Open(); + DeviceStatus Open(unsigned i); + void Close(); + bool IsOpen(); + int GetOpenedIndex(); + + int Write(const unsigned char *buffer, int length, int timeout_ms = 0); + int Read(unsigned char *buffer, int length, int timeout_ms = 0); + + std::vector GetDeviceNames(); + int RefreshDeviceList(); + void ClearComm(); +private: + void FindAllComPorts(); + DeviceStatus Open(const char *comName, int baudrate); + + bool TestConnectivity(); + + std::string comPortName; + int comBaudrate; + bool connected; + + int currentDeviceIndex; + std::vector comPortList; + std::vector m_deviceNames; + +#ifndef __unix__ + HANDLE hComm; + COMMTIMEOUTS m_ctmoNew; + COMMTIMEOUTS m_ctmoOld; + OVERLAPPED m_osROverlap; + OVERLAPPED m_osWOverlap; + DCB m_dcbCommPort; +#else + int hComm; //com port file descriptor +#endif + +}; +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp new file mode 100644 index 0000000000..9ec16e0d88 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp @@ -0,0 +1,319 @@ +/** + @file ConnectionManager.cpp + @author Lime Microsystems (www.limemicro.com) + @brief Implementation of various connection types to devices +*/ + +#include "ConnectionManager.h" +#include "ConnectionCOM.h" + +#ifdef ENABLE_USB_CONNECTION + #include "ConnectionUSB.h" +#endif +#ifdef ENABLE_SPI_CONNECTION + #include "ConnectionSPI.h" +#endif + +#include +#include +#include + +/** @brief Creates connection interfaces +*/ +ConnectionManager::ConnectionManager(const IConnection::eConnectionType port_type) : activeControlPort(NULL) +{ + mLogData = false; + mOpenedDevice = -1; + if (port_type == IConnection::COM_PORT) + m_connections[IConnection::COM_PORT] = new ConnectionCOM(); +#ifdef ENABLE_USB_CONNECTION + if (port_type == IConnection::USB_PORT) + m_connections[IConnection::USB_PORT] = new ConnectionUSB(); +#endif +#ifdef ENABLE_SPI_CONNECTION + m_connections[IConnection::SPI_PORT] = new ConnectionSPI(); +#endif +} + +/** @brief Destroys connection interfaces +*/ +ConnectionManager::~ConnectionManager() +{ + for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) + { + delete iter->second; + } +} + +/** @brief Checks if connection to device is opened + @return True if device is connected +*/ +bool ConnectionManager::IsOpen() +{ + return activeControlPort ? activeControlPort->IsOpen() : false; +} + +/** @brief Opens connection to first available device + @return True if connected to device +*/ +bool ConnectionManager::Open() +{ + return Open(0); +} + +/** @brief Connects to selected device + @param i device index from device list + @return 1:Success, 0:failure +*/ +int ConnectionManager::Open(unsigned i) +{ + if(i >= mDevices.size()) + return 0; + + if(activeControlPort) + activeControlPort->Close(); + switch(mDevices[i].port) + { + case IConnection::COM_PORT: + activeControlPort = m_connections[IConnection::COM_PORT]; + break; + case IConnection::USB_PORT: + activeControlPort = m_connections[IConnection::USB_PORT]; + break; + case IConnection::SPI_PORT: + activeControlPort = m_connections[IConnection::SPI_PORT]; + break; + default: + return 0; + } + mOpenedDevice = -1; + if( i < mDevices.size() ) + { + if (activeControlPort->Open(mDevices[i].portIndex) == IConnection::SUCCESS) + { + mOpenedDevice = i; + return 1; + } + } + return 0; +} + +/** @brief Closes connection to device +*/ +void ConnectionManager::Close() +{ + if(activeControlPort) + { + activeControlPort->Close(); + //Notify(LMS_Message(MSG_BOARD_DISCONNECTED, "", 0, 0)); + } + mOpenedDevice = -1; +} + +/** @brief Finds all currently connected devices and forms device list + @return number of devices found +*/ +int ConnectionManager::RefreshDeviceList() +{ + mDeviceList.clear(); + mDevices.clear(); + DeviceInfo dev; + for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) + { + vector names; + IConnection *port = iter->second; + if(port->RefreshDeviceList() > 0) + { + names = port->GetDeviceNames(); + for(unsigned i=0; ifirst; + dev.portIndex = i; + mDevices.push_back(dev); + } + } + } + for(unsigned i=0; iWrite(buffer, length, timeout_ms); +#ifndef NDEBUG + if(mLogData) + { + stringstream ss; + ss << "WR(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; + ss << std::hex << std::setfill('0'); + int repeatedZeros = 0; + for(int i=length-1; i>=0; --i) + if(buffer[i] == 0) + ++repeatedZeros; + else break; + if(repeatedZeros == 1) + repeatedZeros = 0; + repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); + for(int i=0; i 1) + ss << " (00 x " << std::dec << repeatedZeros << " times)"; + cout << ss.str() << endl; +#ifndef __unix__ + OutputDebugString(ss.str().c_str()); +#endif + } +#endif + return bytesTransferred; + } + return -1; +} + +/** @brief Receives data from currently opened connection + @param buffer incomming data buffer, must be big enough for length bytes + @param length bytes to read + @param timeout_ms timeout in milliseconds + @return number of bytes received +*/ +int ConnectionManager::Read(unsigned char *buffer, int length, int timeout_ms) +{ + if(activeControlPort) + { + int bytesTransferred = activeControlPort->Read(buffer, length, timeout_ms); +#ifndef NDEBUG + if(mLogData) + { + stringstream ss; + ss << "RD(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; + ss << std::hex << std::setfill('0'); + int repeatedZeros = 0; + for(int i=length-1; i>=0; --i) + if(buffer[i] == 0) + ++repeatedZeros; + else break; + if(repeatedZeros == 2) + repeatedZeros = 0; + repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); + for(int i=0; i 2) + ss << " (00 x " << std::dec << repeatedZeros << " times)"; + cout << ss.str() << endl; + } +#endif + return bytesTransferred; + } + return -1; +} + +int ConnectionManager::WriteStream(const char *buffer, int length) +{ + return 0; +} + +int ConnectionManager::ReadStream(char *buffer, int length, unsigned int timeout_ms) +{ + /*int handle = activeControlPort->BeginDataReading(buffer, length); + activeControlPort->WaitForReading(handle, timeout_ms); + long received = length; + activeControlPort->FinishDataReading(buffer, received, handle); + return received; + */ + long len = length; + int status = activeControlPort->ReadDataBlocking(buffer, len, 0); + return len; +} + + +int ConnectionManager::BeginDataReading(char *buffer, long length) +{ + return activeControlPort->BeginDataReading(buffer, length); +} +/** +@brief Blocks until data is received or set number of milliseconds have passed. +@param contextHandle handle returned by BeginDataReading() +@param timeout_ms number of milliseconds to wait +@return 1-data received, 0-data not received +*/ +int ConnectionManager::WaitForReading(int contextHandle, unsigned int timeout_ms) +{ + return activeControlPort->WaitForReading(contextHandle, timeout_ms); +} +/** +@brief Finished asynchronous data reading. +@param buffer where to put received data +@param length number of bytes to read, will be changed to actual number of bytes received +@param contextHandle context handle returned by BeginDataReading() +@return received data length +*/ +int ConnectionManager::FinishDataReading(char *buffer, long &length, int contextHandle) +{ + return activeControlPort->FinishDataReading(buffer, length, contextHandle); +} + +/** +@brief Aborts reading operations +*/ +void ConnectionManager::AbortReading() +{ + activeControlPort->AbortReading(); +} + +/** +@brief Start asynchronous data sending. +@param buffer data buffer to be sent +@param length number of bytes to send. +@return context handle +*/ +int ConnectionManager::BeginDataSending(const char *buffer, long length) +{ + return activeControlPort->BeginDataSending(buffer, length); +} +/** +@brief Blocks until data is sent or set number of miliseconds have passed. +@param contextHandle handle returned by BeginDataReading() +@param timeout_ms number of miliseconds to wait +@return 1-data sent, 0-data not sent +*/ +int ConnectionManager::WaitForSending(int contextHandle, unsigned int timeout_ms) +{ + return activeControlPort->WaitForSending(contextHandle, timeout_ms); +} +/** +@brief Finished asynchronous data sending. +@param buffer where to put received data +@param length number of bytes to send, will be changed to actual number of bytes sent +@param contextHandle context handle returned by BeginDataReading() +@return sent data length +*/ +int ConnectionManager::FinishDataSending(const char *buffer, long &length, int contextHandle) +{ + return activeControlPort->FinishDataSending(buffer, length, contextHandle); +} + +/** +@brief Aborts sending operations +*/ +void ConnectionManager::AbortSending() +{ + activeControlPort->AbortSending(); +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h new file mode 100644 index 0000000000..68819011ff --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h @@ -0,0 +1,60 @@ +/** + @file ConnectionManager.h + @author Lime Microsystems (www.limemicro.com) + @brief Class for managing connection to devices +*/ + +#ifndef LMS_CONNECTION_MANAGER_H +#define LMS_CONNECTION_MANAGER_H + +#include "IConnection.h" +#include + +class ConnectionManager +{ +public: + struct DeviceInfo + { + std::string name; + IConnection::eConnectionType port; + int portIndex; + }; + + ConnectionManager(const IConnection::eConnectionType port_type); + ~ConnectionManager(); + bool IsOpen(); + bool Open(); + int Open(unsigned i); + void Close(); + int RefreshDeviceList(); + int GetOpenedIndex(); + std::vector GetDeviceList(){return mDeviceList;}; + + int Write(const unsigned char *buffer, int length, int timeout_ms = 0); + int Read(unsigned char *buffer, int length, int timeout_ms = 0); + + int WriteStream(const char *buffer, int length); + int ReadStream(char *buffer, int length, unsigned int timeout_ms); + + int BeginDataReading(char *buffer, long length); + int WaitForReading(int contextHandle, unsigned int timeout_ms); + int FinishDataReading(char *buffer, long &length, int contextHandle); + void AbortReading(); + + int BeginDataSending(const char *buffer, long length); + int WaitForSending(int contextHandle, unsigned int timeout_ms); + int FinishDataSending(const char *buffer, long &length, int contextHandle); + void AbortSending(); + +protected: + bool mLogData; + /// Port used for communication. + IConnection *activeControlPort; + std::vector mDevices; + std::vector mDeviceList; + int mOpenedDevice; + std::map m_connections; +}; + +#endif // LMS_CONNECTION_MANAGER_H + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp new file mode 100644 index 0000000000..fb305f9c1c --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp @@ -0,0 +1,313 @@ +/** + @file ConnectionSPI.cpp + @author Lime Microsystems (www.limemicro.com) + @brief Implementation of communications through SPI port +*/ + +#include "ConnectionSPI.h" + +#include "string.h" +#ifdef __unix__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif // LINUX + +#include +#include + +const int ConnectionSPI::cSPI_BUF_SIZE = 128; +const int ConnectionSPI::cSPI_SPEED_HZ = 2000000; + +/** @brief Tries to read EEPROM for Novena board signature + @return true if Novena board +*/ +bool IsNovenaBoard() +{ +#ifdef __unix__ + char data[8]; + int count = 6; + memset(data, 0, 8); + int addr = 0; + struct i2c_rdwr_ioctl_data session; + struct i2c_msg messages[2]; + char set_addr_buf[2]; + memset(set_addr_buf, 0, sizeof(set_addr_buf)); + memset(data, 0, count); + set_addr_buf[0] = addr>>8; + set_addr_buf[1] = addr; + messages[0].addr = 0xac>>1; + messages[0].flags = 0; + messages[0].len = sizeof(set_addr_buf); + messages[0].buf = set_addr_buf; + messages[1].addr = 0xac>>1; + messages[1].flags = I2C_M_RD; + messages[1].len = count; + messages[1].buf = data; + session.msgs = messages; + session.nmsgs = 2; + + bool isNovena = false; + + int fd = open("/dev/i2c-2", O_RDWR); + if(fd > 0) + { + if(ioctl(fd, I2C_RDWR, &session) < 0) + { + perror("Unable to communicate with i2c device"); + isNovena = false; + } + if(strcmp("Novena", data) == 0) + isNovena = true; + } + close(fd); + return isNovena; +#else + return false; +#endif +} + +/** @brief Initializes SPI port and exports needed GPIO +*/ +ConnectionSPI::ConnectionSPI() +{ + fd = -1; + m_connectionType = SPI_PORT; + std::fstream gpio; + //export SEN pin + gpio.open("/sys/class/gpio/export", ios::out); + if(gpio.good()) + { + gpio << 122; + gpio.flush(); + gpio.close(); + gpio.open("/sys/class/gpio/gpio122/direction", ios::out); + gpio << "out"; + gpio.flush(); + gpio.close(); + m_SEN.open("/sys/class/gpio/gpio122/value", ios::out); + m_SEN<< 1; + m_SEN.flush(); + cout << "GPIO122: set to 1" << endl; + } +} + +ConnectionSPI::~ConnectionSPI() +{ + Close(); + m_SEN.close(); +} + +/** @brief Opens connection to first found chip + @return 0-success +*/ +IConnection::DeviceStatus ConnectionSPI::Open() +{ + Close(); +#ifdef __unix__ + fd = open("/dev/spidev2.0", O_RDWR | O_SYNC); + if (fd < 0) + { + //MessageLog::getInstance()->write("SPI PORT: device not found\n", LOG_ERROR); + return IConnection::FAILURE; + } + int mode = SPI_MODE_0; + int ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); + if (ret == -1) + printf("can't set spi mode"); + + ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); + if (ret == -1) + printf("can't get spi mode"); + + /* + * bits per word + */ + int bits = 8; + ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); + if (ret == -1) + printf("can't set bits per word"); + + ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); + if (ret == -1) + printf("can't get bits per word"); + + /* + * max speed hz + */ + int speed = cSPI_SPEED_HZ; + ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); + if (ret == -1) + printf("can't set max speed hz"); + + ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); + if (ret == -1) + printf("can't get max speed hz"); + + printf("spi mode: 0x%x\n", mode); + printf("bits per word: %d\n", bits); + printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); + return IConnection::SUCCESS; +#else + return IConnection::FAILURE; +#endif +} + +/** @brief Opens connection to selected chip + @param index chip index in device list + @return 0-success +*/ +IConnection::DeviceStatus ConnectionSPI::Open(unsigned index) +{ + return Open(); +} + +/** @brief Closes connection to chip +*/ +void ConnectionSPI::Close() +{ +#ifdef __unix__ + close(fd); + fd = -1; +#endif +} + +/** @brief Returns whether chip is connected + @return chip is connected +*/ +bool ConnectionSPI::IsOpen() +{ + return (fd >= 0); +} + +/** @brief Sends data through COM port + @param buffer data buffer to send + @param length size of data buffer + @param timeout_ms timeout limit for operation in milliseconds + @return Number of bytes sent +*/ +int ConnectionSPI::Write(const unsigned char *buffer, int length, int timeout_ms) +{ + #ifdef __unix__ + if(fd < 0) + return 0; + m_SEN << 0; + m_SEN.flush(); + unsigned long bytesWritten = 0; + rxbuf.clear(); + int bytesReceived = 0; + char rxbytes[2]; + while(bytesWritten < length) + { + int toWrite = length-bytesWritten > cSPI_BUF_SIZE ? cSPI_BUF_SIZE : length-bytesWritten; + for(int i=0; i 0) +// { +// ss << " re443ad(" << toWrite << "): "; +// for(int i=0; iwrite(ss.str(), LOG_DATA); + + bytesWritten += toWrite; + } + m_SEN << 1; + m_SEN.flush(); + return bytesWritten; +#else + return 0; +#endif +} + +/** @brief Reads data from COM port + @param buffer pointer to data buffer for receiving + @param length number of bytes to read + @param timeout_ms timeout limit for operation in milliseconds + @return Number of bytes received +*/ +int ConnectionSPI::Read(unsigned char *buffer, int length, int timeout_ms) +{ +#ifdef __unix__ + if(fd < 0) + return 0; + //because transfer is done in full duplex, function returns data from last transfer + int tocpy = length > rxbuf.size() ? rxbuf.size() : length; + memcpy(buffer, &rxbuf[0], tocpy); + rxbuf.clear(); + return tocpy; +#else + return 0; +#endif +} + +/** @brief Finds all chips connected to com ports + @return number of devices found +*/ +int ConnectionSPI::RefreshDeviceList() +{ + m_deviceNames.clear(); +#ifdef __unix__ + int spidev = open("/dev/spidev2.0", O_RDWR); + if (spidev >= 0) + { + if(IsNovenaBoard() == true) + m_deviceNames.push_back("SPI (Novena)"); + else + m_deviceNames.push_back("SPI"); + } + close(spidev); +#endif + return m_deviceNames.size(); +} + +/** @brief Returns found devices names + @return vector of device names +*/ +vector ConnectionSPI::GetDeviceNames() +{ + return m_deviceNames; +} + +int ConnectionSPI::GetOpenedIndex() +{ + return 0; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h new file mode 100644 index 0000000000..79d9bd9b9b --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h @@ -0,0 +1,41 @@ +/** +@file ConnectionSPI.h +@author Lime Microsystems (www.limemicro.com) +@brief Class for data communications through SPI port +*/ + +#ifndef CONNECTION_SPI_PORT_H +#define CONNECTION_SPI_PORT_H + +#include "IConnection.h" +#include +#include +#include + +class ConnectionSPI : public IConnection +{ +public: + static const int cSPI_BUF_SIZE; + static const int cSPI_SPEED_HZ; + + ConnectionSPI(); + ~ConnectionSPI(); + + DeviceStatus Open(); + DeviceStatus Open(unsigned i); + void Close(); + bool IsOpen(); + int GetOpenedIndex(); + + int Write(const unsigned char *buffer, int length, int timeout_ms = 0); + int Read(unsigned char *buffer, int length, int timeout_ms = 0); + + std::vector GetDeviceNames(); + int RefreshDeviceList(); +protected: + std::vector m_deviceNames; + std::vector rxbuf; + int fd; + std::fstream m_SEN; +}; +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp new file mode 100644 index 0000000000..148b7b776b --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp @@ -0,0 +1,771 @@ +/** +@file ConnectionUSB.cpp +@author Lime Microsystems (www.limemicro.com) +@brief Data writing and reading through USB port +*/ + +#include "ConnectionUSB.h" +#include + +#ifdef __unix__ + #include + #include +#endif + +#define USB_TIMEOUT 1000 + +#define HW_LDIGIRED L"DigiRed" +#define HW_LDIGIGREEN L"DigiGreen" +#define HW_LSTREAMER L"Stream" + +#define HW_DIGIRED "DigiRed" +#define HW_DIGIGREEN "DigiGreen" +#define HW_STREAMER "Stream" + +#define CTR_W_REQCODE 0xC1 +#define CTR_W_VALUE 0x0000 +#define CTR_W_INDEX 0x0000 + +#define CTR_R_REQCODE 0xC0 +#define CTR_R_VALUE 0x0000 +#define CTR_R_INDEX 0x0000 + +/** @brief Initializes port type and object necessary to communicate to usb device. +*/ +ConnectionUSB::ConnectionUSB() +{ + m_hardwareName = ""; + isConnected = false; + m_connectionType = USB_PORT; +#ifndef __unix__ + USBDevicePrimary = new CCyUSBDevice(NULL); + OutCtrEndPt = NULL; + InCtrEndPt = NULL; + InCtrlEndPt3 = NULL; + OutCtrlEndPt3 = NULL; +#else + dev_handle = 0; + devs = 0; + int r = libusb_init(&ctx); //initialize the library for the session we just declared + if(r < 0) + printf("Init Error %i\n", r); //there was an error + libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation +#endif + currentDeviceIndex = -1; +} + +/** @brief Closes connection to chip and deallocates used memory. +*/ +ConnectionUSB::~ConnectionUSB() +{ + Close(); +#ifndef __unix__ + delete USBDevicePrimary; +#else + libusb_exit(ctx); +#endif +} + +/** @brief Automatically open first available chip connected to usb port. + @return 0-success, other-failure +*/ +IConnection::DeviceStatus ConnectionUSB::Open() +{ + currentDeviceIndex = -1; + if(m_deviceNames.size() == 0) + RefreshDeviceList(); + +#ifndef __unix__ + for(int i=0; iDeviceCount(); ++i) + if( Open(i) == SUCCESS) + { + currentDeviceIndex = i; + return SUCCESS; + } +#else + if(Open(0) == SUCCESS) + return SUCCESS; +#endif + return FAILURE; +} + +/** @brief Tries to open connected USB device and find communication endpoints. + @return Returns 1-Success, 0-EndPoints not found or device didn't connect. +*/ +IConnection::DeviceStatus ConnectionUSB::Open(unsigned index) +{ +#ifndef __unix__ + wstring m_hardwareDesc = L""; + if( index < USBDevicePrimary->DeviceCount()) + { + if(USBDevicePrimary->Open(index)) + { + m_hardwareDesc = USBDevicePrimary->Product; + unsigned int pos; + //determine connected board type + pos = m_hardwareDesc.find(HW_LDIGIRED, 0); + if( pos != wstring::npos ) + m_hardwareName = HW_DIGIRED; + else if (m_hardwareDesc.find(HW_LSTREAMER, 0) != wstring::npos) + m_hardwareName = HW_STREAMER; + else + m_hardwareName = HW_STREAMER; + + + if (InCtrlEndPt3) + { + delete InCtrlEndPt3; + InCtrlEndPt3 = NULL; + } + InCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); + + if (OutCtrlEndPt3) + { + delete OutCtrlEndPt3; + OutCtrlEndPt3 = NULL; + } + OutCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); + + InCtrlEndPt3->ReqCode = CTR_R_REQCODE; + InCtrlEndPt3->Value = CTR_R_VALUE; + InCtrlEndPt3->Index = CTR_R_INDEX; + + OutCtrlEndPt3->ReqCode = CTR_W_REQCODE; + OutCtrlEndPt3->Value = CTR_W_VALUE; + OutCtrlEndPt3->Index = CTR_W_INDEX; + + for (int i=0; iEndPointCount(); i++) + if(USBDevicePrimary->EndPoints[i]->Address == 0x01) + { + OutEndPt = USBDevicePrimary->EndPoints[i]; + long len = OutEndPt->MaxPktSize * 64; + OutEndPt->SetXferSize(len); + break; + } + for (int i=0; iEndPointCount(); i++) + if(USBDevicePrimary->EndPoints[i]->Address == 0x81) + { + InEndPt = USBDevicePrimary->EndPoints[i]; + long len = InEndPt->MaxPktSize * 64; + InEndPt->SetXferSize(len); + break; + } + isConnected = true; + return SUCCESS; + } //successfully opened device + } //if has devices + return FAILURE; +#else + if(index >= 0 && index < m_dev_pid_vid.size()) + { + dev_handle = libusb_open_device_with_vid_pid(ctx, m_dev_pid_vid[index].second, m_dev_pid_vid[index].first); + + if(dev_handle == 0) + return FAILURE; + if(libusb_kernel_driver_active(dev_handle, 0) == 1) //find out if kernel driver is attached + { + printf("Kernel Driver Active\n"); + if(libusb_detach_kernel_driver(dev_handle, 0) == 0) //detach it + printf("Kernel Driver Detached!\n"); + } + int r = libusb_claim_interface(dev_handle, 0); //claim interface 0 (the first) of device + if(r < 0) + { + printf("Cannot Claim Interface\n"); + return CANNOT_CLAIM_INTERFACE; + } + printf("Claimed Interface\n"); + isConnected = true; + return SUCCESS; + } + else + { + return FAILURE; + } +#endif +} + +/** @brief Closes communication to device. +*/ +void ConnectionUSB::Close() +{ + #ifndef __unix__ + USBDevicePrimary->Close(); + InEndPt = NULL; + OutEndPt = NULL; + if (InCtrlEndPt3) + { + delete InCtrlEndPt3; + InCtrlEndPt3 = NULL; + } + if (OutCtrlEndPt3) + { + delete OutCtrlEndPt3; + OutCtrlEndPt3 = NULL; + } + #else + if(dev_handle != 0) + { + libusb_release_interface(dev_handle, 0); + libusb_close(dev_handle); + dev_handle = 0; + } + #endif + isConnected = false; +} + +/** @brief Returns connection status + @return 1-connection open, 0-connection closed. +*/ +bool ConnectionUSB::IsOpen() +{ + #ifndef __unix__ + return USBDevicePrimary->IsOpen() && isConnected; + #else + return isConnected; + #endif +} + +/** @brief Sends given data buffer to chip through USB port. + @param buffer data buffer, must not be longer than 64 bytes. + @param length given buffer size. + @param timeout_ms timeout limit for operation in milliseconds + @return number of bytes sent. +*/ +int ConnectionUSB::Write(const unsigned char *buffer, const int length, int timeout_ms) +{ + long len = length; + if(IsOpen()) + { + unsigned char* wbuffer = new unsigned char[length]; + memcpy(wbuffer, buffer, length); + if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) + { + #ifndef __unix__ + if(OutCtrlEndPt3) + OutCtrlEndPt3->Write(wbuffer, len); + else + len = 0; + #else + len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR,CTR_W_REQCODE ,CTR_W_VALUE, CTR_W_INDEX, wbuffer, length, USB_TIMEOUT); + #endif + } + else + { + #ifndef __unix__ + if(OutCtrEndPt) + OutCtrEndPt->XferData(wbuffer, len); + else + len = 0; + #else + int actual = 0; + libusb_bulk_transfer(dev_handle, 0x01, wbuffer, len, &actual, USB_TIMEOUT); + len = actual; + #endif + } + delete wbuffer; + } + else + return 0; + return len; +} + +/** @brief Reads data coming from the chip through USB port. + @param buffer pointer to array where received data will be copied, array must be + big enough to fit received data. + @param length number of bytes to read from chip. + @param timeout_ms timeout limit for operation in milliseconds + @return number of bytes received. +*/ +int ConnectionUSB::Read(unsigned char *buffer, const int length, int timeout_ms) +{ + long len = length; + if(IsOpen()) + { + if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) + { + #ifndef __unix__ + if(InCtrlEndPt3) + InCtrlEndPt3->Read(buffer, len); + else + len = 0; + #else + len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN ,CTR_R_REQCODE ,CTR_R_VALUE, CTR_R_INDEX, buffer, len, USB_TIMEOUT); + #endif + } + else + { + #ifndef __unix__ + if(InCtrEndPt) + InCtrEndPt->XferData(buffer, len); + else + len = 0; + #else + int actual = 0; + libusb_bulk_transfer(dev_handle, 0x81, buffer, len, &actual, USB_TIMEOUT); + len = actual; + #endif + } + } + return len; +} + +#ifdef __unix__ +/** @brief Function for handling libusb callbacks +*/ +void callback_libusbtransfer(libusb_transfer *trans) +{ + USBTransferContext *context = reinterpret_cast(trans->user_data); + switch(trans->status) + { + case LIBUSB_TRANSFER_CANCELLED: + printf("Transfer canceled\n" ); + context->bytesXfered = trans->actual_length; + context->done = true; + context->used = false; + context->reset(); + break; + case LIBUSB_TRANSFER_COMPLETED: + if(trans->actual_length == context->bytesExpected) + { + context->bytesXfered = trans->actual_length; + context->done = true; + } + //printf("Transfer complete %i\n", trans->actual_length); + break; + case LIBUSB_TRANSFER_ERROR: + printf("TRANSFER ERRRO\n"); + break; + case LIBUSB_TRANSFER_TIMED_OUT: + printf("transfer timed out\n"); + + break; + case LIBUSB_TRANSFER_OVERFLOW: + printf("transfer overflow\n"); + + break; + case LIBUSB_TRANSFER_STALL: + printf("transfer stalled\n"); + break; + } + context->mPacketProcessed.notify_one(); +} +#endif + +/** @brief Finds all chips connected to usb ports + @return number of devices found +*/ +int ConnectionUSB::RefreshDeviceList() +{ + #ifndef __unix__ + USBDevicePrimary->Close(); + currentDeviceIndex = -1; + m_deviceNames.clear(); + string name; + if (USBDevicePrimary->DeviceCount()) + { + for (int i=0; iDeviceCount(); ++i) + { + Open(i); + name = DeviceName(); + m_deviceNames.push_back(name); + } + currentDeviceIndex = -1; + } + #else + m_dev_pid_vid.clear(); + m_deviceNames.clear(); + int usbDeviceCount = libusb_get_device_list(ctx, &devs); + if(usbDeviceCount > 0) + { + libusb_device_descriptor desc; + for(int i=0; i(pid,vid)); + } + else if(pid == 241) + { + m_hardwareName = HW_DIGIRED; + libusb_device_handle *tempDev_handle; + tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid); + if(libusb_kernel_driver_active(tempDev_handle, 0) == 1) //find out if kernel driver is attached + { + if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it + printf("Kernel Driver Detached!\n"); + } + if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device + { + printf("Cannot Claim Interface\n"); + } + + string fullName; + //check operating speed + int speed = libusb_get_device_speed(devs[i]); + if(speed == LIBUSB_SPEED_HIGH) + fullName = "USB 2.0"; + else if(speed == LIBUSB_SPEED_SUPER) + fullName = "USB 3.0"; + else + fullName = "USB"; + fullName += " ("; + //read device name + char data[255]; + memset(data, 0, 255); + int st = libusb_get_string_descriptor_ascii(tempDev_handle, 2, (unsigned char*)data, 255); + if(strlen(data) > 0) + fullName += data; + fullName += ")"; + libusb_close(tempDev_handle); + + m_deviceNames.push_back(fullName); + m_dev_pid_vid.push_back( pair(pid,vid)); + } + } + } + } + else + { + libusb_free_device_list(devs, 1); + return 0; + } + #endif + return m_deviceNames.size(); +} + +void ConnectionUSB::ClearComm() +{ +} + +/** @return name of currently opened device as string. +*/ +string ConnectionUSB::DeviceName() +{ +#ifndef __unix__ + string name; + char tempName[USB_STRING_MAXLEN]; + //memcpy(tempName, USBDevicePrimary->FriendlyName, USB_STRING_MAXLEN); + //name = tempName; + + for (int i = 0; i < USB_STRING_MAXLEN; ++i) + tempName[i] = USBDevicePrimary->DeviceName[i]; + if (USBDevicePrimary->bSuperSpeed == true) + name = "USB 3.0"; + else if (USBDevicePrimary->bHighSpeed == true) + name = "USB 2.0"; + else + name = "USB"; + name += " ("; + name += tempName; + name += ")"; + return name; +#else + if(dev_handle != 0) + { + char data[255]; + int st = libusb_get_string_descriptor_ascii(dev_handle, 2, (unsigned char*)data, 255); + return string(data); + } + return "no name"; +#endif +} + +/** + @brief Starts asynchronous data reading from board + @param *buffer buffer where to store received data + @param length number of bytes to read + @return handle of transfer context +*/ +int ConnectionUSB::BeginDataReading(char *buffer, long length) +{ + int i = 0; + bool contextFound = false; + //find not used context + for(i = 0; iBeginDataXfer((unsigned char*)buffer, length, contexts[i].inOvLap); + return i; + #else + unsigned int Timeout = 1000; + libusb_transfer *tr = contexts[i].transfer; + libusb_fill_bulk_transfer(tr, dev_handle, 0x81, (unsigned char*)buffer, length, callback_libusbtransfer, &contexts[i], Timeout); + contexts[i].done = false; + contexts[i].bytesXfered = 0; + contexts[i].bytesExpected = length; + int status = libusb_submit_transfer(tr); + int actual = 0; + //int status = libusb_bulk_transfer(dev_handle, 0x81, (unsigned char*)buffer, length, &actual, USB_TIMEOUT); + if(status != 0) + printf("ERROR BEGIN DATA TRANSFER %s\n", libusb_error_name(status)); + #endif + return i; +} + +/** + @brief Waits for asynchronous data reception + @param contextHandle handle of which context data to wait + @param timeout_ms number of miliseconds to wait + @return 1-data received, 0-data not received +*/ +int ConnectionUSB::WaitForReading(int contextHandle, unsigned int timeout_ms) +{ + if( contexts[contextHandle].used == true && contextHandle >= 0) + { + int status = 0; + #ifndef __unix__ + if(InEndPt) + status = InEndPt->WaitForXfer(contexts[contextHandle].inOvLap, timeout_ms); + return status; + #else + + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 0; + if(libusb_handle_events_timeout_completed(ctx, &tv, NULL) != 0) + printf("error libusb_handle_events %i\n", status); + + auto t1 = chrono::high_resolution_clock::now(); + auto t2 = chrono::high_resolution_clock::now(); + + while(contexts[contextHandle].done == false && std::chrono::duration_cast(t2 - t1).count() < timeout_ms) + { + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 300; + std::this_thread::yield(); + //if(libusb_handle_events(ctx) != 0) + if(libusb_handle_events_timeout_completed(ctx, &tv, NULL) != 0) + printf("error libusb_handle_events %i\n", status); + t2 = chrono::high_resolution_clock::now(); + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + std::unique_lock lck(contexts[contextHandle].m_lock); + while(contexts[contextHandle].done == false) //is changed in libusb callback + { + if(contexts[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return 0; + } + return contexts[contextHandle].done == true; + #endif + } + else + return 0; +} + +/** + @brief Finishes asynchronous data reading from board + @param buffer array where to store received data + @param length number of bytes to read, function changes this value to number of bytes actually received + @param contextHandle handle of which context to finish + @return false failure, true number of bytes received +*/ +int ConnectionUSB::FinishDataReading(char *buffer, long &length, int contextHandle) +{ + if( contexts[contextHandle].used == true && contextHandle >= 0) + { + #ifndef __unix__ + int status = 0; + if(InEndPt) + status = InEndPt->FinishDataXfer((unsigned char*)buffer, length, contexts[contextHandle].inOvLap, contexts[contextHandle].context); + contexts[contextHandle].used = false; + contexts[contextHandle].reset(); + return length; + #else + length = contexts[contextHandle].bytesXfered; + contexts[contextHandle].used = false; + contexts[contextHandle].reset(); + return length; + #endif + } + else + return 0; +} + +int ConnectionUSB::ReadDataBlocking(char *buffer, long &length, int timeout_ms) +{ +#ifndef __unix__ + return InEndPt->XferData((unsigned char*)buffer, length); +#else + return 0; +#endif +} + + +/** + @brief Aborts reading operations +*/ +void ConnectionUSB::AbortReading() +{ +#ifndef __unix__ + InEndPt->Abort(); +#else + for(int i=0; iBeginDataXfer((unsigned char*)buffer, length, contextsToSend[i].inOvLap); + return i; + #else + unsigned int Timeout = 1000; + libusb_transfer *tr = contextsToSend[i].transfer; + //libusb_set_iso_packet_lengths(contexts[i].transfer, 512*64); + libusb_fill_bulk_transfer(tr, dev_handle, 0x1, (unsigned char*)buffer, length, callback_libusbtransfer, &contextsToSend[i], Timeout); + contextsToSend[i].done = false; + contextsToSend[i].bytesXfered = 0; + contextsToSend[i].bytesExpected = length; + libusb_submit_transfer(tr); + #endif + return i; +} + +/** + @brief Waits for asynchronous data sending + @param contextHandle handle of which context data to wait + @param timeout_ms number of miliseconds to wait + @return 1-data received, 0-data not received +*/ +int ConnectionUSB::WaitForSending(int contextHandle, unsigned int timeout_ms) +{ + if( contextsToSend[contextHandle].used == true ) + { + #ifndef __unix__ + int status = 0; + if(OutEndPt) + status = OutEndPt->WaitForXfer(contextsToSend[contextHandle].inOvLap, timeout_ms); + return status; + #else + auto t1 = chrono::high_resolution_clock::now(); + auto t2 = chrono::high_resolution_clock::now(); + while(contextsToSend[contextHandle].done == false && std::chrono::duration_cast(t2 - t1).count() < timeout_ms) + { + /* struct timeval tv; + tv.tv_sec = 1; + tv.tv_usec = 0; + int status = libusb_handle_events_timeout_completed(ctx, &tv, NULL); + if(status != 0) + printf("error libusb_handle_events %i\n", status);*/ + t2 = chrono::high_resolution_clock::now(); + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + std::unique_lock lck(contextsToSend[contextHandle].m_lock); + while(contextsToSend[contextHandle].done == false) //is changed in libusb callback + { + if(contextsToSend[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return 0; + } + return contextsToSend[contextHandle].done == true; + #endif + } + else + return 0; +} + +/** + @brief Finishes asynchronous data sending to board + @param buffer array where to store received data + @param length number of bytes to read, function changes this value to number of bytes acctually received + @param contextHandle handle of which context to finish + @return false failure, true number of bytes sent +*/ +int ConnectionUSB::FinishDataSending(const char *buffer, long &length, int contextHandle) +{ + if( contextsToSend[contextHandle].used == true) + { + #ifndef __unix__ + if(OutEndPt) + OutEndPt->FinishDataXfer((unsigned char*)buffer, length, contextsToSend[contextHandle].inOvLap, contextsToSend[contextHandle].context); + contextsToSend[contextHandle].used = false; + contextsToSend[contextHandle].reset(); + return length; + #else + length = contextsToSend[contextHandle].bytesXfered; + contextsToSend[contextHandle].used = false; + contextsToSend[contextHandle].reset(); + return length; + #endif + } + else + return 0; +} + +/** + @brief Aborts sending operations +*/ +void ConnectionUSB::AbortSending() +{ +#ifndef __unix__ + OutEndPt->Abort(); +#else + for (int i = 0; i ConnectionUSB::GetDeviceNames() +{ + return m_deviceNames; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h new file mode 100644 index 0000000000..f3048c1842 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h @@ -0,0 +1,144 @@ +/** +@file ConnectionUSB.h +@author Lime Microsystems (www.limemicro.com) +@brief Class for data writing and reading through USB port +*/ + +#ifndef USB_PORT_CONNECTION_H +#define USB_PORT_CONNECTION_H + +#include "IConnection.h" + +#ifndef __unix__ +#include "windows.h" +#include "CyAPI.h" +#else +#include +#include +#include +#include +#endif + +#define USB_MAX_CONTEXTS 64 //maximum number of contexts for asynchronous transfers + +/** @brief Wrapper class for holding USB asynchronous transfers contexts +*/ +class USBTransferContext +{ +public: + USBTransferContext() : used(false) + { + #ifndef __unix__ + inOvLap = new OVERLAPPED; + memset(inOvLap, 0, sizeof(OVERLAPPED)); + inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); + context = NULL; + #else + transfer = libusb_alloc_transfer(0); + bytesXfered = 0; + bytesExpected = 0; + done = 0; + #endif + } + ~USBTransferContext() + { + #ifndef __unix__ + CloseHandle(inOvLap->hEvent); + delete inOvLap; + #else + libusb_free_transfer(transfer); + #endif + } + bool reset() + { + if(used) + return false; + #ifndef __unix__ + CloseHandle(inOvLap->hEvent); + memset(inOvLap, 0, sizeof(OVERLAPPED)); + inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); + #endif + return true; + } + bool used; + #ifndef __unix__ + PUCHAR context; + OVERLAPPED *inOvLap; + #else + libusb_transfer* transfer; + long bytesXfered; + long bytesExpected; + bool done; + std::mutex m_lock; + std::condition_variable mPacketProcessed; + #endif +}; + +class ConnectionUSB : public IConnection +{ +public: + ConnectionUSB(); + ~ConnectionUSB(); + + void FindDevices(); + DeviceStatus Open(); + DeviceStatus Open(unsigned index); + void Close(); + bool IsOpen(); + int GetOpenedIndex(); + + int Write(const unsigned char *buffer, int length, int timeout_ms = 0); + int Read(unsigned char *buffer, int length, int timeout_ms = 0); + + virtual int BeginDataReading(char *buffer, long length); + virtual int WaitForReading(int contextHandle, unsigned int timeout_ms); + virtual int FinishDataReading(char *buffer, long &length, int contextHandle); + virtual void AbortReading(); + virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms); + + virtual int BeginDataSending(const char *buffer, long length); + virtual int WaitForSending(int contextHandle, unsigned int timeout_ms); + virtual int FinishDataSending(const char *buffer, long &length, int contextHandle); + virtual void AbortSending(); + + std::vector GetDeviceNames(); + int RefreshDeviceList(); + void ClearComm(); +private: + int currentDeviceIndex; + std::string DeviceName(); + + std::vector m_deviceNames; + std::string m_hardwareName; + int m_hardwareVer; + + USBTransferContext contexts[USB_MAX_CONTEXTS]; + USBTransferContext contextsToSend[USB_MAX_CONTEXTS]; + void Initialize(); + + bool isConnected; + int currentPortIndex; + + #ifndef __unix__ + CCyUSBDevice *USBDevicePrimary; + //control endpoints for DigiRed + CCyControlEndPoint *InCtrlEndPt3; + CCyControlEndPoint *OutCtrlEndPt3; + + //control endpoints for DigiGreen + CCyUSBEndPoint *OutCtrEndPt; + CCyUSBEndPoint *InCtrEndPt; + + //end points for samples reading and writing + CCyUSBEndPoint *InEndPt; + CCyUSBEndPoint *OutEndPt; + + #else + libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices + libusb_device_handle *dev_handle; //a device handle + libusb_context *ctx; //a libusb session + std::vector > m_dev_pid_vid; + #endif +}; + +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h new file mode 100644 index 0000000000..5804f1149f --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h @@ -0,0 +1,68 @@ +/** + @file IConnection.h + @author Lime Microsystems + @brief Interface class for connection types +*/ + +#ifndef ICONNECTION_H +#define ICONNECTION_H + +#include +#include + +using namespace std; + +class IConnection +{ +public: + /// Supported connection types. + enum eConnectionType + { + CONNECTION_UNDEFINED = -1, + COM_PORT = 0, + USB_PORT = 1, + SPI_PORT = 2, + //insert new types here + CONNECTION_TYPES_COUNT //used only for memory allocation + }; + + enum DeviceStatus + { + SUCCESS, + FAILURE, + END_POINTS_NOT_FOUND, + CANNOT_CLAIM_INTERFACE + }; + + IConnection() : m_connectionType(CONNECTION_UNDEFINED){}; + virtual ~IConnection(){}; + virtual int RefreshDeviceList() = 0; + virtual DeviceStatus Open(unsigned i) = 0; + virtual void Close() = 0; + virtual bool IsOpen() = 0; + virtual int GetOpenedIndex() = 0; + + virtual int Write(const unsigned char *buffer, int length, int timeout_ms = 0) = 0; + virtual int Read(unsigned char *buffer, int length, int timeout_ms = 0) = 0; + + virtual std::vector GetDeviceNames() = 0; + + virtual eConnectionType GetType() { return m_connectionType; }; + virtual bool SetParam(const char *name, const char* value) {return false;}; + + virtual int BeginDataReading(char *buffer, long length){ return -1; }; + virtual int WaitForReading(int contextHandle, unsigned int timeout_ms){ return 0;}; + virtual int FinishDataReading(char *buffer, long &length, int contextHandle){ return 0;} + virtual void AbortReading(){}; + virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms){ return 0; } + + virtual int BeginDataSending(const char *buffer, long length){ return -1; }; + virtual int WaitForSending(int contextHandle, unsigned int timeout_ms){ return 0;}; + virtual int FinishDataSending(const char *buffer, long &length, int contextHandle){ return 0;} + virtual void AbortSending(){}; +protected: + eConnectionType m_connectionType; +}; + +#endif + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp new file mode 100644 index 0000000000..0e5ec66762 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp @@ -0,0 +1,325 @@ +/** +@file LMScomms.cpp +@author Lime Microsystems (www.limemicro.com) +@brief Implementation of data transmission to LMS boards +*/ + +#include "lmsComms.h" + +LMScomms::LMScomms(const IConnection::eConnectionType port_type) : ConnectionManager(port_type) +{ + callback_logData = nullptr; + unsigned short test = 0x1234; + unsigned char* bytes = (unsigned char*)&test; + if(bytes[0] == 0x12 && bytes[1] == 0x34) + mSystemBigEndian = true; + else + mSystemBigEndian = false; +} + +LMScomms::~LMScomms() +{ +} + +/** @brief Transfers data between packet and connected device + @param pkt packet containing output data and to receive incomming data + @return 0: success, other: failure +*/ +LMScomms::TransferStatus LMScomms::TransferPacket(GenericPacket& pkt) +{ + std::lock_guard lock(mControlPortLock); + TransferStatus status = TRANSFER_SUCCESS; + if(IsOpen() == false) + return NOT_CONNECTED; + + int packetLen; + eLMS_PROTOCOL protocol = LMS_PROTOCOL_UNDEFINED; + if(activeControlPort->GetType() == IConnection::SPI_PORT) + protocol = LMS_PROTOCOL_NOVENA; + else + protocol = LMS_PROTOCOL_LMS64C; + switch(protocol) + { + case LMS_PROTOCOL_UNDEFINED: + return TRANSFER_FAILED; + case LMS_PROTOCOL_LMS64C: + packetLen = ProtocolLMS64C::pktLength; + break; + case LMS_PROTOCOL_NOVENA: + packetLen = pkt.outBuffer.size() > ProtocolNovena::pktLength ? ProtocolNovena::pktLength : pkt.outBuffer.size(); + break; + default: + packetLen = 0; + return TRANSFER_FAILED; + } + int outLen = 0; + unsigned char* outBuffer = NULL; + outBuffer = PreparePacket(pkt, outLen, protocol); + unsigned char* inBuffer = new unsigned char[outLen]; + memset(inBuffer, 0, outLen); + + int outBufPos = 0; + int inDataPos = 0; + if(outLen == 0) + { + //printf("packet outlen = 0\n"); + outLen = 1; + } + + if(protocol == LMS_PROTOCOL_NOVENA) + { + bool transferData = true; //some commands are fake, so don't need transferring + if(pkt.cmd == CMD_GET_INFO) + { + //spi does not have GET INFO, fake it to inform what device it is + pkt.status = STATUS_COMPLETED_CMD; + pkt.inBuffer.clear(); + pkt.inBuffer.resize(64, 0); + pkt.inBuffer[0] = 0; //firmware + pkt.inBuffer[1] = LMS_DEV_NOVENA; //device + pkt.inBuffer[2] = 0; //protocol + pkt.inBuffer[3] = 0; //hardware + pkt.inBuffer[4] = EXP_BOARD_UNSUPPORTED; //expansion + transferData = false; + } + + if(transferData) + { + if (callback_logData) + callback_logData(true, outBuffer, outLen); + int bytesWritten = Write(outBuffer, outLen); + if( bytesWritten == outLen) + { + if(pkt.cmd == CMD_LMS7002_RD) + { + inDataPos = Read(&inBuffer[inDataPos], outLen); + if(inDataPos != outLen) + status = TRANSFER_FAILED; + else + { + if (callback_logData) + callback_logData(false, inBuffer, inDataPos); + } + } + ParsePacket(pkt, inBuffer, inDataPos, protocol); + } + else + status = TRANSFER_FAILED; + } + } + else + { + for(int i=0; i= 5) + { + info.firmware = pkt.inBuffer[0]; + info.device = pkt.inBuffer[1] < LMS_DEV_COUNT ? (eLMS_DEV)pkt.inBuffer[1] : LMS_DEV_UNKNOWN; + info.protocol = pkt.inBuffer[2]; + info.hardware = pkt.inBuffer[3]; + info.expansion = pkt.inBuffer[4] < EXP_BOARD_COUNT ? (eEXP_BOARD)pkt.inBuffer[4] : EXP_BOARD_UNKNOWN; + } + return info; +} + +/** @brief Takes generic packet and converts to specific protocol buffer + @param pkt generic data packet to convert + @param length returns length of returned buffer + @param protocol which protocol to use for data + @return pointer to data buffer, must be manually deleted after use +*/ +unsigned char* LMScomms::PreparePacket(const GenericPacket& pkt, int& length, const eLMS_PROTOCOL protocol) +{ + unsigned char* buffer = NULL; + if(protocol == LMS_PROTOCOL_UNDEFINED) + return NULL; + + if(protocol == LMS_PROTOCOL_LMS64C) + { + ProtocolLMS64C packet; + int maxDataLength = packet.maxDataLength; + packet.cmd = pkt.cmd; + packet.status = pkt.status; + int byteBlockRatio = 1; //block ratio - how many bytes in one block + switch( packet.cmd ) + { + case CMD_PROG_MCU: + case CMD_GET_INFO: + case CMD_SI5351_RD: + case CMD_SI5356_RD: + byteBlockRatio = 1; + break; + case CMD_SI5351_WR: + case CMD_SI5356_WR: + byteBlockRatio = 2; + break; + case CMD_LMS7002_RD: + case CMD_BRDSPI_RD: + case CMD_BRDSPI8_RD: + byteBlockRatio = 2; + break; + case CMD_ADF4002_WR: + byteBlockRatio = 3; + break; + case CMD_LMS7002_WR: + case CMD_BRDSPI_WR: + case CMD_ANALOG_VAL_WR: + byteBlockRatio = 4; + break; + default: + byteBlockRatio = 1; + } + if (packet.cmd == CMD_LMS7002_RD || packet.cmd == CMD_BRDSPI_RD) + maxDataLength = maxDataLength/2; + if (packet.cmd == CMD_ANALOG_VAL_RD) + maxDataLength = maxDataLength / 4; + int blockCount = pkt.outBuffer.size()/byteBlockRatio; + int bufLen = blockCount/(maxDataLength/byteBlockRatio) + +(blockCount%(maxDataLength/byteBlockRatio)!=0); + bufLen *= packet.pktLength; + if(bufLen == 0) + bufLen = packet.pktLength; + buffer = new unsigned char[bufLen]; + memset(buffer, 0, bufLen); + int srcPos = 0; + for(int j=0; j*packet.pktLength (maxDataLength/byteBlockRatio)) + { + buffer[pktPos+2] = maxDataLength/byteBlockRatio; + blockCount -= buffer[pktPos+2]; + } + else + buffer[pktPos+2] = blockCount; + memcpy(&buffer[pktPos+3], packet.reserved, sizeof(packet.reserved)); + int bytesToPack = (maxDataLength/byteBlockRatio)*byteBlockRatio; + for (int k = 0; k callback) +{ + callback_logData = callback; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h new file mode 100644 index 0000000000..f811d29302 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h @@ -0,0 +1,111 @@ +/** +@file LMScomms.h +@author Lime Microsystems (www.limemicro.com) +@brief Class for handling data transmission to LMS boards +*/ + +#ifndef LMS_COMMS_H +#define LMS_COMMS_H + +#include "lms7002_defines.h" +#include "ConnectionManager.h" +#include +#include + +struct LMSinfo +{ + eLMS_DEV device; + eEXP_BOARD expansion; + int firmware; + int hardware; + int protocol; +}; + +/* @brief Class for abstracting transfering data to and from chip +*/ +class LMScomms : public ConnectionManager +{ +public: + enum TransferStatus + { + TRANSFER_SUCCESS, + TRANSFER_FAILED, + NOT_CONNECTED + }; + + enum eLMS_PROTOCOL + { + LMS_PROTOCOL_UNDEFINED = 0, + LMS_PROTOCOL_DIGIC, + LMS_PROTOCOL_LMS64C, + LMS_PROTOCOL_NOVENA, + }; + struct ProtocolDIGIC + { + static const int pktLength = 64; + static const int maxDataLength = 60; + ProtocolDIGIC() : cmd(0), i2cAddr(0), blockCount(0) {}; + unsigned char cmd; + unsigned char i2cAddr; + unsigned char blockCount; + unsigned char reserved; + unsigned char data[maxDataLength]; + }; + + struct ProtocolLMS64C + { + static const int pktLength = 64; + static const int maxDataLength = 56; + ProtocolLMS64C() :cmd(0),status(STATUS_UNDEFINED),blockCount(0) + { + memset(reserved, 0, 5); + }; + unsigned char cmd; + unsigned char status; + unsigned char blockCount; + unsigned char reserved[5]; + unsigned char data[maxDataLength]; + }; + + struct ProtocolNovena + { + static const int pktLength = 128; + static const int maxDataLength = 128; + ProtocolNovena() :cmd(0),status(0) {}; + unsigned char cmd; + unsigned char status; + unsigned char blockCount; + unsigned char data[maxDataLength]; + }; + + struct GenericPacket + { + GenericPacket() + { + cmd = CMD_GET_INFO; + status = STATUS_UNDEFINED; + } + + eCMD_LMS cmd; + eCMD_STATUS status; + vector outBuffer; + vector inBuffer; + }; + + LMScomms(const IConnection::eConnectionType port_type); + ~LMScomms(); + + virtual TransferStatus TransferPacket(GenericPacket &pkt); + LMSinfo GetInfo(); + void SetDataLogCallback(std::function callback); +protected: + std::function callback_logData; + std::mutex mControlPortLock; + unsigned char* PreparePacket(const GenericPacket &pkt, int &length, const eLMS_PROTOCOL protocol); + int ParsePacket(GenericPacket &pkt, const unsigned char* buffer, const int length, const eLMS_PROTOCOL protocol); +protected: + bool mSystemBigEndian; +}; + +#endif // LMS_COMMS_H + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h new file mode 100644 index 0000000000..cba2b7341e --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h @@ -0,0 +1,33 @@ +#ifndef LMS_DATA_TYPES_H +#define LMS_DATA_TYPES_H + +typedef struct +{ + uint8_t reserved[8]; + uint64_t counter; + int16_t samples[2040]; +} PacketLTE; + +typedef struct +{ + int16_t i; + int16_t q; +} complex16_t; + +typedef struct +{ + uint64_t timestamp; //timestamp of the packet + uint16_t first; //index of first unused sample in samples[] + uint16_t last; //end index of samples + static const uint16_t samplesCount = 1024; //maximum number of samples in packet + complex16_t samples[samplesCount]; //must be power of two +} SamplesPacket; + +complex16_t operator &=(complex16_t & other1, const complex16_t & other) // copy assignment +{ + other1.i = other.i; + other1.q = other.q; + return other1; +} + +#endif \ No newline at end of file diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h new file mode 100644 index 0000000000..1868c64af7 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h @@ -0,0 +1,180 @@ +#ifndef LMS_FIFO_BUFFER_H +#define LMS_FIFO_BUFFER_H + +#include +#include +#include +#include +#include +#include "dataTypes.h" + +class LMS_SamplesFIFO +{ +public: + struct BufferInfo + { + uint32_t size; + uint32_t itemsFilled; + }; + + BufferInfo GetInfo() + { + std::unique_lock lck2(readLock); + std::unique_lock lck(writeLock); + BufferInfo stats; + stats.size = (uint32_t)mBuffer.size(); + stats.itemsFilled = mElementsFilled.load(); + return stats; + } + + LMS_SamplesFIFO(uint32_t bufLength) + { + Reset(bufLength); + } + + ~LMS_SamplesFIFO(){}; + + /** @brief inserts items to ring buffer + @param buffer data source + @param itemCount number of buffer items to insert + @param timeout_ms timeout duration for operation + @param overwrite enable to overwrite oldest items inside the buffer + @return number of items added + */ + uint32_t push_packet(SamplesPacket *buffer, const uint32_t itemCount, const uint32_t timeout_ms, const bool overwrite = true) + { + uint32_t addedItems = 0; + std::unique_lock lck(writeLock); + while (addedItems < itemCount) + { + while (mElementsFilled.load() >= mBuffer.size()) //wait for free space to insert items + { + if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return addedItems; //dropped all items + } + + uint32_t itemsToInsert = itemCount - addedItems; + uint32_t itemsToEnd = (uint32_t)mBuffer.size() - mTail.load(); //might need to split memcpy into two operations + if (itemsToInsert > itemsToEnd) + { + memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToEnd*sizeof(SamplesPacket)); + memcpy(&mBuffer[0], &buffer[addedItems+itemsToEnd], (itemsToInsert - itemsToEnd)*sizeof(SamplesPacket)); + } + else + memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToInsert*sizeof(SamplesPacket)); + mTail.store((mTail.load() + itemsToInsert) & (mBuffer.size() - 1)); + mElementsFilled.fetch_add(itemsToInsert); + canRead.notify_one(); + addedItems += itemsToInsert; + } + return addedItems; + } + + /** @brief inserts items to ring buffer + @param buffer data source + @param itemCount number of buffer items to insert + @param timeout_ms timeout duration for operation + @param overwrite enable to overwrite oldest items inside the buffer + @return number of items added + */ + uint32_t push_samples(const complex16_t *buffer, const uint32_t samplesCount, uint64_t timestamp, const uint32_t timeout_ms, const bool overwrite = true) + { + assert(buffer != nullptr); + const int samplesInPacket = SamplesPacket::samplesCount; + uint32_t samplesTaken = 0; + std::unique_lock lck(writeLock); + while (samplesTaken < samplesCount) + { + while (mElementsFilled.load() >= mBuffer.size()) //buffer might be full, wait for free slots + { + if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return samplesTaken; + } + + int tailIndex = mTail.load(); //which element to fill + while (mElementsFilled.load() < mBuffer.size() && samplesTaken < samplesCount) // not to release lock too often + { + mBuffer[tailIndex].timestamp = timestamp + samplesTaken; + mBuffer[tailIndex].first = 0; + mBuffer[tailIndex].last = 0; + while (mBuffer[tailIndex].last < samplesInPacket && samplesTaken < samplesCount) + { + mBuffer[tailIndex].samples[mBuffer[tailIndex].last++] = buffer[samplesTaken++]; + } + mTail.store((tailIndex + 1) & (mBuffer.size() - 1));//advance to next one + tailIndex = mTail.load(); + mElementsFilled.fetch_add(1); + canRead.notify_one(); + } + } + return samplesTaken; + } + + /** @brief Takes items out of ring buffer + @param buffer data destination + @param samplesCount number of samples to pop + @param timestamp returns timestamp of the first sample in buffer + @param timeout_ms timeout duration for operation + @return number of samples returned + */ + uint32_t pop_samples(complex16_t* buffer, const uint32_t samplesCount, uint64_t *timestamp, const uint32_t timeout_ms) + { + assert(buffer != nullptr); + const int samplesInPacket = SamplesPacket::samplesCount; + uint32_t samplesFilled = 0; + *timestamp = 0; + std::unique_lock lck(readLock); + while (samplesFilled < samplesCount) + { + while (mElementsFilled.load() == 0) //buffer might be empty, wait for packets + { + if (canRead.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return samplesFilled; + } + if(samplesFilled == 0) + *timestamp = mBuffer[mHead.load()].timestamp + mBuffer[mHead.load()].first; + + while(mElementsFilled.load() > 0 && samplesFilled < samplesCount) + { + int headIndex = mHead.load(); + while (mBuffer[headIndex].first < mBuffer[headIndex].last && samplesFilled < samplesCount) + { + buffer[samplesFilled++] = mBuffer[headIndex].samples[mBuffer[headIndex].first++]; + } + if (mBuffer[headIndex].first == mBuffer[headIndex].last) //packet depleated + { + mBuffer[headIndex].first = 0; + mBuffer[headIndex].last = 0; + mBuffer[headIndex].timestamp = 0; + mHead.store( (headIndex + 1) & (mBuffer.size() - 1) );//advance to next one + headIndex = mHead.load(); + mElementsFilled.fetch_sub(1); + canWrite.notify_one(); + } + } + } + return samplesFilled; + } + + void Reset(uint32_t bufLength) + { + std::unique_lock lck(writeLock); + std::unique_lock lck2(readLock); + mBuffer.resize(bufLength); + mHead.store(0); + mTail.store(0); + mElementsFilled.store(0); + } + +protected: + std::vector mBuffer; + std::atomic mHead; + std::atomic mTail; + std::mutex writeLock; + std::mutex readLock; + std::atomic mElementsFilled; + std::condition_variable canWrite; + std::condition_variable canRead; +}; + +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h new file mode 100644 index 0000000000..e4882f8924 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h @@ -0,0 +1,143 @@ +#ifndef LMS_RING_BUFFER_H +#define LMS_RING_BUFFER_H + +#include +#include +#include +#include + +template +class RingBuffer +{ +public: + struct BufferInfo + { + uint32_t size; + uint32_t itemsFilled; + }; + + BufferInfo GetInfo() + { + unique_lock lck(mLock); + BufferInfo stats; + stats.size = (uint32_t)mBuffer.size(); + stats.itemsFilled = mElementsFilled; + return stats; + } + + RingBuffer(uint32_t bufLength) + { + Reset(bufLength); + } + ~RingBuffer(){}; + + /** @brief inserts items to ring buffer + @param buffer data source + @param itemCount number of buffer items to insert + @param timeout_ms timeout duration for operation + @return number of items added + */ + uint32_t push_back(const T* buffer, const uint32_t itemCount, const uint32_t timeout_ms) + { + uint32_t addedItems = 0; + while (addedItems < itemCount) + { + unique_lock lck(mLock); + while (mElementsFilled >= mBuffer.size()) //wait for free space to insert items + { + if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return addedItems; //dropped all items + } + + uint32_t itemsToInsert = itemCount - addedItems; + uint32_t itemsToEnd = (uint32_t)mBuffer.size() - mTail.load(); //might need to split memcpy into two operations + if (itemsToInsert > itemsToEnd) + { + memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToEnd*sizeof(T)); + memcpy(&mBuffer[0], &buffer[addedItems+itemsToEnd], (itemsToInsert - itemsToEnd)*sizeof(T)); + } + else + memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToInsert*sizeof(T)); + mTail.store((mTail.load() + itemsToInsert) & (mBuffer.size() - 1)); + mElementsFilled += itemsToInsert; + lck.unlock(); + canRead.notify_one(); + addedItems += itemsToInsert; + } + return addedItems; + } + + /** @brief Takes items out of ring buffer + @param buffer data destination + @param itemCount number of items to extract from ring buffer + @param timeout_ms timeout duration for operation + @return number of items returned + */ + uint32_t pop_front(T* buffer, const uint32_t itemCount, const uint32_t timeout_ms) + { + assert(buffer != nullptr); + uint32_t itemsTaken = 0; + T* destBuffer = buffer; + while (itemsTaken < itemCount) + { + unique_lock lck(mLock); + while (mElementsFilled == 0) //buffer might be empty, wait for items + { + if (canRead.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) + return itemsTaken; + } + + unsigned int itemsToCopy = itemCount - itemsTaken; + if (itemsToCopy > mElementsFilled) + itemsToCopy = mElementsFilled; + unsigned int itemsToEnd = (uint32_t)mBuffer.size() - mHead.load(); //migth need to split memcpy into two operations + if (itemsToEnd < itemsToCopy) + { + memcpy(&destBuffer[itemsTaken], &mBuffer[mHead.load()], sizeof(T)*itemsToEnd); + memcpy(&destBuffer[itemsTaken+itemsToEnd], &mBuffer[0], sizeof(T)*(itemsToCopy - itemsToEnd)); + mHead.store((itemsToCopy - itemsToEnd) & (mBuffer.size() - 1)); + } + else + { + memcpy(&destBuffer[itemsTaken], &mBuffer[mHead.load()], sizeof(T)*itemsToCopy); + int headVal = mHead.load(); + int valueToStore = (headVal + itemsToCopy) & (mBuffer.size() - 1); + mHead.store(valueToStore); + headVal = mHead.load(); + } + mElementsFilled -= itemsToCopy; + lck.unlock(); + canWrite.notify_one(); + itemsTaken += itemsToCopy; + } + return itemsTaken; + } + + void Reset(uint32_t bufLength) + { + std::unique_lock lck(mLock); + if (bufLength >= (uint32_t)(1 << 31)) + bufLength = (uint32_t)(1 << 31); + for (int i = 0; i < 32; ++i) + if ((1 << i) >= bufLength) + { + bufLength = (1 << i); + break; + } + mBuffer.resize(bufLength); + mHead.store(0); + mTail.store(0); + mElementsFilled = 0; + } + +protected: + std::vector mBuffer; + std::atomic mHead; + std::atomic mTail; + std::mutex mLock; + uint32_t mElementsFilled; + std::condition_variable canWrite; + std::condition_variable canRead; +}; + +#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp new file mode 100644 index 0000000000..8c85863e80 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -0,0 +1,862 @@ +/******************************************************************************* + 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 . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common_lib.h" +#include "LMS_SDR.h" +#include "LMS7002M.h" +#include "Si5351C.h" +#include "LMS_StreamBoard.h" +#include "LMS7002M_RegistersMap.h" + +#include + + +///define for parameter enumeration if prefix might be needed +#define LMS7param(id) id + +LMScomms* usbport; +LMScomms* comport; +LMS7002M* lms7; +Si5351C* Si; +LMS_StreamBoard *lmsStream; + +#define RXDCLENGTH 4096 +#define NUMBUFF 40 +int16_t cos_fsover8[8] = {2047, 1447, 0, -1448, -2047, -1448, 0, 1447}; +int16_t cos_3fsover8[8] = {2047, -1448, 0, 1447, -2047, 1447, 0, -1448}; + +extern "C" +{ +int write_output(const char *fname,const char *vname,void *data,int length,int dec,char format); +} + +int trx_lms_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int antenna_id, int flags) { + + LMS_TRxWrite((int16_t*)buff[0], nsamps,0, timestamp); + + return nsamps; +} + + +int trx_lms_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int antenna_id) { + + uint64_t timestamp; + int16_t *dst_ptr = (int16_t*) buff[0]; + int ret; + ret = LMS_TRxRead(dst_ptr, nsamps,0,×tamp, 100); + *ptimestamp=timestamp; + + return ret; +} +void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { + + int i=0; + // loop through calibration table to find best adjustment factor for RX frequency + double min_diff = 6e9,diff; + + while (openair0_cfg->rx_gain_calib_table[i].freq>0) { + diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq); + printf("cal %d: freq %f, offset %f, diff %f\n", + i, + openair0_cfg->rx_gain_calib_table[i].freq, + openair0_cfg->rx_gain_calib_table[i].offset,diff); + if (min_diff > diff) { + min_diff = diff; + openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset; + } + i++; + } + +} +/* +void calibrate_rf(openair0_device *device) { + + openair0_timestamp ptimestamp; + int16_t *calib_buffp,*calib_tx_buffp; + int16_t calib_buff[2*RXDCLENGTH]; + int16_t calib_tx_buff[2*RXDCLENGTH]; + int i,j; + int8_t offI,offQ,offIold,offQold,offInew,offQnew,offphase,offphaseold,offphasenew,offgain,offgainold,offgainnew; + int32_t meanI,meanQ,meanIold,meanQold; + int cnt=0,loop; + liblms7_status opStatus; + int16_t dcoffi; + int16_t dcoffq; + int16_t dccorri; + int16_t dccorrq; + const int16_t firCoefs[] = + { + -2531, + -517, + 2708, + 188, + -3059, + 216, + 3569, + -770, + -4199, + 1541, + 4886, + -2577, + -5552, + 3909, + 6108, + -5537, + -6457, + 7440, + 6507, + -9566, + -6174, + 11845, + 5391, + -14179, + -4110, + 16457, + 2310, + -18561, + 0, + 20369, + -2780, + -21752, + 5963, + 22610, + -9456, + -22859, + 13127, + 22444, + -16854, + -21319, + 20489, + 19492, + -23883, + -17002, + 26881, + 13902, + -29372, + -10313, + 31226, + 6345, + -32380, + -2141, + 32767, + -2141, + -32380, + 6345, + 31226, + -10313, + -29372, + 13902, + 26881, + -17002, + -23883, + 19492, + 20489, + -21319, + -16854, + 22444, + 13127, + -22859, + -9456, + 22610, + 5963, + -21752, + -2780, + 20369, + 0, + -18561, + 2310, + 16457, + -4110, + -14179, + 5391, + 11845, + -6174, + -9566, + 6507, + 7440, + -6457, + -5537, + 6108, + 3909, + -5552, + -2577, + 4886, + 1541, + -4199, + -770, + 3569, + 216, + -3059, + 188, + 2708, + -517, + -2531 + }; + + j=0; + for (i=0;iBackupAllRegisters(); + uint8_t ch = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(MAC)); + //Stage 1 + uint8_t sel_band1_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); + uint8_t sel_band2_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); + { + uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C }; + uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses + uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD }; + + lms7->Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3); + } + + // opStatus = lms7->SetFrequencySX(LMS7002M::Rx, device->openair0_cfg[0].tx_freq[0]/1e6,30.72); + // put TX on fs/4 + opStatus = lms7->CalibrateRxSetup(device->openair0_cfg[0].sample_rate/1e6); + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot calibrate for %f MHz\n",device->openair0_cfg[0].sample_rate/1e6); + exit(-1); + } + // fill TX buffer with fs/8 complex sinusoid + offIold=offQold=64; + lms7->SetRxDCOFF(offIold,offQold); + LMS_RxStart(); + for (i=0;i (%d,%d)\n",offIold,offQold,meanIold,meanQold); + + offI=offQ=-64; + lms7->SetRxDCOFF(offI,offQ); + + for (i=0;i (%d,%d)\n",offI,offQ,meanI,meanQ); + + while (cnt++ < 7) { + + offInew=(offIold+offI)>>1; + offQnew=(offQold+offQ)>>1; + + if (meanI*meanI < meanIold*meanIold) { + meanIold = meanI; + offIold = offI; + printf("[LMS] *** RX DC: offI %d => %d\n",offIold,meanI); + } + if (meanQ*meanQ < meanQold*meanQold) { + meanQold = meanQ; + offQold = offQ; + printf("[LMS] *** RX DC: offQ %d => %d\n",offQold,meanQ); + } + offI = offInew; + offQ = offQnew; + + lms7->SetRxDCOFF(offI,offQ); + + for (i=0;i (%d,%d)\n",offI,offQ,meanI,meanQ); + } + + if (meanI*meanI < meanIold*meanIold) { + meanIold = meanI; + offIold = offI; + printf("[LMS] *** RX DC: offI %d => %d\n",offIold,meanI); + } + if (meanQ*meanQ < meanQold*meanQold) { + meanQold = meanQ; + offQold = offQ; + printf("[LMS] *** RX DC: offQ %d => %d\n",offQold,meanQ); + } + + printf("[LMS] RX DC: (%d,%d) => (%d,%d)\n",offIold,offQold,meanIold,meanQold); + + lms7->SetRxDCOFF(offIold,offQold); + + dcoffi = offIold; + dcoffq = offQold; + + lms7->Modify_SPI_Reg_bits(LMS7param(MAC), ch); + lms7->Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); + lms7->Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); + + // TX LO leakage + offQold=offIold=127; + lms7->SPI_write(0x0204,(((int16_t)offIold)<<7)|offQold); + + { + uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C }; + uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses + uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD }; + + lms7->Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3); + } + sel_band1_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); + sel_band2_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); + //B + lms7->Modify_SPI_Reg_bits(0x0100, 0, 0, 1); //EN_G_TRF 1 + if (sel_band1_trf == 1) + { + lms7->Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0); //PD_RLOOPB_1_RFE 0 + lms7->Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0); //EN_INSHSW_LB1 0 + } + if (sel_band2_trf == 1) + { + lms7->Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); //PD_RLOOPB_2_RFE 0 + lms7->Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); // EN_INSHSW_LB2 0 + } + // FixRXSaturation(); + + lms7->Modify_SPI_Reg_bits(LMS7param(GFIR3_BYP_RXTSP), 0); //GFIR3_BYP 0 + lms7->Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); + lms7->Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7); + lms7->Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7); + + lms7->SetGFIRCoefficients(LMS7002M::Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t)); + + for (i=0;i (%d,%d)\n",offIold,meanIold,meanQold); + + offI=-128; + lms7->SPI_write(0x0204,(((int16_t)offI)<<7)|offQold); + + for (i=0;i (%d,%d)\n",offI,meanI,meanQ); + cnt = 0; + while (cnt++ < 8) { + + offInew=(offIold+offI)>>1; + if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) { + printf("[LMS] TX DC (offI): ([%d,%d]) => %d : %d\n",offIold,offI,offInew,meanI*meanI+meanQ*meanQ); + meanIold = meanI; + meanQold = meanQ; + offIold = offI; + } + offI = offInew; + lms7->SPI_write(0x0204,(((int16_t)offI)<<7)|offQold); + + for (i=0;i (%d,%d)\n",offI,meanI,meanQ); + } + + + if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) { + printf("[LMS] TX DC (offI): ([%d,%d]) => %d : %d\n",offIold,offI,offInew,meanI*meanI+meanQ*meanQ); + meanIold = meanI; + meanQold = meanQ; + offIold = offI; + } + offQ=-128; + lms7->SPI_write(0x0204,(((int16_t)offIold)<<7)|offQ); + + for (i=0;i (%d,%d)\n",offQ,meanI,meanQ); + + cnt=0; + while (cnt++ < 8) { + + offQnew=(offQold+offQ)>>1; + if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) { + printf("[LMS] TX DC (offQ): ([%d,%d]) => %d : %d\n",offQold,offQ,offQnew,meanI*meanI+meanQ*meanQ); + + meanIold = meanI; + meanQold = meanQ; + offQold = offQ; + } + offQ = offQnew; + lms7->SPI_write(0x0204,(((int16_t)offIold)<<7)|offQ); + + + for (i=0;i (%d,%d)\n",offQ,meanI,meanQ); + } + + LMS_RxStop(); + + printf("[LMS] TX DC: (%d,%d) => (%d,%d)\n",offIold,offQold,meanIold,meanQold); + + dccorri = offIold; + dccorrq = offQold; + + + lms7->RestoreAllRegisters(); + lms7->Modify_SPI_Reg_bits(LMS7param(MAC), ch); + + lms7->Modify_SPI_Reg_bits(LMS7param(DCOFFI_RFE), dcoffi); + lms7->Modify_SPI_Reg_bits(LMS7param(DCOFFQ_RFE), dcoffq); + lms7->Modify_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP), dccorri); + lms7->Modify_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP), dccorrq); + // lms7->Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); + // lms7->Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); + // lms7->Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr); + + // lms7->Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP + lms7->Modify_SPI_Reg_bits(0x0208, 1, 0, 0); //GC_BYP PH_BYP + +} +*/ + +int trx_lms_start(openair0_device *device){ + + + LMS_Init(0, 128*1024); + usbport = LMS_GetUSBPort(); + //connect data stream port + LMS_UpdateDeviceList(usbport); + const char *name = LMS_GetDeviceName(usbport, 0); + printf("Connecting to device: %s\n",name); + + + + if (LMS_DeviceOpen(usbport, 0)==0) + { + Si = new Si5351C(); + lms7 = new LMS7002M(usbport); + liblms7_status opStatus; + + printf("Configuring Si5351C\n"); + Si->Initialize(usbport); + Si->SetPLL(0, 25000000, 0); + Si->SetPLL(1, 25000000, 0); + Si->SetClock(0, 27000000, true, false); + Si->SetClock(1, 27000000, true, false); + for (int i = 2; i < 8; ++i) + Si->SetClock(i, 27000000, false, false); + Si5351C::Status status = Si->ConfigureClocks(); + if (status != Si5351C::SUCCESS) + { + printf("Failed to configure Si5351C"); + exit(-1); + } + status = Si->UploadConfiguration(); + if (status != Si5351C::SUCCESS) + printf("Failed to upload Si5351C configuration"); + + + + lms7->ResetChip(); + + opStatus = lms7->LoadConfig(device->openair0_cfg[0].configFilename); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Failed to load configuration file %s\n",device->openair0_cfg[0].configFilename); + exit(-1); + } + opStatus = lms7->UploadAll(); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Failed to upload configuration file\n"); + exit(-1); + } + + // Set TX filter + + printf("Tuning TX filter\n"); + opStatus = lms7->TuneTxFilter(LMS7002M::TxFilter::TX_HIGHBAND,28.0); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Warning: Could not tune TX filter\n"); + } + + printf("Tuning RX filter\n"); + opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_LPF_LOWBAND,5.0); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Warning: Could not tune TX filter\n"); + } + + opStatus = lms7->SetInterfaceFrequency(lms7->GetFrequencyCGEN_MHz(), + lms7->Get_SPI_Reg_bits(HBI_OVR_TXTSP), + lms7->Get_SPI_Reg_bits(HBD_OVR_RXTSP)); + if (opStatus != LIBLMS7_SUCCESS) { + printf("SetInterfaceFrequency failed: %f,%d,%d\n", + lms7->GetFrequencyCGEN_MHz(), + lms7->Get_SPI_Reg_bits(HBI_OVR_TXTSP), + lms7->Get_SPI_Reg_bits(HBD_OVR_RXTSP)); + } + else { + printf("SetInterfaceFrequency as %f,%d,%d\n", + lms7->GetFrequencyCGEN_MHz(), + lms7->Get_SPI_Reg_bits(HBI_OVR_TXTSP), + lms7->Get_SPI_Reg_bits(HBD_OVR_RXTSP)); + } + lmsStream = new LMS_StreamBoard(usbport); + LMS_StreamBoard::Status opStreamStatus; + // this will configure that sampling rate at output of FPGA + opStreamStatus = lmsStream->ConfigurePLL(usbport,device->openair0_cfg[0].sample_rate,device->openair0_cfg[0].sample_rate,90); + if (opStatus != LIBLMS7_SUCCESS){ + printf("Sample rate programming failed\n"); + exit(-1); + } + + opStatus = lms7->SetFrequencySX(LMS7002M::Tx, device->openair0_cfg[0].tx_freq[0]/1e6,30.72); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6); + exit(-1); + } + else { + printf("Set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6); + } + opStatus = lms7->SetFrequencySX(LMS7002M::Rx, device->openair0_cfg[0].rx_freq[0]/1e6,30.72); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot set RX frequency %f MHz\n",device->openair0_cfg[0].rx_freq[0]/1e6); + exit(-1); + } + else { + printf("Set RX frequency %f MHz\n",device->openair0_cfg[0].rx_freq[0]/1e6); + } + + // Run calibration procedure + // calibrate_rf(device); + //lms7->CalibrateTx(5.0); + LMS_RxStart(); + } + else + { + return(-1); + } + + //connect control port + + /* comport = LMS_GetCOMPort(); + LMS_UpdateDeviceList(comport); + name = LMS_GetDeviceName(comport, 0); + if (*name == 0) + comport = usbport; //attempt to use data port + else + { + printf("Connecting to device: %s\n",name); + if (LMS_DeviceOpen(comport, 0)!=0) + return (-1); + } + lms7 = new LMS7002M(comport); + if( access( "./config.ini", F_OK ) != -1 ) //load config file + lms7->LoadConfig("./config.ini"); + //calibration takes too long + //lms7->CalibrateRx(5.0); + //lms7->CalibrateTx(5.0); + */ + + return 0; +} + + +int trx_lms_stop(int card) { + /* + LMS_DeviceClose(usbport); + LMS_DeviceClose(comport); + delete lms7; + return LMS_Destroy(); + */ +} + +int trx_lms_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { + //Control port must be connected + + lms7->SetFrequencySX(LMS7002M::Tx,openair0_cfg->tx_freq[0]/1e6,30.72); + lms7->SetFrequencySX(LMS7002M::Rx,openair0_cfg->rx_freq[0]/1e6,30.72); + printf ("[LMS] rx frequency:%f;\n",openair0_cfg->rx_freq[0]/1e6); + set_rx_gain_offset(openair0_cfg,0); + return(0); + +} + +// 31 = 19 dB => 105 dB total gain @ 2.6 GHz +rx_gain_calib_table_t calib_table_sodera[] = { + {3500000000.0,70.0}, + {2660000000.0,80.0}, + {2300000000.0,80.0}, + {1880000000.0,80.0}, + {816000000.0,80.0}, + {-1,0}}; + + + + + +int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { + + double gv = openair0_cfg[0].rx_gain[0] - openair0_cfg[0].rx_gain_offset[0]; + + if (gv > 31) { + printf("RX Gain 0 too high, reduce by %f dB\n",gv-31); + gv = 31; + } + if (gv < 0) { + printf("RX Gain 0 too low, increase by %f dB\n",-gv); + gv = 0; + } + printf("[LMS] Setting 7002M G_PGA_RBB to %d\n", (int16_t)gv); + lms7->Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),(int16_t)gv); + + return(0); +} + + +int trx_lms_get_stats(openair0_device* device) { + + return(0); + +} + +int trx_lms_reset_stats(openair0_device* device) { + + return(0); + +} + +int openair0_set_gains(openair0_device* device, + openair0_config_t *openair0_cfg) { + + return(0); +} + +int openair0_set_frequencies(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) { + + return(0); +} + + + +void trx_lms_end(openair0_device *device) { + + +} + + +int openair0_dev_init_lms(openair0_device *device, openair0_config_t *openair0_cfg){ + + + printf("LMSSDR: Initializing openair0_device for %s ...\n", ((device->func_type == BBU_FUNC) ? "BBU": "RRH")); + + switch ((int)openair0_cfg[0].sample_rate) { + case 30720000: + // from usrp_time_offset + openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_bw = 30.72e6; + openair0_cfg[0].rx_bw = 30.72e6; + openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; + break; + case 15360000: + openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 45; + openair0_cfg[0].tx_bw = 15.36e6; + openair0_cfg[0].rx_bw = 15.36e6; + openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; + break; + case 7680000: + openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 70; + openair0_cfg[0].tx_bw = 7.68e6; + openair0_cfg[0].rx_bw = 7.68e6; + openair0_cfg[0].tx_scheduling_advance = 12*openair0_cfg[0].samples_per_packet; + break; + case 1920000: + openair0_cfg[0].samples_per_packet = 256; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 1.25e6; + openair0_cfg[0].rx_bw = 1.25e6; + openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; + break; + default: + printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; + } + + openair0_cfg[0].rx_gain_calib_table = calib_table_sodera; + set_rx_gain_offset(openair0_cfg,0); + + device->Mod_id = 1; + device->trx_start_func = trx_lms_start; + device->trx_write_func = trx_lms_write; + device->trx_read_func = trx_lms_read; + device->trx_get_stats_func = trx_lms_get_stats; + device->trx_reset_stats_func = trx_lms_reset_stats; + device->trx_end_func = trx_lms_end; + device->trx_stop_func = trx_lms_stop; + device->trx_set_freq_func = trx_lms_set_freq; + device->trx_set_gains_func = trx_lms_set_gains; + + device->openair0_cfg = openair0_cfg; + + return 0; +} From 92987e4c9b4a00fd0a0026a56511b3aa98c4a30b Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Sun, 14 Feb 2016 20:31:38 +0100 Subject: [PATCH 053/122] small modifications in lms_lib.cpp added configuration file for lowband of SoDeRa --- openair1/PHY/TOOLS/lte_phy_scope.c | 4 +- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 49 +- ...enb_sodera_highband_5MHz_rx19dB_txfull.ini | 1128 +++++++++++++++++ ...sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini} | 100 +- .../CONF/enb.band7.tm1.50PRB.usrpb210.conf | 4 +- 5 files changed, 1211 insertions(+), 74 deletions(-) create mode 100644 targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini rename targets/ARCH/LMSSDR/{SoDeRa_MIMO.ini => enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini} (95%) mode change 100755 => 100644 diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index e507024c86..843a77fe62 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -88,7 +88,7 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX ); fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED ); fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color - fl_set_xyplot_ybounds(fdui->rxsig_t,30,70); + fl_set_xyplot_ybounds(fdui->rxsig_t,10,70); // Time-domain channel response fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" ); @@ -396,7 +396,7 @@ FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void ) fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX ); fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED ); fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color - fl_set_xyplot_ybounds(fdui->rxsig_t,30,70); + fl_set_xyplot_ybounds(fdui->rxsig_t,10,70); // Time-domain channel response fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" ); diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 8c85863e80..2402027506 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -571,6 +571,24 @@ void calibrate_rf(openair0_device *device) { } */ +int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { + + double gv = openair0_cfg[0].rx_gain[0] - openair0_cfg[0].rx_gain_offset[0]; + + if (gv > 31) { + printf("RX Gain 0 too high, reduce by %f dB\n",gv-31); + gv = 31; + } + if (gv < 0) { + printf("RX Gain 0 too low, increase by %f dB\n",-gv); + gv = 0; + } + printf("[LMS] Setting 7002M G_PGA_RBB to %d\n", (int16_t)gv); + lms7->Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),(int16_t)gv); + + return(0); +} + int trx_lms_start(openair0_device *device){ @@ -637,7 +655,14 @@ int trx_lms_start(openair0_device *device){ opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_LPF_LOWBAND,5.0); if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune TX filter\n"); + printf("Warning: Could not tune RX filter\n"); + } + + printf("Tuning TIA filter\n"); + opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_TIA,7.0); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Warning: Could not tune RX TIA filter\n"); } opStatus = lms7->SetInterfaceFrequency(lms7->GetFrequencyCGEN_MHz(), @@ -683,6 +708,7 @@ int trx_lms_start(openair0_device *device){ printf("Set RX frequency %f MHz\n",device->openair0_cfg[0].rx_freq[0]/1e6); } + trx_lms_set_gains(device, device->openair0_cfg); // Run calibration procedure // calibrate_rf(device); //lms7->CalibrateTx(5.0); @@ -743,31 +769,14 @@ rx_gain_calib_table_t calib_table_sodera[] = { {3500000000.0,70.0}, {2660000000.0,80.0}, {2300000000.0,80.0}, - {1880000000.0,80.0}, - {816000000.0,80.0}, + {1880000000.0,74.0}, // on W PAD + {816000000.0,76.0}, // on W PAD {-1,0}}; -int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { - - double gv = openair0_cfg[0].rx_gain[0] - openair0_cfg[0].rx_gain_offset[0]; - - if (gv > 31) { - printf("RX Gain 0 too high, reduce by %f dB\n",gv-31); - gv = 31; - } - if (gv < 0) { - printf("RX Gain 0 too low, increase by %f dB\n",-gv); - gv = 0; - } - printf("[LMS] Setting 7002M G_PGA_RBB to %d\n", (int16_t)gv); - lms7->Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),(int16_t)gv); - - return(0); -} int trx_lms_get_stats(openair0_device* device) { diff --git a/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini new file mode 100644 index 0000000000..a3c1aa2e6f --- /dev/null +++ b/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini @@ -0,0 +1,1128 @@ +[reference_clocks] +sxr_ref_clk_mhz=30.72 +sxt_ref_clk_mhz=30.72 +[lms7002_registers_b] +0x03A0=0x0000 +0x054E=0x0000 +0x02D0=0x0000 +0x0386=0x0000 +0x054F=0x0000 +0x0389=0x0000 +0x040F=0x0000 +0x04E3=0x0000 +0x0385=0x0000 +0x0315=0x0000 +0x0384=0x0000 +0x0382=0x0000 +0x0288=0x0000 +0x0381=0x0000 +0x0366=0x0000 +0x0365=0x0000 +0x0364=0x0000 +0x0325=0x0000 +0x035E=0x0000 +0x035D=0x0000 +0x0442=0x0000 +0x0452=0x0000 +0x0299=0x0000 +0x0359=0x0000 +0x029D=0x0000 +0x04A3=0x0000 +0x040E=0x0000 +0x0316=0x0000 +0x030D=0x0000 +0x0356=0x0000 +0x0348=0x0000 +0x0498=0x0000 +0x0490=0x0000 +0x02CD=0x0000 +0x050D=0x0000 +0x0353=0x0000 +0x0351=0x0000 +0x048F=0x0000 +0x0445=0x0000 +0x0350=0x0000 +0x03A6=0x0000 +0x0293=0x0000 +0x034E=0x0000 +0x035C=0x0000 +0x034D=0x0000 +0x034B=0x0000 +0x011A=0x2E02 +0x0455=0x0000 +0x034A=0x0000 +0x035B=0x0000 +0x0505=0x0000 +0x0345=0x0000 +0x035F=0x0000 +0x0597=0x0000 +0x0586=0x0000 +0x0484=0x0000 +0x02C8=0x0000 +0x035A=0x0000 +0x0561=0x0000 +0x0344=0x0000 +0x0343=0x0000 +0x0342=0x0000 +0x0380=0x0000 +0x0327=0x0000 +0x025E=0x0000 +0x04DA=0x0000 +0x04C2=0x0000 +0x028C=0x0000 +0x0352=0x0000 +0x059C=0x0000 +0x04DD=0x0000 +0x028A=0x0000 +0x0289=0x0000 +0x031A=0x0000 +0x0363=0x0000 +0x0396=0x0000 +0x0284=0x0000 +0x010C=0x88FD +0x044C=0x0000 +0x0355=0x0000 +0x025C=0x0000 +0x0515=0x0000 +0x0361=0x0000 +0x0205=0x0000 +0x025B=0x0000 +0x04C5=0x0000 +0x04E2=0x0000 +0x025A=0x0000 +0x0256=0x0000 +0x0240=0x0020 +0x0367=0x0000 +0x05A3=0x0000 +0x0502=0x0000 +0x0258=0x0000 +0x0255=0x0000 +0x040C=0x0000 +0x028B=0x0000 +0x0253=0x0000 +0x024E=0x0000 +0x0346=0x0000 +0x0280=0x0000 +0x0285=0x0000 +0x024A=0x0000 +0x0261=0x0000 +0x0249=0x0000 +0x04CD=0x0000 +0x040A=0x0000 +0x0556=0x0000 +0x0243=0x0000 +0x051D=0x0000 +0x0494=0x0000 +0x024C=0x0000 +0x02DC=0x0000 +0x038F=0x0000 +0x0241=0x0000 +0x0488=0x0000 +0x0251=0x0000 +0x020B=0x4000 +0x0108=0x9442 +0x04A0=0x0000 +0x0116=0x8180 +0x02CC=0x0000 +0x039A=0x0000 +0x0112=0xC0E6 +0x0307=0x0000 +0x038C=0x0000 +0x0282=0x0000 +0x0321=0x0000 +0x0507=0x0000 +0x0483=0x0000 +0x0201=0x07FF +0x02E1=0x0000 +0x0517=0x0000 +0x0481=0x0000 +0x02D5=0x0000 +0x0259=0x0000 +0x0527=0x0000 +0x02DD=0x0000 +0x0209=0x0000 +0x0297=0x0000 +0x0400=0x0081 +0x0104=0x0088 +0x0103=0x0A12 +0x0347=0x0000 +0x02D8=0x0000 +0x0457=0x0000 +0x0306=0x0000 +0x02D1=0x0000 +0x04C8=0x0000 +0x0546=0x0000 +0x0440=0x0020 +0x045E=0x0000 +0x031D=0x0000 +0x039C=0x0000 +0x02D2=0x0000 +0x010E=0x2040 +0x02A0=0x0000 +0x0544=0x0000 +0x029C=0x0000 +0x055A=0x0000 +0x0295=0x0000 +0x02CF=0x0000 +0x04D1=0x0000 +0x0291=0x0000 +0x02DF=0x0000 +0x0290=0x0000 +0x020A=0x0080 +0x0102=0x3180 +0x0120=0xB9FF +0x0388=0x0000 +0x0318=0x0000 +0x02A7=0x0000 +0x0200=0x0081 +0x0594=0x0000 +0x02C5=0x0000 +0x028D=0x0000 +0x02A1=0x0000 +0x0362=0x0000 +0x038A=0x0000 +0x0395=0x0000 +0x058D=0x0000 +0x02D7=0x0000 +0x0305=0x0000 +0x0393=0x0000 +0x0398=0x0000 +0x0408=0x0000 +0x039B=0x0000 +0x049E=0x0000 +0x02DB=0x0000 +0x0357=0x0000 +0x02C2=0x0000 +0x0514=0x0000 +0x051C=0x0000 +0x03A2=0x0000 +0x03A4=0x0000 +0x03A3=0x0000 +0x0493=0x0000 +0x0454=0x0000 +0x0448=0x0000 +0x0397=0x0000 +0x02E3=0x0000 +0x049C=0x0000 +0x040D=0x0000 +0x0281=0x0000 +0x048C=0x0000 +0x049A=0x0000 +0x0119=0x18CB +0x010F=0x3042 +0x02A6=0x0000 +0x0257=0x0000 +0x04D6=0x0000 +0x04A6=0x0000 +0x0324=0x0000 +0x038E=0x0000 +0x02E7=0x0000 +0x034F=0x0000 +0x04E0=0x0000 +0x0123=0x267B +0x0497=0x0000 +0x0459=0x0000 +0x0394=0x0000 +0x04A5=0x0000 +0x04D9=0x0000 +0x0304=0x0000 +0x04D5=0x0000 +0x0508=0x0000 +0x0443=0x0000 +0x0301=0x0000 +0x0548=0x0000 +0x04D2=0x0000 +0x0592=0x0000 +0x0591=0x0000 +0x04C7=0x0000 +0x049D=0x0000 +0x029A=0x0000 +0x051F=0x0000 +0x0309=0x0000 +0x0585=0x0000 +0x03A5=0x0000 +0x02D3=0x0000 +0x0451=0x0000 +0x0390=0x0000 +0x0562=0x0000 +0x02C4=0x0000 +0x029E=0x0000 +0x031E=0x0000 +0x04C0=0x0000 +0x04DC=0x0000 +0x04DE=0x0000 +0x058B=0x0000 +0x04DB=0x0000 +0x04D0=0x0000 +0x0492=0x0000 +0x04A1=0x0000 +0x054B=0x0000 +0x02C7=0x0000 +0x05A0=0x0000 +0x044B=0x0000 +0x0100=0x3409 +0x04CA=0x0000 +0x0446=0x0000 +0x02E4=0x0000 +0x04E4=0x0000 +0x04C3=0x0000 +0x0496=0x0000 +0x04CF=0x0000 +0x025F=0x0000 +0x04D4=0x0000 +0x0504=0x0000 +0x04CE=0x0000 +0x02DE=0x0000 +0x0399=0x0000 +0x050C=0x0000 +0x02A5=0x0000 +0x04CC=0x0000 +0x03A1=0x0000 +0x04E1=0x0000 +0x02A2=0x0000 +0x040B=0x7FFF +0x0283=0x0000 +0x048E=0x0000 +0x0580=0x0000 +0x0409=0x0000 +0x039F=0x0000 +0x0248=0x0000 +0x048B=0x0000 +0x0358=0x0000 +0x0589=0x0000 +0x038D=0x0000 +0x0487=0x0000 +0x0510=0x0000 +0x0302=0x0000 +0x0486=0x0000 +0x045F=0x0000 +0x0480=0x0000 +0x0567=0x0000 +0x02DA=0x0000 +0x045A=0x0000 +0x0254=0x0000 +0x0405=0x0000 +0x0387=0x0000 +0x0458=0x0000 +0x0314=0x0000 +0x0360=0x0000 +0x0559=0x0000 +0x0456=0x0000 +0x0453=0x0000 +0x02E2=0x0000 +0x044D=0x0000 +0x0441=0x0000 +0x02C3=0x0000 +0x04C1=0x0000 +0x04D3=0x0000 +0x0444=0x0000 +0x0207=0x0000 +0x04C6=0x0000 +0x0296=0x0000 +0x0555=0x0000 +0x0349=0x0000 +0x0109=0x61C1 +0x04A2=0x0000 +0x0447=0x0000 +0x0460=0x0000 +0x048D=0x0000 +0x059A=0x0000 +0x0407=0x0000 +0x02C0=0x0000 +0x0499=0x0000 +0x0543=0x0000 +0x04C9=0x0000 +0x02CA=0x0000 +0x0404=0x0000 +0x0560=0x0000 +0x02C1=0x0000 +0x04D8=0x0000 +0x0403=0x0000 +0x0491=0x0000 +0x029B=0x0000 +0x04C4=0x0000 +0x010D=0x009E +0x0402=0x07FF +0x055E=0x0000 +0x03A7=0x0000 +0x0520=0x0000 +0x0392=0x0000 +0x030B=0x0000 +0x0588=0x0000 +0x0308=0x0000 +0x048A=0x0000 +0x044A=0x0000 +0x04A4=0x0000 +0x0300=0x0000 +0x0587=0x0000 +0x044E=0x0000 +0x055B=0x0000 +0x02E5=0x0000 +0x0114=0x008D +0x0323=0x0000 +0x0320=0x0000 +0x0503=0x0000 +0x0513=0x0000 +0x0319=0x0000 +0x0260=0x0000 +0x0549=0x0000 +0x0552=0x0000 +0x0509=0x0000 +0x0521=0x0000 +0x0286=0x0000 +0x04D7=0x0000 +0x059E=0x0000 +0x058F=0x0000 +0x0557=0x0000 +0x0322=0x0000 +0x059B=0x0000 +0x049F=0x0000 +0x0522=0x0000 +0x0545=0x0000 +0x0551=0x0000 +0x0312=0x0000 +0x055D=0x0000 +0x0298=0x0000 +0x055F=0x0000 +0x011D=0xAAAA +0x039E=0x0000 +0x0547=0x0000 +0x0598=0x0000 +0x0449=0x0000 +0x0564=0x0000 +0x0242=0x0000 +0x0525=0x0000 +0x0523=0x0000 +0x0565=0x0000 +0x0124=0x0000 +0x0563=0x0000 +0x024D=0x0000 +0x05A5=0x0000 +0x0566=0x0000 +0x030A=0x0000 +0x029F=0x0000 +0x054C=0x0000 +0x0582=0x0000 +0x0599=0x0000 +0x0511=0x0000 +0x0506=0x0000 +0x0595=0x0000 +0x0584=0x0000 +0x058C=0x0000 +0x05A6=0x0000 +0x051E=0x0000 +0x050F=0x0000 +0x0590=0x0000 +0x0596=0x0000 +0x05A7=0x0000 +0x058A=0x0000 +0x059D=0x0000 +0x0485=0x0000 +0x0581=0x0000 +0x045D=0x0000 +0x0245=0x0000 +0x0310=0x0000 +0x058E=0x0000 +0x05A2=0x0000 +0x054D=0x0000 +0x020C=0x7FFF +0x031F=0x0000 +0x0292=0x0000 +0x059F=0x0000 +0x0583=0x0000 +0x0317=0x0000 +0x0244=0x0000 +0x0554=0x0000 +0x0593=0x0000 +0x05A4=0x0000 +0x02A3=0x0000 +0x0553=0x0000 +0x0542=0x0000 +0x0519=0x0000 +0x024F=0x0000 +0x0524=0x0000 +0x0518=0x0000 +0x0354=0x0000 +0x0526=0x0000 +0x031B=0x0000 +0x050E=0x0000 +0x0516=0x0000 +0x02CB=0x0000 +0x0250=0x0000 +0x031C=0x0000 +0x028F=0x0000 +0x051A=0x0000 +0x055C=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x04E7=0x0000 +0x04E6=0x0000 +0x04E5=0x0000 +0x0512=0x0000 +0x0206=0x0000 +0x0550=0x0000 +0x030E=0x0000 +0x0203=0x0000 +0x0482=0x0000 +0x0541=0x0000 +0x0122=0x033F +0x0110=0x0BF4 +0x0204=0x0000 +0x0252=0x0000 +0x011E=0x0AA7 +0x049B=0x0000 +0x0294=0x0000 +0x011C=0xA941 +0x02D6=0x0000 +0x0311=0x0000 +0x0117=0x280C +0x02A4=0x0000 +0x0540=0x0000 +0x02E0=0x0000 +0x0118=0x018C +0x0489=0x0000 +0x04A7=0x0000 +0x0101=0x7800 +0x0558=0x0000 +0x02C6=0x0000 +0x05A1=0x0000 +0x02C9=0x0000 +0x039D=0x0000 +0x0500=0x0000 +0x0450=0x0000 +0x011F=0x3600 +0x030C=0x0000 +0x04DF=0x0000 +0x0106=0x3182 +0x028E=0x0000 +0x0326=0x0000 +0x0113=0x03C3 +0x04CB=0x0000 +0x0391=0x0000 +0x0105=0x0007 +0x02D9=0x0000 +0x02CE=0x0000 +0x044F=0x0000 +0x038B=0x0000 +0x02D4=0x0000 +0x0107=0x318C +0x0495=0x0000 +0x0246=0x0000 +0x0303=0x0000 +0x02E6=0x0000 +0x045B=0x0000 +0x0340=0x0000 +0x0208=0x0070 +0x0111=0x0083 +0x0247=0x0000 +0x024B=0x0000 +0x045C=0x0000 +0x0383=0x0000 +0x0202=0x07FF +0x054A=0x0000 +0x0401=0x07FF +0x0341=0x0000 +0x0287=0x0000 +0x034C=0x0000 +0x0501=0x0000 +0x030F=0x0000 +0x025D=0x0000 +0x0406=0x0000 +0x0313=0x0000 +0x010A=0x104C +0x0461=0x0000 +0x051B=0x0000 +0x0121=0x31FA +0x0115=0x0009 +[lms7002_registers_a] +0x0107=0x318C +0x02D4=0x0000 +0x0082=0x8001 +0x0209=0x0000 +0x02CA=0x0000 +0x04C9=0x0000 +0x0120=0xB9FF +0x0388=0x0000 +0x029D=0x0000 +0x04A3=0x0000 +0x0208=0x0170 +0x0340=0x0000 +0x0094=0x0000 +0x0244=0x0000 +0x0317=0x0000 +0x00A9=0x8000 +0x0115=0x0009 +0x039A=0x0000 +0x0112=0x3171 +0x048C=0x0000 +0x0023=0x5550 +0x0587=0x1D10 +0x04C0=0x0000 +0x031E=0x0000 +0x0205=0x0000 +0x0361=0x0000 +0x051F=0xAB08 +0x029A=0x0000 +0x0396=0x0000 +0x0284=0x0000 +0x02CE=0x0000 +0x02D9=0x0000 +0x038B=0x0000 +0x044F=0x0000 +0x0367=0x0000 +0x0240=0x0028 +0x05A3=0x0000 +0x0105=0x0007 +0x009B=0x6565 +0x0400=0x0101 +0x02DB=0x0000 +0x0357=0x0000 +0x0104=0x0088 +0x0103=0x0612 +0x0457=0x0000 +0x0347=0x0000 +0x02D8=0x0000 +0x010C=0x8865 +0x0086=0x4101 +0x0202=0x0794 +0x0383=0x0000 +0x020B=0x4000 +0x0108=0xFC26 +0x0098=0x0000 +0x0117=0x100C +0x0027=0x05E4 +0x00A7=0x6565 +0x024A=0x0000 +0x0029=0x0101 +0x00AD=0x03FF +0x0540=0x5009 +0x02A4=0x0000 +0x02DE=0x0000 +0x002E=0x0000 +0x0261=0x0000 +0x00AB=0x0040 +0x0564=0x0000 +0x00A8=0x0000 +0x0517=0xC89D +0x0481=0x0000 +0x02C1=0x0000 +0x0301=0x0000 +0x00A5=0x6565 +0x0515=0x2E45 +0x025C=0x0000 +0x009F=0x658C +0x0519=0x4049 +0x054B=0xF7A3 +0x02C7=0x0000 +0x038C=0x0000 +0x0307=0x0000 +0x0282=0x0000 +0x0289=0x0000 +0x011C=0xA941 +0x0562=0xF524 +0x0025=0x0101 +0x02CC=0x0000 +0x0116=0x8180 +0x0597=0xFDFB +0x035F=0x0000 +0x002F=0x3840 +0x0589=0xEA5F +0x00A2=0x6565 +0x0099=0x6565 +0x0310=0x0000 +0x040C=0x40F8 +0x028B=0x0000 +0x0253=0x0000 +0x00AC=0x2000 +0x002D=0xFFFF +0x00A6=0x0001 +0x054D=0xF7A3 +0x002C=0x0000 +0x0249=0x0000 +0x04CD=0x0000 +0x0401=0x07FF +0x00A4=0x6565 +0x054A=0x8184 +0x038F=0x0000 +0x008C=0x267B +0x0241=0x0000 +0x0356=0x0000 +0x00A1=0x6565 +0x0260=0x0000 +0x0453=0x0000 +0x008A=0x0491 +0x048F=0x0000 +0x0445=0x0000 +0x0350=0x0000 +0x00AA=0x0000 +0x034C=0x0000 +0x0501=0xFDFB +0x0490=0x0000 +0x02CD=0x0000 +0x050D=0x0F45 +0x0353=0x0000 +0x0024=0x50D8 +0x04E5=0x0000 +0x0512=0x196B +0x0247=0x0000 +0x045C=0x0000 +0x024B=0x0000 +0x0395=0x0000 +0x011F=0x3600 +0x039D=0x0000 +0x0500=0xF61D +0x02C9=0x0000 +0x05A1=0x0000 +0x02A6=0x0000 +0x0119=0x18DF +0x010F=0x3042 +0x04CB=0x0000 +0x0391=0x0000 +0x0113=0x03C3 +0x0326=0x0000 +0x028E=0x0000 +0x0106=0x3182 +0x0524=0x3347 +0x009D=0x6565 +0x0294=0x0000 +0x0026=0x0101 +0x0110=0x0BFF +0x0122=0x033F +0x0381=0x0000 +0x009C=0x658C +0x05A0=0x0000 +0x0482=0x0000 +0x030E=0x0000 +0x0203=0x2F99 +0x0095=0x0000 +0x0111=0x0099 +0x0256=0x0000 +0x0089=0x00A0 +0x0085=0x0001 +0x0088=0x0530 +0x0459=0x0000 +0x0394=0x0000 +0x010E=0x0285 +0x02A0=0x0000 +0x002B=0x4038 +0x039C=0x0000 +0x02D2=0x0000 +0x0581=0xC89D +0x045D=0x0000 +0x0245=0x0000 +0x002A=0x0086 +0x0118=0x018C +0x02E0=0x0000 +0x0489=0x0000 +0x04A7=0x0000 +0x039E=0x0000 +0x011D=0xAAAA +0x02E1=0x0000 +0x0259=0x0000 +0x02D5=0x0000 +0x051D=0x4F91 +0x0243=0x0000 +0x0556=0xA2B5 +0x040A=0x1000 +0x05A2=0x0000 +0x020C=0x8000 +0x020A=0x0080 +0x0102=0x3180 +0x034F=0x0000 +0x0303=0x0000 +0x0306=0x0000 +0x0255=0x0000 +0x0300=0x0000 +0x044E=0x0000 +0x0309=0x0000 +0x0585=0xDAA2 +0x0527=0xACB9 +0x044A=0x0000 +0x04A4=0x0000 +0x048A=0x0000 +0x0392=0x0000 +0x030B=0x0000 +0x05A7=0x0000 +0x0252=0x0000 +0x0204=0xC016 +0x0308=0x0000 +0x0588=0xE6C7 +0x0321=0x0000 +0x0507=0xFCFE +0x0312=0x0000 +0x050B=0xF5EF +0x0360=0x0000 +0x0021=0x0E9F +0x04C2=0x0000 +0x030D=0x0000 +0x040E=0x0003 +0x0316=0x0000 +0x031F=0x0000 +0x030C=0x0000 +0x04DF=0x0000 +0x0318=0x0000 +0x0250=0x0000 +0x02CB=0x0000 +0x045E=0x0000 +0x0440=0x0024 +0x031D=0x0000 +0x058D=0xF5EF +0x02D7=0x0000 +0x0380=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0566=0x0906 +0x0345=0x0000 +0x049C=0x0000 +0x02E3=0x0000 +0x0397=0x0000 +0x035B=0x0000 +0x0505=0x00D8 +0x028D=0x0000 +0x02A1=0x0000 +0x028F=0x0000 +0x031C=0x0000 +0x031A=0x0000 +0x0363=0x0000 +0x0596=0x0A94 +0x0354=0x0000 +0x0518=0xEFF2 +0x035C=0x0000 +0x034D=0x0000 +0x0344=0x0000 +0x0561=0xAB08 +0x0096=0x0000 +0x010D=0x00DE +0x04C4=0x0000 +0x0351=0x0000 +0x0311=0x0000 +0x02D6=0x0000 +0x02D1=0x0000 +0x0546=0x8D44 +0x04C8=0x0000 +0x048B=0x0000 +0x0358=0x0000 +0x0522=0xDB10 +0x049F=0x0000 +0x034A=0x0000 +0x0455=0x0000 +0x0359=0x0000 +0x03A4=0x0000 +0x03A3=0x0000 +0x0341=0x0000 +0x0287=0x0000 +0x04DA=0x0000 +0x025E=0x0000 +0x0580=0xEFF2 +0x0409=0x0000 +0x059A=0x0000 +0x048D=0x0000 +0x0514=0xE7E2 +0x039B=0x0000 +0x0101=0x7800 +0x0558=0x5009 +0x02C6=0x0000 +0x051B=0xB77F +0x0313=0x0000 +0x010A=0x104C +0x0461=0x0000 +0x0406=0x0000 +0x030F=0x0000 +0x025D=0x0000 +0x034B=0x0000 +0x011A=0x2E14 +0x029F=0x0000 +0x030A=0x0000 +0x034E=0x0000 +0x0293=0x0000 +0x03A6=0x0000 +0x0560=0x174B +0x0404=0x0000 +0x00A0=0x6565 +0x0547=0xD7B7 +0x0454=0x0000 +0x0448=0x0000 +0x0327=0x0000 +0x0305=0x0000 +0x0393=0x0000 +0x0510=0xE6C7 +0x0302=0x0000 +0x0486=0x0000 +0x045F=0x0000 +0x0365=0x0000 +0x048E=0x0000 +0x0022=0x07FF +0x0283=0x0000 +0x044B=0x0000 +0x045A=0x0000 +0x02DA=0x0000 +0x04E4=0x0000 +0x02E4=0x0000 +0x03A5=0x0000 +0x040B=0x000F +0x0366=0x0000 +0x0443=0x0000 +0x0508=0xEF99 +0x00A3=0x6565 +0x02E2=0x0000 +0x044D=0x0000 +0x0314=0x0000 +0x0458=0x0000 +0x0493=0x0000 +0x0346=0x0000 +0x024E=0x0000 +0x055E=0xDB10 +0x0402=0x07D9 +0x0384=0x0000 +0x02E6=0x0000 +0x045B=0x0000 +0x0480=0x0000 +0x0567=0x4049 +0x04CA=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0460=0x0000 +0x0559=0xACB9 +0x0456=0x0000 +0x0441=0x0000 +0x0444=0x0000 +0x0390=0x0000 +0x0451=0x0000 +0x049E=0x0000 +0x0324=0x0000 +0x02E7=0x0000 +0x038E=0x0000 +0x0403=0x0013 +0x04D8=0x0000 +0x029B=0x0000 +0x0491=0x0000 +0x03A1=0x0000 +0x04E1=0x0000 +0x02A2=0x0000 +0x051C=0x0000 +0x03A2=0x0000 +0x0407=0x0000 +0x0258=0x0000 +0x0502=0x0A94 +0x038A=0x0000 +0x0362=0x0000 +0x028C=0x0000 +0x0352=0x0000 +0x0385=0x0000 +0x0315=0x0000 +0x040D=0x0000 +0x039F=0x0000 +0x0248=0x0000 +0x0405=0x0000 +0x0254=0x0000 +0x0398=0x0000 +0x0408=0x0000 +0x0487=0x0000 +0x038D=0x0000 +0x035E=0x0000 +0x03A7=0x0000 +0x0520=0x174B +0x0449=0x0000 +0x02C8=0x0000 +0x035A=0x0000 +0x0387=0x0000 +0x0386=0x0000 +0x0452=0x0000 +0x0299=0x0000 +0x0084=0x0400 +0x0498=0x0000 +0x0348=0x0000 +0x02D0=0x0000 +0x054E=0x8184 +0x03A0=0x0000 +0x009A=0x658C +0x055D=0xA6B5 +0x0298=0x0000 +0x0364=0x0000 +0x0081=0x0000 +0x0325=0x0000 +0x040F=0x43E4 +0x04E3=0x0000 +0x050E=0x17DC +0x0516=0x150F +0x0389=0x0000 +0x054F=0x18C9 +0x0304=0x0000 +0x04D5=0x0000 +0x059B=0x0000 +0x0322=0x0000 +0x0442=0x0000 +0x035D=0x0000 +0x0492=0x0000 +0x04A1=0x0000 +0x0382=0x0000 +0x0288=0x0000 +0x0296=0x0000 +0x0555=0xBD96 +0x0349=0x0000 +0x0484=0x0000 +0x0586=0x196B +0x0281=0x0000 +0x0200=0x0301 +0x0594=0xF40D +0x02C5=0x0000 +0x0319=0x0000 +0x0121=0x3760 +0x025B=0x0000 +0x0290=0x0000 +0x02DF=0x0000 +0x0291=0x0000 +0x029C=0x0000 +0x008B=0x278A +0x02A3=0x0000 +0x05A4=0x0000 +0x02A7=0x0000 +0x0483=0x0000 +0x0201=0x07FF +0x02C2=0x0000 +0x02C4=0x0000 +0x0207=0x0000 +0x04C6=0x0000 +0x0093=0x0000 +0x02D3=0x0000 +0x0494=0x0000 +0x04CF=0x0000 +0x025F=0x0000 +0x0251=0x0000 +0x0488=0x0000 +0x0496=0x0000 +0x04C3=0x0000 +0x0100=0x3409 +0x04CC=0x0000 +0x02A5=0x0000 +0x0257=0x0000 +0x04D6=0x0000 +0x04A6=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x0097=0x0000 +0x011E=0x0A2A +0x0285=0x0000 +0x0280=0x0000 +0x0020=0xFFFD +0x02DD=0x0000 +0x0297=0x0000 +0x044C=0x0000 +0x0355=0x0000 +0x04A0=0x0000 +0x02CF=0x0000 +0x04D1=0x0000 +0x0526=0xBE2A +0x0092=0x0001 +0x031B=0x0000 +0x0541=0x4C24 +0x0543=0xBD96 +0x02C0=0x0000 +0x0499=0x0000 +0x0513=0xDAA2 +0x0549=0x18C9 +0x0552=0x8D44 +0x0521=0x5852 +0x0509=0x0605 +0x0286=0x0000 +0x024F=0x0000 +0x04E0=0x0000 +0x0545=0x364E +0x0551=0xD7B7 +0x055F=0x5852 +0x009E=0x658C +0x0598=0xF61D +0x0123=0x067B +0x0497=0x0000 +0x04A5=0x0000 +0x0565=0xB77F +0x0124=0x0000 +0x0592=0x0DF1 +0x0591=0xFCFE +0x0548=0x79FA +0x04D2=0x0000 +0x0599=0x0000 +0x0511=0x1D10 +0x0506=0x0DF1 +0x0595=0x00BC +0x0584=0xE7E2 +0x0242=0x0000 +0x025A=0x0000 +0x04E2=0x0000 +0x04C5=0x0000 +0x058C=0xEA50 +0x0450=0x0000 +0x058A=0x17DC +0x059D=0x0000 +0x0485=0x0000 +0x058E=0x1316 +0x0550=0x79FA +0x0554=0x6901 +0x0593=0x00D8 +0x0553=0x364E +0x0542=0xA2B5 +0x0563=0x4F91 +0x024D=0x0000 +0x055A=0xBE2A +0x0295=0x0000 +0x028A=0x0000 +0x059C=0x0000 +0x04DD=0x0000 +0x054C=0x7FFF +0x0582=0x150F +0x0109=0x8CC1 +0x04A2=0x0000 +0x0292=0x0000 +0x0583=0x2E45 +0x059F=0x0000 +0x0525=0x57AC +0x0523=0xA6B5 +0x0206=0x0000 +0x051A=0x0906 +0x055C=0x3347 +0x05A6=0x0000 +0x050F=0xEA5F +0x051E=0xF524 +0x050A=0x1316 +0x04C7=0x0000 +0x049D=0x0000 +0x050C=0xEA50 +0x0087=0x0000 +0x0399=0x0000 +0x0495=0x0000 +0x0246=0x0000 +0x0503=0x00BC +0x0320=0x0000 +0x0323=0x0000 +0x055B=0x57AC +0x0114=0x0110 +0x02E5=0x0000 +0x04E7=0x0000 +0x04D0=0x0000 +0x04E6=0x0000 +0x00AE=0x0000 +0x0544=0x6901 +0x04DE=0x0000 +0x058B=0x0F45 +0x0028=0x0101 +0x029E=0x0000 +0x04DC=0x0000 +0x04D9=0x0000 +0x058F=0x0605 +0x0557=0x4C24 +0x04DB=0x0000 +0x04D7=0x0000 +0x059E=0x0000 +0x024C=0x0000 +0x02DC=0x0000 +0x04D4=0x0000 +0x0504=0xF40D +0x02C3=0x0000 +0x04C1=0x0000 +0x04D3=0x0000 +0x0590=0xEF99 +0x04CE=0x0000 +0x05A5=0x0000 +[file_info] +version=1 +type=lms7002m_minimal_config diff --git a/targets/ARCH/LMSSDR/SoDeRa_MIMO.ini b/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini old mode 100755 new mode 100644 similarity index 95% rename from targets/ARCH/LMSSDR/SoDeRa_MIMO.ini rename to targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini index a3feaa269b..0243742f32 --- a/targets/ARCH/LMSSDR/SoDeRa_MIMO.ini +++ b/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini @@ -28,8 +28,8 @@ version=1 0x0454=0x0000 0x0446=0x0000 0x04CA=0x0000 -0x0444=0x02B1 -0x0443=0xCCCD +0x0444=0x0000 +0x0443=0x0000 0x0508=0xEF99 0x0441=0x0000 0x040D=0x0000 @@ -42,7 +42,7 @@ version=1 0x0404=0x0000 0x00A0=0x6565 0x0560=0x174B -0x0403=0x0000 +0x0403=0x009C 0x0402=0x07FF 0x055E=0xDB10 0x03A7=0x0000 @@ -92,7 +92,7 @@ version=1 0x038A=0x0000 0x035E=0x0000 0x035D=0x0000 -0x0442=0x0CCC +0x0442=0x0000 0x0449=0x0000 0x035A=0x0000 0x02C8=0x0000 @@ -109,7 +109,7 @@ version=1 0x035C=0x0000 0x034D=0x0000 0x034B=0x0000 -0x011A=0x2E02 +0x011A=0x2E03 0x0455=0x0000 0x034A=0x0000 0x0348=0x0000 @@ -130,7 +130,7 @@ version=1 0x059B=0x0000 0x0321=0x0000 0x045E=0x0000 -0x0440=0x0020 +0x0440=0x0024 0x031D=0x0000 0x0363=0x0000 0x031A=0x0000 @@ -148,7 +148,7 @@ version=1 0x0360=0x0000 0x0313=0x0000 0x0461=0x0000 -0x010A=0x104C +0x010A=0x184C 0x051B=0xB77F 0x0312=0x0000 0x0346=0x0000 @@ -188,27 +188,27 @@ version=1 0x0102=0x3180 0x020C=0x8000 0x05A2=0x0000 -0x040A=0x0003 +0x040A=0x1000 0x0556=0xA2B5 0x0243=0x0000 0x051D=0x4F91 0x0259=0x0000 0x02D5=0x0000 0x02E1=0x0000 -0x011D=0xB555 +0x011D=0xFEEE 0x039E=0x0000 0x0252=0x0000 -0x0204=0x0000 +0x0204=0xFFAD 0x0255=0x0000 0x0281=0x0000 -0x0200=0x0081 +0x0200=0x0301 0x0594=0xF40D 0x02C5=0x0000 0x0406=0x0000 0x030F=0x0000 0x025D=0x0000 0x0319=0x0000 -0x0121=0x323C +0x0121=0x313C 0x0101=0x7800 0x025B=0x0000 0x02C6=0x0000 @@ -222,7 +222,7 @@ version=1 0x029C=0x0000 0x028D=0x0000 0x02A1=0x0000 -0x008B=0x21A6 +0x008B=0x278A 0x02A3=0x0000 0x05A4=0x0000 0x02A7=0x0000 @@ -249,7 +249,7 @@ version=1 0x0488=0x0000 0x0496=0x0000 0x04C3=0x0000 -0x0100=0x7409 +0x0100=0xB409 0x04CC=0x0000 0x02A5=0x0000 0x0257=0x0000 @@ -258,7 +258,7 @@ version=1 0x049A=0x0000 0x049B=0x0000 0x0097=0x0000 -0x011E=0x068E +0x011E=0x0663 0x0285=0x0000 0x0280=0x0000 0x049E=0x0000 @@ -346,7 +346,7 @@ version=1 0x054C=0x7FFF 0x0582=0x150F 0x0585=0xDAA2 -0x0109=0x61C1 +0x0109=0x03C1 0x04A2=0x0000 0x0292=0x0000 0x059F=0x0000 @@ -371,7 +371,7 @@ version=1 0x0399=0x0000 0x050B=0xF5EF 0x0507=0xFCFE -0x010D=0x015B +0x010D=0x01DC 0x04C4=0x0000 0x0495=0x0000 0x0246=0x0000 @@ -380,7 +380,7 @@ version=1 0x0323=0x0000 0x02E5=0x0000 0x055B=0x57AC -0x0114=0x008D +0x0114=0x0170 0x04D8=0x0000 0x04E7=0x0000 0x04D0=0x0000 @@ -413,25 +413,25 @@ version=1 0x04A7=0x0000 0x0489=0x0000 0x02E0=0x0000 -0x0118=0x018C +0x0118=0x218C 0x002A=0x0086 0x0245=0x0000 0x045D=0x0000 0x0581=0xC89D 0x02D2=0x0000 0x039C=0x0000 -0x002B=0x0038 +0x002B=0x4032 0x02A0=0x0000 -0x010E=0x0000 +0x010E=0x070C 0x0394=0x0000 0x0459=0x0000 -0x0088=0x0550 +0x0088=0x0530 0x0085=0x0001 -0x0089=0x1150 +0x0089=0x00A0 0x0256=0x0000 -0x0111=0x0083 +0x0111=0x0099 0x0095=0x0000 -0x0203=0x0000 +0x0203=0x2F6C 0x030E=0x0000 0x0482=0x0000 0x05A0=0x0000 @@ -450,7 +450,7 @@ version=1 0x0391=0x0000 0x04CB=0x0000 0x010F=0x3042 -0x0119=0x18CB +0x0119=0x529F 0x02A6=0x0000 0x05A1=0x0000 0x02C9=0x0000 @@ -463,7 +463,7 @@ version=1 0x0247=0x0000 0x0512=0x196B 0x04E5=0x0000 -0x0024=0xE4E4 +0x0024=0x50D8 0x0353=0x0000 0x050D=0x0F45 0x02CD=0x0000 @@ -472,9 +472,9 @@ version=1 0x034C=0x0000 0x00AA=0x0000 0x0350=0x0000 -0x0445=0xDA02 +0x0445=0x0000 0x048F=0x0000 -0x008A=0x0514 +0x008A=0x0491 0x0453=0x0000 0x0260=0x0000 0x00A1=0x6565 @@ -484,17 +484,17 @@ version=1 0x038F=0x0000 0x054A=0x8184 0x00A4=0x6565 -0x0401=0x07FF +0x0401=0x07ED 0x04CD=0x0000 0x0249=0x0000 -0x002C=0x0000 +0x002C=0x0100 0x054D=0xF7A3 0x00A6=0x0001 0x002D=0xFFFF 0x00AC=0x2000 0x0253=0x0000 0x028B=0x0000 -0x040C=0x00FC +0x040C=0x40F8 0x0310=0x0000 0x0099=0x6565 0x00A2=0x6565 @@ -534,13 +534,13 @@ version=1 0x0029=0x0101 0x024A=0x0000 0x00A7=0x6565 -0x0027=0xB1E4 -0x0117=0x280C +0x0027=0x05E4 +0x0117=0x1939 0x0098=0x0000 -0x0108=0x3042 +0x0108=0xFC26 0x020B=0x0000 0x0383=0x0000 -0x0202=0x07FF +0x0202=0x07F9 0x0086=0x4101 0x010C=0x8865 0x02D8=0x0000 @@ -550,11 +550,11 @@ version=1 0x0104=0x0088 0x0357=0x0000 0x02DB=0x0000 -0x0400=0x0081 +0x0400=0x0101 0x009B=0x6565 0x0105=0x0007 0x05A3=0x0000 -0x0240=0x0020 +0x0240=0x0028 0x0367=0x0000 0x044F=0x0000 0x038B=0x0000 @@ -571,7 +571,7 @@ version=1 0x0587=0x1D10 0x0023=0x5550 0x048C=0x0000 -0x0112=0xC0E6 +0x0112=0x20E5 0x039A=0x0000 0x0115=0x0009 0x00A9=0x8000 @@ -715,7 +715,7 @@ version=1 0x038A=0x0000 0x0362=0x0000 0x0387=0x0000 -0x0200=0x0101 +0x0200=0x0081 0x0594=0x0000 0x02C5=0x0000 0x02A7=0x0000 @@ -732,7 +732,7 @@ version=1 0x0295=0x0000 0x055A=0x0000 0x029C=0x0000 -0x010E=0x2000 +0x010E=0x2040 0x02A0=0x0000 0x010F=0x3042 0x02A6=0x0000 @@ -765,7 +765,7 @@ version=1 0x0104=0x0088 0x0357=0x0000 0x02DB=0x0000 -0x0400=0x0101 +0x0400=0x0081 0x0209=0x0000 0x0297=0x0000 0x02DD=0x0000 @@ -798,7 +798,7 @@ version=1 0x044A=0x0000 0x04A4=0x0000 0x04C4=0x0000 -0x010D=0x019C +0x010D=0x009E 0x0300=0x0000 0x0587=0x0000 0x044E=0x0000 @@ -834,7 +834,7 @@ version=1 0x055D=0x0000 0x0298=0x0000 0x055F=0x0000 -0x011D=0x7555 +0x011D=0x699D 0x039E=0x0000 0x0547=0x0000 0x0598=0x0000 @@ -932,7 +932,7 @@ version=1 0x0110=0x0BF4 0x0204=0x0000 0x0252=0x0000 -0x011E=0x06EC +0x011E=0x06B9 0x049B=0x0000 0x0294=0x0000 0x011C=0xAD41 @@ -977,7 +977,7 @@ version=1 0x045B=0x0000 0x0100=0x3409 0x0340=0x0000 -0x0208=0x0170 +0x0208=0x0070 0x0111=0x0083 0x0247=0x0000 0x024B=0x0000 @@ -997,14 +997,14 @@ version=1 0x010A=0x104C 0x0461=0x0000 0x051B=0x0000 -0x0121=0x348C +0x0121=0x333C 0x0115=0x0009 0x0112=0xC0E6 0x039A=0x0000 0x02CC=0x0000 0x0116=0x8180 0x04A0=0x0000 -0x0108=0x3042 +0x0108=0x9442 0x020B=0x4000 0x0251=0x0000 0x0488=0x0000 @@ -1027,7 +1027,7 @@ version=1 0x024E=0x0000 0x0253=0x0000 0x028B=0x0000 -0x040C=0x00FC +0x040C=0x0000 0x0255=0x0000 0x0258=0x0000 0x0502=0x0000 @@ -1045,7 +1045,7 @@ version=1 0x025C=0x0000 0x0355=0x0000 0x044C=0x0000 -0x010C=0x8865 +0x010C=0x88FD 0x0284=0x0000 0x0396=0x0000 0x0363=0x0000 diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index e94e7c79a9..2ce9598129 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -140,10 +140,10 @@ eNBs = NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.212/24"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; From 927975f13842854d7e0acd6e355ac5b86fc33083 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 15 Feb 2016 15:00:48 +0100 Subject: [PATCH 054/122] small bugfix + cosmetic changes --- openair1/SCHED/phy_mac_stub.c | 5 +++-- openair1/SCHED/phy_procedures_lte_eNb.c | 7 +++++-- openair1/SCHED/phy_procedures_lte_ue.c | 8 ++++---- targets/RT/USER/lte-softmodem.c | 6 +++--- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index cb66f49013..1dba343b37 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -194,6 +194,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e break; } + break; //subframe switch /* case 6: @@ -235,7 +236,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = subframe*3; //openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; @@ -471,7 +472,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); } - break; + break; //subframe switch /* case 8: diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index cb0b40f10b..375c0dcd1f 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1161,7 +1161,10 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e UE_id = i; if (UE_id>=0) { - // dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); + if ((frame%100)==0) { + LOG_D(PHY,"Frame %3d, SF %d \n",frame,subframe); + dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); + } #if defined(SMBV) && !defined(EXMIMO) // Configure this user if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { @@ -1232,7 +1235,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e if (harq_pid==255) { LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx); //mac_exit_wrapper("Invalid harq_pid (255) detected"); - return; // not reached + return; } if (phy_vars_eNB->mac_enabled==1) diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index e3be52cb92..1bba290fa1 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -446,7 +446,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, if (frame_parms->frame_type == FDD ) { // FDD sf = (subframe<4)? subframe+6 : subframe-4; - printf("n1_pucch_UE: subframe %d, nCCE %d\n",sf,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]); + LOG_D(PHY,"n1_pucch_UE: subframe %d, nCCE %d\n",sf,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]); if (SR == 0) return(frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]); @@ -2083,10 +2083,10 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst #ifdef DEBUG_PHY_PROC - // if (subframe_rx == 9) { //( frame_rx % 100 == 0) { + if ( frame_rx % 100 == 0) { LOG_D(PHY,"frame %d, subframe %d, rnti %x: dci %d/%d\n",frame_rx,subframe_rx,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,i,dci_cnt); - //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - // } + dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + } #endif diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 6fea0e5b42..b6c5819aae 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -427,7 +427,7 @@ void help (void) { printf(" -d Enable soft scope and L1 and L2 stats (Xforms)\n"); printf(" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"); printf(" -g Set the global log level, valide options: (9:trace, 8/7:debug, 6:info, 4:warn, 3:error)\n"); - printf(" -G Set the global log level \n"); + printf(" -G Set the global log verbosity \n"); printf(" -h provides this help message!\n"); printf(" -K Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n"); printf(" -m Set the maximum downlink MCS\n"); @@ -2564,8 +2564,8 @@ int main( int argc, char **argv ) if (UE_flag==1) { printf("configuring for UE\n"); - set_comp_log(HW, LOG_INFO, LOG_HIGH, 1); - set_comp_log(PHY, LOG_INFO, LOG_HIGH, 1); + set_comp_log(HW, LOG_DEBUG, LOG_HIGH, 1); + set_comp_log(PHY, LOG_DEBUG, LOG_HIGH, 1); set_comp_log(MAC, LOG_INFO, LOG_HIGH, 1); set_comp_log(RLC, LOG_INFO, LOG_HIGH, 1); set_comp_log(PDCP, LOG_INFO, LOG_HIGH, 1); From 7998985dd5ae3434093e77cd89177be42337cc51 Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Mon, 15 Feb 2016 22:31:28 +0100 Subject: [PATCH 055/122] 10 MHz configurations for SoDeRa. --- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 29 +- ...nb_sodera_highband_10MHz_rx19dB_txfull.ini | 1128 +++++++++++++++++ 2 files changed, 1144 insertions(+), 13 deletions(-) create mode 100644 targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 2402027506..8ee4845b51 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -645,25 +645,26 @@ int trx_lms_start(openair0_device *device){ // Set TX filter printf("Tuning TX filter\n"); - opStatus = lms7->TuneTxFilter(LMS7002M::TxFilter::TX_HIGHBAND,28.0); + opStatus = lms7->TuneTxFilter(LMS7002M::TxFilter::TX_HIGHBAND,device->openair0_cfg[0].tx_bw/1e6); if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune TX filter\n"); + printf("Warning: Could not tune TX filter to %f MHz\n",device->openair0_cfg[0].tx_bw/1e6); } printf("Tuning RX filter\n"); - opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_LPF_LOWBAND,5.0); + + opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_LPF_LOWBAND,device->openair0_cfg[0].rx_bw/1e6); if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune RX filter\n"); + printf("Warning: Could not tune RX filter to %f MHz\n",device->openair0_cfg[0].rx_bw/1e6); } - printf("Tuning TIA filter\n"); + /* printf("Tuning TIA filter\n"); opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_TIA,7.0); if (opStatus != LIBLMS7_SUCCESS) { printf("Warning: Could not tune RX TIA filter\n"); - } + }*/ opStatus = lms7->SetInterfaceFrequency(lms7->GetFrequencyCGEN_MHz(), lms7->Get_SPI_Reg_bits(HBI_OVR_TXTSP), @@ -683,7 +684,9 @@ int trx_lms_start(openair0_device *device){ lmsStream = new LMS_StreamBoard(usbport); LMS_StreamBoard::Status opStreamStatus; // this will configure that sampling rate at output of FPGA - opStreamStatus = lmsStream->ConfigurePLL(usbport,device->openair0_cfg[0].sample_rate,device->openair0_cfg[0].sample_rate,90); + opStreamStatus = lmsStream->ConfigurePLL(usbport, + device->openair0_cfg[0].sample_rate, + device->openair0_cfg[0].sample_rate,90); if (opStatus != LIBLMS7_SUCCESS){ printf("Sample rate programming failed\n"); exit(-1); @@ -827,16 +830,16 @@ int openair0_dev_init_lms(openair0_device *device, openair0_config_t *openair0_c case 15360000: openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 45; - openair0_cfg[0].tx_bw = 15.36e6; - openair0_cfg[0].rx_bw = 15.36e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; + openair0_cfg[0].tx_bw = 28e6; + openair0_cfg[0].rx_bw = 10e6; + openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 7680000: openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 70; - openair0_cfg[0].tx_bw = 7.68e6; - openair0_cfg[0].rx_bw = 7.68e6; - openair0_cfg[0].tx_scheduling_advance = 12*openair0_cfg[0].samples_per_packet; + openair0_cfg[0].tx_bw = 28e6; + openair0_cfg[0].rx_bw = 5.0e6; + openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; break; case 1920000: openair0_cfg[0].samples_per_packet = 256; diff --git a/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini new file mode 100644 index 0000000000..e4e420c334 --- /dev/null +++ b/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini @@ -0,0 +1,1128 @@ +[file_info] +type=lms7002m_minimal_config +version=1 +[lms7002_registers_a] +0x0493=0x0000 +0x0492=0x0000 +0x0491=0x0000 +0x029B=0x0000 +0x048E=0x0000 +0x0022=0x07FF +0x0283=0x0000 +0x0487=0x0000 +0x0486=0x0000 +0x045F=0x0000 +0x0480=0x0000 +0x0460=0x0000 +0x0447=0x0000 +0x045A=0x0000 +0x02DA=0x0000 +0x0458=0x0000 +0x0314=0x0000 +0x0456=0x0000 +0x0559=0xACB9 +0x0451=0x0000 +0x0390=0x0000 +0x044B=0x0000 +0x0448=0x0000 +0x0454=0x0000 +0x0446=0x0000 +0x04CA=0x0000 +0x0444=0x0000 +0x0443=0x0000 +0x0508=0xEF99 +0x0441=0x0000 +0x040D=0x0000 +0x040B=0x000F +0x0409=0x0000 +0x0580=0xEFF2 +0x0407=0x0000 +0x0405=0x0000 +0x0254=0x0000 +0x0404=0x0000 +0x00A0=0x6565 +0x0560=0x174B +0x0403=0x0013 +0x0402=0x07D9 +0x055E=0xDB10 +0x03A7=0x0000 +0x0520=0x174B +0x03A5=0x0000 +0x03A4=0x0000 +0x03A3=0x0000 +0x03A2=0x0000 +0x051C=0x0000 +0x048D=0x0000 +0x059A=0x0000 +0x03A1=0x0000 +0x02A2=0x0000 +0x04E1=0x0000 +0x039F=0x0000 +0x0248=0x0000 +0x039B=0x0000 +0x0408=0x0000 +0x0398=0x0000 +0x0393=0x0000 +0x0305=0x0000 +0x038E=0x0000 +0x0324=0x0000 +0x02E7=0x0000 +0x038D=0x0000 +0x0387=0x0000 +0x03A0=0x0000 +0x02D0=0x0000 +0x009A=0x658C +0x054E=0x8184 +0x0386=0x0000 +0x040F=0x43E4 +0x04E3=0x0000 +0x0389=0x0000 +0x054F=0x18C9 +0x0385=0x0000 +0x0315=0x0000 +0x0384=0x0000 +0x0382=0x0000 +0x0288=0x0000 +0x0366=0x0000 +0x0365=0x0000 +0x0364=0x0000 +0x0325=0x0000 +0x0081=0x0000 +0x0362=0x0000 +0x038A=0x0000 +0x035E=0x0000 +0x035D=0x0000 +0x0442=0x0000 +0x0449=0x0000 +0x035A=0x0000 +0x02C8=0x0000 +0x0452=0x0000 +0x0299=0x0000 +0x0359=0x0000 +0x0358=0x0000 +0x048B=0x0000 +0x0354=0x0000 +0x0351=0x0000 +0x03A6=0x0000 +0x0293=0x0000 +0x034E=0x0000 +0x035C=0x0000 +0x034D=0x0000 +0x034B=0x0000 +0x011A=0x2E14 +0x0455=0x0000 +0x034A=0x0000 +0x0348=0x0000 +0x0084=0x0400 +0x0498=0x0000 +0x035B=0x0000 +0x0505=0x00D8 +0x0345=0x0000 +0x0484=0x0000 +0x0586=0x196B +0x0344=0x0000 +0x0561=0xAB08 +0x0343=0x0000 +0x0342=0x0000 +0x0380=0x0000 +0x0327=0x0000 +0x0322=0x0000 +0x059B=0x0000 +0x0321=0x0000 +0x045E=0x0000 +0x0440=0x0024 +0x031D=0x0000 +0x0363=0x0000 +0x031A=0x0000 +0x031C=0x0000 +0x028F=0x0000 +0x0341=0x0000 +0x0287=0x0000 +0x0318=0x0000 +0x031F=0x0000 +0x0316=0x0000 +0x030D=0x0000 +0x040E=0x0003 +0x0352=0x0000 +0x028C=0x0000 +0x0360=0x0000 +0x0313=0x0000 +0x0461=0x0000 +0x010A=0x104C +0x051B=0xB77F +0x0312=0x0000 +0x0346=0x0000 +0x024E=0x0000 +0x0311=0x0000 +0x02D6=0x0000 +0x030C=0x0000 +0x04DF=0x0000 +0x030B=0x0000 +0x0392=0x0000 +0x030A=0x0000 +0x029F=0x0000 +0x0309=0x0000 +0x048A=0x0000 +0x0308=0x0000 +0x0588=0xE6C7 +0x0397=0x0000 +0x02E3=0x0000 +0x049C=0x0000 +0x044A=0x0000 +0x04A4=0x0000 +0x0306=0x0000 +0x0304=0x0000 +0x04D5=0x0000 +0x0303=0x0000 +0x0302=0x0000 +0x0510=0xE6C7 +0x044E=0x0000 +0x0300=0x0000 +0x034F=0x0000 +0x045B=0x0000 +0x02E6=0x0000 +0x00A3=0x6565 +0x04DA=0x0000 +0x025E=0x0000 +0x020A=0x0080 +0x0102=0x3180 +0x020C=0x8000 +0x05A2=0x0000 +0x040A=0x1000 +0x0556=0xA2B5 +0x0243=0x0000 +0x051D=0x4F91 +0x0259=0x0000 +0x02D5=0x0000 +0x02E1=0x0000 +0x011D=0xAAAA +0x039E=0x0000 +0x0252=0x0000 +0x0204=0xC016 +0x0255=0x0000 +0x0281=0x0000 +0x0200=0x0301 +0x0594=0xF40D +0x02C5=0x0000 +0x0406=0x0000 +0x030F=0x0000 +0x025D=0x0000 +0x0319=0x0000 +0x0121=0x3760 +0x0101=0x7800 +0x025B=0x0000 +0x02C6=0x0000 +0x0558=0x5009 +0x0021=0x0E9F +0x04C2=0x0000 +0x0290=0x0000 +0x02DF=0x0000 +0x0291=0x0000 +0x0296=0x0000 +0x029C=0x0000 +0x028D=0x0000 +0x02A1=0x0000 +0x008B=0x2756 +0x02A3=0x0000 +0x05A4=0x0000 +0x02A7=0x0000 +0x0483=0x0000 +0x0201=0x07FF +0x02C2=0x0000 +0x02C4=0x0000 +0x044D=0x0000 +0x02E2=0x0000 +0x02D1=0x0000 +0x0546=0x8D44 +0x04C8=0x0000 +0x0207=0x0000 +0x04C6=0x0000 +0x0096=0x0000 +0x0093=0x0000 +0x0250=0x0000 +0x02CB=0x0000 +0x02D3=0x0000 +0x0494=0x0000 +0x04CF=0x0000 +0x025F=0x0000 +0x0251=0x0000 +0x0488=0x0000 +0x0496=0x0000 +0x04C3=0x0000 +0x0100=0x3409 +0x04CC=0x0000 +0x02A5=0x0000 +0x0257=0x0000 +0x04D6=0x0000 +0x04A6=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x0097=0x0000 +0x011E=0x0A2A +0x0285=0x0000 +0x0280=0x0000 +0x049E=0x0000 +0x0020=0xFFFD +0x02DD=0x0000 +0x0297=0x0000 +0x049F=0x0000 +0x0522=0xDB10 +0x044C=0x0000 +0x0355=0x0000 +0x04A0=0x0000 +0x02CF=0x0000 +0x04D1=0x0000 +0x0526=0xBE2A +0x0092=0x0001 +0x031B=0x0000 +0x0541=0x4C24 +0x0518=0xEFF2 +0x0543=0xBD96 +0x02C0=0x0000 +0x0499=0x0000 +0x04A1=0x0000 +0x058D=0xF5EF +0x02D7=0x0000 +0x0513=0xDAA2 +0x0549=0x18C9 +0x0552=0x8D44 +0x0521=0x5852 +0x0509=0x0605 +0x0286=0x0000 +0x024F=0x0000 +0x04E0=0x0000 +0x0545=0x364E +0x0349=0x0000 +0x0555=0xBD96 +0x04E4=0x0000 +0x02E4=0x0000 +0x0551=0xD7B7 +0x055D=0xA6B5 +0x0298=0x0000 +0x055F=0x5852 +0x009E=0x658C +0x0547=0xD7B7 +0x0598=0xF61D +0x0123=0x067B +0x0497=0x0000 +0x04A5=0x0000 +0x0565=0xB77F +0x0124=0x0000 +0x0592=0x0DF1 +0x0591=0xFCFE +0x0548=0x79FA +0x04D2=0x0000 +0x0599=0x0000 +0x0511=0x1D10 +0x0506=0x0DF1 +0x0595=0x00BC +0x0584=0xE7E2 +0x0242=0x0000 +0x025A=0x0000 +0x04E2=0x0000 +0x04C5=0x0000 +0x058C=0xEA50 +0x0450=0x0000 +0x0596=0x0A94 +0x05A7=0x0000 +0x058A=0x17DC +0x059D=0x0000 +0x0485=0x0000 +0x058E=0x1316 +0x0550=0x79FA +0x0554=0x6901 +0x0593=0x00D8 +0x0542=0xA2B5 +0x0553=0x364E +0x0563=0x4F91 +0x024D=0x0000 +0x0567=0x4049 +0x055A=0xBE2A +0x0295=0x0000 +0x0566=0x0906 +0x028A=0x0000 +0x059C=0x0000 +0x04DD=0x0000 +0x054C=0x7FFF +0x0582=0x150F +0x0585=0xDAA2 +0x0109=0x8CC1 +0x04A2=0x0000 +0x0292=0x0000 +0x059F=0x0000 +0x0583=0x2E45 +0x050E=0x17DC +0x0516=0x150F +0x0523=0xA6B5 +0x0525=0x57AC +0x0206=0x0000 +0x051A=0x0906 +0x055C=0x3347 +0x0514=0xE7E2 +0x050F=0xEA5F +0x05A6=0x0000 +0x051E=0xF524 +0x050A=0x1316 +0x04C7=0x0000 +0x049D=0x0000 +0x0527=0xACB9 +0x050C=0xEA50 +0x0087=0x0000 +0x0399=0x0000 +0x050B=0xF5EF +0x0507=0xFCFE +0x010D=0x00DE +0x04C4=0x0000 +0x0495=0x0000 +0x0246=0x0000 +0x0503=0x00BC +0x0320=0x0000 +0x0323=0x0000 +0x02E5=0x0000 +0x055B=0x57AC +0x0114=0x0110 +0x04D8=0x0000 +0x04E7=0x0000 +0x04D0=0x0000 +0x04E6=0x0000 +0x00AE=0x0000 +0x0544=0x6901 +0x0258=0x0000 +0x0502=0x0A94 +0x04DE=0x0000 +0x058B=0x0F45 +0x0028=0x0101 +0x029E=0x0000 +0x04DC=0x0000 +0x04D9=0x0000 +0x0557=0x4C24 +0x058F=0x0605 +0x04DB=0x0000 +0x04D7=0x0000 +0x059E=0x0000 +0x024C=0x0000 +0x02DC=0x0000 +0x04D4=0x0000 +0x0504=0xF40D +0x02C3=0x0000 +0x04C1=0x0000 +0x04D3=0x0000 +0x0590=0xEF99 +0x04CE=0x0000 +0x05A5=0x0000 +0x04A7=0x0000 +0x0489=0x0000 +0x02E0=0x0000 +0x0118=0x018C +0x002A=0x0086 +0x0245=0x0000 +0x045D=0x0000 +0x0581=0xC89D +0x02D2=0x0000 +0x039C=0x0000 +0x002B=0x4032 +0x02A0=0x0000 +0x010E=0x0285 +0x0394=0x0000 +0x0459=0x0000 +0x0088=0x04F0 +0x0085=0x0001 +0x0089=0x0048 +0x0256=0x0000 +0x0111=0x0099 +0x0095=0x0000 +0x0203=0x2F99 +0x030E=0x0000 +0x0482=0x0000 +0x05A0=0x0000 +0x009C=0x658C +0x0381=0x0000 +0x0122=0x033F +0x0110=0x0BFF +0x0026=0x0101 +0x0294=0x0000 +0x009D=0x6565 +0x0524=0x3347 +0x0106=0x3182 +0x028E=0x0000 +0x0326=0x0000 +0x0113=0x03C3 +0x0391=0x0000 +0x04CB=0x0000 +0x010F=0x3042 +0x0119=0x18DF +0x02A6=0x0000 +0x05A1=0x0000 +0x02C9=0x0000 +0x0500=0xF61D +0x039D=0x0000 +0x011F=0x3600 +0x0395=0x0000 +0x024B=0x0000 +0x045C=0x0000 +0x0247=0x0000 +0x0512=0x196B +0x04E5=0x0000 +0x0024=0x50D8 +0x0353=0x0000 +0x050D=0x0F45 +0x02CD=0x0000 +0x0490=0x0000 +0x0501=0xFDFB +0x034C=0x0000 +0x00AA=0x0000 +0x0350=0x0000 +0x0445=0x0000 +0x048F=0x0000 +0x008A=0x0491 +0x0453=0x0000 +0x0260=0x0000 +0x00A1=0x6565 +0x0356=0x0000 +0x0241=0x0000 +0x008C=0x267B +0x038F=0x0000 +0x054A=0x8184 +0x00A4=0x6565 +0x0401=0x07FF +0x04CD=0x0000 +0x0249=0x0000 +0x002C=0x0000 +0x054D=0xF7A3 +0x00A6=0x0001 +0x002D=0xFFFF +0x00AC=0x2000 +0x0253=0x0000 +0x028B=0x0000 +0x040C=0x40F8 +0x0310=0x0000 +0x0099=0x6565 +0x00A2=0x6565 +0x0589=0xEA5F +0x002F=0x3840 +0x035F=0x0000 +0x0597=0xFDFB +0x0116=0x8180 +0x02CC=0x0000 +0x0025=0x0101 +0x0562=0xF524 +0x011C=0xA941 +0x0289=0x0000 +0x0282=0x0000 +0x0307=0x0000 +0x038C=0x0000 +0x02C7=0x0000 +0x054B=0xF7A3 +0x0519=0x4049 +0x009F=0x658C +0x025C=0x0000 +0x0515=0x2E45 +0x00A5=0x6565 +0x0301=0x0000 +0x02C1=0x0000 +0x0481=0x0000 +0x0517=0xC89D +0x00A8=0x0000 +0x0564=0x0000 +0x00AB=0x0040 +0x0261=0x0000 +0x002E=0x0000 +0x02DE=0x0000 +0x02A4=0x0000 +0x0540=0x5009 +0x00AD=0x03FF +0x0029=0x0101 +0x024A=0x0000 +0x00A7=0x6565 +0x0027=0x05E4 +0x0117=0x100C +0x0098=0x0000 +0x0108=0xFC26 +0x020B=0x4000 +0x0383=0x0000 +0x0202=0x0794 +0x0086=0x4101 +0x010C=0x8865 +0x02D8=0x0000 +0x0347=0x0000 +0x0457=0x0000 +0x0103=0x0612 +0x0104=0x0088 +0x0357=0x0000 +0x02DB=0x0000 +0x0400=0x0101 +0x009B=0x6565 +0x0105=0x0007 +0x05A3=0x0000 +0x0240=0x0028 +0x0367=0x0000 +0x044F=0x0000 +0x038B=0x0000 +0x02D9=0x0000 +0x02CE=0x0000 +0x0284=0x0000 +0x0396=0x0000 +0x029A=0x0000 +0x051F=0xAB08 +0x0361=0x0000 +0x0205=0x0000 +0x031E=0x0000 +0x04C0=0x0000 +0x0587=0x1D10 +0x0023=0x5550 +0x048C=0x0000 +0x0112=0x3171 +0x039A=0x0000 +0x0115=0x0009 +0x00A9=0x8000 +0x0317=0x0000 +0x0244=0x0000 +0x0094=0x0000 +0x0340=0x0000 +0x0208=0x0170 +0x04A3=0x0000 +0x029D=0x0000 +0x0388=0x0000 +0x0120=0xB9FF +0x04C9=0x0000 +0x02CA=0x0000 +0x0209=0x0000 +0x0082=0x8001 +0x02D4=0x0000 +0x0107=0x318C +[lms7002_registers_b] +0x04E1=0x0000 +0x03A1=0x0000 +0x02A2=0x0000 +0x04E0=0x0000 +0x04DE=0x0000 +0x058B=0x0000 +0x04DC=0x0000 +0x04DB=0x0000 +0x04D9=0x0000 +0x04D5=0x0000 +0x0304=0x0000 +0x04D4=0x0000 +0x0504=0x0000 +0x04D3=0x0000 +0x04D2=0x0000 +0x0548=0x0000 +0x04D0=0x0000 +0x04CF=0x0000 +0x025F=0x0000 +0x04CE=0x0000 +0x04CC=0x0000 +0x02A5=0x0000 +0x04C6=0x0000 +0x0207=0x0000 +0x04C1=0x0000 +0x02C3=0x0000 +0x04C9=0x0000 +0x02CA=0x0000 +0x04C0=0x0000 +0x031E=0x0000 +0x04D6=0x0000 +0x0257=0x0000 +0x04A6=0x0000 +0x04A5=0x0000 +0x04A2=0x0000 +0x0109=0x61C1 +0x049D=0x0000 +0x04C7=0x0000 +0x049C=0x0000 +0x0397=0x0000 +0x02E3=0x0000 +0x0499=0x0000 +0x02C0=0x0000 +0x0496=0x0000 +0x04C3=0x0000 +0x0493=0x0000 +0x04A1=0x0000 +0x0492=0x0000 +0x0491=0x0000 +0x029B=0x0000 +0x048E=0x0000 +0x0283=0x0000 +0x048C=0x0000 +0x048B=0x0000 +0x0358=0x0000 +0x0487=0x0000 +0x0486=0x0000 +0x045F=0x0000 +0x0480=0x0000 +0x0460=0x0000 +0x0447=0x0000 +0x045A=0x0000 +0x02DA=0x0000 +0x0458=0x0000 +0x0314=0x0000 +0x0456=0x0000 +0x0559=0x0000 +0x0453=0x0000 +0x0451=0x0000 +0x0390=0x0000 +0x044D=0x0000 +0x02E2=0x0000 +0x044B=0x0000 +0x0448=0x0000 +0x0454=0x0000 +0x0446=0x0000 +0x04CA=0x0000 +0x0444=0x0000 +0x0443=0x0000 +0x0508=0x0000 +0x0441=0x0000 +0x040D=0x0000 +0x040B=0x7FFF +0x0409=0x0000 +0x0580=0x0000 +0x0407=0x0000 +0x0405=0x0000 +0x0254=0x0000 +0x0404=0x0000 +0x0560=0x0000 +0x04D8=0x0000 +0x0403=0x0000 +0x0402=0x07FF +0x055E=0x0000 +0x03A7=0x0000 +0x0520=0x0000 +0x03A5=0x0000 +0x03A4=0x0000 +0x03A3=0x0000 +0x03A2=0x0000 +0x051C=0x0000 +0x048D=0x0000 +0x059A=0x0000 +0x049E=0x0000 +0x039F=0x0000 +0x0248=0x0000 +0x039B=0x0000 +0x0399=0x0000 +0x0408=0x0000 +0x0398=0x0000 +0x0497=0x0000 +0x0123=0x267B +0x0394=0x0000 +0x0459=0x0000 +0x0393=0x0000 +0x0305=0x0000 +0x038E=0x0000 +0x0324=0x0000 +0x02E7=0x0000 +0x038D=0x0000 +0x0395=0x0000 +0x038A=0x0000 +0x0362=0x0000 +0x0387=0x0000 +0x0200=0x0081 +0x0594=0x0000 +0x02C5=0x0000 +0x02A7=0x0000 +0x0318=0x0000 +0x0544=0x0000 +0x049A=0x0000 +0x0388=0x0000 +0x0120=0xB9FF +0x020A=0x0080 +0x0102=0x3180 +0x0290=0x0000 +0x02DF=0x0000 +0x0291=0x0000 +0x0295=0x0000 +0x055A=0x0000 +0x029C=0x0000 +0x010E=0x2040 +0x02A0=0x0000 +0x010F=0x3042 +0x02A6=0x0000 +0x0119=0x18CB +0x02D2=0x0000 +0x039C=0x0000 +0x028D=0x0000 +0x02A1=0x0000 +0x02C2=0x0000 +0x045E=0x0000 +0x031D=0x0000 +0x0440=0x0020 +0x02C4=0x0000 +0x04D1=0x0000 +0x02CF=0x0000 +0x02C1=0x0000 +0x02C7=0x0000 +0x054B=0x0000 +0x02D3=0x0000 +0x04C8=0x0000 +0x02D1=0x0000 +0x0546=0x0000 +0x0306=0x0000 +0x02D7=0x0000 +0x058D=0x0000 +0x0457=0x0000 +0x02D8=0x0000 +0x0347=0x0000 +0x0103=0x0A12 +0x0104=0x0088 +0x0357=0x0000 +0x02DB=0x0000 +0x0400=0x0081 +0x0209=0x0000 +0x0297=0x0000 +0x02DD=0x0000 +0x029E=0x0000 +0x02DE=0x0000 +0x0527=0x0000 +0x02D5=0x0000 +0x02E1=0x0000 +0x0259=0x0000 +0x0481=0x0000 +0x0517=0x0000 +0x029A=0x0000 +0x051F=0x0000 +0x0483=0x0000 +0x0201=0x07FF +0x0507=0x0000 +0x0321=0x0000 +0x034F=0x0000 +0x0296=0x0000 +0x0510=0x0000 +0x0302=0x0000 +0x038C=0x0000 +0x0307=0x0000 +0x0282=0x0000 +0x0392=0x0000 +0x030B=0x0000 +0x0588=0x0000 +0x0308=0x0000 +0x048A=0x0000 +0x044A=0x0000 +0x04A4=0x0000 +0x04C4=0x0000 +0x010D=0x009E +0x0300=0x0000 +0x0587=0x0000 +0x044E=0x0000 +0x0309=0x0000 +0x0585=0x0000 +0x02E5=0x0000 +0x055B=0x0000 +0x0114=0x008D +0x0323=0x0000 +0x0320=0x0000 +0x0503=0x0000 +0x0513=0x0000 +0x0319=0x0000 +0x0260=0x0000 +0x0549=0x0000 +0x0552=0x0000 +0x0509=0x0000 +0x0521=0x0000 +0x0286=0x0000 +0x04D7=0x0000 +0x059E=0x0000 +0x0557=0x0000 +0x058F=0x0000 +0x0322=0x0000 +0x059B=0x0000 +0x0545=0x0000 +0x0349=0x0000 +0x0555=0x0000 +0x02E4=0x0000 +0x04E4=0x0000 +0x0551=0x0000 +0x0312=0x0000 +0x055D=0x0000 +0x0298=0x0000 +0x055F=0x0000 +0x011D=0xAAAA +0x039E=0x0000 +0x0547=0x0000 +0x0598=0x0000 +0x0449=0x0000 +0x0564=0x0000 +0x0242=0x0000 +0x0525=0x0000 +0x0523=0x0000 +0x0565=0x0000 +0x0124=0x0000 +0x0592=0x0000 +0x0591=0x0000 +0x0563=0x0000 +0x024D=0x0000 +0x0567=0x0000 +0x05A5=0x0000 +0x0566=0x0000 +0x030A=0x0000 +0x029F=0x0000 +0x054C=0x0000 +0x0582=0x0000 +0x0599=0x0000 +0x0511=0x0000 +0x0506=0x0000 +0x0301=0x0000 +0x0595=0x0000 +0x0584=0x0000 +0x058C=0x0000 +0x051E=0x0000 +0x05A6=0x0000 +0x050F=0x0000 +0x0590=0x0000 +0x05A0=0x0000 +0x0596=0x0000 +0x05A7=0x0000 +0x0562=0x0000 +0x058A=0x0000 +0x059D=0x0000 +0x0485=0x0000 +0x0581=0x0000 +0x045D=0x0000 +0x0245=0x0000 +0x0310=0x0000 +0x058E=0x0000 +0x05A2=0x0000 +0x054D=0x0000 +0x020C=0x7FFF +0x0589=0x0000 +0x0522=0x0000 +0x049F=0x0000 +0x031F=0x0000 +0x0292=0x0000 +0x059F=0x0000 +0x0583=0x0000 +0x0543=0x0000 +0x0317=0x0000 +0x0244=0x0000 +0x0554=0x0000 +0x0593=0x0000 +0x05A4=0x0000 +0x02A3=0x0000 +0x0553=0x0000 +0x0542=0x0000 +0x0519=0x0000 +0x024F=0x0000 +0x0524=0x0000 +0x0518=0x0000 +0x0354=0x0000 +0x0526=0x0000 +0x031B=0x0000 +0x050E=0x0000 +0x0516=0x0000 +0x02CB=0x0000 +0x0250=0x0000 +0x031C=0x0000 +0x028F=0x0000 +0x051A=0x0000 +0x055C=0x0000 +0x0514=0x0000 +0x050A=0x0000 +0x050C=0x0000 +0x050B=0x0000 +0x04E7=0x0000 +0x04E6=0x0000 +0x04E5=0x0000 +0x0512=0x0000 +0x0206=0x0000 +0x0550=0x0000 +0x0360=0x0000 +0x030E=0x0000 +0x0203=0x0000 +0x0482=0x0000 +0x0541=0x0000 +0x0122=0x033F +0x0110=0x0BF4 +0x0204=0x0000 +0x0252=0x0000 +0x011E=0x0AA7 +0x049B=0x0000 +0x0294=0x0000 +0x011C=0xA941 +0x02D6=0x0000 +0x0311=0x0000 +0x0117=0x280C +0x02A4=0x0000 +0x0540=0x0000 +0x02E0=0x0000 +0x0118=0x018C +0x0489=0x0000 +0x04A7=0x0000 +0x0101=0x7800 +0x0558=0x0000 +0x02C6=0x0000 +0x05A1=0x0000 +0x02C9=0x0000 +0x039D=0x0000 +0x0500=0x0000 +0x0450=0x0000 +0x011F=0x3600 +0x030C=0x0000 +0x04DF=0x0000 +0x0281=0x0000 +0x0106=0x3182 +0x028E=0x0000 +0x0326=0x0000 +0x0113=0x03C3 +0x04CB=0x0000 +0x0391=0x0000 +0x0105=0x0007 +0x02D9=0x0000 +0x02CE=0x0000 +0x038B=0x0000 +0x044F=0x0000 +0x02D4=0x0000 +0x0107=0x318C +0x0495=0x0000 +0x0246=0x0000 +0x0303=0x0000 +0x02E6=0x0000 +0x045B=0x0000 +0x0100=0x3409 +0x0340=0x0000 +0x0208=0x0070 +0x0111=0x0083 +0x0247=0x0000 +0x024B=0x0000 +0x045C=0x0000 +0x0383=0x0000 +0x0202=0x07FF +0x054A=0x0000 +0x0401=0x07FF +0x0341=0x0000 +0x0287=0x0000 +0x034C=0x0000 +0x0501=0x0000 +0x030F=0x0000 +0x025D=0x0000 +0x0406=0x0000 +0x0313=0x0000 +0x010A=0x104C +0x0461=0x0000 +0x051B=0x0000 +0x0121=0x31FA +0x0115=0x0009 +0x0112=0xC0E6 +0x039A=0x0000 +0x02CC=0x0000 +0x0116=0x8180 +0x04A0=0x0000 +0x0108=0x9442 +0x020B=0x4000 +0x0251=0x0000 +0x0488=0x0000 +0x0241=0x0000 +0x038F=0x0000 +0x02DC=0x0000 +0x024C=0x0000 +0x0494=0x0000 +0x051D=0x0000 +0x0243=0x0000 +0x0556=0x0000 +0x040A=0x0000 +0x04CD=0x0000 +0x0249=0x0000 +0x0261=0x0000 +0x024A=0x0000 +0x0285=0x0000 +0x0280=0x0000 +0x0346=0x0000 +0x024E=0x0000 +0x0253=0x0000 +0x028B=0x0000 +0x040C=0x0000 +0x0255=0x0000 +0x0258=0x0000 +0x0502=0x0000 +0x05A3=0x0000 +0x0367=0x0000 +0x0240=0x0020 +0x0256=0x0000 +0x025A=0x0000 +0x04E2=0x0000 +0x04C5=0x0000 +0x025B=0x0000 +0x0205=0x0000 +0x0361=0x0000 +0x0515=0x0000 +0x025C=0x0000 +0x0355=0x0000 +0x044C=0x0000 +0x010C=0x88FD +0x0284=0x0000 +0x0396=0x0000 +0x0363=0x0000 +0x031A=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x04DD=0x0000 +0x059C=0x0000 +0x0352=0x0000 +0x028C=0x0000 +0x04C2=0x0000 +0x04DA=0x0000 +0x025E=0x0000 +0x0327=0x0000 +0x0380=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0561=0x0000 +0x035A=0x0000 +0x02C8=0x0000 +0x0484=0x0000 +0x0586=0x0000 +0x0597=0x0000 +0x035F=0x0000 +0x0345=0x0000 +0x0505=0x0000 +0x035B=0x0000 +0x034A=0x0000 +0x0455=0x0000 +0x011A=0x2E02 +0x034B=0x0000 +0x034D=0x0000 +0x035C=0x0000 +0x034E=0x0000 +0x0293=0x0000 +0x03A6=0x0000 +0x0350=0x0000 +0x0445=0x0000 +0x048F=0x0000 +0x0351=0x0000 +0x0353=0x0000 +0x050D=0x0000 +0x02CD=0x0000 +0x0490=0x0000 +0x0498=0x0000 +0x0348=0x0000 +0x0356=0x0000 +0x030D=0x0000 +0x0316=0x0000 +0x040E=0x0000 +0x04A3=0x0000 +0x029D=0x0000 +0x0359=0x0000 +0x0299=0x0000 +0x0452=0x0000 +0x0442=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x0325=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0381=0x0000 +0x0288=0x0000 +0x0382=0x0000 +0x0384=0x0000 +0x0315=0x0000 +0x0385=0x0000 +0x04E3=0x0000 +0x040F=0x0000 +0x0389=0x0000 +0x054F=0x0000 +0x0386=0x0000 +0x02D0=0x0000 +0x054E=0x0000 +0x03A0=0x0000 +[reference_clocks] +sxt_ref_clk_mhz=30.72 +sxr_ref_clk_mhz=30.72 From b30d3c92ad5c18b70da0b7d89b8349d42fe211da Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 16 Feb 2016 02:31:48 -0800 Subject: [PATCH 056/122] added missing threequarter_fs parameter to lte_param_init in ulsim.c --- openair1/SIMULATION/LTE_PHY/dlsim.c | 12 +++++++++++- openair1/SIMULATION/LTE_PHY/ulsim.c | 8 +++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index fbb88bf052..2c3d0848c2 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -656,7 +656,17 @@ int main(int argc, char **argv) printf("dual_stream_UE=%d\n", dual_stream_UE); } - lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,tdd_config,N_RB_DL,threequarter_fs,osf,perfect_ce); + lte_param_init(n_tx, + n_rx, + transmission_mode, + extended_prefix_flag, + frame_type, + Nid_cell, + tdd_config, + N_RB_DL, + threequarter_fs, + osf, + perfect_ce); diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index a72f2ad6c5..463c74c123 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -194,6 +194,7 @@ int main(int argc, char **argv) int nb_rb_set = 0; int sf; + int threequarter_fs=0; opp_enabled=1; // to enable the time meas cpu_freq_GHz = (double)get_cpu_freq_GHz(); @@ -203,7 +204,7 @@ int main(int argc, char **argv) logInit(); - while ((c = getopt (argc, argv, "hapZbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:L")) != -1) { + while ((c = getopt (argc, argv, "hapZEbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:L")) != -1) { switch (c) { case 'a': channel_model = AWGN; @@ -373,6 +374,10 @@ int main(int argc, char **argv) cyclic_shift = atoi(optarg); break; + case 'E': + threequarter_fs=1; + break; + case 'N': N0 = atoi(optarg); break; @@ -470,6 +475,7 @@ int main(int argc, char **argv) 0, tdd_config, N_RB_DL, + threequarter_fs, osf, 0); From f1298f804a4c98eb9d6e6dcb3504d7e81091be74 Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Tue, 16 Feb 2016 15:50:02 +0100 Subject: [PATCH 057/122] added CMakeLists.txt to LMSSDR/lmsSDR --- .../USERSPACE/LIB/lmsSDR/CMakeLists.txt | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt new file mode 100644 index 0000000000..0225e1d4d6 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt @@ -0,0 +1,58 @@ +cmake_minimum_required(VERSION 2.8) +set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE TYPE INTERNAL FORCE) +project("matlab_StreamDLL") +#include modules for finding CyAPI +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") +cmake_policy(SET CMP0015 OLD) +if(${CMAKE_MAJOR_VERSION} GREATER 2) + cmake_policy(SET CMP0043 NEW) +endif() +ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) +if(CMAKE_COMPILER_IS_GNUCXX) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fPIC") +endif() + +# Add sub-directories +add_subdirectory(LMS_StreamBoard) +include_directories(LMS_StreamBoard) +add_subdirectory(connectionManager) +include_directories(connectionManager) + +set(BINARY_OUTPUT_DIR "${CMAKE_BINARY_DIR}/bin") + +if (MSVC) + SET( MSVC_MULTITHREAD_COMPILE_FLAGS "/MP") + SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MSVC_MULTITHREAD_COMPILE_FLAGS}" ) +endif(MSVC) + +set(Library_file_list LMS_SDR.cpp ) + +set(BUILD_STATIC_LIB OFF CACHE BOOL "Build static or dynamic library") +if( BUILD_STATIC_LIB ) + add_library(LMS_SDR STATIC ${Library_file_list}) +else() + add_library(LMS_SDR SHARED ${Library_file_list}) +endif(BUILD_STATIC_LIB) + +set(AUTO_UPDATE_VERSION OFF CACHE BOOL "Uses python script to increment version") +if(AUTO_UPDATE_VERSION) + add_custom_target(updateVersion ALL COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/auto_version.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + add_dependencies(LMS_SDR updateVersion) +endif() + +target_link_libraries(LMS_SDR + LMS_StreamBoard + ${CYAPI_LIBRARIES} + ) + +if(WIN32) + find_package(CyAPI REQUIRED) + LINK_DIRECTORIES(${CYAPI_LIBRARIES}) + include_directories(${CYAPI_INCLUDE_DIRS}) + set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) +endif() +if(UNIX) + set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) +endif() + +target_link_libraries(LMS_SDR ${CONNECTION_MANAGER_LIBS}) From c5bdcd5cb3a4dcc69b57239226bc86c4f82872cb Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Tue, 16 Feb 2016 15:54:19 +0100 Subject: [PATCH 058/122] added missing directory to lms7002m --- .../LIB/lms7002m/cpp-feather-ini-parser/INI.h | 639 ++++++++++++++ .../lms7002m/cpp-feather-ini-parser/LICENSE | 21 + .../lms7002m/cpp-feather-ini-parser/README.md | 47 + .../example/example.cpp | 130 +++ .../cpp-feather-ini-parser/example/file.ini | 5 + .../example/file_ints.ini | 400 +++++++++ .../cpp-feather-ini-parser/example/merge.ini | 5 + .../example/project.cbp | 57 ++ .../example/project.depend | 802 ++++++++++++++++++ 9 files changed, 2106 insertions(+) create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp create mode 100644 targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h new file mode 100644 index 0000000000..de54b4e7b4 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h @@ -0,0 +1,639 @@ +/* + Feather INI Parser - 1.40 + You are free to use this however you wish. + + If you find a bug, please attept to debug the cause. + Post your environment details and the cause or fix in the issues section of GitHub. + + Written by Turbine. + + Website: + https://github.com/Turbine1991/feather-ini-parser + http://code.google.com/p/feather-ini-parser/downloads + + Help: + Bundled example & readme. + http://code.google.com/p/feather-ini-parser/wiki/Tutorials +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include + +#define FINI_SAFE +#define FINI_BUFFER_SIZE 128 + +#if __cplusplus >= 201103L + #include + #define FINI_CPP11 + #define ALLOCATE_SECTIONS 100 + #define ALLOCATE_KEYS 5 +#else + #include +#endif + +#ifdef FINI_WIDE_SUPPORT + #include + + typedef std::wstringstream fini_sstream_t; + typedef std::wstring fini_string_t; + typedef wchar_t fini_char_t; + typedef std::wifstream fini_ifstream_t; + typedef std::wofstream fini_ofstream_t; + + #define fini_strlen(a) wcslen(a) + #define fini_strncpy(a, b) wcscpy(a, b) + #define fini_strncpy(a, b, c) wcsncpy(a, b, c) + #define fini_strtok(a, b) wcstok(a, b) + + #define _T(x) L ##x +#else + #include + + typedef std::stringstream fini_sstream_t; + typedef std::string fini_string_t; + typedef char fini_char_t; + typedef std::ifstream fini_ifstream_t; + typedef std::ofstream fini_ofstream_t; + + #define fini_strlen(a) strlen(a) + #define fini_strcpy(a, b) strcpy(a, b) + #define fini_strncpy(a, b, c) strncpy(a, b, c) + #define fini_strtok(a, b) strtok(a, b) + + #define _T(x) x +#endif + +#define CHAR_SIZE sizeof(fini_char_t) + +///Simple converter using templates and streams to effectively required for the flexibility of handling native types +class Converters +{ +public: + template + static T Convert(U value); + template + static void GetLine(fini_sstream_t& out, T& value); + static void GetLine(fini_sstream_t& out, fini_string_t& value); + template + static size_t GetDataSize(T& value); + static size_t GetDataSize(fini_string_t value); +}; + +/// +template + class INI +{ +public: + typedef T section_t; + typedef U key_t; + typedef V value_t; + typedef INI ini_t; + +///Type definition declarations +#ifdef FINI_CPP11 + typedef typename std::unordered_map keys_t; + typedef typename std::unordered_map sections_t; +#else + typedef typename std::map keys_t; + typedef typename std::map sections_t; +#endif + + typedef typename keys_t::iterator keysit_t; + typedef typename sections_t::iterator sectionsit_t; + + typedef typename std::pair keyspair_t; + typedef typename std::pair sectionspair_t; + + typedef char data_t; + + enum source_e {SOURCE_FILE, SOURCE_MEMORY}; + +///Data members + std::string filename; + data_t* data; + size_t dataSize; + keys_t* current; + sections_t sections; + source_e source; + +///Constuctor/Destructor + //Specify the filename to associate and whether to parse immediately + INI(const std::string filename, bool doParse): filename(filename) + { + init(SOURCE_FILE, doParse); + } + + //Used for loading INI from memory + INI(void* data, size_t dataSize, bool doParse): data((data_t*)data), dataSize(dataSize) + { + init(SOURCE_MEMORY, doParse); + } + + ~INI() + { + clear(); + } + +///Access Content + //Provide bracket access to section contents + keys_t& operator[](section_t section) + { + #ifdef FINI_SAFE + if (!sections[section]) + sections[section] = new keys_t; + #endif + + return *sections[section]; + } + + //Create a new section and select it + bool create(const section_t section) + { + if (select(section)) + return false; + + current = new keys_t; + sections[section] = current; + + reserveKeys(current); + + return true; + } + + //Select a section for performing operations + bool select(const section_t section) + { + sectionsit_t sectionsit = sections.find(section); + if (sectionsit == sections.end()) + return false; + + current = sectionsit->second; + + return true; + } + +///Set + //Assign a value for key under the selected section + bool set(const key_t key, const value_t value) + { + if (current == NULL) + return false; + + (*current)[key] = value; + + return true; + } + + template + bool set(const W key, const X value) + { return set(Converters::Convert(key), Converters::Convert(value)); } + +///Get + value_t get(const key_t key, value_t def = value_t()) + { + keysit_t it = current->find(key); + if (current == NULL || it == current->end()) + return def; + + return it->second; + } + + value_t get(const section_t section, const key_t key, value_t def) + { + if (!select(section)) + return def; + + return get(key, def); + } + + template + X get(const W key, const X def = value_t()) + { return Converters::Convert(get(Converters::Convert(key), Converters::Convert(def))); } + + template + fini_string_t get(const W key, const fini_char_t* def = _T("")) //Handle C string default value without casting + { return Converters::Convert(get(Converters::Convert(key), Converters::Convert(def))); } + + template + Y get(const W section, const X key, const Y def) + { return Converters::Convert(get(Converters::Convert(section), Converters::Convert(key), Converters::Convert(def))); } + + template + fini_string_t get(const W section, const X key, const fini_char_t* def) //Handle C string default value without casting + { return Converters::Convert(Converters::Convert(section), get(Converters::Convert(key), Converters::Convert(def))); } + +///Functions + void parse(std::istream& file) + { + fini_char_t line[FINI_BUFFER_SIZE]; + bool first = true; + fini_sstream_t out; + + while(!file.eof()) + { + file.getline(line, FINI_BUFFER_SIZE); + + if (first) + { + first = false; + if (line[0] == 0xEF) //Allows handling of UTF-16/32 documents + { + memmove(line, line + (CHAR_SIZE * 3), CHAR_SIZE * (FINI_BUFFER_SIZE - 3)); + return; + } + } + + nake(line); + + if (line[0]) + { + size_t len = fini_strlen(line); + if (len > 0 && !((len >= 2 && (line[0] == '/' && line[1] == '/')) || (len >= 1 && line[0] == '#'))) //Ignore comment and empty lines + { + if (line[0] == '[') //Section + { + section_t section; + size_t length = fini_strlen(line) - 2; //Without section brackets + while(isspace(line[length + 1])) //Leave out any additional new line characters, not "spaces" as the name suggests + --length; + + fini_char_t* ssection = (fini_char_t*)calloc(CHAR_SIZE, length + 1); + fini_strncpy(ssection, line + 1, length); //Count after first bracket + + current = new keys_t; + + out << ssection; + free(ssection); + Converters::GetLine(out, section); + + sections[section] = current; + } + else //Key + { + key_t key; + value_t value; + + fini_char_t* skey; + fini_char_t* svalue; + + skey = fini_strtok(line, _T("=")); + svalue = fini_strtok(NULL, _T("\n")); + + if (skey && svalue) + { + size_t index = 0; //Without section brackets + while(isspace(skey[index])) //Leave out any additional new line characters, not "spaces" as the name suggests + index++; + + if (index != 0) //Has preceeding white space + fini_strcpy(skey, skey + index); + + out << skey; + + Converters::GetLine(out, key); + + out.clear(); + out.str(fini_string_t()); + + out << svalue; + Converters::GetLine(out, value); + + if (value != value_t()) + (*current)[key] = value; + } + } + + out.clear(); + out.str(fini_string_t()); //Clear existing stream; + } + } + } + } + + //Parse an INI's contents into memory from the filename given during construction + bool parse() + { + switch(source) + { + case SOURCE_FILE: { + fini_ifstream_t file(filename.c_str()); + + if (!file.is_open()) + return false; + + parse(file); + + file.close(); + } + break; + + case SOURCE_MEMORY: { + std::stringstream sstream; + sstream.rdbuf()->pubsetbuf(data, dataSize); + + parse(sstream); + } + break; + } + + return true; + } + + bool parseBinary() + { + fini_ifstream_t file(filename.c_str(), std::ios::binary); + if (!file.is_open()) + return false; + + size_t sectionCount; + size_t keyCount; + key_t key; + value_t value; + section_t section; + + //file.read((fini_char_t*)§ionCount, sizeof(sectionCount)); + file >> sectionCount; + + for(size_t i = 0; i < sectionCount; i++) + { + if (i > 0) + file.seekg(1 + file.tellg()); + + file.read((fini_char_t*)&keyCount, sizeof(keyCount)); + file >> section; + + create(section); + + for(size_t j = 0; j < keyCount; j++) + { + file >> key; + file >> value; + set(key, value); + } + } + + file.close(); + + return true; + } + + //Clear the contents from memory + void clear() + { + clean(); + sections.clear(); + } + +///Output + //Save from memory into file + bool save(const std::string filename = "") + { + if (!hasFileAssociation(filename)) + return false; + + fini_ofstream_t file(((filename == "")? this->filename: filename).c_str(), std::ios::trunc); + if (!file.is_open()) + return false; + + //Loop through sections + for(typename INI::sectionsit_t i = sections.begin(); i != sections.end(); i++) + { + if (i->second->size() == 0) //No keys/values in section, skip to next + continue; + + //Write section + const fini_string_t temp = makeSection(i->first); + const fini_char_t* line = temp.c_str(); + file.write(line, fini_strlen(line)); + + for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) + { + //Write key and value + const fini_string_t temp = makeKeyValue(j->first, j->second); + const fini_char_t* line = temp.c_str(); + file.write(line, fini_strlen(line)); + } + } + + file.close(); + + return true; + } + + //Saves it without any conventional INI formatting characters, however it only uses string streams + bool saveBinary(const std::string filename = "") + { + if (!hasFileAssociation(filename)) + return false; + + fini_ofstream_t file(((filename == "")? this->filename: filename).c_str(), std::ios::trunc | std::ios::binary); + if (!file.is_open()) + return false; + + size_t sectionCount = sections.size(); + size_t keyCount; + + file.write((fini_char_t*)§ionCount, sizeof(sectionCount)); + + //Loop through sections + for(typename INI::sectionsit_t i = sections.begin(); i != sections.end(); i++) + { + keyCount = i->second->size(); + file.write((fini_char_t*)&keyCount, sizeof(keyCount)); + + file << i->first << std::endl; + + for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) + { + file << j->first << std::endl; + file << j->second << std::endl; + } + } + + file.close(); + + return true; + } + + //Saves it as a true binary file, intended to replace the existing one. Don't bother using it with all strings. + bool saveBinaryExperimental(std::string filename = "") + { + if (!hasFileAssociation(filename)) + return false; + + fini_ofstream_t file(((filename == "")? this->filename: filename).c_str(), std::ios::trunc | std::ios::binary); + if (!file.is_open()) + return false; + + size_t sectionCount = sections.size(); + size_t keyCount; + + file.write((fini_char_t*)§ionCount, sizeof(sectionCount)); + + //Loop through sections + for(typename INI::sectionsit_t i = sections.begin(); i != sections.end(); i++) + { + keyCount = i->second->size(); + file.write((fini_char_t*)&keyCount, sizeof(keyCount)); + + file.write((fini_char_t*)&i->first, Converters::GetDataSize(i->first)); + + for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) + { + file.write((fini_char_t*)&j->first, Converters::GetDataSize(j->first)); + file.write((fini_char_t*)&j->second, Converters::GetDataSize(j->second)); + } + } + + file.close(); + + return true; + } + + //Alows another INI's contents to be insert into another, with the ability to retain the original values + void merge(ini_t& other, bool retainValues = true) + { + for(typename INI::sectionsit_t i = other.sections.begin(); i != other.sections.end(); i++) + { + if (!select(i->first)) //Create and insert all key values into a missing section + { + keys_t* keys = new keys_t(*i->second); + sections.insert(std::make_pair(i->first, keys)); + } + else + { + for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) + { + keysit_t it = current->find(j->first); + if (it == current->end()) + current->insert(std::make_pair(j->first, j->second)); + else if (!retainValues) + it->second = j->second; + } + } + } + } + +private: +///Functions + //Init the INI in with values set by constructor + void init(source_e source, bool doParse) + { + this->source = source; + + reserveSections(); + if (doParse) + parse(); + } + + //Clean the contents for descruction + void clean() + { + for(sectionsit_t i = sections.begin(); i != sections.end(); i++) + delete i->second; + + current = NULL; + } + + //Make any alterations to the raw line + void nake(const fini_char_t*) //Strip the line of any non-interpretable characters + { + + } + + void reserveSections() + { + #ifdef FINI_CPP11 + sections.reserve(ALLOCATE_SECTIONS); + #endif + } + + void reserveKeys(keys_t* current) + { + #ifdef FINI_CPP11 + current->reserve(ALLOCATE_KEYS); + #endif + } + + bool hasFileAssociation(std::string filename) + { + if (source == SOURCE_MEMORY && filename == "") //No association to a file + return false; + + return true; + } + +///Output + //Creates a section as a string + fini_string_t makeSection(const section_t& section) + { + fini_sstream_t line; + line << '[' << section << ']' << std::endl; + + return line.str(); + } + + //Creates a key and a value as a string + fini_string_t makeKeyValue(const key_t& key, const value_t& value) + { + fini_sstream_t line; + line << key << '=' << value << std::endl; + + return line.str(); + } +}; + +///Definitions +template + inline T Converters::Convert(U value) +{ + fini_sstream_t sout; + T result; + + sout << value; + sout >> result; + + sout.str(fini_string_t()); + + return result; +} + +template <> + inline fini_string_t Converters::Convert(fini_string_t value) +{ + return value; +} + +template <> + inline fini_string_t Converters::Convert(const fini_char_t* value) +{ + return value; +} + +template + inline void Converters::GetLine(fini_sstream_t& out, T& value) +{ + out >> value; +} + +inline void Converters::GetLine(fini_sstream_t& out, fini_string_t& value) +{ + std::getline(out, value); +} + +template + inline size_t Converters::GetDataSize(T& value) +{ + return sizeof(value); +} + +inline size_t Converters::GetDataSize(fini_string_t value) +{ + return value.size() + 1; +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE new file mode 100644 index 0000000000..7d961cc6e5 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Turbine1991 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md new file mode 100644 index 0000000000..f1245971cd --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md @@ -0,0 +1,47 @@ +feather-ini-parser +================== + +Simple like your girlfriend, fast, lightweight, header, portable INI parser for ANSI C++. + +Why use feather-ini-parser? It's a fast, intuitive, uses C++, supports native data types, wide char support (enable), converting to data types simply by setting a default value or providing the type as a template parameter. + +##Methods + +Statement | Return Type +------------- | ------------- +ini(filename, doParse)|constructor +ini(data, dataSize, doParse)|constructor +ini.parse()|bool +ini.merge(other INI, retainValues)|void +ini.create(section)|bool +ini.select(section)|bool +ini.set(key, value)|bool +ini.get(key, dvalue = value_t())|dvalue_t +ini.save(filename = "")|bool +ini.clear()|bool +ini[section][key]|value_t& +ini[section]|keys_t& + +##Example +``` +#include +#include "INI.h" + +using namespace std; +``` +... +``` +typedef INI<> ini_t; +//or +//typedef INI ini_t; + +ini_t ini("filename.ini", true); +ini.create("section1"); //Create and select section1 +ini.set("key", "value"); +cout << ini.get("keynumeric", -1) << endl; +ini["section2"]["key"] = "value"; +ini.save(); +``` + +##More +Please see the example .cpp file and Code::Blocks .cbp project for a compilable GCC and VSC++ example. Additionally includes enabling wide char support and iterating through contents. diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp new file mode 100644 index 0000000000..462dd241dc --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp @@ -0,0 +1,130 @@ +#include +#include +#include +#include "../INI.h" + +using namespace std; + +void centerString(string str); //Printing to console +std::string getStringFromFile(const std::string& path); //Source for data loading from memory. + +int main() +{ + ///Declare + typedef INI<> ini_t; //Makes things shorter/easier to write + //or + //typedef INI ini_t; //Equivelant to previous line when wide characters are disabled + ini_t ini("file.ini", true); //File to open/default save filename. The constuctor is set to parse by default, unless specified as false + + ///Manipulate and access contents + centerString("########## Access & Manipulate Contents ##########"); + + //Common usage + ini.create("Section 1"); + ini.create("Section 2"); + ini.get("Key1", "DefaultValue"); + ini.select("Section 1"); + ini.set("Key2", "Value"); + ini.save(); //Save contents to file, optional filename parameter available + ini.clear(); //Clear INI contents from memory + + //Extended usage + ini["Section Name"]["Key"] = "Value"; //You are not required to create a section first + + ini.create("Section1"); //Also selects as current section + ini.create("Section2"); //Current + + ini.set("Key1", "Value1"); //Added pair under section "Section2" + + ini.select("Section1"); //Current + cout << ini.get("Key1", "-1") << endl; //Returns "-1" as no key exists, no default will return NULL for data type, eg int() is 0 + + ini.select("Section2"); + ini.set("Key1", "1.123"); + cout << ini.get("Key1", -1.0) << endl; //Return value as double + ini.set(123, 123); //Will convert to provided INI data type for key/value, in this case string for both + + ini.save(); + ini.clear(); + ini.parse(); //Parses file into objects in memory + + cout << ini["Section2"]["Key1"] << endl; //Returns "Value1", slightly more overhead involved seeking section, avoid using excessively + + ///Iterate through sections and keys for both C++11 and C++98 + centerString("########## Iterate Contents ##########"); + +#ifdef FINI_CPP11 + for(auto i: ini.sections) + { + cout << "[" << i.first << "]" << endl; + + //for(auto j = i.second->begin(); j != i.second->end(); j++) + for(auto j: *i.second) + { + cout << " " << j.first << "=" << j.second << endl; + } + } +#else + for(ini_t::sectionsit_t i = ini.sections.begin(); i != ini.sections.end(); i++) + { + //Section name as ini_t::section_t + cout << i->first << endl; + + if (i->second->size() == 0) //No keys/values in section, skip to next + continue; + + for(ini_t::keysit_t j = i->second->begin(); j != i->second->end(); j++) + { + //Name as ini_t::key_t & Value as ini_t::key_t + cout << " " << j->first << "=" << j->second << endl; + } + } +#endif + +///Example with different data types + typedef INI ini_int_t; //Makes things shorter/easier to write + ini_int_t ini_int("file_ints.ini", false); //File to open/default save filename. The constuctor is set to parse by default, unless specified as false + for(int i = 1; i <= 200; i++) + { + ini_int.create(i); //Section + ini_int.set("Key", i / 2.f); + } + + ini_int.save(); + +///Wide char support example (please define FINI_WIDE_SUPPORT in project) + /* + ini_t ini_w("file.ini", true); + wcout << ini_w[L"Section2"][L"Key1"] << endl; + */ + +///Load from memory + std::string str = getStringFromFile("config/test.ini"); //Allows us to tap into a source for the purpose of this example + + ini_t ini_mem((void*)str.c_str(), str.size(), true); //This is the line which parses data from memory + +///Merge contents and keep values + ini_t inid("file.ini", true); + ini_t inis("merge.ini", true); + inid.merge(inis, true); + inid.save("merged.ini"); + + return EXIT_SUCCESS; +} + +void centerString(string str) +{ + const char* s = str.c_str(); + int l = strlen(s); + int pos = (int)((80 - l) / 2); + for(int i = 0; i < pos; i++) + cout << " "; + cout << s << endl; +} + +std::string getStringFromFile(const std::string& path) { + std::ostringstream buf; + std::ifstream input (path.c_str()); + buf << input.rdbuf(); + return buf.str(); +} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini new file mode 100644 index 0000000000..e1c485ba2a --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini @@ -0,0 +1,5 @@ +[Section2] +123=123 +Key1=1.123 +[Section Name] +Key=Value diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini new file mode 100644 index 0000000000..3d71e76cae --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini @@ -0,0 +1,400 @@ +[200] +Key=100 +[199] +Key=99.5 +[198] +Key=99 +[197] +Key=98.5 +[196] +Key=98 +[195] +Key=97.5 +[194] +Key=97 +[193] +Key=96.5 +[192] +Key=96 +[191] +Key=95.5 +[190] +Key=95 +[189] +Key=94.5 +[188] +Key=94 +[187] +Key=93.5 +[186] +Key=93 +[185] +Key=92.5 +[184] +Key=92 +[183] +Key=91.5 +[182] +Key=91 +[181] +Key=90.5 +[180] +Key=90 +[179] +Key=89.5 +[178] +Key=89 +[177] +Key=88.5 +[176] +Key=88 +[175] +Key=87.5 +[174] +Key=87 +[173] +Key=86.5 +[172] +Key=86 +[171] +Key=85.5 +[170] +Key=85 +[169] +Key=84.5 +[168] +Key=84 +[167] +Key=83.5 +[166] +Key=83 +[165] +Key=82.5 +[164] +Key=82 +[163] +Key=81.5 +[162] +Key=81 +[161] +Key=80.5 +[160] +Key=80 +[159] +Key=79.5 +[158] +Key=79 +[157] +Key=78.5 +[156] +Key=78 +[155] +Key=77.5 +[154] +Key=77 +[153] +Key=76.5 +[152] +Key=76 +[151] +Key=75.5 +[150] +Key=75 +[149] +Key=74.5 +[148] +Key=74 +[147] +Key=73.5 +[146] +Key=73 +[145] +Key=72.5 +[144] +Key=72 +[143] +Key=71.5 +[142] +Key=71 +[141] +Key=70.5 +[140] +Key=70 +[139] +Key=69.5 +[138] +Key=69 +[137] +Key=68.5 +[136] +Key=68 +[135] +Key=67.5 +[134] +Key=67 +[133] +Key=66.5 +[132] +Key=66 +[131] +Key=65.5 +[130] +Key=65 +[129] +Key=64.5 +[128] +Key=64 +[127] +Key=63.5 +[126] +Key=63 +[125] +Key=62.5 +[124] +Key=62 +[123] +Key=61.5 +[122] +Key=61 +[121] +Key=60.5 +[120] +Key=60 +[119] +Key=59.5 +[118] +Key=59 +[117] +Key=58.5 +[116] +Key=58 +[115] +Key=57.5 +[114] +Key=57 +[113] +Key=56.5 +[112] +Key=56 +[111] +Key=55.5 +[110] +Key=55 +[109] +Key=54.5 +[108] +Key=54 +[107] +Key=53.5 +[106] +Key=53 +[105] +Key=52.5 +[104] +Key=52 +[103] +Key=51.5 +[1] +Key=0.5 +[2] +Key=1 +[3] +Key=1.5 +[4] +Key=2 +[5] +Key=2.5 +[6] +Key=3 +[7] +Key=3.5 +[8] +Key=4 +[9] +Key=4.5 +[10] +Key=5 +[11] +Key=5.5 +[12] +Key=6 +[13] +Key=6.5 +[14] +Key=7 +[15] +Key=7.5 +[16] +Key=8 +[17] +Key=8.5 +[18] +Key=9 +[19] +Key=9.5 +[20] +Key=10 +[21] +Key=10.5 +[22] +Key=11 +[23] +Key=11.5 +[24] +Key=12 +[25] +Key=12.5 +[26] +Key=13 +[27] +Key=13.5 +[28] +Key=14 +[29] +Key=14.5 +[30] +Key=15 +[31] +Key=15.5 +[32] +Key=16 +[33] +Key=16.5 +[34] +Key=17 +[35] +Key=17.5 +[36] +Key=18 +[37] +Key=18.5 +[38] +Key=19 +[39] +Key=19.5 +[40] +Key=20 +[41] +Key=20.5 +[42] +Key=21 +[43] +Key=21.5 +[44] +Key=22 +[45] +Key=22.5 +[46] +Key=23 +[47] +Key=23.5 +[48] +Key=24 +[49] +Key=24.5 +[50] +Key=25 +[51] +Key=25.5 +[52] +Key=26 +[53] +Key=26.5 +[54] +Key=27 +[55] +Key=27.5 +[56] +Key=28 +[57] +Key=28.5 +[58] +Key=29 +[59] +Key=29.5 +[60] +Key=30 +[61] +Key=30.5 +[62] +Key=31 +[63] +Key=31.5 +[64] +Key=32 +[65] +Key=32.5 +[66] +Key=33 +[67] +Key=33.5 +[68] +Key=34 +[69] +Key=34.5 +[70] +Key=35 +[71] +Key=35.5 +[72] +Key=36 +[73] +Key=36.5 +[74] +Key=37 +[75] +Key=37.5 +[76] +Key=38 +[77] +Key=38.5 +[78] +Key=39 +[79] +Key=39.5 +[80] +Key=40 +[81] +Key=40.5 +[82] +Key=41 +[83] +Key=41.5 +[84] +Key=42 +[85] +Key=42.5 +[86] +Key=43 +[87] +Key=43.5 +[88] +Key=44 +[89] +Key=44.5 +[90] +Key=45 +[91] +Key=45.5 +[92] +Key=46 +[93] +Key=46.5 +[94] +Key=47 +[95] +Key=47.5 +[96] +Key=48 +[97] +Key=48.5 +[98] +Key=49 +[99] +Key=49.5 +[100] +Key=50 +[101] +Key=50.5 +[102] +Key=51 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini new file mode 100644 index 0000000000..dfdc381084 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini @@ -0,0 +1,5 @@ +[NewSection] +Key=Value +[Section2] +NewKey=Value +123=456 \ No newline at end of file diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp new file mode 100644 index 0000000000..913928a115 --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp @@ -0,0 +1,57 @@ + + + + + + diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend new file mode 100644 index 0000000000..02c743092d --- /dev/null +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend @@ -0,0 +1,802 @@ +# depslib dependency file v1.0 +1399614205 source:d:\projects\feather-ini-parser\example\example.cpp + + + + "../INI.h" + +1399625159 d:\projects\feather-ini-parser\ini.h + + + + + + + + + + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iostream + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\istream + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ostream + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ios + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum + + + + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\climits + + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\yvals.h + + + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xkeycheck.h + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\crtdefs.h + + + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\sal.h + "codeanalysis\sourceannotations.h" + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\codeanalysis\sourceannotations.h + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\concurrencysal.h + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\vadefs.h + + +1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\use_ansi.h + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\crtwrn.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\limits.h + + +1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cmath + + + + + + +1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\math.h + + +1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtgmath.h + + +1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtr1common + + +1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdio + + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdio.h + + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\swprintf.inl + + +1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib + + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdlib.h + + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\streambuf + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xiosbase + + + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocale + + + + + + + + +1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstring + + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdexcept + + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\exception + + + + + +1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstddef + + + + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstddef + + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stddef.h + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\initializer_list + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\eh.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\malloc.h + + +1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstring + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 + + + + + + + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\limits + + + + + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ymath.h + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cfloat + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\float.h + + + +1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cwchar + + + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wchar.h + + + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wtime.inl + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\new + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility + + + + +1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\utility + + + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iosfwd + + + + + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\crtdbg.h + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits + + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xrefwrap + +1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xatomic0.h + + +1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\intrin.h + + + + + + + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\setjmp.h + + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\setjmpex.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\immintrin.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wmmintrin.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\nmmintrin.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\smmintrin.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\tmmintrin.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\pmmintrin.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\emmintrin.h + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmmintrin.h + + "xmm_func.h" + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\mmintrin.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ammintrin.h + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\mm3dnow.h + + + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\armintr.h + +1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xatomic.h + + + + + + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\typeinfo + + + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocinfo + + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocinfo.h + + + + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ctype.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\locale.h + + +1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xdebug + + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xfacet + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\system_error + + + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cerrno + + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\errno.h + + +1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\share.h + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdint.h + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\string + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iterator + + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\fstream + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\sstream + + +1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\unordered_map + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xhash + + + + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\list + + + +1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector + + + +1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\tuple + + + + +1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\map + + + +1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtree + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\iostream + + +1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream + + +1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream + + +1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocnum + + + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\climits + + + +1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\yvals.h + + + + + + + +1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h + + + +1263987576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\sal.h + "codeanalysis\sourceannotations.h" + +1263303828 c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\vadefs.h + +1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xkeycheck.h + +1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtwrn.h + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\use_ansi.h + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\limits.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cmath + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstdio + + + + +1257335008 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h + + + +1256197836 c:\program files (x86)\microsoft visual studio 10.0\vc\include\swprintf.inl + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstdlib + + + + +1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdlib.h + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\streambuf + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xiosbase + + + + +1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocale + + + + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstring + + + + +1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\string.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdexcept + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\exception + + + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstddef + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstddef + + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stddef.h + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\eh.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\malloc.h + + +1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstring + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\new + + +1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility + + + + +1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility + + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\iosfwd + + + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar + + + + +1257335008 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wchar.h + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wtime.inl + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdbg.h + + +1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\type_traits + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\limits + + + + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ymath.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cfloat + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\float.h + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtr1common + + +1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfwrap + + + + + + + + + + + + +1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfwrap1 + + + + + + + + + + + + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxbind1 + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxcallfun + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxcallobj + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxcallpmf + +1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxfunction + +1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxmem_fn + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxpmfcaller + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxrefwrap + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxresult + +1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxshared + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxtuple0 + +1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxtuple1 + +1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxtype_traits + +1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\typeinfo + + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocinfo + + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocinfo.h + + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ctype.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\locale.h + + +1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xdebug + + + + +1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\system_error + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cerrno + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\errno.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\share.h + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdint.h + + +1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\string + + +1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\fstream + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\sstream + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\unordered_map + + +1263720180 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xhash + + + + + + +1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfunctional + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\list + + + + +1267607544 c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory + + + + + + + + + +1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\intrin.h + + + + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\setjmp.h + + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\setjmpex.h + + +1251647992 c:\program files (x86)\microsoft visual studio 10.0\vc\include\immintrin.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wmmintrin.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\nmmintrin.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\smmintrin.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\tmmintrin.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\pmmintrin.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\emmintrin.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmmintrin.h + + "xmm_func.h" + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\mmintrin.h + + +1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\mm3dnow.h + + + + +1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector + + + + +1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\map + + +1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree + + + + From e18dddf3abc33e23e43d8fee2ff9916f108a12da Mon Sep 17 00:00:00 2001 From: kaltenbe Date: Tue, 16 Feb 2016 16:23:23 +0100 Subject: [PATCH 059/122] added SeDoRa eNodeB Configuration files --- .../CONF/enb.band13.tm1.50PRB.sedora.conf | 171 ++++++++++++++++++ .../CONF/enb.band7.tm1.50PRB.sedora.conf | 171 ++++++++++++++++++ .../CONF/enb.band7.tm1.sedora.conf | 171 ++++++++++++++++++ 3 files changed, 513 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.sedora.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.sedora.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.sedora.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.sedora.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.sedora.conf new file mode 100644 index 0000000000..2d0b63e4b0 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.sedora.conf @@ -0,0 +1,171 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 751000000L; + uplink_frequency_offset = 30000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 60; + rx_gain = 111; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -85; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; +/* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; +*/ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -100; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.sedora.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.sedora.conf new file mode 100644 index 0000000000..8a5f33af4b --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.sedora.conf @@ -0,0 +1,171 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 60; + rx_gain = 111; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -85; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; +/* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; +*/ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -100; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.sedora.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.sedora.conf new file mode 100644 index 0000000000..70fcc2e3f4 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.sedora.conf @@ -0,0 +1,171 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 60; + rx_gain = 111; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -85; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; +/* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; +*/ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -100; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); From e697b22253821c0ec6b72bc8822c215754b1aac0 Mon Sep 17 00:00:00 2001 From: Aikaterini Trilyraki Date: Tue, 16 Feb 2016 16:29:44 +0100 Subject: [PATCH 060/122] Delete .#lte-softmodem.c --- targets/RT/USER/.#lte-softmodem.c | 1 - 1 file changed, 1 deletion(-) delete mode 120000 targets/RT/USER/.#lte-softmodem.c diff --git a/targets/RT/USER/.#lte-softmodem.c b/targets/RT/USER/.#lte-softmodem.c deleted file mode 120000 index dbbd658659..0000000000 --- a/targets/RT/USER/.#lte-softmodem.c +++ /dev/null @@ -1 +0,0 @@ -guepe@guepe.25164:1451994252 \ No newline at end of file From f722b2971dbfb155b14ef1ab50061edf3713cafa Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 16 Feb 2016 16:53:07 +0100 Subject: [PATCH 061/122] including LMSSDR CMakeList.txt into main CMakeList.txt --- cmake_targets/CMakeLists.txt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index ee28608504..b5c3cffce6 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -42,6 +42,10 @@ set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}) project (OpenAirInterface) +add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m lms7002m) +add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR lmsSDR) +add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C Si5351C) + ########################################### # macros to define options as there is numerous options in oai ################################################ @@ -498,9 +502,9 @@ elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR") include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C") include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard") LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu") - LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/build") - LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/build") - LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/build") + LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lmsSDR") + LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lms7002m") + LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/Si5351C") set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp) set(LOWLATENCY False) set(option_HW_lib "-lLMS_SDR -lLMS7002M -lSi5351C -rdynamic -ldl") @@ -1558,7 +1562,10 @@ target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES}) target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES}) - +if (${RF_BOARD} STREQUAL "OAI_LMSSDR") + add_dependencies(lte-softmodem LMS7002M LMS_SDR Si5351C) + add_dependencies(lte-softmodem-nos1 LMS7002M LMS_SDR Si5351C) +endif (${RF_BOARD} STREQUAL "OAI_LMSSDR") # rrh ################################ From 4079a46cb8db9ce0919d3f308effec2ebe173ff8 Mon Sep 17 00:00:00 2001 From: Aikaterini Date: Tue, 16 Feb 2016 17:33:15 +0100 Subject: [PATCH 062/122] config files for RRH SoDERA --- .../CONF/enb.band7.tm1.50PRB.rrh.sodera.conf | 190 +++++++++++++++++ .../CONF/enb.band7.tm1.rrh.sodera.conf | 192 ++++++++++++++++++ 2 files changed, 382 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.sodera.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.sodera.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.sodera.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.sodera.conf new file mode 100644 index 0000000000..c3985c9dce --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.sodera.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 60; + rx_gain = 111; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -85; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; +/* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; +*/ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -100; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + +rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "169.254.8.28"; + #remote_address = "127.0.0.1"; + #remote_address = "74:d4:35:cc:88:45"; + local_address = "169.254.7.91"; + #local_address = "127.0.0.1"; + #local_address = "d4:be:d9:22:0a:ac"; + #for raw option local port must be the same to remote + local_port = 50000; + remote_port = 50000; + active = "yes"; + preference = "raw"; + +} +); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.sodera.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.sodera.conf new file mode 100644 index 0000000000..2db6eb799b --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.sodera.conf @@ -0,0 +1,192 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 60; + rx_gain = 111; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -85; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; +/* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; +*/ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -100; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + +rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "169.254.8.28"; + #remote_address = "127.0.0.1"; + #remote_address = "74:d4:35:cc:88:45"; + local_address = "169.254.7.91"; + #local_address = "127.0.0.1"; + #local_address = "d4:be:d9:22:0a:ac"; + #for raw option local port must be the same to remote + local_port = 50000; + remote_port = 50000; + active = "yes"; + preference = "raw"; + +} +); + + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); From ff6174aeb140d82ea2a124f3484f6077977466b0 Mon Sep 17 00:00:00 2001 From: Aikaterini Date: Tue, 16 Feb 2016 18:19:39 +0100 Subject: [PATCH 063/122] fix SoDERA RRH config --- cmake_targets/CMakeLists.txt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index b5c3cffce6..7477ef819f 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1561,11 +1561,7 @@ target_link_libraries (lte-softmodem-nos1 target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES}) target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES}) - -if (${RF_BOARD} STREQUAL "OAI_LMSSDR") - add_dependencies(lte-softmodem LMS7002M LMS_SDR Si5351C) - add_dependencies(lte-softmodem-nos1 LMS7002M LMS_SDR Si5351C) -endif (${RF_BOARD} STREQUAL "OAI_LMSSDR") +target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES}) # rrh ################################ @@ -1579,7 +1575,6 @@ add_executable(rrh_gw ${HW_SOURCE} ${TRANSPORT_SOURCE} ) -# assert target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti) target_link_libraries(rrh_gw -Wl,--start-group @@ -1587,12 +1582,21 @@ target_link_libraries(rrh_gw -Wl,--end-group ) target_link_libraries (rrh_gw rt pthread m ) target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib} ${LIBBOOST_LIBRARIES} ) +target_link_libraries (rrh_gw ${LIB_LMS_LIBRARIES}) Message("-- option_HW_lib=${option_HW_lib}") Message("-- HW_SOURCE=${HW_SOURCE}") Message("-- option_TP_lib=${option_TP_lib}") Message("-- TRANSPORT_SOURCE=${TRANSPORT_SOURCE}") +if (${RF_BOARD} STREQUAL "OAI_LMSSDR") + add_dependencies(lte-softmodem LMS7002M LMS_SDR Si5351C) + add_dependencies(lte-softmodem-nos1 LMS7002M LMS_SDR Si5351C) + add_dependencies(rrh_gw LMS7002M LMS_SDR Si5351C) +endif (${RF_BOARD} STREQUAL "OAI_LMSSDR") + + + # USIM process ################# #add_executable(usim From f3c7d753647d5cb91fd1683611e920407dd27dc2 Mon Sep 17 00:00:00 2001 From: Aikaterini Date: Tue, 16 Feb 2016 21:10:24 +0100 Subject: [PATCH 064/122] fix for RRH --- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 9f7063e51d..e5f69d5577 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -819,7 +819,7 @@ extern "C" { */ int device_init(openair0_device *device, openair0_config_t *openair0_cfg){ - + device->type=LMSSDR_DEV; printf("LMSSDR: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); switch ((int)openair0_cfg[0].sample_rate) { From 1de3183dabdff6773c00403a79b5ef12fc125b43 Mon Sep 17 00:00:00 2001 From: Aikaterini Date: Tue, 16 Feb 2016 21:11:52 +0100 Subject: [PATCH 065/122] fix for RRH compilation --- targets/RT/USER/eNB_transport_IQ.c | 10 +++++++--- targets/RT/USER/rrh_gw.c | 15 +++++++++++---- targets/RT/USER/rrh_gw_externs.h | 1 + 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/targets/RT/USER/eNB_transport_IQ.c b/targets/RT/USER/eNB_transport_IQ.c index 594b075941..acb382386e 100644 --- a/targets/RT/USER/eNB_transport_IQ.c +++ b/targets/RT/USER/eNB_transport_IQ.c @@ -147,18 +147,22 @@ void config_BBU_mod( rrh_module_t *mod_enb, uint8_t RT_flag, uint8_t NRT_flag) { mod_enb->devs->openair0_cfg = mod_enb->eth_dev.openair0_cfg; /* check sanity of configuration parameters and print */ - check_dev_config(mod_enb); - + check_dev_config(mod_enb); + if (rf_config_file[0] == '\0') + mod_enb->devs->openair0_cfg->configFilename = NULL; + else + mod_enb->devs->openair0_cfg->configFilename = rf_config_file; /* initialize and configure the RF device */ if (openair0_device_load(mod_enb->devs, mod_enb->devs->openair0_cfg)<0) { LOG_E(RRH,"Exiting, cannot initialize RF device.\n"); exit(-1); - } else { + } else { if (mod_enb->devs->type != NONE_DEV) { /* start RF device */ if (mod_enb->devs->type == EXMIMO_DEV) { //call start function for exmino } else { + if (mod_enb->devs->trx_start_func(mod_enb->devs)!=0) LOG_E(RRH,"Unable to initiate RF device.\n"); else diff --git a/targets/RT/USER/rrh_gw.c b/targets/RT/USER/rrh_gw.c index 87c4d4d77d..3def754e3d 100644 --- a/targets/RT/USER/rrh_gw.c +++ b/targets/RT/USER/rrh_gw.c @@ -111,8 +111,7 @@ rrh_module_t *ue_array; openair0_vtimestamp hw_counter=0; - - +char rf_config_file[1024]; static void debug_init(void); static void get_options(int argc, char *argv[]); @@ -143,7 +142,7 @@ static int get_address(char* if_name, uint8_t flag); int main(int argc, char **argv) { unsigned int i; - + rf_config_file[0]='\0'; /* parse input arguments */ get_options(argc, argv); /* initialize logger and signal analyzer */ @@ -257,7 +256,7 @@ static void get_options(int argc, char *argv[]) { int opt; - while ((opt = getopt(argc, argv, "xvhlte:n:u:g:r:m:i:")) != -1) { + while ((opt = getopt(argc, argv, "xvhlte:n:u:g:r:m:i:f:")) != -1) { switch (opt) { case 'n': @@ -299,6 +298,14 @@ static void get_options(int argc, char *argv[]) { /*In loopback mode rrh sends back to bbu what it receives*/ loopback_flag=1; break; + case 'f': + if (strlen(optarg)<=1024) + strcpy(rf_config_file,optarg); + else { + printf("Configuration filename is too long\n"); + exit(-1); + } + break; case 't': /* When measurements are enabled statistics related to TX/RX time are printed */ measurements_flag=1; diff --git a/targets/RT/USER/rrh_gw_externs.h b/targets/RT/USER/rrh_gw_externs.h index 8d2d1d7e5e..df59b9b1af 100644 --- a/targets/RT/USER/rrh_gw_externs.h +++ b/targets/RT/USER/rrh_gw_externs.h @@ -39,6 +39,7 @@ #ifndef RRH_GW_EXTERNS_H_ #define RRH_GW_EXTERNS_H_ +extern char rf_config_file[1024]; extern openair0_timestamp timestamp_UE_tx[4] ,timestamp_UE_rx[4] ,timestamp_eNB_rx[4],timestamp_eNB_tx[4]; extern openair0_vtimestamp hw_counter; From 78a47159325187df73579317eff4f51702b871ac Mon Sep 17 00:00:00 2001 From: trilyrak Date: Wed, 17 Feb 2016 13:50:05 +0100 Subject: [PATCH 066/122] updated enb configuration params for rrh --- openair2/ENB_APP/enb_config.c | 80 ++++++++++++++++++++++++++++++----- 1 file changed, 70 insertions(+), 10 deletions(-) diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index b437c7e264..0f6e6b3706 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -177,7 +177,11 @@ #define ENB_CONFIG_STRING_RRH_GW_LOCAL_PORT "local_port" #define ENB_CONFIG_STRING_RRH_GW_REMOTE_PORT "remote_port" #define ENB_CONFIG_STRING_RRH_GW_ACTIVE "active" -#define ENB_CONFIG_STRING_RRH_GW_PREFERENCE "preference" +#define ENB_CONFIG_STRING_RRH_GW_TRANSPORT_PREFERENCE "tr_preference" +#define ENB_CONFIG_STRING_RRH_GW_RF_TARGET_PREFERENCE "rf_preference" +#define ENB_CONFIG_STRING_RRH_GW_IQ_TXSHIFT "iq_txshift" +#define ENB_CONFIG_STRING_RRH_GW_TX_SAMPLE_ADVANCE "tx_sample_advance" +#define ENB_CONFIG_STRING_RRH_GW_TX_SCHEDULING_ADVANCE "tx_scheduling_advance" #define ENB_CONFIG_STRING_ASN1_VERBOSITY "Asn1_verbosity" #define ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE "none" @@ -291,7 +295,23 @@ static void enb_config_display(void) printf( "\tlocal port : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].local_port); printf( "\tremote address : \t%s:\n",enb_properties.properties[i]->rrh_gw_config[j].remote_address); printf( "\tremote port : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].remote_port); - printf( "\ttransport : \t%s Ethernet:\n\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : "UDP"); + printf( "\ttx_scheduling_advance :\t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_scheduling_advance); + printf( "\ttx_sample_advance : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_sample_advance); + printf( "\tiq_txshift : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].iq_txshift); + printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : "UDP"); + if (enb_properties.properties[i]->rrh_gw_config[j].exmimo == 1) { + printf( "\tRF target : \tEXMIMO:\n\n"); + } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_b200 == 1) { + printf( "\tRF target : \tUSRP_B200:\n\n"); + } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_x300 == 1) { + printf( "\tRF target : \tUSRP_X300:\n\n"); + } else if (enb_properties.properties[i]->rrh_gw_config[j].bladerf == 1) { + printf( "\tRF target : \tBLADERF:\n\n"); + } else if (enb_properties.properties[i]->rrh_gw_config[j].lmssdr == 1) { + printf( "\tRF target : \tLMSSDR:\n\n"); + } else { + printf( "\tRF target : \tNONE:\n\n"); + } } } @@ -479,14 +499,14 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) config_setting_t *setting_rrh_gw = NULL; config_setting_t *setting_enb = NULL; config_setting_t *setting_otg = NULL; - config_setting_t *subsetting_otg = NULL; + config_setting_t *subsetting_otg = NULL; int num_enb_properties = 0; int enb_properties_index = 0; int num_enbs = 0; int num_mme_address = 0; int num_rrh_gw = 0; - int num_otg_elements =0; - int num_component_carriers =0; + int num_otg_elements = 0; + int num_component_carriers = 0; int i = 0; int j = 0; int parse_errors = 0; @@ -588,6 +608,12 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) char* ipv6 = NULL; char* active = NULL; char* preference = NULL; + + char* tr_preference = NULL; + char* rf_preference = NULL; + libconfig_int tx_scheduling_advance = 0; + libconfig_int tx_sample_advance = 0; + libconfig_int iq_txshift = 0; libconfig_int local_port = 0; libconfig_int remote_port = 0; const char* active_enb[MAX_ENB]; @@ -2180,7 +2206,11 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_LOCAL_PORT, &local_port) && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_REMOTE_PORT, &remote_port) && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_ACTIVE, (const char **)&active) - && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_PREFERENCE, (const char **)&preference) + && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TRANSPORT_PREFERENCE, (const char **)&tr_preference) + && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_RF_TARGET_PREFERENCE, (const char **)&rf_preference) + && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_IQ_TXSHIFT, &iq_txshift) + && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TX_SAMPLE_ADVANCE, &tx_sample_advance) + && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TX_SCHEDULING_ADVANCE, &tx_scheduling_advance) ) ) { AssertError (0, parse_errors ++, @@ -2194,21 +2224,43 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rrh_gw_if_name = strdup(if_name); enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_address = strdup(ipv4); enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_address = strdup(ipv4_remote); - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_port= local_port; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_port= remote_port; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_port = local_port; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_port = remote_port; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].iq_txshift = iq_txshift; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_sample_advance = tx_sample_advance; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_scheduling_advance= tx_scheduling_advance; if (strcmp(active, "yes") == 0) { enb_properties.properties[enb_properties_index]->rrh_gw_config[j].active = 1; } - if (strcmp(preference, "udp") == 0) { + if (strcmp(tr_preference, "udp") == 0) { enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; - } else if (strcmp(preference, "raw") == 0) { + } else if (strcmp(tr_preference, "raw") == 0) { enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; } else {//if (strcmp(preference, "no") == 0) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; } + + if (strcmp(rf_preference, "exmimo") == 0) { + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 1; + } else if (strcmp(rf_preference, "usrp_b200") == 0) { + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 1; + } else if (strcmp(rf_preference, "usrp_x300") == 0) { + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 1; + } else if (strcmp(rf_preference, "bladerf") == 0) { + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 1; + } else if (strcmp(rf_preference, "bladerf") == 0) { + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 1; + } else {//if (strcmp(preference, "no") == 0) + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 1; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 1; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 1; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 1; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 1; + + } } } else { enb_properties.properties[enb_properties_index]->nb_rrh_gw = 0; @@ -2220,6 +2272,14 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].active = 0; enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 0; enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 0; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_scheduling_advance = 0; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_sample_advance = 0; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].iq_txshift = 0; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 0; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 0; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 0; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 0; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 0; } // SCTP SETTING From 1765790480bd51eda1cd39474b8d432445ca5fb1 Mon Sep 17 00:00:00 2001 From: trilyrak Date: Wed, 17 Feb 2016 13:50:12 +0100 Subject: [PATCH 067/122] updated enb configuration params for rrh --- openair2/ENB_APP/enb_config.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 9c271ca4f4..422ef67cd3 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -86,7 +86,14 @@ typedef struct rrh_gw_config_s { char *remote_address; uint16_t local_port; uint16_t remote_port; - + int tx_scheduling_advance; + int tx_sample_advance; + int iq_txshift; + unsigned exmimo:1; + unsigned usrp_b200:1; + unsigned usrp_x300:1; + unsigned bladerf:1; + unsigned lmssdr:1; } rrh_gw_config_t; typedef struct Enb_properties_s { From 0da275a81bb1d07733dd96d350de84933d270542 Mon Sep 17 00:00:00 2001 From: trilyrak Date: Wed, 17 Feb 2016 13:51:00 +0100 Subject: [PATCH 068/122] updates for rrh configuration params --- targets/ARCH/COMMON/common_lib.h | 16 ++++++++--- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 24 ++++++----------- targets/RT/USER/lte-softmodem.c | 27 ++++++++++++------- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 0abe8fd22e..2bd6e4e15d 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -209,15 +209,23 @@ typedef struct { typedef struct { char *remote_addr; //! remote port number for Ethernet interface - unsigned int remote_port; + uint16_t remote_port; //! local IP/MAC addr for Ethernet interface (eNB/BBU, UE) char *my_addr; //! local port number for Ethernet interface (eNB/BBU, UE) - unsigned int my_port; - //! local port number for Ethernet interface (eNB/BBU, UE) + uint16_t my_port; + //! local Ethernet interface (eNB/BBU, UE) char *local_if_name; - //! local port number for Ethernet interface (eNB/BBU, UE) + //! tx_sample_advance for RF + ETH + uint8_t tx_sample_advance; + //! tx_scheduling_advance for RF + ETH + uint8_t tx_scheduling_advance; + //! iq_txshift for RF + ETH + uint8_t iq_txshift; + //! transport type preference (RAW/UDP) uint8_t transp_preference; + //! radio front end preference (EXMIMO,USRP, BALDERF,LMSSDR) + uint8_t rf_preference; } eth_params_t; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 4fa522f21a..f15f2d98eb 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -344,43 +344,35 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth /* device specific */ openair0_cfg[0].txlaunch_wait = 0;//manage when TX processing is triggered openair0_cfg[0].txlaunch_wait_slotcount = 0; //manage when TX processing is triggered - openair0_cfg[0].iq_txshift = 5;// shift openair0_cfg[0].iq_rxrescale = 15;//rescale iqs + openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift + openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; /* RRH does not have any information to make this configuration atm */ if (device->host_type == BBU_HOST) { /*Note scheduling advance values valid only for case 7680000 */ switch ((int)openair0_cfg[0].sample_rate) { case 30720000: - openair0_cfg[0].samples_per_packet = 4096; - openair0_cfg[0].tx_sample_advance = 115; - openair0_cfg[0].tx_scheduling_advance = 11*openair0_cfg[0].samples_per_packet; + openair0_cfg[0].samples_per_packet = 4096; break; case 23040000: openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 113; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 15360000: - openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 113; - openair0_cfg[0].tx_scheduling_advance = 9*openair0_cfg[0].samples_per_packet; + openair0_cfg[0].samples_per_packet = 2048; break; case 7680000: - openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 70; - openair0_cfg[0].tx_scheduling_advance = 9*openair0_cfg[0].samples_per_packet; - break; + openair0_cfg[0].samples_per_packet = 1024; + break; case 1920000: - openair0_cfg[0].samples_per_packet = 256; - openair0_cfg[0].tx_sample_advance = 40; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; + openair0_cfg[0].samples_per_packet = 256; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); exit(-1); break; } + openair0_cfg[0].tx_scheduling_advance = eth_params->tx_scheduling_advance*openair0_cfg[0].samples_per_packet; } device->openair0_cfg=&openair0_cfg[0]; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index baba632de1..090fd4ecb5 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -2443,22 +2443,29 @@ static void get_options (int argc, char **argv) local_remote_radio = BBU_REMOTE_RADIO_HEAD; eth_params = (eth_params_t*)malloc(sizeof(eth_params_t)); memset(eth_params, 0, sizeof(eth_params_t)); - - printf( "\n\tRRH GW %d config for eNB %u:\n\n", j, i); - printf( "\tinterface name : \t%s:\n",enb_properties->properties[i]->rrh_gw_if_name); - printf( "\tlocal address : \t%s:\n",enb_properties->properties[i]->rrh_gw_config[j].local_address); - printf( "\tlocal port : \t%d:\n",enb_properties->properties[i]->rrh_gw_config[j].local_port); - printf( "\tremote address : \t%s:\n",enb_properties->properties[i]->rrh_gw_config[j].remote_address); - printf( "\tremote port : \t%d:\n",enb_properties->properties[i]->rrh_gw_config[j].remote_port); - printf( "\ttransport : \t%s Ethernet:\n\n",(enb_properties->properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : "UDP"); eth_params->local_if_name = enb_properties->properties[i]->rrh_gw_if_name; eth_params->my_addr = enb_properties->properties[i]->rrh_gw_config[j].local_address; eth_params->my_port = enb_properties->properties[i]->rrh_gw_config[j].local_port; eth_params->remote_addr = enb_properties->properties[i]->rrh_gw_config[j].remote_address; eth_params->remote_port = enb_properties->properties[i]->rrh_gw_config[j].remote_port; - eth_params->transp_preference = enb_properties->properties[i]->rrh_gw_config[j].raw; - + eth_params->transp_preference = enb_properties->properties[i]->rrh_gw_config[j].raw; + eth_params->iq_txshift = enb_properties->properties[i]->rrh_gw_config[j].iq_txshift; + eth_params->tx_sample_advance = enb_properties->properties[i]->rrh_gw_config[j].tx_sample_advance; + eth_params->tx_scheduling_advance = enb_properties->properties[i]->rrh_gw_config[j].tx_scheduling_advance; + if (enb_properties->properties[i]->rrh_gw_config[j].exmimo == 1) { + eth_params->rf_preference = EXMIMO_DEV; + } else if (enb_properties->properties[i]->rrh_gw_config[j].usrp_b200 == 1) { + eth_params->rf_preference = USRP_B200_DEV; + } else if (enb_properties->properties[i]->rrh_gw_config[j].usrp_x300 == 1) { + eth_params->rf_preference = USRP_X300_DEV; + } else if (enb_properties->properties[i]->rrh_gw_config[j].bladerf == 1) { + eth_params->rf_preference = BLADERF_DEV; + } else if (enb_properties->properties[i]->rrh_gw_config[j].lmssdr == 1) { + //eth_params->rf_preference = LMSSDR_DEV; + } else { + eth_params->rf_preference = 0; + } } else { local_remote_radio = BBU_LOCAL_RADIO_HEAD; } From 0c104f3313bdcf7a6a86c695b624a5a707a8b578 Mon Sep 17 00:00:00 2001 From: trilyrak Date: Wed, 17 Feb 2016 13:51:24 +0100 Subject: [PATCH 069/122] update config file for rrh --- .../CONF/enb.band7.tm1.rrh.usrpb210.conf | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf index e8d49cca18..71d8fe7f34 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -143,28 +143,34 @@ eNBs = rrh_gw_config = ( { local_if_name = "eth0"; - remote_address = "169.254.8.28"; + remote_address = "169.254.10.158"; + local_address = "169.254.8.15"; #remote_address = "127.0.0.1"; - #remote_address = "74:d4:35:cc:88:45"; - local_address = "169.254.7.91"; + #remote_address = "74:d4:35:cc:88:45"; #local_address = "127.0.0.1"; #local_address = "d4:be:d9:22:0a:ac"; #for raw option local port must be the same to remote local_port = 50001; remote_port = 50000; active = "yes"; - preference = "udp"; + tr_preference = "udp"; + rf_preference = "usrp_b200"; + iq_txshift = 8; + tx_sample_advance = 50; + tx_scheduling_advance = 100; } ); NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.118/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth6"; + + + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.118/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; From 21a62e94b1a8fdbe3532dbdd0310bf604409cde6 Mon Sep 17 00:00:00 2001 From: trilyrak Date: Wed, 17 Feb 2016 14:27:48 +0100 Subject: [PATCH 070/122] update/add config files for rrh + USRP/LMSSDR 5/10MHz --- .../CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf | 192 ++++++++++++++++++ .../enb.band7.tm1.50PRB.rrh.usrpb210.conf | 192 ++++++++++++++++++ .../CONF/enb.band7.tm1.rrh.lmssdr.conf | 192 ++++++++++++++++++ .../CONF/enb.band7.tm1.rrh.usrpb210.conf | 21 +- 4 files changed, 585 insertions(+), 12 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf new file mode 100644 index 0000000000..604226c31a --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf @@ -0,0 +1,192 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 60; + rx_gain = 111; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -85; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; +/* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; +*/ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -100; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.170"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + +rrh_gw_config = ( + { + local_if_name = "eth0"; + #remote_address = "169.254.10.158"; + #local_address = "169.254.8.15"; + remote_address = "74:d4:35:cc:88:45"; + local_address = "d4:be:d9:22:0a:ac"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + active = "yes"; + tr_preference = "raw"; + rf_preference = "lmssdr"; + iq_txshift = 0; + tx_sample_advance = 45; + tx_scheduling_advance = 8; + +} +); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.118/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth6"; + + + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.118/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf new file mode 100644 index 0000000000..abaf8de6ee --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf @@ -0,0 +1,192 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.170"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + +rrh_gw_config = ( + { + local_if_name = "eth0"; + #remote_address = "169.254.10.158"; + #local_address = "169.254.8.15"; + remote_address = "74:d4:35:cc:88:45"; + local_address = "d4:be:d9:22:0a:ac"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + active = "yes"; + tr_preference = "raw"; + rf_preference = "usrp_b200"; + iq_txshift = 5; + tx_sample_advance = 113; + tx_scheduling_advance = 8; + +} +); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.118/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth6"; + + + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.118/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf new file mode 100644 index 0000000000..93afe062e9 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf @@ -0,0 +1,192 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 60; + rx_gain = 111; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -85; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; +/* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; +*/ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -100; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.170"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + +rrh_gw_config = ( + { + local_if_name = "eth0"; + #remote_address = "169.254.10.158"; + #local_address = "169.254.8.15"; + remote_address = "74:d4:35:cc:88:45"; + local_address = "d4:be:d9:22:0a:ac"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + active = "yes"; + tr_preference = "raw"; + rf_preference = "lmssdr"; + iq_txshift = 0; + tx_sample_advance = 70; + tx_scheduling_advance = 8; + +} +); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.118/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth6"; + + + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.118/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf index 71d8fe7f34..82ca458085 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -143,21 +143,18 @@ eNBs = rrh_gw_config = ( { local_if_name = "eth0"; - remote_address = "169.254.10.158"; - local_address = "169.254.8.15"; - #remote_address = "127.0.0.1"; - #remote_address = "74:d4:35:cc:88:45"; - #local_address = "127.0.0.1"; - #local_address = "d4:be:d9:22:0a:ac"; - #for raw option local port must be the same to remote - local_port = 50001; + #remote_address = "169.254.10.158"; + #local_address = "169.254.8.15"; + remote_address = "74:d4:35:cc:88:45"; + local_address = "d4:be:d9:22:0a:ac"; + local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; active = "yes"; - tr_preference = "udp"; + tr_preference = "raw"; rf_preference = "usrp_b200"; - iq_txshift = 8; - tx_sample_advance = 50; - tx_scheduling_advance = 100; + iq_txshift = 5; + tx_sample_advance = 70; + tx_scheduling_advance = 8; } ); From d13bb9d70345a5893f8247353396369d047e1675 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 17 Feb 2016 16:24:00 +0100 Subject: [PATCH 071/122] update config files for rrh + usrp --- .../enb.band7.tm1.50PRB.rrh.usrpb210.conf | 160 +++++++++--------- .../CONF/enb.band7.tm1.rrh.usrpb210.conf | 14 +- 2 files changed, 86 insertions(+), 88 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf index abaf8de6ee..c42e1b7864 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf @@ -5,7 +5,7 @@ Asn1_verbosity = "none"; eNBs = ( { - ////////// Identification parameters: + ////////// Identification parameters: eNB_ID = 0xe00; cell_type = "CELL_MACRO_ENB"; @@ -23,85 +23,83 @@ eNBs = component_carriers = ( { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 125; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2680000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; } ); - srb1_parameters : { # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] @@ -133,7 +131,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.170"; + mme_ip_address = ( { ipv4 = "192.168.12.26"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -146,7 +144,7 @@ rrh_gw_config = ( #remote_address = "169.254.10.158"; #local_address = "169.254.8.15"; remote_address = "74:d4:35:cc:88:45"; - local_address = "d4:be:d9:22:0a:ac"; + local_address = "98:90:96:df:66:07"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; active = "yes"; @@ -154,20 +152,20 @@ rrh_gw_config = ( rf_preference = "usrp_b200"; iq_txshift = 5; tx_sample_advance = 113; - tx_scheduling_advance = 8; + tx_scheduling_advance = 9; } ); NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.118/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth6"; + ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.118/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf index 82ca458085..6b74698849 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -133,7 +133,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.170"; + mme_ip_address = ( { ipv4 = "192.168.12.26"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -146,7 +146,7 @@ rrh_gw_config = ( #remote_address = "169.254.10.158"; #local_address = "169.254.8.15"; remote_address = "74:d4:35:cc:88:45"; - local_address = "d4:be:d9:22:0a:ac"; + local_address = "98:90:96:df:66:07"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; active = "yes"; @@ -154,20 +154,20 @@ rrh_gw_config = ( rf_preference = "usrp_b200"; iq_txshift = 5; tx_sample_advance = 70; - tx_scheduling_advance = 8; + tx_scheduling_advance = 9; } ); NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.118/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth6"; + ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.118/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; From e3c4cc9d79d6655457fff1db2c44a87a6c947b49 Mon Sep 17 00:00:00 2001 From: Aikaterini Date: Wed, 17 Feb 2016 17:08:18 +0100 Subject: [PATCH 072/122] fix name of SoDERA SDR config files --- ...a.conf => enb.band7.tm1.50PRB.lmssdr.conf} | 0 .../CONF/enb.band7.tm1.50PRB.rrh.sodera.conf | 190 ----------------- ....sedora.conf => enb.band7.tm1.lmssdr.conf} | 0 .../CONF/enb.band7.tm1.rrh.sodera.conf | 192 ------------------ 4 files changed, 382 deletions(-) rename targets/PROJECTS/GENERIC-LTE-EPC/CONF/{enb.band7.tm1.50PRB.sedora.conf => enb.band7.tm1.50PRB.lmssdr.conf} (100%) delete mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.sodera.conf rename targets/PROJECTS/GENERIC-LTE-EPC/CONF/{enb.band7.tm1.sedora.conf => enb.band7.tm1.lmssdr.conf} (100%) delete mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.sodera.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.sedora.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf similarity index 100% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.sedora.conf rename to targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.sodera.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.sodera.conf deleted file mode 100644 index c3985c9dce..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.sodera.conf +++ /dev/null @@ -1,190 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 50; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 60; - rx_gain = 111; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - -rrh_gw_config = ( - { - local_if_name = "eth0"; - remote_address = "169.254.8.28"; - #remote_address = "127.0.0.1"; - #remote_address = "74:d4:35:cc:88:45"; - local_address = "169.254.7.91"; - #local_address = "127.0.0.1"; - #local_address = "d4:be:d9:22:0a:ac"; - #for raw option local port must be the same to remote - local_port = 50000; - remote_port = 50000; - active = "yes"; - preference = "raw"; - -} -); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.sedora.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf similarity index 100% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.sedora.conf rename to targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.sodera.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.sodera.conf deleted file mode 100644 index 2db6eb799b..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.sodera.conf +++ /dev/null @@ -1,192 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 60; - rx_gain = 111; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.26"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - - -rrh_gw_config = ( - { - local_if_name = "eth0"; - remote_address = "169.254.8.28"; - #remote_address = "127.0.0.1"; - #remote_address = "74:d4:35:cc:88:45"; - local_address = "169.254.7.91"; - #local_address = "127.0.0.1"; - #local_address = "d4:be:d9:22:0a:ac"; - #for raw option local port must be the same to remote - local_port = 50000; - remote_port = 50000; - active = "yes"; - preference = "raw"; - -} -); - - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); From 87dc41f06794eec1da2ca46c8c57a690100480ea Mon Sep 17 00:00:00 2001 From: Aikaterini Trilyraki Date: Wed, 17 Feb 2016 19:55:03 +0100 Subject: [PATCH 073/122] Delete CMakelists.txt for rrH GW --- cmake_targets/rrh_gw/CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 cmake_targets/rrh_gw/CMakeLists.txt diff --git a/cmake_targets/rrh_gw/CMakeLists.txt b/cmake_targets/rrh_gw/CMakeLists.txt deleted file mode 100644 index 9ff1437f0c..0000000000 --- a/cmake_targets/rrh_gw/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 2.8) -set(ENABLE_VCD_FIFO False ) -set(ENABLE_ITTI False ) -set(RF_BOARD "ETHERNET") -set(PACKAGE_NAME "\"rrh_gw\"") -include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt) From caf14c40d48377e4c2799de7f6f8e2ec5fe9ae21 Mon Sep 17 00:00:00 2001 From: Aikaterini Date: Thu, 18 Feb 2016 17:54:12 +0100 Subject: [PATCH 074/122] settings for 5MHz SoDERA --- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index e5f69d5577..3ca15c6660 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -82,7 +82,7 @@ int trx_lms_read(openair0_device *device, openair0_timestamp *ptimestamp, void * uint64_t timestamp; int16_t *dst_ptr = (int16_t*) buff[0]; int ret; - ret = LMS_TRxRead(dst_ptr, nsamps,0,×tamp, 100); + ret = LMS_TRxRead(dst_ptr, nsamps,0,×tamp, 10); *ptimestamp=timestamp; return ret; @@ -843,7 +843,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg){ openair0_cfg[0].tx_sample_advance = 70; openair0_cfg[0].tx_bw = 28e6; openair0_cfg[0].rx_bw = 5.0e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; + openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 1920000: openair0_cfg[0].samples_per_packet = 256; From f7fde92665c1cbc35866e5e654519f7f82cb3eca Mon Sep 17 00:00:00 2001 From: Aikaterini Date: Thu, 18 Feb 2016 17:55:05 +0100 Subject: [PATCH 075/122] config files update --- .../CONF/enb.band7.tm1.50PRB.lmssdr.conf | 10 +++++----- .../GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf | 12 ++++++------ .../CONF/enb.band7.tm1.usrpb210.epc.remote.conf | 14 +++++++------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf index 8a5f33af4b..e001bd12e9 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf @@ -132,7 +132,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; + mme_ip_address = ( { ipv4 = "192.168.12.171"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -141,11 +141,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf index 70fcc2e3f4..47e2179d18 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "93"; + mobile_network_code = "92"; ////////// Physical parameters: @@ -132,7 +132,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; + mme_ip_address = ( { ipv4 = "192.168.12.170"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -141,11 +141,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf index 375a4a90ca..83b08cb4e0 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf @@ -16,7 +16,7 @@ eNBs = tracking_area_code = "1"; mobile_country_code = "208"; - mobile_network_code = "95"; + mobile_network_code = "92"; ////////// Physical parameters: @@ -35,7 +35,7 @@ eNBs = nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 132; + rx_gain = 125; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; @@ -130,18 +130,18 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( {ipv4 = "192.168.12.17"; + mme_ip_address = ( {ipv4 = "192.168.12.170"; ipv6="192:168:30::17"; active="yes"; preference="ipv4";}); NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.213/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.213/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; From 78913e263e68d38566c2030e4ca33e903500bbf7 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Fri, 19 Feb 2016 00:43:02 +0100 Subject: [PATCH 076/122] change rrh_gw_config naming in enb config file --- cmake_targets/tools/build_helper | 18 ++++++++++++++++++ openair2/ENB_APP/enb_config.c | 2 +- .../CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf | 2 +- .../CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf | 2 +- .../CONF/enb.band7.tm1.rrh.lmssdr.conf | 2 +- .../CONF/enb.band7.tm1.rrh.usrpb210.conf | 2 +- 6 files changed, 23 insertions(+), 5 deletions(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index d29dbffe13..c8adf45257 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -380,3 +380,21 @@ done } +# get from http://www.linuxjournal.com/content/validating-ip-address-bash-script +validate_ip() { + +local ip=$1 +local stat=1 + +if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then + OIFS=$IFS + IFS='.' + ip=($ip) + IFS=$OIFS + [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ + && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] + stat=$? +fi + +return $stat +} \ No newline at end of file diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 0f6e6b3706..4c532285f2 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -176,7 +176,7 @@ #define ENB_CONFIG_STRING_RRH_GW_REMOTE_ADDRESS "remote_address" #define ENB_CONFIG_STRING_RRH_GW_LOCAL_PORT "local_port" #define ENB_CONFIG_STRING_RRH_GW_REMOTE_PORT "remote_port" -#define ENB_CONFIG_STRING_RRH_GW_ACTIVE "active" +#define ENB_CONFIG_STRING_RRH_GW_ACTIVE "rrh_gw_active" #define ENB_CONFIG_STRING_RRH_GW_TRANSPORT_PREFERENCE "tr_preference" #define ENB_CONFIG_STRING_RRH_GW_RF_TARGET_PREFERENCE "rf_preference" #define ENB_CONFIG_STRING_RRH_GW_IQ_TXSHIFT "iq_txshift" diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf index 604226c31a..4cd761645b 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf @@ -149,7 +149,7 @@ rrh_gw_config = ( local_address = "d4:be:d9:22:0a:ac"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; - active = "yes"; + rrh_gw_active = "yes"; tr_preference = "raw"; rf_preference = "lmssdr"; iq_txshift = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf index c42e1b7864..604f5567ef 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf @@ -147,7 +147,7 @@ rrh_gw_config = ( local_address = "98:90:96:df:66:07"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; - active = "yes"; + rrh_gw_active = "yes"; tr_preference = "raw"; rf_preference = "usrp_b200"; iq_txshift = 5; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf index 93afe062e9..9b052bf7ba 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf @@ -149,7 +149,7 @@ rrh_gw_config = ( local_address = "d4:be:d9:22:0a:ac"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; - active = "yes"; + rrh_gw_active = "yes"; tr_preference = "raw"; rf_preference = "lmssdr"; iq_txshift = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf index 6b74698849..33db53740c 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -149,7 +149,7 @@ rrh_gw_config = ( local_address = "98:90:96:df:66:07"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; - active = "yes"; + rrh_gw_active = "yes"; tr_preference = "raw"; rf_preference = "usrp_b200"; iq_txshift = 5; From 8984944444e51f0b6c267233d718c4514724bcee Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 19 Feb 2016 11:47:25 +0100 Subject: [PATCH 077/122] fixing a bug in cmult_vv, removing unused code. --- openair1/PHY/TOOLS/cmult_mm.c | 200 ------------------ openair1/PHY/TOOLS/cmult_vv.c | 5 +- openair1/PHY/TOOLS/cmult_vvh.c | 366 --------------------------------- openair1/PHY/TOOLS/defs.h | 208 +++---------------- openair1/PHY/TOOLS/time_meas.h | 4 + 5 files changed, 33 insertions(+), 750 deletions(-) delete mode 100644 openair1/PHY/TOOLS/cmult_mm.c delete mode 100644 openair1/PHY/TOOLS/cmult_vvh.c diff --git a/openair1/PHY/TOOLS/cmult_mm.c b/openair1/PHY/TOOLS/cmult_mm.c deleted file mode 100644 index 328958af29..0000000000 --- a/openair1/PHY/TOOLS/cmult_mm.c +++ /dev/null @@ -1,200 +0,0 @@ -/******************************************************************************* - 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 . - - 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 - - *******************************************************************************/ -#include "defs.h" - -int mult_cpx_matrix_h(short *x1[2][2], - short *x2[2][2], - short *y[2][2], - unsigned int N, - unsigned short output_shift, - short hermitian) -{ - - if (hermitian) { - // this computes x1^H*x2 and stores it in y - mult_cpx_vector_h(x2[0][0],x1[0][0],y[0][0],N,output_shift,1); - mult_cpx_vector_h(x2[0][1],x1[0][1],y[0][0],N,output_shift,1); - mult_cpx_vector_h(x2[0][0],x1[1][0],y[1][0],N,output_shift,1); - mult_cpx_vector_h(x2[0][1],x1[1][1],y[1][0],N,output_shift,1); - mult_cpx_vector_h(x2[1][0],x1[0][0],y[0][1],N,output_shift,1); - mult_cpx_vector_h(x2[1][1],x1[0][1],y[0][1],N,output_shift,1); - mult_cpx_vector_h(x2[1][0],x1[1][0],y[1][1],N,output_shift,1); - mult_cpx_vector_h(x2[1][1],x1[1][1],y[1][1],N,output_shift,1); - } else { - // this computes x1*x2^H and stores it in y - mult_cpx_vector_h(x1[0][0],x2[0][0],y[0][0],N,output_shift,1); - mult_cpx_vector_h(x1[0][1],x2[0][1],y[0][0],N,output_shift,1); - mult_cpx_vector_h(x1[0][0],x2[1][0],y[0][1],N,output_shift,1); - mult_cpx_vector_h(x1[0][1],x2[1][1],y[0][1],N,output_shift,1); - mult_cpx_vector_h(x1[1][0],x2[0][0],y[1][0],N,output_shift,1); - mult_cpx_vector_h(x1[1][1],x2[0][1],y[1][0],N,output_shift,1); - mult_cpx_vector_h(x1[1][0],x2[1][0],y[1][1],N,output_shift,1); - mult_cpx_vector_h(x1[1][1],x2[1][1],y[1][1],N,output_shift,1); - } -} - -int mult_cpx_matrix_vector(int *x1[2][2], - int *x2[2], - int *y[2], - unsigned int N, - unsigned short output_shift) -{ - - Zero_Buffer(y[0],N*8); - Zero_Buffer(y[1],N*8); - - // this computes x1*x2 and stores it in y (32 bit) - mult_cpx_vector_add32((short*)x2[0],(short*)x1[0][0],(short*)y[0],N); - mult_cpx_vector_add32((short*)x2[1],(short*)x1[0][1],(short*)y[0],N); - mult_cpx_vector_add32((short*)x2[0],(short*)x1[1][0],(short*)y[1],N); - mult_cpx_vector_add32((short*)x2[1],(short*)x1[1][1],(short*)y[1],N); - - // shift and pack - shift_and_pack((short*)y[0],N,output_shift); - shift_and_pack((short*)y[1],N,output_shift); - -} - -#ifdef MAIN_MM -#include -#include -main () -{ - short x1_00[256] __attribute__((aligned(16))); - short x1_10[256] __attribute__((aligned(16))); - short x1_01[256] __attribute__((aligned(16))); - short x1_11[256] __attribute__((aligned(16))); - short x2_0[256] __attribute__((aligned(16))); - short x2_1[256] __attribute__((aligned(16))); - short y_0[256] __attribute__((aligned(16))); - short y_1[256] __attribute__((aligned(16))); - - int *x1[2][2]; - int *x2[2]; - int *y[2]; - int i,m,n; - - x1[0][0] = (int*)x1_00; - x1[0][1] = (int*)x1_01; - x1[1][0] = (int*)x1_10; - x1[1][1] = (int*)x1_11; - x2[0] = (int*)x2_0; - x2[1] = (int*)x2_1; - y[0] = (int*)y_0; - y[1] = (int*)y_1; - - for(m=0; m<2; m++) { - for(n=0; n<2; n++) { - for(i=0; i<256; i+=4) { - ((short*)x1[m][n])[i] = ((short) rand())/4; - ((short*)x1[m][n])[i+1] = ((short) rand())/4; - ((short*)x1[m][n])[i+2] = -((short*)x1[m][n])[i+1]; - ((short*)x1[m][n])[i+3] = ((short*)x1[m][n])[i]; - } - } - - for(i=0; i<256; i+=4) { - ((short*)x2[m])[i] = ((short) rand())/4; - ((short*)x2[m])[i+1] = ((short) rand())/4; - ((short*)x2[m])[i+2] = ((short*)x2[m])[i]; - ((short*)x2[m])[i+3] = ((short*)x2[m])[i+1]; - } - - Zero_Buffer(y[m],512); - } - - /* - input[0] = 100; - input[1] = 200; - input[2] = -200; - input[3] = 100; - input[4] = 1000; - input[5] = 2000; - input[6] = -2000; - input[7] = 1000; - input[8] = 100; - input[9] = 200; - input[10] = -200; - input[11] = 100; - input[12] = 1000; - input[13] = 2000; - input[14] = -2000; - input[15] = 1000; - - input2[0] = 2; - input2[1] = 1; - input2[2] = 2; - input2[3] = 1; - input2[4] = 20; - input2[5] = 10; - input2[6] = 20; - input2[7] = 10; - input2[8] = 2; - input2[9] = 1; - input2[10] = 2; - input2[11] = 1; - input2[12] = 2000; - input2[13] = 1000; - input2[14] = 2000; - input2[15] = 1000; - - x1[0][0] = (int*)input; - x1[0][1] = (int*)input; - x1[1][0] = (int*)input; - x1[1][1] = (int*)input; - - x2[0] = (int*)input2; - x2[1] = (int*)input2; - - y[0] = (int*)output; - y[1] = (int*)output2; - */ - - mult_cpx_matrix_vector(x1,x2,y,64,15); - - //mult_cpx_vector_add32(x2[0],x1[0][0],y[0],64); - - for (i=0; i<128; i+=2) - printf("i=%d, x1 = [%d+1i*%d %d+1i*%d; %d+1i*%d %d+1i*%d]; x2 = [%d+1i*%d; %d+1i*%d]; y = [%d+1i*%d; %d+1i*%d]; y_m= round(x1*x2./pow2(15)); y-y_m \n", - i, - ((short*)x1[0][0])[2*i], ((short*)x1[0][0])[2*i+2], - ((short*)x1[0][1])[2*i], ((short*)x1[0][1])[2*i+2], - ((short*)x1[1][0])[2*i], ((short*)x1[1][0])[2*i+2], - ((short*)x1[1][1])[2*i], ((short*)x1[1][1])[2*i+2], - ((short*)x2[0])[2*i], ((short*)x2[0])[2*i+1], - ((short*)x2[1])[2*i], ((short*)x2[1])[2*i+1], - ((short*)y[0])[2*i], ((short*)y[0])[2*i+1], - ((short*)y[1])[2*i], ((short*)y[1])[2*i+1]); - - //((int*)y[0])[i], ((int*)y[0])[i+1], - //((int*)y[1])[i], ((int*)y[1])[i+1]); - -} - -#endif diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c index d7b7275508..f970d33224 100755 --- a/openair1/PHY/TOOLS/cmult_vv.c +++ b/openair1/PHY/TOOLS/cmult_vv.c @@ -50,7 +50,7 @@ int mult_cpx_conj_vector(int16_t *x1, uint32_t N, int output_shift) { - // Multiply elementwise two complex vectors of N elements with repeated formatted output + // Multiply elementwise the complex conjugate of x1 with x2. // x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| // We assume x1 with a dinamic of 15 bit maximum // @@ -90,7 +90,7 @@ int mult_cpx_conj_vector(int16_t *x1, tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1)); tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1)); tmp_im = _mm_sign_epi16(tmp_im,*(__m128i*)&conjug[0]); - tmp_im = _mm_madd_epi16(tmp_im,*x1_128); + tmp_im = _mm_madd_epi16(tmp_im,*x2_128); tmp_re = _mm_srai_epi32(tmp_re,output_shift); tmp_im = _mm_srai_epi32(tmp_im,output_shift); tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im); @@ -130,3 +130,4 @@ int mult_cpx_conj_vector(int16_t *x1, return(0); } + diff --git a/openair1/PHY/TOOLS/cmult_vvh.c b/openair1/PHY/TOOLS/cmult_vvh.c deleted file mode 100644 index 64cf163d09..0000000000 --- a/openair1/PHY/TOOLS/cmult_vvh.c +++ /dev/null @@ -1,366 +0,0 @@ -/******************************************************************************* - 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 . - - 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 - - *******************************************************************************/ -#include "defs.h" - -static __m128i shift __attribute__ ((aligned(16))); - - -int mult_cpx_vector_h(short *x1, - short *x2, - short *y, - unsigned int N, - unsigned short output_shift, - short sign) -{ - // Multiply elementwise the complex vector x1 with the complex conjugate of the complex vecotr x2 of N elements and adds it to the vector y. - // x1 - input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| - // We assume x1 with a dinamic of 15 bit maximum - // - // x2 - input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| - // We assume x2 with a dinamic of 14 bit maximum - // - // y - output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| - // - // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; - // - // log2_amp - increase the output amplitude by a factor 2^log2_amp (default is 0) - // WARNING: log2_amp>0 can cause overflow!! - // sign - +1..add, -1..substract - - unsigned int i; // loop counter - - register __m128i m0,m1,m2; - - short *temps; - int *tempd; - - __m128i *x1_128; - __m128i *x2_128; - __m128i *y_128; - __m128i mask; - - __m128i temp; - - shift = _mm_cvtsi32_si128(output_shift); - x1_128 = (__m128i *)&x1[0]; - x2_128 = (__m128i *)&x2[0]; - y_128 = (__m128i *)&y[0]; - - if (sign == -1) - mask = (__m128i) _mm_set_epi16 (-1,1,-1,-1,-1,1,-1,-1); - else - mask = (__m128i) _mm_set_epi16 (1,-1,1,1,1,-1,1,1); - - // we compute 2*4 cpx multiply for each loop - for(i=0; i<(N>>3); i++) { - - // printf("i=%d\n",i); - - // unroll 1 - // temps = (short *)x1_128; - // printf("x1 : %d,%d,%d,%d,%d,%d,%d,%d\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]); - m1 = x1_128[0]; - m2 = x2_128[0]; - - // temps = (short *)&x2_128[0]; - // printf("x2 : %x,%x,%x,%x,%x,%x,%x,%x\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]); - - // bring x2 in conjugate form - // the first two instructions might be replaced with a single one in SSE3 - m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_mullo_epi16(m2, mask); - - // temp = m2; - // temps = (short *)&temp; - // printf("x2 conj : %x,%x,%x,%x,%x,%x,%x,%x\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]); - - m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0] - - // temp = m0; - - // tempd = &temp; - // printf("m0 : %d,%d,%d,%d\n",tempd[0],tempd[1],tempd[2],tempd[3]); - - m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude - - // temp = m0; - - // tempd = (int *)&temp; - // printf("m0 : %d,%d,%d,%d\n",tempd[0],tempd[1],tempd[2],tempd[3]); - - m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im] - m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im] - - y_128[0] = _mm_add_epi16(m0,y_128[0]); - - // temps = (short *)&y_128[0]; - // printf("y0 : %d,%d,%d,%d,%d,%d,%d,%d\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]); - - // unroll 2 - m1 = x1_128[1]; - m2 = x2_128[1]; - - m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_mullo_epi16(m2, mask); - - m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0] - - m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude - - m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im] - m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im] - - y_128[1] = _mm_add_epi16(m0,y_128[1]); - - // unroll 3 - m1 = x1_128[2]; - m2 = x2_128[2]; - - m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_mullo_epi16(m2, mask); - - m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0] - - m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude - - m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im] - m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im] - - y_128[2] = _mm_add_epi16(m0,y_128[2]); - - - // unroll 4 - m1 = x1_128[3]; - m2 = x2_128[3]; - - m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_mullo_epi16(m2, mask); - - m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0] - - m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude - - m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im] - m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im] - - y_128[3] = _mm_add_epi16(m0,y_128[3]); - - x1_128+=4; - x2_128+=4; - y_128 +=4; - // printf("x1_128 = %p, x2_128 =%p, y_128=%p\n",x1_128,x2_128,y_128); - - } - - - _mm_empty(); - _m_empty(); - - return(0); -} - - -int mult_cpx_vector_h_add32(short *x1, - short *x2, - short *y, - unsigned int N, - short sign) -{ - // Multiply elementwise the complex vector x1 with the complex conjugate of the complex vecotr x2 of N elements and adds it to the vector y. - // x1 - input 1 in 16bit format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| - // We assume x1 with a dinamic of 15 bit maximum - // - // x2 - input 2 in 16bit format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| - // We assume x2 with a dinamic of 14 bit maximum - // - // y - output in 32bit format |Re0 Im0|,......,|Re(N-1) Im(N-1)| - // - // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; - // - // sign - +1..add, -1..substract - - unsigned int i; // loop counter - - register __m128i m0,m1,m2; - - short *temps; - int *tempd; - - __m128i *x1_128; - __m128i *x2_128; - __m128i *y_128; - __m128i mask; - - __m128i temp; - - x1_128 = (__m128i *)&x1[0]; - x2_128 = (__m128i *)&x2[0]; - y_128 = (__m128i *)&y[0]; - - if (sign == -1) - mask = (__m128i) _mm_set_epi16 (-1,1,-1,-1,-1,1,-1,-1); - else - mask = (__m128i) _mm_set_epi16 (1,-1,1,1,1,-1,1,1); - - // we compute 2*4 cpx multiply for each loop - for(i=0; i<(N>>3); i++) { - - m1 = x1_128[0]; - m2 = x2_128[0]; - - // bring x2 in conjugate form - // the first two instructions might be replaced with a single one in SSE3 - m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_mullo_epi16(m2, mask); - - m0 = _mm_madd_epi16(m1,m2); // 1- compute x1[0]*x2[0], result is 32bit - - y_128[0] = _mm_add_epi32(m0,y_128[0]); - - // unroll 2 - m1 = x1_128[1]; - m2 = x2_128[1]; - - m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_mullo_epi16(m2, mask); - - m0 = _mm_madd_epi16(m1,m2); - - y_128[1] = _mm_add_epi32(m0,y_128[1]); - - // unroll 3 - m1 = x1_128[2]; - m2 = x2_128[2]; - - m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_mullo_epi16(m2, mask); - - m0 = _mm_madd_epi16(m1,m2); - - y_128[2] = _mm_add_epi32(m0,y_128[2]); - - - // unroll 4 - m1 = x1_128[3]; - m2 = x2_128[3]; - - m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2)); - m2 = _mm_mullo_epi16(m2, mask); - - m0 = _mm_madd_epi16(m1,m2); - - y_128[3] = _mm_add_epi32(m0,y_128[3]); - - x1_128+=4; - x2_128+=4; - y_128 +=4; - - } - - - _mm_empty(); - _m_empty(); - - return(0); -} - -#ifdef MAIN -#define L 16 - -main () -{ - - short input[256] __attribute__((aligned(16))); - short input2[256] __attribute__((aligned(16))); - short output[256] __attribute__((aligned(16))); - - int i; - - Zero_Buffer(output,256*2); - - for (i=0; i<16; i+=2) - printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]); - - input[0] = 100; - input[1] = 200; - input[2] = 100; - input[3] = 200; - input[4] = 1234; - input[5] = -1234; - input[6] = 1234; - input[7] = -1234; - input[8] = 100; - input[9] = 200; - input[10] = 100; - input[11] = 200; - input[12] = 1000; - input[13] = 2000; - input[14] = 1000; - input[15] = 2000; - - input2[0] = 1; - input2[1] = 2; - input2[2] = 1; - input2[3] = 2; - input2[4] = 10; - input2[5] = 20; - input2[6] = 10; - input2[7] = 20; - input2[8] = 1; - input2[9] = 2; - input2[10] = 1; - input2[11] = 2; - input2[12] = 1000; - input2[13] = 2000; - input2[14] = 1000; - input2[15] = 2000; - - - mult_cpx_vector_h(input2,input2,output,8,0,1); - - for (i=0; i<16; i+=2) - printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]); - - Zero_Buffer(output,256*2); - mult_cpx_vector_h(input2,input2,output,8,0,-1); - - for (i=0; i<16; i+=2) - printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]); - -} - -#endif //MAIN diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index 6960fcda4c..963c1384b7 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -64,6 +64,8 @@ struct complex32 { int32_t i; }; +//cmult_sv.h + /*!\fn void multadd_real_vector_complex_scalar(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N) This function performs componentwise multiplication and accumulation of a complex scalar and a real vector. @param x Vector input (Q1.15) @@ -95,192 +97,14 @@ void multadd_complex_vector_real_scalar(int16_t *x, uint8_t zero_flag, uint32_t N); - -/*!\fn int32_t mult_cpx_vector(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift) -This function performs optimized componentwise multiplication of two Q1.15 vectors in repeated format. - -@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)| -@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param N Length of Vector WARNING: N must be a multiple of 8 (4x loop unrolling and two complex multiplies per cycle) -@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!! - -The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$ -*/ -int32_t mult_cpx_vector(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N, - int32_t output_shift); - -/*!\fn int32_t mult_cpx_vector_norep(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift) -This function performs optimized componentwise multiplication of two Q1.15 vectors with normal formatted output. - -@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)| -@param y Output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| -@param N Length of Vector WARNING: N must be a multiple of 8 (4x loop unrolling and two complex multiplies per cycle) -@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!! - -The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$ -*/ -int32_t mult_cpx_vector_norep(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N, - int32_t output_shift); - - -/*!\fn int32_t mult_cpx_vector_norep2(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift) -This function performs optimized componentwise multiplication of two Q1.15 vectors with normal formatted output. - -@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)| -@param y Output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| -@param N Length of Vector WARNING: N must be a multiple of 8 (no unrolling and two complex multiplies per cycle) -@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!! - -The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$ -*/ -int32_t mult_cpx_vector_norep2(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N, - int32_t output_shift); - -int32_t mult_cpx_vector_norep_conj(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N, - int32_t output_shift); - -int32_t mult_cpx_vector_norep_conj2(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N, - int32_t output_shift); - -/*!\fn int32_t mult_cpx_vector2(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift) -This function performs optimized componentwise multiplication of two Q1.15 vectors. - -@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)| -@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param N Length of Vector WARNING: N must be a multiple of 2 (2 complex multiplies per cycle) -@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!! - -The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$ -*/ -int32_t mult_cpx_vector2(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N, - int32_t output_shift); - -/*!\fn int32_t mult_cpx_vector_add(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift) -This function performs optimized componentwise multiplication of two Q1.15 vectors. The output IS ADDED TO y. WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y. - -@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)| -@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param N Length of Vector WARNING: N>=4 -@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!! - -The function implemented is : \f$\mathbf{y} += \mathbf{x_1}\odot\mathbf{x_2}\f$ -*/ - -int32_t mult_cpx_vector_add(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N, - int32_t output_shift); - - -int32_t mult_cpx_vector_h_add32(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N, - int16_t sign); - -int32_t mult_cpx_vector_add32(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N); - -int32_t mult_vector32(int16_t *x1, - int16_t *x2, +int rotate_cpx_vector(int16_t *x, + int16_t *alpha, int16_t *y, - uint32_t N); - -int32_t mult_vector32_scalar(int16_t *x1, - int32_t x2, - int16_t *y, - uint32_t N); - -int32_t mult_cpx_vector32_conj(int16_t *x, - int16_t *y, - uint32_t N); - -int32_t mult_cpx_vector32_real(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N); - -int32_t shift_and_pack(int16_t *y, - uint32_t N, - int32_t output_shift); - -/*!\fn int32_t mult_cpx_vector_h(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift,int16_t sign) -This function performs optimized componentwise multiplication of the vector x1 with the conjugate of the vector x2. The output IS ADDED TO y. WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y. - -@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param x2 Input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param N Length of Vector (complex samples) WARNING: N>=4 -@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!! -@param sign +1..add, -1..substract - -The function implemented is : \f$\mathbf{y} = \mathbf{y} + \mathbf{x_1}\odot\mathbf{x_2}^*\f$ -*/ -int32_t mult_cpx_vector_h(int16_t *x1, - int16_t *x2, - int16_t *y, - uint32_t N, - int32_t output_shift, - int16_t sign); - -/*!\fn int32_t mult_cpx_matrix_h(int16_t *x1[2][2],int16_t *x2[2][2],int16_t *y[2][2],uint32_t N,uint16_t output_shift,int16_t hermitian) -This function performs optimized componentwise matrix multiplication of the 2x2 matrices x1 with the 2x2 matrices x2. The output IS ADDED TO y (i.e. make sure y is initilized correctly). WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y. - -@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param x2 Input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param N Length of Vector (complex samples) WARNING: N>=4 -@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!! -@param hermitian if !=0 the hermitian transpose is returned (i.e. A^H*B instead of A*B^H) -*/ -int32_t mult_cpx_matrix_h(int16_t *x1[2][2], - int16_t *x2[2][2], - int16_t *y[2][2], - uint32_t N, - uint16_t output_shift, - int16_t hermitian); + uint32_t N, + uint16_t output_shift); -/*!\fn int32_t mult_cpx_matrix_vector(int32_t *x1[2][2],int32_t *x2[2],int32_t *y[2],uint32_t N,uint16_t output_shift) -This function performs optimized componentwise matrix-vector multiplication of the 2x2 matrices x1 with the 2x1 vectors x2. The output IS ADDED TO y (i.e. make sure y is initilized correctly). WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y. -@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| -@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)| -@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| WARNING: y must be different for x2 -@param N Length of Vector (complex samples) WARNING: N>=4 -@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!! -*/ -int32_t mult_cpx_matrix_vector(int32_t *x1[2][2], - int32_t *x2[2], - int32_t *y[2], - uint32_t N, - uint16_t output_shift); /*!\fn void init_fft(uint16_t size,uint8_t logsize,uint16_t *rev) \brief Initialize the FFT engine for a given size @@ -289,6 +113,25 @@ int32_t mult_cpx_matrix_vector(int32_t *x1[2][2], @param rev Pointer to bit-reversal permutation array */ +//cmult_vv.c +/*! + Multiply elementwise the complex conjugate of x1 with x2. + @param x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + We assume x1 with a dinamic of 15 bit maximum + @param x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + We assume x2 with a dinamic of 14 bit maximum + @param y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + @param N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; + @param output_shift - shift to be applied to generate output +*/ + +int mult_cpx_conj_vector(int16_t *x1, + int16_t *x2, + int16_t *y, + uint32_t N, + int output_shift); + +// lte_dfts.c void init_fft(uint16_t size, uint8_t logsize, uint16_t *rev); @@ -355,6 +198,7 @@ int32_t rotate_cpx_vector(int16_t *x, uint16_t output_shift); +//cadd_sv.c /*!\fn int32_t add_cpx_vector(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N) This function performs componentwise addition of a vector with a complex scalar. diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h index a3df897053..3e621ac281 100644 --- a/openair1/PHY/TOOLS/time_meas.h +++ b/openair1/PHY/TOOLS/time_meas.h @@ -26,6 +26,9 @@ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE *******************************************************************************/ +#ifndef __TIME_MEAS_DEFS__H__ +#define __TIME_MEAS_DEFS__H__ + #include #include #include @@ -148,3 +151,4 @@ static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts) dst_ts->max=src_ts->max; } } +#endif From 38d8a7cde079a17caf6e7b8b20e0facefab27de0 Mon Sep 17 00:00:00 2001 From: Aikaterini Date: Fri, 19 Feb 2016 13:11:02 +0100 Subject: [PATCH 078/122] add config file for usrpb210@band13 --- .../CONF/enb.band13.tm1.usrpb210.conf | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf new file mode 100644 index 0000000000..69d8536217 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf @@ -0,0 +1,171 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "95"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 13; + downlink_frequency = 751000000L; + uplink_frequency_offset = 31000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 100; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -15; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -86; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.62"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); From f261adc74fcc427afabcaeba43b5c90358d6790a Mon Sep 17 00:00:00 2001 From: Aikaterini Date: Fri, 19 Feb 2016 13:30:20 +0100 Subject: [PATCH 079/122] add config file for rrh+usrp@band13 --- .../CONF/enb.band13.tm1.rrh.usrpb210.conf | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.rrh.usrpb210.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.rrh.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.rrh.usrpb210.conf new file mode 100644 index 0000000000..98226144ab --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.rrh.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "95"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 13; + downlink_frequency = 751000000L; + uplink_frequency_offset = 31000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 100; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -15; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -86; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.62"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + +rrh_gw_config = ( + { + local_if_name = "eth0"; + #remote_address = "169.254.10.158"; + #local_address = "169.254.8.15"; + remote_address = "74:d4:35:cc:88:45"; + local_address = "98:90:96:df:66:07"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw"; + rf_preference = "usrp_b200"; + iq_txshift = 5; + tx_sample_advance = 70; + tx_scheduling_advance = 9; + +} +); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); From eb48479b37b28d8a82689a017771771beba78615 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Fri, 19 Feb 2016 15:12:41 +0100 Subject: [PATCH 080/122] check the rf_config_file name, and ignore if it is null --- targets/RT/USER/rrh_gw.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/targets/RT/USER/rrh_gw.c b/targets/RT/USER/rrh_gw.c index 3def754e3d..8084644b85 100644 --- a/targets/RT/USER/rrh_gw.c +++ b/targets/RT/USER/rrh_gw.c @@ -299,11 +299,17 @@ static void get_options(int argc, char *argv[]) { loopback_flag=1; break; case 'f': - if (strlen(optarg)<=1024) - strcpy(rf_config_file,optarg); - else { - printf("Configuration filename is too long\n"); - exit(-1); + if (optarg){ + if ((strcmp("null", optarg) == 0) || (strcmp("NULL", optarg) == 0)) { + printf("no configuration filename is provided\n"); + } + else if (strlen(optarg)<=1024){ + // rf_config_file = strdup(optarg); + strcpy(rf_config_file,optarg); + }else { + printf("Configuration filename is too long\n"); + exit(-1); + } } break; case 't': From 38159dfc14f816516e462794fd8d37bce7581414 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 19 Feb 2016 17:15:31 +0100 Subject: [PATCH 081/122] improving sudo usage in build script --- cmake_targets/autotests/run_exec_autotests.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake_targets/autotests/run_exec_autotests.bash b/cmake_targets/autotests/run_exec_autotests.bash index a622b07efb..4608c58e9b 100755 --- a/cmake_targets/autotests/run_exec_autotests.bash +++ b/cmake_targets/autotests/run_exec_autotests.bash @@ -12,7 +12,7 @@ trap handle_ctrl_c INT source $OPENAIR_DIR/cmake_targets/tools/test_helper -#SUDO="sudo -E " +SUDO="sudo -E -S" tdir=$OPENAIR_DIR/cmake_targets/autotests rm -fr $tdir/bin mkdir -p $tdir/bin @@ -509,7 +509,7 @@ for search_expr in "${test_case_array[@]}" if [ "$class" == "compilation" ]; then test_compile "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags" elif [ "$class" == "execution" ]; then - $SUDO killall -q oaisim_nos1 + echo \'passwd\' | $SUDO killall -q oaisim_nos1 test_compile_and_run "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags" "$mypassword" "$test_config_file" else echo "Unexpected class of test case...Skipping the test case $name ...." From c32e5544e2339d6fd683247d290c7680cd043b8f Mon Sep 17 00:00:00 2001 From: gauthier Date: Sat, 20 Feb 2016 18:20:44 +0100 Subject: [PATCH 082/122] Make it compile on 15.10 (problem with gcc-xml not resolved, may be do as in openair-cn: disable it, it is only needed for ITTI ANALYZER) --- cmake_targets/CMakeLists.txt | 1 - openair2/COMMON/commonDef.h | 19 ++++++++++++------- openair2/LAYER2/RLC/rlc.h | 2 ++ openair2/UTIL/OCG/OCG_parse_XML.c | 4 ---- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index a88eb69991..1c8f3d221e 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1110,7 +1110,6 @@ add_library(CN_UTILS ${OPENAIR3_DIR}/UTILS/conversions.c ${OPENAIR3_DIR}/UTILS/enum_string.c ${OPENAIR3_DIR}/UTILS/log.c - ${OPENAIR3_DIR}/UTILS/mme_config.c ${OPENAIR3_DIR}/UTILS/mcc_mnc_itu.c ) diff --git a/openair2/COMMON/commonDef.h b/openair2/COMMON/commonDef.h index e33e64ec06..64216b0094 100644 --- a/openair2/COMMON/commonDef.h +++ b/openair2/COMMON/commonDef.h @@ -48,7 +48,19 @@ Description Contains global common definitions #include #include +#include +typedef signed char boolean_t; + +#if !defined(TRUE) +#define TRUE (boolean_t)0x01 +#endif + +#if !defined(FALSE) +#define FALSE (boolean_t)0x00 +#endif + +#define BOOL_NOT(b) (b^TRUE) #define NAS_UE_ID_FMT "0x%06x" @@ -59,13 +71,6 @@ Description Contains global common definitions #define RETURNok (0) #define RETURNerror (-1) -#ifndef FALSE -#define FALSE (0) -#endif -#ifndef TRUE -#define TRUE (1) -#endif - /* * Name of the environment variable which defines the default directory * where the NAS application is executed and where are located files diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h index 392ae88cf8..72fde0b746 100755 --- a/openair2/LAYER2/RLC/rlc.h +++ b/openair2/LAYER2/RLC/rlc.h @@ -60,6 +60,8 @@ # include "DRB-ToAddModList.h" # include "SRB-ToAddMod.h" # include "SRB-ToAddModList.h" +# include "DRB-ToReleaseList.h" + #ifdef Rel10 #include "PMCH-InfoList-r9.h" #endif diff --git a/openair2/UTIL/OCG/OCG_parse_XML.c b/openair2/UTIL/OCG/OCG_parse_XML.c index 5397cdbd98..0100d742e1 100644 --- a/openair2/UTIL/OCG/OCG_parse_XML.c +++ b/openair2/UTIL/OCG/OCG_parse_XML.c @@ -51,10 +51,6 @@ #include "UTIL/OPT/opt.h" /*----------------------------------------------------------------------------*/ -#ifndef HAVE_STRNDUP -char * strndup (const char *s, size_t size); -#endif - static int oai_emulation_; /*!< \brief indicating that the parsing position is now within OAI_Emulation_*/ static int environment_system_config_; /*!< \brief indicating that the parsing position is now within Envi_Config_*/ From 3af10bca146ee7bef52d60f21c8dcfaa35a05f3c Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sun, 21 Feb 2016 14:46:15 +0100 Subject: [PATCH 083/122] config files for band13 --- ...sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini | 1128 +++++++++++++++++ .../CONF/enb.band13.tm1.50PRB.lmssdr.conf | 171 +++ .../CONF/enb.band13.tm1.lmssdr.conf | 171 +++ .../CONF/enb.band7.tm1.50PRB.lmssdr.conf | 4 +- 4 files changed, 1472 insertions(+), 2 deletions(-) create mode 100644 targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini new file mode 100644 index 0000000000..a0793ad395 --- /dev/null +++ b/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini @@ -0,0 +1,1128 @@ +[reference_clocks] +sxr_ref_clk_mhz=30.72 +sxt_ref_clk_mhz=30.72 +[lms7002_registers_b] +0x03A0=0x0000 +0x054E=0x0000 +0x02D0=0x0000 +0x0386=0x0000 +0x054F=0x0000 +0x0389=0x0000 +0x040F=0x0000 +0x04E3=0x0000 +0x0385=0x0000 +0x0315=0x0000 +0x0384=0x0000 +0x0382=0x0000 +0x0288=0x0000 +0x0381=0x0000 +0x0366=0x0000 +0x0365=0x0000 +0x0364=0x0000 +0x0325=0x0000 +0x035E=0x0000 +0x035D=0x0000 +0x0442=0x0000 +0x0452=0x0000 +0x0299=0x0000 +0x0359=0x0000 +0x029D=0x0000 +0x04A3=0x0000 +0x040E=0x0000 +0x0316=0x0000 +0x030D=0x0000 +0x0356=0x0000 +0x0348=0x0000 +0x0498=0x0000 +0x0490=0x0000 +0x02CD=0x0000 +0x050D=0x0000 +0x0353=0x0000 +0x0351=0x0000 +0x048F=0x0000 +0x0445=0x0000 +0x0350=0x0000 +0x03A6=0x0000 +0x0293=0x0000 +0x034E=0x0000 +0x035C=0x0000 +0x034D=0x0000 +0x034B=0x0000 +0x011A=0x2E02 +0x0455=0x0000 +0x034A=0x0000 +0x035B=0x0000 +0x0505=0x0000 +0x0345=0x0000 +0x035F=0x0000 +0x0597=0x0000 +0x0586=0x0000 +0x0484=0x0000 +0x02C8=0x0000 +0x035A=0x0000 +0x0561=0x0000 +0x0344=0x0000 +0x0343=0x0000 +0x0342=0x0000 +0x0380=0x0000 +0x0327=0x0000 +0x025E=0x0000 +0x04DA=0x0000 +0x04C2=0x0000 +0x028C=0x0000 +0x0352=0x0000 +0x059C=0x0000 +0x04DD=0x0000 +0x028A=0x0000 +0x0289=0x0000 +0x031A=0x0000 +0x0363=0x0000 +0x0396=0x0000 +0x0284=0x0000 +0x010C=0x88FD +0x044C=0x0000 +0x0355=0x0000 +0x025C=0x0000 +0x0515=0x0000 +0x0361=0x0000 +0x0205=0x0000 +0x025B=0x0000 +0x04C5=0x0000 +0x04E2=0x0000 +0x025A=0x0000 +0x0256=0x0000 +0x0240=0x0020 +0x0367=0x0000 +0x05A3=0x0000 +0x0502=0x0000 +0x0258=0x0000 +0x0255=0x0000 +0x040C=0x0000 +0x028B=0x0000 +0x0253=0x0000 +0x024E=0x0000 +0x0346=0x0000 +0x0280=0x0000 +0x0285=0x0000 +0x024A=0x0000 +0x0261=0x0000 +0x0249=0x0000 +0x04CD=0x0000 +0x040A=0x0000 +0x0556=0x0000 +0x0243=0x0000 +0x051D=0x0000 +0x0494=0x0000 +0x024C=0x0000 +0x02DC=0x0000 +0x038F=0x0000 +0x0241=0x0000 +0x0488=0x0000 +0x0251=0x0000 +0x020B=0x4000 +0x0108=0x9442 +0x04A0=0x0000 +0x0116=0x8180 +0x02CC=0x0000 +0x039A=0x0000 +0x0112=0xC0E6 +0x0307=0x0000 +0x038C=0x0000 +0x0282=0x0000 +0x0321=0x0000 +0x0507=0x0000 +0x0483=0x0000 +0x0201=0x07FF +0x02E1=0x0000 +0x0517=0x0000 +0x0481=0x0000 +0x02D5=0x0000 +0x0259=0x0000 +0x0527=0x0000 +0x02DD=0x0000 +0x0209=0x0000 +0x0297=0x0000 +0x0400=0x0081 +0x0104=0x0088 +0x0103=0x0A12 +0x0347=0x0000 +0x02D8=0x0000 +0x0457=0x0000 +0x0306=0x0000 +0x02D1=0x0000 +0x04C8=0x0000 +0x0546=0x0000 +0x0440=0x0020 +0x045E=0x0000 +0x031D=0x0000 +0x039C=0x0000 +0x02D2=0x0000 +0x010E=0x2040 +0x02A0=0x0000 +0x0544=0x0000 +0x029C=0x0000 +0x055A=0x0000 +0x0295=0x0000 +0x02CF=0x0000 +0x04D1=0x0000 +0x0291=0x0000 +0x02DF=0x0000 +0x0290=0x0000 +0x020A=0x0080 +0x0102=0x3180 +0x0120=0xB9FF +0x0388=0x0000 +0x0318=0x0000 +0x02A7=0x0000 +0x0200=0x0081 +0x0594=0x0000 +0x02C5=0x0000 +0x028D=0x0000 +0x02A1=0x0000 +0x0362=0x0000 +0x038A=0x0000 +0x0395=0x0000 +0x058D=0x0000 +0x02D7=0x0000 +0x0305=0x0000 +0x0393=0x0000 +0x0398=0x0000 +0x0408=0x0000 +0x039B=0x0000 +0x049E=0x0000 +0x02DB=0x0000 +0x0357=0x0000 +0x02C2=0x0000 +0x0514=0x0000 +0x051C=0x0000 +0x03A2=0x0000 +0x03A4=0x0000 +0x03A3=0x0000 +0x0493=0x0000 +0x0454=0x0000 +0x0448=0x0000 +0x0397=0x0000 +0x02E3=0x0000 +0x049C=0x0000 +0x040D=0x0000 +0x0281=0x0000 +0x048C=0x0000 +0x049A=0x0000 +0x0119=0x18CB +0x010F=0x3042 +0x02A6=0x0000 +0x0257=0x0000 +0x04D6=0x0000 +0x04A6=0x0000 +0x0324=0x0000 +0x038E=0x0000 +0x02E7=0x0000 +0x034F=0x0000 +0x04E0=0x0000 +0x0123=0x267B +0x0497=0x0000 +0x0459=0x0000 +0x0394=0x0000 +0x04A5=0x0000 +0x04D9=0x0000 +0x0304=0x0000 +0x04D5=0x0000 +0x0508=0x0000 +0x0443=0x0000 +0x0301=0x0000 +0x0548=0x0000 +0x04D2=0x0000 +0x0592=0x0000 +0x0591=0x0000 +0x04C7=0x0000 +0x049D=0x0000 +0x029A=0x0000 +0x051F=0x0000 +0x0309=0x0000 +0x0585=0x0000 +0x03A5=0x0000 +0x02D3=0x0000 +0x0451=0x0000 +0x0390=0x0000 +0x0562=0x0000 +0x02C4=0x0000 +0x029E=0x0000 +0x031E=0x0000 +0x04C0=0x0000 +0x04DC=0x0000 +0x04DE=0x0000 +0x058B=0x0000 +0x04DB=0x0000 +0x04D0=0x0000 +0x0492=0x0000 +0x04A1=0x0000 +0x054B=0x0000 +0x02C7=0x0000 +0x05A0=0x0000 +0x044B=0x0000 +0x0100=0x3409 +0x04CA=0x0000 +0x0446=0x0000 +0x02E4=0x0000 +0x04E4=0x0000 +0x04C3=0x0000 +0x0496=0x0000 +0x04CF=0x0000 +0x025F=0x0000 +0x04D4=0x0000 +0x0504=0x0000 +0x04CE=0x0000 +0x02DE=0x0000 +0x0399=0x0000 +0x050C=0x0000 +0x02A5=0x0000 +0x04CC=0x0000 +0x03A1=0x0000 +0x04E1=0x0000 +0x02A2=0x0000 +0x040B=0x7FFF +0x0283=0x0000 +0x048E=0x0000 +0x0580=0x0000 +0x0409=0x0000 +0x039F=0x0000 +0x0248=0x0000 +0x048B=0x0000 +0x0358=0x0000 +0x0589=0x0000 +0x038D=0x0000 +0x0487=0x0000 +0x0510=0x0000 +0x0302=0x0000 +0x0486=0x0000 +0x045F=0x0000 +0x0480=0x0000 +0x0567=0x0000 +0x02DA=0x0000 +0x045A=0x0000 +0x0254=0x0000 +0x0405=0x0000 +0x0387=0x0000 +0x0458=0x0000 +0x0314=0x0000 +0x0360=0x0000 +0x0559=0x0000 +0x0456=0x0000 +0x0453=0x0000 +0x02E2=0x0000 +0x044D=0x0000 +0x0441=0x0000 +0x02C3=0x0000 +0x04C1=0x0000 +0x04D3=0x0000 +0x0444=0x0000 +0x0207=0x0000 +0x04C6=0x0000 +0x0296=0x0000 +0x0555=0x0000 +0x0349=0x0000 +0x0109=0x61C1 +0x04A2=0x0000 +0x0447=0x0000 +0x0460=0x0000 +0x048D=0x0000 +0x059A=0x0000 +0x0407=0x0000 +0x02C0=0x0000 +0x0499=0x0000 +0x0543=0x0000 +0x04C9=0x0000 +0x02CA=0x0000 +0x0404=0x0000 +0x0560=0x0000 +0x02C1=0x0000 +0x04D8=0x0000 +0x0403=0x0000 +0x0491=0x0000 +0x029B=0x0000 +0x04C4=0x0000 +0x010D=0x009E +0x0402=0x07FF +0x055E=0x0000 +0x03A7=0x0000 +0x0520=0x0000 +0x0392=0x0000 +0x030B=0x0000 +0x0588=0x0000 +0x0308=0x0000 +0x048A=0x0000 +0x044A=0x0000 +0x04A4=0x0000 +0x0300=0x0000 +0x0587=0x0000 +0x044E=0x0000 +0x055B=0x0000 +0x02E5=0x0000 +0x0114=0x008D +0x0323=0x0000 +0x0320=0x0000 +0x0503=0x0000 +0x0513=0x0000 +0x0319=0x0000 +0x0260=0x0000 +0x0549=0x0000 +0x0552=0x0000 +0x0509=0x0000 +0x0521=0x0000 +0x0286=0x0000 +0x04D7=0x0000 +0x059E=0x0000 +0x058F=0x0000 +0x0557=0x0000 +0x0322=0x0000 +0x059B=0x0000 +0x049F=0x0000 +0x0522=0x0000 +0x0545=0x0000 +0x0551=0x0000 +0x0312=0x0000 +0x055D=0x0000 +0x0298=0x0000 +0x055F=0x0000 +0x011D=0x9555 +0x039E=0x0000 +0x0547=0x0000 +0x0598=0x0000 +0x0449=0x0000 +0x0564=0x0000 +0x0242=0x0000 +0x0525=0x0000 +0x0523=0x0000 +0x0565=0x0000 +0x0124=0x0000 +0x0563=0x0000 +0x024D=0x0000 +0x05A5=0x0000 +0x0566=0x0000 +0x030A=0x0000 +0x029F=0x0000 +0x054C=0x0000 +0x0582=0x0000 +0x0599=0x0000 +0x0511=0x0000 +0x0506=0x0000 +0x0595=0x0000 +0x0584=0x0000 +0x058C=0x0000 +0x05A6=0x0000 +0x051E=0x0000 +0x050F=0x0000 +0x0590=0x0000 +0x0596=0x0000 +0x05A7=0x0000 +0x058A=0x0000 +0x059D=0x0000 +0x0485=0x0000 +0x0581=0x0000 +0x045D=0x0000 +0x0245=0x0000 +0x0310=0x0000 +0x058E=0x0000 +0x05A2=0x0000 +0x054D=0x0000 +0x020C=0x7FFF +0x031F=0x0000 +0x0292=0x0000 +0x059F=0x0000 +0x0583=0x0000 +0x0317=0x0000 +0x0244=0x0000 +0x0554=0x0000 +0x0593=0x0000 +0x05A4=0x0000 +0x02A3=0x0000 +0x0553=0x0000 +0x0542=0x0000 +0x0519=0x0000 +0x024F=0x0000 +0x0524=0x0000 +0x0518=0x0000 +0x0354=0x0000 +0x0526=0x0000 +0x031B=0x0000 +0x050E=0x0000 +0x0516=0x0000 +0x02CB=0x0000 +0x0250=0x0000 +0x031C=0x0000 +0x028F=0x0000 +0x051A=0x0000 +0x055C=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x04E7=0x0000 +0x04E6=0x0000 +0x04E5=0x0000 +0x0512=0x0000 +0x0206=0x0000 +0x0550=0x0000 +0x030E=0x0000 +0x0203=0x0000 +0x0482=0x0000 +0x0541=0x0000 +0x0122=0x033F +0x0110=0x0BF4 +0x0204=0x0000 +0x0252=0x0000 +0x011E=0x05DC +0x049B=0x0000 +0x0294=0x0000 +0x011C=0xAD41 +0x02D6=0x0000 +0x0311=0x0000 +0x0117=0x280C +0x02A4=0x0000 +0x0540=0x0000 +0x02E0=0x0000 +0x0118=0x018C +0x0489=0x0000 +0x04A7=0x0000 +0x0101=0x7800 +0x0558=0x0000 +0x02C6=0x0000 +0x05A1=0x0000 +0x02C9=0x0000 +0x039D=0x0000 +0x0500=0x0000 +0x0450=0x0000 +0x011F=0x3680 +0x030C=0x0000 +0x04DF=0x0000 +0x0106=0x3182 +0x028E=0x0000 +0x0326=0x0000 +0x0113=0x03C3 +0x04CB=0x0000 +0x0391=0x0000 +0x0105=0x0007 +0x02D9=0x0000 +0x02CE=0x0000 +0x044F=0x0000 +0x038B=0x0000 +0x02D4=0x0000 +0x0107=0x318C +0x0495=0x0000 +0x0246=0x0000 +0x0303=0x0000 +0x02E6=0x0000 +0x045B=0x0000 +0x0340=0x0000 +0x0208=0x0070 +0x0111=0x0083 +0x0247=0x0000 +0x024B=0x0000 +0x045C=0x0000 +0x0383=0x0000 +0x0202=0x07FF +0x054A=0x0000 +0x0401=0x07FF +0x0341=0x0000 +0x0287=0x0000 +0x034C=0x0000 +0x0501=0x0000 +0x030F=0x0000 +0x025D=0x0000 +0x0406=0x0000 +0x0313=0x0000 +0x010A=0x104C +0x0461=0x0000 +0x051B=0x0000 +0x0121=0x356A +0x0115=0x0009 +[lms7002_registers_a] +0x0107=0x318C +0x02D4=0x0000 +0x0082=0x8001 +0x0209=0x0000 +0x02CA=0x0000 +0x04C9=0x0000 +0x0120=0xB9FF +0x0388=0x0000 +0x029D=0x0000 +0x04A3=0x0000 +0x0208=0x0170 +0x0340=0x0000 +0x0094=0x0000 +0x0244=0x0000 +0x0317=0x0000 +0x00A9=0x8000 +0x0115=0x0009 +0x039A=0x0000 +0x0112=0x3171 +0x048C=0x0000 +0x0023=0x5550 +0x0587=0x1D10 +0x04C0=0x0000 +0x031E=0x0000 +0x0205=0x0000 +0x0361=0x0000 +0x051F=0xAB08 +0x029A=0x0000 +0x0396=0x0000 +0x0284=0x0000 +0x02CE=0x0000 +0x02D9=0x0000 +0x038B=0x0000 +0x044F=0x0000 +0x0367=0x0000 +0x0240=0x0028 +0x05A3=0x0000 +0x0105=0x0007 +0x009B=0x6565 +0x0400=0x0101 +0x02DB=0x0000 +0x0357=0x0000 +0x0104=0x0088 +0x0103=0x0A12 +0x0457=0x0000 +0x0347=0x0000 +0x02D8=0x0000 +0x010C=0x8865 +0x0086=0x4101 +0x0202=0x0794 +0x0383=0x0000 +0x020B=0x4000 +0x0108=0xFC26 +0x0098=0x0000 +0x0117=0x100C +0x0027=0x05E4 +0x00A7=0x6565 +0x024A=0x0000 +0x0029=0x0101 +0x00AD=0x03FF +0x0540=0x5009 +0x02A4=0x0000 +0x02DE=0x0000 +0x002E=0x0000 +0x0261=0x0000 +0x00AB=0x0040 +0x0564=0x0000 +0x00A8=0x0000 +0x0517=0xC89D +0x0481=0x0000 +0x02C1=0x0000 +0x0301=0x0000 +0x00A5=0x6565 +0x0515=0x2E45 +0x025C=0x0000 +0x009F=0x658C +0x0519=0x4049 +0x054B=0xF7A3 +0x02C7=0x0000 +0x038C=0x0000 +0x0307=0x0000 +0x0282=0x0000 +0x0289=0x0000 +0x011C=0xAD41 +0x0562=0xF524 +0x0025=0x0101 +0x02CC=0x0000 +0x0116=0x8180 +0x0597=0xFDFB +0x035F=0x0000 +0x002F=0x3840 +0x0589=0xEA5F +0x00A2=0x6565 +0x0099=0x6565 +0x0310=0x0000 +0x040C=0x40F8 +0x028B=0x0000 +0x0253=0x0000 +0x00AC=0x2000 +0x002D=0xFFFF +0x00A6=0x0001 +0x054D=0xF7A3 +0x002C=0x0000 +0x0249=0x0000 +0x04CD=0x0000 +0x0401=0x07FF +0x00A4=0x6565 +0x054A=0x8184 +0x038F=0x0000 +0x008C=0x267B +0x0241=0x0000 +0x0356=0x0000 +0x00A1=0x6565 +0x0260=0x0000 +0x0453=0x0000 +0x008A=0x0491 +0x048F=0x0000 +0x0445=0x0000 +0x0350=0x0000 +0x00AA=0x0000 +0x034C=0x0000 +0x0501=0xFDFB +0x0490=0x0000 +0x02CD=0x0000 +0x050D=0x0F45 +0x0353=0x0000 +0x0024=0x50D8 +0x04E5=0x0000 +0x0512=0x196B +0x0247=0x0000 +0x045C=0x0000 +0x024B=0x0000 +0x0395=0x0000 +0x011F=0x3680 +0x039D=0x0000 +0x0500=0xF61D +0x02C9=0x0000 +0x05A1=0x0000 +0x02A6=0x0000 +0x0119=0x18DF +0x010F=0x3042 +0x04CB=0x0000 +0x0391=0x0000 +0x0113=0x03C3 +0x0326=0x0000 +0x028E=0x0000 +0x0106=0x3182 +0x0524=0x3347 +0x009D=0x6565 +0x0294=0x0000 +0x0026=0x0101 +0x0110=0x0BFF +0x0122=0x033F +0x0381=0x0000 +0x009C=0x658C +0x05A0=0x0000 +0x0482=0x0000 +0x030E=0x0000 +0x0203=0x2F99 +0x0095=0x0000 +0x0111=0x0099 +0x0256=0x0000 +0x0089=0x0048 +0x0085=0x0001 +0x0088=0x04F0 +0x0459=0x0000 +0x0394=0x0000 +0x010E=0x0285 +0x02A0=0x0000 +0x002B=0x4032 +0x039C=0x0000 +0x02D2=0x0000 +0x0581=0xC89D +0x045D=0x0000 +0x0245=0x0000 +0x002A=0x0086 +0x0118=0x018C +0x02E0=0x0000 +0x0489=0x0000 +0x04A7=0x0000 +0x039E=0x0000 +0x011D=0x2AAA +0x02E1=0x0000 +0x0259=0x0000 +0x02D5=0x0000 +0x051D=0x4F91 +0x0243=0x0000 +0x0556=0xA2B5 +0x040A=0x1000 +0x05A2=0x0000 +0x020C=0x8000 +0x020A=0x0080 +0x0102=0x3180 +0x034F=0x0000 +0x0303=0x0000 +0x0306=0x0000 +0x0255=0x0000 +0x0300=0x0000 +0x044E=0x0000 +0x0309=0x0000 +0x0585=0xDAA2 +0x0527=0xACB9 +0x044A=0x0000 +0x04A4=0x0000 +0x048A=0x0000 +0x0392=0x0000 +0x030B=0x0000 +0x05A7=0x0000 +0x0252=0x0000 +0x0204=0xC016 +0x0308=0x0000 +0x0588=0xE6C7 +0x0321=0x0000 +0x0507=0xFCFE +0x0312=0x0000 +0x050B=0xF5EF +0x0360=0x0000 +0x0021=0x0E9F +0x04C2=0x0000 +0x030D=0x0000 +0x040E=0x0003 +0x0316=0x0000 +0x031F=0x0000 +0x030C=0x0000 +0x04DF=0x0000 +0x0318=0x0000 +0x0250=0x0000 +0x02CB=0x0000 +0x045E=0x0000 +0x0440=0x0024 +0x031D=0x0000 +0x058D=0xF5EF +0x02D7=0x0000 +0x0380=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0566=0x0906 +0x0345=0x0000 +0x049C=0x0000 +0x02E3=0x0000 +0x0397=0x0000 +0x035B=0x0000 +0x0505=0x00D8 +0x028D=0x0000 +0x02A1=0x0000 +0x028F=0x0000 +0x031C=0x0000 +0x031A=0x0000 +0x0363=0x0000 +0x0596=0x0A94 +0x0354=0x0000 +0x0518=0xEFF2 +0x035C=0x0000 +0x034D=0x0000 +0x0344=0x0000 +0x0561=0xAB08 +0x0096=0x0000 +0x010D=0x01DC +0x04C4=0x0000 +0x0351=0x0000 +0x0311=0x0000 +0x02D6=0x0000 +0x02D1=0x0000 +0x0546=0x8D44 +0x04C8=0x0000 +0x048B=0x0000 +0x0358=0x0000 +0x0522=0xDB10 +0x049F=0x0000 +0x034A=0x0000 +0x0455=0x0000 +0x0359=0x0000 +0x03A4=0x0000 +0x03A3=0x0000 +0x0341=0x0000 +0x0287=0x0000 +0x04DA=0x0000 +0x025E=0x0000 +0x0580=0xEFF2 +0x0409=0x0000 +0x059A=0x0000 +0x048D=0x0000 +0x0514=0xE7E2 +0x039B=0x0000 +0x0101=0x7800 +0x0558=0x5009 +0x02C6=0x0000 +0x051B=0xB77F +0x0313=0x0000 +0x010A=0x104C +0x0461=0x0000 +0x0406=0x0000 +0x030F=0x0000 +0x025D=0x0000 +0x034B=0x0000 +0x011A=0x2E14 +0x029F=0x0000 +0x030A=0x0000 +0x034E=0x0000 +0x0293=0x0000 +0x03A6=0x0000 +0x0560=0x174B +0x0404=0x0000 +0x00A0=0x6565 +0x0547=0xD7B7 +0x0454=0x0000 +0x0448=0x0000 +0x0327=0x0000 +0x0305=0x0000 +0x0393=0x0000 +0x0510=0xE6C7 +0x0302=0x0000 +0x0486=0x0000 +0x045F=0x0000 +0x0365=0x0000 +0x048E=0x0000 +0x0022=0x07FF +0x0283=0x0000 +0x044B=0x0000 +0x045A=0x0000 +0x02DA=0x0000 +0x04E4=0x0000 +0x02E4=0x0000 +0x03A5=0x0000 +0x040B=0x000F +0x0366=0x0000 +0x0443=0x0000 +0x0508=0xEF99 +0x00A3=0x6565 +0x02E2=0x0000 +0x044D=0x0000 +0x0314=0x0000 +0x0458=0x0000 +0x0493=0x0000 +0x0346=0x0000 +0x024E=0x0000 +0x055E=0xDB10 +0x0402=0x07D9 +0x0384=0x0000 +0x02E6=0x0000 +0x045B=0x0000 +0x0480=0x0000 +0x0567=0x4049 +0x04CA=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0460=0x0000 +0x0559=0xACB9 +0x0456=0x0000 +0x0441=0x0000 +0x0444=0x0000 +0x0390=0x0000 +0x0451=0x0000 +0x049E=0x0000 +0x0324=0x0000 +0x02E7=0x0000 +0x038E=0x0000 +0x0403=0x0013 +0x04D8=0x0000 +0x029B=0x0000 +0x0491=0x0000 +0x03A1=0x0000 +0x04E1=0x0000 +0x02A2=0x0000 +0x051C=0x0000 +0x03A2=0x0000 +0x0407=0x0000 +0x0258=0x0000 +0x0502=0x0A94 +0x038A=0x0000 +0x0362=0x0000 +0x028C=0x0000 +0x0352=0x0000 +0x0385=0x0000 +0x0315=0x0000 +0x040D=0x0000 +0x039F=0x0000 +0x0248=0x0000 +0x0405=0x0000 +0x0254=0x0000 +0x0398=0x0000 +0x0408=0x0000 +0x0487=0x0000 +0x038D=0x0000 +0x035E=0x0000 +0x03A7=0x0000 +0x0520=0x174B +0x0449=0x0000 +0x02C8=0x0000 +0x035A=0x0000 +0x0387=0x0000 +0x0386=0x0000 +0x0452=0x0000 +0x0299=0x0000 +0x0084=0x0400 +0x0498=0x0000 +0x0348=0x0000 +0x02D0=0x0000 +0x054E=0x8184 +0x03A0=0x0000 +0x009A=0x658C +0x055D=0xA6B5 +0x0298=0x0000 +0x0364=0x0000 +0x0081=0x0000 +0x0325=0x0000 +0x040F=0x43E4 +0x04E3=0x0000 +0x050E=0x17DC +0x0516=0x150F +0x0389=0x0000 +0x054F=0x18C9 +0x0304=0x0000 +0x04D5=0x0000 +0x059B=0x0000 +0x0322=0x0000 +0x0442=0x0000 +0x035D=0x0000 +0x0492=0x0000 +0x04A1=0x0000 +0x0382=0x0000 +0x0288=0x0000 +0x0296=0x0000 +0x0555=0xBD96 +0x0349=0x0000 +0x0484=0x0000 +0x0586=0x196B +0x0281=0x0000 +0x0200=0x0301 +0x0594=0xF40D +0x02C5=0x0000 +0x0319=0x0000 +0x0121=0x3652 +0x025B=0x0000 +0x0290=0x0000 +0x02DF=0x0000 +0x0291=0x0000 +0x029C=0x0000 +0x008B=0x2756 +0x02A3=0x0000 +0x05A4=0x0000 +0x02A7=0x0000 +0x0483=0x0000 +0x0201=0x07FF +0x02C2=0x0000 +0x02C4=0x0000 +0x0207=0x0000 +0x04C6=0x0000 +0x0093=0x0000 +0x02D3=0x0000 +0x0494=0x0000 +0x04CF=0x0000 +0x025F=0x0000 +0x0251=0x0000 +0x0488=0x0000 +0x0496=0x0000 +0x04C3=0x0000 +0x0100=0xB409 +0x04CC=0x0000 +0x02A5=0x0000 +0x0257=0x0000 +0x04D6=0x0000 +0x04A6=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x0097=0x0000 +0x011E=0x061D +0x0285=0x0000 +0x0280=0x0000 +0x0020=0xFFFD +0x02DD=0x0000 +0x0297=0x0000 +0x044C=0x0000 +0x0355=0x0000 +0x04A0=0x0000 +0x02CF=0x0000 +0x04D1=0x0000 +0x0526=0xBE2A +0x0092=0x0001 +0x031B=0x0000 +0x0541=0x4C24 +0x0543=0xBD96 +0x02C0=0x0000 +0x0499=0x0000 +0x0513=0xDAA2 +0x0549=0x18C9 +0x0552=0x8D44 +0x0521=0x5852 +0x0509=0x0605 +0x0286=0x0000 +0x024F=0x0000 +0x04E0=0x0000 +0x0545=0x364E +0x0551=0xD7B7 +0x055F=0x5852 +0x009E=0x658C +0x0598=0xF61D +0x0123=0x067B +0x0497=0x0000 +0x04A5=0x0000 +0x0565=0xB77F +0x0124=0x0000 +0x0592=0x0DF1 +0x0591=0xFCFE +0x0548=0x79FA +0x04D2=0x0000 +0x0599=0x0000 +0x0511=0x1D10 +0x0506=0x0DF1 +0x0595=0x00BC +0x0584=0xE7E2 +0x0242=0x0000 +0x025A=0x0000 +0x04E2=0x0000 +0x04C5=0x0000 +0x058C=0xEA50 +0x0450=0x0000 +0x058A=0x17DC +0x059D=0x0000 +0x0485=0x0000 +0x058E=0x1316 +0x0550=0x79FA +0x0554=0x6901 +0x0593=0x00D8 +0x0553=0x364E +0x0542=0xA2B5 +0x0563=0x4F91 +0x024D=0x0000 +0x055A=0xBE2A +0x0295=0x0000 +0x028A=0x0000 +0x059C=0x0000 +0x04DD=0x0000 +0x054C=0x7FFF +0x0582=0x150F +0x0109=0x8CC1 +0x04A2=0x0000 +0x0292=0x0000 +0x0583=0x2E45 +0x059F=0x0000 +0x0525=0x57AC +0x0523=0xA6B5 +0x0206=0x0000 +0x051A=0x0906 +0x055C=0x3347 +0x05A6=0x0000 +0x050F=0xEA5F +0x051E=0xF524 +0x050A=0x1316 +0x04C7=0x0000 +0x049D=0x0000 +0x050C=0xEA50 +0x0087=0x0000 +0x0399=0x0000 +0x0495=0x0000 +0x0246=0x0000 +0x0503=0x00BC +0x0320=0x0000 +0x0323=0x0000 +0x055B=0x57AC +0x0114=0x0110 +0x02E5=0x0000 +0x04E7=0x0000 +0x04D0=0x0000 +0x04E6=0x0000 +0x00AE=0x0000 +0x0544=0x6901 +0x04DE=0x0000 +0x058B=0x0F45 +0x0028=0x0101 +0x029E=0x0000 +0x04DC=0x0000 +0x04D9=0x0000 +0x058F=0x0605 +0x0557=0x4C24 +0x04DB=0x0000 +0x04D7=0x0000 +0x059E=0x0000 +0x024C=0x0000 +0x02DC=0x0000 +0x04D4=0x0000 +0x0504=0xF40D +0x02C3=0x0000 +0x04C1=0x0000 +0x04D3=0x0000 +0x0590=0xEF99 +0x04CE=0x0000 +0x05A5=0x0000 +[file_info] +version=1 +type=lms7002m_minimal_config diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf new file mode 100644 index 0000000000..6b93021426 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf @@ -0,0 +1,171 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "95"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 13; + downlink_frequency = 751000000L; + uplink_frequency_offset = 31000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -20; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.62"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf new file mode 100644 index 0000000000..dacc3e8664 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf @@ -0,0 +1,171 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "95"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 13; + downlink_frequency = 751000000L; + uplink_frequency_offset = 31000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -17; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.62"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth4"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf index e001bd12e9..dae0187f18 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "93"; + mobile_network_code = "95"; ////////// Physical parameters: @@ -132,7 +132,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.171"; + mme_ip_address = ( { ipv4 = "192.168.12.62"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; From 1740b0c517592047d004e42276de24ad77af5f6d Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Sun, 21 Feb 2016 14:25:13 +0000 Subject: [PATCH 084/122] USRP Band 13 --- .../CONF/enb.band13.tm1.usrpb210.conf | 22 +++++++++---------- .../CONF/enb.band7.tm1.usrpb210.conf | 10 ++++----- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf index 69d8536217..f1cd67b196 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf @@ -27,16 +27,16 @@ eNBs = tdd_config = 3; tdd_config_s = 0; prefix_type = "NORMAL"; - eutra_band = 13; - downlink_frequency = 751000000L; - uplink_frequency_offset = 31000000; + eutra_band = 7; + downlink_frequency = 2685000000L; + uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 25; Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 100; + rx_gain = 125; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; @@ -46,7 +46,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -15; + pdsch_referenceSignalPower = -29; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -64,7 +64,7 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -86; + pusch_p0_Nominal = -90; pusch_alpha = "AL1"; pucch_p0_Nominal = -96; msg3_delta_Preamble = 6; @@ -133,7 +133,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.62"; + mme_ip_address = ( { ipv4 = "172.27.8.52"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -142,11 +142,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "172.27.8.51/23"; - ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "172.27.8.51/23"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf index 4a9113282f..f1cd67b196 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "93"; + mobile_network_code = "95"; ////////// Physical parameters: @@ -28,7 +28,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2660000000L; + downlink_frequency = 2685000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 25; @@ -133,7 +133,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; + mme_ip_address = ( { ipv4 = "172.27.8.52"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -143,10 +143,10 @@ eNBs = NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.212/24"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "172.27.8.51/23"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "172.27.8.51/23"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; From 5f3961556d68c0512d155cd4ed196f2b2dbb2d96 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sun, 21 Feb 2016 19:25:30 +0100 Subject: [PATCH 085/122] Update eNB config USRP for band 13 --- .../CONF/enb.band13.tm1.usrpb210.conf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf index f1cd67b196..1bf3c6fbf2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf @@ -27,16 +27,16 @@ eNBs = tdd_config = 3; tdd_config_s = 0; prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2685000000L; - uplink_frequency_offset = -120000000; + eutra_band = 13; + downlink_frequency = 751000000L; + uplink_frequency_offset = 31000000; Nid_cell = 0; - N_RB_DL = 25; + N_RB_DL = 50; Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 125; + rx_gain = 110; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; @@ -46,7 +46,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; + pdsch_referenceSignalPower = -15; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -82,7 +82,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -100; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -168,4 +168,4 @@ eNBs = rrc_log_verbosity ="medium"; }; } -); +); \ No newline at end of file From 1473a3a65242f2e610fedcbaf9d458bb00ef2608 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 25 Feb 2016 14:22:56 -0800 Subject: [PATCH 086/122] applying hotfix for UE exit on DLSCH error to develop --- openair1/SCHED/phy_procedures_lte_ue.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index c746fe7254..afaecb7075 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -2678,18 +2678,18 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) { phy_vars_ue->dlsch_errors[eNB_id]++; - //#ifdef DEBUG_PHY_PROC +#ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n", phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, harq_pid,frame_rx,subframe_prev, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); - - // if (abstraction_flag ==0 ) - dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid); - mac_xface->macphy_exit(""); - //#endif +/* + if (abstraction_flag ==0 ) + dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid); + mac_xface->macphy_exit(""); */ +#endif } else { LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n", phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, From 5d62584c9f587f5f1d3f5d923e3c38cf00d29bb4 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 29 Feb 2016 12:08:11 +0100 Subject: [PATCH 087/122] quickfix of prach_zero_correlation parameter range check in openair2/ENB_APP/enb_config.c it was tested against 63, it should be tested against 15 no impact on processing whatsoever so no need to test --- openair2/ENB_APP/enb_config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 4c532285f2..107ca724fc 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -1019,7 +1019,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->prach_zero_correlation[j] =prach_zero_correlation; - if ((prach_zero_correlation <0) || (prach_zero_correlation > 63)) + if ((prach_zero_correlation <0) || (prach_zero_correlation > 15)) AssertError (0, parse_errors ++, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n", lib_config_file_name_pP, i, prach_zero_correlation); From 661b1db758395b5cffac2b61a72279f549a63826 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 29 Feb 2016 15:12:24 +0100 Subject: [PATCH 088/122] added support for Huawei E398 --- .../tools/configure_cots_bandrich_ue.py | 1 + .../tools/configure_cots_huaweiE398_ue.py | 200 ++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100755 cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py diff --git a/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py b/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py index 6af3785865..99aed7c29f 100755 --- a/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py +++ b/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py @@ -131,6 +131,7 @@ def start_ue () : ip = IPRoute() idx = ip.link_lookup(ifname=iface)[0] os.system ('route add ' + gw + ' ppp0') + os.system('sleep 5') os.system ('ping ' + gw) break except Exception, e: diff --git a/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py b/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py new file mode 100755 index 0000000000..07d532c5d6 --- /dev/null +++ b/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py @@ -0,0 +1,200 @@ +#!/usr/bin/python + +import time +import serial +import os +from pyroute2 import IPRoute +import sys +import re +import threading +import signal +import traceback +import os +import commands + +# configure the serial connections (the parameters differs on the device you are connecting to) +#First we find an open port to work with +serial_port='' +ser=serial.Serial() +openair_dir = os.environ.get('OPENAIR_DIR') +if openair_dir == None: + print "Error getting OPENAIR_DIR environment variable" + sys.exit(1) + +sys.path.append(os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/')) + +from lib_autotest import * + +def find_open_port(): + global serial_port, ser + max_ports=100 + if os.path.exists(serial_port) == True: + return serial_port + for port in range(0,100): + serial_port = '/dev/ttyUSB'+str(port) + if os.path.exists(serial_port) == True: + print 'New Serial Port : ' + serial_port + break + + ser = serial.Serial(port=serial_port) + return + + + +#serial_port = '/dev/ttyUSB2' +bandrich_ppd_config = os.environ.get('OPENAIR_DIR') + '/cmake_targets/autotests/tools/wdial.bandrich.conf' + +exit_flag=0 + +def signal_handler(signal, frame): + print('You pressed Ctrl+C!') + print('Resetting the UE to detached state') + timeout=10 + exit_flag=1 + send_command('AT+CGATT=0' , 'OK' , timeout) + sys.exit(0) + +signal.signal(signal.SIGINT, signal_handler) + + + +#ser.open() +#ser.isOpen() + +class pppThread (threading.Thread): + def __init__(self, threadID, name, counter): + threading.Thread.__init__(self) + self.threadID = threadID + self.name = name + self.counter = counter + def run(self): + print "Starting " + self.name + #Here we keep running pppd thread in indefinite loop as this script terminates sometimes + #while 1: + while 1: + time.sleep(5) #Hard coded, do not reduce this number! + print "Starting wvdial now..." + print 'exit_flag = ' + str(exit_flag) + send_command('AT+CGATT=1','OK', 300) + os.system('wvdial -C ' + bandrich_ppd_config + '' ) + if exit_flag == 1: + print "Exit flag set to true. Exiting pppThread now" + print "Terminating wvdial now..." + +def send_command (cmd, response, timeout): + count=0 + sleep_duration = 1 + print 'In function: send_command: cmd = <' + cmd + '> response: <' + response + '> \n' + global serial_port, ser + while count <= timeout: + try: + #Sometimes the port does not exist coz of reset in modem. + #In that case, we need to search for this port again + if os.path.exists(serial_port) == False: + find_open_port() + ser.write (cmd + '\r\n') + out = '' + time.sleep(sleep_duration) + count = count + sleep_duration + while ser.inWaiting() > 0: + out += ser.read(1) + print 'out = <' + out + '> response = <' + response + '> \n' + if re.search(response, out): + break + except Exception, e: + error = ' cmd : ' + cmd + ' response : ' + response + error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e) + error = error + traceback.format_exc() + print error + + +def start_ue () : + #print 'Enter your commands below.\r\nInsert "exit" to leave the application.' + timeout=60 #timeout in seconds + send_command('AT', 'OK' , timeout) + #send_command('AT+CFUN=1' , 'OK' , timeout) + #send_command('AT+CGATT=0' , 'OK' , timeout) + send_command('AT+CGATT=1','OK', 300) + #os.system('wvdial -C ' + bandrich_ppd_config + ' &' ) + + thread_ppp = pppThread(1, "ppp_thread", 1) + thread_ppp.start() + + iface='ppp0' + + while 1: + time.sleep ( 2) + #Now we check if ppp0 interface is up and running + try: + if exit_flag == 1: + break + ip = IPRoute() + idx = ip.link_lookup(ifname=iface)[0] + os.system ('route add ' + gw + ' ppp0') + os.system('sleep 5') + os.system ('ping ' + gw) + break + except Exception, e: + error = ' Interface ' + iface + 'does not exist...' + error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e) + error = error + traceback.format_exc() + print error + + thread_ppp.join() + +def stop_ue(): + timeout=60 + os.system('killall wvdial') + send_command('AT', 'OK' , timeout) + send_command('AT+CGATT=0' , 'OK|ERROR' , timeout) + #send_command('AT+CFUN=4' , 'OK' , timeout) + + +#reset the USB BUS of Bandrich UE +def reset_ue(): + stringIdBandrich='Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard' + status, out = commands.getstatusoutput('lsusb | grep -i \'' + stringIdBandrich + '\'') + if (out == '') : + print "Bandrich 4G LTE Adapter not found. Exiting now..." + sys.exit() + p=re.compile('Bus\s*(\w+)\s*Device\s*(\w+):\s*ID\s*(\w+):(\w+)') + res=p.findall(out) + BusId=res[0][0] + DeviceId=res[0][1] + VendorId=res[0][2] + ProductId=res[0][3] + usb_dir= find_usb_path(VendorId, ProductId) + print "Bandrich 4G LTE Adapter found in..." + usb_dir + cmd = "sudo sh -c \"echo 0 > " + usb_dir + "/authorized\"" + os.system(cmd + " ; sleep 15" ) + cmd = "sudo sh -c \"echo 1 > " + usb_dir + "/authorized\"" + os.system(cmd + " ; sleep 30" ) + +i=1 +gw='192.172.0.1' +while i < len(sys.argv): + arg=sys.argv[i] + if arg == '--start-ue' : + find_open_port() + print 'Using Serial port : ' + serial_port + start_ue() + elif arg == '--stop-ue' : + find_open_port() + print 'Using Serial port : ' + serial_port + stop_ue() + elif arg == '--reset-ue' : + reset_ue() + elif arg == '-gw' : + gw = sys.argv[i+1] + i=i+1 + elif arg == '-h' : + print "--reset-ue: Reset the UE on USB Bus. Similar to unplugging and plugging the UE" + print "--stop-ue: Stop the UE. Send DETACH command" + print "--start-ue: Start the UE. Send ATTACH command" + print "-gw: Specify the default gw as sometimes the gateway/route arguments are not set properly via wvdial" + else : + print " Script called with wrong arguments, arg = " + arg + sys.exit() + i = i +1 + + From 9764c9247c2949aba1c948c0200011b42c0ac28c Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Mon, 29 Feb 2016 21:40:49 +0100 Subject: [PATCH 089/122] update trx_bladerf_write calls to match the common_lib.h trx_write_func --- .../ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c index 2f73d6978c..065b0bbad2 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c @@ -412,7 +412,7 @@ void calibrate_rf(openair0_device *device) { bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_I,offIold); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_I,offI); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } for (meanI=meanQ=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_Q,offQold); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } // project on fs/4 for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_Q,offQ); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } for (meanI=meanQ=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_PHASE,offphaseold); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } // project on fs/8 (Image of TX signal in +ve frequencies) for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_PHASE,offphase); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } // project on fs/8 (Image of TX signal in +ve frequencies) for (meanI=meanQ=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_GAIN,offgainold); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } // project on fs/8 (Image of TX signal in +ve frequencies) for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_GAIN,offgain); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } // project on fs/8 (Image of TX signal in +ve frequencies) for (meanI=meanQ=i=j=0;idev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_PHASE,offphaseold); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } // project on -3fs/8 (Image of TX signal in -ve frequencies) for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_PHASE,offphase); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } // project on -3fs/8 (Image of TX signal in -ve frequencies) for (meanI=meanQ=i=j=0;idev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_GAIN,offgainold); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0,0); } // project on -3fs/8 (Image of TX signal in +ve frequencies) for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_GAIN,offgain); for (i=0;i<10;i++) { trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0); + trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); } // project on 3fs/8 (Image of TX signal in -ve frequencies) for (meanI=meanQ=i=j=0;ilog_level)); printf("BLADERF: Initializing openair0_device\n"); - device->priv = brf; device->Mod_id = num_devices++; device->type = BLADERF_DEV; device->trx_start_func = trx_brf_start; From 75602a1267b6dda67fe9dfb574f912d4992a37c2 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Mon, 29 Feb 2016 21:45:30 +0100 Subject: [PATCH 090/122] correct tx_shift paremeter in config files for rrh and usrp --- .../CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf | 4 +--- .../CONF/enb.band7.tm1.rrh.usrpb210.conf | 13 ++++++------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf index 604f5567ef..004af14749 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf @@ -150,7 +150,7 @@ rrh_gw_config = ( rrh_gw_active = "yes"; tr_preference = "raw"; rf_preference = "usrp_b200"; - iq_txshift = 5; + iq_txshift = 4; tx_sample_advance = 113; tx_scheduling_advance = 9; @@ -163,8 +163,6 @@ rrh_gw_config = ( ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf index 33db53740c..37880a2906 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -133,7 +133,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.26"; + mme_ip_address = ( { ipv4 = "192.168.12.170"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -145,14 +145,14 @@ rrh_gw_config = ( local_if_name = "eth0"; #remote_address = "169.254.10.158"; #local_address = "169.254.8.15"; - remote_address = "74:d4:35:cc:88:45"; - local_address = "98:90:96:df:66:07"; + remote_address = "74:d4:35:cc:88:e3"; + local_address = "74:d4:35:cc:88:d1"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; tr_preference = "raw"; rf_preference = "usrp_b200"; - iq_txshift = 5; + iq_txshift = 4; tx_sample_advance = 70; tx_scheduling_advance = 9; @@ -162,12 +162,11 @@ rrh_gw_config = ( NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.240/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.240/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; From 8f9b55d79cc8bd7f339ed4cae1510f5a132dd314 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 1 Mar 2016 15:40:01 +0100 Subject: [PATCH 091/122] fix for sudo usage in autotests --- cmake_targets/autotests/run_exec_autotests.bash | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/cmake_targets/autotests/run_exec_autotests.bash b/cmake_targets/autotests/run_exec_autotests.bash index 4608c58e9b..a98a071bae 100755 --- a/cmake_targets/autotests/run_exec_autotests.bash +++ b/cmake_targets/autotests/run_exec_autotests.bash @@ -404,14 +404,12 @@ until [ -z "$1" ] esac done -if [ "$SET_PASSWORD" == "1" ]; then - mypassword=$passwd -else - read -s -p "Enter Password: " mypassword +if [ "$SET_PASSWORD" != "1" ]; then + read -s -p "Enter Password: " passwd fi tmpfile=`mktemp` -echo \'$passwd\' | $SUDO echo $HOME >& $tmpfile +echo $passwd | $SUDO echo $HOME > $tmpfile tstsudo=`cat $tmpfile` if [ "$tstsudo" != "$HOME" ]; then echo "$USER might not have sudo privileges. Exiting" From 86ab3939ab9ff33e0b2baa33bf3cb99f154e4c10 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 1 Mar 2016 16:36:42 +0100 Subject: [PATCH 092/122] xforms now command line option for ulsim and dlsim fixed mbmssim compilation issue one more fix for build script sudo usage --- cmake_targets/build_oai | 4 +- cmake_targets/lte-simulators/CMakeLists.txt | 2 +- openair1/SIMULATION/LTE_PHY/dlsim.c | 66 ++++++++------------- openair1/SIMULATION/LTE_PHY/mbmssim.c | 7 ++- openair1/SIMULATION/LTE_PHY/ulsim.c | 31 +++++----- 5 files changed, 48 insertions(+), 62 deletions(-) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index af298a27c4..821b3bca27 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -760,9 +760,9 @@ fi rm -fr $OPENAIR_DIR/cmake_targets/autotests/log mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log if [ "$RUN_GROUP" -eq "1" ]; then - $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -g "$TEST_CASE_GROUP" -p '$mypassword' >& $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log & + $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -g "$TEST_CASE_GROUP" -p $mypassword >& $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log & else - $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -p '$mypassword' >& $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log & + $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -p $mypassword >& $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log & fi wait else diff --git a/cmake_targets/lte-simulators/CMakeLists.txt b/cmake_targets/lte-simulators/CMakeLists.txt index 7a0e84b425..0b706c8748 100644 --- a/cmake_targets/lte-simulators/CMakeLists.txt +++ b/cmake_targets/lte-simulators/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8) set(PACKAGE_NAME "unitary_tests_simulators") set(PHYSIM True) set(RF_BOARD None) -set(XFORMS False) +set(XFORMS True) set(DEBUG_PHY False) set(MU_RECIEVER False) diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 2c3d0848c2..d67024810a 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -61,25 +61,7 @@ extern unsigned int dlsch_tbs25[27][25],TBStable[27][110]; extern unsigned char offset_mumimo_llr_drange_fix; -#ifdef XFORMS #include "PHY/TOOLS/lte_phy_scope.h" -#endif - - - -//#define AWGN -//#define NO_DCI - - - -//#define ABSTRACTION - -/* - #define RBmask0 0x00fc00fc - #define RBmask1 0x0 - #define RBmask2 0x0 - #define RBmask3 0x0 -*/ PHY_VARS_eNB *PHY_vars_eNB; PHY_VARS_UE *PHY_vars_UE; @@ -237,10 +219,9 @@ int main(int argc, char **argv) short *uncoded_ber_bit=NULL; uint8_t N_RB_DL=25,osf=1; frame_t frame_type = FDD; -#ifdef XFORMS + int xforms=0; FD_lte_phy_scope_ue *form_ue; char title[255]; -#endif uint32_t DLSCH_RB_ALLOC = 0x1fff; int numCCE=0; int dci_length_bytes=0,dci_length=0; @@ -305,7 +286,7 @@ int main(int argc, char **argv) // num_layers = 1; perfect_ce = 0; - while ((c = getopt (argc, argv, "ahdpZDe:Em:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:Y")) != -1) { + while ((c = getopt (argc, argv, "ahdpZDe:Em:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:XY")) != -1) { switch (c) { case 'a': awgn_flag = 1; @@ -557,6 +538,10 @@ int main(int argc, char **argv) break; + case 'X': + xforms=1; + break; + case 'Y': perfect_ce=1; break; @@ -636,21 +621,20 @@ int main(int argc, char **argv) if ((transmission_mode > 1) && (n_tx != 2)) printf("n_tx must be >1 for transmission_mode %d\n",transmission_mode); -#ifdef XFORMS - fl_initialize (&argc, argv, NULL, 0, 0); - form_ue = create_lte_phy_scope_ue(); - sprintf (title, "LTE PHY SCOPE eNB"); - fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - - if (!dual_stream_UE==0) { - openair_daq_vars.use_ia_receiver = 1; - fl_set_button(form_ue->button_0,1); - fl_set_object_label(form_ue->button_0, "IA Receiver ON"); - fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN); + if (xforms==1) { + fl_initialize (&argc, argv, NULL, 0, 0); + form_ue = create_lte_phy_scope_ue(); + sprintf (title, "LTE PHY SCOPE eNB"); + fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); + + if (!dual_stream_UE==0) { + openair_daq_vars.use_ia_receiver = 1; + fl_set_button(form_ue->button_0,1); + fl_set_object_label(form_ue->button_0, "IA Receiver ON"); + fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN); + } } -#endif - if (transmission_mode==5) { n_users = 2; printf("dual_stream_UE=%d\n", dual_stream_UE); @@ -3496,13 +3480,13 @@ PMI_FEEDBACK: // PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round++; } -#ifdef XFORMS - phy_scope_UE(form_ue, - PHY_vars_UE, - eNB_id, - 0,// UE_id - subframe); -#endif + if (xforms==1) { + phy_scope_UE(form_ue, + PHY_vars_UE, + eNB_id, + 0,// UE_id + subframe); + } } //round diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 98d1b68a15..0044b2ff51 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -173,7 +173,9 @@ int main(int argc, char **argv) lte_frame_type_t frame_type = FDD; + uint32_t Nsoft = 1827072; + /* #ifdef XFORMS FD_lte_phy_scope_ue *form_ue; char title[255]; @@ -183,6 +185,7 @@ int main(int argc, char **argv) sprintf (title, "LTE DL SCOPE UE"); fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); #endif + */ logInit(); number_of_cards = 1; @@ -382,14 +385,14 @@ int main(int argc, char **argv) 0); // Create transport channel structures for 2 transport blocks (MIMO) - PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,N_RB_DL,0); + PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0); if (!PHY_vars_eNB->dlsch_eNB_MCH) { printf("Can't get eNB dlsch structures\n"); exit(-1); } - PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); + PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); PHY_vars_eNB->lte_frame_parms.num_MBSFN_config = 1; PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 463c74c123..de40298d58 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -52,9 +52,7 @@ #include "LAYER2/MAC/vars.h" #include "OCG_vars.h" -#ifdef XFORMS #include "PHY/TOOLS/lte_phy_scope.h" -#endif extern unsigned short dftsizes[33]; extern short *ul_ref_sigs[30][2][33]; @@ -74,12 +72,9 @@ node_desc_t *ue_data[NUMBER_OF_UE_MAX]; extern uint16_t beta_ack[16],beta_ri[16],beta_cqi[16]; //extern char* namepointer_chMag ; - - -#ifdef XFORMS +int xforms=0; FD_lte_phy_scope_enb *form_enb; char title[255]; -#endif /*the following parameters are used to control the processing times*/ double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */ @@ -204,7 +199,7 @@ int main(int argc, char **argv) logInit(); - while ((c = getopt (argc, argv, "hapZEbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:L")) != -1) { + while ((c = getopt (argc, argv, "hapZEbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:LF")) != -1) { switch (c) { case 'a': channel_model = AWGN; @@ -454,6 +449,10 @@ int main(int argc, char **argv) max_turbo_iterations=atoi(optarg); break; + case 'F': + xforms=1; + break; + case 'Z': dump_table = 1; break; @@ -594,12 +593,12 @@ int main(int argc, char **argv) } -#ifdef XFORMS - fl_initialize (&argc, argv, NULL, 0, 0); - form_enb = create_lte_phy_scope_enb(); - sprintf (title, "LTE PHY SCOPE eNB"); - fl_show_form (form_enb->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); -#endif + if (xforms==1) { + fl_initialize (&argc, argv, NULL, 0, 0); + form_enb = create_lte_phy_scope_enb(); + sprintf (title, "LTE PHY SCOPE eNB"); + fl_show_form (form_enb->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); + } PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = 14; @@ -1354,9 +1353,9 @@ int main(int argc, char **argv) if ((errs[0]>=100) && (trials>(n_frames/2))) break; -#ifdef XFORMS - phy_scope_eNB(form_enb,PHY_vars_eNB,0); -#endif + if (xforms==1) + phy_scope_eNB(form_enb,PHY_vars_eNB,0); + /*calculate the total processing time for each packet, get the max, min, and number of packets that exceed t>3000us*/ double t_tx = (double)PHY_vars_UE->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; From 9ccc1999bffe17593f7afd5053f7b64ca5f22d97 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 1 Mar 2016 16:55:25 +0100 Subject: [PATCH 093/122] removing old unused files --- targets/RT/USER/dot11.c | 1275 ------------------------ targets/RT/USER/ieee80211p-softmodem.c | 185 ---- 2 files changed, 1460 deletions(-) delete mode 100644 targets/RT/USER/dot11.c delete mode 100644 targets/RT/USER/ieee80211p-softmodem.c diff --git a/targets/RT/USER/dot11.c b/targets/RT/USER/dot11.c deleted file mode 100644 index 00e535a21d..0000000000 --- a/targets/RT/USER/dot11.c +++ /dev/null @@ -1,1275 +0,0 @@ -/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2011 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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 - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - -<<<<<<< .mine -/*! \file dot11.c -* \brief main program to control HW and scheduling for openairITS dot11 MODEM -* \author R. Knopp, F. Kaltenberger -* \date 2012 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ -======= - /*! \file dot11.c - * \brief main program to control HW and scheduling for openairITS dot11 MODEM - * \author R. Knopp, F. Kaltenberger - * \date 2012 - * \version 0.1 - * \company Eurecom - * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr - * \note - * \warning - */ - >>>>>>> .r3153 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "PHY/types.h" -#include "PHY/defs.h" - -#include "ARCH/COMMON/defs.h" -#include "ARCH/CBMIMO1/DEVICE_DRIVER/cbmimo1_device.h" -#include "ARCH/CBMIMO1/DEVICE_DRIVER/cbmimo1_pci.h" -#include "SIMULATION/LTE_PHY/openair_hw.h" - -#include "ARCH/CBMIMO1/DEVICE_DRIVER/vars.h" -#include "SCHED/defs.h" -#include "SCHED/vars.h" - - - <<<<<<< .mine -#include "phy/DOT11/defs.h" -#include "phy/DOT11/commonvars.h" -#include - ======= -#include "phy/DOT11/defs.h" -#include "phy/DOT11/commonvars.h" -#include "PHY/TOOLS/defs.h" - >>>>>>> .r3153 - - <<<<<<< .mine - ======= -#include - >>>>>>> .r3153 - - <<<<<<< .mine -#include "UTIL/LOG/log.h" - ======= - >>>>>>> .r3153 - - <<<<<<< .mine -#define FRAME_LENGTH_SAMPLES_MAX 100000 - - uint16_t rev64[64]; - -int generate_test_tx=0; - - - - -======= -#include "UTIL/LOG/log.h" -#include "ieee80211p-netlinkapi.h" - -#define FRAME_LENGTH_SAMPLES_MAX 100000 - - uint16_t rev64[64]; - -int generate_test_tx=0; - - - - ->>>>>>> .r3153 -#define FRAME_PERIOD 100000000ULL -#define DAQ_PERIOD 66666ULL - - -#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all -enum nl80211_band { - NL80211_BAND_2GHZ, - NL80211_BAND_5GHZ, - NL80211_BAND_5_9GHZ, - NL80211_BAND_0_8GHZ, -}; - -<<<<<<< .mine - -======= - enum ieee80211_band { - IEEE80211_BAND_2GHZ = NL80211_BAND_2GHZ, - IEEE80211_BAND_5GHZ = NL80211_BAND_5GHZ, - IEEE80211_BAND_5_9GHZ = NL80211_BAND_5_9GHZ, - IEEE80211_BAND_0_8GHZ = NL80211_BAND_0_8GHZ, - }; - -struct ieee80211p_rx_status { - short data_len; //frame data length in bytes - char rssi; //received power in dBm - char rate; //reveived data rate in units of 100 kbps - enum ieee80211_band band; - char flags; //RX flags -}; /* struct ieee80211p_rx_status */ - - ->>>>>>> .r3153 -//static CND *cond; - -static int thread1; -static int thread2; - -static int sync_thread; - - -static int instance_cnt=-1; //0 means worker is busy, -1 means its free -int instance_cnt_ptr_kern,*instance_cnt_ptr_user; -int pci_interface_ptr_kern; - -extern unsigned int bigphys_top; -extern unsigned int mem_base; - -int openair_fd = 0; - -int oai_exit = 0; - -//PCI_interface_t *pci_interface[3]; - -unsigned int *DAQ_MBOX; - -unsigned int time_offset[4] = {0,0,0,0}; - -int fs4_test=0; -char UE_flag=0; - -struct timing_info_t { - unsigned int frame, hw_slot, last_slot, next_slot; - RTIME time0, time1, time2; - unsigned int mbox0, mbox1, mbox2, mbox_target; -} timing_info[20]; - -extern s16* sync_corr_ue0; -extern s16 prach_ifft[4][1024*2]; - -typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3} runmode_t; - -runmode_t mode; -int rx_input_level_dBm; - - -int otg_enabled = 0; - -TX_RX_VARS dummy_tx_rx_vars; -unsigned int bigphys_top; -unsigned int mem_base; - -<<<<<<< .mine -uint32_t *txdata[2],*rxdata[2]; - -uint8_t *data_ind = NULL; - -extern int dot11_netlink_init(); -extern void *rx_thread(void *); -extern void *tx_thread(void *); - - -void dot11_init() -{ - - - - set_taus_seed(0); - - // Basic initializations - init_fft(64,6,rev64); - init_interleavers(); - ccodedot11_init(); - ccodedot11_init_inv(); - phy_generate_viterbi_tables(); - - init_crc32(); - -} -======= - uint32_t *txdata[2],*rxdata[2]; ->>>>>>> .r3153 - -<<<<<<< .mine -void generate_test_tx_signal() -{ - ======= - uint8_t *data_ind = NULL; - >>>>>>> .r3153 - - <<<<<<< .mine - TX_VECTOR_t tx_vector; - int i; - - if (data_ind == NULL) { - data_ind = (uint8_t*)malloc(4095+2+1); - data_ind[0] = 0; - data_ind[1] = 0; - } - - - tx_vector.rate=1; - tx_vector.sdu_length=512; - tx_vector.service=0; - - for (i=0; i>>>>>> .r3153 - - extern int32_t rxDATA_F_comp_aggreg3[48*1024]; - extern int32_t rxDATA_F_comp_aggreg2[48*1024]; - -#define FRAME_LENGTH_SAMPLES 76800 -#define RX_THRES 60 - -#define SLOT_DURATION_5MHz 105 -#define RX_THRES_dB 300 - - u32 rxgain[4]= {30,30,30,30}; - unsigned int rxg_max[4]= {133,133,133,133}, rxg_med[4]= {127,127,127,127}, rxg_byp[4]= {120,120,120,120}; - - extern int tx_sdu_active; - extern int tx_sdu_length; - extern char rxsdu[2000]; - int n; - - static void *rx_thread(void *arg) { - - int fd = *((int*)arg); - int rx_offset; - RX_VECTOR_t *rxv; - uint8_t *data_ind_rx; - int i; - struct ieee80211p_rx_status *rs; - int ret,frame; - RT_TASK *task; - int16_t rx_energy; - int initial_sample_offset = 0,off=0; - int dlen,dlen_symb; - int mbox_off = 0,old_mbox,mbox_diff; - int rt_skip_cond; - int pos_crc=0,neg_crc=0; - int sdu_received; - int sample_threshold; - int log2_maxh; - struct sched_param mysched; - int skip=0; - int txlen; - - /* mysched.sched_priority = 99; - - sched_setscheduler( 0, SCHED_FIFO, &mysched); - */ - char dummy_data[16]; - - - if (fd>0) { - printf("rx_thread starting, fd %d\n",fd); - - data_ind_rx = (uint8_t*)malloc(4095+2+1+12); - - task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF); - mlockall(MCL_CURRENT | MCL_FUTURE); - - // rt_make_hard_real_time(); - - - // printf("Started rx_thread ... MBOX %d\n",((unsigned int *)DAQ_MBOX)[0]); - // wait until MBOX gets around to zero - i=0; - - while (((volatile unsigned int *)DAQ_MBOX)[0] != 0) { - rt_sleep(nano2count(10000)); - - if (i>1000) { - printf("HW not counting,exiting rx_thread\n"); - return(0); - } - } - - // printf("Got first MBOX = 0\n"); - // wait for first 120us - while (((unsigned int *)DAQ_MBOX)[0] < 2) - rt_sleep(nano2count(2*66666)); - - old_mbox = ((unsigned int *)DAQ_MBOX)[0]; - - // printf("MBOX = %d\n",((unsigned int *)DAQ_MBOX)[0]); - i = 0; - frame = 0; - // oai_exit=1; - rt_skip_cond=0; - - while (!oai_exit) { - - // printf("While in ... mbox %d\n",((unsigned int *)DAQ_MBOX)[0]); - - rx_energy = dB_fixed_times10(signal_energy((int32_t*)(rxdata[0]+(initial_sample_offset&(~0x1))), - SLOT_DURATION_5MHz - (SLOT_DURATION_5MHz&1))); - - sdu_received = 0; - - if (rx_energy>RX_THRES_dB) { - if (initial_sample_offset < SLOT_DURATION_5MHz) - off = initial_sample_offset + FRAME_LENGTH_SAMPLES - SLOT_DURATION_5MHz; - else - off = initial_sample_offset - SLOT_DURATION_5MHz; - - if (((dot11_state = initial_sync(&rxv, - &rx_offset, - &log2_maxh, - rxdata[0], - FRAME_LENGTH_SAMPLES, - off, - 1)) == BUSY)) { - - - //if ((frame % 100) == 0) - // printf("Channel is busy, rxv %p, offset %d\n",(void*)rxv,rx_offset); - - if (rxv) { - rx_energy = dB_fixed_times10(signal_energy((int32_t*)(rxdata[0]+rx_offset), - 80)); - // if ((frame%100) == 0) - printf("Frame %d: Rate %d, SDU_LENGTH %d,rx_offset %d,log2_maxh %d, rxp %f dBm (dig %f,rxgain %d)\n", - frame,rxv->rate,rxv->sdu_length,rx_offset,log2_maxh,(rx_energy/10.0)-rxg_max[0]+30-rxgain[0], - rx_energy/10.0,rxg_max[0]-30+rxgain[0]); - - if ((rxv->sdu_length > 1500) || (rxv->rate > 3) ) - printf("ERROR: Frame %d: Rate %d, SDU_LENGTH %d,rx_offset %d,log2_maxh %d, rxp %f dBm (dig %f,rxgain %d)\n", - frame,rxv->rate,rxv->sdu_length,rx_offset,log2_maxh,(rx_energy/10.0)-rxg_max[0]+30-rxgain[0], - rx_energy/10.0,rxg_max[0]-30+rxgain[0]); - else { - memset((void*)&data_ind_rx[10],0,rxv->sdu_length+4+2+1+16); - - <<<<<<< .mine - ======= - - if (data_detection(rxv,&data_ind_rx[10], - (uint32_t*)rxdata[0], - 76800,rx_offset,log2_maxh,NULL)) { - pos_crc++; - printf("Received SDU with positive CRC\n"); - - if (fd) { - rs = (struct ieee80211p_rx_status *)&data_ind_rx[0]; - rs->data_len = rxv->sdu_length; - rs->rssi = (char)((rx_energy/10.0)-rxg_max[0]+30-rxgain[0]); - rs->rate = 60; - rs->band = IEEE80211_BAND_0_8GHZ; - rs->flags = 0; - ret = netlink_send(fd,NLCMD_DATA,128,&data_ind_rx[0]); - } - - } else { - neg_crc++; - printf("Received SDU with negative CRC\n"); - oai_exit=1; - write_output("rxDATA_F_comp_aggreg3.m","rxDAT_F_comp_aggreg3", rxDATA_F_comp_aggreg3,48*200,1,1); - write_output("rxsig_sdu.m","rxsig_sdu",&rxdata[0][rx_offset],80*40,1,1); - - // write_output("rxDATA_F_comp_aggreg2.m","rxDAT_F_comp_aggreg2", rxDATA_F_comp_aggreg2,48*200,1,1); - } - - sdu_received = 1; - - // oai_exit = 1; - dlen = 32+16+6+(rxv->sdu_length<<3); // data length is 32-bits CRC + sdu + 16 service + 6 tail - dlen_symb = dlen/Ndbps[rxv->rate]; - - if ((dlen%Ndbps[rxv->rate])>0) - dlen_symb++; - - // printf("after dd: initial_sample_offset %d =>",initial_sample_offset); - initial_sample_offset = rx_offset + (80*dlen_symb); - // printf("%d\n",initial_sample_offset); - } - } else { - printf("BUSY, no synch (off %d) Frame %d (%llu us): rxp %f dBm (dig %f,rxgain %d)\n", - off,frame,rt_get_time_ns()/1000,(rx_energy/10.0)-rxg_max[0]+30-rxgain[0], - rx_energy/10.0,rxg_max[0]-30+rxgain[0]); - } - } else { - /* printf("Frame %d (%llu us): rxp %d dBm (dig %d,rxgain %d)\n", - frame,rt_get_time_ns()/1000,rx_energy-rxg_max[0]+30-rxgain[0], - rx_energy,rxg_max[0]-30+rxgain[0]); - */ - } - - } else { - - if (((frame%100) == 0) && (initial_sample_offset < 2*SLOT_DURATION_5MHz)) { - printf("Frame %d (%llu us): rxp %f dBm (dig %f,rxgain %d)\n", - frame,rt_get_time_ns()/1000,(rx_energy/10.0)-rxg_max[0]+30-rxgain[0], - rx_energy/10.0,rxg_max[0]-30+rxgain[0]); - - } - - if ((frame > 100) && - (tx_sdu_active == 1) && - (initial_sample_offset < 60000)) { - - printf("Frame %d: Generating SDU of length %d (%p), initial_sample_offset %d, MBOX <<9 %d\n",frame,tx_sdu_length,rxsdu,initial_sample_offset,DAQ_MBOX[0]<<9); /* - for (n=0;n FRAME_LENGTH_SAMPLES) - initial_sample_offset -= FRAME_LENGTH_SAMPLES; - - - - txlen= generate_tx_signal(initial_sample_offset); - // wait until TX is finished - - printf("TX: txlen %d, initial_sample_offset %d\n",txlen,initial_sample_offset); - //oai_exit=1; - - rt_sleep(nano2count((66666*8)+((txlen*66666)>>9))); - skip = initial_sample_offset+txlen-FRAME_LENGTH_SAMPLES; - - if (skip < 0) - skip = 0; - - printf("TX: erasing signal, MBOX %d (%d)\n",DAQ_MBOX[0],DAQ_MBOX[0]<<9); - - // erase TX signal - for (i=0; i<(txlen-skip); i++) - txdata[0][initial_sample_offset+i] = 0x00010001; - - for (i=0; i FRAME_LENGTH_SAMPLES) { - initial_sample_offset -= FRAME_LENGTH_SAMPLES; - frame++; - mbox_off = 0; - } - - tx_sdu_active = 0; - old_mbox = DAQ_MBOX[0]; - - } - - - //rt_sleep(nano2count(10000)); - // printf("back from sleep 10000 ... mbox %d\n",((unsigned int *)DAQ_MBOX)[0]); - - } - - - initial_sample_offset+=SLOT_DURATION_5MHz; - - if (initial_sample_offset>FRAME_LENGTH_SAMPLES) { - initial_sample_offset-=FRAME_LENGTH_SAMPLES; - mbox_off = 0; - frame++; - // if ((frame%100) == 0) - //printf("**** New frame %d\n",frame); - - if (frame == 100000) - oai_exit = 1; - } - - // sleep until HW has filled enough samples - - - mbox_diff = ((unsigned int*)DAQ_MBOX)[0]-old_mbox; - // if ((frame%100) == 0) - // printf("frame %d, old_mbox %d, mbox %d (initial_sample_offset %d : mbox<<9 %d)\n",frame,old_mbox,((unsigned int*)DAQ_MBOX)[0],initial_sample_offset,((unsigned int*)DAQ_MBOX)[0]<<9); - - - if ((mbox_diff>10) && (sdu_received == 0)) { - mbox_off = 0; - initial_sample_offset = ((unsigned int*)DAQ_MBOX)[0]<<9; - // printf("initial_sample_offset adjusted %d\n",initial_sample_offset); - rt_skip_cond++; - // printf("old_mbox %d, mbox %d (initial_sample_offset %d : mbox<<9 %d)\n", - // old_mbox,((unsigned int*)DAQ_MBOX)[0],initial_sample_offset,((unsigned int*)DAQ_MBOX)[0]<<9); - old_mbox = ((unsigned int *)DAQ_MBOX)[0]; - - } else { - if (old_mbox > ((unsigned int *)DAQ_MBOX)[0]) - mbox_off = 150; - - old_mbox = ((unsigned int *)DAQ_MBOX)[0]; - } - - /* - printf("off: %d (%d,%d), mbox_off %d => rx_energy %d\n",initial_sample_offset, - ((unsigned int *)DAQ_MBOX)[0], - (initial_sample_offset>>9),mbox_off, - rx_energy); - */ - - sample_threshold = initial_sample_offset+1024; - - if (sample_threshold > FRAME_LENGTH_SAMPLES) - sample_threshold -= FRAME_LENGTH_SAMPLES; - - while (old_mbox+mbox_off <= (sample_threshold>>9)) { - // if ((frame % 100) == 0) - // printf("sleeping (mbox %d, mbox_off %d, initial_sample_offset>>9 %d\n", - // old_mbox,mbox_off,(initial_sample_offset>>9)); - rt_sleep(nano2count(66666)); - - if (old_mbox > ((unsigned int *)DAQ_MBOX)[0]) - mbox_off = 150; - - old_mbox = ((unsigned int *)DAQ_MBOX)[0]; - } - - // printf("While out ... mbox %d\n",((unsigned int *)DAQ_MBOX)[0]); - - } - - printf("rt_skip_cond %d, frames %d, pos_crc %d, neg_crc %d\n", - rt_skip_cond,frame,pos_crc,neg_crc); - - printf("Dumping IS stats\n"); - print_is_stats(); - print_dd_stats(); - - write_output("rxsig0.m","rxs", rxdata[0],76800,1,1); - write_output("txsig0.m","txs", txdata[0],76800,1,1); - write_output("rxDATA_F_comp_aggreg3.m","rxDAT_F_comp_aggreg3", rxDATA_F_comp_aggreg3,48*200,1,1); - write_output("rxDATA_F_comp_aggreg2.m","rxDAT_F_comp_aggreg2", rxDATA_F_comp_aggreg2,48*200,1,1); - - printf("[DOT11][PHY] Leaving rx_thread\n"); - free(data_ind_rx); - } else { - printf("[DOT11][PHY] No netlink, exiting\n"); - } - - return(0); - - - } - - //extern int dot11_netlink_init(); - //extern int dot11_rx_thread_init(); - - //extern void *rx_thread(void *); - extern void *tx_thread(void *); - - - void dot11_init() { - - - - set_taus_seed(0); - - // Basic initializations - init_fft(64,6,rev64); - init_interleavers(); - ccodedot11_init(); - ccodedot11_init_inv(); - phy_generate_viterbi_tables(); - - init_crc32(); - - } - - int generate_tx_signal(int tx_offset) { - - TX_VECTOR_t tx_vector; - int i; - - printf("Generating Signal @ %d (MBOX << 9 = %d)\n", - tx_offset,DAQ_MBOX[0]<<9); - - if (data_ind == NULL) { - data_ind = (uint8_t*)malloc(4095+2+1); - data_ind[0] = 0; - data_ind[1] = 0; - } - - - tx_vector.rate=1; - tx_vector.sdu_length=tx_sdu_length; - tx_vector.service=0; - - for (i=0; i>>>>>> .r3153 - - // printf("Generating signal at %p\n",txdata[0]); - return(phy_tx_start(&tx_vector,txdata[0],tx_offset,FRAME_LENGTH_SAMPLES,data_ind)); - - } - - void signal_handler(int sig) { - void *array[10]; - size_t size; - - oai_exit=1; - - // get void*'s for all entries on the stack - size = backtrace(array, 10); - - // print out all the frames to stderr - fprintf(stderr, "Error: signal %d:\n", sig); - backtrace_symbols_fd(array, size, 2); - exit(-1); - } - - void exit_fun(const char* s) { - void *array[10]; - size_t size; - int fd; - - printf("Exiting: %s\n",s); - - oai_exit=1; - rt_sleep(nano2count(FRAME_PERIOD)); - - // cleanup - stop_rt_timer(); - - fd = 0; - ioctl(openair_fd,openair_STOP,&fd); - munmap((void*)mem_base, BIGPHYS_NUMPAGES*4096); - - exit (-1); - } - - int dummy_tx_buffer[3840*4] __attribute__((aligned(16))); - - /* This is the main dot11 thread. */ - static void *dot11_thread(void *arg) { - RT_TASK *task; - int slot=0,hw_slot,last_slot, next_slot,frame=0; - unsigned int msg1; - unsigned int aa,slot_offset, slot_offset_F; - int diff; - int delay_cnt; - RTIME time_in; - int mbox_target=0,mbox_current=0; - int i; - - task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF); - mlockall(MCL_CURRENT | MCL_FUTURE); - -#ifdef HARD_RT - <<<<<<< .mine - rt_printk("Started dot11 thread (id %p)\n",task); - - - rt_make_hard_real_time(); -#else - - printf("Started dot11 thread (id %p)\n",task); -#endif - ======= - rt_printk("Started dot11 thread (id %p)\n",task); - >>>>>>> .r3153 - - <<<<<<< .mine - - while (!oai_exit) { - // rt_printk("eNB: slot %d\n",slot); - ======= - >>>>>>> .r3153 - - <<<<<<< .mine - ======= - rt_make_hard_real_time(); -#else - >>>>>>> .r3153 - - printf("Started dot11 thread (id %p)\n",task); - - - <<<<<<< .mine - - if (frame>5) { - if ((frame%100)==0) -#ifdef HARD_RT - rt_printk("slot %d, hw_slot %d, next_slot %d (before): DAQ_MBOX %d\n", slot, hw_slot,next_slot,DAQ_MBOX[0]); - -#else - printf("frame %d slot %d, hw_slot %d, next_slot %d (before): DAQ_MBOX %d\n", frame,slot, hw_slot,next_slot,DAQ_MBOX[0]); -#endif - - if (fs4_test==0) { - if ((next_slot == 0) && (generate_test_tx==1) && ((frame%100)==0)) { - printf("Generating tx_signal in frame %d ...",frame); - generate_test_tx_signal(); - printf("done\n"); - - } else { // Check for normal TX packet - /*for (i=0;i<3840;i++) { - ((uint32_t *)txdata[0] + (3840*next_slot))[i] = 0x00010001; - }*/ - } - } - - - } - - - - ======= - - while (!oai_exit) { - // rt_printk("eNB: slot %d\n",slot); - - hw_slot = (((((unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - //this is the mbox counter where we should be - mbox_target = ((((slot+1)%20)*15+1)>>1)%150; - //this is the mbox counter where we are - mbox_current = ((unsigned int *)DAQ_MBOX)[0]; - - //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD) - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff = -150+mbox_target-mbox_current; - else - diff = mbox_target - mbox_current; - - if (diff < (-5)) { - printf("[dot11_thread] Frame %d: missed slot, proceeding with next one (slot %d, hw_slot %d, diff %d)\n",frame, slot, hw_slot, diff); - >>>>>>> .r3153 - slot++; - - if (slot==20) - <<<<<<< .mine - slot=0; - - //slot++; - if ((slot%20)==0) - frame++; - - ======= - slot=0; - continue; - >>>>>>> .r3153 - } - - if (diff>8) - printf("[dot11_thread] eNB Frame %d: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, slot, hw_slot, mbox_current, mbox_target, diff); - - delay_cnt = 0; - - while ((diff>0) && (!oai_exit)) { - time_in = rt_get_time_ns(); - //rt_printk("eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d, (slot+1)*15=%d, diff %d, time %llu\n",frame,delay_cnt,hw_slot,((unsigned int *)DAQ_MBOX)[0],slot,(((slot+1)*15)>>1),diff,time_in); - //rt_printk("Frame %d: slot %d, sleeping for %llu\n", frame, slot, diff*DAQ_PERIOD); - rt_sleep(nano2count(diff*DAQ_PERIOD)); - hw_slot = (((((unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - //rt_printk("eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns()); - delay_cnt++; - - if (delay_cnt == 10) { - oai_exit = 1; - printf("[dot11_thread]eNB Frame %d: HW stopped ... \n",frame); - } - - mbox_current = ((unsigned int *)DAQ_MBOX)[0]; - - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff = 150-mbox_current+mbox_target; - else - diff = mbox_target - mbox_current; - } - - - last_slot = (slot)%LTE_SLOTS_PER_FRAME; - - if (last_slot <0) - last_slot+=20; - - next_slot = (slot+3)%LTE_SLOTS_PER_FRAME; - - <<<<<<< .mine - - - ======= - - if (frame>5) { - if ((frame%100)==0) -#ifdef HARD_RT - rt_printk("slot %d, hw_slot %d, next_slot %d (before): DAQ_MBOX %d\n", slot, hw_slot,next_slot,DAQ_MBOX[0]); - -#else - printf("frame %d slot %d, hw_slot %d, next_slot %d (before): DAQ_MBOX %d\n", frame,slot, hw_slot,next_slot,DAQ_MBOX[0]); -#endif - - if (fs4_test==0) { - if ((next_slot == 0) && (generate_test_tx==1) && ((frame%100)==0)) { - printf("Generating tx_signal in frame %d ...",frame); - //generate_test_tx_signal(); - printf("done\n"); - - } else { // Check for normal TX packet - /*for (i=0;i<3840;i++) { - ((uint32_t *)txdata[0] + (3840*next_slot))[i] = 0x00010001; - }*/ - } - } - - - } - - - - slot++; - - if (slot==20) - slot=0; - - //slot++; - if ((slot%20)==0) - frame++; - } - - rt_printk("fun0: finished, ran %d times.\n",slot); - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - - // clean task - rt_task_delete(task); - rt_printk("Task deleted. returning\n"); - return 0; - } - - - - >>>>>>> .r3153 - int main(int argc, char **argv) { - - RT_TASK *task; - int i,j,aa; - - LTE_DL_FRAME_PARMS *frame_parms; - - u32 carrier_freq[4]= {1907600000,1907600000,1907600000,1907600000}; - u32 rf_mode_max[4] = {55231,55231,55231,55231}; - u32 rf_mode_med[4] = {39375,39375,39375,39375}; - u32 rf_mode_byp[4] = {22991,22991,22991,22991}; - - u32 rf_local[4] = {8255000,8255000,8255000,8255000}; // UE zepto - //{8254617, 8254617, 8254617, 8254617}; //eNB khalifa - //{8255067,8254810,8257340,8257340}; // eNB PETRONAS - - u32 rf_vcocal[4] = {2340,2340,2340,2340}; - u32 rf_rxdc[4] = {32896,32896,32896,32896}; - <<<<<<< .mine - u32 rxgain[4]= {20,20,20,20}; - ======= - >>>>>>> .r3153 - - <<<<<<< .mine - - ======= - - - >>>>>>> .r3153 - u8 eNB_id=0,UE_id=0; - u16 Nid_cell = 0; - u8 cooperation_flag=0, transmission_mode=1, abstraction_flag=0; - u8 beta_ACK=0,beta_RI=0,beta_CQI=2; - - int c; - char do_forms=0; - unsigned int fd,dot11_netlink_fd; - unsigned int tcxo = 114; - - int amp; - - char rxg_fname[100]; - char rflo_fname[100]; - FILE *rxg_fd=NULL; - FILE *rflo_fd=NULL; - - <<<<<<< .mine - ======= - - >>>>>>> .r3153 - const struct option long_options[] = { - {"calib-rx", required_argument, NULL, 256}, - {"calib-rx-med", required_argument, NULL, 257}, - {"calib-rx-byp", required_argument, NULL, 258}, - {NULL, 0, NULL, 0} - }; - - mode = normal_txrx; - - - while ((c = getopt_long (argc, argv, "C:ST:dF:t",long_options,NULL)) != -1) { - switch (c) { - case 'd': - do_forms=1; - break; - - case 't': - generate_test_tx = 1; - break; - - case 'C': - carrier_freq[0] = atoi(optarg); - carrier_freq[1] = atoi(optarg); - carrier_freq[2] = atoi(optarg); - carrier_freq[3] = atoi(optarg); - break; - - case 'S': - fs4_test=1; - break; - - case 'T': - tcxo=atoi(optarg); - break; - - case 'F': - sprintf(rxg_fname,"%srxg.lime",optarg); - rxg_fd = fopen(rxg_fname,"r"); - - if (rxg_fd) { - printf("Loading RX Gain parameters from %s\n",rxg_fname); - fscanf(rxg_fd,"%d %d %d %d",&rxg_max[0],&rxg_max[1],&rxg_max[2],&rxg_max[3]); - fscanf(rxg_fd,"%d %d %d %d",&rxg_med[0],&rxg_med[1],&rxg_med[2],&rxg_med[3]); - fscanf(rxg_fd,"%d %d %d %d",&rxg_byp[0],&rxg_byp[1],&rxg_byp[2],&rxg_byp[3]); - } else - printf("%s not found, running with defaults\n",rxg_fname); - - sprintf(rflo_fname,"%srflo.lime",optarg); - rflo_fd = fopen(rflo_fname,"r"); - - if (rflo_fd) { - printf("Loading RF LO parameters from %s\n",rflo_fname); - fscanf(rflo_fd,"%d %d %d %d",&rf_local[0],&rf_local[1],&rf_local[2],&rf_local[3]); - } else - printf("%s not found, running with defaults\n",rflo_fname); - - break; - - case 256: - mode = rx_calib_ue; - rx_input_level_dBm = atoi(optarg); - printf("Running with UE calibration on (LNA max), input level %d dBm\n",rx_input_level_dBm); - break; - - case 257: - mode = rx_calib_ue_med; - rx_input_level_dBm = atoi(optarg); - printf("Running with UE calibration on (LNA med), input level %d dBm\n",rx_input_level_dBm); - break; - - case 258: - mode = rx_calib_ue_byp; - rx_input_level_dBm = atoi(optarg); - printf("Running with UE calibration on (LNA byp), input level %d dBm\n",rx_input_level_dBm); - break; - - default: - break; - } - } - - - // to make a graceful exit when ctrl-c is pressed - signal(SIGSEGV, signal_handler); - - // init the parameters - frame_parms = (LTE_DL_FRAME_PARMS*) malloc(sizeof(LTE_DL_FRAME_PARMS)); - frame_parms->N_RB_DL = 25; - frame_parms->N_RB_UL = 25; - frame_parms->Ncp = 0; - frame_parms->Ncp_UL = 0; - frame_parms->Nid_cell = Nid_cell; - frame_parms->nushift = 0; - frame_parms->nb_antennas_tx = 1; - frame_parms->nb_antennas_rx = 1; - frame_parms->mode1_flag = 1; //default == SISO - frame_parms->frame_type = 1; - - if (fs4_test==1) - frame_parms->tdd_config = 255; - else - frame_parms->tdd_config = 3; - - frame_parms->tdd_config_S = 0; - frame_parms->phich_config_common.phich_resource = oneSixth; - frame_parms->phich_config_common.phich_duration = normal; - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 0;//n_DMRS1 set to 0 - - frame_parms->node_id = NODE; - - // for Express MIMO - for (i=0; i<4; i++) { - frame_parms->carrier_freq[i] = carrier_freq[i]; - frame_parms->carrier_freqtx[i] = carrier_freq[i]; - - <<<<<<< .mine - frame_parms->rxgain[i] = rxgain[i]; - ======= - frame_parms->rxgain[i] = rxgain[i]; - - frame_parms->rflocal[i] = rf_local[i]; - frame_parms->rfvcolocal[i] = rf_vcocal[i]; - frame_parms->rxdc[i] = rf_rxdc[i]; - frame_parms->rfmode[i] = rf_mode_max[i]; - - >>>>>>> .r3153 - } - - printf("Freq %d,%d,%d,%d, Gain %d,%d,%d,%d, RFmode %d, RXDC %d, RF_local %d, rf_vcocal %d\n", - frame_parms->carrier_freq[0],frame_parms->carrier_freq[1],frame_parms->carrier_freq[2],frame_parms->carrier_freq[3], - frame_parms->rxgain[0],frame_parms->rxgain[1],frame_parms->rxgain[2],frame_parms->rxgain[3], - frame_parms->rfmode[0],frame_parms->rflocal[0], - frame_parms->rxdc[0],frame_parms->rfvcolocal[0]); - - - frame_parms->nb_prefix_samples0 = 40; - frame_parms->nb_prefix_samples = 36; - frame_parms->symbols_per_tti = 14; - frame_parms->ofdm_symbol_size = 512; - - frame_parms->log2_symbol_size = 9; - frame_parms->samples_per_tti = 7680; - frame_parms->first_carrier_offset = frame_parms->ofdm_symbol_size - 150; - - openair_fd = setup_oai_hw(frame_parms); - printf("Setting up buffers for Antenna port 0\n"); - setup_dot11_buffers(&(rxdata[0]),&(txdata[0]),0); - printf("Setting up buffers for Antenna port 1\n"); - setup_dot11_buffers(&(rxdata[1]),&(txdata[1]),1); - - <<<<<<< .mine - printf("Initializing dot11 DSP functions\n"); - dot11_init(); - dot11_netlink_fd = dot11_netlink_init(); - ======= - >>>>>>> .r3153 - - <<<<<<< .mine - - for (j=0; j<76800; j+=4) - for (aa=0; aanb_antennas_tx; aa++) { - amp = 0x8000; - // ((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+1] = 0; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+3] = amp-1; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+5] = 0; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+7] = amp; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j] = amp-1; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+2] = 0; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+4] = amp; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+6] = 0; - } - - sleep(1); - printf("Calling openair_GET_PCI_INTERFACE %x\n",openair_GET_PCI_INTERFACE); - ioctl(openair_fd,openair_GET_PCI_INTERFACE,&pci_interface_ptr_kern); - - if (pci_interface_ptr_kern == 0) { - printf("null pci_interface_ptr, exiting\n"); - exit(-1); - } - - ======= - - for (j=0; j<76800; j+=4) - for (aa=0; aanb_antennas_tx; aa++) { - amp = 0x8000; - // ((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+1] = 0; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+3] = amp-1; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+5] = 0; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+7] = amp; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j] = amp-1; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+2] = 0; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+4] = amp; - //((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+6] = 0; - } - - sleep(1); - printf("Calling openair_GET_PCI_INTERFACE %x\n",openair_GET_PCI_INTERFACE); - ioctl(openair_fd,openair_GET_PCI_INTERFACE,&pci_interface_ptr_kern); - - if (pci_interface_ptr_kern == 0) { - printf("null pci_interface_ptr, exiting\n"); - exit(-1); - } - - exmimo_pci_interface = (exmimo_pci_interface_t*) (pci_interface_ptr_kern-bigphys_top+mem_base); - printf("pci_interface_ptr_kern = %p, exmimo_pci_interface = %p\n", (void*) pci_interface_ptr_kern, exmimo_pci_interface); - DAQ_MBOX = (unsigned int *)(0xc0000000+exmimo_pci_interface->rf.mbox-bigphys_top+mem_base); - - printf("Initializing dot11 DSP functions\n"); - dot11_init(); - dot11_netlink_fd = netlink_init(); - >>>>>>> .r3153 - exmimo_pci_interface = (exmimo_pci_interface_t*) (pci_interface_ptr_kern-bigphys_top+mem_base); - printf("pci_interface_ptr_kern = %p, exmimo_pci_interface = %p\n", (void*) pci_interface_ptr_kern, exmimo_pci_interface); - DAQ_MBOX = (unsigned int *)(0xc0000000+exmimo_pci_interface->rf.mbox-bigphys_top+mem_base); - - <<<<<<< .mine - ======= - printf("dot11_netlink_fd %d\n",dot11_netlink_fd); - - - - >>>>>>> .r3153 - // make main thread LXRT soft realtime - printf("Starting LXRT ..."); - task = rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF); - mlockall(MCL_CURRENT | MCL_FUTURE); - - // start realtime timer and scheduler - //rt_set_oneshot_mode(); - rt_set_periodic_mode(); - start_rt_timer(0); - <<<<<<< .mine - printf(" done\n"); - ======= - printf(" done\n"); - - >>>>>>> .r3153 - <<<<<<< .mine - //now = rt_get_time() + 10*PERIOD; - //rt_task_make_periodic(task, now, PERIOD); - - // initialize the instance cnt before starting the thread - // instance_cnt_ptr_user = &instance_cnt; - - - - // signal the driver to set up for user-space operation - // this will initialize the semaphore and the task pointers in the kernel - // further we receive back the pointer to the shared instance counter which is used to signal if the thread is busy or not. This pointer needs to be mapped to user space. - /* - ioctl(openair_fd,openair_START_LXRT,&instance_cnt_ptr_kern); - instance_cnt_ptr_user = (int*) (instance_cnt_ptr_kern -bigphys_top+mem_base); - *instance_cnt_ptr_user = -1; - printf("instance_cnt_ptr_kern %p, instance_cnt_ptr_user %p, *instance_cnt_ptr_user %d\n", (void*) instance_cnt_ptr_kern, (void*) instance_cnt_ptr_user,*instance_cnt_ptr_user); - */ - - ======= - >>>>>>> .r3153 - - <<<<<<< .mine - - - rt_sleep(nano2count(FRAME_PERIOD)); - ======= - >>>>>>> .r3153 - // this starts the DMA transfers - <<<<<<< .mine - ======= - ioctl(openair_fd,openair_START_TX_SIG,NULL); - //ioctl(openair_fd,openair_GET_BUFFER,NULL); - >>>>>>> .r3153 - - <<<<<<< .mine - ioctl(openair_fd,openair_START_TX_SIG,NULL); - - - ======= - >>>>>>> .r3153 - rt_sleep(nano2count(10*FRAME_PERIOD)); - - - <<<<<<< .mine - thread1 = rt_thread_create(dot11_thread, NULL, 100000000); - ======= - //thread1 = rt_thread_create(dot11_thread, NULL, 100000000); - >>>>>>> .r3153 - - - <<<<<<< .mine - printf("thread created\n"); - ======= - thread1 = rt_thread_create(rx_thread, &dot11_netlink_fd, 10000000); - >>>>>>> .r3153 - - thread2 = rt_thread_create(tx_thread, &dot11_netlink_fd, 10000000); - - // wait for end of program - printf("TYPE TO TERMINATE main thread\n"); - getchar(); - - // stop threads - rt_sleep(nano2count(FRAME_PERIOD)); - - stop_rt_timer(); - - fd = 0; - ioctl(openair_fd,openair_STOP,&fd); - munmap((void*)mem_base, BIGPHYS_NUMPAGES*4096); - - return 0; - } diff --git a/targets/RT/USER/ieee80211p-softmodem.c b/targets/RT/USER/ieee80211p-softmodem.c deleted file mode 100644 index ffd630d40b..0000000000 --- a/targets/RT/USER/ieee80211p-softmodem.c +++ /dev/null @@ -1,185 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) EURECOM / Thales Communications & Security - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program 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 - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * The full GNU General Public License is included in this distribution in the - * file called LICENSE. - * - * Contact Information: - * Thales Communications & Security - * - *****************************************************************************/ - -/****************************************************************************** - * - * Includes - * - *****************************************************************************/ - -#include -#include -#include -#include "ieee80211p-netlinkapi.h" -#include "phy/DOT11/defs.h" -#include "PHY/TOOLS/defs.h" -#include -#include -#include - -#include -#include -#include - - -/****************************************************************************** - * - * Definitions - * - *****************************************************************************/ - -enum nl80211_band { - NL80211_BAND_2GHZ, - NL80211_BAND_5GHZ, - NL80211_BAND_5_9GHZ, - NL80211_BAND_0_8GHZ, -}; - -enum ieee80211_band { - IEEE80211_BAND_2GHZ = NL80211_BAND_2GHZ, - IEEE80211_BAND_5GHZ = NL80211_BAND_5GHZ, - IEEE80211_BAND_5_9GHZ = NL80211_BAND_5_9GHZ, - IEEE80211_BAND_0_8GHZ = NL80211_BAND_0_8GHZ, -}; - -struct ieee80211p_rx_status { - short data_len; //frame data length in bytes - char rssi; //received power in dBm - char rate; //reveived data rate in units of 100 kbps - enum ieee80211_band band; - char flags; //RX flags -}; /* struct ieee80211p_rx_status */ - -extern uint32_t *txdata[2],*rxdata[2]; -//CHANNEL_STATUS_t dot11_state = IDLE; -extern int oai_exit; - -extern unsigned int *DAQ_MBOX; - -extern int Ndbps[8]; - -extern int32_t rxDATA_F_comp_aggreg2[48*1024]; -extern int32_t rxDATA_F_comp_aggreg3[48*1024]; - -extern uint32_t rxgain[4]; -extern uint32_t rxg_max[4], rxg_med[4], rxg_byp[4]; - -#define FRAME_LENGTH_SAMPLES 76800 -#define RX_THRES 60 - -#define SLOT_DURATION_5MHz 105 -#define RX_THRES_dB 40 - -int tx_sdu_active = 0; -int tx_sdu_length = 0; -char rxsdu[2000]; - -void *tx_thread(void *arg) -{ - - int fd=*((int*)arg); - RT_TASK *task; - int ret; - int i; - char dummy_data[10]; - - - if (fd > 0) { - - ret = netlink_send(fd,NLCMD_INIT,10,&dummy_data[0]); - - printf("tx_thread starting, fd %d\n",fd); - - task = rt_task_init_schmod(nam2num("TASK1"), 0, 0, 0, SCHED_FIFO, 0xF); - mlockall(MCL_CURRENT | MCL_FUTURE); - // rt_make_hard_real_time(); - - while (!oai_exit) { - - if (tx_sdu_active == 1) - printf("tx_thread: waiting (MBOX %d)\n",((unsigned int*)DAQ_MBOX)[0]); - - while(((volatile int)tx_sdu_active) != 0) { - rt_sleep(nano2count(66666)); - } - - printf("tx_thread: calling netlink\n"); - ret = netlink_recv(fd,rxsdu); - tx_sdu_active = 1; - tx_sdu_length = ret; - - /* - if (ret > 0) { - - printf("received TX SDU: "); - for (i=0;i Date: Tue, 1 Mar 2016 22:53:47 +0100 Subject: [PATCH 094/122] Added delay on exit option --- openair3/TEST/EPC_TEST/play_scenario.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index cafdd93d31..876691cfcc 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -1016,6 +1016,7 @@ static void et_usage ( fprintf (stdout, "\n"); fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n"); fprintf (stdout, "\t-c | --enb-conf-file Provide an eNB config file, valid for the testbed\n"); + fprintf (stdout, "\t-D | --delay-on-exit Wait delay-in-sec before exiting\n"); fprintf (stdout, "\t-f | --shift-packet Shift the timing of a packet'\n"); fprintf (stdout, "\t-F | --shift-packets Shift the timing of packets starting at frame 'frame' included\n"); fprintf (stdout, "\t-m | --max-speed Play scenario as fast as possible without respecting frame timings\n"); @@ -1035,7 +1036,8 @@ et_config_parse_opt_line ( char **et_dir_name, char **scenario_file_name, char **enb_config_file_name, - shift_packet_t **shifts) + shift_packet_t **shifts, + int *delay_on_exit) //------------------------------------------------------------------------------ { int option = 0; @@ -1048,6 +1050,7 @@ et_config_parse_opt_line ( LONG_OPTION_SCENARIO_FILE, LONG_OPTION_MAX_SPEED, LONG_OPTION_TEST_DIR, + LONG_OPTION_DELAY_EXIT, LONG_OPTION_SHIFT_PACKET, LONG_OPTION_SHIFT_PACKETS, LONG_OPTION_HELP, @@ -1059,6 +1062,7 @@ et_config_parse_opt_line ( {"scenario ", required_argument, 0, LONG_OPTION_SCENARIO_FILE}, {"max-speed ", no_argument, 0, LONG_OPTION_MAX_SPEED}, {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, + {"delay-on-exit", required_argument, 0, LONG_OPTION_DELAY_EXIT}, {"shift-packet", required_argument, 0, LONG_OPTION_SHIFT_PACKET}, {"shift-packets", required_argument, 0, LONG_OPTION_SHIFT_PACKETS}, {"help", no_argument, 0, LONG_OPTION_HELP}, @@ -1101,6 +1105,19 @@ et_config_parse_opt_line ( } break; + case LONG_OPTION_DELAY_EXIT: + case 'D': + if (optarg) { + delay_on_exit = atoi(optarg); + if (0 > delay_on_exit) { + fprintf(stderr, "Please provide a valid -D/--delay-on-exit argument, %s is not a valid value\n", delay_on_exit); + exit(1); + } + printf("Delay on exit is %d\n", delay_on_exit); + } + break; + + case LONG_OPTION_SHIFT_PACKET: case 'f': if (optarg) { @@ -1187,6 +1204,7 @@ int main( int argc, char **argv ) char *enb_config_file_name = NULL; struct shift_packet_s *shifts = NULL; int ret = 0; + int delay_on_exit = 0; et_scenario_t *scenario = NULL; char play_scenario_filename[NAME_MAX]; @@ -1205,7 +1223,7 @@ int main( int argc, char **argv ) asn1_xer_print = 1; //parameters - actions = et_config_parse_opt_line (argc, argv, &et_dir_name, &scenario_file_name, &enb_config_file_name, &shifts); //Command-line options + actions = et_config_parse_opt_line (argc, argv, &et_dir_name, &scenario_file_name, &enb_config_file_name, &shifts, &delay_on_exit); //Command-line options if (actions & PLAY_SCENARIO) { if (et_generate_xml_scenario(et_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) { if (NULL != (scenario = et_generate_scenario(play_scenario_filename))) { @@ -1223,5 +1241,8 @@ int main( int argc, char **argv ) et_free_pointer(enb_config_file_name); } itti_wait_tasks_end(); + if (0 < delay_on_exit) { + sleep(delay_on_exit); + } return ret; } From b52aa553487ecf24b79ca6dade219ec13fcbf969 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 2 Mar 2016 11:14:43 +0100 Subject: [PATCH 095/122] updates due to N/W configuration in test setup --- cmake_targets/autotests/test_case_list.xml | 280 ++++++++++----------- 1 file changed, 140 insertions(+), 140 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 037f5c8ee9..0275b1e57b 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -10,7 +10,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; uname -a; dmesg|tail 36000 - 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016002 016005 016102 016105 016302 016305 016502 016505 + 0102+ 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016002 016005 016102 016105 016302 016305 016502 016505 3 mozart calisson stevens nano amerique @@ -909,9 +909,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -984,9 +984,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1058,9 +1058,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1132,9 +1132,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1205,9 +1205,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1278,9 +1278,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1353,9 +1353,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1428,9 +1428,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1501,9 +1501,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1575,9 +1575,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1649,9 +1649,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1723,9 +1723,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -1799,14 +1799,14 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -1835,11 +1835,11 @@ BUILD/EPC/epc.conf.in MCC \"208\" BUILD/EPC/epc.conf.in MNC \"92\" BUILD/EPC/epc.conf.in TAC \"1\" - BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\" + BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\" BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\" - BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\"; + BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\"; BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\"; - BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\" BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\" BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" $OPENAIRCN_DIR/SCRIPTS/build_epc @@ -1847,7 +1847,7 @@ $OPENAIRCN_DIR/SCRIPTS/build_hss -c -l - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5 add 192.172.0.1 $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r @@ -1883,14 +1883,14 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -1919,11 +1919,11 @@ BUILD/EPC/epc.conf.in MCC \"208\" BUILD/EPC/epc.conf.in MNC \"92\" BUILD/EPC/epc.conf.in TAC \"1\" - BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\" + BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\" BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\" - BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\"; + BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\"; BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\"; - BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\" BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\" BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" $OPENAIRCN_DIR/SCRIPTS/build_epc @@ -1931,7 +1931,7 @@ $OPENAIRCN_DIR/SCRIPTS/build_hss -c -l - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r @@ -1967,14 +1967,14 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -2003,11 +2003,11 @@ BUILD/EPC/epc.conf.in MCC \"208\" BUILD/EPC/epc.conf.in MNC \"92\" BUILD/EPC/epc.conf.in TAC \"1\" - BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\" + BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\" BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\" - BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\"; + BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\"; BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\"; - BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\" BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\" BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" $OPENAIRCN_DIR/SCRIPTS/build_epc @@ -2015,7 +2015,7 @@ $OPENAIRCN_DIR/SCRIPTS/build_hss -c -l - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5 add 192.172.0.1 $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r @@ -2051,14 +2051,14 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -2087,11 +2087,11 @@ BUILD/EPC/epc.conf.in MCC \"208\" BUILD/EPC/epc.conf.in MNC \"92\" BUILD/EPC/epc.conf.in TAC \"1\" - BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\" + BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\" BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\" - BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\"; + BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\"; BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\"; - BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\" BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\" BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" $OPENAIRCN_DIR/SCRIPTS/build_epc @@ -2099,7 +2099,7 @@ $OPENAIRCN_DIR/SCRIPTS/build_hss -c -l - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r @@ -2135,14 +2135,14 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -2171,11 +2171,11 @@ BUILD/EPC/epc.conf.in MCC \"208\" BUILD/EPC/epc.conf.in MNC \"92\" BUILD/EPC/epc.conf.in TAC \"1\" - BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\" + BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\" BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\" - BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\"; + BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\"; BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\"; - BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\" BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\" BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" $OPENAIRCN_DIR/SCRIPTS/build_epc @@ -2183,7 +2183,7 @@ $OPENAIRCN_DIR/SCRIPTS/build_hss -c -l - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r @@ -2219,14 +2219,14 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -2255,11 +2255,11 @@ BUILD/EPC/epc.conf.in MCC \"208\" BUILD/EPC/epc.conf.in MNC \"92\" BUILD/EPC/epc.conf.in TAC \"1\" - BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\" + BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\" BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\" - BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\"; + BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\"; BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\"; - BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\" BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\" BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" $OPENAIRCN_DIR/SCRIPTS/build_epc @@ -2267,7 +2267,7 @@ $OPENAIRCN_DIR/SCRIPTS/build_hss -c -l - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r @@ -2303,9 +2303,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -2387,9 +2387,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -2471,9 +2471,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -2555,9 +2555,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -2639,9 +2639,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -2723,9 +2723,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -2805,9 +2805,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -2877,9 +2877,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -2948,9 +2948,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3020,9 +3020,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3091,9 +3091,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3162,9 +3162,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3236,9 +3236,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3319,9 +3319,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3400,9 +3400,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3481,9 +3481,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3562,9 +3562,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3643,9 +3643,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3724,9 +3724,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3796,9 +3796,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3868,9 +3868,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -3904,7 +3904,7 @@ BUILD/EPC/epc.local.enb.conf.in MCC \"208\" BUILD/EPC/epc.local.enb.conf.in MNC \"92\" BUILD/EPC/epc.local.enb.conf.in TAC \"1\" - BUILD/EPC/epc.local.enb.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + BUILD/EPC/epc.local.enb.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\" BUILD/EPC/epc.local.enb.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\" SCRIPTS/build_epc -c -l @@ -3944,9 +3944,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4015,9 +4015,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4086,9 +4086,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4159,9 +4159,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4243,9 +4243,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4324,9 +4324,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4405,9 +4405,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4486,9 +4486,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4567,9 +4567,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4652,9 +4652,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -26 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4728,9 +4728,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -29 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4803,9 +4803,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -32 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4878,9 +4878,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -26 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -4952,9 +4952,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -29 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai @@ -5026,9 +5026,9 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -32 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai From 695903920f9580dcd83f5f3d4e47ff34fe8dd298 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 2 Mar 2016 13:45:26 +0100 Subject: [PATCH 096/122] no GUI/History for stop_exmimo2 script --- cmake_targets/tools/stop_exmimo2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/tools/stop_exmimo2 b/cmake_targets/tools/stop_exmimo2 index 63810e0bf8..a68fdb7d57 100755 --- a/cmake_targets/tools/stop_exmimo2 +++ b/cmake_targets/tools/stop_exmimo2 @@ -13,5 +13,5 @@ sudo -E $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 #now we stop the card from transmitting anything cd $OPENAIR_DIR/targets/bin -sudo -E octave $OPENAIR_DIR/cmake_targets/tools/exmimo_stop_octave.m +sudo -E octave -H --no-gui $OPENAIR_DIR/cmake_targets/tools/exmimo_stop_octave.m From 3001bac0e9285e25d202cd949e8ad6607510fe3e Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 2 Mar 2016 16:12:14 +0100 Subject: [PATCH 097/122] Change xml file after N/W reconfiguration --- .../autotests/run_exec_lte-softmodem_tests.py | 2 + cmake_targets/autotests/test_case_list.xml | 207 +++++++++--------- 2 files changed, 106 insertions(+), 103 deletions(-) diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index eb142c114e..61d8d3e412 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -704,6 +704,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , write_file(logfile_task_eNB_compile, task_eNB_compile, mode="w") task_eNB = ' ( uname -a ; date \n' + task_eNB = task_eNB + ' export OPENAIR_TESTDIR=' + logdir_eNB + '\n' task_eNB = task_eNB + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n' task_eNB = task_eNB + 'env |grep OPENAIR \n' + 'array_exec_pid=() \n' @@ -806,6 +807,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , write_file(logfile_task_EPC_compile, task_EPC_compile, mode="w") task_EPC = ' ( uname -a ; date \n' + task_EPC = task_EPC + ' export OPENAIRCN_TESTDIR=' + logdir_EPC + '\n' task_EPC = task_EPC + 'array_exec_pid=()' + '\n' task_EPC = task_EPC + 'cd ' + logdirOpenaircnRepo + '; source oaienv\n' task_EPC = task_EPC + 'source BUILD/TOOLS/build_helper \n' diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 0275b1e57b..df82c53ebc 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1806,7 +1806,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -1845,13 +1845,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5 add 192.172.0.1 $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -1890,7 +1890,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -1929,13 +1929,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -1974,7 +1974,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -2013,13 +2013,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -2058,7 +2058,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -2097,13 +2097,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -2142,7 +2142,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -2181,13 +2181,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -2226,7 +2226,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W @@ -2265,13 +2265,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -i -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -2310,7 +2310,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches'; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches'; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W @@ -2345,17 +2345,18 @@ BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\"; BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth0\" BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.62/24\" - BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" + BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" + BUILD/EPC/epc.conf.in OUTPUT \"CONSOLE\" $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1 $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -2394,7 +2395,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W @@ -2433,13 +2434,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -2478,7 +2479,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W @@ -2517,13 +2518,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -2562,7 +2563,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W @@ -2601,13 +2602,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -2646,7 +2647,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W @@ -2685,13 +2686,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -2730,7 +2731,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c - sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig + sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W @@ -2769,13 +2770,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ;cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -3243,7 +3244,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c - sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf -W @@ -3282,13 +3283,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -3319,14 +3320,14 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c - sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf -W @@ -3365,13 +3366,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -3407,7 +3408,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c - sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf -W @@ -3446,13 +3447,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1 $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -3488,7 +3489,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c - sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf -W @@ -3525,15 +3526,15 @@ BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.62/24\" BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" $OPENAIRCN_DIR/SCRIPTS/build_epc - -c -l + -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -3569,7 +3570,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c - sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf -W @@ -3608,13 +3609,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -3650,7 +3651,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c - sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf -W @@ -3689,13 +3690,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -4166,7 +4167,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w EXMIMO -x -c - sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2; dmesg|tail + sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W @@ -4206,13 +4207,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1 ;cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -4250,7 +4251,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w EXMIMO -x -c - sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail + sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W @@ -4289,13 +4290,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -4331,7 +4332,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w EXMIMO -x -c - sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail + sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W @@ -4370,13 +4371,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 @@ -4412,7 +4413,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w EXMIMO -x -c - sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail + sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W @@ -4451,13 +4452,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ;cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -4493,7 +4494,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w EXMIMO -x -c - sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail + sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W @@ -4532,13 +4533,13 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 @@ -4574,7 +4575,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w EXMIMO -x -c - sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail + sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W @@ -4613,15 +4614,15 @@ $OPENAIRCN_DIR/SCRIPTS/build_epc -c -l $OPENAIRCN_DIR/SCRIPTS/build_hss - -c -l + -c -l --debug --random false - sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1 + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 $OPENAIRCN_DIR/SCRIPTS/run_epc -r - sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss + sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in From eacc1c2a712d50b95e418628cc375d8429de219b Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 2 Mar 2016 16:31:16 +0100 Subject: [PATCH 098/122] addition of SoDeRa test cases --- cmake_targets/autotests/test_case_list.xml | 451 ++++++++++++++++++++- 1 file changed, 450 insertions(+), 1 deletion(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index df82c53ebc..2a6c5c4f5a 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -10,7 +10,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; uname -a; dmesg|tail 36000 - 0102+ 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016002 016005 016102 016105 016302 016305 016502 016505 + 0102+ 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016002 016005 016102 016105 016302 016305 016502 016505 017002 017005 3 mozart calisson stevens nano amerique @@ -5081,6 +5081,455 @@ 10 + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -26 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w LMSSDR -x -c + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W + + + + + False + + /tmp + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 + + throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + SoDeRa.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX + 10 + + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -26 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w LMSSDR -x -c + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W + + + + + False + + /tmp + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + + + + True + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 + + throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + True + SoDeRa.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -26 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w LMSSDR -x -c + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W + + + + + False + + /tmp + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + + + + True + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 + + throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + True + SoDeRa.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -29 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w LMSSDR -x -c + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W + + + + + False + + /tmp + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + + True + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 + + + True + BladeRF.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -29 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w LMSSDR -x -c + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W + + + + + False + + /tmp + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + + throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + True + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 + + + True + SoDeRa.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -29 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w LMSSDR -x -c + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W + + + + + False + + /tmp + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + + throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + + True + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 + + + True + SoDeRa.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX + 10 + + From 574f3138d9add1f629ed0f45c649d2552537b77d Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 2 Mar 2016 18:23:08 +0100 Subject: [PATCH 099/122] added support for rrh_gw config parsing --- cmake_targets/autotests/tools/search_repl.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmake_targets/autotests/tools/search_repl.py b/cmake_targets/autotests/tools/search_repl.py index bb807502f2..be0568599f 100755 --- a/cmake_targets/autotests/tools/search_repl.py +++ b/cmake_targets/autotests/tools/search_repl.py @@ -26,6 +26,9 @@ if keyword == 'mme_ip_address': elif keyword == 'IPV4_LIST': replacement_text = keyword + ' = ( ' + replacement_text + ' ) ; ' string = re.sub(r"IPV4_LIST\s*=\s*\(([^\$]+?)\)\s*;", replacement_text, string, re.M) +elif keyword == 'rrh_gw_config': + replacement_text = keyword + ' = ( { ' + replacement_text + ' } ) ; ' + string = re.sub(r"rrh_gw_config\s*=\s*\(([^\$]+?)\)\s*;", replacement_text, string, re.M) else : replacement_text = keyword + ' = ' + replacement_text + ' ; ' string = re.sub(r"%s\s*=\s*([^\$]+?)\s*;" % keyword , replacement_text, string, re.M) From 24d24f121c1e6c34be56a689dc10e08643be682c Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 2 Mar 2016 19:54:05 +0100 Subject: [PATCH 100/122] addition of RRH test cases --- cmake_targets/autotests/README.txt | 19 + .../autotests/run_exec_lte-softmodem_tests.py | 98 +++- cmake_targets/autotests/test_case_list.xml | 459 +++++++++++++++++- 3 files changed, 555 insertions(+), 21 deletions(-) diff --git a/cmake_targets/autotests/README.txt b/cmake_targets/autotests/README.txt index f862644d07..d3b72edf46 100644 --- a/cmake_targets/autotests/README.txt +++ b/cmake_targets/autotests/README.txt @@ -171,6 +171,25 @@ Obj.# Case# Test# Description 01 65 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 65 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX + +01 70 00 lte-softmodem tests with SoDeRa RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 70 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX +01 70 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX +01 70 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX +01 70 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX +01 70 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX +01 70 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX + + +01 75 00 lte-softmodem + RRH tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 75 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX +01 75 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX +01 75 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX +01 75 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX +01 75 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX +01 75 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX + + 01 64 lte-softmodem-noS1 tests 02 Functional test case diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index 61d8d3e412..98e5e42c39 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -571,6 +571,17 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , nruns = nruns_lte_softmodem nruns = int(float(nruns)) tags = testcase.findtext('tags',default='') + + RRHMachine = testcase.findtext('RRH',default='') + RRH_compile_prog = testcase.findtext('RRH_compile_prog',default='') + RRH_compile_prog_args = testcase.findtext('RRH_compile_prog_args',default='') + RRH_pre_exec = testcase.findtext('RRH_pre_exec',default='') + RRH_pre_exec_args = testcase.findtext('RRH_pre_exec_args',default='') + RRH_main_exec = testcase.findtext('RRH_main_exec',default='') + RRH_main_exec_args = testcase.findtext('RRH_main_exec_args',default='') + RRH_terminate_missing_procs = testcase.findtext('RRH_terminate_missing_procs',default='True') + + eNBMachine = testcase.findtext('eNB',default='') eNB_config_file = testcase.findtext('eNB_config_file',default='') eNB_compile_prog = testcase.findtext('eNB_compile_prog',default='') @@ -635,13 +646,15 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , oai_EPC = openair('localdomain', EPCMachine) oai_EPC.connect(user, password) res = oai_eNB.send_recv(cmd) - + if RRHMachine != '': + cmd = 'cd ' + logdirOAI5GRepo + '; source oaienv ; env|grep OPENAIR' + index_RRHMachine = MachineList.index(RRHMachine) + oai_RRH = openair('localdomain', RRHMachine) + oai_RRH.connect(user, password) + res= oai_RRH.send_recv(cmd) #cleanOldPrograms(oai_eNB, oldprogramList, CleanUpAluLteBox, ExmimoRfStop) #cleanOldPrograms(oai_UE, oldprogramList, CleanUpAluLteBox, ExmimoRfStop) #cleanOldPrograms(oai_EPC, oldprogramList, CleanUpAluLteBox, ExmimoRfStop) - logdir_eNB = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename - logdir_UE = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename - logdir_EPC = logdirOpenaircnRepo+'/TEST/autotests/log/'+ testcasename logdir_local = os.environ.get('OPENAIR_DIR') if logdir_local is None: print "Environment variable OPENAIR_DIR not set correctly" @@ -667,10 +680,14 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , run_result=1 run_result_string='' logdir_eNB = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run) + logdir_RRH = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run) logdir_UE = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run) logdir_EPC = logdirOpenaircnRepo+'/TEST/autotests/log/'+ testcasename + '/run_' + str(run) logdir_local_testcase = logdir_local + '/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run) #Make the log directory of test case + if RRHMachine != '': + cmd = 'rm -fr ' + logdir_RRH + ' ; mkdir -p ' + logdir_RRH + result = oai_RRH.send_recv(cmd) cmd = 'rm -fr ' + logdir_eNB + ' ; mkdir -p ' + logdir_eNB result = oai_eNB.send_recv(cmd) cmd = 'rm -fr ' + logdir_UE + ' ; mkdir -p ' + logdir_UE @@ -679,6 +696,39 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , result = oai_EPC.send_recv(cmd) cmd = ' rm -fr ' + logdir_local_testcase + ' ; mkdir -p ' + logdir_local_testcase result = os.system(cmd) + + if RRHMachine != '': + logfile_compile_RRH = logdir_RRH + '/RRH_compile' + '_' + str(run) + '_.log' + logfile_exec_RRH = logdir_RRH + '/RRH_exec' + '_' + str(run) + '_.log' + logfile_pre_exec_RRH = logdir_RRH + '/RRH_pre_exec' + '_' + str(run) + '_.log' + logfile_task_RRH_compile_out = logdir_RRH + '/RRH_task_compile_out' + '_' + str(run) + '_.log' + logfile_task_RRH_compile = logdir_local_testcase + '/RRH_task_compile' + '_' + str(run) + '_.log' + logfile_task_RRH_out = logdir_RRH + '/RRH_task_out' + '_' + str(run) + '_.log' + logfile_task_RRH = logdir_local_testcase + '/RRH_task' + '_' + str(run) + '_.log' + task_RRH_compile = ' ( uname -a ; date \n' + task_RRH_compile = task_RRH_compile + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n' + task_RRH_compile = task_RRH_compile + 'env |grep OPENAIR \n' + if RRH_compile_prog != "": + task_RRH_compile = task_RRH_compile + ' ( ' + RRH_compile_prog + ' '+ RRH_compile_prog_args + ' ) > ' + logfile_compile_RRH + ' 2>&1 \n' + task_RRH_compile = task_RRH_compile + ' date ) > ' + logfile_task_RRH_compile_out + ' 2>&1 ' + write_file(logfile_task_RRH_compile, task_RRH_compile, mode="w") + + task_RRH = ' ( uname -a ; date \n' + task_RRH = task_RRH + ' export OPENAIR_TESTDIR=' + logdir_RRH + '\n' + task_RRH = task_RRH + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n' + task_RRH = task_RRH + 'env |grep OPENAIR \n' + 'array_exec_pid=() \n' + + if RRH_pre_exec != "": + task_RRH = task_RRH + ' ( date; ' + RRH_pre_exec + ' '+ RRH_pre_exec_args + ' ) > ' + logfile_pre_exec_RRH + ' 2>&1 \n' + if RRH_main_exec != "": + task_RRH = task_RRH + ' ( date; ' + addsudo(RRH_main_exec + ' ' + RRH_main_exec_args, mypassword) + ' ) > ' + logfile_exec_RRH + ' 2>&1 & \n' + task_RRH = task_RRH + 'array_exec_pid+=($!) \n' + task_RRH = task_RRH + 'echo eNB_main_exec PID = $! \n' + #terminate the eNB test case after timeout_cmd seconds + task_RRH = task_RRH + finalize_deploy_script (timeout_cmd, RRH_terminate_missing_procs) + ' \n' + task_RRH = task_RRH + 'handle_ctrl_c' + '\n' + task_RRH = task_RRH + ' ) > ' + logfile_task_RRH_out + ' 2>&1 ' + write_file(logfile_task_RRH, task_RRH, mode="w") logfile_compile_eNB = logdir_eNB + '/eNB_compile' + '_' + str(run) + '_.log' logfile_exec_eNB = logdir_eNB + '/eNB_exec' + '_' + str(run) + '_.log' @@ -839,14 +889,20 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , thread_EPC = oaiThread(1, "EPC_thread", EPCMachine, user, password , task_EPC_compile, False, timeout_thread) thread_eNB = oaiThread(2, "eNB_thread", eNBMachine, user, password , task_eNB_compile, False, timeout_thread) thread_UE = oaiThread(3, "UE_thread", UEMachine, user, password , task_UE_compile, False, timeout_thread) + if RRHMachine != '': + thread_RRH = oaiThread(4, "RRH_thread", RRHMachine, user, password , task_RRH_compile, False, timeout_thread) threads=[] threads.append(thread_eNB) threads.append(thread_UE) threads.append(thread_EPC) + if RRHMachine != '': + threads.append(thread_RRH) # Start new Threads thread_eNB.start() thread_UE.start() thread_EPC.start() + if RRHMachine != '': + thread_RRH.start() #Wait for all the compile threads to complete for t in threads: t.join() @@ -855,26 +911,29 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , thread_EPC = oaiThread(1, "EPC_thread", EPCMachine, user, password , task_EPC, False, timeout_thread) thread_eNB = oaiThread(2, "eNB_thread", eNBMachine, user, password , task_eNB, False, timeout_thread) thread_UE = oaiThread(3, "UE_thread", UEMachine, user, password , task_UE, False, timeout_thread) - + if RRHMachine != '': + thread_RRH = oaiThread(4, "RRH_thread", RRHMachine, user, password , task_RRH, False, timeout_thread) threads=[] threads.append(thread_eNB) threads.append(thread_UE) threads.append(thread_EPC) + if RRHMachine != '': + threads.append(thread_RRH) # Start new Threads thread_eNB.start() thread_UE.start() thread_EPC.start() - + if RRHMachine != '': + thread_RRH.start() #Wait for all the compile threads to complete for t in threads: t.join() #Now we get the log files from remote machines on the local machine - cleanOldProgramsAllMachines([oai_eNB, oai_UE, oai_EPC] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop) - - #cleanOldPrograms(oai_eNB, oldprogramList, CleanUpAluLteBox, ExmimoRfStop) - #cleanOldPrograms(oai_UE, oldprogramList, CleanUpAluLteBox, ExmimoRfStop) - #cleanOldPrograms(oai_EPC, oldprogramList, CleanUpAluLteBox, ExmimoRfStop) + if RRHMachine != '': + cleanOldProgramsAllMachines([oai_eNB, oai_UE, oai_EPC, oai_RRH] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop) + else: + cleanOldProgramsAllMachines([oai_eNB, oai_UE, oai_EPC] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop) logfile_UE_stop_script_out = logdir_UE + '/UE_stop_script_out' + '_' + str(run) + '_.log' logfile_UE_stop_script = logdir_local_testcase + '/UE_stop_script' + '_' + str(run) + '_.log' @@ -902,22 +961,23 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , res= oai_EPC.send_recv(cmd) print "Changing permissions of logdir <" + logdir_EPC + "> in EPC machine..." + res + if RRHMachine != '': + cmd = 'sudo -E chown -R ' + user + ' ' + logdir_RRH + res= oai_RRH.send_recv(cmd) + print "Changing permissions of logdir <" + logdir_RRH + "> in RRH machine..." + res print "Copying files from EPCMachine : " + EPCMachine + "logdir_EPC = " + logdir_EPC - #ssh = SSHSession(EPCMachine , username=user, key_file=None, password=password) - #ssh.get_all(logdir_EPC , logdir_local + '/cmake_targets/autotests/log/'+ testcasename) SSHSessionWrapper(EPCMachine, user, None, password, logdir_EPC, logdir_local + '/cmake_targets/autotests/log/'+ testcasename, "get_all") print "Copying files from eNBMachine " + eNBMachine + "logdir_eNB = " + logdir_eNB - #ssh = SSHSession(eNBMachine , username=user, key_file=None, password=password) - #ssh.get_all(logdir_eNB, logdir_local + '/cmake_targets/autotests/log/'+ testcasename) SSHSessionWrapper(eNBMachine, user, None, password, logdir_eNB, logdir_local + '/cmake_targets/autotests/log/'+ testcasename, "get_all") print "Copying files from UEMachine : " + UEMachine + "logdir_UE = " + logdir_UE - #ssh = SSHSession(UEMachine , username=user, key_file=None, password=password) - #ssh.get_all(logdir_UE , logdir_local + '/cmake_targets/autotests/log/'+ testcasename) SSHSessionWrapper(UEMachine, user, None, password, logdir_UE, logdir_local + '/cmake_targets/autotests/log/'+ testcasename, "get_all") + if RRHMachine != '': + print "Copying files from RRHMachine : " + RRHMachine + "logdir_RRH = " + logdir_RRH + SSHSessionWrapper(RRHMachine, user, None, password, logdir_RRH, logdir_local + '/cmake_targets/autotests/log/'+ testcasename, "get_all") #Currently we only perform throughput tests @@ -1019,8 +1079,8 @@ class oaiCleanOldProgramThread (threading.Thread): error = error + '\n threadID = ' + str(self.threadID) + '\n threadname = ' + self.threadname + '\n CleanUpOldProgs = ' + self.CleanUpOldProgs + '\n CleanUpAluLteBox = ' + self.CleanUpAluLteBox + '\n ExmimoRfStop = ' + self.ExmimoRfStop + '\n' error = error + traceback.format_exc() print error - print "There is error in cleaning up old programs. The test case execution cannot continue...." - sys.exit(1) + print "There is error in cleaning up old programs....." + #sys.exit(1) # \brief Run parallel threads in all machines for clean up old execution of test cases # \param oai_list list of handlers that can be used to execute programs on remote machines diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 2a6c5c4f5a..e28597d3f2 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -6,11 +6,11 @@ https://gitlab.eurecom.fr/oai/openair-cn.git develop develop - oaisim* oaisim_nos1* lte-softmodem* lte-softmodem-nos1* mme_gw* run_epc* run_hss* hss hss_sim configure_cots_bandrich_ue* wvdial* iperf iperf_script ping tshark + oaisim* oaisim_nos1* lte-softmodem* lte-softmodem-nos1* mme_gw* run_epc* run_hss* hss hss_sim configure_cots_bandrich_ue* wvdial* iperf iperf_script ping tshark rrh_gw sudo -S -E /opt/ltebox/tools/stop_ltebox $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; uname -a; dmesg|tail 36000 - 0102+ 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016002 016005 016102 016105 016302 016305 016502 016505 017002 017005 + 0102+ 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016002 016005 016102 016105 016302 016305 016502 016505 017002 017005 017502 017505 3 mozart calisson stevens nano amerique @@ -5530,6 +5530,461 @@ 10 + + lte-softmodem + + calisson + stevens + amerique + mozart + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=5;tx_sample_advance=70;tx_scheduling_advance=9;" + + $OPENAIR_DIR/cmake_targets/build_oai + --RRH -w USRP -t ETHERNET -c --disable-deadline + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw + -n1 -g3 -x -i eth1 + False + + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w None -t ETHERNET -x -c --disable-deadline + + + sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + + + + + False + + /tmp + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 + + throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPb210.RRH.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX + 10 + + + + + lte-softmodem + + calisson + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + + + + + True + + /tmp + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + + + + True + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 + + throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + True + USRPb210.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX + 10 + + + + lte-softmodem + + calisson + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + + + + + True + + /tmp + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + + + + True + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1 + + throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + True + USRPb210.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX + 10 + + + + lte-softmodem + + calisson + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + + + + + True + + /tmp + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + + True + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 + + + True + USRPb210.RRH.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX + 10 + + + + lte-softmodem + + calisson + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + + + + + True + + /tmp + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + + throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + True + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 + + + True + USRPb210.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX + 10 + + + + lte-softmodem + + calisson + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + + + + + True + + /tmp + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + + throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + + True + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue + + + /tmp + + + + + + + + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 + + + True + USRPb210.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX + 10 + + + From d33d2f5ed5ea76a3d8d4a533f07717c3ab6d47f6 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 3 Mar 2016 10:41:49 +0100 Subject: [PATCH 101/122] install libxslt --- cmake_targets/tools/build_helper | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 0d68c5d8d7..810b7349d2 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -269,7 +269,9 @@ check_install_oai_software() { pydb \ wvdial \ python-numpy \ - sshpass + sshpass \ + libxslt1-dev + $SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so if [ `lsb_release -rs` = '12.04' ] ; then install_nettle_from_source @@ -398,4 +400,4 @@ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then fi return $stat -} \ No newline at end of file +} From 58fa110a0bc106d6d7cedf48ee3a3c2e752735ef Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 3 Mar 2016 12:25:00 +0100 Subject: [PATCH 102/122] installer support in Gitlab CI --- .../autotests/run_exec_lte-softmodem_tests.py | 19 +++++++++++++++++-- cmake_targets/autotests/test_case_list.xml | 8 ++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index 98e5e42c39..8ffb593cec 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -1123,6 +1123,7 @@ flag_remove_logdir=False flag_start_testcase=False nruns_lte_softmodem='' flag_skip_git_head_check=False +flag_skip_oai_install=False Timeout_cmd='' print "Number of arguments argc = " + str(len(sys.argv)) #for index in range(1,len(sys.argv) ): @@ -1182,6 +1183,8 @@ while i < len (sys.argv): elif arg == '--timeout_cmd': Timeout_cmd = sys.argv[i+1] i = i +1 + elif arg == '--skip-oai-install': + flag_skip_oai_install=True elif arg == '-h' : print "-s: This flag *MUST* be set to start the test cases" print "-r: Remove the log directory in autotests" @@ -1197,6 +1200,7 @@ while i < len (sys.argv): print "-MachineListGeneric : overrides the MachineListGeneric parameter in test_case_list.xml" print "--skip-git-head-check: skip checking of GitHead remote/local branch (only for debugging)" print "--timeout_cmd: Override the default parameter (timeout_cmd) in test_case_list.xml. This parameter is in seconds and should be > 120" + print "--skip-oai-install: Skips the openairinterface5g installer" sys.exit() else : print "Unrecongnized Option: <" + arg + ">. Use -h to see valid options" @@ -1405,6 +1409,17 @@ for oai in oai_list: else: cmd = cmd + 'if [ \"$git_head\" != \"'+ GitOAI5GHeadVersion + '\" ]; then echo \"error: Git openairinterface5g head version does not match\" ; fi \n' cmd = cmd + 'source oaienv' + '\n' + if flag_skip_oai_install == False: + cmd = cmd + 'source $OPENAIR_DIR/cmake_targets/tools/build_helper \n' + cmd = cmd + 'echo \"Installing core OAI dependencies...Start\" \n' + cmd = cmd + '$OPENAIR_DIR/cmake_targets/build_oai -I --install-optional-packages \n' + cmd = cmd + 'echo \"Installing core OAI dependencies...Finished\" \n' + cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Start\" \n' + cmd = cmd + 'check_install_bladerf_driver \n' + cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Finished\" \n' + cmd = cmd + 'echo \"Installing USRP OAI dependencies...Start\" \n' + cmd = cmd + 'check_install_usrp_uhd_driver \n' + cmd = cmd + 'echo \"Installing USRP OAI dependencies...Finished\" \n' cmd = cmd + 'cd ' + logdirOpenaircnRepo + '\n' cmd = cmd + 'git checkout ' + GitOpenaircnRepoBranch + '\n' cmd = cmd + 'env |grep OPENAIR' + '\n' @@ -1413,7 +1428,7 @@ for oai in oai_list: #cmd = cmd + 'echo \' ' + cmd + '\' > ' + setup_script + ' 2>&1 \n ' #result = oai_list[index].send_recv(cmd, False, 300 ) write_file(setup_script, cmd, mode="w") - tempThread = oaiThread(index, 'thread_setup_'+str(index)+'_' + MachineList[index] , MachineList[index] , user, pw, cmd, False, 300) + tempThread = oaiThread(index, 'thread_setup_'+str(index)+'_' + MachineList[index] , MachineList[index] , user, pw, cmd, False, 3000) threads_init_setup.append(tempThread ) tempThread.start() index = index + 1 @@ -1461,7 +1476,7 @@ status, out = commands.getstatusoutput('grep ' + ' -il \'error\' ' + locallogdi if (out != '') : print "There is error in setup of machines" print "status = " + str(status) + "\n Check files for error = " + out - print sys.exit(1) + print "Continuing..." cleanOldProgramsAllMachines(oai_list, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop) if cleanUpRemoteMachines == True: diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index e28597d3f2..8478d6b898 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -5551,10 +5551,10 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=5;tx_sample_advance=70;tx_scheduling_advance=9;" From 95e43d4ba34e6a119844375e59d1a57d86b2d3e4 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 4 Mar 2016 16:47:28 +0100 Subject: [PATCH 103/122] exit on setup error and disable USRP/BladeRF driver installation --- .../autotests/run_exec_lte-softmodem_tests.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index 8ffb593cec..3418798954 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -1414,12 +1414,12 @@ for oai in oai_list: cmd = cmd + 'echo \"Installing core OAI dependencies...Start\" \n' cmd = cmd + '$OPENAIR_DIR/cmake_targets/build_oai -I --install-optional-packages \n' cmd = cmd + 'echo \"Installing core OAI dependencies...Finished\" \n' - cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Start\" \n' - cmd = cmd + 'check_install_bladerf_driver \n' - cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Finished\" \n' - cmd = cmd + 'echo \"Installing USRP OAI dependencies...Start\" \n' - cmd = cmd + 'check_install_usrp_uhd_driver \n' - cmd = cmd + 'echo \"Installing USRP OAI dependencies...Finished\" \n' + #cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Start\" \n' + #cmd = cmd + 'check_install_bladerf_driver \n' + #cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Finished\" \n' + #cmd = cmd + 'echo \"Installing USRP OAI dependencies...Start\" \n' + #cmd = cmd + 'check_install_usrp_uhd_driver \n' + #cmd = cmd + 'echo \"Installing USRP OAI dependencies...Finished\" \n' cmd = cmd + 'cd ' + logdirOpenaircnRepo + '\n' cmd = cmd + 'git checkout ' + GitOpenaircnRepoBranch + '\n' cmd = cmd + 'env |grep OPENAIR' + '\n' @@ -1476,7 +1476,8 @@ status, out = commands.getstatusoutput('grep ' + ' -il \'error\' ' + locallogdi if (out != '') : print "There is error in setup of machines" print "status = " + str(status) + "\n Check files for error = " + out - print "Continuing..." + print "Exiting now..." + sys.exit(1) cleanOldProgramsAllMachines(oai_list, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop) if cleanUpRemoteMachines == True: From 8b1d2836b7a4bb4155577f9439166e3e634af363 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Sat, 5 Mar 2016 21:14:00 +0100 Subject: [PATCH 104/122] fixing compilation of mbmssim --- openair1/SIMULATION/LTE_PHY/mbmssim.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 98d1b68a15..0044b2ff51 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -173,7 +173,9 @@ int main(int argc, char **argv) lte_frame_type_t frame_type = FDD; + uint32_t Nsoft = 1827072; + /* #ifdef XFORMS FD_lte_phy_scope_ue *form_ue; char title[255]; @@ -183,6 +185,7 @@ int main(int argc, char **argv) sprintf (title, "LTE DL SCOPE UE"); fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); #endif + */ logInit(); number_of_cards = 1; @@ -382,14 +385,14 @@ int main(int argc, char **argv) 0); // Create transport channel structures for 2 transport blocks (MIMO) - PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,N_RB_DL,0); + PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0); if (!PHY_vars_eNB->dlsch_eNB_MCH) { printf("Can't get eNB dlsch structures\n"); exit(-1); } - PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); + PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); PHY_vars_eNB->lte_frame_parms.num_MBSFN_config = 1; PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; From 9d028e6a260be6add9b9a4df46bc2961cf640be2 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 8 Mar 2016 10:52:33 +0100 Subject: [PATCH 105/122] added low-band RX calibration files for SoDeRa. --- ...sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini | 1128 +++++++++++++++++ ..._sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini | 1128 +++++++++++++++++ 2 files changed, 2256 insertions(+) create mode 100644 targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini create mode 100644 targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini new file mode 100644 index 0000000000..f47d3bf433 --- /dev/null +++ b/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini @@ -0,0 +1,1128 @@ +[reference_clocks] +sxr_ref_clk_mhz=30.72 +sxt_ref_clk_mhz=30.72 +[lms7002_registers_b] +0x05A7=0x0000 +0x05A5=0x0000 +0x05A2=0x0000 +0x05A0=0x0000 +0x0599=0x0000 +0x0598=0x0000 +0x0596=0x0000 +0x0594=0x0000 +0x0592=0x0000 +0x0591=0x0000 +0x0590=0x0000 +0x058E=0x0000 +0x058C=0x0000 +0x059D=0x0000 +0x058A=0x0000 +0x0589=0x0000 +0x0587=0x0000 +0x0585=0x0000 +0x0595=0x0000 +0x0584=0x0000 +0x059F=0x0000 +0x0583=0x0000 +0x0582=0x0000 +0x0567=0x0000 +0x0566=0x0000 +0x0565=0x0000 +0x0564=0x0000 +0x0563=0x0000 +0x0562=0x0000 +0x055F=0x0000 +0x055D=0x0000 +0x055A=0x0000 +0x058F=0x0000 +0x0557=0x0000 +0x0593=0x0000 +0x0554=0x0000 +0x0552=0x0000 +0x0551=0x0000 +0x0550=0x0000 +0x054D=0x0000 +0x054C=0x0000 +0x0549=0x0000 +0x0547=0x0000 +0x0546=0x0000 +0x0545=0x0000 +0x0544=0x0000 +0x0543=0x0000 +0x0553=0x0000 +0x0542=0x0000 +0x0541=0x0000 +0x0527=0x0000 +0x0526=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0523=0x0000 +0x0521=0x0000 +0x055C=0x0000 +0x051A=0x0000 +0x0519=0x0000 +0x0518=0x0000 +0x0514=0x0000 +0x0513=0x0000 +0x0511=0x0000 +0x05A6=0x0000 +0x051E=0x0000 +0x050F=0x0000 +0x0516=0x0000 +0x050E=0x0000 +0x050C=0x0000 +0x050B=0x0000 +0x050A=0x0000 +0x0509=0x0000 +0x0507=0x0000 +0x0506=0x0000 +0x0503=0x0000 +0x04E7=0x0000 +0x04E6=0x0000 +0x0512=0x0000 +0x04E5=0x0000 +0x04E4=0x0000 +0x0321=0x0000 +0x0320=0x0000 +0x0323=0x0000 +0x031B=0x0000 +0x0319=0x0000 +0x0260=0x0000 +0x031F=0x0000 +0x0360=0x0000 +0x0312=0x0000 +0x0310=0x0000 +0x0245=0x0000 +0x0581=0x0000 +0x045D=0x0000 +0x030E=0x0000 +0x0203=0x0000 +0x0482=0x0000 +0x0588=0x0000 +0x0308=0x0000 +0x048A=0x0000 +0x0307=0x0000 +0x0282=0x0000 +0x038C=0x0000 +0x0510=0x0000 +0x0302=0x0000 +0x0301=0x0000 +0x0309=0x0000 +0x0300=0x0000 +0x044E=0x0000 +0x034F=0x0000 +0x055B=0x0000 +0x0114=0x008D +0x02E5=0x0000 +0x02E4=0x0000 +0x02E1=0x0000 +0x02D5=0x0000 +0x0259=0x0000 +0x0517=0x0000 +0x0481=0x0000 +0x030B=0x0000 +0x0392=0x0000 +0x02DE=0x0000 +0x02DD=0x0000 +0x0297=0x0000 +0x0209=0x0000 +0x0400=0x0081 +0x02D8=0x0000 +0x0104=0x0088 +0x0103=0x0A12 +0x0347=0x0000 +0x0457=0x0000 +0x058D=0x0000 +0x02D7=0x0000 +0x02D1=0x0000 +0x04C8=0x0000 +0x02D3=0x0000 +0x02CB=0x0000 +0x0250=0x0000 +0x0306=0x0000 +0x04A4=0x0000 +0x044A=0x0000 +0x054B=0x0000 +0x02C7=0x0000 +0x02C1=0x0000 +0x031D=0x0000 +0x0440=0x0020 +0x045E=0x0000 +0x02C4=0x0000 +0x02C2=0x0000 +0x02DB=0x0000 +0x0357=0x0000 +0x0201=0x07FF +0x0483=0x0000 +0x05A4=0x0000 +0x02A3=0x0000 +0x02A1=0x0000 +0x028D=0x0000 +0x02D2=0x0000 +0x039C=0x0000 +0x02A0=0x0000 +0x010E=0x2040 +0x030A=0x0000 +0x029F=0x0000 +0x029C=0x0000 +0x029E=0x0000 +0x011D=0x9555 +0x039E=0x0000 +0x0296=0x0000 +0x0555=0x0000 +0x0349=0x0000 +0x0295=0x0000 +0x010D=0x009E +0x04C4=0x0000 +0x0292=0x0000 +0x02CF=0x0000 +0x04D1=0x0000 +0x0291=0x0000 +0x02DF=0x0000 +0x0290=0x0000 +0x020A=0x0080 +0x0102=0x3180 +0x0388=0x0000 +0x0120=0xB9FF +0x0317=0x0000 +0x0244=0x0000 +0x059B=0x0000 +0x0322=0x0000 +0x010F=0x3042 +0x0119=0x18CB +0x02A6=0x0000 +0x051F=0x0000 +0x029A=0x0000 +0x049A=0x0000 +0x059E=0x0000 +0x04D7=0x0000 +0x0318=0x0000 +0x02A7=0x0000 +0x0200=0x0081 +0x02C5=0x0000 +0x0122=0x033F +0x0110=0x0BF4 +0x0204=0x0000 +0x0252=0x0000 +0x011E=0x05DC +0x049B=0x0000 +0x0294=0x0000 +0x011C=0xAD41 +0x02D6=0x0000 +0x0311=0x0000 +0x0117=0x280C +0x0540=0x0000 +0x02A4=0x0000 +0x0485=0x0000 +0x02E0=0x0000 +0x0118=0x018C +0x0489=0x0000 +0x04A7=0x0000 +0x0101=0x7800 +0x0558=0x0000 +0x02C6=0x0000 +0x05A1=0x0000 +0x02C9=0x0000 +0x0500=0x0000 +0x039D=0x0000 +0x011F=0x3680 +0x030C=0x0000 +0x04DF=0x0000 +0x0281=0x0000 +0x0106=0x3182 +0x028E=0x0000 +0x0326=0x0000 +0x0113=0x03C3 +0x04CB=0x0000 +0x0391=0x0000 +0x0105=0x0007 +0x02D9=0x0000 +0x02CE=0x0000 +0x044F=0x0000 +0x038B=0x0000 +0x02D4=0x0000 +0x0107=0x318C +0x0495=0x0000 +0x0246=0x0000 +0x0303=0x0000 +0x02E6=0x0000 +0x045B=0x0000 +0x0100=0x3409 +0x0340=0x0000 +0x0208=0x0070 +0x0111=0x0083 +0x0247=0x0000 +0x024B=0x0000 +0x045C=0x0000 +0x024D=0x0000 +0x0202=0x07FF +0x0383=0x0000 +0x054A=0x0000 +0x0401=0x07FF +0x0206=0x0000 +0x0124=0x0000 +0x0341=0x0000 +0x0287=0x0000 +0x0501=0x0000 +0x034C=0x0000 +0x030F=0x0000 +0x025D=0x0000 +0x0406=0x0000 +0x051B=0x0000 +0x0313=0x0000 +0x010A=0x104C +0x0461=0x0000 +0x0121=0x356A +0x0115=0x0009 +0x0112=0xC0E6 +0x039A=0x0000 +0x02CC=0x0000 +0x0116=0x8180 +0x04A0=0x0000 +0x0108=0x9442 +0x020B=0x4000 +0x0251=0x0000 +0x0488=0x0000 +0x0241=0x0000 +0x038F=0x0000 +0x02DC=0x0000 +0x024C=0x0000 +0x0494=0x0000 +0x051D=0x0000 +0x0243=0x0000 +0x0556=0x0000 +0x040A=0x0000 +0x04CD=0x0000 +0x0249=0x0000 +0x0261=0x0000 +0x024A=0x0000 +0x0285=0x0000 +0x0280=0x0000 +0x0346=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0253=0x0000 +0x0255=0x0000 +0x0502=0x0000 +0x0258=0x0000 +0x0298=0x0000 +0x05A3=0x0000 +0x0367=0x0000 +0x0240=0x0020 +0x0256=0x0000 +0x0242=0x0000 +0x025A=0x0000 +0x04E2=0x0000 +0x04C5=0x0000 +0x025B=0x0000 +0x020C=0x7FFF +0x0205=0x0000 +0x0361=0x0000 +0x0515=0x0000 +0x025C=0x0000 +0x0355=0x0000 +0x044C=0x0000 +0x010C=0x88FD +0x0284=0x0000 +0x0396=0x0000 +0x0286=0x0000 +0x028F=0x0000 +0x031C=0x0000 +0x031A=0x0000 +0x0363=0x0000 +0x0289=0x0000 +0x059C=0x0000 +0x04DD=0x0000 +0x028A=0x0000 +0x040C=0x0000 +0x028B=0x0000 +0x0450=0x0000 +0x0352=0x0000 +0x028C=0x0000 +0x04C2=0x0000 +0x025E=0x0000 +0x04DA=0x0000 +0x0327=0x0000 +0x0380=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0561=0x0000 +0x0344=0x0000 +0x0586=0x0000 +0x0484=0x0000 +0x0345=0x0000 +0x0505=0x0000 +0x035B=0x0000 +0x034A=0x0000 +0x0455=0x0000 +0x011A=0x2E02 +0x034B=0x0000 +0x034D=0x0000 +0x035C=0x0000 +0x034E=0x0000 +0x0293=0x0000 +0x03A6=0x0000 +0x0350=0x0000 +0x0445=0x0000 +0x048F=0x0000 +0x0351=0x0000 +0x0353=0x0000 +0x050D=0x0000 +0x02CD=0x0000 +0x0490=0x0000 +0x0354=0x0000 +0x0348=0x0000 +0x0498=0x0000 +0x0356=0x0000 +0x0316=0x0000 +0x030D=0x0000 +0x040E=0x0000 +0x0522=0x0000 +0x049F=0x0000 +0x029D=0x0000 +0x04A3=0x0000 +0x0359=0x0000 +0x0299=0x0000 +0x0452=0x0000 +0x02C8=0x0000 +0x035A=0x0000 +0x0449=0x0000 +0x0442=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x0597=0x0000 +0x035F=0x0000 +0x0325=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0381=0x0000 +0x0288=0x0000 +0x0382=0x0000 +0x0384=0x0000 +0x0315=0x0000 +0x0385=0x0000 +0x054F=0x0000 +0x0389=0x0000 +0x04E3=0x0000 +0x040F=0x0000 +0x0386=0x0000 +0x054E=0x0000 +0x02D0=0x0000 +0x03A0=0x0000 +0x0387=0x0000 +0x0362=0x0000 +0x038A=0x0000 +0x0395=0x0000 +0x038D=0x0000 +0x02E7=0x0000 +0x0324=0x0000 +0x038E=0x0000 +0x0305=0x0000 +0x0393=0x0000 +0x0459=0x0000 +0x0394=0x0000 +0x0123=0x267B +0x0497=0x0000 +0x0398=0x0000 +0x0408=0x0000 +0x0399=0x0000 +0x039B=0x0000 +0x0248=0x0000 +0x039F=0x0000 +0x049E=0x0000 +0x059A=0x0000 +0x048D=0x0000 +0x051C=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x0520=0x0000 +0x03A7=0x0000 +0x055E=0x0000 +0x0402=0x07FF +0x0403=0x0000 +0x04D8=0x0000 +0x0560=0x0000 +0x0404=0x0000 +0x0254=0x0000 +0x0405=0x0000 +0x0407=0x0000 +0x0580=0x0000 +0x0409=0x0000 +0x040B=0x7FFF +0x040D=0x0000 +0x0441=0x0000 +0x0508=0x0000 +0x0443=0x0000 +0x0444=0x0000 +0x04CA=0x0000 +0x0446=0x0000 +0x0454=0x0000 +0x0448=0x0000 +0x044B=0x0000 +0x02E2=0x0000 +0x044D=0x0000 +0x0390=0x0000 +0x0451=0x0000 +0x0453=0x0000 +0x0559=0x0000 +0x0456=0x0000 +0x0314=0x0000 +0x0458=0x0000 +0x02DA=0x0000 +0x045A=0x0000 +0x0447=0x0000 +0x0460=0x0000 +0x0480=0x0000 +0x045F=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0358=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x0283=0x0000 +0x048E=0x0000 +0x029B=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x04A1=0x0000 +0x0493=0x0000 +0x04C3=0x0000 +0x0496=0x0000 +0x02C0=0x0000 +0x0499=0x0000 +0x02E3=0x0000 +0x0397=0x0000 +0x049C=0x0000 +0x04C7=0x0000 +0x049D=0x0000 +0x0109=0x61C1 +0x04A2=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x0257=0x0000 +0x04D6=0x0000 +0x031E=0x0000 +0x04C0=0x0000 +0x02CA=0x0000 +0x04C9=0x0000 +0x02C3=0x0000 +0x04C1=0x0000 +0x0207=0x0000 +0x04C6=0x0000 +0x02A5=0x0000 +0x04CC=0x0000 +0x04CE=0x0000 +0x025F=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x0548=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x0504=0x0000 +0x04D4=0x0000 +0x0304=0x0000 +0x04D5=0x0000 +0x04D9=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x058B=0x0000 +0x04DE=0x0000 +0x04E0=0x0000 +0x02A2=0x0000 +0x03A1=0x0000 +0x04E1=0x0000 +[lms7002_registers_a] +0x05A7=0x0000 +0x05A5=0x0000 +0x05A2=0x0000 +0x0599=0x0000 +0x0598=0xF61D +0x0596=0x0A94 +0x0594=0xF40D +0x0592=0x0DF1 +0x0591=0xFCFE +0x0590=0xEF99 +0x058E=0x1316 +0x058C=0xEA50 +0x059D=0x0000 +0x058A=0x17DC +0x0585=0xDAA2 +0x0595=0x00BC +0x0584=0xE7E2 +0x059F=0x0000 +0x0583=0x2E45 +0x0582=0x150F +0x0567=0x4049 +0x0566=0x0906 +0x0565=0xB77F +0x0563=0x4F91 +0x055F=0x5852 +0x055D=0xA6B5 +0x055A=0xBE2A +0x058F=0x0605 +0x0557=0x4C24 +0x0593=0x00D8 +0x0554=0x6901 +0x0552=0x8D44 +0x0551=0xD7B7 +0x0550=0x79FA +0x054C=0x7FFF +0x0549=0x18C9 +0x0547=0xD7B7 +0x0546=0x8D44 +0x0545=0x364E +0x0544=0x6901 +0x0543=0xBD96 +0x0553=0x364E +0x0542=0xA2B5 +0x0541=0x4C24 +0x0527=0xACB9 +0x0526=0xBE2A +0x0525=0x57AC +0x0523=0xA6B5 +0x0521=0x5852 +0x055C=0x3347 +0x051A=0x0906 +0x0518=0xEFF2 +0x0514=0xE7E2 +0x0513=0xDAA2 +0x0511=0x1D10 +0x05A6=0x0000 +0x051E=0xF524 +0x050F=0xEA5F +0x0516=0x150F +0x050E=0x17DC +0x050C=0xEA50 +0x050B=0xF5EF +0x050A=0x1316 +0x0509=0x0605 +0x0507=0xFCFE +0x0506=0x0DF1 +0x0503=0x00BC +0x04E7=0x0000 +0x04E6=0x0000 +0x04E4=0x0000 +0x04E0=0x0000 +0x058B=0x0F45 +0x04DE=0x0000 +0x04DC=0x0000 +0x04DB=0x0000 +0x04D9=0x0000 +0x04D8=0x0000 +0x059E=0x0000 +0x04D7=0x0000 +0x0504=0xF40D +0x04D4=0x0000 +0x04D3=0x0000 +0x0548=0x79FA +0x04D2=0x0000 +0x04D1=0x0000 +0x04D0=0x0000 +0x04CE=0x0000 +0x04C8=0x0000 +0x04E2=0x0000 +0x04C5=0x0000 +0x04C4=0x0000 +0x04C2=0x0000 +0x04A7=0x0000 +0x04A6=0x0000 +0x04A5=0x0000 +0x04A1=0x0000 +0x04A0=0x0000 +0x0522=0xDB10 +0x049F=0x0000 +0x049E=0x0000 +0x04C7=0x0000 +0x049D=0x0000 +0x049B=0x0000 +0x049A=0x0000 +0x04C3=0x0000 +0x0496=0x0000 +0x0494=0x0000 +0x02D3=0x0000 +0x02D1=0x0000 +0x02CB=0x0000 +0x0250=0x0000 +0x0096=0x0000 +0x04C1=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C2=0x0000 +0x0499=0x0000 +0x02C0=0x0000 +0x0201=0x07FF +0x0483=0x0000 +0x05A4=0x0000 +0x02A3=0x0000 +0x008B=0x2756 +0x02A1=0x0000 +0x028D=0x0000 +0x029C=0x0000 +0x029E=0x0000 +0x0297=0x0000 +0x0296=0x0000 +0x0555=0xBD96 +0x0349=0x0000 +0x010D=0x015C +0x02CF=0x0000 +0x0291=0x0000 +0x02DF=0x0000 +0x0290=0x0000 +0x0021=0x0E9F +0x0450=0x0000 +0x0558=0x5009 +0x02C6=0x0000 +0x0101=0x7800 +0x059C=0x0000 +0x04DD=0x0000 +0x028A=0x0000 +0x0121=0x3652 +0x0285=0x0000 +0x0280=0x0000 +0x0319=0x0000 +0x04CF=0x0000 +0x025F=0x0000 +0x025D=0x0000 +0x030F=0x0000 +0x0406=0x0000 +0x02C5=0x0000 +0x0200=0x0301 +0x0281=0x0000 +0x04A2=0x0000 +0x0109=0x8CC1 +0x0355=0x0000 +0x044C=0x0000 +0x025B=0x0000 +0x0298=0x0000 +0x0502=0x0A94 +0x0258=0x0000 +0x0255=0x0000 +0x04D6=0x0000 +0x0257=0x0000 +0x0252=0x0000 +0x0204=0xC016 +0x024F=0x0000 +0x04CC=0x0000 +0x02A5=0x0000 +0x0497=0x0000 +0x0123=0x067B +0x0495=0x0000 +0x0246=0x0000 +0x051D=0x4F91 +0x0243=0x0000 +0x0556=0xA2B5 +0x040A=0x1000 +0x025A=0x0000 +0x0242=0x0000 +0x020C=0x8000 +0x0251=0x0000 +0x02DD=0x0000 +0x0020=0xFFFD +0x0488=0x0000 +0x020A=0x0080 +0x0102=0x3180 +0x04C6=0x0000 +0x0207=0x0000 +0x04DA=0x0000 +0x025E=0x0000 +0x0206=0x0000 +0x00A3=0x6565 +0x02E2=0x0000 +0x044D=0x0000 +0x0292=0x0000 +0x002A=0x0086 +0x0245=0x0000 +0x0581=0xC89D +0x045D=0x0000 +0x024D=0x0000 +0x002B=0x4032 +0x02A0=0x0000 +0x010E=0x0285 +0x0286=0x0000 +0x009E=0x658C +0x0088=0x04F0 +0x0085=0x0001 +0x0295=0x0000 +0x0089=0x0048 +0x0256=0x0000 +0x0093=0x0000 +0x0092=0x0001 +0x031B=0x0000 +0x0111=0x0099 +0x0095=0x0000 +0x02A7=0x0000 +0x0203=0x2F99 +0x030E=0x0000 +0x0482=0x0000 +0x05A0=0x0000 +0x009C=0x658C +0x0381=0x0000 +0x0122=0x033F +0x0110=0x0BFF +0x0100=0xB409 +0x0028=0x0101 +0x0026=0x0101 +0x0524=0x3347 +0x009D=0x6565 +0x0294=0x0000 +0x0106=0x3182 +0x028E=0x0000 +0x0326=0x0000 +0x0113=0x03C3 +0x04CB=0x0000 +0x0391=0x0000 +0x05A1=0x0000 +0x02C9=0x0000 +0x0500=0xF61D +0x039D=0x0000 +0x011F=0x3680 +0x0395=0x0000 +0x024B=0x0000 +0x045C=0x0000 +0x0247=0x0000 +0x0512=0x196B +0x04E5=0x0000 +0x0024=0x50D8 +0x0353=0x0000 +0x050D=0x0F45 +0x02CD=0x0000 +0x0490=0x0000 +0x0501=0xFDFB +0x034C=0x0000 +0x00AA=0x0000 +0x0350=0x0000 +0x0445=0x0000 +0x048F=0x0000 +0x008A=0x0491 +0x0453=0x0000 +0x0124=0x0000 +0x0260=0x0000 +0x00A1=0x6565 +0x0356=0x0000 +0x0241=0x0000 +0x04CD=0x0000 +0x0249=0x0000 +0x002C=0x0000 +0x038F=0x0000 +0x008C=0x267B +0x0459=0x0000 +0x0394=0x0000 +0x054D=0xF7A3 +0x00A6=0x0001 +0x002D=0xFFFF +0x00AC=0x2000 +0x0253=0x0000 +0x028B=0x0000 +0x040C=0x40F8 +0x0099=0x6565 +0x0310=0x0000 +0x00A2=0x6565 +0x0589=0xEA5F +0x002F=0x3840 +0x0597=0xFDFB +0x035F=0x0000 +0x0562=0xF524 +0x0025=0x0101 +0x011C=0xAD41 +0x011D=0x2AAA +0x039E=0x0000 +0x0289=0x0000 +0x0282=0x0000 +0x0307=0x0000 +0x038C=0x0000 +0x0087=0x0000 +0x0399=0x0000 +0x054B=0xF7A3 +0x02C7=0x0000 +0x0519=0x4049 +0x009F=0x658C +0x0515=0x2E45 +0x025C=0x0000 +0x00A5=0x6565 +0x0301=0x0000 +0x02C1=0x0000 +0x0259=0x0000 +0x02D5=0x0000 +0x02E1=0x0000 +0x0517=0xC89D +0x0481=0x0000 +0x00A8=0x0000 +0x02D2=0x0000 +0x039C=0x0000 +0x0564=0x0000 +0x00AB=0x0040 +0x0261=0x0000 +0x002E=0x0000 +0x02DE=0x0000 +0x0540=0x5009 +0x02A4=0x0000 +0x0485=0x0000 +0x0489=0x0000 +0x00AD=0x03FF +0x024A=0x0000 +0x0029=0x0101 +0x0097=0x0000 +0x011E=0x061D +0x00AE=0x0000 +0x00A7=0x6565 +0x020B=0x4000 +0x0098=0x0000 +0x0108=0xFC26 +0x0027=0x05E4 +0x0117=0x100C +0x0383=0x0000 +0x0202=0x0794 +0x054A=0x8184 +0x00A4=0x6565 +0x0401=0x07FF +0x0086=0x4101 +0x010C=0x8865 +0x02D8=0x0000 +0x0347=0x0000 +0x0457=0x0000 +0x0103=0x0A12 +0x0104=0x0088 +0x0357=0x0000 +0x02DB=0x0000 +0x0400=0x0101 +0x009B=0x6565 +0x0105=0x0007 +0x05A3=0x0000 +0x0240=0x0028 +0x0367=0x0000 +0x044F=0x0000 +0x038B=0x0000 +0x0284=0x0000 +0x0396=0x0000 +0x051F=0xAB08 +0x029A=0x0000 +0x0361=0x0000 +0x0205=0x0000 +0x0119=0x18DF +0x02A6=0x0000 +0x010F=0x3042 +0x04C0=0x0000 +0x031E=0x0000 +0x02CC=0x0000 +0x0116=0x8180 +0x0587=0x1D10 +0x0023=0x5550 +0x048C=0x0000 +0x0112=0x3171 +0x039A=0x0000 +0x0320=0x0000 +0x0323=0x0000 +0x0115=0x0009 +0x00A9=0x8000 +0x0244=0x0000 +0x0094=0x0000 +0x0317=0x0000 +0x0208=0x0170 +0x0340=0x0000 +0x058D=0xF5EF +0x02D7=0x0000 +0x04A3=0x0000 +0x029D=0x0000 +0x0388=0x0000 +0x0120=0xB9FF +0x04C9=0x0000 +0x02CA=0x0000 +0x0209=0x0000 +0x0082=0x8001 +0x0107=0x318C +0x02D4=0x0000 +0x02CE=0x0000 +0x02D9=0x0000 +0x02E4=0x0000 +0x024C=0x0000 +0x02DC=0x0000 +0x0118=0x018C +0x02E0=0x0000 +0x055B=0x57AC +0x0114=0x0110 +0x02E5=0x0000 +0x02E6=0x0000 +0x045B=0x0000 +0x034F=0x0000 +0x0300=0x0000 +0x044E=0x0000 +0x0510=0xE6C7 +0x0302=0x0000 +0x0303=0x0000 +0x04D5=0x0000 +0x0304=0x0000 +0x0306=0x0000 +0x04A4=0x0000 +0x044A=0x0000 +0x049C=0x0000 +0x02E3=0x0000 +0x0397=0x0000 +0x0588=0xE6C7 +0x0308=0x0000 +0x048A=0x0000 +0x0309=0x0000 +0x029F=0x0000 +0x030A=0x0000 +0x0392=0x0000 +0x030B=0x0000 +0x04DF=0x0000 +0x030C=0x0000 +0x02D6=0x0000 +0x0311=0x0000 +0x024E=0x0000 +0x0346=0x0000 +0x0312=0x0000 +0x051B=0xB77F +0x010A=0x104C +0x0461=0x0000 +0x0313=0x0000 +0x0360=0x0000 +0x028C=0x0000 +0x0352=0x0000 +0x040E=0x0003 +0x030D=0x0000 +0x0316=0x0000 +0x031F=0x0000 +0x0318=0x0000 +0x0287=0x0000 +0x0341=0x0000 +0x028F=0x0000 +0x031C=0x0000 +0x031A=0x0000 +0x0363=0x0000 +0x031D=0x0000 +0x0440=0x0024 +0x045E=0x0000 +0x0321=0x0000 +0x059B=0x0000 +0x0322=0x0000 +0x0327=0x0000 +0x0380=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0561=0xAB08 +0x0344=0x0000 +0x0586=0x196B +0x0484=0x0000 +0x0345=0x0000 +0x0505=0x00D8 +0x035B=0x0000 +0x0498=0x0000 +0x0084=0x0400 +0x0348=0x0000 +0x034A=0x0000 +0x0455=0x0000 +0x011A=0x2E14 +0x034B=0x0000 +0x034D=0x0000 +0x035C=0x0000 +0x034E=0x0000 +0x0293=0x0000 +0x03A6=0x0000 +0x0351=0x0000 +0x0354=0x0000 +0x048B=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x0299=0x0000 +0x0452=0x0000 +0x02C8=0x0000 +0x035A=0x0000 +0x0449=0x0000 +0x0442=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x038A=0x0000 +0x0362=0x0000 +0x0081=0x0000 +0x0325=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0288=0x0000 +0x0382=0x0000 +0x0384=0x0000 +0x0315=0x0000 +0x0385=0x0000 +0x054F=0x18C9 +0x0389=0x0000 +0x04E3=0x0000 +0x040F=0x43E4 +0x0386=0x0000 +0x054E=0x8184 +0x009A=0x658C +0x02D0=0x0000 +0x03A0=0x0000 +0x0387=0x0000 +0x038D=0x0000 +0x02E7=0x0000 +0x0324=0x0000 +0x038E=0x0000 +0x0305=0x0000 +0x0393=0x0000 +0x0398=0x0000 +0x0408=0x0000 +0x039B=0x0000 +0x0248=0x0000 +0x039F=0x0000 +0x04E1=0x0000 +0x02A2=0x0000 +0x03A1=0x0000 +0x059A=0x0000 +0x048D=0x0000 +0x051C=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x0520=0x174B +0x03A7=0x0000 +0x055E=0xDB10 +0x0402=0x07D9 +0x0403=0x0013 +0x0560=0x174B +0x00A0=0x6565 +0x0404=0x0000 +0x0254=0x0000 +0x0405=0x0000 +0x0407=0x0000 +0x0580=0xEFF2 +0x0409=0x0000 +0x040B=0x000F +0x040D=0x0000 +0x0441=0x0000 +0x0508=0xEF99 +0x0443=0x0000 +0x0444=0x0000 +0x04CA=0x0000 +0x0446=0x0000 +0x0454=0x0000 +0x0448=0x0000 +0x044B=0x0000 +0x0390=0x0000 +0x0451=0x0000 +0x0559=0xACB9 +0x0456=0x0000 +0x0314=0x0000 +0x0458=0x0000 +0x02DA=0x0000 +0x045A=0x0000 +0x0447=0x0000 +0x0460=0x0000 +0x0480=0x0000 +0x045F=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0283=0x0000 +0x0022=0x07FF +0x048E=0x0000 +0x029B=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +[file_info] +version=1 +type=lms7002m_minimal_config diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini new file mode 100644 index 0000000000..34ce70c888 --- /dev/null +++ b/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini @@ -0,0 +1,1128 @@ +[reference_clocks] +sxr_ref_clk_mhz=30.72 +sxt_ref_clk_mhz=30.72 +[lms7002_registers_b] +0x05A7=0x0000 +0x05A5=0x0000 +0x05A2=0x0000 +0x05A0=0x0000 +0x0599=0x0000 +0x0598=0x0000 +0x0596=0x0000 +0x0594=0x0000 +0x0592=0x0000 +0x0591=0x0000 +0x0590=0x0000 +0x058E=0x0000 +0x058C=0x0000 +0x059D=0x0000 +0x058A=0x0000 +0x0589=0x0000 +0x0587=0x0000 +0x0585=0x0000 +0x0595=0x0000 +0x0584=0x0000 +0x059F=0x0000 +0x0583=0x0000 +0x0582=0x0000 +0x0567=0x0000 +0x0566=0x0000 +0x0565=0x0000 +0x0564=0x0000 +0x0563=0x0000 +0x0562=0x0000 +0x055F=0x0000 +0x055D=0x0000 +0x055A=0x0000 +0x058F=0x0000 +0x0557=0x0000 +0x0593=0x0000 +0x0554=0x0000 +0x0552=0x0000 +0x0551=0x0000 +0x0550=0x0000 +0x054D=0x0000 +0x054C=0x0000 +0x0549=0x0000 +0x0547=0x0000 +0x0546=0x0000 +0x0545=0x0000 +0x0544=0x0000 +0x0543=0x0000 +0x0553=0x0000 +0x0542=0x0000 +0x0541=0x0000 +0x0527=0x0000 +0x0526=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0523=0x0000 +0x0521=0x0000 +0x055C=0x0000 +0x051A=0x0000 +0x0519=0x0000 +0x0518=0x0000 +0x0514=0x0000 +0x0513=0x0000 +0x0511=0x0000 +0x05A6=0x0000 +0x051E=0x0000 +0x050F=0x0000 +0x0516=0x0000 +0x050E=0x0000 +0x050C=0x0000 +0x050B=0x0000 +0x050A=0x0000 +0x0509=0x0000 +0x0507=0x0000 +0x0506=0x0000 +0x0503=0x0000 +0x04E7=0x0000 +0x04E6=0x0000 +0x0512=0x0000 +0x04E5=0x0000 +0x04E4=0x0000 +0x0321=0x0000 +0x0320=0x0000 +0x0323=0x0000 +0x031B=0x0000 +0x0319=0x0000 +0x0260=0x0000 +0x031F=0x0000 +0x0360=0x0000 +0x0312=0x0000 +0x0310=0x0000 +0x0245=0x0000 +0x0581=0x0000 +0x045D=0x0000 +0x030E=0x0000 +0x0203=0x0000 +0x0482=0x0000 +0x0588=0x0000 +0x0308=0x0000 +0x048A=0x0000 +0x0307=0x0000 +0x0282=0x0000 +0x038C=0x0000 +0x0510=0x0000 +0x0302=0x0000 +0x0301=0x0000 +0x0309=0x0000 +0x0300=0x0000 +0x044E=0x0000 +0x034F=0x0000 +0x055B=0x0000 +0x0114=0x008D +0x02E5=0x0000 +0x02E4=0x0000 +0x02E1=0x0000 +0x02D5=0x0000 +0x0259=0x0000 +0x0517=0x0000 +0x0481=0x0000 +0x030B=0x0000 +0x0392=0x0000 +0x02DE=0x0000 +0x02DD=0x0000 +0x0297=0x0000 +0x0209=0x0000 +0x0400=0x0081 +0x02D8=0x0000 +0x0104=0x0088 +0x0103=0x0A12 +0x0347=0x0000 +0x0457=0x0000 +0x058D=0x0000 +0x02D7=0x0000 +0x02D1=0x0000 +0x04C8=0x0000 +0x02D3=0x0000 +0x02CB=0x0000 +0x0250=0x0000 +0x0306=0x0000 +0x04A4=0x0000 +0x044A=0x0000 +0x054B=0x0000 +0x02C7=0x0000 +0x02C1=0x0000 +0x031D=0x0000 +0x0440=0x0020 +0x045E=0x0000 +0x02C4=0x0000 +0x02C2=0x0000 +0x02DB=0x0000 +0x0357=0x0000 +0x0201=0x07FF +0x0483=0x0000 +0x05A4=0x0000 +0x02A3=0x0000 +0x02A1=0x0000 +0x028D=0x0000 +0x02D2=0x0000 +0x039C=0x0000 +0x02A0=0x0000 +0x010E=0x2040 +0x030A=0x0000 +0x029F=0x0000 +0x029C=0x0000 +0x029E=0x0000 +0x011D=0x699D +0x039E=0x0000 +0x0296=0x0000 +0x0555=0x0000 +0x0349=0x0000 +0x0295=0x0000 +0x010D=0x009E +0x04C4=0x0000 +0x0292=0x0000 +0x02CF=0x0000 +0x04D1=0x0000 +0x0291=0x0000 +0x02DF=0x0000 +0x0290=0x0000 +0x020A=0x0080 +0x0102=0x3180 +0x0388=0x0000 +0x0120=0xB9FF +0x0317=0x0000 +0x0244=0x0000 +0x059B=0x0000 +0x0322=0x0000 +0x010F=0x3042 +0x0119=0x18CB +0x02A6=0x0000 +0x051F=0x0000 +0x029A=0x0000 +0x049A=0x0000 +0x059E=0x0000 +0x04D7=0x0000 +0x0318=0x0000 +0x02A7=0x0000 +0x0200=0x0081 +0x02C5=0x0000 +0x0122=0x033F +0x0110=0x0BF4 +0x0204=0x0000 +0x0252=0x0000 +0x011E=0x06B9 +0x049B=0x0000 +0x0294=0x0000 +0x011C=0xAD41 +0x02D6=0x0000 +0x0311=0x0000 +0x0117=0x280C +0x0540=0x0000 +0x02A4=0x0000 +0x0485=0x0000 +0x02E0=0x0000 +0x0118=0x018C +0x0489=0x0000 +0x04A7=0x0000 +0x0101=0x7800 +0x0558=0x0000 +0x02C6=0x0000 +0x05A1=0x0000 +0x02C9=0x0000 +0x0500=0x0000 +0x039D=0x0000 +0x011F=0x3680 +0x030C=0x0000 +0x04DF=0x0000 +0x0281=0x0000 +0x0106=0x3182 +0x028E=0x0000 +0x0326=0x0000 +0x0113=0x03C3 +0x04CB=0x0000 +0x0391=0x0000 +0x0105=0x0007 +0x02D9=0x0000 +0x02CE=0x0000 +0x044F=0x0000 +0x038B=0x0000 +0x02D4=0x0000 +0x0107=0x318C +0x0495=0x0000 +0x0246=0x0000 +0x0303=0x0000 +0x02E6=0x0000 +0x045B=0x0000 +0x0100=0x3409 +0x0340=0x0000 +0x0208=0x0070 +0x0111=0x0083 +0x0247=0x0000 +0x024B=0x0000 +0x045C=0x0000 +0x024D=0x0000 +0x0202=0x07FF +0x0383=0x0000 +0x054A=0x0000 +0x0401=0x07FF +0x0206=0x0000 +0x0124=0x0000 +0x0341=0x0000 +0x0287=0x0000 +0x0501=0x0000 +0x034C=0x0000 +0x030F=0x0000 +0x025D=0x0000 +0x0406=0x0000 +0x051B=0x0000 +0x0313=0x0000 +0x010A=0x104C +0x0461=0x0000 +0x0121=0x333C +0x0115=0x0009 +0x0112=0xC0E6 +0x039A=0x0000 +0x02CC=0x0000 +0x0116=0x8180 +0x04A0=0x0000 +0x0108=0x9442 +0x020B=0x4000 +0x0251=0x0000 +0x0488=0x0000 +0x0241=0x0000 +0x038F=0x0000 +0x02DC=0x0000 +0x024C=0x0000 +0x0494=0x0000 +0x051D=0x0000 +0x0243=0x0000 +0x0556=0x0000 +0x040A=0x0000 +0x04CD=0x0000 +0x0249=0x0000 +0x0261=0x0000 +0x024A=0x0000 +0x0285=0x0000 +0x0280=0x0000 +0x0346=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0253=0x0000 +0x0255=0x0000 +0x0502=0x0000 +0x0258=0x0000 +0x0298=0x0000 +0x05A3=0x0000 +0x0367=0x0000 +0x0240=0x0020 +0x0256=0x0000 +0x0242=0x0000 +0x025A=0x0000 +0x04E2=0x0000 +0x04C5=0x0000 +0x025B=0x0000 +0x020C=0x7FFF +0x0205=0x0000 +0x0361=0x0000 +0x0515=0x0000 +0x025C=0x0000 +0x0355=0x0000 +0x044C=0x0000 +0x010C=0x88FD +0x0284=0x0000 +0x0396=0x0000 +0x0286=0x0000 +0x028F=0x0000 +0x031C=0x0000 +0x031A=0x0000 +0x0363=0x0000 +0x0289=0x0000 +0x059C=0x0000 +0x04DD=0x0000 +0x028A=0x0000 +0x040C=0x0000 +0x028B=0x0000 +0x0450=0x0000 +0x0352=0x0000 +0x028C=0x0000 +0x04C2=0x0000 +0x025E=0x0000 +0x04DA=0x0000 +0x0327=0x0000 +0x0380=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0561=0x0000 +0x0344=0x0000 +0x0586=0x0000 +0x0484=0x0000 +0x0345=0x0000 +0x0505=0x0000 +0x035B=0x0000 +0x034A=0x0000 +0x0455=0x0000 +0x011A=0x2E02 +0x034B=0x0000 +0x034D=0x0000 +0x035C=0x0000 +0x034E=0x0000 +0x0293=0x0000 +0x03A6=0x0000 +0x0350=0x0000 +0x0445=0x0000 +0x048F=0x0000 +0x0351=0x0000 +0x0353=0x0000 +0x050D=0x0000 +0x02CD=0x0000 +0x0490=0x0000 +0x0354=0x0000 +0x0348=0x0000 +0x0498=0x0000 +0x0356=0x0000 +0x0316=0x0000 +0x030D=0x0000 +0x040E=0x0000 +0x0522=0x0000 +0x049F=0x0000 +0x029D=0x0000 +0x04A3=0x0000 +0x0359=0x0000 +0x0299=0x0000 +0x0452=0x0000 +0x02C8=0x0000 +0x035A=0x0000 +0x0449=0x0000 +0x0442=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x0597=0x0000 +0x035F=0x0000 +0x0325=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0381=0x0000 +0x0288=0x0000 +0x0382=0x0000 +0x0384=0x0000 +0x0315=0x0000 +0x0385=0x0000 +0x054F=0x0000 +0x0389=0x0000 +0x04E3=0x0000 +0x040F=0x0000 +0x0386=0x0000 +0x054E=0x0000 +0x02D0=0x0000 +0x03A0=0x0000 +0x0387=0x0000 +0x0362=0x0000 +0x038A=0x0000 +0x0395=0x0000 +0x038D=0x0000 +0x02E7=0x0000 +0x0324=0x0000 +0x038E=0x0000 +0x0305=0x0000 +0x0393=0x0000 +0x0459=0x0000 +0x0394=0x0000 +0x0123=0x267B +0x0497=0x0000 +0x0398=0x0000 +0x0408=0x0000 +0x0399=0x0000 +0x039B=0x0000 +0x0248=0x0000 +0x039F=0x0000 +0x049E=0x0000 +0x059A=0x0000 +0x048D=0x0000 +0x051C=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x0520=0x0000 +0x03A7=0x0000 +0x055E=0x0000 +0x0402=0x07FF +0x0403=0x0000 +0x04D8=0x0000 +0x0560=0x0000 +0x0404=0x0000 +0x0254=0x0000 +0x0405=0x0000 +0x0407=0x0000 +0x0580=0x0000 +0x0409=0x0000 +0x040B=0x7FFF +0x040D=0x0000 +0x0441=0x0000 +0x0508=0x0000 +0x0443=0x0000 +0x0444=0x0000 +0x04CA=0x0000 +0x0446=0x0000 +0x0454=0x0000 +0x0448=0x0000 +0x044B=0x0000 +0x02E2=0x0000 +0x044D=0x0000 +0x0390=0x0000 +0x0451=0x0000 +0x0453=0x0000 +0x0559=0x0000 +0x0456=0x0000 +0x0314=0x0000 +0x0458=0x0000 +0x02DA=0x0000 +0x045A=0x0000 +0x0447=0x0000 +0x0460=0x0000 +0x0480=0x0000 +0x045F=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0358=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x0283=0x0000 +0x048E=0x0000 +0x029B=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x04A1=0x0000 +0x0493=0x0000 +0x04C3=0x0000 +0x0496=0x0000 +0x02C0=0x0000 +0x0499=0x0000 +0x02E3=0x0000 +0x0397=0x0000 +0x049C=0x0000 +0x04C7=0x0000 +0x049D=0x0000 +0x0109=0x61C1 +0x04A2=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x0257=0x0000 +0x04D6=0x0000 +0x031E=0x0000 +0x04C0=0x0000 +0x02CA=0x0000 +0x04C9=0x0000 +0x02C3=0x0000 +0x04C1=0x0000 +0x0207=0x0000 +0x04C6=0x0000 +0x02A5=0x0000 +0x04CC=0x0000 +0x04CE=0x0000 +0x025F=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x0548=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x0504=0x0000 +0x04D4=0x0000 +0x0304=0x0000 +0x04D5=0x0000 +0x04D9=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x058B=0x0000 +0x04DE=0x0000 +0x04E0=0x0000 +0x02A2=0x0000 +0x03A1=0x0000 +0x04E1=0x0000 +[lms7002_registers_a] +0x05A7=0x0000 +0x05A5=0x0000 +0x05A2=0x0000 +0x0599=0x0000 +0x0598=0xF61D +0x0596=0x0A94 +0x0594=0xF40D +0x0592=0x0DF1 +0x0591=0xFCFE +0x0590=0xEF99 +0x058E=0x1316 +0x058C=0xEA50 +0x059D=0x0000 +0x058A=0x17DC +0x0585=0xDAA2 +0x0595=0x00BC +0x0584=0xE7E2 +0x059F=0x0000 +0x0583=0x2E45 +0x0582=0x150F +0x0567=0x4049 +0x0566=0x0906 +0x0565=0xB77F +0x0563=0x4F91 +0x055F=0x5852 +0x055D=0xA6B5 +0x055A=0xBE2A +0x058F=0x0605 +0x0557=0x4C24 +0x0593=0x00D8 +0x0554=0x6901 +0x0552=0x8D44 +0x0551=0xD7B7 +0x0550=0x79FA +0x054C=0x7FFF +0x0549=0x18C9 +0x0547=0xD7B7 +0x0546=0x8D44 +0x0545=0x364E +0x0544=0x6901 +0x0543=0xBD96 +0x0553=0x364E +0x0542=0xA2B5 +0x0541=0x4C24 +0x0527=0xACB9 +0x0526=0xBE2A +0x0525=0x57AC +0x0523=0xA6B5 +0x0521=0x5852 +0x055C=0x3347 +0x051A=0x0906 +0x0518=0xEFF2 +0x0514=0xE7E2 +0x0513=0xDAA2 +0x0511=0x1D10 +0x05A6=0x0000 +0x051E=0xF524 +0x050F=0xEA5F +0x0516=0x150F +0x050E=0x17DC +0x050C=0xEA50 +0x050B=0xF5EF +0x050A=0x1316 +0x0509=0x0605 +0x0507=0xFCFE +0x0506=0x0DF1 +0x0503=0x00BC +0x04E7=0x0000 +0x04E6=0x0000 +0x04E4=0x0000 +0x04E0=0x0000 +0x058B=0x0F45 +0x04DE=0x0000 +0x04DC=0x0000 +0x04DB=0x0000 +0x04D9=0x0000 +0x04D8=0x0000 +0x059E=0x0000 +0x04D7=0x0000 +0x0504=0xF40D +0x04D4=0x0000 +0x04D3=0x0000 +0x0548=0x79FA +0x04D2=0x0000 +0x04D1=0x0000 +0x04D0=0x0000 +0x04CE=0x0000 +0x04C8=0x0000 +0x04E2=0x0000 +0x04C5=0x0000 +0x04C4=0x0000 +0x04C2=0x0000 +0x04A7=0x0000 +0x04A6=0x0000 +0x04A5=0x0000 +0x04A1=0x0000 +0x04A0=0x0000 +0x0522=0xDB10 +0x049F=0x0000 +0x049E=0x0000 +0x04C7=0x0000 +0x049D=0x0000 +0x049B=0x0000 +0x049A=0x0000 +0x04C3=0x0000 +0x0496=0x0000 +0x0494=0x0000 +0x02D3=0x0000 +0x02D1=0x0000 +0x02CB=0x0000 +0x0250=0x0000 +0x0096=0x0000 +0x04C1=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C2=0x0000 +0x0499=0x0000 +0x02C0=0x0000 +0x0201=0x07FF +0x0483=0x0000 +0x05A4=0x0000 +0x02A3=0x0000 +0x008B=0x278A +0x02A1=0x0000 +0x028D=0x0000 +0x029C=0x0000 +0x029E=0x0000 +0x0297=0x0000 +0x0296=0x0000 +0x0555=0xBD96 +0x0349=0x0000 +0x010D=0x015C +0x02CF=0x0000 +0x0291=0x0000 +0x02DF=0x0000 +0x0290=0x0000 +0x0021=0x0E9F +0x0450=0x0000 +0x0558=0x5009 +0x02C6=0x0000 +0x0101=0x7800 +0x059C=0x0000 +0x04DD=0x0000 +0x028A=0x0000 +0x0121=0x313C +0x0285=0x0000 +0x0280=0x0000 +0x0319=0x0000 +0x04CF=0x0000 +0x025F=0x0000 +0x025D=0x0000 +0x030F=0x0000 +0x0406=0x0000 +0x02C5=0x0000 +0x0200=0x0301 +0x0281=0x0000 +0x04A2=0x0000 +0x0109=0x03C1 +0x0355=0x0000 +0x044C=0x0000 +0x025B=0x0000 +0x0298=0x0000 +0x0502=0x0A94 +0x0258=0x0000 +0x0255=0x0000 +0x04D6=0x0000 +0x0257=0x0000 +0x0252=0x0000 +0x0204=0xFFAD +0x024F=0x0000 +0x04CC=0x0000 +0x02A5=0x0000 +0x0497=0x0000 +0x0123=0x267B +0x0495=0x0000 +0x0246=0x0000 +0x051D=0x4F91 +0x0243=0x0000 +0x0556=0xA2B5 +0x040A=0x1000 +0x025A=0x0000 +0x0242=0x0000 +0x020C=0x8000 +0x0251=0x0000 +0x02DD=0x0000 +0x0020=0xFFFD +0x0488=0x0000 +0x020A=0x0000 +0x0102=0x3180 +0x04C6=0x0000 +0x0207=0x0000 +0x04DA=0x0000 +0x025E=0x0000 +0x0206=0x0000 +0x00A3=0x6565 +0x02E2=0x0000 +0x044D=0x0000 +0x0292=0x0000 +0x002A=0x0086 +0x0245=0x0000 +0x0581=0xC89D +0x045D=0x0000 +0x024D=0x0000 +0x002B=0x4032 +0x02A0=0x0000 +0x010E=0x070C +0x0286=0x0000 +0x009E=0x658C +0x0088=0x0530 +0x0085=0x0001 +0x0295=0x0000 +0x0089=0x00A0 +0x0256=0x0000 +0x0093=0x0000 +0x0092=0x0001 +0x031B=0x0000 +0x0111=0x0099 +0x0095=0x0000 +0x02A7=0x0000 +0x0203=0x2F6C +0x030E=0x0000 +0x0482=0x0000 +0x05A0=0x0000 +0x009C=0x658C +0x0381=0x0000 +0x0122=0x033F +0x0110=0x0BFF +0x0100=0xB409 +0x0028=0x0101 +0x0026=0x0101 +0x0524=0x3347 +0x009D=0x6565 +0x0294=0x0000 +0x0106=0x3182 +0x028E=0x0000 +0x0326=0x0000 +0x0113=0x03C3 +0x04CB=0x0000 +0x0391=0x0000 +0x05A1=0x0000 +0x02C9=0x0000 +0x0500=0xF61D +0x039D=0x0000 +0x011F=0x3680 +0x0395=0x0000 +0x024B=0x0000 +0x045C=0x0000 +0x0247=0x0000 +0x0512=0x196B +0x04E5=0x0000 +0x0024=0x50D8 +0x0353=0x0000 +0x050D=0x0F45 +0x02CD=0x0000 +0x0490=0x0000 +0x0501=0xFDFB +0x034C=0x0000 +0x00AA=0x0000 +0x0350=0x0000 +0x0445=0x0000 +0x048F=0x0000 +0x008A=0x0491 +0x0453=0x0000 +0x0124=0x0000 +0x0260=0x0000 +0x00A1=0x6565 +0x0356=0x0000 +0x0241=0x0000 +0x04CD=0x0000 +0x0249=0x0000 +0x002C=0x0100 +0x038F=0x0000 +0x008C=0x267B +0x0459=0x0000 +0x0394=0x0000 +0x054D=0xF7A3 +0x00A6=0x0001 +0x002D=0xFFFF +0x00AC=0x2000 +0x0253=0x0000 +0x028B=0x0000 +0x040C=0x40F8 +0x0099=0x6565 +0x0310=0x0000 +0x00A2=0x6565 +0x0589=0xEA5F +0x002F=0x3840 +0x0597=0xFDFB +0x035F=0x0000 +0x0562=0xF524 +0x0025=0x0101 +0x011C=0xAD41 +0x011D=0xFEEE +0x039E=0x0000 +0x0289=0x0000 +0x0282=0x0000 +0x0307=0x0000 +0x038C=0x0000 +0x0087=0x0000 +0x0399=0x0000 +0x054B=0xF7A3 +0x02C7=0x0000 +0x0519=0x4049 +0x009F=0x658C +0x0515=0x2E45 +0x025C=0x0000 +0x00A5=0x6565 +0x0301=0x0000 +0x02C1=0x0000 +0x0259=0x0000 +0x02D5=0x0000 +0x02E1=0x0000 +0x0517=0xC89D +0x0481=0x0000 +0x00A8=0x0000 +0x02D2=0x0000 +0x039C=0x0000 +0x0564=0x0000 +0x00AB=0x0040 +0x0261=0x0000 +0x002E=0x0000 +0x02DE=0x0000 +0x0540=0x5009 +0x02A4=0x0000 +0x0485=0x0000 +0x0489=0x0000 +0x00AD=0x03FF +0x024A=0x0000 +0x0029=0x0101 +0x0097=0x0000 +0x011E=0x0663 +0x00AE=0x0000 +0x00A7=0x6565 +0x020B=0x0000 +0x0098=0x0000 +0x0108=0xFC26 +0x0027=0x05E4 +0x0117=0x1939 +0x0383=0x0000 +0x0202=0x07F9 +0x054A=0x8184 +0x00A4=0x6565 +0x0401=0x07ED +0x0086=0x4101 +0x010C=0x8865 +0x02D8=0x0000 +0x0347=0x0000 +0x0457=0x0000 +0x0103=0x0A12 +0x0104=0x0088 +0x0357=0x0000 +0x02DB=0x0000 +0x0400=0x0101 +0x009B=0x6565 +0x0105=0x0007 +0x05A3=0x0000 +0x0240=0x0028 +0x0367=0x0000 +0x044F=0x0000 +0x038B=0x0000 +0x0284=0x0000 +0x0396=0x0000 +0x051F=0xAB08 +0x029A=0x0000 +0x0361=0x0000 +0x0205=0x0000 +0x0119=0x529F +0x02A6=0x0000 +0x010F=0x3042 +0x04C0=0x0000 +0x031E=0x0000 +0x02CC=0x0000 +0x0116=0x8180 +0x0587=0x1D10 +0x0023=0x5550 +0x048C=0x0000 +0x0112=0x20E5 +0x039A=0x0000 +0x0320=0x0000 +0x0323=0x0000 +0x0115=0x0009 +0x00A9=0x8000 +0x0244=0x0000 +0x0094=0x0000 +0x0317=0x0000 +0x0208=0x0170 +0x0340=0x0000 +0x058D=0xF5EF +0x02D7=0x0000 +0x04A3=0x0000 +0x029D=0x0000 +0x0388=0x0000 +0x0120=0xB9FF +0x04C9=0x0000 +0x02CA=0x0000 +0x0209=0x0000 +0x0082=0x8001 +0x0107=0x318C +0x02D4=0x0000 +0x02CE=0x0000 +0x02D9=0x0000 +0x02E4=0x0000 +0x024C=0x0000 +0x02DC=0x0000 +0x0118=0x218C +0x02E0=0x0000 +0x055B=0x57AC +0x0114=0x0170 +0x02E5=0x0000 +0x02E6=0x0000 +0x045B=0x0000 +0x034F=0x0000 +0x0300=0x0000 +0x044E=0x0000 +0x0510=0xE6C7 +0x0302=0x0000 +0x0303=0x0000 +0x04D5=0x0000 +0x0304=0x0000 +0x0306=0x0000 +0x04A4=0x0000 +0x044A=0x0000 +0x049C=0x0000 +0x02E3=0x0000 +0x0397=0x0000 +0x0588=0xE6C7 +0x0308=0x0000 +0x048A=0x0000 +0x0309=0x0000 +0x029F=0x0000 +0x030A=0x0000 +0x0392=0x0000 +0x030B=0x0000 +0x04DF=0x0000 +0x030C=0x0000 +0x02D6=0x0000 +0x0311=0x0000 +0x024E=0x0000 +0x0346=0x0000 +0x0312=0x0000 +0x051B=0xB77F +0x010A=0x184C +0x0461=0x0000 +0x0313=0x0000 +0x0360=0x0000 +0x028C=0x0000 +0x0352=0x0000 +0x040E=0x0000 +0x030D=0x0000 +0x0316=0x0000 +0x031F=0x0000 +0x0318=0x0000 +0x0287=0x0000 +0x0341=0x0000 +0x028F=0x0000 +0x031C=0x0000 +0x031A=0x0000 +0x0363=0x0000 +0x031D=0x0000 +0x0440=0x0024 +0x045E=0x0000 +0x0321=0x0000 +0x059B=0x0000 +0x0322=0x0000 +0x0327=0x0000 +0x0380=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0561=0xAB08 +0x0344=0x0000 +0x0586=0x196B +0x0484=0x0000 +0x0345=0x0000 +0x0505=0x00D8 +0x035B=0x0000 +0x0498=0x0000 +0x0084=0x0400 +0x0348=0x0000 +0x034A=0x0000 +0x0455=0x0000 +0x011A=0x2E03 +0x034B=0x0000 +0x034D=0x0000 +0x035C=0x0000 +0x034E=0x0000 +0x0293=0x0000 +0x03A6=0x0000 +0x0351=0x0000 +0x0354=0x0000 +0x048B=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x0299=0x0000 +0x0452=0x0000 +0x02C8=0x0000 +0x035A=0x0000 +0x0449=0x0000 +0x0442=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x038A=0x0000 +0x0362=0x0000 +0x0081=0x0000 +0x0325=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0288=0x0000 +0x0382=0x0000 +0x0384=0x0000 +0x0315=0x0000 +0x0385=0x0000 +0x054F=0x18C9 +0x0389=0x0000 +0x04E3=0x0000 +0x040F=0x0000 +0x0386=0x0000 +0x054E=0x8184 +0x009A=0x658C +0x02D0=0x0000 +0x03A0=0x0000 +0x0387=0x0000 +0x038D=0x0000 +0x02E7=0x0000 +0x0324=0x0000 +0x038E=0x0000 +0x0305=0x0000 +0x0393=0x0000 +0x0398=0x0000 +0x0408=0x0000 +0x039B=0x0000 +0x0248=0x0000 +0x039F=0x0000 +0x04E1=0x0000 +0x02A2=0x0000 +0x03A1=0x0000 +0x059A=0x0000 +0x048D=0x0000 +0x051C=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x0520=0x174B +0x03A7=0x0000 +0x055E=0xDB10 +0x0402=0x07FF +0x0403=0x009C +0x0560=0x174B +0x00A0=0x6565 +0x0404=0x0000 +0x0254=0x0000 +0x0405=0x0000 +0x0407=0x0000 +0x0580=0xEFF2 +0x0409=0x0000 +0x040B=0x000F +0x040D=0x0000 +0x0441=0x0000 +0x0508=0xEF99 +0x0443=0x0000 +0x0444=0x0000 +0x04CA=0x0000 +0x0446=0x0000 +0x0454=0x0000 +0x0448=0x0000 +0x044B=0x0000 +0x0390=0x0000 +0x0451=0x0000 +0x0559=0xACB9 +0x0456=0x0000 +0x0314=0x0000 +0x0458=0x0000 +0x02DA=0x0000 +0x045A=0x0000 +0x0447=0x0000 +0x0460=0x0000 +0x0480=0x0000 +0x045F=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0283=0x0000 +0x0022=0x07FF +0x048E=0x0000 +0x029B=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +[file_info] +version=1 +type=lms7002m_minimal_config From bd235ec7b23889cf8894fadf54c98094ee06c39c Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 8 Mar 2016 11:22:14 +0100 Subject: [PATCH 106/122] modified lmssdr configuration files --- .../CONF/enb.band13.tm1.50PRB.lmssdr.conf | 12 ++++++------ .../GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf index 6b93021426..4209490141 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "95"; + mobile_network_code = "93"; ////////// Physical parameters: @@ -133,7 +133,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.62"; + mme_ip_address = ( { ipv4 = "192.168.12.11"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -142,11 +142,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.212/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf index dacc3e8664..df5ea1f1d2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "95"; + mobile_network_code = "93"; ////////// Physical parameters: @@ -133,7 +133,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.62"; + mme_ip_address = ( { ipv4 = "192.168.12.11"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -142,11 +142,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.212/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; From 049e33ca54c9e8c4d6053f50479e1e61e0194cf7 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 8 Mar 2016 11:36:21 +0100 Subject: [PATCH 107/122] fixing a bug in computation of SINR in abstraction mode and making it dependent in NB_RB --- targets/SIMU/USER/channel_sim.c | 19 +++---------------- targets/SIMU/USER/oaisim.h | 4 ++-- targets/SIMU/USER/oaisim_functions.c | 3 +-- targets/SIMU/USER/sinr_sim.c | 14 ++++++-------- 4 files changed, 12 insertions(+), 28 deletions(-) diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index bba32a5a29..e26129bca6 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -169,8 +169,6 @@ void do_DL_sig(double **r_re0,double **r_im0, int32_t **dl_channel_est = PHY_vars_UE_g[UE_id][CC_id]->lte_ue_common_vars.dl_ch_estimates[0]; // double scale = pow(10.0,(enb_data[att_eNB_id]->tx_power_dBm + eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0); double scale = pow(10.0,(frame_parms->pdsch_config_common.referenceSignalPower+eNB2UE[att_eNB_id][UE_id][CC_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB)/20.0); - //this factor is not really needed (it was actually wrong in the non abstraction mode) - //scale = scale * sqrt(512.0/300.0); //TODO: make this variable for all BWs LOG_D(OCM,"scale =%lf (%d dB)\n",scale,(int) (20*log10(scale))); // freq_channel(desc1,frame_parms->N_RB_DL,nb_samples); //write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8); @@ -204,12 +202,13 @@ void do_DL_sig(double **r_re0,double **r_im0, // calculate the SNR for the attached eNB (this assumes eNB always uses PMI stored in eNB_UE_stats; to be improved) init_snr(eNB2UE[att_eNB_id][UE_id][CC_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB, &PHY_vars_UE_g[UE_id][CC_id]->N0, - PHY_vars_UE_g[UE_id][CC_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id][CC_id]->eNB_UE_stats[UE_id].DL_pmi_single,PHY_vars_eNB_g[att_eNB_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off); + PHY_vars_UE_g[UE_id][CC_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id][CC_id]->eNB_UE_stats[UE_id].DL_pmi_single, + PHY_vars_eNB_g[att_eNB_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off,PHY_vars_eNB_g[att_eNB_id][CC_id]->lte_frame_parms.N_RB_DL); // calculate sinr here for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { if (att_eNB_id != eNB_id) { - calculate_sinr(eNB2UE[eNB_id][UE_id][CC_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB); + calculate_sinr(eNB2UE[eNB_id][UE_id][CC_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB,PHY_vars_eNB_g[att_eNB_id][CC_id]->lte_frame_parms.N_RB_DL); } } } // hold channel @@ -220,18 +219,6 @@ void do_DL_sig(double **r_re0,double **r_im0, Call do_OFDM_mod from phy_procedures_eNB_TX function */ - - - //for (UE_id=0;UE_idsamples_per_tti>>1);i++) { - for (aa=0;aasamples_per_tti>>1)*sizeof(double)); diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h index 216acaa653..8d3edbe9eb 100644 --- a/targets/SIMU/USER/oaisim.h +++ b/targets/SIMU/USER/oaisim.h @@ -62,9 +62,9 @@ void extract_position(node_list* input_node_list, node_desc_t**, int nb_nodes);/ void get_beta_map(void);//Abstraction changes void get_MIESM_param(void); -void init_snr(channel_desc_t *, node_desc_t *, node_desc_t *, double*, double*, uint8_t, uint16_t, uint8_t);//Abstraction changes +void init_snr(channel_desc_t *, node_desc_t *, node_desc_t *, double*, double*, uint8_t, uint16_t, uint8_t, uint16_t);//Abstraction changes void init_snr_up(channel_desc_t *, node_desc_t *, node_desc_t *, double*, double*, uint16_t, uint16_t);//Abstraction changes -void calculate_sinr(channel_desc_t *, node_desc_t *, node_desc_t *, double *sinr_dB);//Abstraction changes +void calculate_sinr(channel_desc_t *, node_desc_t *, node_desc_t *, double *sinr_dB, uint16_t);//Abstraction changes void get_beta_map(void); int dlsch_abstraction_EESM(double* sinr_dB, uint32_t rb_alloc[4], uint8_t mcs, uint8_t); //temporary testing for PHY abstraction int dlsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint32_t rb_alloc[4], uint8_t mcs,uint8_t); diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 4f1d9c2477..94c1b6e650 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -1270,8 +1270,7 @@ void update_ocm() //pathloss: -132.24 dBm/15kHz RE + target SNR - eNB TX power per RE if (eNB_id == (UE_id % NB_eNB_INST)) { eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB = -132.24 + snr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; - UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -132.24 + snr_dB - - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; //+20 to offset the difference in tx power of the UE wrt eNB + UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -132.24 + snr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; } else { eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; diff --git a/targets/SIMU/USER/sinr_sim.c b/targets/SIMU/USER/sinr_sim.c index 317fe53c60..9ac1371d11 100644 --- a/targets/SIMU/USER/sinr_sim.c +++ b/targets/SIMU/USER/sinr_sim.c @@ -244,20 +244,19 @@ void calc_path_loss(node_desc_t* enb_data, node_desc_t* ue_data, channel_desc_t -void init_snr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_data, double* sinr_dB, double* N0, uint8_t transmission_mode, uint16_t q, uint8_t dl_power_off) +void init_snr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_data, double* sinr_dB, double* N0, uint8_t transmission_mode, uint16_t q, uint8_t dl_power_off, uint16_t nb_rb) { - uint16_t nb_rb = 25; //No. of resource blocks double thermal_noise,abs_channel,channelx, channely,channelx_i, channely_i ; int count; int aarx,aatx; uint8_t qq; - /* Thermal noise is calculated using 10log10(K*T*B) K = Boltzmann's constant T = room temperature B = bandwidth */ - thermal_noise = -174 + 10*log10(eNB2UE->sampling_rate*1e6); //value in dBm + /* Thermal noise is calculated using 10log10(K*T*B) K = Boltzmann's constant T = room temperature B = bandwidth*/ + thermal_noise = -174 + 10*log10(15000); //per RE; value in dBm //for (aarx=0; aarxnb_rx; aarx++) - *N0 = thermal_noise + ue_data->rx_noise_level;//? all the element have the same noise level????? + *N0 = thermal_noise + ue_data->rx_noise_level; LOG_D(OCM,"Path loss %lf, noise (N0) %lf, signal %lf, snr %lf\n", eNB2UE->path_loss_dB, @@ -549,15 +548,14 @@ void init_snr_up(channel_desc_t* UE2eNB, node_desc_t *enb_data, node_desc_t *ue_ #endif -void calculate_sinr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_data, double *sinr_dB) +void calculate_sinr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_data, double *sinr_dB, uint16_t nb_rb) { double sir, thermal_noise; - short nb_rb = 25; //No. of resource blocks short count; /* Thermal noise is calculated using 10log10(K*T*B) K = Boltzmann's constant T = room temperature B = bandwidth */ - thermal_noise = -174 + 10*log10(eNB2UE->sampling_rate*1e6); //value in dBm + thermal_noise = -174 + 10*log10(15000); //per RE, value in dBm for (count = 0; count < 12 * nb_rb; count++) { sir = enb_data->tx_power_dBm From ae32ec27625c829a2e2c4c24650b2bd4f450caff Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 8 Mar 2016 12:02:32 +0100 Subject: [PATCH 108/122] excluding some testcases to speed up testing --- cmake_targets/autotests/test_case_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index f5c9cc541a..4e6ca873cb 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -10,7 +10,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; uname -a; dmesg|tail 36000 - 0102+ 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016002 016005 016102 016105 016302 016305 016502 016505 017002 017005 017502 017505 + 0102+ 010304 010305 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 0159+ 0160+ 0161+ 0162+ 0163+ 0165+ 0170+ 0175+ 3 mozart calisson stevens nano amerique From eeafacd8b3da602b470d674903c2a4fe55657ce8 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 8 Mar 2016 17:15:05 +0100 Subject: [PATCH 109/122] fixing previous merge --- openair1/SCHED/phy_procedures_lte_ue.c | 1 - 1 file changed, 1 deletion(-) diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index effa377606..bfbc7f770c 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -2654,7 +2654,6 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) { phy_vars_ue->dlsch_errors[eNB_id]++; -#ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n", phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, harq_pid,frame_rx,subframe_prev, From 4aa6d96999248461b898b5777b7d32a44fbd7086 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 8 Mar 2016 17:15:24 +0100 Subject: [PATCH 110/122] adding support for TM4 in phy-test mode --- openair1/SCHED/phy_mac_stub.c | 21 +++++++++++++++++++++ targets/RT/USER/lte-softmodem.c | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 1dba343b37..9bcba1072c 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -428,6 +428,27 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e break; } + } else if (transmission_mode==4) { + DCI_pdu->Num_ue_spec_dci = 1; + // user 1 + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_FDD_t; + DCI_pdu->dci_alloc[0].L = 3; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format2; + DCI_pdu->dci_alloc[0].ra_flag = 0; + + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = openair_daq_vars.target_ue_dl_mcs; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = openair_daq_vars.target_ue_dl_mcs; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->TPC = 0; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = openair_daq_vars.ue_dl_rb_alloc; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rah = 0; } else if (transmission_mode==5) { DCI_pdu->Num_ue_spec_dci = 2; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 9704d140a4..2f9f2d2bae 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -2424,8 +2424,8 @@ static void get_options (int argc, char **argv) case 'x': transmission_mode = atoi(optarg); - if (transmission_mode > 2) { - printf("Transmission mode > 2 (%d) not supported for the moment\n",transmission_mode); + if (transmission_mode > 7) { + printf("Transmission mode %d not supported for the moment\n",transmission_mode); exit(-1); } break; From 4fe3e49faad843d7d838d90a381660731d580b7d Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 9 Mar 2016 08:58:45 +0100 Subject: [PATCH 111/122] fixing last merge --- openair1/SCHED/phy_procedures_lte_ue.c | 1 - targets/RT/USER/lte-softmodem.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index effa377606..bfbc7f770c 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -2654,7 +2654,6 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) { phy_vars_ue->dlsch_errors[eNB_id]++; -#ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n", phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, harq_pid,frame_rx,subframe_prev, diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 9704d140a4..b1cf4bffdb 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -2222,12 +2222,6 @@ static void get_options (int argc, char **argv) phy_test = 1; break; - case 'M': -#ifdef ETHERNET - strcpy(rrh_eNB_ip,optarg); -#endif - break; - case 'A': timing_advance = atoi (optarg); break; From d3e7b6cd244bfca99eaa0d7334cb2e1056d9ef45 Mon Sep 17 00:00:00 2001 From: trilyrak Date: Wed, 9 Mar 2016 13:32:47 +0100 Subject: [PATCH 112/122] update the --rf-config-file option --- targets/RT/USER/lte-softmodem.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 1409e031fe..73b025939e 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -2141,9 +2141,12 @@ static void get_options (int argc, char **argv) while ((c = getopt_long (argc, argv, "A:a:C:dEK:g:F:G:hqO:m:SUVRM:r:P:Ws:t:Tx:",long_options,NULL)) != -1) { switch (c) { case LONG_OPTION_RF_CONFIG_FILE: - if (strlen(optarg)<=1024) - strcpy(rf_config_file,optarg); - else { + if ((strcmp("null", optarg) == 0) || (strcmp("NULL", optarg) == 0)) { + printf("no configuration filename is provided\n"); + } + else if (strlen(optarg)<=1024){ + strcpy(rf_config_file,optarg); + }else { printf("Configuration filename is too long\n"); exit(-1); } From 78b109c943a264f4f2ff801bf323bc61b6bb480f Mon Sep 17 00:00:00 2001 From: trilyrak Date: Wed, 9 Mar 2016 16:47:37 +0100 Subject: [PATCH 113/122] update the run_enb_s1_usrp script --- cmake_targets/tools/run_enb_s1_usrp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/cmake_targets/tools/run_enb_s1_usrp b/cmake_targets/tools/run_enb_s1_usrp index 01f4156071..f003faf5c9 100755 --- a/cmake_targets/tools/run_enb_s1_usrp +++ b/cmake_targets/tools/run_enb_s1_usrp @@ -29,9 +29,9 @@ ################################################################################ # file run_enb_s1_usrp # brief run script for eNB USRP. -# author Lionel GAUTHIER +# author Lionel GAUTHIER and Navid Nikaein # company Eurecom -# email: lionel.gauthier@eurecom.fr +# email: lionel.gauthier@eurecom.fr and navid.nikaein@eurecom.fr ################################ @@ -56,6 +56,7 @@ function help() echo_error "Mandatory arguments to long options are mandatory for short options too." echo_error " -g, --gdb Run with GDB." echo_error " -h, --help Print this help." + echo_error " -f, --rf-config-file filename RF specific configuration file" echo_error " -K, --itti-dump-file filename ITTI dump file containing all ITTI events occuring during EPC runtime.(can omit file name if last argument)" echo_error " -M, --target-dl-mcs mcs Downlink target MCS." echo_error " -m, --mscgen directory Generate mscgen output files in a directory" @@ -137,7 +138,21 @@ function main() shift; exit 0 ;; - -K | --itti-dump-file) + -f | --rf-config-file) + rf_config_file=$2 + # can omit file name if last arg on the line + if [ "x$rf_config_file" = "x" ]; then + rf_config_file=null + shift 1; + else + shift 2; + fi + if [ "$rf_config_file" != "null" ]; then + echo "setting --rf-config-file to $rf_config_file" + exe_arguments="$exe_arguments --rf-config-file=$rf_config_file" + fi + ;; + -K | --itti-dump-file) itti_dump_file=$2 # can omit file name if last arg on the line if [ "x$itti_dump_file" = "x" ]; then From 85d010d9872751275fb45c09eb60d2040c2c9d91 Mon Sep 17 00:00:00 2001 From: trilyrak Date: Thu, 10 Mar 2016 15:47:04 +0100 Subject: [PATCH 114/122] update run_enb_s1_usrp script --- cmake_targets/tools/run_enb_s1_usrp | 7 +++++++ .../GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cmake_targets/tools/run_enb_s1_usrp b/cmake_targets/tools/run_enb_s1_usrp index f003faf5c9..5bb7ef151f 100755 --- a/cmake_targets/tools/run_enb_s1_usrp +++ b/cmake_targets/tools/run_enb_s1_usrp @@ -56,6 +56,7 @@ function help() echo_error "Mandatory arguments to long options are mandatory for short options too." echo_error " -g, --gdb Run with GDB." echo_error " -h, --help Print this help." + echo_error " -e, --ulsch-max-errors num-errs maximum allowed number of uplink errors" echo_error " -f, --rf-config-file filename RF specific configuration file" echo_error " -K, --itti-dump-file filename ITTI dump file containing all ITTI events occuring during EPC runtime.(can omit file name if last argument)" echo_error " -M, --target-dl-mcs mcs Downlink target MCS." @@ -138,6 +139,12 @@ function main() shift; exit 0 ;; + -e | --ulsch-max-errors) + ulsch_max_errors=$2 + echo "setting --ulsch-max-errors to $ulsch_max_errors" + exe_arguments="$exe_arguments --ulsch-max-errors=$ulsch_max_errors" + shift 2; + ;; -f | --rf-config-file) rf_config_file=$2 # can omit file name if last arg on the line diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf index df5ea1f1d2..266e5aae25 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf @@ -36,7 +36,7 @@ eNBs = nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 125; + rx_gain = 107; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; From 7c016904d1eb5cb02038dfb8070ca61661bce531 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Tue, 15 Mar 2016 10:50:45 +0100 Subject: [PATCH 115/122] add sudo to deleting asn1 tmp dir --- cmake_targets/tools/build_helper | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index c8adf45257..82602b8cee 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -288,7 +288,7 @@ install_asn1c_from_source(){ asn1_install_dir=$OPENAIR_DIR/cmake_targets/log/asn1c_install_log.txt echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_dir " ( - rm -rf /tmp/asn1c-r1516 + $SUDO rm -rf /tmp/asn1c-r1516 mkdir -p /tmp/asn1c-r1516 cd /tmp/asn1c-r1516 svn co https://github.com/vlm/asn1c/trunk /tmp/asn1c-r1516 -r 1516 @@ -397,4 +397,4 @@ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then fi return $stat -} \ No newline at end of file +} From 902f70ae5eba918e0d1ba822135b4edefb42684b Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 15 Mar 2016 13:41:09 +0100 Subject: [PATCH 116/122] Remove some traces in --- openair3/TEST/EPC_TEST/play_scenario.c | 43 ++++++++++++++----- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 5 ++- openair3/TEST/EPC_TEST/play_scenario_parse.c | 3 +- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 8 ++-- 4 files changed, 41 insertions(+), 18 deletions(-) diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index cafdd93d31..b2207d39d7 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -835,13 +835,13 @@ int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s while (shift) { packet = scenario->list_packet; while (packet) { - fprintf(stdout, "*shift: %p\n", shift); - fprintf(stdout, "\tframe_number: %d\n", shift->frame_number); - fprintf(stdout, "\tshift_seconds: %ld\n", shift->shift_seconds); - fprintf(stdout, "\tshift_microseconds: %ld\n", shift->shift_microseconds); - fprintf(stdout, "\tsingle: %d\n\n", shift->single); - fprintf(stdout, "\tshift_all_packets_seconds: %ld\n", shift_all_packets.tv_sec); - fprintf(stdout, "\tshift_all_packets_microseconds: %ld\n", shift_all_packets.tv_usec); + //fprintf(stdout, "*shift: %p\n", shift); + //fprintf(stdout, "\tframe_number: %d\n", shift->frame_number); + //fprintf(stdout, "\tshift_seconds: %ld\n", shift->shift_seconds); + //fprintf(stdout, "\tshift_microseconds: %ld\n", shift->shift_microseconds); + //fprintf(stdout, "\tsingle: %d\n\n", shift->single); + //fprintf(stdout, "\tshift_all_packets_seconds: %ld\n", shift_all_packets.tv_sec); + //fprintf(stdout, "\tshift_all_packets_microseconds: %ld\n", shift_all_packets.tv_usec); AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", @@ -977,7 +977,7 @@ int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s } packet = packet->next; } - et_display_scenario(scenario); + //et_display_scenario(scenario); // create SCTP ITTI task: same as eNB code if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) { @@ -1016,6 +1016,7 @@ static void et_usage ( fprintf (stdout, "\n"); fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n"); fprintf (stdout, "\t-c | --enb-conf-file Provide an eNB config file, valid for the testbed\n"); + fprintf (stdout, "\t-D | --delay-on-exit Wait delay-in-sec before exiting\n"); fprintf (stdout, "\t-f | --shift-packet Shift the timing of a packet'\n"); fprintf (stdout, "\t-F | --shift-packets Shift the timing of packets starting at frame 'frame' included\n"); fprintf (stdout, "\t-m | --max-speed Play scenario as fast as possible without respecting frame timings\n"); @@ -1035,7 +1036,8 @@ et_config_parse_opt_line ( char **et_dir_name, char **scenario_file_name, char **enb_config_file_name, - shift_packet_t **shifts) + shift_packet_t **shifts, + int *delay_on_exit) //------------------------------------------------------------------------------ { int option = 0; @@ -1048,6 +1050,7 @@ et_config_parse_opt_line ( LONG_OPTION_SCENARIO_FILE, LONG_OPTION_MAX_SPEED, LONG_OPTION_TEST_DIR, + LONG_OPTION_DELAY_EXIT, LONG_OPTION_SHIFT_PACKET, LONG_OPTION_SHIFT_PACKETS, LONG_OPTION_HELP, @@ -1059,6 +1062,7 @@ et_config_parse_opt_line ( {"scenario ", required_argument, 0, LONG_OPTION_SCENARIO_FILE}, {"max-speed ", no_argument, 0, LONG_OPTION_MAX_SPEED}, {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, + {"delay-on-exit", required_argument, 0, LONG_OPTION_DELAY_EXIT}, {"shift-packet", required_argument, 0, LONG_OPTION_SHIFT_PACKET}, {"shift-packets", required_argument, 0, LONG_OPTION_SHIFT_PACKETS}, {"help", no_argument, 0, LONG_OPTION_HELP}, @@ -1101,6 +1105,19 @@ et_config_parse_opt_line ( } break; + case LONG_OPTION_DELAY_EXIT: + case 'D': + if (optarg) { + delay_on_exit = atoi(optarg); + if (0 > delay_on_exit) { + fprintf(stderr, "Please provide a valid -D/--delay-on-exit argument, %s is not a valid value\n", delay_on_exit); + exit(1); + } + printf("Delay on exit is %d\n", delay_on_exit); + } + break; + + case LONG_OPTION_SHIFT_PACKET: case 'f': if (optarg) { @@ -1187,6 +1204,7 @@ int main( int argc, char **argv ) char *enb_config_file_name = NULL; struct shift_packet_s *shifts = NULL; int ret = 0; + int delay_on_exit = 0; et_scenario_t *scenario = NULL; char play_scenario_filename[NAME_MAX]; @@ -1205,7 +1223,7 @@ int main( int argc, char **argv ) asn1_xer_print = 1; //parameters - actions = et_config_parse_opt_line (argc, argv, &et_dir_name, &scenario_file_name, &enb_config_file_name, &shifts); //Command-line options + actions = et_config_parse_opt_line (argc, argv, &et_dir_name, &scenario_file_name, &enb_config_file_name, &shifts, &delay_on_exit); //Command-line options if (actions & PLAY_SCENARIO) { if (et_generate_xml_scenario(et_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) { if (NULL != (scenario = et_generate_scenario(play_scenario_filename))) { @@ -1223,5 +1241,10 @@ int main( int argc, char **argv ) et_free_pointer(enb_config_file_name); } itti_wait_tasks_end(); + if (0 < delay_on_exit) { + sleep(delay_on_exit); + } return ret; } + + diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index d253e5cd5f..f5b142d2fd 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -262,7 +262,8 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) fprintf(stderr, "End of scenario: %s\n", g_scenario->name); fflush(stderr); fflush(stdout); - exit(0); + return 0; + //exit(0); } fprintf(stderr, "Remaining timers running: %d\n", g_scenario->timer_count); return g_fsm_state; @@ -342,7 +343,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event) case ET_EVENT_RX_PACKET_TIME_OUT: fprintf(stderr, "Error The following packet is not received:\n"); - et_display_packet(event.u.rx_packet_time_out); + //et_display_packet(event.u.rx_packet_time_out); AssertFatal(0, "Waited packet not received"); break; diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index aedc021f73..e4f7b48c51 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -491,8 +491,7 @@ et_scenario_t* et_generate_scenario( *next_packet = packet; next_packet = &packet->next; } else { - fprintf(stdout, "WARNING omitted packet:\n"); - et_display_node(node, 0); + fprintf(stdout, "WARNING omitted packet\n"); } } last_packet = packet; diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index f9c7d9c822..5d43b211ee 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -467,7 +467,7 @@ void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, con int size = 0; int pos = 0; int go_deeper_in_tree = 1; - S1AP_INFO("%s() mme_ue_s1ap_id %u\n", __FUNCTION__, new_id); + //S1AP_INFO("%s() mme_ue_s1ap_id %u\n", __FUNCTION__, new_id); // modify for (cur_node = (xmlNode *)node; cur_node; cur_node = cur_node->next) { @@ -527,7 +527,7 @@ void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, con } while (pos2 < (2*5)); // update ASN1 et_decode_s1ap(s1ap); - S1AP_INFO("Updated ASN1 for %s\n", showname); + //S1AP_INFO("Updated ASN1 for %s\n", showname); } } } @@ -553,7 +553,7 @@ void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSe xmlNode *s1ap_node = NULL; size = (nodes) ? nodes->nodeNr : 0; - S1AP_DEBUG("%s() num nodes %u\n", __FUNCTION__, size); + //S1AP_DEBUG("%s() num nodes %u\n", __FUNCTION__, size); /* * NOTE: the nodes are processed in reverse order, i.e. reverse document @@ -599,7 +599,7 @@ int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_ xmlXPathContextPtr xpath_ctx = NULL; xmlXPathObjectPtr xpath_obj = NULL; - S1AP_DEBUG("%s() packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number, old_id, new_id); + //S1AP_DEBUG("%s() packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number, old_id, new_id); ret = snprintf(xpath_expression, ET_XPATH_EXPRESSION_MAX_LENGTH, "//field[@name=\"s1ap.MME_UE_S1AP_ID\"][@show=\"%u\"]", old_id); AssertFatal((ret > 0) && (ret < ET_XPATH_EXPRESSION_MAX_LENGTH), "Could not build XPATH expression err=%d", ret); From e3a7edb0a2e08a59c31a919d688417b09aadd875 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Tue, 15 Mar 2016 18:47:36 +0100 Subject: [PATCH 117/122] RRH Tests for USRP b210 --- cmake_targets/autotests/README.txt | 16 + cmake_targets/autotests/test_case_list.xml | 336 ++++++++++++--------- 2 files changed, 212 insertions(+), 140 deletions(-) diff --git a/cmake_targets/autotests/README.txt b/cmake_targets/autotests/README.txt index d3b72edf46..6e9cbbd581 100644 --- a/cmake_targets/autotests/README.txt +++ b/cmake_targets/autotests/README.txt @@ -189,6 +189,22 @@ Obj.# Case# Test# Description 01 75 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 75 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX +01 80 00 lte-softmodem + RRH tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 80 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX +01 80 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX +01 80 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX +01 80 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX +01 80 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX +01 80 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX + +01 85 00 lte-softmodem + RRH tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 85 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX +01 85 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX +01 85 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX +01 85 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX +01 85 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX +01 85 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX + 01 64 lte-softmodem-noS1 tests diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 4e6ca873cb..d2afaa3469 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -10,7 +10,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; uname -a; dmesg|tail 36000 - 0102+ 010304 010305 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 0159+ 0160+ 0161+ 0162+ 0163+ 0165+ 0170+ 0175+ + 0102+ 010304 010305 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 0159+ 0160+ 0161+ 0162+ 0163+ 0165+ 0170+ 017502 017505 3 mozart calisson stevens nano amerique @@ -5521,44 +5521,46 @@ mozart 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 25 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=5;tx_sample_advance=70;tx_scheduling_advance=9;" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -26 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=70;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w None -t ETHERNET -x -c --disable-deadline + + + sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W + + + + + False $OPENAIR_DIR/cmake_targets/build_oai --RRH -w USRP -t ETHERNET -c --disable-deadline sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw - -n1 -g3 -x -i eth1 + -n1 -x -m1 -i eth1 False - $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w None -t ETHERNET -x -c --disable-deadline - - - sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W - - - - - False + /tmp @@ -5601,39 +5603,50 @@ lte-softmodem - calisson + calisson + mozart stevens amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 50 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -29 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=113;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w None -t ETHERNET -x -c --disable-deadline - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W - True + False + + $OPENAIR_DIR/cmake_targets/build_oai + --RRH -w USRP -t ETHERNET -c --disable-deadline + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw + -n1 -x -m1 -i eth1 + False /tmp @@ -5675,39 +5688,50 @@ lte-softmodem - calisson + calisson + mozart stevens amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=115;tx_scheduling_advance=11;rrh_gw_active=\"yes\";" $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w None -t ETHERNET -x -c --disable-deadline - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W - True + False + + $OPENAIR_DIR/cmake_targets/build_oai + --RRH -w USRP -t ETHERNET -c --disable-deadline + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw + -n1 -x -m1 -i eth1 + False /tmp @@ -5749,39 +5773,50 @@ lte-softmodem - calisson + calisson + mozart stevens amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 25 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -26 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=70;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w None -t ETHERNET -x -c --disable-deadline - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W - True + False + + $OPENAIR_DIR/cmake_targets/build_oai + --RRH -w USRP -t ETHERNET -c --disable-deadline + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw + -n1 -x -m1 -i eth1 + False /tmp @@ -5827,34 +5862,44 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 50 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -29 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=113;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w None -t ETHERNET -x -c --disable-deadline - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W - True + False + + $OPENAIR_DIR/cmake_targets/build_oai + --RRH -w USRP -t ETHERNET -c --disable-deadline + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw + -n1 -x -m1 -i eth1 + False /tmp @@ -5895,39 +5940,50 @@ lte-softmodem - calisson + calisson + mozart stevens amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=115;tx_scheduling_advance=11;rrh_gw_active=\"yes\";" $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w None -t ETHERNET -x -c --disable-deadline - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W + sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W - True + False + + $OPENAIR_DIR/cmake_targets/build_oai + --RRH -w USRP -t ETHERNET -c --disable-deadline + + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw + -n1 -x -m1 -i eth1 + False /tmp From 665b33ce5bc496aa992b2dcacad2e77e867b8330 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Tue, 15 Mar 2016 19:08:17 +0100 Subject: [PATCH 118/122] minor fix in RRH testcase 017504 --- cmake_targets/autotests/test_case_list.xml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index d2afaa3469..59e6783c23 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -5544,7 +5544,7 @@ --eNB -w None -t ETHERNET -x -c --disable-deadline - sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W @@ -5632,7 +5632,7 @@ --eNB -w None -t ETHERNET -x -c --disable-deadline - sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W @@ -5717,7 +5717,7 @@ --eNB -w None -t ETHERNET -x -c --disable-deadline - sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W @@ -5802,7 +5802,7 @@ --eNB -w None -t ETHERNET -x -c --disable-deadline - sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W @@ -5857,7 +5857,8 @@ lte-softmodem - calisson + calisson + mozart stevens amerique 390 @@ -5885,7 +5886,7 @@ --eNB -w None -t ETHERNET -x -c --disable-deadline - sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W From ef6f2e2a17d37a5fca76afe8e7b51777798b9195 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 16 Mar 2016 12:06:42 +0100 Subject: [PATCH 119/122] minor stability fixes for Gitlab test setup --- .../autotests/run_exec_lte-softmodem_tests.py | 2 +- cmake_targets/autotests/test_case_list.xml | 120 +++++++++--------- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index 3418798954..9997d89cd7 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -216,7 +216,7 @@ def sftp_module (username, password, hostname, ports, paramList,logfile): # \brief bash script stub put at the end of scripts to terminate it # \param timeout_cmd terminate script after timeout_cmd seconds # \param terminate_missing_procs if True terminate all the processes launched by script if one of them terminates prematurely (due to error) -def finalize_deploy_script (timeout_cmd, terminate_missing_procs='True'): +def finalize_deploy_script (timeout_cmd, terminate_missing_procs='False'): cmd = 'declare -i timeout_cmd='+str(timeout_cmd) + '\n' if terminate_missing_procs == 'True': cmd = cmd + """ diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 59e6783c23..382127b1d6 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -981,7 +981,7 @@ - True + False /tmp @@ -995,7 +995,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -1015,7 +1015,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False USRPb210.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -1055,7 +1055,7 @@ - True + False /tmp @@ -1069,7 +1069,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -1089,7 +1089,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False USRPb210.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -1129,7 +1129,7 @@ - True + False /tmp @@ -1141,7 +1141,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec @@ -1162,7 +1162,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPb210.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -1202,7 +1202,7 @@ - True + False /tmp @@ -1215,7 +1215,7 @@ throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue @@ -1235,7 +1235,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPb210.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -1275,7 +1275,7 @@ - True + False /tmp @@ -1289,7 +1289,7 @@ throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue @@ -1309,7 +1309,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPb210.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -1350,7 +1350,7 @@ - True + False /tmp @@ -1364,7 +1364,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -1384,7 +1384,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False USRPb210.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.2TX.2RX 10 @@ -1425,7 +1425,7 @@ - True + False /tmp > @@ -1438,7 +1438,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -1458,7 +1458,7 @@ throughput_test min=2.0Mbits/sec max=2.0Mbits/sec average=2.0Mbits/sec - True + False USRPb210.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.2TX.2RX 10 @@ -1498,7 +1498,7 @@ - True + False /tmp @@ -1512,7 +1512,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -1532,7 +1532,7 @@ throughput_test min=4.0Mbits/sec max=4.0Mbits/sec average=4.0Mbits/sec - True + False USRPb210.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.2TX.2RX 10 @@ -1572,7 +1572,7 @@ - True + False /tmp @@ -1586,7 +1586,7 @@ throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue @@ -1606,7 +1606,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPb210.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.2TX.2RX 10 @@ -1646,7 +1646,7 @@ - True + False /tmp @@ -1660,7 +1660,7 @@ throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue @@ -1680,7 +1680,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPb210.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.2TX.2RX 10 @@ -1720,7 +1720,7 @@ - True + False /tmp @@ -1734,7 +1734,7 @@ throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue @@ -1754,7 +1754,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPb210.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.2TX.2RX 10 @@ -2836,7 +2836,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False USRPx310.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -2908,7 +2908,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False USRPx310.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -2980,7 +2980,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False USRPx310.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -3051,7 +3051,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPx310.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -3122,7 +3122,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPx310.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -3193,7 +3193,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPx310.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -3755,7 +3755,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False EXMIMO.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -3828,7 +3828,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False EXMIMO.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -3904,7 +3904,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False EXMIMO.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -3975,7 +3975,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False EXMIMO.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -4046,7 +4046,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False EXMIMO.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -4117,7 +4117,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False EXMIMO.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -4760,7 +4760,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False BladeRF.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -4835,7 +4835,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False BladeRF.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -4909,7 +4909,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False BladeRF.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -4983,7 +4983,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False BladeRF.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -5058,7 +5058,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False BladeRF.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -5209,7 +5209,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False SoDeRa.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -5284,7 +5284,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False SoDeRa.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -5358,7 +5358,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False BladeRF.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -5432,7 +5432,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False SoDeRa.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -5507,7 +5507,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False SoDeRa.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -5680,7 +5680,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False USRPb210.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -5765,7 +5765,7 @@ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec - True + False USRPb210.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX 10 @@ -5849,7 +5849,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPb210.RRH.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -5933,7 +5933,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPb210.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX 10 @@ -6018,7 +6018,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1 - True + False USRPb210.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX 10 From 9b82047c43ed40676ae4325c946a6e3b1007a35a Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 16 Mar 2016 12:18:50 +0100 Subject: [PATCH 120/122] minor fix for Gitlab CI stability --- cmake_targets/autotests/test_case_list.xml | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 382127b1d6..6ea12c1fcb 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -2803,7 +2803,7 @@ - True + False /tmp @@ -2875,7 +2875,7 @@ - True + False /tmp @@ -2946,7 +2946,7 @@ - True + False /tmp @@ -3018,7 +3018,7 @@ - True + False /tmp @@ -3089,7 +3089,7 @@ - True + False /tmp @@ -3160,7 +3160,7 @@ - True + False /tmp @@ -3317,7 +3317,7 @@ - True + False /tmp @@ -3641,7 +3641,7 @@ - True + False /tmp @@ -3722,7 +3722,7 @@ - True + False /tmp @@ -3794,7 +3794,7 @@ - True + False /tmp @@ -3866,7 +3866,7 @@ - True + False /tmp @@ -3942,7 +3942,7 @@ - True + False /tmp @@ -4013,7 +4013,7 @@ - True + False /tmp @@ -4084,7 +4084,7 @@ - True + False /tmp From 138380e97a3d535b62011a370062af976ae50147 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 16 Mar 2016 12:21:10 +0100 Subject: [PATCH 121/122] minor fix for Gitlab CI stability --- cmake_targets/autotests/test_case_list.xml | 54 +++++++++++----------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 6ea12c1fcb..50bdd93344 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -2816,7 +2816,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -2888,7 +2888,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -2960,7 +2960,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -3030,7 +3030,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec @@ -3101,7 +3101,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -3172,7 +3172,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec @@ -3735,7 +3735,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -3808,7 +3808,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -3880,7 +3880,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -3954,7 +3954,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec @@ -4025,7 +4025,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -4096,7 +4096,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec @@ -4740,7 +4740,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -4815,7 +4815,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -4888,7 +4888,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec @@ -4963,7 +4963,7 @@ throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue @@ -5038,7 +5038,7 @@ throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue @@ -5189,7 +5189,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -5264,7 +5264,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -5337,7 +5337,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec @@ -5412,7 +5412,7 @@ throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue @@ -5487,7 +5487,7 @@ throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue @@ -5660,7 +5660,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -5745,7 +5745,7 @@ - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue /tmp @@ -5828,7 +5828,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec @@ -5913,7 +5913,7 @@ throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue @@ -5998,7 +5998,7 @@ throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec - True + False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue From b2bbd720a6fb478d7e25ee019a0891f30a8e38d1 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 16 Mar 2016 14:12:29 +0100 Subject: [PATCH 122/122] syntax fix for test setup xml file --- cmake_targets/autotests/test_case_list.xml | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 50bdd93344..394feda359 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -2803,7 +2803,7 @@ - False + False /tmp @@ -2875,7 +2875,7 @@ - False + False /tmp @@ -2946,7 +2946,7 @@ - False + False /tmp @@ -3018,7 +3018,7 @@ - False + False /tmp @@ -3089,7 +3089,7 @@ - False + False /tmp @@ -3160,7 +3160,7 @@ - False + False /tmp @@ -3317,7 +3317,7 @@ - False + False /tmp @@ -3641,7 +3641,7 @@ - False + False /tmp @@ -3722,7 +3722,7 @@ - False + False /tmp @@ -3794,7 +3794,7 @@ - False + False /tmp @@ -3866,7 +3866,7 @@ - False + False /tmp @@ -3942,7 +3942,7 @@ - False + False /tmp @@ -4013,7 +4013,7 @@ - False + False /tmp @@ -4084,7 +4084,7 @@ - False + False /tmp