/src/hostap/src/utils/wpa_debug.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * wpa_supplicant/hostapd / Debug prints |
3 | | * Copyright (c) 2002-2013, Jouni Malinen <j@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 | | extern int wpa_debug_level; |
15 | | extern int wpa_debug_show_keys; |
16 | | extern int wpa_debug_timestamp; |
17 | | extern int wpa_debug_syslog; |
18 | | |
19 | | /* Debugging function - conditional printf and hex dump. Driver wrappers can |
20 | | * use these for debugging purposes. */ |
21 | | |
22 | | enum { |
23 | | MSG_EXCESSIVE, MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR |
24 | | }; |
25 | | |
26 | | #ifdef CONFIG_NO_STDOUT_DEBUG |
27 | | |
28 | | #define wpa_debug_print_timestamp() do { } while (0) |
29 | | #define wpa_printf(args...) do { } while (0) |
30 | | #define wpa_hexdump(l,t,b,le) do { } while (0) |
31 | | #define wpa_hexdump_buf(l,t,b) do { } while (0) |
32 | | #define wpa_hexdump_key(l,t,b,le) do { } while (0) |
33 | | #define wpa_hexdump_buf_key(l,t,b) do { } while (0) |
34 | | #define wpa_hexdump_ascii(l,t,b,le) do { } while (0) |
35 | | #define wpa_hexdump_ascii_key(l,t,b,le) do { } while (0) |
36 | | #define wpa_debug_open_file(p) do { } while (0) |
37 | | #define wpa_debug_close_file() do { } while (0) |
38 | | #define wpa_debug_setup_stdout() do { } while (0) |
39 | | #define wpa_debug_stop_log() do { } while (0) |
40 | | #define wpa_dbg(args...) do { } while (0) |
41 | | |
42 | | static inline int wpa_debug_reopen_file(void) |
43 | | { |
44 | | return 0; |
45 | | } |
46 | | |
47 | | #else /* CONFIG_NO_STDOUT_DEBUG */ |
48 | | |
49 | | int wpa_debug_open_file(const char *path); |
50 | | int wpa_debug_reopen_file(void); |
51 | | void wpa_debug_close_file(void); |
52 | | void wpa_debug_setup_stdout(void); |
53 | | void wpa_debug_stop_log(void); |
54 | | |
55 | | /** |
56 | | * wpa_debug_printf_timestamp - Print timestamp for debug output |
57 | | * |
58 | | * This function prints a timestamp in seconds_from_1970.microsoconds |
59 | | * format if debug output has been configured to include timestamps in debug |
60 | | * messages. |
61 | | */ |
62 | | void wpa_debug_print_timestamp(void); |
63 | | |
64 | | /** |
65 | | * wpa_printf - conditional printf |
66 | | * @level: priority level (MSG_*) of the message |
67 | | * @fmt: printf format string, followed by optional arguments |
68 | | * |
69 | | * This function is used to print conditional debugging and error messages. The |
70 | | * output may be directed to stdout, stderr, and/or syslog based on |
71 | | * configuration. |
72 | | * |
73 | | * Note: New line '\n' is added to the end of the text when printing to stdout. |
74 | | */ |
75 | | void wpa_printf(int level, const char *fmt, ...) |
76 | | PRINTF_FORMAT(2, 3); |
77 | | |
78 | | /** |
79 | | * wpa_hexdump - conditional hex dump |
80 | | * @level: priority level (MSG_*) of the message |
81 | | * @title: title of for the message |
82 | | * @buf: data buffer to be dumped |
83 | | * @len: length of the buf |
84 | | * |
85 | | * This function is used to print conditional debugging and error messages. The |
86 | | * output may be directed to stdout, stderr, and/or syslog based on |
87 | | * configuration. The contents of buf is printed out has hex dump. |
88 | | */ |
89 | | void wpa_hexdump(int level, const char *title, const void *buf, size_t len); |
90 | | |
91 | | static inline void wpa_hexdump_buf(int level, const char *title, |
92 | | const struct wpabuf *buf) |
93 | 33 | { |
94 | 33 | wpa_hexdump(level, title, buf ? wpabuf_head(buf) : NULL, |
95 | 33 | buf ? wpabuf_len(buf) : 0); |
96 | 33 | } Unexecuted instantiation: fuzzer-common.c:wpa_hexdump_buf Unexecuted instantiation: crypto_openssl.c:wpa_hexdump_buf Unexecuted instantiation: dh_groups.c:wpa_hexdump_buf Unexecuted instantiation: sha1-prf.c:wpa_hexdump_buf Unexecuted instantiation: sha256-prf.c:wpa_hexdump_buf Unexecuted instantiation: sha256-kdf.c:wpa_hexdump_buf Unexecuted instantiation: dragonfly.c:wpa_hexdump_buf Line | Count | Source | 93 | 33 | { | 94 | 33 | wpa_hexdump(level, title, buf ? wpabuf_head(buf) : NULL, | 95 | 33 | buf ? wpabuf_len(buf) : 0); | 96 | 33 | } |
Unexecuted instantiation: wpa_common.c:wpa_hexdump_buf Unexecuted instantiation: ieee802_11_common.c:wpa_hexdump_buf Unexecuted instantiation: common.c:wpa_hexdump_buf Unexecuted instantiation: wpa_debug.c:wpa_hexdump_buf Unexecuted instantiation: wpabuf.c:wpa_hexdump_buf Unexecuted instantiation: os_unix.c:wpa_hexdump_buf |
97 | | |
98 | | /** |
99 | | * wpa_hexdump_key - conditional hex dump, hide keys |
100 | | * @level: priority level (MSG_*) of the message |
101 | | * @title: title of for the message |
102 | | * @buf: data buffer to be dumped |
103 | | * @len: length of the buf |
104 | | * |
105 | | * This function is used to print conditional debugging and error messages. The |
106 | | * output may be directed to stdout, stderr, and/or syslog based on |
107 | | * configuration. The contents of buf is printed out has hex dump. This works |
108 | | * like wpa_hexdump(), but by default, does not include secret keys (passwords, |
109 | | * etc.) in debug output. |
110 | | */ |
111 | | void wpa_hexdump_key(int level, const char *title, const void *buf, size_t len); |
112 | | |
113 | | static inline void wpa_hexdump_buf_key(int level, const char *title, |
114 | | const struct wpabuf *buf) |
115 | 0 | { |
116 | 0 | wpa_hexdump_key(level, title, buf ? wpabuf_head(buf) : NULL, |
117 | 0 | buf ? wpabuf_len(buf) : 0); |
118 | 0 | } Unexecuted instantiation: fuzzer-common.c:wpa_hexdump_buf_key Unexecuted instantiation: crypto_openssl.c:wpa_hexdump_buf_key Unexecuted instantiation: dh_groups.c:wpa_hexdump_buf_key Unexecuted instantiation: sha1-prf.c:wpa_hexdump_buf_key Unexecuted instantiation: sha256-prf.c:wpa_hexdump_buf_key Unexecuted instantiation: sha256-kdf.c:wpa_hexdump_buf_key Unexecuted instantiation: dragonfly.c:wpa_hexdump_buf_key Unexecuted instantiation: sae.c:wpa_hexdump_buf_key Unexecuted instantiation: wpa_common.c:wpa_hexdump_buf_key Unexecuted instantiation: ieee802_11_common.c:wpa_hexdump_buf_key Unexecuted instantiation: common.c:wpa_hexdump_buf_key Unexecuted instantiation: wpa_debug.c:wpa_hexdump_buf_key Unexecuted instantiation: wpabuf.c:wpa_hexdump_buf_key Unexecuted instantiation: os_unix.c:wpa_hexdump_buf_key |
119 | | |
120 | | /** |
121 | | * wpa_hexdump_ascii - conditional hex dump |
122 | | * @level: priority level (MSG_*) of the message |
123 | | * @title: title of for the message |
124 | | * @buf: data buffer to be dumped |
125 | | * @len: length of the buf |
126 | | * |
127 | | * This function is used to print conditional debugging and error messages. The |
128 | | * output may be directed to stdout, stderr, and/or syslog based on |
129 | | * configuration. The contents of buf is printed out has hex dump with both |
130 | | * the hex numbers and ASCII characters (for printable range) are shown. 16 |
131 | | * bytes per line will be shown. |
132 | | */ |
133 | | void wpa_hexdump_ascii(int level, const char *title, const void *buf, |
134 | | size_t len); |
135 | | |
136 | | /** |
137 | | * wpa_hexdump_ascii_key - conditional hex dump, hide keys |
138 | | * @level: priority level (MSG_*) of the message |
139 | | * @title: title of for the message |
140 | | * @buf: data buffer to be dumped |
141 | | * @len: length of the buf |
142 | | * |
143 | | * This function is used to print conditional debugging and error messages. The |
144 | | * output may be directed to stdout, stderr, and/or syslog based on |
145 | | * configuration. The contents of buf is printed out has hex dump with both |
146 | | * the hex numbers and ASCII characters (for printable range) are shown. 16 |
147 | | * bytes per line will be shown. This works like wpa_hexdump_ascii(), but by |
148 | | * default, does not include secret keys (passwords, etc.) in debug output. |
149 | | */ |
150 | | void wpa_hexdump_ascii_key(int level, const char *title, const void *buf, |
151 | | size_t len); |
152 | | |
153 | | /* |
154 | | * wpa_dbg() behaves like wpa_msg(), but it can be removed from build to reduce |
155 | | * binary size. As such, it should be used with debugging messages that are not |
156 | | * needed in the control interface while wpa_msg() has to be used for anything |
157 | | * that needs to shown to control interface monitors. |
158 | | */ |
159 | | #define wpa_dbg(args...) wpa_msg(args) |
160 | | |
161 | | #endif /* CONFIG_NO_STDOUT_DEBUG */ |
162 | | |
163 | | |
164 | | #ifdef CONFIG_NO_WPA_MSG |
165 | | #define wpa_msg(args...) do { } while (0) |
166 | | #define wpa_msg_ctrl(args...) do { } while (0) |
167 | | #define wpa_msg_global(args...) do { } while (0) |
168 | | #define wpa_msg_global_ctrl(args...) do { } while (0) |
169 | | #define wpa_msg_no_global(args...) do { } while (0) |
170 | | #define wpa_msg_global_only(args...) do { } while (0) |
171 | | #define wpa_msg_register_cb(f) do { } while (0) |
172 | | #define wpa_msg_register_ifname_cb(f) do { } while (0) |
173 | | #else /* CONFIG_NO_WPA_MSG */ |
174 | | /** |
175 | | * wpa_msg - Conditional printf for default target and ctrl_iface monitors |
176 | | * @ctx: Pointer to context data; this is the ctx variable registered |
177 | | * with struct wpa_driver_ops::init() |
178 | | * @level: priority level (MSG_*) of the message |
179 | | * @fmt: printf format string, followed by optional arguments |
180 | | * |
181 | | * This function is used to print conditional debugging and error messages. The |
182 | | * output may be directed to stdout, stderr, and/or syslog based on |
183 | | * configuration. This function is like wpa_printf(), but it also sends the |
184 | | * same message to all attached ctrl_iface monitors. |
185 | | * |
186 | | * Note: New line '\n' is added to the end of the text when printing to stdout. |
187 | | */ |
188 | | void wpa_msg(void *ctx, int level, const char *fmt, ...) PRINTF_FORMAT(3, 4); |
189 | | |
190 | | /** |
191 | | * wpa_msg_ctrl - Conditional printf for ctrl_iface monitors |
192 | | * @ctx: Pointer to context data; this is the ctx variable registered |
193 | | * with struct wpa_driver_ops::init() |
194 | | * @level: priority level (MSG_*) of the message |
195 | | * @fmt: printf format string, followed by optional arguments |
196 | | * |
197 | | * This function is used to print conditional debugging and error messages. |
198 | | * This function is like wpa_msg(), but it sends the output only to the |
199 | | * attached ctrl_iface monitors. In other words, it can be used for frequent |
200 | | * events that do not need to be sent to syslog. |
201 | | */ |
202 | | void wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...) |
203 | | PRINTF_FORMAT(3, 4); |
204 | | |
205 | | /** |
206 | | * wpa_msg_global - Global printf for ctrl_iface monitors |
207 | | * @ctx: Pointer to context data; this is the ctx variable registered |
208 | | * with struct wpa_driver_ops::init() |
209 | | * @level: priority level (MSG_*) of the message |
210 | | * @fmt: printf format string, followed by optional arguments |
211 | | * |
212 | | * This function is used to print conditional debugging and error messages. |
213 | | * This function is like wpa_msg(), but it sends the output as a global event, |
214 | | * i.e., without being specific to an interface. For backwards compatibility, |
215 | | * an old style event is also delivered on one of the interfaces (the one |
216 | | * specified by the context data). |
217 | | */ |
218 | | void wpa_msg_global(void *ctx, int level, const char *fmt, ...) |
219 | | PRINTF_FORMAT(3, 4); |
220 | | |
221 | | /** |
222 | | * wpa_msg_global_ctrl - Conditional global printf for ctrl_iface monitors |
223 | | * @ctx: Pointer to context data; this is the ctx variable registered |
224 | | * with struct wpa_driver_ops::init() |
225 | | * @level: priority level (MSG_*) of the message |
226 | | * @fmt: printf format string, followed by optional arguments |
227 | | * |
228 | | * This function is used to print conditional debugging and error messages. |
229 | | * This function is like wpa_msg_global(), but it sends the output only to the |
230 | | * attached global ctrl_iface monitors. In other words, it can be used for |
231 | | * frequent events that do not need to be sent to syslog. |
232 | | */ |
233 | | void wpa_msg_global_ctrl(void *ctx, int level, const char *fmt, ...) |
234 | | PRINTF_FORMAT(3, 4); |
235 | | |
236 | | /** |
237 | | * wpa_msg_no_global - Conditional printf for ctrl_iface monitors |
238 | | * @ctx: Pointer to context data; this is the ctx variable registered |
239 | | * with struct wpa_driver_ops::init() |
240 | | * @level: priority level (MSG_*) of the message |
241 | | * @fmt: printf format string, followed by optional arguments |
242 | | * |
243 | | * This function is used to print conditional debugging and error messages. |
244 | | * This function is like wpa_msg(), but it does not send the output as a global |
245 | | * event. |
246 | | */ |
247 | | void wpa_msg_no_global(void *ctx, int level, const char *fmt, ...) |
248 | | PRINTF_FORMAT(3, 4); |
249 | | |
250 | | /** |
251 | | * wpa_msg_global_only - Conditional printf for ctrl_iface monitors |
252 | | * @ctx: Pointer to context data; this is the ctx variable registered |
253 | | * with struct wpa_driver_ops::init() |
254 | | * @level: priority level (MSG_*) of the message |
255 | | * @fmt: printf format string, followed by optional arguments |
256 | | * |
257 | | * This function is used to print conditional debugging and error messages. |
258 | | * This function is like wpa_msg_global(), but it sends the output only as a |
259 | | * global event. |
260 | | */ |
261 | | void wpa_msg_global_only(void *ctx, int level, const char *fmt, ...) |
262 | | PRINTF_FORMAT(3, 4); |
263 | | |
264 | | enum wpa_msg_type { |
265 | | WPA_MSG_PER_INTERFACE, |
266 | | WPA_MSG_GLOBAL, |
267 | | WPA_MSG_NO_GLOBAL, |
268 | | WPA_MSG_ONLY_GLOBAL, |
269 | | }; |
270 | | |
271 | | typedef void (*wpa_msg_cb_func)(void *ctx, int level, enum wpa_msg_type type, |
272 | | const char *txt, size_t len); |
273 | | |
274 | | /** |
275 | | * wpa_msg_register_cb - Register callback function for wpa_msg() messages |
276 | | * @func: Callback function (%NULL to unregister) |
277 | | */ |
278 | | void wpa_msg_register_cb(wpa_msg_cb_func func); |
279 | | |
280 | | typedef const char * (*wpa_msg_get_ifname_func)(void *ctx); |
281 | | void wpa_msg_register_ifname_cb(wpa_msg_get_ifname_func func); |
282 | | |
283 | | #endif /* CONFIG_NO_WPA_MSG */ |
284 | | |
285 | | #ifdef CONFIG_NO_HOSTAPD_LOGGER |
286 | | #define hostapd_logger(args...) do { } while (0) |
287 | | #define hostapd_logger_register_cb(f) do { } while (0) |
288 | | #else /* CONFIG_NO_HOSTAPD_LOGGER */ |
289 | | void hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level, |
290 | | const char *fmt, ...) PRINTF_FORMAT(5, 6); |
291 | | |
292 | | typedef void (*hostapd_logger_cb_func)(void *ctx, const u8 *addr, |
293 | | unsigned int module, int level, |
294 | | const char *txt, size_t len); |
295 | | |
296 | | /** |
297 | | * hostapd_logger_register_cb - Register callback function for hostapd_logger() |
298 | | * @func: Callback function (%NULL to unregister) |
299 | | */ |
300 | | void hostapd_logger_register_cb(hostapd_logger_cb_func func); |
301 | | #endif /* CONFIG_NO_HOSTAPD_LOGGER */ |
302 | | |
303 | | #define HOSTAPD_MODULE_IEEE80211 0x00000001 |
304 | | #define HOSTAPD_MODULE_IEEE8021X 0x00000002 |
305 | | #define HOSTAPD_MODULE_RADIUS 0x00000004 |
306 | | #define HOSTAPD_MODULE_WPA 0x00000008 |
307 | | #define HOSTAPD_MODULE_DRIVER 0x00000010 |
308 | | #define HOSTAPD_MODULE_MLME 0x00000040 |
309 | | |
310 | | enum hostapd_logger_level { |
311 | | HOSTAPD_LEVEL_DEBUG_VERBOSE = 0, |
312 | | HOSTAPD_LEVEL_DEBUG = 1, |
313 | | HOSTAPD_LEVEL_INFO = 2, |
314 | | HOSTAPD_LEVEL_NOTICE = 3, |
315 | | HOSTAPD_LEVEL_WARNING = 4 |
316 | | }; |
317 | | |
318 | | |
319 | | #ifdef CONFIG_DEBUG_SYSLOG |
320 | | |
321 | | void wpa_debug_open_syslog(void); |
322 | | void wpa_debug_close_syslog(void); |
323 | | |
324 | | #else /* CONFIG_DEBUG_SYSLOG */ |
325 | | |
326 | | static inline void wpa_debug_open_syslog(void) |
327 | 0 | { |
328 | 0 | } Unexecuted instantiation: fuzzer-common.c:wpa_debug_open_syslog Unexecuted instantiation: crypto_openssl.c:wpa_debug_open_syslog Unexecuted instantiation: dh_groups.c:wpa_debug_open_syslog Unexecuted instantiation: sha1-prf.c:wpa_debug_open_syslog Unexecuted instantiation: sha256-prf.c:wpa_debug_open_syslog Unexecuted instantiation: sha256-kdf.c:wpa_debug_open_syslog Unexecuted instantiation: dragonfly.c:wpa_debug_open_syslog Unexecuted instantiation: sae.c:wpa_debug_open_syslog Unexecuted instantiation: wpa_common.c:wpa_debug_open_syslog Unexecuted instantiation: ieee802_11_common.c:wpa_debug_open_syslog Unexecuted instantiation: common.c:wpa_debug_open_syslog Unexecuted instantiation: wpa_debug.c:wpa_debug_open_syslog Unexecuted instantiation: wpabuf.c:wpa_debug_open_syslog Unexecuted instantiation: os_unix.c:wpa_debug_open_syslog |
329 | | |
330 | | static inline void wpa_debug_close_syslog(void) |
331 | 0 | { |
332 | 0 | } Unexecuted instantiation: fuzzer-common.c:wpa_debug_close_syslog Unexecuted instantiation: crypto_openssl.c:wpa_debug_close_syslog Unexecuted instantiation: dh_groups.c:wpa_debug_close_syslog Unexecuted instantiation: sha1-prf.c:wpa_debug_close_syslog Unexecuted instantiation: sha256-prf.c:wpa_debug_close_syslog Unexecuted instantiation: sha256-kdf.c:wpa_debug_close_syslog Unexecuted instantiation: dragonfly.c:wpa_debug_close_syslog Unexecuted instantiation: sae.c:wpa_debug_close_syslog Unexecuted instantiation: wpa_common.c:wpa_debug_close_syslog Unexecuted instantiation: ieee802_11_common.c:wpa_debug_close_syslog Unexecuted instantiation: common.c:wpa_debug_close_syslog Unexecuted instantiation: wpa_debug.c:wpa_debug_close_syslog Unexecuted instantiation: wpabuf.c:wpa_debug_close_syslog Unexecuted instantiation: os_unix.c:wpa_debug_close_syslog |
333 | | |
334 | | #endif /* CONFIG_DEBUG_SYSLOG */ |
335 | | |
336 | | #ifdef CONFIG_DEBUG_LINUX_TRACING |
337 | | |
338 | | int wpa_debug_open_linux_tracing(void); |
339 | | void wpa_debug_close_linux_tracing(void); |
340 | | |
341 | | #else /* CONFIG_DEBUG_LINUX_TRACING */ |
342 | | |
343 | | static inline int wpa_debug_open_linux_tracing(void) |
344 | 0 | { |
345 | 0 | return 0; |
346 | 0 | } Unexecuted instantiation: fuzzer-common.c:wpa_debug_open_linux_tracing Unexecuted instantiation: crypto_openssl.c:wpa_debug_open_linux_tracing Unexecuted instantiation: dh_groups.c:wpa_debug_open_linux_tracing Unexecuted instantiation: sha1-prf.c:wpa_debug_open_linux_tracing Unexecuted instantiation: sha256-prf.c:wpa_debug_open_linux_tracing Unexecuted instantiation: sha256-kdf.c:wpa_debug_open_linux_tracing Unexecuted instantiation: dragonfly.c:wpa_debug_open_linux_tracing Unexecuted instantiation: sae.c:wpa_debug_open_linux_tracing Unexecuted instantiation: wpa_common.c:wpa_debug_open_linux_tracing Unexecuted instantiation: ieee802_11_common.c:wpa_debug_open_linux_tracing Unexecuted instantiation: common.c:wpa_debug_open_linux_tracing Unexecuted instantiation: wpa_debug.c:wpa_debug_open_linux_tracing Unexecuted instantiation: wpabuf.c:wpa_debug_open_linux_tracing Unexecuted instantiation: os_unix.c:wpa_debug_open_linux_tracing |
347 | | |
348 | | static inline void wpa_debug_close_linux_tracing(void) |
349 | 0 | { |
350 | 0 | } Unexecuted instantiation: fuzzer-common.c:wpa_debug_close_linux_tracing Unexecuted instantiation: crypto_openssl.c:wpa_debug_close_linux_tracing Unexecuted instantiation: dh_groups.c:wpa_debug_close_linux_tracing Unexecuted instantiation: sha1-prf.c:wpa_debug_close_linux_tracing Unexecuted instantiation: sha256-prf.c:wpa_debug_close_linux_tracing Unexecuted instantiation: sha256-kdf.c:wpa_debug_close_linux_tracing Unexecuted instantiation: dragonfly.c:wpa_debug_close_linux_tracing Unexecuted instantiation: sae.c:wpa_debug_close_linux_tracing Unexecuted instantiation: wpa_common.c:wpa_debug_close_linux_tracing Unexecuted instantiation: ieee802_11_common.c:wpa_debug_close_linux_tracing Unexecuted instantiation: common.c:wpa_debug_close_linux_tracing Unexecuted instantiation: wpa_debug.c:wpa_debug_close_linux_tracing Unexecuted instantiation: wpabuf.c:wpa_debug_close_linux_tracing Unexecuted instantiation: os_unix.c:wpa_debug_close_linux_tracing |
351 | | |
352 | | #endif /* CONFIG_DEBUG_LINUX_TRACING */ |
353 | | |
354 | | |
355 | | #ifdef EAPOL_TEST |
356 | | #define WPA_ASSERT(a) \ |
357 | | do { \ |
358 | | if (!(a)) { \ |
359 | | printf("WPA_ASSERT FAILED '" #a "' " \ |
360 | | "%s %s:%d\n", \ |
361 | | __FUNCTION__, __FILE__, __LINE__); \ |
362 | | exit(1); \ |
363 | | } \ |
364 | | } while (0) |
365 | | #else |
366 | 0 | #define WPA_ASSERT(a) do { } while (0) |
367 | | #endif |
368 | | |
369 | | const char * debug_level_str(int level); |
370 | | int str_to_debug_level(const char *s); |
371 | | |
372 | | #endif /* WPA_DEBUG_H */ |