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; 17092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart#ifdef CONFIG_DEBUG_SYSLOG 18092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewartextern int wpa_debug_syslog; 19092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart#endif /* CONFIG_DEBUG_SYSLOG */ 20fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Debugging function - conditional printf and hex dump. Driver wrappers can 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * use these for debugging purposes. */ 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum { 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MSG_EXCESSIVE, MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NO_STDOUT_DEBUG 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_debug_print_timestamp() do { } while (0) 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_printf(args...) do { } while (0) 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump(l,t,b,le) do { } while (0) 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump_buf(l,t,b) do { } while (0) 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump_key(l,t,b,le) do { } while (0) 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump_buf_key(l,t,b) do { } while (0) 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump_ascii(l,t,b,le) do { } while (0) 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_hexdump_ascii_key(l,t,b,le) do { } while (0) 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_debug_open_file(p) do { } while (0) 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_debug_close_file() do { } while (0) 40fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#define wpa_debug_setup_stdout() do { } while (0) 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_dbg(args...) do { } while (0) 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_debug_reopen_file(void) 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_NO_STDOUT_DEBUG */ 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_open_file(const char *path); 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_reopen_file(void); 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_close_file(void); 53fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtvoid wpa_debug_setup_stdout(void); 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_debug_printf_timestamp - Print timestamp for debug output 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function prints a timestamp in seconds_from_1970.microsoconds 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * format if debug output has been configured to include timestamps in debug 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * messages. 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_print_timestamp(void); 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_printf - conditional printf 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Note: New line '\n' is added to the end of the text when printing to stdout. 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_printf(int level, const char *fmt, ...) 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtPRINTF_FORMAT(2, 3); 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_hexdump - conditional hex dump 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @title: title of for the message 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: data buffer to be dumped 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @len: length of the buf 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. The contents of buf is printed out has hex dump. 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 89fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump(int level, const char *title, const void *buf, size_t len); 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_hexdump_buf(int level, const char *title, 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpabuf *buf) 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(level, title, buf ? wpabuf_head(buf) : NULL, 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf ? wpabuf_len(buf) : 0); 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_hexdump_key - conditional hex dump, hide keys 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @title: title of for the message 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: data buffer to be dumped 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @len: length of the buf 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. The contents of buf is printed out has hex dump. This works 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * like wpa_hexdump(), but by default, does not include secret keys (passwords, 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * etc.) in debug output. 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 111fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_key(int level, const char *title, const void *buf, size_t len); 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_hexdump_buf_key(int level, const char *title, 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpabuf *buf) 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_hexdump_key(level, title, buf ? wpabuf_head(buf) : NULL, 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf ? wpabuf_len(buf) : 0); 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_hexdump_ascii - conditional hex dump 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @title: title of for the message 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: data buffer to be dumped 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @len: length of the buf 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. The contents of buf is printed out has hex dump with both 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the hex numbers and ASCII characters (for printable range) are shown. 16 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * bytes per line will be shown. 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 133fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_ascii(int level, const char *title, const void *buf, 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len); 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_hexdump_ascii_key - conditional hex dump, hide keys 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @title: title of for the message 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @buf: data buffer to be dumped 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @len: length of the buf 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. The contents of buf is printed out has hex dump with both 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the hex numbers and ASCII characters (for printable range) are shown. 16 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * bytes per line will be shown. This works like wpa_hexdump_ascii(), but by 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * default, does not include secret keys (passwords, etc.) in debug output. 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 150fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_ascii_key(int level, const char *title, const void *buf, 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len); 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_dbg() behaves like wpa_msg(), but it can be removed from build to reduce 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * binary size. As such, it should be used with debugging messages that are not 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * needed in the control interface while wpa_msg() has to be used for anything 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that needs to shown to control interface monitors. 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_dbg(args...) wpa_msg(args) 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_STDOUT_DEBUG */ 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NO_WPA_MSG 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_msg(args...) do { } while (0) 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_msg_ctrl(args...) do { } while (0) 167b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt#define wpa_msg_global(args...) do { } while (0) 1687f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt#define wpa_msg_global_ctrl(args...) do { } while (0) 169b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt#define wpa_msg_no_global(args...) do { } while (0) 170f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut#define wpa_msg_global_only(args...) do { } while (0) 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_msg_register_cb(f) do { } while (0) 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_msg_register_ifname_cb(f) do { } while (0) 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_NO_WPA_MSG */ 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_msg - Conditional printf for default target and ctrl_iface monitors 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ctx: Pointer to context data; this is the ctx variable registered 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with struct wpa_driver_ops::init() 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. This function is like wpa_printf(), but it also sends the 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * same message to all attached ctrl_iface monitors. 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Note: New line '\n' is added to the end of the text when printing to stdout. 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg(void *ctx, int level, const char *fmt, ...) PRINTF_FORMAT(3, 4); 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_msg_ctrl - Conditional printf for ctrl_iface monitors 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ctx: Pointer to context data; this is the ctx variable registered 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with struct wpa_driver_ops::init() 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is like wpa_msg(), but it sends the output only to the 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * attached ctrl_iface monitors. In other words, it can be used for frequent 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * events that do not need to be sent to syslog. 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...) 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtPRINTF_FORMAT(3, 4); 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 205b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt/** 206b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * wpa_msg_global - Global printf for ctrl_iface monitors 207b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @ctx: Pointer to context data; this is the ctx variable registered 208b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * with struct wpa_driver_ops::init() 209b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @level: priority level (MSG_*) of the message 210b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 211b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * 212b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * This function is used to print conditional debugging and error messages. 213b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * This function is like wpa_msg(), but it sends the output as a global event, 214b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * i.e., without being specific to an interface. For backwards compatibility, 215b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * an old style event is also delivered on one of the interfaces (the one 216b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * specified by the context data). 217b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt */ 218b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtvoid wpa_msg_global(void *ctx, int level, const char *fmt, ...) 219b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry ShmidtPRINTF_FORMAT(3, 4); 220b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 221b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt/** 2227f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * wpa_msg_global_ctrl - Conditional global printf for ctrl_iface monitors 2237f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * @ctx: Pointer to context data; this is the ctx variable registered 2247f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * with struct wpa_driver_ops::init() 2257f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * @level: priority level (MSG_*) of the message 2267f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 2277f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * 2287f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * This function is used to print conditional debugging and error messages. 2297f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * This function is like wpa_msg_global(), but it sends the output only to the 2307f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * attached global ctrl_iface monitors. In other words, it can be used for 2317f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt * frequent events that do not need to be sent to syslog. 2327f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt */ 2337f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidtvoid wpa_msg_global_ctrl(void *ctx, int level, const char *fmt, ...) 2347f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry ShmidtPRINTF_FORMAT(3, 4); 2357f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt 2367f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt/** 237b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * wpa_msg_no_global - Conditional printf for ctrl_iface monitors 238b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @ctx: Pointer to context data; this is the ctx variable registered 239b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * with struct wpa_driver_ops::init() 240b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @level: priority level (MSG_*) of the message 241b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 242b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * 243b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * This function is used to print conditional debugging and error messages. 244b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * This function is like wpa_msg(), but it does not send the output as a global 245b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * event. 246b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt */ 247b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtvoid wpa_msg_no_global(void *ctx, int level, const char *fmt, ...) 248b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry ShmidtPRINTF_FORMAT(3, 4); 249b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 250f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut/** 251f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut * wpa_msg_global_only - Conditional printf for ctrl_iface monitors 252f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut * @ctx: Pointer to context data; this is the ctx variable registered 253f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut * with struct wpa_driver_ops::init() 254f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut * @level: priority level (MSG_*) of the message 255f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut * @fmt: printf format string, followed by optional arguments 256f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut * 257f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut * This function is used to print conditional debugging and error messages. 258f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut * This function is like wpa_msg_global(), but it sends the output only as a 259f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut * global event. 260f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut */ 261f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtutvoid wpa_msg_global_only(void *ctx, int level, const char *fmt, ...) 262f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton NayshtutPRINTF_FORMAT(3, 4); 263f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut 2647a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidtenum wpa_msg_type { 2657a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt WPA_MSG_PER_INTERFACE, 2667a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt WPA_MSG_GLOBAL, 2677a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt WPA_MSG_NO_GLOBAL, 268f715e8dfa2b9e3dc96419e976117a9f9b3d9991bAnton Nayshtut WPA_MSG_ONLY_GLOBAL, 2697a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt}; 2707a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt 2717a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidttypedef void (*wpa_msg_cb_func)(void *ctx, int level, enum wpa_msg_type type, 272b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt const char *txt, size_t len); 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_msg_register_cb - Register callback function for wpa_msg() messages 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @func: Callback function (%NULL to unregister) 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_register_cb(wpa_msg_cb_func func); 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef const char * (*wpa_msg_get_ifname_func)(void *ctx); 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_register_ifname_cb(wpa_msg_get_ifname_func func); 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_WPA_MSG */ 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NO_HOSTAPD_LOGGER 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define hostapd_logger(args...) do { } while (0) 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define hostapd_logger_register_cb(f) do { } while (0) 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_NO_HOSTAPD_LOGGER */ 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level, 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *fmt, ...) PRINTF_FORMAT(5, 6); 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef void (*hostapd_logger_cb_func)(void *ctx, const u8 *addr, 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int module, int level, 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *txt, size_t len); 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd_logger_register_cb - Register callback function for hostapd_logger() 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @func: Callback function (%NULL to unregister) 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_logger_register_cb(hostapd_logger_cb_func func); 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_IEEE80211 0x00000001 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_IEEE8021X 0x00000002 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_RADIUS 0x00000004 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_WPA 0x00000008 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_DRIVER 0x00000010 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_IAPP 0x00000020 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define HOSTAPD_MODULE_MLME 0x00000040 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum hostapd_logger_level { 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG_VERBOSE = 0, 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG = 1, 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_INFO = 2, 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_NOTICE = 3, 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_WARNING = 4 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_open_syslog(void); 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_close_syslog(void); 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_DEBUG_SYSLOG */ 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_debug_open_syslog(void) 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_debug_close_syslog(void) 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING 33804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 33904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint wpa_debug_open_linux_tracing(void); 34004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpa_debug_close_linux_tracing(void); 34104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 34204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#else /* CONFIG_DEBUG_LINUX_TRACING */ 34304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 34404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic inline int wpa_debug_open_linux_tracing(void) 34504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 34604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 34704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 34804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 34904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic inline void wpa_debug_close_linux_tracing(void) 35004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 35104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 35204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 35304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */ 35404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef EAPOL_TEST 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_ASSERT(a) \ 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt do { \ 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!(a)) { \ 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("WPA_ASSERT FAILED '" #a "' " \ 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s %s:%d\n", \ 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __FUNCTION__, __FILE__, __LINE__); \ 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt exit(1); \ 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } \ 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } while (0) 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_ASSERT(a) do { } while (0) 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 370d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtconst char * debug_level_str(int level); 371d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtint str_to_debug_level(const char *s); 372d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPA_DEBUG_H */ 374