18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_supplicant/hostapd / Debug prints
3b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt * Copyright (c) 2002-2013, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <syslog.h>
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_debug_syslog = 0;
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING
2004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <sys/types.h>
2104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <sys/stat.h>
2204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <fcntl.h>
2304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <string.h>
2404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <stdio.h>
2504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic FILE *wpa_debug_tracing_file = NULL;
2704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#define WPAS_TRACE_PFX "wpas <%d>: "
2904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */
3004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_level = MSG_INFO;
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_show_keys = 0;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_timestamp = 0;
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_ANDROID_LOG
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <android/log.h>
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt#ifndef ANDROID_LOG_NAME
42648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt#define ANDROID_LOG_NAME	"wpa_supplicant"
431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* ANDROID_LOG_NAME */
44648b7492d15bb4efaeebdfdd8bd261563a5f6227Dmitry Shmidt
4504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_to_android_level(int level)
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (level == MSG_ERROR)
4804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return ANDROID_LOG_ERROR;
4904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (level == MSG_WARNING)
5004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return ANDROID_LOG_WARN;
5104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (level == MSG_INFO)
5204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return ANDROID_LOG_INFO;
5304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return ANDROID_LOG_DEBUG;
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_ANDROID_LOG */
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_STDOUT_DEBUG
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic FILE *out_file = NULL;
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_print_timestamp(void)
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifndef CONFIG_ANDROID_LOG
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct os_time tv;
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_debug_timestamp)
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_get_time(&tv);
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (out_file) {
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		fprintf(out_file, "%ld.%06u: ", (long) tv.sec,
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			(unsigned int) tv.usec);
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%ld.%06u: ", (long) tv.sec, (unsigned int) tv.usec);
8104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_ANDROID_LOG */
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef LOG_HOSTAPD
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define LOG_HOSTAPD LOG_DAEMON
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* LOG_HOSTAPD */
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_open_syslog(void)
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	openlog("wpa_supplicant", LOG_PID | LOG_NDELAY, LOG_HOSTAPD);
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_debug_syslog++;
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_close_syslog(void)
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_debug_syslog)
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		closelog();
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int syslog_priority(int level)
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch (level) {
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case MSG_MSGDUMP:
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case MSG_DEBUG:
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return LOG_DEBUG;
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case MSG_INFO:
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return LOG_NOTICE;
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case MSG_WARNING:
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return LOG_WARNING;
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case MSG_ERROR:
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return LOG_ERR;
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return LOG_INFO;
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING
12304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
12404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint wpa_debug_open_linux_tracing(void)
12504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
12604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	int mounts, trace_fd;
12704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char buf[4096] = {};
12804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ssize_t buflen;
12904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *line, *tmp1, *path = NULL;
13004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
13104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	mounts = open("/proc/mounts", O_RDONLY);
13204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (mounts < 0) {
13304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("no /proc/mounts\n");
13404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
13504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
13604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
13704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	buflen = read(mounts, buf, sizeof(buf) - 1);
13804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	close(mounts);
13904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (buflen < 0) {
14004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("failed to read /proc/mounts\n");
14104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
14204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
14304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
14404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	line = strtok_r(buf, "\n", &tmp1);
14504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	while (line) {
14604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		char *tmp2, *tmp_path, *fstype;
14704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		/* "<dev> <mountpoint> <fs type> ..." */
14804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		strtok_r(line, " ", &tmp2);
14904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		tmp_path = strtok_r(NULL, " ", &tmp2);
15004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		fstype = strtok_r(NULL, " ", &tmp2);
15104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (strcmp(fstype, "debugfs") == 0) {
15204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			path = tmp_path;
15304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			break;
15404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		}
15504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
15604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		line = strtok_r(NULL, "\n", &tmp1);
15704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
15804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
15904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (path == NULL) {
16004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("debugfs mountpoint not found\n");
16104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
16204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
16304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
16404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	snprintf(buf, sizeof(buf) - 1, "%s/tracing/trace_marker", path);
16504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
16604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	trace_fd = open(buf, O_WRONLY);
16704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (trace_fd < 0) {
16804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("failed to open trace_marker file\n");
16904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
17004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
17104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_debug_tracing_file = fdopen(trace_fd, "w");
17204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_debug_tracing_file == NULL) {
17304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		close(trace_fd);
17404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("failed to fdopen()\n");
17504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
17604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
17704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
17804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return 0;
17904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
18004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
18104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
18204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpa_debug_close_linux_tracing(void)
18304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
18404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_debug_tracing_file == NULL)
18504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
18604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	fclose(wpa_debug_tracing_file);
18704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_debug_tracing_file = NULL;
18804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
18904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
19004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */
19104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
19204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_printf - conditional printf
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @level: priority level (MSG_*) of the message
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @fmt: printf format string, followed by optional arguments
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is used to print conditional debugging and error messages. The
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration.
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Note: New line '\n' is added to the end of the text when printing to stdout.
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_printf(int level, const char *fmt, ...)
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_list ap;
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_start(ap, fmt);
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (level >= wpa_debug_level) {
21004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_ANDROID_LOG
21104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		__android_log_vprint(wpa_to_android_level(level),
21204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     ANDROID_LOG_NAME, fmt, ap);
21304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#else /* CONFIG_ANDROID_LOG */
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_debug_syslog) {
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			vsyslog(syslog_priority(level), fmt, ap);
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_debug_print_timestamp();
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (out_file) {
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			vfprintf(out_file, fmt, ap);
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			fprintf(out_file, "\n");
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		vprintf(fmt, ap);
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("\n");
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */
23404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_ANDROID_LOG */
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_end(ap);
23704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
23804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING
23904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_debug_tracing_file != NULL) {
24004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		va_start(ap, fmt);
24104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		fprintf(wpa_debug_tracing_file, WPAS_TRACE_PFX, level);
24204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		vfprintf(wpa_debug_tracing_file, fmt, ap);
24304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		fprintf(wpa_debug_tracing_file, "\n");
24404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		fflush(wpa_debug_tracing_file);
24504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		va_end(ap);
24604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
24704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void _wpa_hexdump(int level, const char *title, const u8 *buf,
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 size_t len, int show)
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t i;
25504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
25604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING
25704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_debug_tracing_file != NULL) {
25804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		fprintf(wpa_debug_tracing_file,
25904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_TRACE_PFX "%s - hexdump(len=%lu):",
26004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			level, title, (unsigned long) len);
26104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (buf == NULL) {
26204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			fprintf(wpa_debug_tracing_file, " [NULL]\n");
26304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else if (!show) {
26404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			fprintf(wpa_debug_tracing_file, " [REMOVED]\n");
26504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else {
26604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			for (i = 0; i < len; i++)
26704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				fprintf(wpa_debug_tracing_file,
26804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					" %02x", buf[i]);
26904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		}
27004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		fflush(wpa_debug_tracing_file);
27104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
27204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */
27304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (level < wpa_debug_level)
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
27604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_ANDROID_LOG
27704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	{
27804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		const char *display;
27904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		char *strbuf = NULL;
28004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		size_t slen = len;
28104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (buf == NULL) {
28204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			display = " [NULL]";
28304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else if (len == 0) {
28404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			display = "";
28504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else if (show && len) {
28604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			/* Limit debug message length for Android log */
28704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			if (slen > 32)
28804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				slen = 32;
28904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			strbuf = os_malloc(1 + 3 * slen);
29004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			if (strbuf == NULL) {
29104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				wpa_printf(MSG_ERROR, "wpa_hexdump: Failed to "
29204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   "allocate message buffer");
29304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				return;
29404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			}
29504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
29604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			for (i = 0; i < slen; i++)
29704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				os_snprintf(&strbuf[i * 3], 4, " %02x",
29804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					    buf[i]);
29904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
30004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			display = strbuf;
30104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else {
30204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			display = " [REMOVED]";
30304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		}
30404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
30504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		__android_log_print(wpa_to_android_level(level),
30604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				    ANDROID_LOG_NAME,
30704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				    "%s - hexdump(len=%lu):%s%s",
30804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				    title, (long unsigned int) len, display,
30904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				    len > slen ? " ..." : "");
31004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(strbuf);
31104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
31204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
31304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#else /* CONFIG_ANDROID_LOG */
314c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef CONFIG_DEBUG_SYSLOG
315c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	if (wpa_debug_syslog) {
316c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		const char *display;
317c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		char *strbuf = NULL;
318c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
319c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		if (buf == NULL) {
320c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			display = " [NULL]";
321c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		} else if (len == 0) {
322c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			display = "";
323c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		} else if (show && len) {
324c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			strbuf = os_malloc(1 + 3 * len);
325c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			if (strbuf == NULL) {
326c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				wpa_printf(MSG_ERROR, "wpa_hexdump: Failed to "
327c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					   "allocate message buffer");
328c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				return;
329c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			}
330c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
331c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			for (i = 0; i < len; i++)
332c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				os_snprintf(&strbuf[i * 3], 4, " %02x",
333c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					    buf[i]);
334c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
335c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			display = strbuf;
336c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		} else {
337c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			display = " [REMOVED]";
338c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		}
339c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
340c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		syslog(syslog_priority(level), "%s - hexdump(len=%lu):%s",
34104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       title, (unsigned long) len, display);
342c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		os_free(strbuf);
343c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		return;
344c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	}
345c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif /* CONFIG_DEBUG_SYSLOG */
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_debug_print_timestamp();
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (out_file) {
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		fprintf(out_file, "%s - hexdump(len=%lu):",
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			title, (unsigned long) len);
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (buf == NULL) {
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			fprintf(out_file, " [NULL]");
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (show) {
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < len; i++)
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				fprintf(out_file, " %02x", buf[i]);
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			fprintf(out_file, " [REMOVED]");
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		fprintf(out_file, "\n");
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s - hexdump(len=%lu):", title, (unsigned long) len);
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (buf == NULL) {
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf(" [NULL]");
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (show) {
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < len; i++)
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf(" %02x", buf[i]);
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf(" [REMOVED]");
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("\n");
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
37504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_ANDROID_LOG */
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump(int level, const char *title, const void *buf, size_t len)
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	_wpa_hexdump(level, title, buf, len, 1);
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
384fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_key(int level, const char *title, const void *buf, size_t len)
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	_wpa_hexdump(level, title, buf, len, wpa_debug_show_keys);
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
390fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtstatic void _wpa_hexdump_ascii(int level, const char *title, const void *buf,
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       size_t len, int show)
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t i, llen;
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *pos = buf;
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const size_t line_len = 16;
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_DEBUG_LINUX_TRACING
39804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_debug_tracing_file != NULL) {
39904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		fprintf(wpa_debug_tracing_file,
40004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_TRACE_PFX "%s - hexdump_ascii(len=%lu):",
40104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			level, title, (unsigned long) len);
40204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (buf == NULL) {
40304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			fprintf(wpa_debug_tracing_file, " [NULL]\n");
40404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else if (!show) {
40504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			fprintf(wpa_debug_tracing_file, " [REMOVED]\n");
40604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else {
40704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			/* can do ascii processing in userspace */
40804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			for (i = 0; i < len; i++)
40904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				fprintf(wpa_debug_tracing_file,
410fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt					" %02x", pos[i]);
41104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		}
41204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		fflush(wpa_debug_tracing_file);
41304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
41404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_DEBUG_LINUX_TRACING */
41504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (level < wpa_debug_level)
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
41804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_ANDROID_LOG
41904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	_wpa_hexdump(level, title, buf, len, show);
42004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#else /* CONFIG_ANDROID_LOG */
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_debug_print_timestamp();
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (out_file) {
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!show) {
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			fprintf(out_file,
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"%s - hexdump_ascii(len=%lu): [REMOVED]\n",
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				title, (unsigned long) len);
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (buf == NULL) {
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			fprintf(out_file,
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"%s - hexdump_ascii(len=%lu): [NULL]\n",
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				title, (unsigned long) len);
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		fprintf(out_file, "%s - hexdump_ascii(len=%lu):\n",
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			title, (unsigned long) len);
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (len) {
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			llen = len > line_len ? line_len : len;
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			fprintf(out_file, "    ");
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < llen; i++)
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				fprintf(out_file, " %02x", pos[i]);
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = llen; i < line_len; i++)
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				fprintf(out_file, "   ");
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			fprintf(out_file, "   ");
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < llen; i++) {
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (isprint(pos[i]))
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					fprintf(out_file, "%c", pos[i]);
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				else
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					fprintf(out_file, "_");
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = llen; i < line_len; i++)
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				fprintf(out_file, " ");
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			fprintf(out_file, "\n");
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos += llen;
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			len -= llen;
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!show) {
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s - hexdump_ascii(len=%lu): [REMOVED]\n",
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       title, (unsigned long) len);
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (buf == NULL) {
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s - hexdump_ascii(len=%lu): [NULL]\n",
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       title, (unsigned long) len);
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s - hexdump_ascii(len=%lu):\n", title, (unsigned long) len);
4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (len) {
4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		llen = len > line_len ? line_len : len;
4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("    ");
4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < llen; i++)
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf(" %02x", pos[i]);
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = llen; i < line_len; i++)
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("   ");
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("   ");
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < llen; i++) {
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (isprint(pos[i]))
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("%c", pos[i]);
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("_");
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = llen; i < line_len; i++)
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf(" ");
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("\n");
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += llen;
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len -= llen;
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_ANDROID_LOG */
4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
498fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_ascii(int level, const char *title, const void *buf,
499fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		       size_t len)
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	_wpa_hexdump_ascii(level, title, buf, len, 1);
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
505fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtvoid wpa_hexdump_ascii_key(int level, const char *title, const void *buf,
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   size_t len)
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	_wpa_hexdump_ascii(level, title, buf, len, wpa_debug_show_keys);
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char *last_path = NULL;
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_reopen_file(void)
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int rv;
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (last_path) {
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char *tmp = os_strdup(last_path);
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_debug_close_file();
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		rv = wpa_debug_open_file(tmp);
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(tmp);
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "Last-path was not set, cannot "
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "re-open log file.");
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		rv = -1;
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return rv;
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_DEBUG_FILE */
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_debug_open_file(const char *path)
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!path)
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (last_path == NULL || os_strcmp(last_path, path) != 0) {
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Save our path to enable re-open */
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(last_path);
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		last_path = os_strdup(path);
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	out_file = fopen(path, "a");
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (out_file == NULL) {
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpa_debug_open_file: Failed to open "
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "output file, using standard output");
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	setvbuf(out_file, NULL, _IOLBF, 0);
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32 */
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_debug_close_file(void)
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_DEBUG_FILE
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!out_file)
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fclose(out_file);
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	out_file = NULL;
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(last_path);
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	last_path = NULL;
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_STDOUT_DEBUG */
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_WPA_MSG
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic wpa_msg_cb_func wpa_msg_cb = NULL;
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_register_cb(wpa_msg_cb_func func)
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_msg_cb = func;
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic wpa_msg_get_ifname_func wpa_msg_ifname_cb = NULL;
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_register_ifname_cb(wpa_msg_get_ifname_func func)
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_msg_ifname_cb = func;
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg(void *ctx, int level, const char *fmt, ...)
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_list ap;
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *buf;
59913ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	int buflen;
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char prefix[130];
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
60313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	va_start(ap, fmt);
60413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	buflen = vsnprintf(NULL, 0, fmt, ap) + 1;
60513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	va_end(ap);
60613ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf = os_malloc(buflen);
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (buf == NULL) {
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpa_msg: Failed to allocate message "
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "buffer");
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_start(ap, fmt);
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	prefix[0] = '\0';
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_msg_ifname_cb) {
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *ifname = wpa_msg_ifname_cb(ctx);
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ifname) {
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			int res = os_snprintf(prefix, sizeof(prefix), "%s: ",
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      ifname);
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (res < 0 || res >= (int) sizeof(prefix))
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				prefix[0] = '\0';
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = vsnprintf(buf, buflen, fmt, ap);
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_end(ap);
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_printf(level, "%s%s", prefix, buf);
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_msg_cb)
628b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		wpa_msg_cb(ctx, level, 0, buf, len);
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(buf);
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...)
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_list ap;
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *buf;
63713ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	int buflen;
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_msg_cb)
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
64313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	va_start(ap, fmt);
64413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	buflen = vsnprintf(NULL, 0, fmt, ap) + 1;
64513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	va_end(ap);
64613ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf = os_malloc(buflen);
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (buf == NULL) {
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpa_msg_ctrl: Failed to allocate "
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "message buffer");
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_start(ap, fmt);
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = vsnprintf(buf, buflen, fmt, ap);
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_end(ap);
656b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	wpa_msg_cb(ctx, level, 0, buf, len);
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(buf);
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
659b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
660b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
661b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtvoid wpa_msg_global(void *ctx, int level, const char *fmt, ...)
662b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt{
663b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	va_list ap;
664b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	char *buf;
66513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	int buflen;
666b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	int len;
667b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
66813ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	va_start(ap, fmt);
66913ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	buflen = vsnprintf(NULL, 0, fmt, ap) + 1;
67013ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	va_end(ap);
67113ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
672b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	buf = os_malloc(buflen);
673b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	if (buf == NULL) {
674b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpa_msg_global: Failed to allocate "
675b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			   "message buffer");
676b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		return;
677b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	}
678b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	va_start(ap, fmt);
679b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	len = vsnprintf(buf, buflen, fmt, ap);
680b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	va_end(ap);
681b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	wpa_printf(level, "%s", buf);
682b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	if (wpa_msg_cb)
683b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		wpa_msg_cb(ctx, level, 1, buf, len);
684b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	os_free(buf);
685b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt}
686b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
687b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
6887f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidtvoid wpa_msg_global_ctrl(void *ctx, int level, const char *fmt, ...)
6897f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt{
6907f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	va_list ap;
6917f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	char *buf;
6927f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	int buflen;
6937f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	int len;
6947f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt
6957f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	if (!wpa_msg_cb)
6967f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt		return;
6977f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt
6987f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	va_start(ap, fmt);
6997f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	buflen = vsnprintf(NULL, 0, fmt, ap) + 1;
7007f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	va_end(ap);
7017f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt
7027f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	buf = os_malloc(buflen);
7037f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	if (buf == NULL) {
7047f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt		wpa_printf(MSG_ERROR,
7057f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt			   "wpa_msg_global_ctrl: Failed to allocate message buffer");
7067f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt		return;
7077f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	}
7087f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	va_start(ap, fmt);
7097f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	len = vsnprintf(buf, buflen, fmt, ap);
7107f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	va_end(ap);
7117f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	wpa_msg_cb(ctx, level, 1, buf, len);
7127f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt	os_free(buf);
7137f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt}
7147f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt
7157f0b69e88015ca077ef7a417fde0a76c10df23a5Dmitry Shmidt
716b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtvoid wpa_msg_no_global(void *ctx, int level, const char *fmt, ...)
717b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt{
718b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	va_list ap;
719b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	char *buf;
72013ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	int buflen;
721b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	int len;
722b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
72313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	va_start(ap, fmt);
72413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	buflen = vsnprintf(NULL, 0, fmt, ap) + 1;
72513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	va_end(ap);
72613ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
727b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	buf = os_malloc(buflen);
728b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	if (buf == NULL) {
729b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpa_msg_no_global: Failed to allocate "
730b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			   "message buffer");
731b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		return;
732b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	}
733b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	va_start(ap, fmt);
734b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	len = vsnprintf(buf, buflen, fmt, ap);
735b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	va_end(ap);
736b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	wpa_printf(level, "%s", buf);
737b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	if (wpa_msg_cb)
738b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		wpa_msg_cb(ctx, level, 2, buf, len);
739b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	os_free(buf);
740b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt}
741b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_WPA_MSG */
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_HOSTAPD_LOGGER
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic hostapd_logger_cb_func hostapd_logger_cb = NULL;
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_logger_register_cb(hostapd_logger_cb_func func)
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	hostapd_logger_cb = func;
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level,
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    const char *fmt, ...)
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_list ap;
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *buf;
75913ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	int buflen;
7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
76213ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	va_start(ap, fmt);
76313ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	buflen = vsnprintf(NULL, 0, fmt, ap) + 1;
76413ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt	va_end(ap);
76513ca8d8ea51a1aa5e24c6c956473a11b0c7daed4Dmitry Shmidt
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf = os_malloc(buflen);
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (buf == NULL) {
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "hostapd_logger: Failed to allocate "
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "message buffer");
7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_start(ap, fmt);
7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = vsnprintf(buf, buflen, fmt, ap);
7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	va_end(ap);
7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hostapd_logger_cb)
7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hostapd_logger_cb(ctx, addr, module, level, buf, len);
7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (addr)
7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "hostapd_logger: STA " MACSTR " - %s",
7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   MAC2STR(addr), buf);
7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "hostapd_logger: %s", buf);
7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(buf);
7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_HOSTAPD_LOGGER */
785