1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * wpa_supplicant/hostapd / Debug prints 3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi> 4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify 6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as 7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation. 8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license. 11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details. 13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "includes.h" 16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h" 18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE 21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic FILE *out_file = NULL; 22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint wpa_debug_level = MSG_INFO; 24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint wpa_debug_show_keys = 0; 25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint wpa_debug_timestamp = 0; 26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 282c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef CONFIG_ANDROID_LOG 292c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 302c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#include <android/log.h> 312c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 322c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtvoid android_printf(int level, char *format, ...) 332c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt{ 342c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (level >= wpa_debug_level) { 352c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt va_list ap; 362c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (level == MSG_ERROR) { 372c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt level = ANDROID_LOG_ERROR; 382c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } else if (level == MSG_WARNING) { 392c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt level = ANDROID_LOG_WARN; 402c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } else if (level == MSG_INFO) { 412c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt level = ANDROID_LOG_INFO; 422c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } else { 432c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt level = ANDROID_LOG_DEBUG; 442c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 452c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt va_start(ap, format); 462c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt __android_log_vprint(level, "wpa_supplicant", format, ap); 472c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt va_end(ap); 482c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 492c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt} 502c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 512c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#else /* CONFIG_ANDROID_LOG */ 522c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NO_STDOUT_DEBUG 54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_debug_print_timestamp(void) 56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct os_time tv; 58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (!wpa_debug_timestamp) 60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return; 61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_get_time(&tv); 63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE 64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (out_file) { 65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, "%ld.%06u: ", (long) tv.sec, 66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (unsigned int) tv.usec); 67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else 68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("%ld.%06u: ", (long) tv.sec, (unsigned int) tv.usec); 70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * wpa_printf - conditional printf 75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @level: priority level (MSG_*) of the message 76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @fmt: printf format string, followed by optional arguments 77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function is used to print conditional debugging and error messages. The 79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on 80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * configuration. 81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Note: New line '\n' is added to the end of the text when printing to stdout. 83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 84dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidtvoid wpa_printf(int level, const char *fmt, ...) 85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt va_list ap; 87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt va_start(ap, fmt); 89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (level >= wpa_debug_level) { 90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_debug_print_timestamp(); 91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE 92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (out_file) { 93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt vfprintf(out_file, fmt, ap); 94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, "\n"); 95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt vprintf(fmt, ap); 98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("\n"); 99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE 100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt va_end(ap); 104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void _wpa_hexdump(int level, const char *title, const u8 *buf, 108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t len, int show) 109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t i; 111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (level < wpa_debug_level) 112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return; 113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_debug_print_timestamp(); 114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE 115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (out_file) { 116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, "%s - hexdump(len=%lu):", 117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt title, (unsigned long) len); 118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (buf == NULL) { 119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, " [NULL]"); 120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (show) { 121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < len; i++) 122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, " %02x", buf[i]); 123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, " [REMOVED]"); 125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, "\n"); 127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("%s - hexdump(len=%lu):", title, (unsigned long) len); 130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (buf == NULL) { 131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" [NULL]"); 132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (show) { 133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < len; i++) 134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" %02x", buf[i]); 135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" [REMOVED]"); 137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("\n"); 139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE 140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_hexdump(int level, const char *title, const u8 *buf, size_t len) 145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt _wpa_hexdump(level, title, buf, len, 1); 147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_hexdump_key(int level, const char *title, const u8 *buf, size_t len) 151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt _wpa_hexdump(level, title, buf, len, wpa_debug_show_keys); 153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void _wpa_hexdump_ascii(int level, const char *title, const u8 *buf, 157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t len, int show) 158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t i, llen; 160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *pos = buf; 161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const size_t line_len = 16; 162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (level < wpa_debug_level) 164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return; 165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_debug_print_timestamp(); 166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE 167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (out_file) { 168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (!show) { 169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, 170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "%s - hexdump_ascii(len=%lu): [REMOVED]\n", 171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt title, (unsigned long) len); 172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return; 173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (buf == NULL) { 175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, 176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "%s - hexdump_ascii(len=%lu): [NULL]\n", 177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt title, (unsigned long) len); 178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return; 179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, "%s - hexdump_ascii(len=%lu):\n", 181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt title, (unsigned long) len); 182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (len) { 183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt llen = len > line_len ? line_len : len; 184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, " "); 185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < llen; i++) 186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, " %02x", pos[i]); 187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = llen; i < line_len; i++) 188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, " "); 189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, " "); 190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < llen; i++) { 191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (isprint(pos[i])) 192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, "%c", pos[i]); 193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, "_"); 195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = llen; i < line_len; i++) 197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, " "); 198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fprintf(out_file, "\n"); 199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += llen; 200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len -= llen; 201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (!show) { 205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("%s - hexdump_ascii(len=%lu): [REMOVED]\n", 206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt title, (unsigned long) len); 207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return; 208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (buf == NULL) { 210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("%s - hexdump_ascii(len=%lu): [NULL]\n", 211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt title, (unsigned long) len); 212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return; 213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("%s - hexdump_ascii(len=%lu):\n", title, (unsigned long) len); 215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (len) { 216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt llen = len > line_len ? line_len : len; 217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" "); 218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < llen; i++) 219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" %02x", pos[i]); 220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = llen; i < line_len; i++) 221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" "); 222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" "); 223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < llen; i++) { 224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (isprint(pos[i])) 225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("%c", pos[i]); 226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("_"); 228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = llen; i < line_len; i++) 230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" "); 231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("\n"); 232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += llen; 233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len -= llen; 234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE 236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_hexdump_ascii(int level, const char *title, const u8 *buf, size_t len) 242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt _wpa_hexdump_ascii(level, title, buf, len, 1); 244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf, 248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t len) 249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt _wpa_hexdump_ascii(level, title, buf, len, wpa_debug_show_keys); 251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint wpa_debug_open_file(const char *path) 255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE 257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (!path) 258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt out_file = fopen(path, "a"); 260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (out_file == NULL) { 261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_ERROR, "wpa_debug_open_file: Failed to open " 262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "output file, using standard output"); 263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef _WIN32 266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt setvbuf(out_file, NULL, _IOLBF, 0); 267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* _WIN32 */ 268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_debug_close_file(void) 274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE 276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (!out_file) 277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return; 278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt fclose(out_file); 279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt out_file = NULL; 280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */ 281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NO_STDOUT_DEBUG */ 284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 2852c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif /* CONFIG_ANDROID_LOG */ 286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NO_WPA_MSG 288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic wpa_msg_cb_func wpa_msg_cb = NULL; 289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_msg_register_cb(wpa_msg_cb_func func) 291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_msg_cb = func; 293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 296dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidtvoid wpa_msg(void *ctx, int level, const char *fmt, ...) 297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt va_list ap; 299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf; 300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const int buflen = 2048; 301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int len; 302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt buf = os_malloc(buflen); 304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (buf == NULL) { 305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_ERROR, "wpa_msg: Failed to allocate message " 306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "buffer"); 307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return; 308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt va_start(ap, fmt); 310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt va_end(ap); 312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(level, "%s", buf); 313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_msg_cb) 314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_msg_cb(ctx, level, buf, len); 315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(buf); 316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 317dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt 318dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt 319dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidtvoid wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...) 320dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt{ 321dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt va_list ap; 322dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt char *buf; 323dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt const int buflen = 2048; 324dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt int len; 325dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt 326dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt if (!wpa_msg_cb) 327dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt return; 328dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt 329dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt buf = os_malloc(buflen); 330dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt if (buf == NULL) { 331dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt wpa_printf(MSG_ERROR, "wpa_msg_ctrl: Failed to allocate " 332dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt "message buffer"); 333dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt return; 334dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt } 335dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt va_start(ap, fmt); 336dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 337dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt va_end(ap); 338dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt wpa_msg_cb(ctx, level, buf, len); 339dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt os_free(buf); 340dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt} 341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NO_WPA_MSG */ 342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NO_HOSTAPD_LOGGER 345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic hostapd_logger_cb_func hostapd_logger_cb = NULL; 346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid hostapd_logger_register_cb(hostapd_logger_cb_func func) 348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt hostapd_logger_cb = func; 350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level, 354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const char *fmt, ...) 355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt va_list ap; 357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf; 358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const int buflen = 2048; 359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int len; 360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt buf = os_malloc(buflen); 362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (buf == NULL) { 363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_ERROR, "hostapd_logger: Failed to allocate " 364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "message buffer"); 365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return; 366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt va_start(ap, fmt); 368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len = vsnprintf(buf, buflen, fmt, ap); 369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt va_end(ap); 370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (hostapd_logger_cb) 371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt hostapd_logger_cb(ctx, addr, module, level, buf, len); 372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "hostapd_logger: %s", buf); 374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(buf); 375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 377