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