blob: 4b67c61b89b80c5b6828f2b37f59337f12503837 [file] [log] [blame]
Harald Welte52b1f982008-12-23 20:25:15 +00001#ifndef _DEBUG_H
2#define _DEBUG_H
3
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01004#include <stdio.h>
Harald Weltedfe6c7d2010-02-20 16:24:02 +01005#include <osmocore/linuxlist.h>
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01006
Harald Welte3633a6d2008-12-26 00:06:02 +00007#define DEBUG
8
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01009/* Debug Areas of the code */
10enum {
11 DRLL,
12 DCC,
13 DMM,
14 DRR,
15 DRSL,
16 DNM,
17 DMNCC,
18 DSMS,
19 DPAG,
20 DMEAS,
21 DMI,
22 DMIB,
23 DMUX,
24 DINP,
25 DSCCP,
26 DMSC,
27 DMGCP,
28 DHO,
Harald Welteae1f1592009-12-24 11:39:14 +010029 DDB,
Harald Welted0c19142009-12-24 11:46:44 +010030 DREF,
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +010031 Debug_LastEntry,
32};
Harald Welte8d77b952009-12-17 00:31:10 +010033
Harald Welte52b1f982008-12-23 20:25:15 +000034#ifdef DEBUG
Harald Welte6ddd1682009-02-06 12:38:29 +000035#define DEBUGP(ss, fmt, args...) debugp(ss, __FILE__, __LINE__, 0, fmt, ## args)
36#define DEBUGPC(ss, fmt, args...) debugp(ss, __FILE__, __LINE__, 1, fmt, ## args)
Harald Welte52b1f982008-12-23 20:25:15 +000037#else
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +010038#define DEBUGP(xss, fmt, args...)
Harald Welte6ddd1682009-02-06 12:38:29 +000039#define DEBUGPC(ss, fmt, args...)
Harald Welte52b1f982008-12-23 20:25:15 +000040#endif
41
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +010042
Holger Freyther1ad732c2008-12-28 16:32:41 +000043#define static_assert(exp, name) typedef int dummy##name [(exp) ? 1 : -1];
44
Holger Hans Peter Freythere78074e2009-08-20 13:16:26 +020045char *hexdump(const unsigned char *buf, int len);
Holger Hans Peter Freyther02c28a02009-10-20 08:56:06 +020046void debugp(unsigned int subsys, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 5, 6)));
Harald Weltead384642008-12-26 10:20:07 +000047
Harald Welteb1d4c8e2009-12-17 23:10:46 +010048/* new logging interface */
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +010049#define LOGP(ss, level, fmt, args...) debugp2(ss, level, __FILE__, __LINE__, 0, fmt, ##args)
50#define LOGPC(ss, level, fmt, args...) debugp2(ss, level, __FILE__, __LINE__, 1, fmt, ##args)
Harald Welteb1d4c8e2009-12-17 23:10:46 +010051
52/* different levels */
53#define LOGL_DEBUG 1 /* debugging information */
54#define LOGL_INFO 3
55#define LOGL_NOTICE 5 /* abnormal/unexpected condition */
56#define LOGL_ERROR 7 /* error condition, requires user action */
57#define LOGL_FATAL 8 /* fatal, program aborted */
58
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +010059/* context */
60#define BSC_CTX_LCHAN 0
61#define BSC_CTX_SUBSCR 1
62#define BSC_CTX_BTS 2
63#define BSC_CTX_SCCP 3
64
65/* target */
66
67enum {
68 DEBUG_FILTER_IMSI = 1 << 0,
69 DEBUG_FILTER_ALL = 1 << 1,
70};
71
72struct debug_category {
73 int enabled;
74 int loglevel;
75};
76
77struct debug_target {
78 int filter_map;
79 char *imsi_filter;
80
81
82 struct debug_category categories[Debug_LastEntry];
83 int use_color;
84 int print_timestamp;
85 int loglevel;
86
87 union {
88 struct {
89 FILE *out;
90 } tgt_stdout;
91
92 struct {
93 int priority;
94 } tgt_syslog;
95
96 struct {
97 void *vty;
98 } tgt_vty;
99 };
100
101 void (*output) (struct debug_target *target, const char *string);
102
103 struct llist_head entry;
104};
105
106/* use the above macros */
107void debugp2(unsigned int subsys, unsigned int level, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 6, 7)));
108void debug_init(void);
109
110/* context management */
111void debug_reset_context(void);
112void debug_set_context(int ctx, void *value);
113
114/* filter on the targets */
115void debug_set_imsi_filter(struct debug_target *target, const char *imsi);
116void debug_set_all_filter(struct debug_target *target, int);
117void debug_set_use_color(struct debug_target *target, int);
118void debug_set_print_timestamp(struct debug_target *target, int);
119void debug_set_log_level(struct debug_target *target, int log_level);
120void debug_parse_category_mask(struct debug_target *target, const char* mask);
Harald Welte (local)66169152009-12-27 21:02:20 +0100121int debug_parse_level(const char *lvl);
122int debug_parse_category(const char *category);
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +0100123void debug_set_category_filter(struct debug_target *target, int category, int enable, int level);
124
125
126/* management of the targets */
127struct debug_target *debug_target_create(void);
128struct debug_target *debug_target_create_stderr(void);
129void debug_add_target(struct debug_target *target);
130void debug_del_target(struct debug_target *target);
Harald Welte52b1f982008-12-23 20:25:15 +0000131#endif /* _DEBUG_H */