1 /* 2 * wpa_supplicant/hostapd / Debug prints 3 * Copyright (c) 2002-2013, 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_global(args...) do { } while (0) 159 #define wpa_msg_no_global(args...) do { } while (0) 160 #define wpa_msg_register_cb(f) do { } while (0) 161 #define wpa_msg_register_ifname_cb(f) do { } while (0) 162 #else /* CONFIG_NO_WPA_MSG */ 163 /** 164 * wpa_msg - Conditional printf for default target and ctrl_iface monitors 165 * @ctx: Pointer to context data; this is the ctx variable registered 166 * with struct wpa_driver_ops::init() 167 * @level: priority level (MSG_*) of the message 168 * @fmt: printf format string, followed by optional arguments 169 * 170 * This function is used to print conditional debugging and error messages. The 171 * output may be directed to stdout, stderr, and/or syslog based on 172 * configuration. This function is like wpa_printf(), but it also sends the 173 * same message to all attached ctrl_iface monitors. 174 * 175 * Note: New line '\n' is added to the end of the text when printing to stdout. 176 */ 177 void wpa_msg(void *ctx, int level, const char *fmt, ...) PRINTF_FORMAT(3, 4); 178 179 /** 180 * wpa_msg_ctrl - Conditional printf for ctrl_iface monitors 181 * @ctx: Pointer to context data; this is the ctx variable registered 182 * with struct wpa_driver_ops::init() 183 * @level: priority level (MSG_*) of the message 184 * @fmt: printf format string, followed by optional arguments 185 * 186 * This function is used to print conditional debugging and error messages. 187 * This function is like wpa_msg(), but it sends the output only to the 188 * attached ctrl_iface monitors. In other words, it can be used for frequent 189 * events that do not need to be sent to syslog. 190 */ 191 void wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...) 192 PRINTF_FORMAT(3, 4); 193 194 /** 195 * wpa_msg_global - Global printf for ctrl_iface monitors 196 * @ctx: Pointer to context data; this is the ctx variable registered 197 * with struct wpa_driver_ops::init() 198 * @level: priority level (MSG_*) of the message 199 * @fmt: printf format string, followed by optional arguments 200 * 201 * This function is used to print conditional debugging and error messages. 202 * This function is like wpa_msg(), but it sends the output as a global event, 203 * i.e., without being specific to an interface. For backwards compatibility, 204 * an old style event is also delivered on one of the interfaces (the one 205 * specified by the context data). 206 */ 207 void wpa_msg_global(void *ctx, int level, const char *fmt, ...) 208 PRINTF_FORMAT(3, 4); 209 210 /** 211 * wpa_msg_no_global - Conditional printf for ctrl_iface monitors 212 * @ctx: Pointer to context data; this is the ctx variable registered 213 * with struct wpa_driver_ops::init() 214 * @level: priority level (MSG_*) of the message 215 * @fmt: printf format string, followed by optional arguments 216 * 217 * This function is used to print conditional debugging and error messages. 218 * This function is like wpa_msg(), but it does not send the output as a global 219 * event. 220 */ 221 void wpa_msg_no_global(void *ctx, int level, const char *fmt, ...) 222 PRINTF_FORMAT(3, 4); 223 224 typedef void (*wpa_msg_cb_func)(void *ctx, int level, int global, 225 const char *txt, size_t len); 226 227 /** 228 * wpa_msg_register_cb - Register callback function for wpa_msg() messages 229 * @func: Callback function (%NULL to unregister) 230 */ 231 void wpa_msg_register_cb(wpa_msg_cb_func func); 232 233 typedef const char * (*wpa_msg_get_ifname_func)(void *ctx); 234 void wpa_msg_register_ifname_cb(wpa_msg_get_ifname_func func); 235 236 #endif /* CONFIG_NO_WPA_MSG */ 237 238 #ifdef CONFIG_NO_HOSTAPD_LOGGER 239 #define hostapd_logger(args...) do { } while (0) 240 #define hostapd_logger_register_cb(f) do { } while (0) 241 #else /* CONFIG_NO_HOSTAPD_LOGGER */ 242 void hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level, 243 const char *fmt, ...) PRINTF_FORMAT(5, 6); 244 245 typedef void (*hostapd_logger_cb_func)(void *ctx, const u8 *addr, 246 unsigned int module, int level, 247 const char *txt, size_t len); 248 249 /** 250 * hostapd_logger_register_cb - Register callback function for hostapd_logger() 251 * @func: Callback function (%NULL to unregister) 252 */ 253 void hostapd_logger_register_cb(hostapd_logger_cb_func func); 254 #endif /* CONFIG_NO_HOSTAPD_LOGGER */ 255 256 #define HOSTAPD_MODULE_IEEE80211 0x00000001 257 #define HOSTAPD_MODULE_IEEE8021X 0x00000002 258 #define HOSTAPD_MODULE_RADIUS 0x00000004 259 #define HOSTAPD_MODULE_WPA 0x00000008 260 #define HOSTAPD_MODULE_DRIVER 0x00000010 261 #define HOSTAPD_MODULE_IAPP 0x00000020 262 #define HOSTAPD_MODULE_MLME 0x00000040 263 264 enum hostapd_logger_level { 265 HOSTAPD_LEVEL_DEBUG_VERBOSE = 0, 266 HOSTAPD_LEVEL_DEBUG = 1, 267 HOSTAPD_LEVEL_INFO = 2, 268 HOSTAPD_LEVEL_NOTICE = 3, 269 HOSTAPD_LEVEL_WARNING = 4 270 }; 271 272 273 #ifdef CONFIG_DEBUG_SYSLOG 274 275 void wpa_debug_open_syslog(void); 276 void wpa_debug_close_syslog(void); 277 278 #else /* CONFIG_DEBUG_SYSLOG */ 279 280 static inline void wpa_debug_open_syslog(void) 281 { 282 } 283 284 static inline void wpa_debug_close_syslog(void) 285 { 286 } 287 288 #endif /* CONFIG_DEBUG_SYSLOG */ 289 290 #ifdef CONFIG_DEBUG_LINUX_TRACING 291 292 int wpa_debug_open_linux_tracing(void); 293 void wpa_debug_close_linux_tracing(void); 294 295 #else /* CONFIG_DEBUG_LINUX_TRACING */ 296 297 static inline int wpa_debug_open_linux_tracing(void) 298 { 299 return 0; 300 } 301 302 static inline void wpa_debug_close_linux_tracing(void) 303 { 304 } 305 306 #endif /* CONFIG_DEBUG_LINUX_TRACING */ 307 308 309 #ifdef EAPOL_TEST 310 #define WPA_ASSERT(a) \ 311 do { \ 312 if (!(a)) { \ 313 printf("WPA_ASSERT FAILED '" #a "' " \ 314 "%s %s:%d\n", \ 315 __FUNCTION__, __FILE__, __LINE__); \ 316 exit(1); \ 317 } \ 318 } while (0) 319 #else 320 #define WPA_ASSERT(a) do { } while (0) 321 #endif 322 323 #endif /* WPA_DEBUG_H */ 324