diff --git a/common/config/config_cmdline.c b/common/config/config_cmdline.c index 635287afb45b6dfc919543a10d0a61a83cfe6dce..71384462ffc99c6b1e187bc2f6e72dce82fa18b3 100644 --- a/common/config/config_cmdline.c +++ b/common/config/config_cmdline.c @@ -37,7 +37,7 @@ #include <errno.h> #include <platform_types.h> #include "config_userapi.h" - +#include "../utils/LOG/log.h" int parse_stringlist(paramdef_t *cfgoptions, char *val) { char *atoken; @@ -74,15 +74,15 @@ int processoption(paramdef_t *cfgoptions, char *value) { if ( value == NULL) { if( (cfgoptions->paramflags &PARAMFLAG_BOOL) == 0 ) { /* not a boolean, argument required */ - fprintf(stderr,"[CONFIG] command line, option %s requires an argument\n",cfgoptions->optname); - exit_fun("[CONFIG] command line parsing fatal error"); - return 0; + CONFIG_PRINTF_ERROR("[CONFIG] command line, option %s requires an argument\n",cfgoptions->optname); } else { /* boolean value option without argument, set value to true*/ tmpval = defbool; } } switch(cfgoptions->type) { + char *charptr; + case TYPE_STRING: if (cfgoptions->numelt == 0 ) { config_check_valptr(cfgoptions, cfgoptions->strptr, strlen(tmpval)+1); @@ -106,14 +106,24 @@ int processoption(paramdef_t *cfgoptions, char *value) { case TYPE_UINT8: case TYPE_INT8: config_check_valptr(cfgoptions, (char **)&(cfgoptions->iptr),sizeof(int32_t)); - config_assign_int(cfgoptions,cfgoptions->optname,(int32_t)strtol(tmpval,NULL,0)); + config_assign_int(cfgoptions,cfgoptions->optname,(int32_t)strtol(tmpval,&charptr,0)); + + if( *charptr != 0) { + CONFIG_PRINTF_ERROR("[CONFIG] command line, option %s requires an integer argument\n",cfgoptions->optname); + } + optisset=1; break; case TYPE_UINT64: case TYPE_INT64: config_check_valptr(cfgoptions, (char **)&(cfgoptions->i64ptr),sizeof(uint64_t)); - *(cfgoptions->i64ptr)=strtoll(tmpval,NULL,0); + *(cfgoptions->i64ptr)=strtoll(tmpval,&charptr,0); + + if( *charptr != 0) { + CONFIG_PRINTF_ERROR("[CONFIG] command line, option %s requires an integer argument\n",cfgoptions->optname); + } + printf_cmdl("[CONFIG] %s set to %lli from command line\n", cfgoptions->optname, (long long)*(cfgoptions->i64ptr)); optisset=1; break; @@ -124,7 +134,12 @@ int processoption(paramdef_t *cfgoptions, char *value) { case TYPE_DOUBLE: config_check_valptr(cfgoptions, (char **)&(cfgoptions->dblptr),sizeof(double)); - *(cfgoptions->dblptr) = strtof(tmpval,NULL); + *(cfgoptions->dblptr) = strtof(tmpval,&charptr); + + if( *charptr != 0) { + CONFIG_PRINTF_ERROR("[CONFIG] command line, option %s requires a double argument\n",cfgoptions->optname); + } + printf_cmdl("[CONFIG] %s set to %lf from command line\n", cfgoptions->optname, *(cfgoptions->dblptr)); optisset=1; break; @@ -133,7 +148,7 @@ int processoption(paramdef_t *cfgoptions, char *value) { break; default: - fprintf(stderr,"[CONFIG] command line, %s type %i not supported\n",cfgoptions->optname, cfgoptions->type); + CONFIG_PRINTF_ERROR("[CONFIG] command line, %s type %i not supported\n",cfgoptions->optname, cfgoptions->type); break; } /* switch on param type */ @@ -176,8 +191,11 @@ int config_check_unknown_cmdlineopt(char *prefix) { } } - printf_cmdl("[CONFIG] %i unknown option(s) in command line starting with %s (section %s)\n", - unknowndetected,testprefix,((prefix==NULL)?"":prefix)); + if (unknowndetected > 0) { + CONFIG_PRINTF_ERROR("[CONFIG] %i unknown option(s) in command line starting with %s (section %s)\n", + unknowndetected,testprefix,((prefix==NULL)?"":prefix)); + } + return unknowndetected; } /* config_check_unknown_cmdlineopt */ @@ -200,7 +218,7 @@ int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix) if (pp == NULL || strcasecmp(pp,config_get_if()->argv[i] ) == 0 ) { if( prefix == NULL) { - config_printhelp(cfgoptions,numoptions); + config_printhelp(cfgoptions,numoptions,"(root section)"); if ( ! ( CONFIG_ISFLAGSET(CONFIG_NOEXITONHELP))) exit_fun("[CONFIG] Exiting after displaying help\n"); @@ -209,8 +227,7 @@ int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix) pp=strtok_r(NULL, " ",&tokctx); if ( prefix != NULL && pp != NULL && strncasecmp(prefix,pp,strlen(pp)) == 0 ) { - printf ("Help for %s section:\n",prefix); - config_printhelp(cfgoptions,numoptions); + config_printhelp(cfgoptions,numoptions,prefix); if ( ! (CONFIG_ISFLAGSET(CONFIG_NOEXITONHELP))) { fprintf(stderr,"[CONFIG] %s %i section %s:", __FILE__, __LINE__, prefix); @@ -273,16 +290,4 @@ int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix) } /* fin du while */ printf_cmdl("[CONFIG] %s %i options set from command line\n",((prefix == NULL) ? "(root)":prefix),j); - - if ( !(CONFIG_ISFLAGSET( CONFIG_NOCHECKUNKOPT )) ) { - i=config_check_unknown_cmdlineopt(prefix); - - if (i > 0) { - fprintf(stderr,"[CONFIG] %i unknown options for section %s detected in command line\n", - i,((prefix==NULL)?"\"root section\"":prefix)); - exit_fun(" Exiting after detecting errors in command line \n"); - } - } - - return j; } /* parse_cmdline*/ diff --git a/common/config/config_load_configmodule.c b/common/config/config_load_configmodule.c index e20672aa0205d72a2d5c7afc6c7faddb7563c669..b3cf7c02c5b8320a5ae529beed215798cfa5b86f 100644 --- a/common/config/config_load_configmodule.c +++ b/common/config/config_load_configmodule.c @@ -36,12 +36,15 @@ #include <unistd.h> #include <errno.h> #include <dlfcn.h> +#include <platform_types.h> #define CONFIG_LOADCONFIG_MAIN #include "config_load_configmodule.h" #include "config_userapi.h" +#include "../utils/LOG/log.h" #define CONFIG_SHAREDLIBFORMAT "libparams_%s.so" + int load_config_sharedlib(configmodule_interface_t *cfgptr) { void *lib_handle; char fname[128]; @@ -198,7 +201,7 @@ configmodule_interface_t *load_configmodule(int argc, char **argv, uint32_t init } if ( strstr(argv[i], "help_config") != NULL ) { - config_printhelp(Config_Params,CONFIG_PARAMLENGTH(Config_Params)); + config_printhelp(Config_Params,CONFIG_PARAMLENGTH(Config_Params),CONFIG_SECTIONNAME); exit(0); } @@ -304,7 +307,7 @@ configmodule_interface_t *load_configmodule(int argc, char **argv, uint32_t init if (cfgmode != NULL) free(cfgmode); if (CONFIG_ISFLAGSET(CONFIG_ABORT)) { - config_printhelp(Config_Params,CONFIG_PARAMLENGTH(Config_Params)); + config_printhelp(Config_Params,CONFIG_PARAMLENGTH(Config_Params),CONFIG_SECTIONNAME ); // exit(-1); } diff --git a/common/config/config_load_configmodule.h b/common/config/config_load_configmodule.h index 2f5c055a0026b7bb06a61e52f1d5c9b482cd82b2..d0309c62c3b66fde19ac8ea6338ce7f05993cef2 100644 --- a/common/config/config_load_configmodule.h +++ b/common/config/config_load_configmodule.h @@ -51,7 +51,6 @@ #define CONFIG_PRINTPARAMS 1 // print parameters values while processing #define CONFIG_DEBUGPTR (1<<1) // print memory allocation/free debug messages #define CONFIG_DEBUGCMDLINE (1<<2) // print command line processing messages -#define CONFIG_NOCHECKUNKOPT (1<<3) // disable check unprocessed (so invalid) command line options #define CONFIG_NOABORTONCHKF (1<<4) // disable abort execution when parameter checking function fails #define CONFIG_NOEXITONHELP (1<<19) // do not exit after printing help #define CONFIG_HELP (1<<20) // print help message @@ -109,5 +108,7 @@ extern configmodule_interface_t *cfgptr; #define CONFIG_ENABLECMDLINEONLY (1<<1) extern configmodule_interface_t *load_configmodule(int argc, char **argv, uint32_t initflags); extern void end_configmodule(void); +#define CONFIG_PRINTF_ERROR(f, x... ) if (isLogInitDone ()) { LOG_E(ENB_APP,f,x);} else {printf(f,x);}; if ( !CONFIG_ISFLAGSET(CONFIG_NOABORTONCHKF) ) exit_fun("exit because configuration failed\n"); + #endif /* INCLUDE_CONFIG_LOADCONFIGMODULE_H */ diff --git a/common/config/config_userapi.c b/common/config/config_userapi.c index b149bfd6368eaad1fa862fc63def7d3f823b9e95..b378c4ee93db95b675066c89737aaa094a1f077c 100644 --- a/common/config/config_userapi.c +++ b/common/config/config_userapi.c @@ -39,15 +39,13 @@ #include <errno.h> #include <dlfcn.h> #include <arpa/inet.h> - #include <platform_types.h> #include "config_userapi.h" - +#include "../utils/LOG/log.h" configmodule_interface_t *config_get_if(void) { if (cfgptr == NULL) { - fprintf(stderr,"[CONFIG] %s %d config module not initialized\n",__FILE__, __LINE__); - exit(-1); + CONFIG_PRINTF_ERROR("[CONFIG] %s %d config module not initialized\n",__FILE__,__LINE__); } return cfgptr; @@ -66,9 +64,8 @@ char *config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) { config_get_if()->numptrs++; } } else { - fprintf(stderr, "[CONFIG] %s %d option %s, cannot allocate pointer: %s \n", - __FILE__, __LINE__, cfgoptions->optname, strerror(errno)); - exit(-1); + CONFIG_PRINTF_ERROR("[CONFIG] %s %d option %s, cannot allocate pointer: %s \n", + __FILE__, __LINE__, cfgoptions->optname, strerror(errno)); } } @@ -78,9 +75,8 @@ char *config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) { if (*ptr != NULL) { return *ptr; } else { - fprintf(stderr,"[CONFIG] %s %d option %s, definition error: value pointer is NULL, declared as %i bytes allocated\n", - __FILE__, __LINE__,cfgoptions->optname, cfgoptions->numelt); - exit(-1); + CONFIG_PRINTF_ERROR("[CONFIG] %s %d option %s, definition error: value pointer is NULL, declared as %i bytes allocated\n", + __FILE__, __LINE__,cfgoptions->optname, cfgoptions->numelt); } } @@ -95,8 +91,7 @@ char *config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) { config_get_if()->numptrs++; } } else { - fprintf (stderr,"[CONFIG] %s %d malloc error\n",__FILE__, __LINE__); - exit(-1); + CONFIG_PRINTF_ERROR("[CONFIG] %s %d malloc error\n",__FILE__, __LINE__); } } @@ -157,8 +152,7 @@ void config_assign_processedint(paramdef_t *cfgoption, int val) { if ( cfgoption->processedvalue != NULL) { *(cfgoption->processedvalue) = val; } else { - fprintf (stderr,"[CONFIG] %s %d malloc error\n",__FILE__, __LINE__); - exit(-1); + CONFIG_PRINTF_ERROR("[CONFIG] %s %d malloc error\n",__FILE__, __LINE__); } } @@ -177,15 +171,17 @@ int config_get_processedint(paramdef_t *cfgoption) { return ret; } -void config_printhelp(paramdef_t *params,int numparams) { +void config_printhelp(paramdef_t *params,int numparams, char *prefix) { + printf("\n-----Help for section %-26s: %03i entries------\n",(prefix==NULL)?"(root section)":prefix ,numparams); + for (int i=0 ; i<numparams ; i++) { - if ( params[i].helpstr != NULL) { - printf("%s%s: %s", - (strlen(params[i].optname) <= 1) ? "-" : "--", - params[i].optname, - params[i].helpstr); - } - } + printf(" %s%s: %s", + (strlen(params[i].optname) <= 1) ? "-" : "--", + params[i].optname, + (params[i].helpstr != NULL)?params[i].helpstr:"Help string not specified"); + } /* for on params entries */ + + printf("--------------------------------------------------------------------\n\n"); } int config_execcheck(paramdef_t *params,int numparams, char *prefix) { @@ -202,11 +198,7 @@ int config_execcheck(paramdef_t *params,int numparams, char *prefix) { } if (st != 0) { - fprintf(stderr,"[CONFIG] config_execcheck: section %s %i parameters with wrong value\n", prefix, -st); - - if ( CONFIG_ISFLAGSET(CONFIG_NOABORTONCHKF) == 0) { - exit_fun("exit because configuration failed\n"); - } + CONFIG_PRINTF_ERROR("[CONFIG] config_execcheck: section %s %i parameters with wrong value\n", prefix, -st); } return st; @@ -263,6 +255,7 @@ int config_getlist(paramlist_def_t *ParamList, paramdef_t *params, int numparams for (int i = 0; i < ParamList->numelt; ++i) { // TODO config_process_cmdline? sprintf(cfgpath, "%s.[%i]", newprefix, i); + config_process_cmdline(ParamList->paramarray[i],numparams,cfgpath); config_execcheck(ParamList->paramarray[i], numparams, cfgpath); } diff --git a/common/config/config_userapi.h b/common/config/config_userapi.h index d0508ffbeb97f1302463dd91341f7eefa8598f1a..cc07b1af5fbdabe89c814a9d79a2d2fd11ee9e90 100644 --- a/common/config/config_userapi.h +++ b/common/config/config_userapi.h @@ -49,7 +49,7 @@ extern "C" /* utility functions, to be used by configuration module and/or configuration libraries */ extern configmodule_interface_t *config_get_if(void); extern char *config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) ; -extern void config_printhelp(paramdef_t *,int numparams); +extern void config_printhelp(paramdef_t *,int numparams, char *prefix); extern int config_process_cmdline(paramdef_t *params,int numparams, char *prefix); extern void config_assign_processedint(paramdef_t *cfgoption, int val); extern void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val); diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c index e2dbac43ef584462dfbcfc23b42bb5b4dd3cca12..7a2f2b99f44862db82e43a41e8db1ed797745533 100644 --- a/common/utils/LOG/log.c +++ b/common/utils/LOG/log.c @@ -219,7 +219,6 @@ void log_getconfig(log_t *g_log) { paramdef_t logparams_logfile[MAX_LOG_PREDEF_COMPONENTS]; paramdef_t logparams_debug[sizeof(log_maskmap)/sizeof(mapping)]; paramdef_t logparams_dump[sizeof(log_maskmap)/sizeof(mapping)]; - CONFIG_SETRTFLAG(CONFIG_NOCHECKUNKOPT); int ret = config_get( logparams_defaults,sizeof(logparams_defaults)/sizeof(paramdef_t),CONFIG_STRING_LOG_PREFIX); if (ret <0) { @@ -305,8 +304,8 @@ void log_getconfig(log_t *g_log) { } config_get( logparams_debug,(sizeof(log_maskmap)/sizeof(mapping)) - 1 ,CONFIG_STRING_LOG_PREFIX); - CONFIG_CLEARRTFLAG(CONFIG_NOCHECKUNKOPT); config_get( logparams_dump,(sizeof(log_maskmap)/sizeof(mapping)) - 1 ,CONFIG_STRING_LOG_PREFIX); + config_check_unknown_cmdlineopt(CONFIG_STRING_LOG_PREFIX); /* set the debug mask according to the debug parameters values */ for (int i=0; log_maskmap[i].name != NULL ; i++) { diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h index d0aa4a47c83377a2cee9f6f8f25dcdd57f3d7d88..cd2c3235e7198e248fd2afbbe98101f897df67b3 100644 --- a/common/utils/LOG/log.h +++ b/common/utils/LOG/log.h @@ -345,6 +345,8 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int } #define LOG_OPTIONS_IDX 2 + + /*----------------------------------------------------------------------------------*/ /** @defgroup _debugging debugging macros * @ingroup _macro diff --git a/common/utils/T/T.c b/common/utils/T/T.c index 140da3068848c8aee4e3eedeef0ee084e0f52a81..8a84cba1f8123accf0fddad47aa78e8a98e61bac 100644 --- a/common/utils/T/T.c +++ b/common/utils/T/T.c @@ -12,15 +12,17 @@ #include "common/config/config_userapi.h" #define QUIT(x) do { \ - printf("T tracer: QUIT: %s\n", x); \ - exit(1); \ -} while (0) + printf("T tracer: QUIT: %s\n", x); \ + exit(1); \ + } while (0) /* array used to activate/disactivate a log */ static int T_IDs[T_NUMBER_OF_IDS]; int *T_active = T_IDs; + int T_stdout = 1; + static int T_socket; /* T_cache @@ -32,125 +34,159 @@ volatile int *T_freelist_head = &_T_freelist_head; T_cache_t *T_cache; #if BASIC_SIMULATOR -/* global variables used by T_GET_SLOT, see in T.h */ -volatile uint64_t T_next_id; -volatile uint64_t T_active_id; + /* global variables used by T_GET_SLOT, see in T.h */ + volatile uint64_t T_next_id; + volatile uint64_t T_active_id; #endif -static void get_message(int s) -{ +static void get_message(int s) { char t; int l; int id; int is_on; if (read(s, &t, 1) != 1) QUIT("get_message fails"); -printf("T tracer: got mess %d\n", t); + + printf("T tracer: got mess %d\n", t); + switch (t) { - case 0: - /* toggle all those IDs */ - /* optimze? (too much syscalls) */ - if (read(s, &l, sizeof(int)) != sizeof(int)) QUIT("get_message fails"); - while (l) { - if (read(s, &id, sizeof(int)) != sizeof(int)) QUIT("get_message fails"); - T_IDs[id] = 1 - T_IDs[id]; - l--; - } - break; - case 1: - /* set IDs as given */ - /* optimize? */ - if (read(s, &l, sizeof(int)) != sizeof(int)) QUIT("get_message fails"); - id = 0; - while (l) { - if (read(s, &is_on, sizeof(int)) != sizeof(int)) - QUIT("get_message fails"); - T_IDs[id] = is_on; - id++; - l--; - } - break; - case 2: break; /* do nothing, this message is to wait for local tracer */ + case 0: + + /* toggle all those IDs */ + /* optimze? (too much syscalls) */ + if (read(s, &l, sizeof(int)) != sizeof(int)) QUIT("get_message fails"); + + while (l) { + if (read(s, &id, sizeof(int)) != sizeof(int)) QUIT("get_message fails"); + + T_IDs[id] = 1 - T_IDs[id]; + l--; + } + + break; + + case 1: + + /* set IDs as given */ + /* optimize? */ + if (read(s, &l, sizeof(int)) != sizeof(int)) QUIT("get_message fails"); + + id = 0; + + while (l) { + if (read(s, &is_on, sizeof(int)) != sizeof(int)) + QUIT("get_message fails"); + + T_IDs[id] = is_on; + id++; + l--; + } + + break; + + case 2: + break; /* do nothing, this message is to wait for local tracer */ } } -static void *T_receive_thread(void *_) -{ +static void *T_receive_thread(void *_) { while (1) get_message(T_socket); + return NULL; } -static void new_thread(void *(*f)(void *), void *data) -{ +static void new_thread(void *(*f)(void *), void *data) { pthread_t t; pthread_attr_t att; - if (pthread_attr_init(&att)) - { fprintf(stderr, "pthread_attr_init err\n"); exit(1); } - if (pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED)) - { fprintf(stderr, "pthread_attr_setdetachstate err\n"); exit(1); } - if (pthread_create(&t, &att, f, data)) - { fprintf(stderr, "pthread_create err\n"); exit(1); } - if (pthread_attr_destroy(&att)) - { fprintf(stderr, "pthread_attr_destroy err\n"); exit(1); } + if (pthread_attr_init(&att)) { + fprintf(stderr, "pthread_attr_init err\n"); + exit(1); + } + + if (pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED)) { + fprintf(stderr, "pthread_attr_setdetachstate err\n"); + exit(1); + } + + if (pthread_create(&t, &att, f, data)) { + fprintf(stderr, "pthread_create err\n"); + exit(1); + } + + if (pthread_attr_destroy(&att)) { + fprintf(stderr, "pthread_attr_destroy err\n"); + exit(1); + } } /* defined in local_tracer.c */ void T_local_tracer_main(int remote_port, int wait_for_tracer, - int local_socket, void *shm_array); + int local_socket, void *shm_array); /* We monitor the tracee and the local tracer processes. * When one dies we forcefully kill the other. */ #include <sys/types.h> #include <sys/wait.h> -static void monitor_and_kill(int child1, int child2) -{ +static void monitor_and_kill(int child1, int child2) { int child; int status; - child = wait(&status); + if (child == -1) perror("wait"); + kill(child1, SIGKILL); kill(child2, SIGKILL); exit(0); } -void T_init(int remote_port, int wait_for_tracer, int dont_fork) -{ +void T_init(int remote_port, int wait_for_tracer, int dont_fork) { int socket_pair[2]; int s; int child1, child2; int i; - if (socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair)) - { perror("socketpair"); abort(); } + if (socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair)) { + perror("socketpair"); + abort(); + } /* setup shared memory */ T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); - if (T_cache == MAP_FAILED) - { perror("mmap"); abort(); } + + if (T_cache == MAP_FAILED) { + perror("mmap"); + abort(); + } /* let's garbage the memory to catch some potential problems * (think multiprocessor sync issues, barriers, etc.) */ memset(T_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t)); + for (i = 0; i < T_CACHE_SIZE; i++) T_cache[i].busy = 0; /* child1 runs the local tracer and child2 (or main) runs the tracee */ + child1 = fork(); + + if (child1 == -1) abort(); - child1 = fork(); if (child1 == -1) abort(); if (child1 == 0) { close(socket_pair[1]); T_local_tracer_main(remote_port, wait_for_tracer, socket_pair[0], T_cache); exit(0); } + close(socket_pair[0]); if (dont_fork == 0) { - child2 = fork(); if (child2 == -1) abort(); + child2 = fork(); + + if (child2 == -1) abort(); + if (child2 != 0) { close(socket_pair[1]); munmap(T_cache, T_CACHE_SIZE * sizeof(T_cache_t)); @@ -161,27 +197,21 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork) s = socket_pair[1]; /* wait for first message - initial list of active T events */ get_message(s); - T_socket = s; - new_thread(T_receive_thread, NULL); } -void T_Config_Init(void) -{ +void T_Config_Init(void) { int T_port; /* by default we wait for the tracer */ int T_nowait; /* default port to listen to to wait for the tracer */ int T_dont_fork; /* default is to fork, see 'T_init' to understand */ - paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC; - /* for a cleaner config file, TTracer params should be defined in a * specific section... */ config_get(ttraceparams, sizeof(ttraceparams) / sizeof(paramdef_t), TTRACER_CONFIG_PREFIX); - /* compatibility: look for TTracer command line options in root section */ config_process_cmdline(ttraceparams, sizeof(ttraceparams) / sizeof(paramdef_t), diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h index b4ff3b5006bbf4b5ad9b1d4bdc4ac7c731a9ae1a..5ae19f9b552e1f08d3206b81ac5196c4e17f7310 100644 --- a/openair2/UTIL/OPT/opt.h +++ b/openair2/UTIL/OPT/opt.h @@ -33,26 +33,23 @@ This header file must be included */ #define OPT_H_ #ifndef sys_include -#define sys_include -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> -#include <time.h> + #define sys_include + #include <sys/types.h> + #include <sys/socket.h> + #include <netinet/in.h> + #include <arpa/inet.h> + #include <netdb.h> + #include <stdio.h> + #include <stdlib.h> + #include <string.h> + #include <errno.h> + #include <unistd.h> + #include <time.h> #endif #ifndef project_include -#define project_include -#include "common/utils/LOG/log_if.h" -// #include "UTIL/LOG/log_extern.h" -//#include "PHY/defs.h" -//#include "PHY/extern.h" -#include "PHY/impl_defs_lte.h" + #define project_include + #include "common/utils/LOG/log_if.h" + #include "PHY/impl_defs_lte.h" #endif #define PACKET_MAC_LTE_DEFAULT_UDP_PORT (9999) @@ -65,6 +62,32 @@ typedef guint8 gboolean; #include "packet-mac-lte.h" #include "mac_pcap.h" +/* OPT parameters definitions */ +#define OPT_CONFIGPREFIX "opt" + +#define CONFIG_HLP_TYPEMON "Type of L2 monitoring messages: none,pcap,wireshark \n" +#define CONFIG_HLP_L2MONIP "ip address for wireshark messages \n" +#define CONFIG_HLP_L2MONPATH "file path for pcap messages on localhost \n" +/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* command line parameters for LOG utility */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define OPT_PARAMS_DESC { \ + {"type" , CONFIG_HLP_TYPEMON, 0, strptr:&in_type, defstrval:"none", TYPE_STRING, 0}, \ + {"ip" , CONFIG_HLP_L2MONIP, 0, strptr:&in_ip, defstrval:"127.0.0.1", TYPE_STRING, 0}, \ + {"path" , CONFIG_HLP_L2MONPATH, 0, strptr:&in_path, defstrval:"/tmp/oai_opt.pcap", TYPE_STRING, 0}, \ + } + +#define OPTTYPE_IDX 0 +/* check function for opt parameters */ +#define OPTTYPE_OKSTRINGS {"none","pcap","wireshark"} +#define OPTTYPE_VALUES {OPT_NONE,OPT_PCAP,OPT_WIRESHARK} +#define OPTPARAMS_CHECK_DESC { \ + { .s3a= { config_checkstr_assign_integer, OPTTYPE_OKSTRINGS,OPTTYPE_VALUES ,3}} ,\ + { .s5= {NULL }} , \ + { .s5= {NULL }} , \ + } + #ifdef OCP_FRAMEWORK #include <enums.h> #else @@ -82,9 +105,7 @@ typedef enum radio_type_e { RADIO_TYPE_MAX } radio_type_t; -extern trace_mode_t opt_type; -extern char in_ip[40]; -extern char in_path[FILENAME_MAX]; + /** * function def @@ -94,7 +115,7 @@ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, int ueid, int rntiType, int rnti, uint16_t sysFrame, uint8_t subframe, int oob_event, int oob_event_value); -int init_opt(char *path, char *ip); +int init_opt(void); void terminate_opt(void); diff --git a/openair2/UTIL/OPT/probe.c b/openair2/UTIL/OPT/probe.c index a1e53671682a10f0f984cbcd831b98c0116378e2..b032784028ee4dc7f2349e615cc7bbef5a6cbc6d 100644 --- a/openair2/UTIL/OPT/probe.c +++ b/openair2/UTIL/OPT/probe.c @@ -90,7 +90,7 @@ what about the implementation #include <pthread.h> #include <stdint.h> - +#include "common/config/config_userapi.h" #include "opt.h" int opt_enabled=0; @@ -98,8 +98,8 @@ int opt_enabled=0; //static unsigned char g_PDUBuffer[1600]; //static unsigned int g_PDUOffset; -char in_ip[40]; -char in_path[FILENAME_MAX]; +static char *in_ip; +static char *in_path; FILE *file_fd = NULL; pcap_hdr_t file_header = { 0xa1b2c3d4, /* magic number */ @@ -133,17 +133,15 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, static int MAC_LTE_PCAP_WritePDU(MAC_Context_Info_t *context, const unsigned char *PDU, unsigned int length); -static void *opt_listener_thread(void *arg) -{ +static void *opt_listener_thread(void *arg) { ssize_t ret; struct sockaddr_in from_address; socklen_t socklen = sizeof(from_address); - memset(&from_address, 0, sizeof(from_address)); while(1) { /* Simply drop packets */ - ret = recvfrom(opt_listener.sd, NULL, 0, 0, (struct sockaddr*)&from_address, + ret = recvfrom(opt_listener.sd, NULL, 0, 0, (struct sockaddr *)&from_address, &socklen); if (ret == 0) { @@ -165,17 +163,13 @@ static void *opt_listener_thread(void *arg) } static -int opt_create_listener_socket(char *ip_address, uint16_t port) -{ +int opt_create_listener_socket(char *ip_address, uint16_t port) { /* Create an UDP socket and listen on it. * Silently discard PDU received. */ - int sd = -1; int ret = -1; - memset(&opt_listener, 0, sizeof(opt_listener_t)); - sd = socket(AF_INET, SOCK_DGRAM, 0); if (sd < 0) { @@ -190,8 +184,7 @@ int opt_create_listener_socket(char *ip_address, uint16_t port) /* Listening only on provided IP address */ opt_listener.address.sin_addr.s_addr = inet_addr(ip_address); opt_listener.address.sin_port = htons(port); - - ret = bind(opt_listener.sd, (struct sockaddr*) &opt_listener.address, sizeof(opt_listener.address)); + ret = bind(opt_listener.sd, (struct sockaddr *) &opt_listener.address, sizeof(opt_listener.address)); if (ret != 0) { LOG_E(OPT, "Failed to bind socket to (%s:%u): %s\n", @@ -231,49 +224,39 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, guint16 rnti, guint16 ueid, guint16 sfnSf, guint8 isPredefinedData, guint8 retx, guint8 crcStatus, guint8 oob_event, guint8 oob_event_value, - uint8_t *pdu_buffer, unsigned int pdu_buffer_size) -{ + uint8_t *pdu_buffer, unsigned int pdu_buffer_size) { unsigned char frameBuffer[9000]; unsigned int frameOffset; - ssize_t bytesSent; frameOffset = 0; uint16_t tmp16; - memcpy(frameBuffer+frameOffset, MAC_LTE_START_STRING, strlen(MAC_LTE_START_STRING)); frameOffset += strlen(MAC_LTE_START_STRING); - /******************************************************************************/ /* Now write out fixed fields (the mandatory elements of struct mac_lte_info) */ frameBuffer[frameOffset++] = radioType; frameBuffer[frameOffset++] = direction; frameBuffer[frameOffset++] = rntiType; - /*************************************/ /* Now optional fields */ - /* RNTI */ frameBuffer[frameOffset++] = MAC_LTE_RNTI_TAG; tmp16 = htons(rnti); memcpy(frameBuffer+frameOffset, &tmp16, 2); frameOffset += 2; - /* UEId */ frameBuffer[frameOffset++] = MAC_LTE_UEID_TAG; tmp16 = htons(ueid); memcpy(frameBuffer+frameOffset, &tmp16, 2); frameOffset += 2; - /* Subframe number */ frameBuffer[frameOffset++] = MAC_LTE_FRAME_SUBFRAME_TAG; tmp16 = htons(sfnSf); // frame counter : this will give an expert info as wireshark expects SF and not F memcpy(frameBuffer+frameOffset, &tmp16, 2); frameOffset += 2; - frameBuffer[frameOffset++] = MAC_LTE_CRC_STATUS_TAG; frameBuffer[frameOffset++] = crcStatus; - #ifdef WIRESHARK_DEV frameOffset += 2; tmp16 = htons(sfnSf); // subframe @@ -293,55 +276,55 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, frameBuffer[frameOffset++] = retx; } -//#ifdef WIRESHARK_DEV + //#ifdef WIRESHARK_DEV /* Relating to out-of-band events */ /* N.B. dissector will only look to these fields if length is 0... */ if (pdu_buffer_size==0) { switch (oob_event) { - case ltemac_send_preamble : - LOG_D(OPT,"ltemac_send_preamble event %02x." - //"%02x." - "%02x.%02x\n", - MAC_LTE_SEND_PREAMBLE_TAG, - //ltemac_send_preamble, - rnti, - oob_event_value); - //frameBuffer[frameOffset++]=0; - //frameBuffer[frameOffset++]=0; - //frameBuffer[frameOffset++]=0; - frameBuffer[frameOffset++] = MAC_LTE_SEND_PREAMBLE_TAG; - //frameBuffer[frameOffset++]=ltemac_send_preamble; - frameBuffer[frameOffset++]=rnti; // is the preamble - frameBuffer[frameOffset++]=oob_event_value; - break; - - case ltemac_send_sr: - frameBuffer[frameOffset++]=MAC_LTE_SR_TAG ; - frameOffset+=2; - frameBuffer[frameOffset++]=rnti; - frameOffset++; - frameBuffer[frameOffset++]=oob_event_value; - frameOffset++; - break; - - case ltemac_sr_failure: - default: - LOG_W(OPT,"not implemeneted yet\n"); - break; + case ltemac_send_preamble : + LOG_D(OPT,"ltemac_send_preamble event %02x." + //"%02x." + "%02x.%02x\n", + MAC_LTE_SEND_PREAMBLE_TAG, + //ltemac_send_preamble, + rnti, + oob_event_value); + //frameBuffer[frameOffset++]=0; + //frameBuffer[frameOffset++]=0; + //frameBuffer[frameOffset++]=0; + frameBuffer[frameOffset++] = MAC_LTE_SEND_PREAMBLE_TAG; + //frameBuffer[frameOffset++]=ltemac_send_preamble; + frameBuffer[frameOffset++]=rnti; // is the preamble + frameBuffer[frameOffset++]=oob_event_value; + break; + + case ltemac_send_sr: + frameBuffer[frameOffset++]=MAC_LTE_SR_TAG ; + frameOffset+=2; + frameBuffer[frameOffset++]=rnti; + frameOffset++; + frameBuffer[frameOffset++]=oob_event_value; + frameOffset++; + break; + + case ltemac_sr_failure: + default: + LOG_W(OPT,"not implemeneted yet\n"); + break; } } -//#endif + //#endif /***************************************/ /* Now write the MAC PDU */ frameBuffer[frameOffset++] = MAC_LTE_PAYLOAD_TAG; - + /* Append actual PDU */ //memcpy(frameBuffer+frameOffset, g_PDUBuffer, g_PDUOffset); //frameOffset += g_PDUOffset; if (pdu_buffer != NULL) { - memcpy(frameBuffer+frameOffset, (void*)pdu_buffer, pdu_buffer_size); + memcpy(frameBuffer+frameOffset, (void *)pdu_buffer, pdu_buffer_size); frameOffset += pdu_buffer_size; } @@ -358,44 +341,36 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, /* Write an individual PDU (PCAP packet header + mac-context + mac-pdu) */ static int MAC_LTE_PCAP_WritePDU(MAC_Context_Info_t *context, - const uint8_t *PDU, unsigned int length) -{ + const uint8_t *PDU, unsigned int length) { pcaprec_hdr_t packet_header; uint8_t context_header[256]; int offset = 0; unsigned short tmp16; - /*****************************************************************/ /* Context information (same as written by UDP heuristic clients */ context_header[offset++] = context->radioType; context_header[offset++] = context->direction; context_header[offset++] = context->rntiType; - /* RNTI */ context_header[offset++] = MAC_LTE_RNTI_TAG; tmp16 = htons(context->rnti); memcpy(context_header+offset, &tmp16, 2); offset += 2; - /* UEId */ context_header[offset++] = MAC_LTE_UEID_TAG; tmp16 = htons(context->ueid); memcpy(context_header+offset, &tmp16, 2); offset += 2; - /* Subframe number */ context_header[offset++] = MAC_LTE_FRAME_SUBFRAME_TAG; tmp16 = htons(context->subFrameNumber); memcpy(context_header+offset, &tmp16, 2); offset += 2; - /* CRC Status */ context_header[offset++] = MAC_LTE_CRC_STATUS_TAG; context_header[offset++] = context->crcStatusOK; - /* Data tag immediately preceding PDU */ context_header[offset++] = MAC_LTE_PAYLOAD_TAG; - /****************************************************************/ /* PCAP Header */ /* TODO: Timestamp might want to be relative to a more sensible @@ -404,13 +379,11 @@ static int MAC_LTE_PCAP_WritePDU(MAC_Context_Info_t *context, packet_header.ts_usec = (context->subframesSinceCaptureStart % 1000) * 1000; packet_header.incl_len = offset + length; packet_header.orig_len = offset + length; - /***************************************************************/ /* Now write everything to the file */ fwrite(&packet_header, sizeof(pcaprec_hdr_t), 1, file_fd); fwrite(context_header, 1, offset, file_fd); fwrite(PDU, 1, length, file_fd); - return 1; } #include <common/ran_context.h> @@ -419,117 +392,129 @@ extern RAN_CONTEXT_t RC; /* Remote serveraddress (where Wireshark is running) */ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, int ueid, int rntiType, int rnti, uint16_t sysFrameNumber, uint8_t subFrameNumber, int oob_event, - int oob_event_value) -{ + int oob_event_value) { MAC_Context_Info_t pdu_context; int radioType=FDD_RADIO; + if (RC.eNB[0][0]!=NULL) radioType=RC.eNB[0][0]->frame_parms.frame_type== FDD ? FDD_RADIO:TDD_RADIO; + if (PHY_vars_UE_g[0][0] != NULL) radioType=PHY_vars_UE_g[0][0]->frame_parms.frame_type== FDD ? FDD_RADIO:TDD_RADIO; + switch (opt_type) { - case OPT_WIRESHARK : - if (g_socksd == -1) { - return; - } + case OPT_WIRESHARK : + if (g_socksd == -1) { + return; + } + + SendFrame( radioType, + (direction == DIRECTION_DOWNLINK) ? DIRECTION_DOWNLINK : DIRECTION_UPLINK, + rntiType, rnti, ueid, (sysFrameNumber<<4) + subFrameNumber, + 1, 0, 1, //guint8 isPredefinedData, guint8 retx, guint8 crcStatus + oob_event,oob_event_value, + pdu_buffer, pdu_buffer_size); + break; - SendFrame( radioType, - (direction == DIRECTION_DOWNLINK) ? DIRECTION_DOWNLINK : DIRECTION_UPLINK, - rntiType, rnti, ueid, (sysFrameNumber<<4) + subFrameNumber, - 1, 0, 1, //guint8 isPredefinedData, guint8 retx, guint8 crcStatus - oob_event,oob_event_value, - pdu_buffer, pdu_buffer_size); - break; - - case OPT_PCAP: - if (file_fd == NULL) { - return; - } + case OPT_PCAP: + if (file_fd == NULL) { + return; + } + + pdu_context.radioType = radioType; + pdu_context.direction = (direction == DIRECTION_DOWNLINK) ? DIRECTION_DOWNLINK + : DIRECTION_UPLINK; + pdu_context.rntiType = rntiType; + pdu_context.rnti = rnti; + pdu_context.ueid = ueid; + pdu_context.isRetx = 0; + pdu_context.crcStatusOK =1; + pdu_context.sysFrameNumber = sysFrameNumber; + pdu_context.subFrameNumber = subFrameNumber; + pdu_context.subframesSinceCaptureStart = subframesSinceCaptureStart++; + MAC_LTE_PCAP_WritePDU( &pdu_context, pdu_buffer, pdu_buffer_size); + break; - pdu_context.radioType = radioType; - pdu_context.direction = (direction == DIRECTION_DOWNLINK) ? DIRECTION_DOWNLINK - : DIRECTION_UPLINK; - pdu_context.rntiType = rntiType; - pdu_context.rnti = rnti; - pdu_context.ueid = ueid; - pdu_context.isRetx = 0; - pdu_context.crcStatusOK =1; - pdu_context.sysFrameNumber = sysFrameNumber; - pdu_context.subFrameNumber = subFrameNumber; - pdu_context.subframesSinceCaptureStart = subframesSinceCaptureStart++; - MAC_LTE_PCAP_WritePDU( &pdu_context, pdu_buffer, pdu_buffer_size); - break; - - case OPT_TSHARK: - default: - break; + case OPT_TSHARK: + default: + break; } } /*---------------------------------------------------*/ -int init_opt(char *path, char *ip) -{ +int init_opt(void) { + char *in_type=NULL; + paramdef_t opt_params[] = OPT_PARAMS_DESC ; + checkedparam_t opt_checkParams[] = OPTPARAMS_CHECK_DESC; uint16_t in_port; + config_set_checkfunctions(opt_params, opt_checkParams, + sizeof(opt_params)/sizeof(paramdef_t)); + config_get( opt_params,sizeof(opt_params)/sizeof(paramdef_t),OPT_CONFIGPREFIX); subframesSinceCaptureStart = 0; - - if (path != NULL) { - strncpy( in_path, path, sizeof(in_path) ); - in_path[sizeof(in_path) - 1] = 0; // terminate string + int tmptype = config_get_processedint( &(opt_params[OPTTYPE_IDX])); + + if (tmptype == OPT_NONE) { + opt_enabled=0; + LOG_I(OPT,"OPT disabled\n"); + return 0; + } else if (tmptype == OPT_PCAP && strlen(in_path) > 0) { + opt_type = OPT_PCAP; + opt_enabled=1; + LOG_I(OPT,"Enabling OPT for PCAP with the following file %s \n",in_path); + } else if (tmptype == OPT_WIRESHARK && strlen(in_ip) > 0) { + opt_enabled=1; + opt_type = OPT_WIRESHARK; + LOG_I(OPT,"Enabling OPT for wireshark for local interface %s\n",in_ip); } else { - strcpy( in_path, "/tmp/opt.pcap" ); - } - - if (ip != NULL) { - strncpy( in_ip, ip, sizeof(in_ip) ); - in_ip[sizeof(in_ip) - 1] = 0; // terminate string - } else { - strcpy( in_ip, "127.0.0.1" ); + LOG_E(OPT,"Invalid OPT configuration\n"); + config_printhelp(opt_params,sizeof(opt_params)/sizeof(paramdef_t),OPT_CONFIGPREFIX); } in_port = PACKET_MAC_LTE_DEFAULT_UDP_PORT; // trace_mode switch (opt_type) { - case OPT_WIRESHARK: + case OPT_WIRESHARK: - /* Create local server socket only if using localhost address */ - if (strcmp(in_ip, "127.0.0.1") == 0) { - opt_create_listener_socket(in_ip, in_port); - } + /* Create local server socket only if using localhost address */ + if (strcmp(in_ip, "127.0.0.1") == 0) { + opt_create_listener_socket(in_ip, in_port); + } - g_socksd = socket(AF_INET, SOCK_DGRAM, 0); + g_socksd = socket(AF_INET, SOCK_DGRAM, 0); - if (g_socksd == -1) { - LOG_E(OPT, "Error trying to create socket (errno=%d)\n", errno); - LOG_E(OPT, "CREATING SOCKET FAILED\n"); - return (-1); - } + if (g_socksd == -1) { + LOG_E(OPT, "Error trying to create socket (errno=%d)\n", errno); + LOG_E(OPT, "CREATING SOCKET FAILED\n"); + return (-1); + } - /* Get remote IP address from the function argument */ - g_serv_addr.sin_family = AF_INET; - g_serv_addr.sin_port = htons(in_port); - g_serv_addr.sin_addr.s_addr = inet_addr(in_ip); - break; + /* Get remote IP address from the function argument */ + g_serv_addr.sin_family = AF_INET; + g_serv_addr.sin_port = htons(in_port); + g_serv_addr.sin_addr.s_addr = inet_addr(in_ip); + break; - case OPT_PCAP: - file_fd = fopen(in_path, "w"); + case OPT_PCAP: + file_fd = fopen(in_path, "w"); - if (file_fd == NULL) { - LOG_D(OPT, "Failed to open file \"%s\" for writing\n", in_path); - return (-1); - } - /* Write the file header */ - fwrite(&file_header, sizeof(pcap_hdr_t), 1, file_fd); - break; + if (file_fd == NULL) { + LOG_D(OPT, "Failed to open file \"%s\" for writing\n", in_path); + return (-1); + } - case OPT_TSHARK: - LOG_W(OPT, "Tshark is currently not supported\n"); - opt_type = OPT_NONE; - break; + /* Write the file header */ + fwrite(&file_header, sizeof(pcap_hdr_t), 1, file_fd); + break; - default: - opt_type = OPT_NONE; - LOG_W(OPT, "supported Option\n"); - break; + case OPT_TSHARK: + LOG_W(OPT, "Tshark is currently not supported\n"); + opt_type = OPT_NONE; + break; + + default: + opt_type = OPT_NONE; + LOG_W(OPT, "supported Option\n"); + break; } if ( opt_type == OPT_WIRESHARK ) @@ -543,8 +528,7 @@ int init_opt(char *path, char *ip) // memset(mac_info, 0, sizeof(mac_lte_info)+pdu_buffer_size + 8); return (1); } -void terminate_opt(void) -{ +void terminate_opt(void) { /* Close local socket */ // free(mac_info); if (opt_type != OPT_NONE) { @@ -552,18 +536,18 @@ void terminate_opt(void) } switch (opt_type) { - case OPT_WIRESHARK: - close(g_socksd); - g_socksd = -1; - break; - - case OPT_PCAP: - fclose (file_fd); - file_fd = NULL; - break; - - default: - break; + case OPT_WIRESHARK: + close(g_socksd); + g_socksd = -1; + break; + + case OPT_PCAP: + fclose (file_fd); + file_fd = NULL; + break; + + default: + break; } } diff --git a/targets/RT/USER/lte-softmodem-common.c b/targets/RT/USER/lte-softmodem-common.c index 7e1235b3103b8e4b35cd6d62ca2aa386c61dc694..814800ccfcb6bb1572197d856fba2cd79cc841d6 100644 --- a/targets/RT/USER/lte-softmodem-common.c +++ b/targets/RT/USER/lte-softmodem-common.c @@ -39,67 +39,58 @@ char *parallel_config=NULL; char *worker_config=NULL; uint64_t get_softmodem_optmask(void) { - return softmodem_params.optmask; + return softmodem_params.optmask; } uint64_t set_softmodem_optmask(uint64_t bitmask) { - softmodem_params.optmask = softmodem_params.optmask | bitmask; - return softmodem_params.optmask; + softmodem_params.optmask = softmodem_params.optmask | bitmask; + return softmodem_params.optmask; } -softmodem_params_t* get_softmodem_params(void) { - return &softmodem_params; +softmodem_params_t *get_softmodem_params(void) { + return &softmodem_params; } -void get_common_options(void) -{ - - -uint32_t online_log_messages; -uint32_t glog_level ; -uint32_t start_telnetsrv; -uint32_t noS1; -uint32_t nokrnmod; -uint32_t nonbiot; -paramdef_t cmdline_params[] =CMDLINE_PARAMS_DESC ; -paramdef_t cmdline_logparams[] =CMDLINE_LOGPARAMS_DESC ; - - - - config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL); - - if (strlen(in_path) > 0) { - opt_type = OPT_PCAP; - opt_enabled=1; - printf("Enabling OPT for PCAP with the following file %s \n",in_path); - } - if (strlen(in_ip) > 0) { - opt_enabled=1; - opt_type = OPT_WIRESHARK; - printf("Enabling OPT for wireshark for local interface"); - } - - config_process_cmdline( cmdline_logparams,sizeof(cmdline_logparams)/sizeof(paramdef_t),NULL); +void get_common_options(void) { + uint32_t online_log_messages; + uint32_t glog_level ; + uint32_t start_telnetsrv; + uint32_t noS1; + uint32_t nokrnmod; + uint32_t nonbiot; + paramdef_t cmdline_params[] =CMDLINE_PARAMS_DESC ; + paramdef_t cmdline_logparams[] =CMDLINE_LOGPARAMS_DESC ; + checkedparam_t cmdline_log_CheckParams[] = CMDLINE_LOGPARAMS_CHECK_DESC; + config_get( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL); + config_set_checkfunctions(cmdline_logparams, cmdline_log_CheckParams, + sizeof(cmdline_logparams)/sizeof(paramdef_t)); + config_get( cmdline_logparams,sizeof(cmdline_logparams)/sizeof(paramdef_t),NULL); if(config_isparamset(cmdline_logparams,CMDLINE_ONLINELOG_IDX)) { - set_glog_onlinelog(online_log_messages); + set_glog_onlinelog(online_log_messages); } + if(config_isparamset(cmdline_logparams,CMDLINE_GLOGLEVEL_IDX)) { - set_glog(glog_level); + set_glog(glog_level); } + if (start_telnetsrv) { - load_module_shlib("telnetsrv",NULL,0,NULL); + load_module_shlib("telnetsrv",NULL,0,NULL); } if (noS1) { - set_softmodem_optmask(SOFTMODEM_NOS1_BIT); + set_softmodem_optmask(SOFTMODEM_NOS1_BIT); } + if (nokrnmod) { - set_softmodem_optmask(SOFTMODEM_NOKRNMOD_BIT); - } + set_softmodem_optmask(SOFTMODEM_NOKRNMOD_BIT); + } + if (nonbiot) { - set_softmodem_optmask(SOFTMODEM_NONBIOT_BIT); - } + set_softmodem_optmask(SOFTMODEM_NONBIOT_BIT); + } + if(parallel_config != NULL) set_parallel_conf(parallel_config); + if(worker_config != NULL) set_worker_conf(worker_config); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 872340e28caca653b7497260efdf498ac4efdc1d..27869b800e15cf387f0b610a7e90112041b4f769 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -305,9 +305,6 @@ void exit_function(const char *file, const char *function, const int line, const } sleep(1); //allow lte-softmodem threads to exit first -#if defined(ENABLE_ITTI) - itti_terminate_tasks (TASK_UNKNOWN); -#endif exit(1); } @@ -449,7 +446,7 @@ static void get_options(void) { NB_eNB_INST = RC.nb_inst; printf("Configuration: nb_rrc_inst %d, nb_L1_inst %d, nb_ru %d\n",NB_eNB_INST,RC.nb_L1_inst,RC.nb_RU); - if (!SOFTMODEM_NONBIOT) { + if (!IS_SOFTMODEM_NONBIOT) { load_NB_IoT(); printf(" nb_nbiot_rrc_inst %d, nb_nbiot_L1_inst %d, nb_nbiot_macrlc_inst %d\n", RC.nb_nb_iot_rrc_inst, RC.nb_nb_iot_L1_inst, RC.nb_nb_iot_macrlc_inst); @@ -505,7 +502,8 @@ void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) { } void wait_RUs(void) { - LOG_I(PHY,"Waiting for RUs to be configured ... RC.ru_mask:%02lx\n", RC.ru_mask); + /* do not modify the following LOG_UI message, which is used by CI */ + LOG_UI(ENB_APP,"Waiting for RUs to be configured ... RC.ru_mask:%02lx\n", RC.ru_mask); // wait for all RUs to be configured over fronthaul pthread_mutex_lock(&RC.ru_mutex); @@ -678,7 +676,6 @@ int main( int argc, char **argv ) { set_latency_target(); logInit(); printf("Reading in command-line options\n"); - CONFIG_SETRTFLAG(CONFIG_NOCHECKUNKOPT); get_options (); if (CONFIG_ISFLAGSET(CONFIG_ABORT) ) { @@ -689,14 +686,6 @@ int main( int argc, char **argv ) { #if T_TRACER T_Config_Init(); #endif - ret=config_check_unknown_cmdlineopt(NULL); - - if (ret != 0) { - LOG_E(ENB_APP, "%i unknown options in command line\n",ret); - exit_fun(""); - } - - CONFIG_CLEARRTFLAG(CONFIG_NOCHECKUNKOPT); //randominit (0); set_taus_seed (0); printf("configuring for RAU/RRU\n"); @@ -717,12 +706,7 @@ int main( int argc, char **argv ) { MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX); #endif - - if (opt_type != OPT_NONE) { - if (init_opt(in_path, in_ip) == -1) - LOG_E(OPT,"failed to run OPT \n"); - } - + init_opt(); #ifdef PDCP_USE_NETLINK printf("PDCP netlink\n"); netlink_init(); @@ -947,13 +931,7 @@ if (nfapi_mode==2) {// VNF sync_var=0; pthread_cond_broadcast(&sync_cond); pthread_mutex_unlock(&sync_mutex); - ret=config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS); - - if (ret != 0) { - LOG_E(ENB_APP, "%i unknown options in command line (invalid section name)\n",ret); - exit_fun(""); - } - + config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS); // wait for end of program printf("TYPE <CTRL-C> TO TERMINATE\n"); //getchar(); @@ -1008,9 +986,7 @@ if (nfapi_mode==2) {// VNF } free_lte_top(); - printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); end_configmodule(); - printf("Called end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); pthread_cond_destroy(&sync_cond); pthread_mutex_destroy(&sync_mutex); pthread_cond_destroy(&nfapi_sync_cond); @@ -1029,9 +1005,7 @@ if (nfapi_mode==2) {// VNF } } - if (opt_enabled == 1) - terminate_opt(); - + terminate_opt(); logClean(); printf("Bye.\n"); return 0; diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h index 81f84e133b6fdf2cbf1a5722464be8fc1f6f92c4..3cca57c4e9a6add6fbdd3c1b89d15afa37063621 100644 --- a/targets/RT/USER/lte-softmodem.h +++ b/targets/RT/USER/lte-softmodem.h @@ -35,12 +35,12 @@ #include "flexran_agent.h" #if defined(ENABLE_ITTI) -#if defined(ENABLE_USE_MME) -#include "s1ap_eNB.h" -#ifdef PDCP_USE_NETLINK -#include "SIMULATION/ETH_TRANSPORT/proto.h" -#endif -#endif + #if defined(ENABLE_USE_MME) + #include "s1ap_eNB.h" + #ifdef PDCP_USE_NETLINK + #include "SIMULATION/ETH_TRANSPORT/proto.h" + #endif + #endif #endif /* help strings definition for command line options, used in CMDLINE_XXX_DESC macros and printed when -h option is used */ @@ -60,14 +60,14 @@ #define CONFIG_HLP_UENANTR "set UE number of rx antennas\n" #define CONFIG_HLP_UENANTT "set UE number of tx antennas\n" #define CONFIG_HLP_UESCAN "set UE to scan around carrier\n" -#define CONFIG_HLP_DUMPFRAME "dump UE received frame to rxsig_frame0.dat and exit\n" +#define CONFIG_HLP_DUMPFRAME "dump UE received frame to rxsig_frame0.dat and exit\n" #define CONFIG_HLP_DLSHIFT "dynamic shift for LLR compuation for TM3/4 (default 0)\n" #define CONFIG_HLP_UELOOP "get softmodem (UE) to loop through memory instead of acquiring from HW\n" #define CONFIG_HLP_PHYTST "test UE phy layer, mac disabled\n" -#define CONFIG_HLP_DMAMAP "sets flag for improved EXMIMO UE performance\n" +#define CONFIG_HLP_DMAMAP "sets flag for improved EXMIMO UE performance\n" #define CONFIG_HLP_CLK "tells hardware to use a clock reference (0:internal, 1:external, 2:gpsdo)\n" -#define CONFIG_HLP_USIM "use XOR autentication algo in case of test usim mode\n" -#define CONFIG_HLP_NOSNGLT "Disables single-thread mode in lte-softmodem\n" +#define CONFIG_HLP_USIM "use XOR autentication algo in case of test usim mode\n" +#define CONFIG_HLP_NOSNGLT "Disables single-thread mode in lte-softmodem\n" #define CONFIG_HLP_TADV "Set timing_advance\n" #define CONFIG_HLP_DLF "Set the downlink frequency for all component carriers\n" #define CONFIG_HLP_CHOFF "Channel id offset\n" @@ -76,16 +76,14 @@ #define CONFIG_HLP_ITTIL "Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n" #define CONFIG_HLP_DLMCS "Set the maximum downlink MCS\n" #define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n" -#define CONFIG_HLP_PRB "Set the PRB, valid values: 6, 25, 50, 100 \n" +#define CONFIG_HLP_PRB "Set the PRB, valid values: 6, 25, 50, 100 \n" #define CONFIG_HLP_EMULIFACE "Set the interface name for the multicast transport for emulation mode (e.g. eth0, lo, etc.) \n" -//#define CONFIG_HLP_NUMUES "Set the number of UEs for the emulation" -#define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n" +//#define CONFIG_HLP_NUMUES "Set the number of UEs for the emulation" +#define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n" #define CONFIG_HLP_ULMCS "Set the maximum uplink MCS\n" #define CONFIG_HLP_TDD "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n" #define CONFIG_HLP_SNR "Set average SNR in dB (for --siml1 option)\n" #define CONFIG_HLP_UE "Set the lte softmodem as a UE\n" -#define CONFIG_HLP_L2MONW "Enable L2 wireshark messages on localhost \n" -#define CONFIG_HLP_L2MONP "Enable L2 pcap messages on localhost \n" #define CONFIG_HLP_TQFS "Apply three-quarter of sampling frequency, 23.04 Msps to reduce the data rate on USB/PCIe transfers (only valid for 20 MHz)\n" #define CONFIG_HLP_TPORT "tracer port\n" #define CONFIG_HLP_NOTWAIT "don't wait for tracer, start immediately\n" @@ -103,7 +101,7 @@ #define CONFIG_HLP_USRP_CLK_SRC "USRP clock source: 'internal' or 'external'\n" /***************************************************************************************************************************************/ -/* command line options definitions, CMDLINE_XXXX_DESC macros are used to initialize paramdef_t arrays which are then used as argument +/* command line options definitions, CMDLINE_XXXX_DESC macros are used to initialize paramdef_t arrays which are then used as argument when calling config_get or config_getlist functions */ @@ -112,15 +110,15 @@ /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_UEMODEPARAMS_DESC { \ -{"calib-ue-rx", CONFIG_HLP_CALUER, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ -{"calib-ue-rx-med", CONFIG_HLP_CALUERM, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ -{"calib-ue-rx-byp", CONFIG_HLP_CALUERB, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ -{"debug-ue-prach", CONFIG_HLP_DBGUEPR, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ -{"no-L2-connect", CONFIG_HLP_NOL2CN, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ -{"calib-prach-tx", CONFIG_HLP_CALPRACH, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ -{"loop-memory", CONFIG_HLP_UELOOP, 0, strptr:&loopfile, defstrval:"iqs.in", TYPE_STRING,0}, \ -{"ue-dump-frame", CONFIG_HLP_DUMPFRAME, PARAMFLAG_BOOL, iptr:&dumpframe, defintval:0, TYPE_INT, 0}, \ -} + {"calib-ue-rx", CONFIG_HLP_CALUER, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ + {"calib-ue-rx-med", CONFIG_HLP_CALUERM, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ + {"calib-ue-rx-byp", CONFIG_HLP_CALUERB, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ + {"debug-ue-prach", CONFIG_HLP_DBGUEPR, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ + {"no-L2-connect", CONFIG_HLP_NOL2CN, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ + {"calib-prach-tx", CONFIG_HLP_CALPRACH, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ + {"loop-memory", CONFIG_HLP_UELOOP, 0, strptr:&loopfile, defstrval:"iqs.in", TYPE_STRING,0}, \ + {"ue-dump-frame", CONFIG_HLP_DUMPFRAME, PARAMFLAG_BOOL, iptr:&dumpframe, defintval:0, TYPE_INT, 0}, \ + } #define CMDLINE_CALIBUERX_IDX 0 #define CMDLINE_CALIBUERXMED_IDX 1 #define CMDLINE_CALIBUERXBYP_IDX 2 @@ -138,42 +136,42 @@ /*-------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_UEPARAMS_DESC { \ -{"siml1", CONFIG_HLP_SIML1, PARAMFLAG_BOOL, iptr:&simL1flag, defintval:0, TYPE_INT, 0}, \ -{"U", CONFIG_HLP_NUMUE, 0, u8ptr:&NB_UE_INST, defuintval:1, TYPE_UINT, 0}, \ -{"ue-rxgain", CONFIG_HLP_UERXG, 0, dblptr:&(rx_gain[0][0]), defdblval:130, TYPE_DOUBLE, 0}, \ -{"ue-rxgain-off", CONFIG_HLP_UERXGOFF, 0, dblptr:&rx_gain_off, defdblval:0, TYPE_DOUBLE, 0}, \ -{"ue-txgain", CONFIG_HLP_UETXG, 0, dblptr:&(tx_gain[0][0]), defdblval:0, TYPE_DOUBLE, 0}, \ -{"ue-nb-ant-rx", CONFIG_HLP_UENANTR, 0, u8ptr:&nb_antenna_rx, defuintval:1, TYPE_UINT8, 0}, \ -{"ue-nb-ant-tx", CONFIG_HLP_UENANTT, 0, u8ptr:&nb_antenna_tx, defuintval:1, TYPE_UINT8, 0}, \ -{"ue-scan-carrier", CONFIG_HLP_UESCAN, PARAMFLAG_BOOL, iptr:&UE_scan_carrier, defintval:0, TYPE_INT, 0}, \ -{"ue-max-power", NULL, 0, iptr:&(tx_max_power[0]), defintval:23, TYPE_INT, 0}, \ -{"emul-iface", CONFIG_HLP_EMULIFACE, 0, strptr:&emul_iface, defstrval:"lo", TYPE_STRING, 100}, \ -{"L2-emul", NULL, 0, u8ptr:&nfapi_mode, defuintval:3, TYPE_UINT8, 0}, \ -{"num-ues", NULL, 0, u8ptr:&(NB_UE_INST), defuintval:1, TYPE_UINT8, 0}, \ -{"nums_ue_thread", NULL, 0, u16ptr:&(NB_THREAD_INST), defuintval:1, TYPE_UINT16, 0}, \ -{"r" , CONFIG_HLP_PRB, 0, u8ptr:&(frame_parms[0]->N_RB_DL), defintval:25, TYPE_UINT8, 0}, \ -{"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ -{"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&usrp_args, defstrval:"type=b200",TYPE_STRING, 0}, \ -{"usrp-clksrc", CONFIG_HLP_USRP_CLK_SRC,0, strptr:(char **)&usrp_clksrc, defstrval:"internal", TYPE_STRING, 0}, \ -{"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, uptr:&mmapped_dma, defintval:0, TYPE_INT, 0}, \ -{"clock", CONFIG_HLP_CLK, 0, uptr:&clock_source, defintval:0, TYPE_UINT, 0}, \ -{"s" , CONFIG_HLP_SNR, 0, iptr:&snr_dB, defintval:25, TYPE_INT, 0}, \ -{"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \ -{"A", CONFIG_HLP_TADV, 0, iptr:&(timingadv), defintval:0, TYPE_INT, 0} \ -} + {"siml1", CONFIG_HLP_SIML1, PARAMFLAG_BOOL, iptr:&simL1flag, defintval:0, TYPE_INT, 0}, \ + {"U", CONFIG_HLP_NUMUE, 0, u8ptr:&NB_UE_INST, defuintval:1, TYPE_UINT, 0}, \ + {"ue-rxgain", CONFIG_HLP_UERXG, 0, dblptr:&(rx_gain[0][0]), defdblval:130, TYPE_DOUBLE, 0}, \ + {"ue-rxgain-off", CONFIG_HLP_UERXGOFF, 0, dblptr:&rx_gain_off, defdblval:0, TYPE_DOUBLE, 0}, \ + {"ue-txgain", CONFIG_HLP_UETXG, 0, dblptr:&(tx_gain[0][0]), defdblval:0, TYPE_DOUBLE, 0}, \ + {"ue-nb-ant-rx", CONFIG_HLP_UENANTR, 0, u8ptr:&nb_antenna_rx, defuintval:1, TYPE_UINT8, 0}, \ + {"ue-nb-ant-tx", CONFIG_HLP_UENANTT, 0, u8ptr:&nb_antenna_tx, defuintval:1, TYPE_UINT8, 0}, \ + {"ue-scan-carrier", CONFIG_HLP_UESCAN, PARAMFLAG_BOOL, iptr:&UE_scan_carrier, defintval:0, TYPE_INT, 0}, \ + {"ue-max-power", NULL, 0, iptr:&(tx_max_power[0]), defintval:23, TYPE_INT, 0}, \ + {"emul-iface", CONFIG_HLP_EMULIFACE, 0, strptr:&emul_iface, defstrval:"lo", TYPE_STRING, 100}, \ + {"L2-emul", NULL, 0, u8ptr:&nfapi_mode, defuintval:3, TYPE_UINT8, 0}, \ + {"num-ues", NULL, 0, u8ptr:&(NB_UE_INST), defuintval:1, TYPE_UINT8, 0}, \ + {"nums_ue_thread", NULL, 0, u16ptr:&(NB_THREAD_INST), defuintval:1, TYPE_UINT16, 0}, \ + {"r" , CONFIG_HLP_PRB, 0, u8ptr:&(frame_parms[0]->N_RB_DL), defintval:25, TYPE_UINT8, 0}, \ + {"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ + {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&usrp_args, defstrval:"type=b200",TYPE_STRING, 0}, \ + {"usrp-clksrc", CONFIG_HLP_USRP_CLK_SRC,0, strptr:(char **)&usrp_clksrc, defstrval:"internal", TYPE_STRING, 0}, \ + {"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, uptr:&mmapped_dma, defintval:0, TYPE_INT, 0}, \ + {"clock", CONFIG_HLP_CLK, 0, uptr:&clock_source, defintval:0, TYPE_UINT, 0}, \ + {"s" , CONFIG_HLP_SNR, 0, iptr:&snr_dB, defintval:25, TYPE_INT, 0}, \ + {"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \ + {"A", CONFIG_HLP_TADV, 0, iptr:&(timingadv), defintval:0, TYPE_INT, 0} \ + } /*-------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* command line parameters specific to UE threads */ /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*-------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_UETHREADSPARAMS_DESC { \ -{"threadIQ", NULL, 0, iptr:&(threads.iq), defintval:1, TYPE_INT, 0}, \ -{"threadOneSubframe", NULL, 0, iptr:&(threads.one), defintval:1, TYPE_INT, 0}, \ -{"threadTwoSubframe", NULL, 0, iptr:&(threads.two), defintval:1, TYPE_INT, 0}, \ -{"threadThreeSubframe", NULL, 0, iptr:&(threads.three), defintval:1, TYPE_INT, 0}, \ -{"threadSlot1ProcOne", NULL, 0, iptr:&(threads.slot1_proc_one), defintval:1, TYPE_INT, 0}, \ -{"threadSlot1ProcTwo", NULL, 0, iptr:&(threads.slot1_proc_two), defintval:1, TYPE_INT, 0}, \ -} + {"threadIQ", NULL, 0, iptr:&(threads.iq), defintval:1, TYPE_INT, 0}, \ + {"threadOneSubframe", NULL, 0, iptr:&(threads.one), defintval:1, TYPE_INT, 0}, \ + {"threadTwoSubframe", NULL, 0, iptr:&(threads.two), defintval:1, TYPE_INT, 0}, \ + {"threadThreeSubframe", NULL, 0, iptr:&(threads.three), defintval:1, TYPE_INT, 0}, \ + {"threadSlot1ProcOne", NULL, 0, iptr:&(threads.slot1_proc_one), defintval:1, TYPE_INT, 0}, \ + {"threadSlot1ProcTwo", NULL, 0, iptr:&(threads.slot1_proc_two), defintval:1, TYPE_INT, 0}, \ + } #define DEFAULT_DLF 2680000000 @@ -192,28 +190,28 @@ #define CLOCK_SOURCE softmodem_params.clock_source #define USIM_TEST softmodem_params.usim_test #define CMDLINE_PARAMS_DESC { \ -{"rf-config-file", CONFIG_HLP_RFCFGF, 0, strptr:(char **)&RF_CONFIG_FILE, defstrval:NULL, TYPE_STRING, sizeof(RF_CONFIG_FILE)}, \ -{"ulsch-max-errors", CONFIG_HLP_ULMAXE, 0, uptr:&ULSCH_max_consecutive_errors, defuintval:0, TYPE_UINT, 0}, \ -{"phy-test", CONFIG_HLP_PHYTST, PARAMFLAG_BOOL, iptr:&PHY_TEST, defintval:0, TYPE_INT, 0}, \ -{"usim-test", CONFIG_HLP_USIM, PARAMFLAG_BOOL, u8ptr:&USIM_TEST, defintval:0, TYPE_UINT8, 0}, \ -{"emulate-rf" , CONFIG_HLP_EMULATE_RF, PARAMFLAG_BOOL, iptr:&EMULATE_RF, defintval:0, TYPE_INT, 0}, \ -{"clock", CONFIG_HLP_CLK, 0, uptr:&CLOCK_SOURCE, defintval:0, TYPE_UINT, 0}, \ -{"wait-for-sync", NULL, PARAMFLAG_BOOL, iptr:&WAIT_FOR_SYNC, defintval:0, TYPE_INT, 0}, \ -{"single-thread-enable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&SINGLE_THREAD_FLAG, defintval:0, TYPE_INT, 0}, \ -{"C" , CONFIG_HLP_DLF, 0, uptr:&(downlink_frequency[0][0]), defuintval:2680000000, TYPE_UINT, 0}, \ -{"a" , CONFIG_HLP_CHOFF, 0, iptr:&CHAIN_OFFSET, defintval:0, TYPE_INT, 0}, \ -{"d" , CONFIG_HLP_SOFTS, PARAMFLAG_BOOL, uptr:(uint32_t *)&DO_FORMS, defintval:0, TYPE_INT8, 0}, \ -{"W" , CONFIG_HLP_L2MONW, 0, strptr:(char **)&in_ip, defstrval:"127.0.0.1", TYPE_STRING, sizeof(in_ip)}, \ -{"P" , CONFIG_HLP_L2MONP, 0, strptr:(char **)&in_path, defstrval:"/tmp/oai_opt.pcap", TYPE_STRING, sizeof(in_path)}, \ -{"q" , CONFIG_HLP_STMON, PARAMFLAG_BOOL, iptr:&opp_enabled, defintval:0, TYPE_INT, 0}, \ -{"S" , CONFIG_HLP_MSLOTS, PARAMFLAG_BOOL, u8ptr:&exit_missed_slots, defintval:1, TYPE_UINT8, 0}, \ -{"numerology" , CONFIG_HLP_NUMEROLOGY, PARAMFLAG_BOOL, iptr:&NUMEROLOGY, defintval:0, TYPE_INT, 0}, \ -{"parallel-config", CONFIG_HLP_PARALLEL_CMD,0, strptr:(char **)¶llel_config, defstrval:NULL, TYPE_STRING, 0}, \ -{"worker-config", CONFIG_HLP_WORKER_CMD, 0, strptr:(char **)&worker_config, defstrval:NULL, TYPE_STRING, 0}, \ -{"noS1", CONFIG_HLP_NOS1, PARAMFLAG_BOOL, uptr:&noS1, defintval:0, TYPE_INT, 0}, \ -{"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \ -{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \ -} + {"rf-config-file", CONFIG_HLP_RFCFGF, 0, strptr:(char **)&RF_CONFIG_FILE, defstrval:NULL, TYPE_STRING, sizeof(RF_CONFIG_FILE)}, \ + {"ulsch-max-errors", CONFIG_HLP_ULMAXE, 0, uptr:&ULSCH_max_consecutive_errors, defuintval:0, TYPE_UINT, 0}, \ + {"phy-test", CONFIG_HLP_PHYTST, PARAMFLAG_BOOL, iptr:&PHY_TEST, defintval:0, TYPE_INT, 0}, \ + {"usim-test", CONFIG_HLP_USIM, PARAMFLAG_BOOL, u8ptr:&USIM_TEST, defintval:0, TYPE_UINT8, 0}, \ + {"emulate-rf" , CONFIG_HLP_EMULATE_RF, PARAMFLAG_BOOL, iptr:&EMULATE_RF, defintval:0, TYPE_INT, 0}, \ + {"clock", CONFIG_HLP_CLK, 0, uptr:&CLOCK_SOURCE, defintval:0, TYPE_UINT, 0}, \ + {"wait-for-sync", NULL, PARAMFLAG_BOOL, iptr:&WAIT_FOR_SYNC, defintval:0, TYPE_INT, 0}, \ + {"single-thread-enable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&SINGLE_THREAD_FLAG, defintval:0, TYPE_INT, 0}, \ + {"C" , CONFIG_HLP_DLF, 0, uptr:&(downlink_frequency[0][0]), defuintval:2680000000, TYPE_UINT, 0}, \ + {"a" , CONFIG_HLP_CHOFF, 0, iptr:&CHAIN_OFFSET, defintval:0, TYPE_INT, 0}, \ + {"d" , CONFIG_HLP_SOFTS, PARAMFLAG_BOOL, uptr:(uint32_t *)&DO_FORMS, defintval:0, TYPE_INT8, 0}, \ + {"W" , CONFIG_HLP_L2MONW, 0, strptr:(char **)&in_ip, defstrval:"127.0.0.1", TYPE_STRING, sizeof(in_ip)}, \ + {"P" , CONFIG_HLP_L2MONP, 0, strptr:(char **)&in_path, defstrval:"/tmp/oai_opt.pcap", TYPE_STRING, sizeof(in_path)}, \ + {"q" , CONFIG_HLP_STMON, PARAMFLAG_BOOL, iptr:&opp_enabled, defintval:0, TYPE_INT, 0}, \ + {"S" , CONFIG_HLP_MSLOTS, PARAMFLAG_BOOL, u8ptr:&exit_missed_slots, defintval:1, TYPE_UINT8, 0}, \ + {"numerology" , CONFIG_HLP_NUMEROLOGY, PARAMFLAG_BOOL, iptr:&NUMEROLOGY, defintval:0, TYPE_INT, 0}, \ + {"parallel-config", CONFIG_HLP_PARALLEL_CMD,0, strptr:(char **)¶llel_config, defstrval:NULL, TYPE_STRING, 0}, \ + {"worker-config", CONFIG_HLP_WORKER_CMD, 0, strptr:(char **)&worker_config, defstrval:NULL, TYPE_STRING, 0}, \ + {"noS1", CONFIG_HLP_NOS1, PARAMFLAG_BOOL, uptr:&noS1, defintval:0, TYPE_INT, 0}, \ + {"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \ + {"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \ + } #define CONFIG_HLP_FLOG "Enable online log \n" #define CONFIG_HLP_LOGL "Set the global log level, valide options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n" @@ -225,17 +223,23 @@ /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define START_MSC softmodem_params.start_msc #define CMDLINE_LOGPARAMS_DESC { \ -{"R" , CONFIG_HLP_FLOG, 0, uptr:&online_log_messages, defintval:1, TYPE_INT, 0}, \ -{"g" , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \ -{"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \ -{"msc", CONFIG_HLP_MSC, PARAMFLAG_BOOL, uptr:&START_MSC, defintval:0, TYPE_UINT, 0}, \ -} -#define CMDLINE_ONLINELOG_IDX 0 + {"R" , CONFIG_HLP_FLOG, 0, uptr:&online_log_messages, defintval:1, TYPE_INT, 0}, \ + {"g" , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \ + {"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \ + {"msc", CONFIG_HLP_MSC, PARAMFLAG_BOOL, uptr:&START_MSC, defintval:0, TYPE_UINT, 0}, \ + } +#define CMDLINE_ONLINELOG_IDX 0 #define CMDLINE_GLOGLEVEL_IDX 1 #define CMDLINE_STARTTELN_IDX 2 - -/***************************************************************************************************************************************/ +/* check function for global log level */ +#define CMDLINE_LOGPARAMS_CHECK_DESC { \ + { .s5= {NULL }} , \ + { .s2= { config_check_intrange, {0,4}}}, \ + { .s5= {NULL }} , \ + { .s5= {NULL }} , \ + } +/***************************************************************************************************************************************/ /* */ #include "threads_t.h" @@ -243,30 +247,29 @@ #define SOFTMODEM_NOKRNMOD_BIT (1<<1) #define SOFTMODEM_NONBIOT_BIT (1<<2) typedef struct { - uint64_t optmask; - THREAD_STRUCT thread_struct; - char rf_config_file[1024]; - int phy_test; - uint8_t usim_test; - int emulate_rf; - int wait_for_sync; //eNodeB only - int single_thread_flag; //eNodeB only - int chain_offset; - uint32_t do_forms; - int numerology; - unsigned int start_msc; - int nonbiotflag; - uint32_t clock_source; - int hw_timing_advance; + uint64_t optmask; + THREAD_STRUCT thread_struct; + char rf_config_file[1024]; + int phy_test; + uint8_t usim_test; + int emulate_rf; + int wait_for_sync; //eNodeB only + int single_thread_flag; //eNodeB only + int chain_offset; + uint32_t do_forms; + int numerology; + unsigned int start_msc; + uint32_t clock_source; + int hw_timing_advance; } softmodem_params_t; -#define SOFTMODEM_NOS1 ( get_softmodem_optmask() & SOFTMODEM_NOS1_BIT) -#define SOFTMODEM_NOKRNMOD ( get_softmodem_optmask() & SOFTMODEM_NOKRNMOD_BIT) -#define SOFTMODEM_NONBIOT ( get_softmodem_optmask() & SOFTMODEM_NONBIOT_BIT) +#define IS_SOFTMODEM_NOS1 ( get_softmodem_optmask() & SOFTMODEM_NOS1_BIT) +#define IS_SOFTMODEM_NOKRNMOD ( get_softmodem_optmask() & SOFTMODEM_NOKRNMOD_BIT) +#define IS_SOFTMODEM_NONBIOT ( get_softmodem_optmask() & SOFTMODEM_NONBIOT_BIT) extern uint64_t get_softmodem_optmask(void); extern uint64_t set_softmodem_optmask(uint64_t bitmask); extern void get_common_options(void); -extern softmodem_params_t* get_softmodem_params(void); +extern softmodem_params_t *get_softmodem_params(void); uint64_t get_pdcp_optmask(void); extern pthread_cond_t sync_cond; @@ -292,8 +295,8 @@ extern int transmission_mode; extern double cpuf; #if defined(ENABLE_ITTI) -extern volatile int start_eNB; -extern volatile int start_UE; + extern volatile int start_eNB; + extern volatile int start_UE; #endif @@ -305,7 +308,7 @@ extern void stop_eNB(int); extern void kill_eNB_proc(int inst); // In lte-ru.c -extern void init_RU(char*); +extern void init_RU(char *); extern void stop_ru(RU_t *ru); extern void init_ru_vnf(void); extern void init_RU_proc(RU_t *ru); @@ -317,8 +320,9 @@ extern void set_function_spec_param(RU_t *ru); extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg); extern void fill_ue_band_info(void); -extern void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correction, int phy_test, int UE_scan, int UE_scan_carrier, runmode_t mode,int rxgain,int txpowermax, LTE_DL_FRAME_PARMS *fp); -extern void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, cpu_set_t *cpuset, char * name); +extern void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correction, int phy_test, int UE_scan, int UE_scan_carrier, runmode_t mode,int rxgain,int txpowermax, + LTE_DL_FRAME_PARMS *fp); +extern void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, cpu_set_t *cpuset, char *name); extern void reset_opp_meas(void); extern void print_opp_meas(void); @@ -333,7 +337,7 @@ extern void RCConfig_sim(void); extern void init_ocm(double,double); extern void init_ue_devices(PHY_VARS_UE *); -PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, +PHY_VARS_UE *init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, uint8_t UE_id, uint8_t abstraction_flag); void init_eNB_afterRU(void); @@ -348,8 +352,8 @@ extern int restart_L1L2(module_id_t enb_id); extern void init_UE_stub_single_thread(int nb_inst,int eMBMS_active, int uecap_xer_in, char *emul_iface); -extern PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, - uint8_t UE_id, - uint8_t abstraction_flag); +extern PHY_VARS_UE *init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, + uint8_t UE_id, + uint8_t abstraction_flag); #endif diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c index 4583b6ac97cc56d8d2671da7c805d20b07d260de..e10c10c668e3faa1059bf35983f4bccad710f66d 100644 --- a/targets/RT/USER/lte-uesoftmodem.c +++ b/targets/RT/USER/lte-uesoftmodem.c @@ -456,7 +456,6 @@ static void get_options(void) { CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP); /* unknown parameters on command line will be checked in main after all init have been performed */ - CONFIG_SETRTFLAG(CONFIG_NOCHECKUNKOPT); get_common_options(); get_uethreads_params(); paramdef_t cmdline_uemodeparams[] =CMDLINE_UEMODEPARAMS_DESC; @@ -754,7 +753,6 @@ int main( int argc, char **argv ) { for (int i=0; i<MAX_NUM_CCs; i++) tx_max_power[i]=23; - CONFIG_SETRTFLAG(CONFIG_NOCHECKUNKOPT); get_options (); printf("Running with %d UE instances\n",NB_UE_INST); @@ -791,7 +789,6 @@ int main( int argc, char **argv ) { #if T_TRACER T_Config_Init(); #endif - CONFIG_CLEARRTFLAG(CONFIG_NOCHECKUNKOPT); //randominit (0); set_taus_seed (0); cpuf=get_cpu_freq_GHz(); @@ -808,12 +805,7 @@ int main( int argc, char **argv ) { MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX); #endif - - if (opt_type != OPT_NONE) { - if (init_opt(in_path, in_ip) == -1) - LOG_E(OPT,"failed to run OPT \n"); - } - + init_opt(); #ifdef PDCP_USE_NETLINK printf("PDCP netlink\n"); netlink_init(); @@ -1077,13 +1069,7 @@ int main( int argc, char **argv ) { } #endif - ret=config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS); - - if (ret != 0) { - LOG_E(ENB_APP, "%i unknown options in command line (invalid section name)\n",ret); - exit_fun(""); - } - + config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS); printf("Sending sync to all threads (%p,%p,%p)\n",&sync_var,&sync_cond,&sync_mutex); pthread_mutex_lock(&sync_mutex); sync_var=0; @@ -1134,9 +1120,7 @@ int main( int argc, char **argv ) { if (PHY_vars_UE_g[0][0]->rfdevice.trx_end_func) PHY_vars_UE_g[0][0]->rfdevice.trx_end_func(&PHY_vars_UE_g[0][0]->rfdevice); - if (opt_enabled == 1) - terminate_opt(); - + terminate_opt(); logClean(); printf("Bye.\n"); return 0;