18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_supplicant/hostapd / Debug prints 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This program is free software; you can redistribute it and/or modify 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it under the terms of the GNU General Public License version 2 as 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * published by the Free Software Foundation. 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * license. 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See README and COPYING for more details. 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <syslog.h> 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_debug_syslog = 0; 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_level = MSG_INFO; 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_show_keys = 0; 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_timestamp = 0; 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_ANDROID_LOG 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <android/log.h> 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt#ifndef ANDROID_LOG_NAME 36648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt#define ANDROID_LOG_NAME "wpa_supplicant" 37648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt#endif 38648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid android_printf(int level, char *format, ...) 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (level >= wpa_debug_level) { 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_list ap; 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (level == MSG_ERROR) 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt level = ANDROID_LOG_ERROR; 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (level == MSG_WARNING) 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt level = ANDROID_LOG_WARN; 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (level == MSG_INFO) 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt level = ANDROID_LOG_INFO; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt level = ANDROID_LOG_DEBUG; 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_start(ap, format); 52648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt __android_log_vprint(level, ANDROID_LOG_NAME, format, ap); 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_end(ap); 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_ANDROID_LOG */ 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_STDOUT_DEBUG 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic FILE *out_file = NULL; 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_print_timestamp(void) 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct os_time tv; 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_debug_timestamp) 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_get_time(&tv); 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (out_file) { 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "%ld.%06u: ", (long) tv.sec, 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (unsigned int) tv.usec); 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%ld.%06u: ", (long) tv.sec, (unsigned int) tv.usec); 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef LOG_HOSTAPD 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define LOG_HOSTAPD LOG_DAEMON 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* LOG_HOSTAPD */ 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_open_syslog(void) 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt openlog("wpa_supplicant", LOG_PID | LOG_NDELAY, LOG_HOSTAPD); 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_syslog++; 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_close_syslog(void) 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_debug_syslog) 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt closelog(); 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int syslog_priority(int level) 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (level) { 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case MSG_MSGDUMP: 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case MSG_DEBUG: 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return LOG_DEBUG; 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case MSG_INFO: 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return LOG_NOTICE; 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case MSG_WARNING: 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return LOG_WARNING; 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case MSG_ERROR: 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return LOG_ERR; 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return LOG_INFO; 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_printf - conditional printf 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Note: New line '\n' is added to the end of the text when printing to stdout. 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_printf(int level, const char *fmt, ...) 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_list ap; 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_start(ap, fmt); 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (level >= wpa_debug_level) { 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_debug_syslog) { 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vsyslog(syslog_priority(level), fmt, ap); 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_print_timestamp(); 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (out_file) { 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vfprintf(out_file, fmt, ap); 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "\n"); 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vprintf(fmt, ap); 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_end(ap); 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void _wpa_hexdump(int level, const char *title, const u8 *buf, 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len, int show) 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (level < wpa_debug_level) 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_print_timestamp(); 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (out_file) { 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "%s - hexdump(len=%lu):", 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " [NULL]"); 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (show) { 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < len; i++) 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " %02x", buf[i]); 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " [REMOVED]"); 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "\n"); 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - hexdump(len=%lu):", title, (unsigned long) len); 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" [NULL]"); 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (show) { 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < len; i++) 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" %02x", buf[i]); 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" [REMOVED]"); 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_hexdump(int level, const char *title, const u8 *buf, size_t len) 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _wpa_hexdump(level, title, buf, len, 1); 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_hexdump_key(int level, const char *title, const u8 *buf, size_t len) 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _wpa_hexdump(level, title, buf, len, wpa_debug_show_keys); 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void _wpa_hexdump_ascii(int level, const char *title, const u8 *buf, 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len, int show) 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i, llen; 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *pos = buf; 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const size_t line_len = 16; 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (level < wpa_debug_level) 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_print_timestamp(); 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (out_file) { 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!show) { 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s - hexdump_ascii(len=%lu): [REMOVED]\n", 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s - hexdump_ascii(len=%lu): [NULL]\n", 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "%s - hexdump_ascii(len=%lu):\n", 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (len) { 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt llen = len > line_len ? line_len : len; 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " "); 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < llen; i++) 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " %02x", pos[i]); 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = llen; i < line_len; i++) 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " "); 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " "); 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < llen; i++) { 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (isprint(pos[i])) 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "%c", pos[i]); 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "_"); 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = llen; i < line_len; i++) 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " "); 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "\n"); 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += llen; 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len -= llen; 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!show) { 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - hexdump_ascii(len=%lu): [REMOVED]\n", 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - hexdump_ascii(len=%lu): [NULL]\n", 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - hexdump_ascii(len=%lu):\n", title, (unsigned long) len); 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (len) { 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt llen = len > line_len ? line_len : len; 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" "); 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < llen; i++) 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" %02x", pos[i]); 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = llen; i < line_len; i++) 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" "); 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" "); 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < llen; i++) { 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (isprint(pos[i])) 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%c", pos[i]); 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("_"); 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = llen; i < line_len; i++) 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" "); 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += llen; 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len -= llen; 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_hexdump_ascii(int level, const char *title, const u8 *buf, size_t len) 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _wpa_hexdump_ascii(level, title, buf, len, 1); 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf, 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len) 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _wpa_hexdump_ascii(level, title, buf, len, wpa_debug_show_keys); 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char *last_path = NULL; 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_reopen_file(void) 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int rv; 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (last_path) { 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *tmp = os_strdup(last_path); 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_close_file(); 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rv = wpa_debug_open_file(tmp); 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(tmp); 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Last-path was not set, cannot " 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "re-open log file."); 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rv = -1; 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return rv; 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_DEBUG_FILE */ 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_open_file(const char *path) 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!path) 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (last_path == NULL || os_strcmp(last_path, path) != 0) { 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Save our path to enable re-open */ 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(last_path); 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt last_path = os_strdup(path); 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt out_file = fopen(path, "a"); 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (out_file == NULL) { 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpa_debug_open_file: Failed to open " 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "output file, using standard output"); 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt setvbuf(out_file, NULL, _IOLBF, 0); 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32 */ 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_close_file(void) 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!out_file) 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(out_file); 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt out_file = NULL; 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(last_path); 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt last_path = NULL; 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_STDOUT_DEBUG */ 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANDROID_LOG */ 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_WPA_MSG 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic wpa_msg_cb_func wpa_msg_cb = NULL; 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_register_cb(wpa_msg_cb_func func) 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_msg_cb = func; 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic wpa_msg_get_ifname_func wpa_msg_ifname_cb = NULL; 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_register_ifname_cb(wpa_msg_get_ifname_func func) 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_msg_ifname_cb = func; 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg(void *ctx, int level, const char *fmt, ...) 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_list ap; 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf; 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const int buflen = 2048; 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char prefix[130]; 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_malloc(buflen); 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpa_msg: Failed to allocate message " 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "buffer"); 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_start(ap, fmt); 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prefix[0] = '\0'; 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_msg_ifname_cb) { 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname = wpa_msg_ifname_cb(ctx); 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname) { 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res = os_snprintf(prefix, sizeof(prefix), "%s: ", 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname); 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || res >= (int) sizeof(prefix)) 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prefix[0] = '\0'; 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_end(ap); 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(level, "%s%s", prefix, buf); 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_msg_cb) 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_msg_cb(ctx, level, buf, len); 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...) 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_list ap; 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf; 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const int buflen = 2048; 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_msg_cb) 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_malloc(buflen); 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpa_msg_ctrl: Failed to allocate " 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "message buffer"); 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_start(ap, fmt); 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_end(ap); 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_msg_cb(ctx, level, buf, len); 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_WPA_MSG */ 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_HOSTAPD_LOGGER 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic hostapd_logger_cb_func hostapd_logger_cb = NULL; 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_logger_register_cb(hostapd_logger_cb_func func) 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger_cb = func; 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level, 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *fmt, ...) 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_list ap; 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf; 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const int buflen = 2048; 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_malloc(buflen); 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "hostapd_logger: Failed to allocate " 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "message buffer"); 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_start(ap, fmt); 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_end(ap); 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_logger_cb) 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger_cb(ctx, addr, module, level, buf, len); 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (addr) 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "hostapd_logger: STA " MACSTR " - %s", 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(addr), buf); 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "hostapd_logger: %s", buf); 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 489