18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_supplicant/hostapd / Debug prints 3b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * Copyright (c) 2002-2013, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef WPA_DEBUG_H 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_DEBUG_H 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpabuf.h" 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtextern int wpa_debug_level; 15fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtextern int wpa_debug_show_keys; 16fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtextern int wpa_debug_timestamp; 17fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Debugging function - conditional printf and hex dump. Driver wrappers can 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * use these for debugging purposes. */ 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum { 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MSG_EXCESSIVE, MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NO_STDOUT_DEBUG 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_debug_print_timestamp() do { } while (0) 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_printf(args...) do { } while (0) 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump(l,t,b,le) do { } while (0) 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump_buf(l,t,b) do { } while (0) 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump_key(l,t,b,le) do { } while (0) 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump_buf_key(l,t,b) do { } while (0) 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump_ascii(l,t,b,le) do { } while (0) 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump_ascii_key(l,t,b,le) do { } while (0) 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_debug_open_file(p) do { } while (0) 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_debug_close_file() do { } while (0) 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_dbg(args...) do { } while (0) 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_debug_reopen_file(void) 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_NO_STDOUT_DEBUG */ 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_open_file(const char *path); 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_reopen_file(void); 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_close_file(void); 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_debug_printf_timestamp - Print timestamp for debug output 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function prints a timestamp in seconds_from_1970.microsoconds 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * format if debug output has been configured to include timestamps in debug 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * messages. 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_print_timestamp(void); 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_printf - conditional printf 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Note: New line '\n' is added to the end of the text when printing to stdout. 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_printf(int level, const char *fmt, ...) 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtPRINTF_FORMAT(2, 3); 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_hexdump - conditional hex dump 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @title: title of for the message 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: data buffer to be dumped 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @len: length of the buf 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. The contents of buf is printed out has hex dump. 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 84fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump(int level, const char *title, const void *buf, size_t len); 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_hexdump_buf(int level, const char *title, 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpabuf *buf) 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(level, title, buf ? wpabuf_head(buf) : NULL, 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf ? wpabuf_len(buf) : 0); 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_hexdump_key - conditional hex dump, hide keys 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @title: title of for the message 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: data buffer to be dumped 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @len: length of the buf 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. The contents of buf is printed out has hex dump. This works 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * like wpa_hexdump(), but by default, does not include secret keys (passwords, 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * etc.) in debug output. 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 106fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_key(int level, const char *title, const void *buf, size_t len); 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_hexdump_buf_key(int level, const char *title, 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpabuf *buf) 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_hexdump_key(level, title, buf ? wpabuf_head(buf) : NULL, 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf ? wpabuf_len(buf) : 0); 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_hexdump_ascii - conditional hex dump 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @title: title of for the message 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: data buffer to be dumped 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @len: length of the buf 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. The contents of buf is printed out has hex dump with both 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the hex numbers and ASCII characters (for printable range) are shown. 16 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * bytes per line will be shown. 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 128fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_ascii(int level, const char *title, const void *buf, 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len); 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_hexdump_ascii_key - conditional hex dump, hide keys 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @title: title of for the message 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: data buffer to be dumped 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @len: length of the buf 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. The contents of buf is printed out has hex dump with both 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the hex numbers and ASCII characters (for printable range) are shown. 16 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * bytes per line will be shown. This works like wpa_hexdump_ascii(), but by 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * default, does not include secret keys (passwords, etc.) in debug output. 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 145fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_ascii_key(int level, const char *title, const void *buf, 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len); 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_dbg() behaves like wpa_msg(), but it can be removed from build to reduce 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * binary size. As such, it should be used with debugging messages that are not 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * needed in the control interface while wpa_msg() has to be used for anything 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that needs to shown to control interface monitors. 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_dbg(args...) wpa_msg(args) 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_STDOUT_DEBUG */ 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NO_WPA_MSG 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_msg(args...) do { } while (0) 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_msg_ctrl(args...) do { } while (0) 162b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt#define wpa_msg_global(args...) do { } while (0) 1637f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt#define wpa_msg_global_ctrl(args...) do { } while (0) 164b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt#define wpa_msg_no_global(args...) do { } while (0) 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_msg_register_cb(f) do { } while (0) 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_msg_register_ifname_cb(f) do { } while (0) 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_NO_WPA_MSG */ 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_msg - Conditional printf for default target and ctrl_iface monitors 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ctx: Pointer to context data; this is the ctx variable registered 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with struct wpa_driver_ops::init() 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. This function is like wpa_printf(), but it also sends the 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * same message to all attached ctrl_iface monitors. 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Note: New line '\n' is added to the end of the text when printing to stdout. 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg(void *ctx, int level, const char *fmt, ...) PRINTF_FORMAT(3, 4); 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_msg_ctrl - Conditional printf for ctrl_iface monitors 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ctx: Pointer to context data; this is the ctx variable registered 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with struct wpa_driver_ops::init() 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is like wpa_msg(), but it sends the output only to the 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * attached ctrl_iface monitors. In other words, it can be used for frequent 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * events that do not need to be sent to syslog. 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...) 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtPRINTF_FORMAT(3, 4); 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 199b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt/** 200b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * wpa_msg_global - Global printf for ctrl_iface monitors 201b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @ctx: Pointer to context data; this is the ctx variable registered 202b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * with struct wpa_driver_ops::init() 203b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @level: priority level (MSG_*) of the message 204b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 205b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * 206b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * This function is used to print conditional debugging and error messages. 207b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * This function is like wpa_msg(), but it sends the output as a global event, 208b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * i.e., without being specific to an interface. For backwards compatibility, 209b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * an old style event is also delivered on one of the interfaces (the one 210b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * specified by the context data). 211b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt */ 212b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtvoid wpa_msg_global(void *ctx, int level, const char *fmt, ...) 213b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry ShmidtPRINTF_FORMAT(3, 4); 214b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 215b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt/** 2167f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * wpa_msg_global_ctrl - Conditional global printf for ctrl_iface monitors 2177f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * @ctx: Pointer to context data; this is the ctx variable registered 2187f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * with struct wpa_driver_ops::init() 2197f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * @level: priority level (MSG_*) of the message 2207f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 2217f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * 2227f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * This function is used to print conditional debugging and error messages. 2237f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * This function is like wpa_msg_global(), but it sends the output only to the 2247f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * attached global ctrl_iface monitors. In other words, it can be used for 2257f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * frequent events that do not need to be sent to syslog. 2267f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt */ 2277f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidtvoid wpa_msg_global_ctrl(void *ctx, int level, const char *fmt, ...) 2287f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry ShmidtPRINTF_FORMAT(3, 4); 2297f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt 2307f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt/** 231b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * wpa_msg_no_global - Conditional printf for ctrl_iface monitors 232b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @ctx: Pointer to context data; this is the ctx variable registered 233b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * with struct wpa_driver_ops::init() 234b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @level: priority level (MSG_*) of the message 235b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 236b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * 237b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * This function is used to print conditional debugging and error messages. 238b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * This function is like wpa_msg(), but it does not send the output as a global 239b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * event. 240b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt */ 241b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtvoid wpa_msg_no_global(void *ctx, int level, const char *fmt, ...) 242b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry ShmidtPRINTF_FORMAT(3, 4); 243b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 244b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidttypedef void (*wpa_msg_cb_func)(void *ctx, int level, int global, 245b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt const char *txt, size_t len); 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_msg_register_cb - Register callback function for wpa_msg() messages 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @func: Callback function (%NULL to unregister) 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_register_cb(wpa_msg_cb_func func); 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef const char * (*wpa_msg_get_ifname_func)(void *ctx); 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_register_ifname_cb(wpa_msg_get_ifname_func func); 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_WPA_MSG */ 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NO_HOSTAPD_LOGGER 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define hostapd_logger(args...) do { } while (0) 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define hostapd_logger_register_cb(f) do { } while (0) 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_NO_HOSTAPD_LOGGER */ 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level, 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *fmt, ...) PRINTF_FORMAT(5, 6); 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef void (*hostapd_logger_cb_func)(void *ctx, const u8 *addr, 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int module, int level, 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *txt, size_t len); 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd_logger_register_cb - Register callback function for hostapd_logger() 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @func: Callback function (%NULL to unregister) 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_logger_register_cb(hostapd_logger_cb_func func); 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_IEEE80211 0x00000001 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_IEEE8021X 0x00000002 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_RADIUS 0x00000004 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_WPA 0x00000008 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_DRIVER 0x00000010 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_IAPP 0x00000020 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_MLME 0x00000040 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum hostapd_logger_level { 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG_VERBOSE = 0, 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG = 1, 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_INFO = 2, 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_NOTICE = 3, 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_WARNING = 4 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_open_syslog(void); 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_close_syslog(void); 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_DEBUG_SYSLOG */ 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_debug_open_syslog(void) 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_debug_close_syslog(void) 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING 31104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 31204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint wpa_debug_open_linux_tracing(void); 31304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpa_debug_close_linux_tracing(void); 31404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 31504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#else /* CONFIG_DEBUG_LINUX_TRACING */ 31604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 31704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic inline int wpa_debug_open_linux_tracing(void) 31804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 31904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 32004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 32104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 32204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic inline void wpa_debug_close_linux_tracing(void) 32304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 32404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 32504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 32604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */ 32704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAPOL_TEST 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_ASSERT(a) \ 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt do { \ 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!(a)) { \ 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("WPA_ASSERT FAILED '" #a "' " \ 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s %s:%d\n", \ 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __FUNCTION__, __FILE__, __LINE__); \ 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt exit(1); \ 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } \ 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } while (0) 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_ASSERT(a) do { } while (0) 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPA_DEBUG_H */ 344