wpa_debug.c revision a3dc30964aa24aea2b518246f6812663a1103490
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#include "includes.h" 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <syslog.h> 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_debug_syslog = 0; 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING 2004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <sys/types.h> 2104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <sys/stat.h> 2204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <fcntl.h> 2304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <string.h> 2404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <stdio.h> 2504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic FILE *wpa_debug_tracing_file = NULL; 2704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#define WPAS_TRACE_PFX "wpas <%d>: " 2904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */ 3004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_level = MSG_INFO; 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_show_keys = 0; 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_timestamp = 0; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_ANDROID_LOG 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <android/log.h> 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 41648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt#ifndef ANDROID_LOG_NAME 42648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt#define ANDROID_LOG_NAME "wpa_supplicant" 431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* ANDROID_LOG_NAME */ 44648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt 4504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_to_android_level(int level) 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (level == MSG_ERROR) 4804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return ANDROID_LOG_ERROR; 4904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (level == MSG_WARNING) 5004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return ANDROID_LOG_WARN; 5104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (level == MSG_INFO) 5204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return ANDROID_LOG_INFO; 5304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return ANDROID_LOG_DEBUG; 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_ANDROID_LOG */ 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_STDOUT_DEBUG 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic FILE *out_file = NULL; 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_print_timestamp(void) 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifndef CONFIG_ANDROID_LOG 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); 8104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_ANDROID_LOG */ 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef LOG_HOSTAPD 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define LOG_HOSTAPD LOG_DAEMON 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* LOG_HOSTAPD */ 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_open_syslog(void) 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt openlog("wpa_supplicant", LOG_PID | LOG_NDELAY, LOG_HOSTAPD); 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_syslog++; 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_close_syslog(void) 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_debug_syslog) 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt closelog(); 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int syslog_priority(int level) 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (level) { 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case MSG_MSGDUMP: 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case MSG_DEBUG: 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return LOG_DEBUG; 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case MSG_INFO: 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return LOG_NOTICE; 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case MSG_WARNING: 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return LOG_WARNING; 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case MSG_ERROR: 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return LOG_ERR; 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return LOG_INFO; 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING 12304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 12404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint wpa_debug_open_linux_tracing(void) 12504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 12604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int mounts, trace_fd; 12704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char buf[4096] = {}; 12804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ssize_t buflen; 12904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *line, *tmp1, *path = NULL; 13004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 13104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt mounts = open("/proc/mounts", O_RDONLY); 13204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (mounts < 0) { 13304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt printf("no /proc/mounts\n"); 13404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 13504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 13604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 13704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt buflen = read(mounts, buf, sizeof(buf) - 1); 13804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt close(mounts); 13904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (buflen < 0) { 14004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt printf("failed to read /proc/mounts\n"); 14104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 14204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 14304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 14404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt line = strtok_r(buf, "\n", &tmp1); 14504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt while (line) { 14604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *tmp2, *tmp_path, *fstype; 14704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* "<dev> <mountpoint> <fs type> ..." */ 14804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt strtok_r(line, " ", &tmp2); 14904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tmp_path = strtok_r(NULL, " ", &tmp2); 15004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fstype = strtok_r(NULL, " ", &tmp2); 15104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (strcmp(fstype, "debugfs") == 0) { 15204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt path = tmp_path; 15304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 15404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 15504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 15604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt line = strtok_r(NULL, "\n", &tmp1); 15704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 15804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 15904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (path == NULL) { 16004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt printf("debugfs mountpoint not found\n"); 16104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 16204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 16304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 16404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt snprintf(buf, sizeof(buf) - 1, "%s/tracing/trace_marker", path); 16504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 16604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt trace_fd = open(buf, O_WRONLY); 16704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (trace_fd < 0) { 16804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt printf("failed to open trace_marker file\n"); 16904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 17004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 17104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_debug_tracing_file = fdopen(trace_fd, "w"); 17204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_debug_tracing_file == NULL) { 17304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt close(trace_fd); 17404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt printf("failed to fdopen()\n"); 17504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 17604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 17704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 17804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return 0; 17904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 18004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 18104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 18204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpa_debug_close_linux_tracing(void) 18304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 18404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_debug_tracing_file == NULL) 18504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 18604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fclose(wpa_debug_tracing_file); 18704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_debug_tracing_file = NULL; 18804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 18904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 19004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */ 19104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 19204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_printf - conditional printf 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @fmt: printf format string, followed by optional arguments 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration. 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Note: New line '\n' is added to the end of the text when printing to stdout. 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_printf(int level, const char *fmt, ...) 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_list ap; 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_start(ap, fmt); 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (level >= wpa_debug_level) { 21004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_ANDROID_LOG 21104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt __android_log_vprint(wpa_to_android_level(level), 21204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ANDROID_LOG_NAME, fmt, ap); 21304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#else /* CONFIG_ANDROID_LOG */ 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_debug_syslog) { 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vsyslog(syslog_priority(level), fmt, ap); 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_print_timestamp(); 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (out_file) { 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vfprintf(out_file, fmt, ap); 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "\n"); 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt vprintf(fmt, ap); 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 23404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_ANDROID_LOG */ 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_end(ap); 23704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 23804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING 23904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_debug_tracing_file != NULL) { 24004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt va_start(ap, fmt); 24104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(wpa_debug_tracing_file, WPAS_TRACE_PFX, level); 24204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt vfprintf(wpa_debug_tracing_file, fmt, ap); 24304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(wpa_debug_tracing_file, "\n"); 24404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fflush(wpa_debug_tracing_file); 24504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt va_end(ap); 24604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 24704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */ 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void _wpa_hexdump(int level, const char *title, const u8 *buf, 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len, int show) 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 25504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 25604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING 25704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_debug_tracing_file != NULL) { 25804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(wpa_debug_tracing_file, 25904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_TRACE_PFX "%s - hexdump(len=%lu):", 26004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt level, title, (unsigned long) len); 26104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (buf == NULL) { 26204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(wpa_debug_tracing_file, " [NULL]\n"); 26304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!show) { 26404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(wpa_debug_tracing_file, " [REMOVED]\n"); 26504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 26604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < len; i++) 26704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(wpa_debug_tracing_file, 26804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt " %02x", buf[i]); 26904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 27004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fflush(wpa_debug_tracing_file); 27104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 27204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */ 27304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (level < wpa_debug_level) 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 27604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_ANDROID_LOG 27704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt { 27804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *display; 27904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *strbuf = NULL; 28004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t slen = len; 28104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (buf == NULL) { 28204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt display = " [NULL]"; 28304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (len == 0) { 28404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt display = ""; 28504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (show && len) { 28604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Limit debug message length for Android log */ 28704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (slen > 32) 28804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt slen = 32; 28904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt strbuf = os_malloc(1 + 3 * slen); 29004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (strbuf == NULL) { 29104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "wpa_hexdump: Failed to " 29204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "allocate message buffer"); 29304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 29404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 29504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 29604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < slen; i++) 29704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_snprintf(&strbuf[i * 3], 4, " %02x", 29804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt buf[i]); 29904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 30004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt display = strbuf; 30104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 30204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt display = " [REMOVED]"; 30304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 30404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 30504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt __android_log_print(wpa_to_android_level(level), 30604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ANDROID_LOG_NAME, 30704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s - hexdump(len=%lu):%s%s", 30804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt title, (long unsigned int) len, display, 30904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt len > slen ? " ..." : ""); 310a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt bin_clear_free(strbuf, 1 + 3 * slen); 31104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 31204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 31304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#else /* CONFIG_ANDROID_LOG */ 314c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG 315c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (wpa_debug_syslog) { 316c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt const char *display; 317c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt char *strbuf = NULL; 318c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 319c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (buf == NULL) { 320c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt display = " [NULL]"; 321c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } else if (len == 0) { 322c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt display = ""; 323c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } else if (show && len) { 324c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt strbuf = os_malloc(1 + 3 * len); 325c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (strbuf == NULL) { 326c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_printf(MSG_ERROR, "wpa_hexdump: Failed to " 327c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt "allocate message buffer"); 328c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return; 329c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 330c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 331c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt for (i = 0; i < len; i++) 332c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt os_snprintf(&strbuf[i * 3], 4, " %02x", 333c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt buf[i]); 334c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 335c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt display = strbuf; 336c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } else { 337c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt display = " [REMOVED]"; 338c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 339c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 340c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt syslog(syslog_priority(level), "%s - hexdump(len=%lu):%s", 34104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt title, (unsigned long) len, display); 342a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt bin_clear_free(strbuf, 1 + 3 * len); 343c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return; 344c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 345c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */ 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_print_timestamp(); 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (out_file) { 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "%s - hexdump(len=%lu):", 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " [NULL]"); 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (show) { 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < len; i++) 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " %02x", buf[i]); 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " [REMOVED]"); 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "\n"); 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - hexdump(len=%lu):", title, (unsigned long) len); 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" [NULL]"); 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (show) { 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < len; i++) 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" %02x", buf[i]); 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" [REMOVED]"); 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 37504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_ANDROID_LOG */ 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump(int level, const char *title, const void *buf, size_t len) 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _wpa_hexdump(level, title, buf, len, 1); 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 384fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_key(int level, const char *title, const void *buf, size_t len) 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _wpa_hexdump(level, title, buf, len, wpa_debug_show_keys); 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 390fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtstatic void _wpa_hexdump_ascii(int level, const char *title, const void *buf, 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len, int show) 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i, llen; 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *pos = buf; 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const size_t line_len = 16; 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING 39804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_debug_tracing_file != NULL) { 39904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(wpa_debug_tracing_file, 40004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_TRACE_PFX "%s - hexdump_ascii(len=%lu):", 40104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt level, title, (unsigned long) len); 40204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (buf == NULL) { 40304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(wpa_debug_tracing_file, " [NULL]\n"); 40404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (!show) { 40504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(wpa_debug_tracing_file, " [REMOVED]\n"); 40604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 40704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* can do ascii processing in userspace */ 40804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < len; i++) 40904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(wpa_debug_tracing_file, 410fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt " %02x", pos[i]); 41104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 41204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fflush(wpa_debug_tracing_file); 41304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 41404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */ 41504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (level < wpa_debug_level) 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 41804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_ANDROID_LOG 41904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt _wpa_hexdump(level, title, buf, len, show); 42004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#else /* CONFIG_ANDROID_LOG */ 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_print_timestamp(); 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (out_file) { 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!show) { 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s - hexdump_ascii(len=%lu): [REMOVED]\n", 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s - hexdump_ascii(len=%lu): [NULL]\n", 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "%s - hexdump_ascii(len=%lu):\n", 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (len) { 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt llen = len > line_len ? line_len : len; 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " "); 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < llen; i++) 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " %02x", pos[i]); 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = llen; i < line_len; i++) 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " "); 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " "); 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < llen; i++) { 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (isprint(pos[i])) 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "%c", pos[i]); 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "_"); 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = llen; i < line_len; i++) 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, " "); 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(out_file, "\n"); 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += llen; 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len -= llen; 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!show) { 4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - hexdump_ascii(len=%lu): [REMOVED]\n", 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - hexdump_ascii(len=%lu): [NULL]\n", 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt title, (unsigned long) len); 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - hexdump_ascii(len=%lu):\n", title, (unsigned long) len); 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (len) { 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt llen = len > line_len ? line_len : len; 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" "); 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < llen; i++) 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" %02x", pos[i]); 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = llen; i < line_len; i++) 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" "); 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" "); 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < llen; i++) { 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (isprint(pos[i])) 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%c", pos[i]); 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("_"); 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = llen; i < line_len; i++) 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" "); 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += llen; 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len -= llen; 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_ANDROID_LOG */ 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 498fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_ascii(int level, const char *title, const void *buf, 499fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt size_t len) 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _wpa_hexdump_ascii(level, title, buf, len, 1); 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 505fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_ascii_key(int level, const char *title, const void *buf, 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len) 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _wpa_hexdump_ascii(level, title, buf, len, wpa_debug_show_keys); 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char *last_path = NULL; 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_reopen_file(void) 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int rv; 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (last_path) { 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *tmp = os_strdup(last_path); 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_close_file(); 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rv = wpa_debug_open_file(tmp); 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(tmp); 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Last-path was not set, cannot " 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "re-open log file."); 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rv = -1; 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return rv; 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_DEBUG_FILE */ 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_open_file(const char *path) 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!path) 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (last_path == NULL || os_strcmp(last_path, path) != 0) { 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Save our path to enable re-open */ 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(last_path); 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt last_path = os_strdup(path); 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt out_file = fopen(path, "a"); 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (out_file == NULL) { 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpa_debug_open_file: Failed to open " 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "output file, using standard output"); 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt setvbuf(out_file, NULL, _IOLBF, 0); 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32 */ 558fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#else /* CONFIG_DEBUG_FILE */ 559fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt (void)path; 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_close_file(void) 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!out_file) 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(out_file); 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt out_file = NULL; 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(last_path); 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt last_path = NULL; 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 577fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 578fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtvoid wpa_debug_setup_stdout(void) 579fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt{ 580fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#ifndef _WIN32 581fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt setvbuf(stdout, NULL, _IOLBF, 0); 582fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#endif /* _WIN32 */ 583fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt} 584fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_STDOUT_DEBUG */ 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_WPA_MSG 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic wpa_msg_cb_func wpa_msg_cb = NULL; 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_register_cb(wpa_msg_cb_func func) 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_msg_cb = func; 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic wpa_msg_get_ifname_func wpa_msg_ifname_cb = NULL; 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_register_ifname_cb(wpa_msg_get_ifname_func func) 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_msg_ifname_cb = func; 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg(void *ctx, int level, const char *fmt, ...) 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_list ap; 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf; 60913ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt int buflen; 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char prefix[130]; 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 61313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt va_start(ap, fmt); 61413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 61513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt va_end(ap); 61613ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_malloc(buflen); 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpa_msg: Failed to allocate message " 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "buffer"); 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_start(ap, fmt); 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prefix[0] = '\0'; 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_msg_ifname_cb) { 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname = wpa_msg_ifname_cb(ctx); 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname) { 6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res = os_snprintf(prefix, sizeof(prefix), "%s: ", 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname); 630fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt if (os_snprintf_error(sizeof(prefix), res)) 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prefix[0] = '\0'; 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_end(ap); 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(level, "%s%s", prefix, buf); 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_msg_cb) 6387a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt wpa_msg_cb(ctx, level, WPA_MSG_PER_INTERFACE, buf, len); 639a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt bin_clear_free(buf, buflen); 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...) 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_list ap; 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf; 64713ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt int buflen; 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_msg_cb) 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 65313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt va_start(ap, fmt); 65413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 65513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt va_end(ap); 65613ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_malloc(buflen); 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "wpa_msg_ctrl: Failed to allocate " 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "message buffer"); 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_start(ap, fmt); 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_end(ap); 6667a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt wpa_msg_cb(ctx, level, WPA_MSG_PER_INTERFACE, buf, len); 667a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt bin_clear_free(buf, buflen); 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 669b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 670b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 671b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtvoid wpa_msg_global(void *ctx, int level, const char *fmt, ...) 672b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt{ 673b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt va_list ap; 674b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt char *buf; 67513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt int buflen; 676b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt int len; 677b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 67813ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt va_start(ap, fmt); 67913ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 68013ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt va_end(ap); 68113ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt 682b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt buf = os_malloc(buflen); 683b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt if (buf == NULL) { 684b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt wpa_printf(MSG_ERROR, "wpa_msg_global: Failed to allocate " 685b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt "message buffer"); 686b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt return; 687b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt } 688b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt va_start(ap, fmt); 689b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 690b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt va_end(ap); 691b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt wpa_printf(level, "%s", buf); 692b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt if (wpa_msg_cb) 6937a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt wpa_msg_cb(ctx, level, WPA_MSG_GLOBAL, buf, len); 694a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt bin_clear_free(buf, buflen); 695b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt} 696b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 697b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 6987f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidtvoid wpa_msg_global_ctrl(void *ctx, int level, const char *fmt, ...) 6997f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt{ 7007f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt va_list ap; 7017f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt char *buf; 7027f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt int buflen; 7037f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt int len; 7047f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt 7057f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt if (!wpa_msg_cb) 7067f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt return; 7077f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt 7087f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt va_start(ap, fmt); 7097f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 7107f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt va_end(ap); 7117f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt 7127f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt buf = os_malloc(buflen); 7137f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt if (buf == NULL) { 7147f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt wpa_printf(MSG_ERROR, 7157f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt "wpa_msg_global_ctrl: Failed to allocate message buffer"); 7167f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt return; 7177f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt } 7187f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt va_start(ap, fmt); 7197f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 7207f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt va_end(ap); 7217a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt wpa_msg_cb(ctx, level, WPA_MSG_GLOBAL, buf, len); 722a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt bin_clear_free(buf, buflen); 7237f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt} 7247f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt 7257f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt 726b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtvoid wpa_msg_no_global(void *ctx, int level, const char *fmt, ...) 727b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt{ 728b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt va_list ap; 729b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt char *buf; 73013ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt int buflen; 731b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt int len; 732b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 73313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt va_start(ap, fmt); 73413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 73513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt va_end(ap); 73613ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt 737b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt buf = os_malloc(buflen); 738b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt if (buf == NULL) { 739b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt wpa_printf(MSG_ERROR, "wpa_msg_no_global: Failed to allocate " 740b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt "message buffer"); 741b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt return; 742b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt } 743b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt va_start(ap, fmt); 744b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 745b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt va_end(ap); 746b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt wpa_printf(level, "%s", buf); 747b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt if (wpa_msg_cb) 7487a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt wpa_msg_cb(ctx, level, WPA_MSG_NO_GLOBAL, buf, len); 749a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt bin_clear_free(buf, buflen); 750b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt} 751b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_WPA_MSG */ 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_HOSTAPD_LOGGER 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic hostapd_logger_cb_func hostapd_logger_cb = NULL; 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_logger_register_cb(hostapd_logger_cb_func func) 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger_cb = func; 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level, 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *fmt, ...) 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_list ap; 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf; 76913ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt int buflen; 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 77213ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt va_start(ap, fmt); 77313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 77413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt va_end(ap); 77513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_malloc(buflen); 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "hostapd_logger: Failed to allocate " 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "message buffer"); 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_start(ap, fmt); 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_end(ap); 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hostapd_logger_cb) 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger_cb(ctx, addr, module, level, buf, len); 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (addr) 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "hostapd_logger: STA " MACSTR " - %s", 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(addr), buf); 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "hostapd_logger: %s", buf); 792a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt bin_clear_free(buf, buflen); 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 795