Clean up logging module debug flags

cleanup debug/dump flags by avoiding repetitions in the source code and
enable compiler checks. Add a help text if we set a wrong debug trace
option.
This commit is contained in:
Laurent THOMAS
2025-01-23 14:12:29 +01:00
committed by Robert Schmidt
parent ca37e0c123
commit 536b5d8760
11 changed files with 230 additions and 226 deletions
+37 -50
View File
@@ -120,28 +120,6 @@ mapping * log_option_names_ptr(void)
return log_options;
}
static mapping log_maskmap[] = {{"PRACH", DEBUG_PRACH},
{"RU", DEBUG_RU},
{"UE_PHYPROC", DEBUG_UE_PHYPROC},
{"LTEESTIM", DEBUG_LTEESTIM},
{"DLCELLSPEC", DEBUG_DLCELLSPEC},
{"ULSCH", DEBUG_ULSCH},
{"RRC", DEBUG_RRC},
{"PDCP", DEBUG_PDCP},
{"DFT", DEBUG_DFT},
{"ASN1", DEBUG_ASN1},
{"CTRLSOCKET", DEBUG_CTRLSOCKET},
{"SECURITY", DEBUG_SECURITY},
{"NAS", DEBUG_NAS},
{"RLC", DEBUG_RLC},
{"DLSCH_DECOD", DEBUG_DLSCH_DECOD},
{"UE_TIMING", UE_TIMING},
{NULL, -1}};
mapping * log_maskmap_ptr(void)
{
return log_maskmap;
}
/* .log_format = 0x13 uncolored standard messages
* .log_format = 0x93 colored standard messages */
/* keep white space in first position; switching it to 0 allows colors to be disabled*/
@@ -327,6 +305,9 @@ int write_file_matlab(const char *fname, const char *vname, void *data, int leng
return 0;
}
#define FLAG_SETDEBUG(flag) g_log->debug_mask.DEBUG_##flag = *logparams_debug[i++].uptr;
#define FLAG_SETDUMP(flag) g_log->dump_mask.DEBUG_##flag = *logparams_dump[i++].uptr;
/* get log parameters from configuration file */
void log_getconfig(log_t *g_log)
{
@@ -335,8 +316,6 @@ void log_getconfig(log_t *g_log)
paramdef_t logparams_defaults[] = LOG_GLOBALPARAMS_DESC;
paramdef_t logparams_level[MAX_LOG_PREDEF_COMPONENTS];
paramdef_t logparams_logfile[MAX_LOG_PREDEF_COMPONENTS];
paramdef_t logparams_debug[sizeofArray(log_maskmap)];
paramdef_t logparams_dump[sizeofArray(log_maskmap)];
int ret = config_get(config_get_if(), logparams_defaults, sizeofArray(logparams_defaults), CONFIG_STRING_LOG_PREFIX);
if (ret <0) {
@@ -404,37 +383,45 @@ void log_getconfig(log_t *g_log)
}
/* build then read the debug and dump parameter array */
for (int i=0; log_maskmap[i].name != NULL ; i++) {
sprintf(logparams_debug[i].optname, LOG_CONFIG_DEBUG_FORMAT, log_maskmap[i].name);
sprintf(logparams_dump[i].optname, LOG_CONFIG_DUMP_FORMAT, log_maskmap[i].name);
logparams_debug[i].defuintval = 0;
logparams_debug[i].type = TYPE_UINT;
logparams_debug[i].paramflags = PARAMFLAG_BOOL;
logparams_debug[i].uptr = NULL;
logparams_debug[i].chkPptr = NULL;
logparams_debug[i].numelt = 0;
logparams_dump[i].defuintval = 0;
logparams_dump[i].type = TYPE_UINT;
logparams_dump[i].paramflags = PARAMFLAG_BOOL;
logparams_dump[i].uptr = NULL;
logparams_dump[i].chkPptr = NULL;
logparams_dump[i].numelt = 0;
int sz = 0;
for (const char *const *ptr = flag_name; strlen(*ptr) > 1; ptr++)
sz++;
paramdef_t logparams_debug[sz];
paramdef_t logparams_dump[sz];
for (int i = 0; i < sz; i++) {
logparams_debug[i] = (paramdef_t){
.type = TYPE_UINT,
.paramflags = PARAMFLAG_BOOL,
};
sprintf(logparams_debug[i].optname, LOG_CONFIG_DEBUG_FORMAT, flag_name[i]);
logparams_dump[i] = (paramdef_t){.type = TYPE_UINT, .paramflags = PARAMFLAG_BOOL};
sprintf(logparams_dump[i].optname, LOG_CONFIG_DUMP_FORMAT, flag_name[i]);
}
config_get(config_get_if(), logparams_debug, sizeofArray(log_maskmap) - 1, CONFIG_STRING_LOG_PREFIX);
config_get(config_get_if(), logparams_dump, sizeofArray(log_maskmap) - 1, CONFIG_STRING_LOG_PREFIX);
config_get(config_get_if(), logparams_debug, sz, CONFIG_STRING_LOG_PREFIX);
config_get(config_get_if(), logparams_dump, sz, CONFIG_STRING_LOG_PREFIX);
if (config_check_unknown_cmdlineopt(config_get_if(), CONFIG_STRING_LOG_PREFIX) > 0)
bool old = CONFIG_ISFLAGSET(CONFIG_NOABORTONCHKF);
CONFIG_SETRTFLAG(CONFIG_NOABORTONCHKF);
if (config_check_unknown_cmdlineopt(config_get_if(), CONFIG_STRING_LOG_PREFIX) > 0) {
printf("Existing log_config options:\n");
printf(" Boolean options:\n");
for (int i = 0; i < sz; i++)
printf(" %s, \t%s\n", logparams_debug[i].optname, logparams_dump[i].optname);
printf(" Log level per module (");
for (int i = 0; log_level_names[i].name != NULL; i++)
printf("%s ", log_level_names[i].name);
printf(")\n");
for (int i = 0; i < MAX_LOG_PREDEF_COMPONENTS; i++)
printf(" %s\n", logparams_level[i].optname);
exit(1);
/* set the debug mask according to the debug parameters values */
for (int i=0; log_maskmap[i].name != NULL ; i++) {
if (*(logparams_debug[i].uptr) )
g_log->debug_mask = g_log->debug_mask | log_maskmap[i].value;
if (*(logparams_dump[i].uptr) )
g_log->dump_mask = g_log->dump_mask | log_maskmap[i].value;
}
if (!old)
CONFIG_CLEARRTFLAG(CONFIG_NOABORTONCHKF);
int i = 0;
FOREACH_FLAG(FLAG_SETDEBUG);
i = 0;
FOREACH_FLAG(FLAG_SETDUMP);
/* log globally enabled/disabled */
set_glog_onlinelog(consolelog);
+60 -30
View File
@@ -88,7 +88,7 @@ extern "C" {
#define NUM_LOG_LEVEL 6 /*!< \brief the number of message levels users have with LOG (OAILOG_DISABLE is not available to user as a level, so it is not included)*/
/** @}*/
#define SET_LOG_OPTION(O) g_log->flag = (g_log->flag | O)
#define SET_LOG_OPTION(O) g_log->flag = (g_log->flag | O)
#define CLEAR_LOG_OPTION(O) g_log->flag = (g_log->flag & (~O))
/** @defgroup macros to identify a debug entity
@@ -99,28 +99,37 @@ extern "C" {
* server.
* @brief
* @{*/
#define DEBUG_PRACH (1<<0)
#define DEBUG_RU (1<<1)
#define DEBUG_UE_PHYPROC (1<<2)
#define DEBUG_LTEESTIM (1<<3)
#define DEBUG_DLCELLSPEC (1<<4)
#define DEBUG_ULSCH (1<<5)
#define DEBUG_RRC (1<<6)
#define DEBUG_PDCP (1<<7)
#define DEBUG_DFT (1<<8)
#define DEBUG_ASN1 (1<<9)
#define DEBUG_CTRLSOCKET (1<<10)
#define DEBUG_SECURITY (1<<11)
#define DEBUG_NAS (1<<12)
#define DEBUG_RLC (1<<13)
#define DEBUG_DLSCH_DECOD (1<<14)
#define UE_TIMING (1<<20)
#define SET_LOG_DEBUG(B) g_log->debug_mask = (g_log->debug_mask | B)
#define CLEAR_LOG_DEBUG(B) g_log->debug_mask = (g_log->debug_mask & (~B))
#define FOREACH_FLAG(FLAG_DEF) \
FLAG_DEF(PRACH) \
FLAG_DEF(UE_PHYPROC) \
FLAG_DEF(LTEESTIM) \
FLAG_DEF(DLCELLSPEC) \
FLAG_DEF(ULSCH) \
FLAG_DEF(RRC) \
FLAG_DEF(PDCP) \
FLAG_DEF(DFT) \
FLAG_DEF(ASN1) \
FLAG_DEF(CTRLSOCKET) \
FLAG_DEF(SECURITY) \
FLAG_DEF(NAS) \
FLAG_DEF(DLSCH_DECOD) \
FLAG_DEF(UE_TIMING) \
FLAG_DEF(F1AP)
#define SET_LOG_DUMP(B) g_log->dump_mask = (g_log->dump_mask | B)
#define CLEAR_LOG_DUMP(B) g_log->dump_mask = (g_log->dump_mask & (~B))
#define FLAG_BITF(flag) uint64_t DEBUG_##flag: 1;
typedef struct {
FOREACH_FLAG(FLAG_BITF)
} debug_flags_t;
#define FLAG_TEXT(flag) #flag,
static const char *const flag_name[] = {FOREACH_FLAG(FLAG_TEXT) ""};
#define SET_LOG_DEBUG(B) g_log->debug_mask.B = true
#define CLEAR_LOG_DEBUG(B) g_log->debug_mask.B = false
#define SET_LOG_DUMP(B) g_log->dump_mask.B = true
#define CLEAR_LOG_DUMP(B) g_log->dump_mask.B = false
#define FOREACH_COMP(COMP_DEF) \
COMP_DEF(PHY, log) \
@@ -215,8 +224,8 @@ typedef struct {
char level2string[NUM_LOG_LEVEL];
int flag;
char *filelog_name;
uint64_t debug_mask;
uint64_t dump_mask;
debug_flags_t debug_mask;
debug_flags_t dump_mask;
} log_t;
#ifdef LOG_MAIN
@@ -230,7 +239,28 @@ extern "C" {
}
#endif
#endif
#define FLAG_DEBUG_SET(flag) \
if (strcmp(name, #flag) == 0) { \
g_log->debug_mask.DEBUG_##flag = val; \
return true; \
};
static inline bool set_log_debug(char *name, bool val)
{
FOREACH_FLAG(FLAG_DEBUG_SET);
printf("Error: setting log debug of %s option, not existing\n", name);
return false;
}
#define FLAG_DUMP_SET(flag) \
if (strcmp(name, #flag) == 0) { \
g_log->dump_mask.DEBUG_##flag = val; \
return true; \
};
static inline bool set_log_dump(char *name, bool val)
{
FOREACH_FLAG(FLAG_DUMP_SET);
printf("Error: setting log dump of %s option, not existing\n", name);
return false;
}
/*----------------------------------------------------------------------------*/
int logInit (void);
void logTerm (void);
@@ -418,15 +448,15 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
/* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */
#define LOG_DUMPMSG(c, f, b, s, x...) \
do { \
if (g_log->dump_mask & f) \
if (g_log->dump_mask.f) \
log_dump(c, b, s, LOG_DUMP_CHAR, x); \
} while (0)
/* bitmask dependent macros, to isolate debugging code */
#define LOG_DEBUGFLAG(D) (g_log->debug_mask & D)
#define LOG_DEBUGFLAG(D) (g_log->debug_mask.D)
/* bitmask dependent macros, to generate debug file such as matlab file or message dump */
#define LOG_DUMPFLAG(D) (g_log->dump_mask & D)
#define LOG_DUMPFLAG(D) (g_log->dump_mask.D)
#define LOG_M(file, vector, data, len, dec, format) \
do { \
@@ -529,11 +559,11 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
} while (0)
#define nfapi_log(FILE, FNC, LN, COMP, LVL, FMT...)
#define LOG_DEBUGFLAG(D) (g_log->debug_mask & D)
#define LOG_DUMPFLAG(D) (g_log->dump_mask & D)
#define LOG_DEBUGFLAG(D) (g_log->debug_mask.D)
#define LOG_DUMPFLAG(D) (g_log->dump_mask.D)
#define LOG_DUMPMSG(c, f, b, s, x...) \
do { \
if (g_log->dump_mask & f) \
if (g_log->dump_mask.f) \
log_dump(c, b, s, LOG_DUMP_CHAR, x); \
} while (0) /* */
+35 -48
View File
@@ -251,12 +251,17 @@ void print_threads(char *buf, int debug, telnet_printfunc_t prnt)
proccmd_get_threaddata(buf, debug, prnt, NULL);
}
#define FLAG_PRINT_DEBUG_DUMP(flag) \
logsdata->lines[i].val[0] = (char *)flag_name[i]; \
logsdata->lines[i].val[1] = g_log->debug_mask.DEBUG_##flag ? "true" : "false"; \
logsdata->lines[i].val[1] = g_log->dump_mask.DEBUG_##flag ? "true" : "false"; \
i++;
int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfunc_t prnt)
{
webdatadef_t *logsdata = (webdatadef_t *)data;
const mapping *const log_level_names = log_level_names_ptr();
const mapping *const log_options = log_option_names_ptr();
const mapping *log_maskmap = log_maskmap_ptr();
if (strncmp(cmdbuff, "set", 3) == 0) {
telnet_printfunc_t printfunc = (prnt != NULL) ? prnt : (telnet_printfunc_t)printf;
if (strcasestr(cmdbuff, "loglvl") != NULL) {
@@ -291,23 +296,16 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
}
}
if (strcasestr(cmdbuff, "dbgopt") != NULL) {
int optbit = map_str_to_int(log_maskmap, logsdata->lines[0].val[0]);
if (optbit < 0) {
printfunc("debug option %s unknown\n", logsdata->lines[0].val[0]);
} else {
if (strcmp(logsdata->lines[0].val[1], "true") == 0)
SET_LOG_DEBUG(optbit);
else
CLEAR_LOG_DEBUG(optbit);
if (strcmp(logsdata->lines[0].val[2], "true") == 0)
SET_LOG_DUMP(optbit);
else
CLEAR_LOG_DUMP(optbit);
printfunc("%s debug %s dump %s\n",
logsdata->lines[0].val[0],
(strcmp(logsdata->lines[0].val[1], "true") == 0) ? "enabled" : "disabled",
(strcmp(logsdata->lines[0].val[2], "true") == 0) ? "enabled" : "disabled");
}
if (strcmp(logsdata->lines[0].val[1], "true") == 0)
if (!set_log_debug(logsdata->lines[0].val[0], strcmp(logsdata->lines[0].val[2], "true") == 0))
printfunc("debug option %s unknown\n", logsdata->lines[0].val[0]);
if (strcmp(logsdata->lines[0].val[2], "true") == 0)
if (!set_log_dump(logsdata->lines[0].val[0], strcmp(logsdata->lines[0].val[2], "true") == 0))
printfunc("debug option %s unknown\n", logsdata->lines[0].val[0]);
printfunc("%s debug %s dump %s\n",
logsdata->lines[0].val[0],
(strcmp(logsdata->lines[0].val[1], "true") == 0) ? "enabled" : "disabled",
(strcmp(logsdata->lines[0].val[2], "true") == 0) ? "enabled" : "disabled");
}
if (strcasestr(cmdbuff, "threadsched") != NULL) {
unsigned int tid = strtoll(logsdata->lines[0].val[0], NULL, 0);
@@ -354,12 +352,9 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
snprintf(logsdata->columns[2].coltitle, TELNET_CMD_MAXSIZE, "dump");
logsdata->columns[2].coltype = TELNET_CHECKVAL_BOOL;
for (int i = 0; log_maskmap[i].name != NULL; i++) {
logsdata->numlines++;
logsdata->lines[i].val[0] = (char *)log_maskmap[i].name;
logsdata->lines[i].val[1] = (g_log->debug_mask & log_maskmap[i].value) ? "true" : "false";
logsdata->lines[i].val[2] = (g_log->dump_mask & log_maskmap[i].value) ? "true" : "false";
}
int i = 0;
FOREACH_FLAG(FLAG_PRINT_DEBUG_DUMP);
logsdata->numlines += i;
}
if (strcasestr(cmdbuff, "logopt") != NULL) {
@@ -385,6 +380,14 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
return 0;
}
#define FLAG_PRINT2_DEBUG_DUMP(flag) \
prnt("%02i %17.17s %5.5s %5.5s\n", \
i, \
flag_name[i], \
g_log->debug_mask.DEBUG_##flag ? "Y" : "N", \
g_log->dump_mask.DEBUG_##flag ? "Y" : "N"); \
i++;
int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
{
if (buf == NULL) {
@@ -422,12 +425,8 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
}
if (strcasestr(buf,"dbgopt") != NULL) {
prnt("\n module debug dumpfile\n");
const mapping *log_maskmap = log_maskmap_ptr();
for (int i=0; log_maskmap[i].name != NULL ; i++) {
prnt("%02i %17.17s %5.5s %5.5s\n",i ,log_maskmap[i].name,
((g_log->debug_mask & log_maskmap[i].value)?"Y":"N"),
((g_log->dump_mask & log_maskmap[i].value)?"Y":"N") );
}
int i = 0;
FOREACH_FLAG(FLAG_PRINT2_DEBUG_DUMP);
}
if (strcasestr(buf,"config") != NULL) {
prnt("Command line arguments:\n");
@@ -593,28 +592,16 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
}
}
else if (l == 2 && strcmp(logparam,"debug") == 0){
optbit = map_str_to_int(log_maskmap, opt);
if (optbit < 0) {
int ret = set_log_debug(opt, idx1 > 0);
if (!ret)
prnt("module %s unknown\n", opt);
} else {
if (idx1 > 0)
SET_LOG_DEBUG(optbit);
else
CLEAR_LOG_DEBUG(optbit);
proccmd_show("dbgopt", debug, prnt);
}
proccmd_show("dbgopt", debug, prnt);
}
else if (l == 2 && strcmp(logparam,"dump") == 0){
optbit = map_str_to_int(log_maskmap, opt);
if (optbit < 0) {
int ret = set_log_dump(opt, idx1 > 0);
if (!ret)
prnt("module %s unknown\n", opt);
} else {
if (idx1 > 0)
SET_LOG_DUMP(optbit);
else
CLEAR_LOG_DUMP(optbit);
proccmd_show("dump", debug, prnt);
}
proccmd_show("dump", debug, prnt);
}
if (logparam != NULL) free(logparam);
if (opt != NULL) free(opt);