Home | History | Annotate | Download | only in utils
      1 /*
      2  * wpa_supplicant/hostapd / Debug prints
      3  * Copyright (c) 2002-2007, Jouni Malinen <j (at) w1.fi>
      4  *
      5  * This software may be distributed under the terms of the BSD license.
      6  * See README for more details.
      7  */
      8 
      9 #ifndef WPA_DEBUG_H
     10 #define WPA_DEBUG_H
     11 
     12 #include "wpabuf.h"
     13 
     14 /* Debugging function - conditional printf and hex dump. Driver wrappers can
     15  * use these for debugging purposes. */
     16 
     17 enum {
     18 	MSG_EXCESSIVE, MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR
     19 };
     20 
     21 #ifdef CONFIG_NO_STDOUT_DEBUG
     22 
     23 #define wpa_debug_print_timestamp() do { } while (0)
     24 #define wpa_printf(args...) do { } while (0)
     25 #define wpa_hexdump(l,t,b,le) do { } while (0)
     26 #define wpa_hexdump_buf(l,t,b) do { } while (0)
     27 #define wpa_hexdump_key(l,t,b,le) do { } while (0)
     28 #define wpa_hexdump_buf_key(l,t,b) do { } while (0)
     29 #define wpa_hexdump_ascii(l,t,b,le) do { } while (0)
     30 #define wpa_hexdump_ascii_key(l,t,b,le) do { } while (0)
     31 #define wpa_debug_open_file(p) do { } while (0)
     32 #define wpa_debug_close_file() do { } while (0)
     33 #define wpa_dbg(args...) do { } while (0)
     34 
     35 static inline int wpa_debug_reopen_file(void)
     36 {
     37 	return 0;
     38 }
     39 
     40 #else /* CONFIG_NO_STDOUT_DEBUG */
     41 
     42 int wpa_debug_open_file(const char *path);
     43 int wpa_debug_reopen_file(void);
     44 void wpa_debug_close_file(void);
     45 
     46 /**
     47  * wpa_debug_printf_timestamp - Print timestamp for debug output
     48  *
     49  * This function prints a timestamp in seconds_from_1970.microsoconds
     50  * format if debug output has been configured to include timestamps in debug
     51  * messages.
     52  */
     53 void wpa_debug_print_timestamp(void);
     54 
     55 /**
     56  * wpa_printf - conditional printf
     57  * @level: priority level (MSG_*) of the message
     58  * @fmt: printf format string, followed by optional arguments
     59  *
     60  * This function is used to print conditional debugging and error messages. The
     61  * output may be directed to stdout, stderr, and/or syslog based on
     62  * configuration.
     63  *
     64  * Note: New line '\n' is added to the end of the text when printing to stdout.
     65  */
     66 void wpa_printf(int level, const char *fmt, ...)
     67 PRINTF_FORMAT(2, 3);
     68 
     69 /**
     70  * wpa_hexdump - conditional hex dump
     71  * @level: priority level (MSG_*) of the message
     72  * @title: title of for the message
     73  * @buf: data buffer to be dumped
     74  * @len: length of the buf
     75  *
     76  * This function is used to print conditional debugging and error messages. The
     77  * output may be directed to stdout, stderr, and/or syslog based on
     78  * configuration. The contents of buf is printed out has hex dump.
     79  */
     80 void wpa_hexdump(int level, const char *title, const u8 *buf, size_t len);
     81 
     82 static inline void wpa_hexdump_buf(int level, const char *title,
     83 				   const struct wpabuf *buf)
     84 {
     85 	wpa_hexdump(level, title, buf ? wpabuf_head(buf) : NULL,
     86 		    buf ? wpabuf_len(buf) : 0);
     87 }
     88 
     89 /**
     90  * wpa_hexdump_key - conditional hex dump, hide keys
     91  * @level: priority level (MSG_*) of the message
     92  * @title: title of for the message
     93  * @buf: data buffer to be dumped
     94  * @len: length of the buf
     95  *
     96  * This function is used to print conditional debugging and error messages. The
     97  * output may be directed to stdout, stderr, and/or syslog based on
     98  * configuration. The contents of buf is printed out has hex dump. This works
     99  * like wpa_hexdump(), but by default, does not include secret keys (passwords,
    100  * etc.) in debug output.
    101  */
    102 void wpa_hexdump_key(int level, const char *title, const u8 *buf, size_t len);
    103 
    104 static inline void wpa_hexdump_buf_key(int level, const char *title,
    105 				       const struct wpabuf *buf)
    106 {
    107 	wpa_hexdump_key(level, title, buf ? wpabuf_head(buf) : NULL,
    108 			buf ? wpabuf_len(buf) : 0);
    109 }
    110 
    111 /**
    112  * wpa_hexdump_ascii - conditional hex dump
    113  * @level: priority level (MSG_*) of the message
    114  * @title: title of for the message
    115  * @buf: data buffer to be dumped
    116  * @len: length of the buf
    117  *
    118  * This function is used to print conditional debugging and error messages. The
    119  * output may be directed to stdout, stderr, and/or syslog based on
    120  * configuration. The contents of buf is printed out has hex dump with both
    121  * the hex numbers and ASCII characters (for printable range) are shown. 16
    122  * bytes per line will be shown.
    123  */
    124 void wpa_hexdump_ascii(int level, const char *title, const u8 *buf,
    125 		       size_t len);
    126 
    127 /**
    128  * wpa_hexdump_ascii_key - conditional hex dump, hide keys
    129  * @level: priority level (MSG_*) of the message
    130  * @title: title of for the message
    131  * @buf: data buffer to be dumped
    132  * @len: length of the buf
    133  *
    134  * This function is used to print conditional debugging and error messages. The
    135  * output may be directed to stdout, stderr, and/or syslog based on
    136  * configuration. The contents of buf is printed out has hex dump with both
    137  * the hex numbers and ASCII characters (for printable range) are shown. 16
    138  * bytes per line will be shown. This works like wpa_hexdump_ascii(), but by
    139  * default, does not include secret keys (passwords, etc.) in debug output.
    140  */
    141 void wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf,
    142 			   size_t len);
    143 
    144 /*
    145  * wpa_dbg() behaves like wpa_msg(), but it can be removed from build to reduce
    146  * binary size. As such, it should be used with debugging messages that are not
    147  * needed in the control interface while wpa_msg() has to be used for anything
    148  * that needs to shown to control interface monitors.
    149  */
    150 #define wpa_dbg(args...) wpa_msg(args)
    151 
    152 #endif /* CONFIG_NO_STDOUT_DEBUG */
    153 
    154 
    155 #ifdef CONFIG_NO_WPA_MSG
    156 #define wpa_msg(args...) do { } while (0)
    157 #define wpa_msg_ctrl(args...) do { } while (0)
    158 #define wpa_msg_register_cb(f) do { } while (0)
    159 #define wpa_msg_register_ifname_cb(f) do { } while (0)
    160 #else /* CONFIG_NO_WPA_MSG */
    161 /**
    162  * wpa_msg - Conditional printf for default target and ctrl_iface monitors
    163  * @ctx: Pointer to context data; this is the ctx variable registered
    164  *	with struct wpa_driver_ops::init()
    165  * @level: priority level (MSG_*) of the message
    166  * @fmt: printf format string, followed by optional arguments
    167  *
    168  * This function is used to print conditional debugging and error messages. The
    169  * output may be directed to stdout, stderr, and/or syslog based on
    170  * configuration. This function is like wpa_printf(), but it also sends the
    171  * same message to all attached ctrl_iface monitors.
    172  *
    173  * Note: New line '\n' is added to the end of the text when printing to stdout.
    174  */
    175 void wpa_msg(void *ctx, int level, const char *fmt, ...) PRINTF_FORMAT(3, 4);
    176 
    177 /**
    178  * wpa_msg_ctrl - Conditional printf for ctrl_iface monitors
    179  * @ctx: Pointer to context data; this is the ctx variable registered
    180  *	with struct wpa_driver_ops::init()
    181  * @level: priority level (MSG_*) of the message
    182  * @fmt: printf format string, followed by optional arguments
    183  *
    184  * This function is used to print conditional debugging and error messages.
    185  * This function is like wpa_msg(), but it sends the output only to the
    186  * attached ctrl_iface monitors. In other words, it can be used for frequent
    187  * events that do not need to be sent to syslog.
    188  */
    189 void wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...)
    190 PRINTF_FORMAT(3, 4);
    191 
    192 typedef void (*wpa_msg_cb_func)(void *ctx, int level, const char *txt,
    193 				size_t len);
    194 
    195 /**
    196  * wpa_msg_register_cb - Register callback function for wpa_msg() messages
    197  * @func: Callback function (%NULL to unregister)
    198  */
    199 void wpa_msg_register_cb(wpa_msg_cb_func func);
    200 
    201 typedef const char * (*wpa_msg_get_ifname_func)(void *ctx);
    202 void wpa_msg_register_ifname_cb(wpa_msg_get_ifname_func func);
    203 
    204 #endif /* CONFIG_NO_WPA_MSG */
    205 
    206 #ifdef CONFIG_NO_HOSTAPD_LOGGER
    207 #define hostapd_logger(args...) do { } while (0)
    208 #define hostapd_logger_register_cb(f) do { } while (0)
    209 #else /* CONFIG_NO_HOSTAPD_LOGGER */
    210 void hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level,
    211 		    const char *fmt, ...) PRINTF_FORMAT(5, 6);
    212 
    213 typedef void (*hostapd_logger_cb_func)(void *ctx, const u8 *addr,
    214 				       unsigned int module, int level,
    215 				       const char *txt, size_t len);
    216 
    217 /**
    218  * hostapd_logger_register_cb - Register callback function for hostapd_logger()
    219  * @func: Callback function (%NULL to unregister)
    220  */
    221 void hostapd_logger_register_cb(hostapd_logger_cb_func func);
    222 #endif /* CONFIG_NO_HOSTAPD_LOGGER */
    223 
    224 #define HOSTAPD_MODULE_IEEE80211	0x00000001
    225 #define HOSTAPD_MODULE_IEEE8021X	0x00000002
    226 #define HOSTAPD_MODULE_RADIUS		0x00000004
    227 #define HOSTAPD_MODULE_WPA		0x00000008
    228 #define HOSTAPD_MODULE_DRIVER		0x00000010
    229 #define HOSTAPD_MODULE_IAPP		0x00000020
    230 #define HOSTAPD_MODULE_MLME		0x00000040
    231 
    232 enum hostapd_logger_level {
    233 	HOSTAPD_LEVEL_DEBUG_VERBOSE = 0,
    234 	HOSTAPD_LEVEL_DEBUG = 1,
    235 	HOSTAPD_LEVEL_INFO = 2,
    236 	HOSTAPD_LEVEL_NOTICE = 3,
    237 	HOSTAPD_LEVEL_WARNING = 4
    238 };
    239 
    240 
    241 #ifdef CONFIG_DEBUG_SYSLOG
    242 
    243 void wpa_debug_open_syslog(void);
    244 void wpa_debug_close_syslog(void);
    245 
    246 #else /* CONFIG_DEBUG_SYSLOG */
    247 
    248 static inline void wpa_debug_open_syslog(void)
    249 {
    250 }
    251 
    252 static inline void wpa_debug_close_syslog(void)
    253 {
    254 }
    255 
    256 #endif /* CONFIG_DEBUG_SYSLOG */
    257 
    258 #ifdef CONFIG_DEBUG_LINUX_TRACING
    259 
    260 int wpa_debug_open_linux_tracing(void);
    261 void wpa_debug_close_linux_tracing(void);
    262 
    263 #else /* CONFIG_DEBUG_LINUX_TRACING */
    264 
    265 static inline int wpa_debug_open_linux_tracing(void)
    266 {
    267 	return 0;
    268 }
    269 
    270 static inline void wpa_debug_close_linux_tracing(void)
    271 {
    272 }
    273 
    274 #endif /* CONFIG_DEBUG_LINUX_TRACING */
    275 
    276 
    277 #ifdef EAPOL_TEST
    278 #define WPA_ASSERT(a)						       \
    279 	do {							       \
    280 		if (!(a)) {					       \
    281 			printf("WPA_ASSERT FAILED '" #a "' "	       \
    282 			       "%s %s:%d\n",			       \
    283 			       __FUNCTION__, __FILE__, __LINE__);      \
    284 			exit(1);				       \
    285 		}						       \
    286 	} while (0)
    287 #else
    288 #define WPA_ASSERT(a) do { } while (0)
    289 #endif
    290 
    291 #endif /* WPA_DEBUG_H */
    292