11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * wpa_supplicant/hostapd / Debug prints 31b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2002-2013, Jouni Malinen <j@w1.fi> 41b362b15af34006e6a11974088a46d42b903418eJohann * 51b362b15af34006e6a11974088a46d42b903418eJohann * This software may be distributed under the terms of the BSD license. 61b362b15af34006e6a11974088a46d42b903418eJohann * See README for more details. 71b362b15af34006e6a11974088a46d42b903418eJohann */ 81b362b15af34006e6a11974088a46d42b903418eJohann 91b362b15af34006e6a11974088a46d42b903418eJohann#include "includes.h" 101b362b15af34006e6a11974088a46d42b903418eJohann 111b362b15af34006e6a11974088a46d42b903418eJohann#include "common.h" 121b362b15af34006e6a11974088a46d42b903418eJohann 131b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_DEBUG_SYSLOG 141b362b15af34006e6a11974088a46d42b903418eJohann#include <syslog.h> 151b362b15af34006e6a11974088a46d42b903418eJohann 161b362b15af34006e6a11974088a46d42b903418eJohannstatic int wpa_debug_syslog = 0; 171b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_DEBUG_SYSLOG */ 181b362b15af34006e6a11974088a46d42b903418eJohann 191b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_DEBUG_LINUX_TRACING 201b362b15af34006e6a11974088a46d42b903418eJohann#include <sys/types.h> 211b362b15af34006e6a11974088a46d42b903418eJohann#include <sys/stat.h> 221b362b15af34006e6a11974088a46d42b903418eJohann#include <fcntl.h> 231b362b15af34006e6a11974088a46d42b903418eJohann#include <string.h> 241b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h> 251b362b15af34006e6a11974088a46d42b903418eJohann 261b362b15af34006e6a11974088a46d42b903418eJohannstatic FILE *wpa_debug_tracing_file = NULL; 271b362b15af34006e6a11974088a46d42b903418eJohann 281b362b15af34006e6a11974088a46d42b903418eJohann#define WPAS_TRACE_PFX "wpas <%d>: " 291b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_DEBUG_LINUX_TRACING */ 301b362b15af34006e6a11974088a46d42b903418eJohann 311b362b15af34006e6a11974088a46d42b903418eJohann 321b362b15af34006e6a11974088a46d42b903418eJohannint wpa_debug_level = MSG_INFO; 331b362b15af34006e6a11974088a46d42b903418eJohannint wpa_debug_show_keys = 0; 341b362b15af34006e6a11974088a46d42b903418eJohannint wpa_debug_timestamp = 0; 351b362b15af34006e6a11974088a46d42b903418eJohann 361b362b15af34006e6a11974088a46d42b903418eJohann 371b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_ANDROID_LOG 381b362b15af34006e6a11974088a46d42b903418eJohann 391b362b15af34006e6a11974088a46d42b903418eJohann#include <android/log.h> 401b362b15af34006e6a11974088a46d42b903418eJohann 411b362b15af34006e6a11974088a46d42b903418eJohann#ifndef ANDROID_LOG_NAME 421b362b15af34006e6a11974088a46d42b903418eJohann#define ANDROID_LOG_NAME "wpa_supplicant" 431b362b15af34006e6a11974088a46d42b903418eJohann#endif /* ANDROID_LOG_NAME */ 441b362b15af34006e6a11974088a46d42b903418eJohann 451b362b15af34006e6a11974088a46d42b903418eJohannstatic int wpa_to_android_level(int level) 461b362b15af34006e6a11974088a46d42b903418eJohann{ 471b362b15af34006e6a11974088a46d42b903418eJohann if (level == MSG_ERROR) 481b362b15af34006e6a11974088a46d42b903418eJohann return ANDROID_LOG_ERROR; 491b362b15af34006e6a11974088a46d42b903418eJohann if (level == MSG_WARNING) 501b362b15af34006e6a11974088a46d42b903418eJohann return ANDROID_LOG_WARN; 511b362b15af34006e6a11974088a46d42b903418eJohann if (level == MSG_INFO) 521b362b15af34006e6a11974088a46d42b903418eJohann return ANDROID_LOG_INFO; 531b362b15af34006e6a11974088a46d42b903418eJohann return ANDROID_LOG_DEBUG; 541b362b15af34006e6a11974088a46d42b903418eJohann} 551b362b15af34006e6a11974088a46d42b903418eJohann 561b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_ANDROID_LOG */ 571b362b15af34006e6a11974088a46d42b903418eJohann 581b362b15af34006e6a11974088a46d42b903418eJohann#ifndef CONFIG_NO_STDOUT_DEBUG 591b362b15af34006e6a11974088a46d42b903418eJohann 601b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_DEBUG_FILE 611b362b15af34006e6a11974088a46d42b903418eJohannstatic FILE *out_file = NULL; 621b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_DEBUG_FILE */ 631b362b15af34006e6a11974088a46d42b903418eJohann 641b362b15af34006e6a11974088a46d42b903418eJohann 651b362b15af34006e6a11974088a46d42b903418eJohannvoid wpa_debug_print_timestamp(void) 661b362b15af34006e6a11974088a46d42b903418eJohann{ 671b362b15af34006e6a11974088a46d42b903418eJohann#ifndef CONFIG_ANDROID_LOG 681b362b15af34006e6a11974088a46d42b903418eJohann struct os_time tv; 691b362b15af34006e6a11974088a46d42b903418eJohann 701b362b15af34006e6a11974088a46d42b903418eJohann if (!wpa_debug_timestamp) 711b362b15af34006e6a11974088a46d42b903418eJohann return; 721b362b15af34006e6a11974088a46d42b903418eJohann 731b362b15af34006e6a11974088a46d42b903418eJohann os_get_time(&tv); 741b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_DEBUG_FILE 751b362b15af34006e6a11974088a46d42b903418eJohann if (out_file) { 761b362b15af34006e6a11974088a46d42b903418eJohann fprintf(out_file, "%ld.%06u: ", (long) tv.sec, 771b362b15af34006e6a11974088a46d42b903418eJohann (unsigned int) tv.usec); 781b362b15af34006e6a11974088a46d42b903418eJohann } else 791b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_DEBUG_FILE */ 801b362b15af34006e6a11974088a46d42b903418eJohann printf("%ld.%06u: ", (long) tv.sec, (unsigned int) tv.usec); 811b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_ANDROID_LOG */ 821b362b15af34006e6a11974088a46d42b903418eJohann} 831b362b15af34006e6a11974088a46d42b903418eJohann 841b362b15af34006e6a11974088a46d42b903418eJohann 851b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_DEBUG_SYSLOG 861b362b15af34006e6a11974088a46d42b903418eJohann#ifndef LOG_HOSTAPD 871b362b15af34006e6a11974088a46d42b903418eJohann#define LOG_HOSTAPD LOG_DAEMON 881b362b15af34006e6a11974088a46d42b903418eJohann#endif /* LOG_HOSTAPD */ 891b362b15af34006e6a11974088a46d42b903418eJohann 901b362b15af34006e6a11974088a46d42b903418eJohannvoid wpa_debug_open_syslog(void) 911b362b15af34006e6a11974088a46d42b903418eJohann{ 921b362b15af34006e6a11974088a46d42b903418eJohann openlog("wpa_supplicant", LOG_PID | LOG_NDELAY, LOG_HOSTAPD); 931b362b15af34006e6a11974088a46d42b903418eJohann wpa_debug_syslog++; 941b362b15af34006e6a11974088a46d42b903418eJohann} 951b362b15af34006e6a11974088a46d42b903418eJohann 961b362b15af34006e6a11974088a46d42b903418eJohann 971b362b15af34006e6a11974088a46d42b903418eJohannvoid wpa_debug_close_syslog(void) 981b362b15af34006e6a11974088a46d42b903418eJohann{ 991b362b15af34006e6a11974088a46d42b903418eJohann if (wpa_debug_syslog) 1001b362b15af34006e6a11974088a46d42b903418eJohann closelog(); 1011b362b15af34006e6a11974088a46d42b903418eJohann} 1021b362b15af34006e6a11974088a46d42b903418eJohann 1031b362b15af34006e6a11974088a46d42b903418eJohann 1041b362b15af34006e6a11974088a46d42b903418eJohannstatic int syslog_priority(int level) 1051b362b15af34006e6a11974088a46d42b903418eJohann{ 1061b362b15af34006e6a11974088a46d42b903418eJohann switch (level) { 1071b362b15af34006e6a11974088a46d42b903418eJohann case MSG_MSGDUMP: 1081b362b15af34006e6a11974088a46d42b903418eJohann case MSG_DEBUG: 1091b362b15af34006e6a11974088a46d42b903418eJohann return LOG_DEBUG; 1101b362b15af34006e6a11974088a46d42b903418eJohann case MSG_INFO: 1111b362b15af34006e6a11974088a46d42b903418eJohann return LOG_NOTICE; 1121b362b15af34006e6a11974088a46d42b903418eJohann case MSG_WARNING: 1131b362b15af34006e6a11974088a46d42b903418eJohann return LOG_WARNING; 1141b362b15af34006e6a11974088a46d42b903418eJohann case MSG_ERROR: 1151b362b15af34006e6a11974088a46d42b903418eJohann return LOG_ERR; 1161b362b15af34006e6a11974088a46d42b903418eJohann } 1171b362b15af34006e6a11974088a46d42b903418eJohann return LOG_INFO; 1181b362b15af34006e6a11974088a46d42b903418eJohann} 1191b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_DEBUG_SYSLOG */ 1201b362b15af34006e6a11974088a46d42b903418eJohann 1211b362b15af34006e6a11974088a46d42b903418eJohann 1221b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_DEBUG_LINUX_TRACING 1231b362b15af34006e6a11974088a46d42b903418eJohann 1241b362b15af34006e6a11974088a46d42b903418eJohannint wpa_debug_open_linux_tracing(void) 1251b362b15af34006e6a11974088a46d42b903418eJohann{ 1261b362b15af34006e6a11974088a46d42b903418eJohann int mounts, trace_fd; 1271b362b15af34006e6a11974088a46d42b903418eJohann char buf[4096] = {}; 1281b362b15af34006e6a11974088a46d42b903418eJohann ssize_t buflen; 1291b362b15af34006e6a11974088a46d42b903418eJohann char *line, *tmp1, *path = NULL; 1301b362b15af34006e6a11974088a46d42b903418eJohann 1311b362b15af34006e6a11974088a46d42b903418eJohann mounts = open("/proc/mounts", O_RDONLY); 1321b362b15af34006e6a11974088a46d42b903418eJohann if (mounts < 0) { 1331b362b15af34006e6a11974088a46d42b903418eJohann printf("no /proc/mounts\n"); 1341b362b15af34006e6a11974088a46d42b903418eJohann return -1; 1351b362b15af34006e6a11974088a46d42b903418eJohann } 1361b362b15af34006e6a11974088a46d42b903418eJohann 1371b362b15af34006e6a11974088a46d42b903418eJohann buflen = read(mounts, buf, sizeof(buf) - 1); 1381b362b15af34006e6a11974088a46d42b903418eJohann close(mounts); 1391b362b15af34006e6a11974088a46d42b903418eJohann if (buflen < 0) { 1401b362b15af34006e6a11974088a46d42b903418eJohann printf("failed to read /proc/mounts\n"); 1411b362b15af34006e6a11974088a46d42b903418eJohann return -1; 1421b362b15af34006e6a11974088a46d42b903418eJohann } 1431b362b15af34006e6a11974088a46d42b903418eJohann 1441b362b15af34006e6a11974088a46d42b903418eJohann line = strtok_r(buf, "\n", &tmp1); 1451b362b15af34006e6a11974088a46d42b903418eJohann while (line) { 1461b362b15af34006e6a11974088a46d42b903418eJohann char *tmp2, *tmp_path, *fstype; 1471b362b15af34006e6a11974088a46d42b903418eJohann /* "<dev> <mountpoint> <fs type> ..." */ 1481b362b15af34006e6a11974088a46d42b903418eJohann strtok_r(line, " ", &tmp2); 1491b362b15af34006e6a11974088a46d42b903418eJohann tmp_path = strtok_r(NULL, " ", &tmp2); 1501b362b15af34006e6a11974088a46d42b903418eJohann fstype = strtok_r(NULL, " ", &tmp2); 1511b362b15af34006e6a11974088a46d42b903418eJohann if (strcmp(fstype, "debugfs") == 0) { 1521b362b15af34006e6a11974088a46d42b903418eJohann path = tmp_path; 1531b362b15af34006e6a11974088a46d42b903418eJohann break; 1541b362b15af34006e6a11974088a46d42b903418eJohann } 1551b362b15af34006e6a11974088a46d42b903418eJohann 1561b362b15af34006e6a11974088a46d42b903418eJohann line = strtok_r(NULL, "\n", &tmp1); 1571b362b15af34006e6a11974088a46d42b903418eJohann } 1581b362b15af34006e6a11974088a46d42b903418eJohann 1591b362b15af34006e6a11974088a46d42b903418eJohann if (path == NULL) { 1601b362b15af34006e6a11974088a46d42b903418eJohann printf("debugfs mountpoint not found\n"); 1611b362b15af34006e6a11974088a46d42b903418eJohann return -1; 1621b362b15af34006e6a11974088a46d42b903418eJohann } 1631b362b15af34006e6a11974088a46d42b903418eJohann 1641b362b15af34006e6a11974088a46d42b903418eJohann snprintf(buf, sizeof(buf) - 1, "%s/tracing/trace_marker", path); 1651b362b15af34006e6a11974088a46d42b903418eJohann 1661b362b15af34006e6a11974088a46d42b903418eJohann trace_fd = open(buf, O_WRONLY); 1671b362b15af34006e6a11974088a46d42b903418eJohann if (trace_fd < 0) { 1681b362b15af34006e6a11974088a46d42b903418eJohann printf("failed to open trace_marker file\n"); 1691b362b15af34006e6a11974088a46d42b903418eJohann return -1; 1701b362b15af34006e6a11974088a46d42b903418eJohann } 1711b362b15af34006e6a11974088a46d42b903418eJohann wpa_debug_tracing_file = fdopen(trace_fd, "w"); 1721b362b15af34006e6a11974088a46d42b903418eJohann if (wpa_debug_tracing_file == NULL) { 1731b362b15af34006e6a11974088a46d42b903418eJohann close(trace_fd); 1741b362b15af34006e6a11974088a46d42b903418eJohann printf("failed to fdopen()\n"); 1751b362b15af34006e6a11974088a46d42b903418eJohann return -1; 1761b362b15af34006e6a11974088a46d42b903418eJohann } 1771b362b15af34006e6a11974088a46d42b903418eJohann 1781b362b15af34006e6a11974088a46d42b903418eJohann return 0; 1791b362b15af34006e6a11974088a46d42b903418eJohann} 1801b362b15af34006e6a11974088a46d42b903418eJohann 1811b362b15af34006e6a11974088a46d42b903418eJohann 1821b362b15af34006e6a11974088a46d42b903418eJohannvoid wpa_debug_close_linux_tracing(void) 1831b362b15af34006e6a11974088a46d42b903418eJohann{ 1841b362b15af34006e6a11974088a46d42b903418eJohann if (wpa_debug_tracing_file == NULL) 1851b362b15af34006e6a11974088a46d42b903418eJohann return; 1861b362b15af34006e6a11974088a46d42b903418eJohann fclose(wpa_debug_tracing_file); 1871b362b15af34006e6a11974088a46d42b903418eJohann wpa_debug_tracing_file = NULL; 1881b362b15af34006e6a11974088a46d42b903418eJohann} 1891b362b15af34006e6a11974088a46d42b903418eJohann 1901b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_DEBUG_LINUX_TRACING */ 1911b362b15af34006e6a11974088a46d42b903418eJohann 1921b362b15af34006e6a11974088a46d42b903418eJohann 1931b362b15af34006e6a11974088a46d42b903418eJohann/** 1941b362b15af34006e6a11974088a46d42b903418eJohann * wpa_printf - conditional printf 1951b362b15af34006e6a11974088a46d42b903418eJohann * @level: priority level (MSG_*) of the message 1961b362b15af34006e6a11974088a46d42b903418eJohann * @fmt: printf format string, followed by optional arguments 1971b362b15af34006e6a11974088a46d42b903418eJohann * 1981b362b15af34006e6a11974088a46d42b903418eJohann * This function is used to print conditional debugging and error messages. The 1991b362b15af34006e6a11974088a46d42b903418eJohann * output may be directed to stdout, stderr, and/or syslog based on 2001b362b15af34006e6a11974088a46d42b903418eJohann * configuration. 2011b362b15af34006e6a11974088a46d42b903418eJohann * 2021b362b15af34006e6a11974088a46d42b903418eJohann * Note: New line '\n' is added to the end of the text when printing to stdout. 2031b362b15af34006e6a11974088a46d42b903418eJohann */ 2041b362b15af34006e6a11974088a46d42b903418eJohannvoid wpa_printf(int level, const char *fmt, ...) 2051b362b15af34006e6a11974088a46d42b903418eJohann{ 2061b362b15af34006e6a11974088a46d42b903418eJohann va_list ap; 2071b362b15af34006e6a11974088a46d42b903418eJohann 2081b362b15af34006e6a11974088a46d42b903418eJohann va_start(ap, fmt); 2091b362b15af34006e6a11974088a46d42b903418eJohann if (level >= wpa_debug_level) { 2101b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_ANDROID_LOG 2111b362b15af34006e6a11974088a46d42b903418eJohann __android_log_vprint(wpa_to_android_level(level), 212ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin ANDROID_LOG_NAME, fmt, ap); 213ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#else /* CONFIG_ANDROID_LOG */ 214ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#ifdef CONFIG_DEBUG_SYSLOG 215ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin if (wpa_debug_syslog) { 216ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin vsyslog(syslog_priority(level), fmt, ap); 217ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } else { 218ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#endif /* CONFIG_DEBUG_SYSLOG */ 219ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin wpa_debug_print_timestamp(); 220ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#ifdef CONFIG_DEBUG_FILE 221ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin if (out_file) { 222ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin vfprintf(out_file, fmt, ap); 223ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin fprintf(out_file, "\n"); 224ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } else { 225ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#endif /* CONFIG_DEBUG_FILE */ 226ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin vprintf(fmt, ap); 227ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin printf("\n"); 228ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#ifdef CONFIG_DEBUG_FILE 229ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } 230ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#endif /* CONFIG_DEBUG_FILE */ 231ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#ifdef CONFIG_DEBUG_SYSLOG 232ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } 233ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#endif /* CONFIG_DEBUG_SYSLOG */ 234ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#endif /* CONFIG_ANDROID_LOG */ 235ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } 236ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin va_end(ap); 237ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin 238ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#ifdef CONFIG_DEBUG_LINUX_TRACING 239ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin if (wpa_debug_tracing_file != NULL) { 240ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin va_start(ap, fmt); 241ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin fprintf(wpa_debug_tracing_file, WPAS_TRACE_PFX, level); 242ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin vfprintf(wpa_debug_tracing_file, fmt, ap); 243ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin fprintf(wpa_debug_tracing_file, "\n"); 244ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin fflush(wpa_debug_tracing_file); 245ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin va_end(ap); 246ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } 247ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#endif /* CONFIG_DEBUG_LINUX_TRACING */ 248ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin} 249ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin 250ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin 251ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekinstatic void _wpa_hexdump(int level, const char *title, const u8 *buf, 252ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin size_t len, int show) 253ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin{ 254ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin size_t i; 255ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin 256ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#ifdef CONFIG_DEBUG_LINUX_TRACING 257ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin if (wpa_debug_tracing_file != NULL) { 258ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin fprintf(wpa_debug_tracing_file, 259ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin WPAS_TRACE_PFX "%s - hexdump(len=%lu):", 260ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin level, title, (unsigned long) len); 261ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin if (buf == NULL) { 262ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin fprintf(wpa_debug_tracing_file, " [NULL]\n"); 263ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } else if (!show) { 264ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin fprintf(wpa_debug_tracing_file, " [REMOVED]\n"); 265ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } else { 266ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin for (i = 0; i < len; i++) 267ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin fprintf(wpa_debug_tracing_file, 268ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin " %02x", buf[i]); 269ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } 270ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin fflush(wpa_debug_tracing_file); 271ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } 272ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#endif /* CONFIG_DEBUG_LINUX_TRACING */ 273ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin 274ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin if (level < wpa_debug_level) 275ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin return; 276ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin#ifdef CONFIG_ANDROID_LOG 277ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin { 278ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin const char *display; 279ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin char *strbuf = NULL; 280ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin size_t slen = len; 281ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin if (buf == NULL) { 282ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin display = " [NULL]"; 283ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } else if (len == 0) { 284ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin display = ""; 285ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin } else if (show && len) { 286ca15b5fc158a9df465aaf1acfe38d8cb5042c81bKunter Gultekin /* Limit debug message length for Android log */ 2871b362b15af34006e6a11974088a46d42b903418eJohann if (slen > 32) 2881b362b15af34006e6a11974088a46d42b903418eJohann slen = 32; 2891b362b15af34006e6a11974088a46d42b903418eJohann strbuf = os_malloc(1 + 3 * slen); 2901b362b15af34006e6a11974088a46d42b903418eJohann if (strbuf == NULL) { 2911b362b15af34006e6a11974088a46d42b903418eJohann wpa_printf(MSG_ERROR, "wpa_hexdump: Failed to " 2921b362b15af34006e6a11974088a46d42b903418eJohann "allocate message buffer"); 2931b362b15af34006e6a11974088a46d42b903418eJohann return; 2941b362b15af34006e6a11974088a46d42b903418eJohann } 2951b362b15af34006e6a11974088a46d42b903418eJohann 2961b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < slen; i++) 2971b362b15af34006e6a11974088a46d42b903418eJohann os_snprintf(&strbuf[i * 3], 4, " %02x", 2981b362b15af34006e6a11974088a46d42b903418eJohann buf[i]); 2991b362b15af34006e6a11974088a46d42b903418eJohann 3001b362b15af34006e6a11974088a46d42b903418eJohann display = strbuf; 3011b362b15af34006e6a11974088a46d42b903418eJohann } else { 3021b362b15af34006e6a11974088a46d42b903418eJohann display = " [REMOVED]"; 3031b362b15af34006e6a11974088a46d42b903418eJohann } 3041b362b15af34006e6a11974088a46d42b903418eJohann 3051b362b15af34006e6a11974088a46d42b903418eJohann __android_log_print(wpa_to_android_level(level), 3061b362b15af34006e6a11974088a46d42b903418eJohann ANDROID_LOG_NAME, 3071b362b15af34006e6a11974088a46d42b903418eJohann "%s - hexdump(len=%lu):%s%s", 3081b362b15af34006e6a11974088a46d42b903418eJohann title, (long unsigned int) len, display, 3091b362b15af34006e6a11974088a46d42b903418eJohann len > slen ? " ..." : ""); 3101b362b15af34006e6a11974088a46d42b903418eJohann os_free(strbuf); 3111b362b15af34006e6a11974088a46d42b903418eJohann return; 3121b362b15af34006e6a11974088a46d42b903418eJohann } 3131b362b15af34006e6a11974088a46d42b903418eJohann#else /* CONFIG_ANDROID_LOG */ 3141b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_DEBUG_SYSLOG 3151b362b15af34006e6a11974088a46d42b903418eJohann if (wpa_debug_syslog) { 3161b362b15af34006e6a11974088a46d42b903418eJohann const char *display; 3171b362b15af34006e6a11974088a46d42b903418eJohann char *strbuf = NULL; 3181b362b15af34006e6a11974088a46d42b903418eJohann 3191b362b15af34006e6a11974088a46d42b903418eJohann if (buf == NULL) { 3201b362b15af34006e6a11974088a46d42b903418eJohann display = " [NULL]"; 3211b362b15af34006e6a11974088a46d42b903418eJohann } else if (len == 0) { 3221b362b15af34006e6a11974088a46d42b903418eJohann display = ""; 3231b362b15af34006e6a11974088a46d42b903418eJohann } else if (show && len) { 3241b362b15af34006e6a11974088a46d42b903418eJohann strbuf = os_malloc(1 + 3 * len); 3251b362b15af34006e6a11974088a46d42b903418eJohann if (strbuf == NULL) { 3261b362b15af34006e6a11974088a46d42b903418eJohann wpa_printf(MSG_ERROR, "wpa_hexdump: Failed to " 3271b362b15af34006e6a11974088a46d42b903418eJohann "allocate message buffer"); 3281b362b15af34006e6a11974088a46d42b903418eJohann return; 3291b362b15af34006e6a11974088a46d42b903418eJohann } 3301b362b15af34006e6a11974088a46d42b903418eJohann 3311b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < len; i++) 3321b362b15af34006e6a11974088a46d42b903418eJohann os_snprintf(&strbuf[i * 3], 4, " %02x", 3331b362b15af34006e6a11974088a46d42b903418eJohann buf[i]); 3341b362b15af34006e6a11974088a46d42b903418eJohann 3351b362b15af34006e6a11974088a46d42b903418eJohann display = strbuf; 3361b362b15af34006e6a11974088a46d42b903418eJohann } else { 3371b362b15af34006e6a11974088a46d42b903418eJohann display = " [REMOVED]"; 3381b362b15af34006e6a11974088a46d42b903418eJohann } 3391b362b15af34006e6a11974088a46d42b903418eJohann 3401b362b15af34006e6a11974088a46d42b903418eJohann syslog(syslog_priority(level), "%s - hexdump(len=%lu):%s", 3411b362b15af34006e6a11974088a46d42b903418eJohann title, (unsigned long) len, display); 3421b362b15af34006e6a11974088a46d42b903418eJohann os_free(strbuf); 3431b362b15af34006e6a11974088a46d42b903418eJohann return; 3441b362b15af34006e6a11974088a46d42b903418eJohann } 3451b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_DEBUG_SYSLOG */ 3461b362b15af34006e6a11974088a46d42b903418eJohann wpa_debug_print_timestamp(); 3471b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_DEBUG_FILE 3481b362b15af34006e6a11974088a46d42b903418eJohann if (out_file) { 3491b362b15af34006e6a11974088a46d42b903418eJohann fprintf(out_file, "%s - hexdump(len=%lu):", 3501b362b15af34006e6a11974088a46d42b903418eJohann title, (unsigned long) len); 3511b362b15af34006e6a11974088a46d42b903418eJohann if (buf == NULL) { 3521b362b15af34006e6a11974088a46d42b903418eJohann fprintf(out_file, " [NULL]"); 3531b362b15af34006e6a11974088a46d42b903418eJohann } else if (show) { 3541b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < len; i++) 3551b362b15af34006e6a11974088a46d42b903418eJohann fprintf(out_file, " %02x", buf[i]); 3561b362b15af34006e6a11974088a46d42b903418eJohann } else { 3571b362b15af34006e6a11974088a46d42b903418eJohann fprintf(out_file, " [REMOVED]"); 3581b362b15af34006e6a11974088a46d42b903418eJohann } 3591b362b15af34006e6a11974088a46d42b903418eJohann fprintf(out_file, "\n"); 3601b362b15af34006e6a11974088a46d42b903418eJohann } else { 3611b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_DEBUG_FILE */ 3621b362b15af34006e6a11974088a46d42b903418eJohann printf("%s - hexdump(len=%lu):", title, (unsigned long) len); 3631b362b15af34006e6a11974088a46d42b903418eJohann if (buf == NULL) { 3641b362b15af34006e6a11974088a46d42b903418eJohann printf(" [NULL]"); 3651b362b15af34006e6a11974088a46d42b903418eJohann } else if (show) { 3661b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < len; i++) 3671b362b15af34006e6a11974088a46d42b903418eJohann printf(" %02x", buf[i]); 3681b362b15af34006e6a11974088a46d42b903418eJohann } else { 3691b362b15af34006e6a11974088a46d42b903418eJohann printf(" [REMOVED]"); 3701b362b15af34006e6a11974088a46d42b903418eJohann } 3711b362b15af34006e6a11974088a46d42b903418eJohann printf("\n"); 3721b362b15af34006e6a11974088a46d42b903418eJohann#ifdef CONFIG_DEBUG_FILE 3731b362b15af34006e6a11974088a46d42b903418eJohann } 3741b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_DEBUG_FILE */ 3751b362b15af34006e6a11974088a46d42b903418eJohann#endif /* CONFIG_ANDROID_LOG */ 376} 377 378void wpa_hexdump(int level, const char *title, const void *buf, size_t len) 379{ 380 _wpa_hexdump(level, title, buf, len, 1); 381} 382 383 384void wpa_hexdump_key(int level, const char *title, const void *buf, size_t len) 385{ 386 _wpa_hexdump(level, title, buf, len, wpa_debug_show_keys); 387} 388 389 390static void _wpa_hexdump_ascii(int level, const char *title, const void *buf, 391 size_t len, int show) 392{ 393 size_t i, llen; 394 const u8 *pos = buf; 395 const size_t line_len = 16; 396 397#ifdef CONFIG_DEBUG_LINUX_TRACING 398 if (wpa_debug_tracing_file != NULL) { 399 fprintf(wpa_debug_tracing_file, 400 WPAS_TRACE_PFX "%s - hexdump_ascii(len=%lu):", 401 level, title, (unsigned long) len); 402 if (buf == NULL) { 403 fprintf(wpa_debug_tracing_file, " [NULL]\n"); 404 } else if (!show) { 405 fprintf(wpa_debug_tracing_file, " [REMOVED]\n"); 406 } else { 407 /* can do ascii processing in userspace */ 408 for (i = 0; i < len; i++) 409 fprintf(wpa_debug_tracing_file, 410 " %02x", pos[i]); 411 } 412 fflush(wpa_debug_tracing_file); 413 } 414#endif /* CONFIG_DEBUG_LINUX_TRACING */ 415 416 if (level < wpa_debug_level) 417 return; 418#ifdef CONFIG_ANDROID_LOG 419 _wpa_hexdump(level, title, buf, len, show); 420#else /* CONFIG_ANDROID_LOG */ 421 wpa_debug_print_timestamp(); 422#ifdef CONFIG_DEBUG_FILE 423 if (out_file) { 424 if (!show) { 425 fprintf(out_file, 426 "%s - hexdump_ascii(len=%lu): [REMOVED]\n", 427 title, (unsigned long) len); 428 return; 429 } 430 if (buf == NULL) { 431 fprintf(out_file, 432 "%s - hexdump_ascii(len=%lu): [NULL]\n", 433 title, (unsigned long) len); 434 return; 435 } 436 fprintf(out_file, "%s - hexdump_ascii(len=%lu):\n", 437 title, (unsigned long) len); 438 while (len) { 439 llen = len > line_len ? line_len : len; 440 fprintf(out_file, " "); 441 for (i = 0; i < llen; i++) 442 fprintf(out_file, " %02x", pos[i]); 443 for (i = llen; i < line_len; i++) 444 fprintf(out_file, " "); 445 fprintf(out_file, " "); 446 for (i = 0; i < llen; i++) { 447 if (isprint(pos[i])) 448 fprintf(out_file, "%c", pos[i]); 449 else 450 fprintf(out_file, "_"); 451 } 452 for (i = llen; i < line_len; i++) 453 fprintf(out_file, " "); 454 fprintf(out_file, "\n"); 455 pos += llen; 456 len -= llen; 457 } 458 } else { 459#endif /* CONFIG_DEBUG_FILE */ 460 if (!show) { 461 printf("%s - hexdump_ascii(len=%lu): [REMOVED]\n", 462 title, (unsigned long) len); 463 return; 464 } 465 if (buf == NULL) { 466 printf("%s - hexdump_ascii(len=%lu): [NULL]\n", 467 title, (unsigned long) len); 468 return; 469 } 470 printf("%s - hexdump_ascii(len=%lu):\n", title, (unsigned long) len); 471 while (len) { 472 llen = len > line_len ? line_len : len; 473 printf(" "); 474 for (i = 0; i < llen; i++) 475 printf(" %02x", pos[i]); 476 for (i = llen; i < line_len; i++) 477 printf(" "); 478 printf(" "); 479 for (i = 0; i < llen; i++) { 480 if (isprint(pos[i])) 481 printf("%c", pos[i]); 482 else 483 printf("_"); 484 } 485 for (i = llen; i < line_len; i++) 486 printf(" "); 487 printf("\n"); 488 pos += llen; 489 len -= llen; 490 } 491#ifdef CONFIG_DEBUG_FILE 492 } 493#endif /* CONFIG_DEBUG_FILE */ 494#endif /* CONFIG_ANDROID_LOG */ 495} 496 497 498void wpa_hexdump_ascii(int level, const char *title, const void *buf, 499 size_t len) 500{ 501 _wpa_hexdump_ascii(level, title, buf, len, 1); 502} 503 504 505void wpa_hexdump_ascii_key(int level, const char *title, const void *buf, 506 size_t len) 507{ 508 _wpa_hexdump_ascii(level, title, buf, len, wpa_debug_show_keys); 509} 510 511 512#ifdef CONFIG_DEBUG_FILE 513static char *last_path = NULL; 514#endif /* CONFIG_DEBUG_FILE */ 515 516int wpa_debug_reopen_file(void) 517{ 518#ifdef CONFIG_DEBUG_FILE 519 int rv; 520 if (last_path) { 521 char *tmp = os_strdup(last_path); 522 wpa_debug_close_file(); 523 rv = wpa_debug_open_file(tmp); 524 os_free(tmp); 525 } else { 526 wpa_printf(MSG_ERROR, "Last-path was not set, cannot " 527 "re-open log file."); 528 rv = -1; 529 } 530 return rv; 531#else /* CONFIG_DEBUG_FILE */ 532 return 0; 533#endif /* CONFIG_DEBUG_FILE */ 534} 535 536 537int wpa_debug_open_file(const char *path) 538{ 539#ifdef CONFIG_DEBUG_FILE 540 if (!path) 541 return 0; 542 543 if (last_path == NULL || os_strcmp(last_path, path) != 0) { 544 /* Save our path to enable re-open */ 545 os_free(last_path); 546 last_path = os_strdup(path); 547 } 548 549 out_file = fopen(path, "a"); 550 if (out_file == NULL) { 551 wpa_printf(MSG_ERROR, "wpa_debug_open_file: Failed to open " 552 "output file, using standard output"); 553 return -1; 554 } 555#ifndef _WIN32 556 setvbuf(out_file, NULL, _IOLBF, 0); 557#endif /* _WIN32 */ 558#endif /* CONFIG_DEBUG_FILE */ 559 return 0; 560} 561 562 563void wpa_debug_close_file(void) 564{ 565#ifdef CONFIG_DEBUG_FILE 566 if (!out_file) 567 return; 568 fclose(out_file); 569 out_file = NULL; 570 os_free(last_path); 571 last_path = NULL; 572#endif /* CONFIG_DEBUG_FILE */ 573} 574 575#endif /* CONFIG_NO_STDOUT_DEBUG */ 576 577 578#ifndef CONFIG_NO_WPA_MSG 579static wpa_msg_cb_func wpa_msg_cb = NULL; 580 581void wpa_msg_register_cb(wpa_msg_cb_func func) 582{ 583 wpa_msg_cb = func; 584} 585 586 587static wpa_msg_get_ifname_func wpa_msg_ifname_cb = NULL; 588 589void wpa_msg_register_ifname_cb(wpa_msg_get_ifname_func func) 590{ 591 wpa_msg_ifname_cb = func; 592} 593 594 595void wpa_msg(void *ctx, int level, const char *fmt, ...) 596{ 597 va_list ap; 598 char *buf; 599 int buflen; 600 int len; 601 char prefix[130]; 602 603 va_start(ap, fmt); 604 buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 605 va_end(ap); 606 607 buf = os_malloc(buflen); 608 if (buf == NULL) { 609 wpa_printf(MSG_ERROR, "wpa_msg: Failed to allocate message " 610 "buffer"); 611 return; 612 } 613 va_start(ap, fmt); 614 prefix[0] = '\0'; 615 if (wpa_msg_ifname_cb) { 616 const char *ifname = wpa_msg_ifname_cb(ctx); 617 if (ifname) { 618 int res = os_snprintf(prefix, sizeof(prefix), "%s: ", 619 ifname); 620 if (res < 0 || res >= (int) sizeof(prefix)) 621 prefix[0] = '\0'; 622 } 623 } 624 len = vsnprintf(buf, buflen, fmt, ap); 625 va_end(ap); 626 wpa_printf(level, "%s%s", prefix, buf); 627 if (wpa_msg_cb) 628 wpa_msg_cb(ctx, level, 0, buf, len); 629 os_free(buf); 630} 631 632 633void wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...) 634{ 635 va_list ap; 636 char *buf; 637 int buflen; 638 int len; 639 640 if (!wpa_msg_cb) 641 return; 642 643 va_start(ap, fmt); 644 buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 645 va_end(ap); 646 647 buf = os_malloc(buflen); 648 if (buf == NULL) { 649 wpa_printf(MSG_ERROR, "wpa_msg_ctrl: Failed to allocate " 650 "message buffer"); 651 return; 652 } 653 va_start(ap, fmt); 654 len = vsnprintf(buf, buflen, fmt, ap); 655 va_end(ap); 656 wpa_msg_cb(ctx, level, 0, buf, len); 657 os_free(buf); 658} 659 660 661void wpa_msg_global(void *ctx, int level, const char *fmt, ...) 662{ 663 va_list ap; 664 char *buf; 665 int buflen; 666 int len; 667 668 va_start(ap, fmt); 669 buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 670 va_end(ap); 671 672 buf = os_malloc(buflen); 673 if (buf == NULL) { 674 wpa_printf(MSG_ERROR, "wpa_msg_global: Failed to allocate " 675 "message buffer"); 676 return; 677 } 678 va_start(ap, fmt); 679 len = vsnprintf(buf, buflen, fmt, ap); 680 va_end(ap); 681 wpa_printf(level, "%s", buf); 682 if (wpa_msg_cb) 683 wpa_msg_cb(ctx, level, 1, buf, len); 684 os_free(buf); 685} 686 687 688void wpa_msg_global_ctrl(void *ctx, int level, const char *fmt, ...) 689{ 690 va_list ap; 691 char *buf; 692 int buflen; 693 int len; 694 695 if (!wpa_msg_cb) 696 return; 697 698 va_start(ap, fmt); 699 buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 700 va_end(ap); 701 702 buf = os_malloc(buflen); 703 if (buf == NULL) { 704 wpa_printf(MSG_ERROR, 705 "wpa_msg_global_ctrl: Failed to allocate message buffer"); 706 return; 707 } 708 va_start(ap, fmt); 709 len = vsnprintf(buf, buflen, fmt, ap); 710 va_end(ap); 711 wpa_msg_cb(ctx, level, 1, buf, len); 712 os_free(buf); 713} 714 715 716void wpa_msg_no_global(void *ctx, int level, const char *fmt, ...) 717{ 718 va_list ap; 719 char *buf; 720 int buflen; 721 int len; 722 723 va_start(ap, fmt); 724 buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 725 va_end(ap); 726 727 buf = os_malloc(buflen); 728 if (buf == NULL) { 729 wpa_printf(MSG_ERROR, "wpa_msg_no_global: Failed to allocate " 730 "message buffer"); 731 return; 732 } 733 va_start(ap, fmt); 734 len = vsnprintf(buf, buflen, fmt, ap); 735 va_end(ap); 736 wpa_printf(level, "%s", buf); 737 if (wpa_msg_cb) 738 wpa_msg_cb(ctx, level, 2, buf, len); 739 os_free(buf); 740} 741 742#endif /* CONFIG_NO_WPA_MSG */ 743 744 745#ifndef CONFIG_NO_HOSTAPD_LOGGER 746static hostapd_logger_cb_func hostapd_logger_cb = NULL; 747 748void hostapd_logger_register_cb(hostapd_logger_cb_func func) 749{ 750 hostapd_logger_cb = func; 751} 752 753 754void hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level, 755 const char *fmt, ...) 756{ 757 va_list ap; 758 char *buf; 759 int buflen; 760 int len; 761 762 va_start(ap, fmt); 763 buflen = vsnprintf(NULL, 0, fmt, ap) + 1; 764 va_end(ap); 765 766 buf = os_malloc(buflen); 767 if (buf == NULL) { 768 wpa_printf(MSG_ERROR, "hostapd_logger: Failed to allocate " 769 "message buffer"); 770 return; 771 } 772 va_start(ap, fmt); 773 len = vsnprintf(buf, buflen, fmt, ap); 774 va_end(ap); 775 if (hostapd_logger_cb) 776 hostapd_logger_cb(ctx, addr, module, level, buf, len); 777 else if (addr) 778 wpa_printf(MSG_DEBUG, "hostapd_logger: STA " MACSTR " - %s", 779 MAC2STR(addr), buf); 780 else 781 wpa_printf(MSG_DEBUG, "hostapd_logger: %s", buf); 782 os_free(buf); 783} 784#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 785