dbus_new_handlers.c revision 807291d85bf857320aff6a8ade38c5f622ab9df8
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant / dbus-based control interface
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009-2010, Witold Sowa <witold.sowa@gmail.com>
5807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt * Copyright (c) 2009-2015, Jouni Malinen <j@w1.fi>
68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * This software may be distributed under the terms of the BSD license.
804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * See README for more details.
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_peer/eap_methods.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eapol_supp/eapol_supp_sm.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rsn_supp/wpa.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../config.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wpa_supplicant_i.h"
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../driver_i.h"
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../notify.h"
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../bss.h"
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../scan.h"
2404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "../autoscan.h"
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_helpers.h"
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new.h"
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_handlers.h"
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_dict_helpers.h"
2904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "dbus_common_i.h"
30661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt#include "drivers/driver.h"
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic const char * const debug_strings[] = {
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt * wpas_dbus_error_unknown_error - Return a new UnknownError error message
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message,
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    const char *arg)
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR,
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      arg);
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message)
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return dbus_message_new_error(
636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		message, WPAS_DBUS_ERROR_IFACE_UNKNOWN,
646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		"wpa_supplicant knows nothing about this interface.");
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message)
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return dbus_message_new_error(
786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN,
796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		"There is no such a network in this interface.");
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message,
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const char *arg)
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	reply = dbus_message_new_error(
966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		message, WPAS_DBUS_ERROR_INVALID_ARGS,
976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		"Did not receive correct message arguments.");
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (arg != NULL)
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg,
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 DBUS_TYPE_INVALID);
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1067dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt/**
1077dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * wpas_dbus_error_scan_error - Return a new ScanError error message
1087dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
1097dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @error: Optional string to be used as the error message
1107dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Returns: a dbus error message
1117dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt *
1127dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Convenience function to create and return a scan error
1137dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt */
1146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic DBusMessage * wpas_dbus_error_scan_error(DBusMessage *message,
1156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						const char *error)
1167dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt{
1176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return dbus_message_new_error(message,
1186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				      WPAS_DBUS_ERROR_IFACE_SCAN_ERROR,
1196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				      error);
1206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt}
1217dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1227dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1236c0da2bb83f6915d8260912362692d1a742e057bDmitry ShmidtDBusMessage * wpas_dbus_error_no_memory(DBusMessage *message)
1246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{
1256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	wpa_printf(MSG_DEBUG, "dbus: Failed to allocate memory");
1266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
1277dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt}
1287dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1297dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic const char * const dont_quote[] = {
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap",
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path",
133d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	"bssid", "scan_freq", "freq_list", NULL
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key)
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i = 0;
1396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dont_quote[i] != NULL) {
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, dont_quote[i]) == 0)
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return FALSE;
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		i++;
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return TRUE;
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init()
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path(
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_global *global, const char *path)
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(wpa_s->dbus_new_path, path) == 0)
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return wpa_s;
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set.
1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure
1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   struct wpa_ssid *ssid,
1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   DBusMessageIter *iter,
1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   DBusError *error)
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING };
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter_dict;
1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *value = NULL;
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(iter, &iter_dict, error))
1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t size = 50;
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int ret;
1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto error;
1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		value = NULL;
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (entry.type == DBUS_TYPE_ARRAY &&
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    entry.array_type == DBUS_TYPE_BYTE) {
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (entry.array_len <= 0)
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			size = entry.array_len * 2 + 1;
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = wpa_snprintf_hex(value, size,
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       (u8 *) entry.bytearray_value,
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       entry.array_len);
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_STRING) {
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (should_quote_opt(entry.key)) {
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size = os_strlen(entry.str_value);
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (size <= 0)
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size += 3;
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_zalloc(size);
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				ret = os_snprintf(value, size, "\"%s\"",
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  entry.str_value);
2266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				if (os_snprintf_error(size, ret))
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_strdup(entry.str_value);
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_UINT32) {
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%u",
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.uint32_value);
2406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			if (os_snprintf_error(size, ret))
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_INT32) {
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%d",
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.int32_value);
2496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			if (os_snprintf_error(size, ret))
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_config_set(ssid, entry.key, value, 0) < 0)
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2572f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		if (os_strcmp(entry.key, "bssid") != 0 &&
2582f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		    os_strcmp(entry.key, "priority") != 0)
2592f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
2602f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt
2612f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		if (wpa_s->current_ssid == ssid ||
2622f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		    wpa_s->current_ssid == NULL) {
2632f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			/*
2642f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			 * Invalidate the EAP session cache if anything in the
2652f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			 * current or previously used configuration changes.
2662f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			 */
2672f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			eapol_sm_invalidate_cached_session(wpa_s->eapol);
2682f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		}
2692f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((os_strcmp(entry.key, "psk") == 0 &&
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     value[0] == '"' && ssid->ssid_len) ||
27204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		    (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase))
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_psk(ssid);
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if (os_strcmp(entry.key, "priority") == 0)
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_prio_list(wpa_s->conf);
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(value);
278623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt		value = NULL;
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_dbus_dict_entry_clear(&entry);
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror:
2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(value);
2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_dbus_dict_entry_clear(&entry);
2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS,
2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			     "invalid message format");
2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property
2951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value
2981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure
2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic.
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter,
3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const int type,
3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const void *val,
3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error)
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter;
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: given type is not basic", __func__);
3131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
3176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      wpa_dbus_type_as_string(type),
3186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &variant_iter) ||
3196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_append_basic(&variant_iter, type, val) ||
3206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
3216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: error constructing reply", __func__);
3236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
3246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	}
3251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored
3351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic.
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter,
3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
3411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const int type, void *val)
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter;
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: given type is not basic", __func__);
3481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Look at the new value */
3521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&variant_iter) != type) {
3541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "wrong property type");
3561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&variant_iter, val);
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property
3661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type)
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array
3701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure
3711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic.
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter,
3771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   const int type,
3781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   const void *array,
3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   size_t array_len,
3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   DBusError *error)
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char type_str[] = "a?"; /* ? will be replaced with subtype letter; */
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *sub_type_str;
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t element_size, i;
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: given type is not basic", __func__);
3901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	type_str[1] = sub_type_str[0];
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
3976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      type_str, &variant_iter) ||
3986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      sub_type_str, &array_iter)) {
4001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message", __func__);
4021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	switch (type) {
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BYTE:
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BOOLEAN:
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = 1;
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT16:
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT16:
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint16_t);
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT32:
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT32:
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint32_t);
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT64:
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT64:
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint64_t);
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_DOUBLE:
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(double);
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_STRING:
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_OBJECT_PATH:
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(char *);
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
4301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: unknown element type %d", __func__, type);
4321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < array_len; i++) {
43643cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt		if (!dbus_message_iter_append_basic(&array_iter, type,
43743cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt						    array + i * element_size)) {
43843cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_FAILED,
43943cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt				       "%s: failed to construct message 2.5",
44043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt				       __func__);
44143cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt			return FALSE;
44243cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt		}
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter) ||
4466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
4471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message 3", __func__);
4491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
4511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
4521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
45704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property
45804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type)
46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message
46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array
46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure
46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is
46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic.
46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter,
46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 const int type,
47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 struct wpabuf **array,
47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 size_t array_len,
47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 DBusError *error)
47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char type_str[] = "aa?";
47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char inner_type_str[] = "a?";
47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	const char *sub_type_str;
47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	size_t i;
47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_type_is_basic(type)) {
48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: given type is not basic", __func__);
48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	type_str[2] = sub_type_str[0];
48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	inner_type_str[1] = sub_type_str[0];
48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
4916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      type_str, &variant_iter) ||
4926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
49304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      inner_type_str, &array_iter)) {
49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message", __func__);
49604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
49704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
499c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt	for (i = 0; i < array_len && array[i]; i++) {
50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_dbus_dict_bin_array_add_element(&array_iter,
50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_head(array[i]),
50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_len(array[i]));
50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
5066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter) ||
5076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
50804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
5096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to close message", __func__);
51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object,
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage.
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter_dict;
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter;
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry;
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *driver = NULL;
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *confname = NULL;
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *bridge_ifname = NULL;
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL))
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error;
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
5476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if (os_strcmp(entry.key, "Driver") == 0 &&
5486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    entry.type == DBUS_TYPE_STRING) {
549623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(driver);
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			driver = os_strdup(entry.str_value);
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (driver == NULL)
553ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "Ifname") == 0 &&
5556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
556623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(ifname);
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(entry.str_value);
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ifname == NULL)
560ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "ConfigFile") == 0 &&
5626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
563623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(confname);
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			confname = os_strdup(entry.str_value);
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (confname == NULL)
567ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "BridgeIfname") == 0 &&
5696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
570623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(bridge_ifname);
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			bridge_ifname = os_strdup(entry.str_value);
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (bridge_ifname == NULL)
574ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error; /* Required Ifname argument missing */
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Try to get the wpa_supplicant record for this iface, return
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * an error if we already control it.
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_get_iface(global, ifname) != NULL) {
5896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = dbus_message_new_error(
5906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message, WPAS_DBUS_ERROR_IFACE_EXISTS,
5916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant already controls this interface.");
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_supplicant *wpa_s;
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_interface iface;
5956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memset(&iface, 0, sizeof(iface));
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.driver = driver;
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.ifname = ifname;
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.confname = confname;
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.bridge_ifname = bridge_ifname;
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Otherwise, have wpa_supplicant attach to it. */
6026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_s = wpa_supplicant_add_iface(global, &iface);
6036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if (wpa_s) {
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *path = wpa_s->dbus_new_path;
6056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_method_return(message);
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH,
6086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						 &path, DBUS_TYPE_INVALID);
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_unknown_error(
6116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
6126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"wpa_supplicant couldn't grab this interface.");
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(driver);
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ifname);
61961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os_free(confname);
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(bridge_ifname);
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror:
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_error_invalid_args(message, NULL);
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	goto out;
626ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtoom:
627ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	reply = wpas_dbus_error_no_memory(message);
628ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	goto out;
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          failure (0), or returns a dbus error message with more information
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call.  Handles requests
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages.
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message,
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *path;
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path,
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = get_iface_by_dbus_path(global, path);
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_iface_unknown(message);
656c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) {
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
6586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
6596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant couldn't remove this interface.");
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object,
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call.
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message,
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      struct wpa_global *global)
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname;
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *path;
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname,
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = wpa_supplicant_get_iface(global, ifname);
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_iface_unknown(message);
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	path = wpa_s->dbus_new_path;
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL)
6936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
6976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level
7061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property.
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(DBusMessageIter *iter,
7141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error,
7151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 void *user_data)
7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str;
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int idx = wpa_debug_level;
7191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx < 0)
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 0;
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx > 5)
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 5;
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str = debug_strings[idx];
7251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp
7321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property.
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(DBusMessageIter *iter,
7406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					     DBusError *error,
7416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					     void *user_data)
7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_timestamp, error);
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys
7511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property.
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(DBusMessageIter *iter,
7591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
7601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_show_keys, error);
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level
7691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property.
7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(DBusMessageIter *iter,
7771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str = NULL;
7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, val = -1;
7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
7841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &str))
7851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; debug_strings[i]; i++)
7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(debug_strings[i], str) == 0) {
7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			val = i;
7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (val < 0 ||
7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp,
7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    wpa_debug_show_keys)) {
7966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
7976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "wrong debug level value");
7981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp
8071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property.
8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(DBusMessageIter *iter,
8151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
8161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0,
8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_show_keys);
8271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys
8331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property.
8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(DBusMessageIter *iter,
8411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level,
8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_timestamp,
8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					val ? 1 : 0);
8541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list
8601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests
8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths
8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter,
8701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					DBusError *error,
8711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					void *user_data)
8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char **paths;
8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
8771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		num++;
8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
88261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
8841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
8851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i++] = wpa_s->dbus_new_path;
8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
8921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
8931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list
9021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
9031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
9041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
9051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter,
9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **eap_methods;
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t num_items = 0;
9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eap_methods = eap_get_names_as_string_array(&num_items);
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!eap_methods) {
9191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
9201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_STRING,
9251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 eap_methods,
9261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 num_items, error);
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (num_items)
9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(eap_methods[--num_items]);
9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(eap_methods);
9311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
935d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
936d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities
937d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
938d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
939d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
940d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
941d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
942d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to
943d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS,
944d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time.
945d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
946d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter,
9476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						 DBusError *error,
9486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						 void *user_data)
949d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
950d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL };
951d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	size_t num_items = 0;
952d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
953d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP
954d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ap";
955d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */
956d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN
957d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ibss-rsn";
958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */
959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P
960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "p2p";
961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */
962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING
963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "interworking";
964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */
965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter,
967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      DBUS_TYPE_STRING,
968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      capabilities,
969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      num_items, error);
970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var,
9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char **type, DBusMessage **reply)
9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) {
9776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a string",
9786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Type value type. String required");
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(var, type);
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var,
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    struct wpa_driver_scan_params *params,
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    DBusMessage **reply)
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_ssid *ssids = params->ssids;
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t ssids_num = 0;
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ssid;
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
10006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ssids must be an array of arrays of bytes",
10026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong SSIDs value type. Array of arrays of bytes required");
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
10126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) {
10136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ssids must be an array of arrays of bytes",
10156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong SSIDs value type. Array of arrays of bytes required");
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) {
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ssids_num >= WPAS_MAX_SCAN_SSIDS) {
10246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
10256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Too many ssids specified on scan dbus call",
10266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
10286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
10296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"Too many ssids specified. Specify at most four");
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1037c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		if (len > MAX_SSID_LEN) {
1038c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			wpa_printf(MSG_DEBUG,
10396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: SSID too long (len=%d max_len=%d)",
10406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__, len, MAX_SSID_LEN);
1041c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
1042c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				message, "Invalid SSID: too long");
1043c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			return -1;
1044c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		}
1045c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len != 0) {
10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = os_malloc(len);
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ssid == NULL) {
10496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				*reply = wpas_dbus_error_no_memory(message);
10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_memcpy(ssid, val, len);
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Allow zero-length SSIDs */
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = NULL;
10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid = ssid;
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid_len = len;
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids_num++;
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->num_ssids = ssids_num;
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var,
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  struct wpa_driver_scan_params *params,
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  DBusMessage **reply)
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ies = NULL, *nies;
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ies_len = 0;
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
10816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ies must be an array of arrays of bytes",
10836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong IEs value type. Array of arrays of bytes required");
10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
10936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) {
10946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ies must be an array of arrays of bytes",
10966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong IEs value type. Array required");
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) {
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len == 0) {
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_iter_next(&array_iter);
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		nies = os_realloc(ies, ies_len + len);
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (nies == NULL) {
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ies);
11146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			*reply = wpas_dbus_error_no_memory(message);
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies = nies;
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memcpy(ies + ies_len, val, len);
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies_len += len;
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies = ies;
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies_len = ies_len;
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message,
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessageIter *var,
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_driver_scan_params *params,
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessage **reply)
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int *freqs = NULL, *nfreqs;
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int freqs_num = 0;
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
11406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
11416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: Channels must be an array of structs",
11426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
11456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong Channels value type. Array of structs required");
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) {
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG,
11536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: Channels must be an array of structs",
11546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
11576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong Channels value type. Array of structs required");
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT)
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int freq, width;
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dbus_message_iter_get_arg_type(&sub_array_iter) !=
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
11696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
11706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Channel must by specified by struct of two UINT32s %c",
11716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__,
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   dbus_message_iter_get_arg_type(
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   &sub_array_iter));
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
11756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
11766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &freq);
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_next(&sub_array_iter) ||
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    dbus_message_iter_get_arg_type(&sub_array_iter) !=
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
11856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
11866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Channel must by specified by struct of two UINT32s",
11876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message,
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &width);
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs_num % FREQS_ALLOC_CHUNK == 0) {
119961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			nfreqs = os_realloc_array(
120061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				freqs, freqs_num + FREQS_ALLOC_CHUNK,
120161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				sizeof(int));
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (nfreqs == NULL)
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_free(freqs);
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			freqs = nfreqs;
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs == NULL) {
12076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			*reply = wpas_dbus_error_no_memory(message);
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs[freqs_num] = freq;
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs_num++;
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
121761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int));
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (nfreqs == NULL)
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(freqs);
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs = nfreqs;
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (freqs == NULL) {
12226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		*reply = wpas_dbus_error_no_memory(message);
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs[freqs_num] = 0;
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->freqs = freqs;
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1232051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpas_dbus_get_scan_allow_roam(DBusMessage *message,
1233051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 DBusMessageIter *var,
1234051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 dbus_bool_t *allow,
1235051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 DBusMessage **reply)
1236051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{
1237051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN) {
12386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a boolean",
12396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
1240051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
1241051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			message, "Wrong Type value type. Boolean required");
1242051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		return -1;
1243051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1244051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	dbus_message_iter_get_basic(var, allow);
1245051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	return 0;
1246051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt}
1247051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1248051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface
12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface.
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     struct wpa_supplicant *wpa_s)
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, dict_iter, entry_iter, variant_iter;
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *key = NULL, *type = NULL;
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_params params;
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t i;
1267051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	dbus_bool_t allow_roam = 1;
12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&params, 0, sizeof(params));
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &dict_iter);
12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&dict_iter) ==
12766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	       DBUS_TYPE_DICT_ENTRY) {
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&dict_iter, &entry_iter);
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&entry_iter, &key);
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&entry_iter);
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&entry_iter, &variant_iter);
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, "Type") == 0) {
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_type(message, &variant_iter,
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &type, &reply) < 0)
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "SSIDs") == 0) {
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ssids(message, &variant_iter,
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     &params, &reply) < 0)
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "IEs") == 0) {
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ies(message, &variant_iter,
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   &params, &reply) < 0)
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "Channels") == 0) {
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_channels(message, &variant_iter,
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							&params, &reply) < 0)
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
1298051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		} else if (os_strcmp(key, "AllowRoam") == 0) {
1299051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			if (wpas_dbus_get_scan_allow_roam(message,
1300051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &variant_iter,
1301051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &allow_roam,
1302051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &reply) < 0)
1303051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt				goto out;
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
13056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown argument %s",
13066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__, key);
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(message, key);
13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&dict_iter);
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!type) {
13156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Scan type not specified",
13166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, key);
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (os_strcmp(type, "passive") == 0) {
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (params.num_ssids || params.extra_ies_len) {
13236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
13246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: SSIDs or IEs specified for passive scan.",
13256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(
13276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
13286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"You can specify only Channels in passive scan");
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (params.freqs && params.freqs[0]) {
13317dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt			if (wpa_supplicant_trigger_scan(wpa_s, &params)) {
13327dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt				reply = wpas_dbus_error_scan_error(
13337dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt					message, "Scan request rejected");
13347dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt			}
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
1336d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			wpa_s->scan_req = MANUAL_SCAN_REQ;
13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_supplicant_req_scan(wpa_s, 0, 0);
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	} else if (os_strcmp(type, "active") == 0) {
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!params.num_ssids) {
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Add wildcard ssid */
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			params.num_ssids++;
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
134404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
134504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
134604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
13477dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt		if (wpa_supplicant_trigger_scan(wpa_s, &params)) {
13487dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt			reply = wpas_dbus_error_scan_error(
13497dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt				message, "Scan request rejected");
13507dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt		}
13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
13526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown scan type: %s",
13536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, type);
13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message,
13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     "Wrong scan type");
13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1359051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (!allow_roam)
1360051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		wpa_s->scan_res_handler = scan_only_handler;
1361051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free((u8 *) params.ssids[i].ssid);
13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free((u8 *) params.extra_ies);
13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(params.freqs);
13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1371661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/**
1372661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_handler_signal_poll - Request immediate signal properties
1373661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @message: Pointer to incoming dbus message
1374661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1375661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
1376661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt *
1377661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Handler function for "SignalPoll" method call of a network device. Requests
1378661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * that wpa_supplicant read signal properties like RSSI, noise, and link
1379661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * speed and return them.
1380661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */
1381661b4f78e48c697429dc46154a4125892c001718Dmitry ShmidtDBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
1382661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
1383661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
1384661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct wpa_signal_info si;
1385661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	DBusMessage *reply = NULL;
1386661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	DBusMessageIter iter, iter_dict, variant_iter;
1387661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	int ret;
1388661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1389661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	ret = wpa_drv_signal_poll(wpa_s, &si);
1390661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (ret) {
1391661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
1392661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					      "Failed to read signal");
1393661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	}
1394661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1395661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	reply = dbus_message_new_method_return(message);
1396661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (reply == NULL)
1397661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1398661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1399661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
1400661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1401661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
14026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
14036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) ||
14046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "rssi",
14056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_signal) ||
14066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
14076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_txrate / 1000) ||
14086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "noise",
14096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_noise) ||
14106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_uint32(&iter_dict, "frequency",
14116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					 si.frequency) ||
14126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.chanwidth != CHAN_WIDTH_UNKNOWN &&
14136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_append_string(
14146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_dict, "width",
14156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     channel_width_to_string(si.chanwidth))) ||
14166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.center_frq1 > 0 && si.center_frq2 > 0 &&
14176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
14186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					  si.center_frq1) ||
14196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	      !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
14206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					  si.center_frq2))) ||
14216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.avg_signal &&
14226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
14236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					 si.avg_signal)) ||
14246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
14256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(&iter, &variant_iter))
1426661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1427661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1428661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return reply;
1429661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1430661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtnomem:
1431661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (reply)
1432661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		dbus_message_unref(reply);
14336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return wpas_dbus_error_no_memory(message);
1434661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
1435661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1436661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection
14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected
14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise.
14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface.
14458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14468d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
14478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->disconnected = 1;
14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "This interface is not connected");
14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network
14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network
14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface.
14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter;
14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = NULL;
14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf;
14771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusError error;
14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_add_network(wpa_s->conf);
14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
14836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.",
14846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message,
14876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant could not add a network on this interface.");
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_added(wpa_s, ssid);
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid->disabled = 1;
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_network_defaults(ssid);
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_error_init(&error);
14951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!set_network_properties(wpa_s, ssid, &iter, &error)) {
14966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
14976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: control interface couldn't set network properties",
14986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
14991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_reply_new_from_error(message, &error,
15001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       DBUS_ERROR_INVALID_ARGS,
15011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       "Failed to add network");
15021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_error_free(&error);
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Construct the object path for this network. */
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_s->dbus_new_path, ssid->id);
15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL) {
15136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
15196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid) {
15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpas_notify_network_removed(wpa_s, ssid);
15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_config_remove_network(wpa_s->conf, ssid->id);
15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1535413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate
153661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message
153761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1538413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled
153961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise.
154061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *
154161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface.
154261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */
154361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message,
154461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
154561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
1546413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) {
1547d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpas_request_connection(wpa_s);
154861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
154961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
155061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1551413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_DISABLED,
1552413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt				      "This interface is disabled");
155361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
155461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
155561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
155661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/**
15579866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * wpas_dbus_handler_reattach - Reattach to current AP
15589866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @message: Pointer to incoming dbus message
15599866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
15609866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Returns: NotConnected DBus error message if not connected
15619866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * or NULL otherwise.
15629866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt *
15639866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Handler function for "Reattach" method call of network interface.
15649866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt */
15659866086a955d00e237cc8df3722e7dff75c02532Dmitry ShmidtDBusMessage * wpas_dbus_handler_reattach(DBusMessage *message,
15669866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
15679866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{
15689866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
15699866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		wpa_s->reattach = 1;
15709866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		wpas_request_connection(wpa_s);
15719866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		return NULL;
15729866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	}
15739866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
15749866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
15759866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt				      "This interface is not connected");
15769866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt}
15779866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
15789866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
15799866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt/**
15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface.
15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
15926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
15952f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	int was_disabled;
15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
16026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
16036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
16046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1605d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (iface == NULL || net_id == NULL ||
1606d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1611d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1613d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16242f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	was_disabled = ssid->disabled;
16252f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
16312f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	else if (!was_disabled && wpa_s->sched_scanning) {
16326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
16336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "Stop ongoing sched_scan to remove network from filters");
16342f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
16352f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_req_scan(wpa_s, 0, 0);
16362f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	}
16372f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
1638684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, id) < 0) {
1639684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		wpa_printf(MSG_ERROR,
16406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: error occurred when removing network %d",
16416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, id);
1642684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		reply = wpas_dbus_error_unknown_error(
16436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
16446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"error removing the specified network on is interface.");
1645684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		goto out;
1646684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	}
16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid)
16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s = arg;
16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) {
16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR,
16626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: error occurred when removing network %d",
16636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, ssid->id);
16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
1668d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
1669d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface.
16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks(
16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16842f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	if (wpa_s->sched_scanning)
16852f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
16862f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* NB: could check for failure and return an error */
16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s);
16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network
16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface.
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message,
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
17066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
17156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
17166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
17176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1718d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (iface == NULL || net_id == NULL ||
1719d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1724d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1726d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Finally, associate with the network */
17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_select_network(wpa_s, ssid);
17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal
17481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message
17491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
17501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure
17511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
17521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface.
17531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */
17541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message,
17551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      struct wpa_supplicant *wpa_s)
17561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
17571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL
17581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessage *reply = NULL;
17591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *op, *field, *value;
17606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
17611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int id;
17621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_ssid *ssid;
17631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
17641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
17656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_OBJECT_PATH, &op,
17666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_STRING, &field,
17676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_STRING, &value,
17686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_INVALID))
17691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpas_dbus_error_invalid_args(message, NULL);
17701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
17711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Extract the network ID and ensure the network */
17721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* is actually a child of this interface */
17736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
17746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
17756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1776d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (iface == NULL || net_id == NULL ||
1777d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
17781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
17791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
17801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
17811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1782d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
17831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	id = strtoul(net_id, NULL, 10);
1784d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
17851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, net_id);
17861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
17871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
17881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
17891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
17901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (ssid == NULL) {
17911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
17921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
17931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
17941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
17951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid,
17961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      field, value) < 0)
17971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, field);
17981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	else {
17991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		/* Tell EAP to retry immediately */
18001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		eapol_sm_notify_ctrl_response(wpa_s->eapol);
18011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout:
18041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(iface);
18051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return reply;
18061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */
18071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included");
18081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_error_unknown_error(message, "802.1X not included");
18091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */
18101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
18111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1813700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS
1814700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
18151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/**
18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates)
18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs.
18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message,
18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *blob_data;
18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int blob_len;
18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob = NULL;
18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &blob_name);
18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_get_blob(wpa_s->conf, blob_name)) {
18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_EXISTS,
18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array_iter);
18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len);
18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = os_zalloc(sizeof(*blob));
18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
18506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->data = os_malloc(blob_len);
18556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	blob->name = os_strdup(blob_name);
18566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!blob->data || !blob->name) {
18576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(blob->data, blob_data, blob_len);
18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->len = blob_len;
18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_blob(wpa_s->conf, blob);
18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_added(wpa_s, blob->name);
18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (blob) {
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->name);
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->data);
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob);
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates)
18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob)
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs.
18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message,
18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct wpa_config_blob *blob;
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_config_get_blob(wpa_s->conf, blob_name);
18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
19066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!reply)
19076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      DBUS_TYPE_BYTE_AS_STRING,
19136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &array_iter) ||
19146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE,
19156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						  &(blob->data), blob->len) ||
19166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(&iter, &array_iter)) {
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
19186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error
19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs.
19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message,
19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_blob(wpa_s->conf, blob_name)) {
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_removed(wpa_s, blob_name);
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1953700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */
1954700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
1955700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface.
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message,
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t age;
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age,
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (age == 0)
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush(wpa_s);
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush_by_age(wpa_s, age);
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
198204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
198304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface
198404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message
198504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
198604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL
198704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
198804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface.
198904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
199004949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message,
199104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					 struct wpa_supplicant *wpa_s)
199204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
199304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *reply = NULL;
199404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	enum wpa_states state = wpa_s->wpa_state;
199504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *arg;
199604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
199704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg,
199804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      DBUS_TYPE_INVALID);
199904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
200004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (arg != NULL && os_strlen(arg) > 0) {
200104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		char *tmp;
20026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
200304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		tmp = os_strdup(arg);
200404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (tmp == NULL) {
20056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			reply = wpas_dbus_error_no_memory(message);
200604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else {
200704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			os_free(wpa_s->conf->autoscan);
200804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			wpa_s->conf->autoscan = tmp;
200904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
201004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				autoscan_init(wpa_s, 1);
201104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			else if (state == WPA_SCANNING)
201204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				wpa_supplicant_reinit_autoscan(wpa_s);
201304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		}
201404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else if (arg != NULL && os_strlen(arg) == 0) {
201504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->conf->autoscan);
201604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->conf->autoscan = NULL;
201704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
201804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else
201904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		reply = dbus_message_new_error(message,
202004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       DBUS_ERROR_INVALID_ARGS,
202104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       NULL);
202204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
202304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return reply;
202404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
202504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
202604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
202704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
20288da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/*
20298da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logoff - IEEE 802.1X EAPOL state machine logoff
20308da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message
20318da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20328da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL
20338da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt *
20348da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogoff" method call of network interface.
20358da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */
20368da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logoff(DBusMessage *message,
20378da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
20388da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{
20398da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	eapol_sm_notify_logoff(wpa_s->eapol, TRUE);
20408da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	return NULL;
20418da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt}
20428da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
20438da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
20448da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/*
20458da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logon - IEEE 802.1X EAPOL state machine logon
20468da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message
20478da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20488da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL
20498da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt *
20508da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogin" method call of network interface.
20518da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */
20528da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message,
20538da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
20548da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{
20558da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	eapol_sm_notify_logoff(wpa_s->eapol, FALSE);
20568da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	return NULL;
20578da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt}
20588da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
20598da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
2060e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef CONFIG_TDLS
2061e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
20627d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidtstatic int get_peer_hwaddr_helper(DBusMessage *message, const char *func_name,
20637d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt				  u8 *peer_address, DBusMessage **error)
2064e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2065e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	const char *peer_string;
2066e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
20677d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	*error = NULL;
20687d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt
2069e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
2070e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				   DBUS_TYPE_STRING, &peer_string,
20717d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt				   DBUS_TYPE_INVALID)) {
20727d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		*error = wpas_dbus_error_invalid_args(message, NULL);
20737d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		return -1;
20747d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	}
2075e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2076e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (hwaddr_aton(peer_string, peer_address)) {
2077e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s: invalid address '%s'",
2078e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			   func_name, peer_string);
20797d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		*error = wpas_dbus_error_invalid_args(
2080e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "Invalid hardware address format");
20817d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		return -1;
2082e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2083e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
20847d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	return 0;
2085e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2086e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2087e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2088e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2089e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_discover - Discover TDLS peer
2090e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2091e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2092e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2093e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2094e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSDiscover" method call of network interface.
2095e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2096e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message,
2097e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					      struct wpa_supplicant *wpa_s)
2098e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2099e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2100e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2101e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2102e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21037d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2104e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2105e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2106e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_DISCOVER " MACSTR, MAC2STR(peer));
2107e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2108e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2109e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer);
2110e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2111e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer);
2112e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2113e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2114e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2115e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS discovery");
2116e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2117e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2118e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2119e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2120e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2121e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2122e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2123e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_setup - Setup TDLS session
2124e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2125e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2126e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2127e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2128e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSSetup" method call of network interface.
2129e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2130e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message,
2131e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					   struct wpa_supplicant *wpa_s)
2132e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2133e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2134e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2135e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2136e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21377d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2138e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2139e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2140e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_SETUP " MACSTR, MAC2STR(peer));
2141e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2142e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_tdls_remove(wpa_s->wpa, peer);
2143e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2144e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_start(wpa_s->wpa, peer);
2145e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2146e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
2147e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2148e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2149e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2150e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS setup");
2151e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2152e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2153e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2154e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2155e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2156e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2157e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2158e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_status - Return TDLS session status
2159e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2160e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2161e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: A string representing the state of the link to this TDLS peer
2162e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2163e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSStatus" method call of network interface.
2164e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2165e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_status(DBusMessage *message,
2166e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					    struct wpa_supplicant *wpa_s)
2167e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2168e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2169e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *reply;
2170e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	const char *tdls_status;
2171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21727d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &reply) < 0)
2173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return reply;
2174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2175e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_STATUS " MACSTR, MAC2STR(peer));
2176e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2177e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	tdls_status = wpa_tdls_get_link_status(wpa_s->wpa, peer);
2178e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2179e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	reply = dbus_message_new_method_return(message);
2180e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	dbus_message_append_args(reply, DBUS_TYPE_STRING,
2181e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				 &tdls_status, DBUS_TYPE_INVALID);
2182e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return reply;
2183e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2184e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2185e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2186e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2187e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_teardown - Teardown TDLS session
2188e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2189e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2190e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2191e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2192e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSTeardown" method call of network interface.
2193e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2194e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message,
2195e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					      struct wpa_supplicant *wpa_s)
2196e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2197e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2198e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2199e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22017d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_TEARDOWN " MACSTR, MAC2STR(peer));
2205e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2206e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2207e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_teardown_link(
2208e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			wpa_s->wpa, peer,
2209e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
2210e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2211e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer);
2212e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2213e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2214e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2215e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS teardown");
2216e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2217e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2218e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2219e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2220e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2221e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* CONFIG_TDLS */
2222e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2223e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
222501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
222601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @message: Pointer to incoming dbus message
222701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
222801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
222901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
223001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Sets the PKCS #11 engine and module path.
223101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
223201904cfafd75a70b9f29c0220b90bdef45595491Dmitry ShmidtDBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path(
223301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
223401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
223501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	DBusMessageIter iter;
223601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *value = NULL;
223701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *pkcs11_engine_path = NULL;
223801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *pkcs11_module_path = NULL;
223901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
224001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_init(message, &iter);
224101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &value);
224201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (value == NULL) {
224301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
224401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS,
224501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Invalid pkcs11_engine_path argument");
224601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
224701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	/* Empty path defaults to NULL */
224801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (os_strlen(value))
224901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = value;
225001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
225101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_next(&iter);
225201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &value);
225301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (value == NULL) {
225401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		os_free(pkcs11_engine_path);
225501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
225601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS,
225701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Invalid pkcs11_module_path argument");
225801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
225901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	/* Empty path defaults to NULL */
226001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (os_strlen(value))
226101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = value;
226201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
226301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path,
226401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						   pkcs11_module_path))
226501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
226601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_FAILED,
22676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed.");
226801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
226901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	wpa_dbus_mark_property_changed(
227001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		wpa_s->global->dbus, wpa_s->dbus_new_path,
227101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath");
227201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	wpa_dbus_mark_property_changed(
227301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		wpa_s->global->dbus, wpa_s->dbus_new_path,
227401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath");
227501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
227601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return NULL;
227701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
227801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
227901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
228001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities
22821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
22831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
22841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
22851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
22868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
22878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface.
22888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
22891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(DBusMessageIter *iter,
22901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					  DBusError *error, void *user_data)
22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_capa capa;
22948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array,
22968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		variant_iter;
22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *scans[] = { "active", "passive", "ssid" };
22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
23006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
23016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_drv_get_capa(wpa_s, &capa);
23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** pairwise cipher */
23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {"ccmp", "tkip", "none"};
23096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Pairwise", args,
231268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise",
23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
23186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
23196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) &&
23206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp-256")) ||
23226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) &&
23236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp-256")) ||
23256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) &&
23266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp")) ||
23286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) &&
23296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp")) ||
23316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) &&
23326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "tkip")) ||
23346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) &&
23356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "none")) ||
23376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
23388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** group cipher */
23458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
23468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
23478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"ccmp", "tkip", "wep104", "wep40"
23488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
23496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Group", args,
235268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group",
23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
23586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
23596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) &&
23606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp-256")) ||
23626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) &&
23636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp-256")) ||
23656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) &&
23666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp")) ||
23686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) &&
23696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp")) ||
23716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) &&
23726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "tkip")) ||
23746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) &&
23756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wep104")) ||
23776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) &&
23786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wep40")) ||
23806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** key management */
23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wpa-psk", "wpa-eap", "ieee8021x", "wpa-none",
23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wps",
23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"none"
23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "KeyMgmt", args,
239868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt",
24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
24046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
24056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
24066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							    "none") ||
24076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "ieee8021x"))
24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) {
24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				    &iter_array, "wpa-eap") ||
24156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			    ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) &&
24166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     !wpa_dbus_dict_string_array_add_element(
24176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     &iter_array, "wpa-ft-eap")))
24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-eap-sha256"))
24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) {
24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				    &iter_array, "wpa-psk") ||
24326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			    ((capa.key_mgmt &
24336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			      WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) &&
24346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     !wpa_dbus_dict_string_array_add_element(
24356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     &iter_array, "wpa-ft-psk")))
24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-psk-sha256"))
24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) &&
24476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
24486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							    "wpa-none"))
24496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			goto nomem;
24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "wps"))
24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** WPA protocol */
24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "rsn", "wpa" };
24686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Protocol", args,
247168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol",
24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
24776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
24786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
24796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) &&
24806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "rsn")) ||
24826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
24836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) &&
24846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wpa")) ||
24866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** auth alg */
24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "open", "shared", "leap" };
24966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "AuthAlg", args,
249968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg",
25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if (((capa.auth & WPA_DRIVER_AUTH_OPEN) &&
25096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
25106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "open")) ||
25116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.auth & WPA_DRIVER_AUTH_SHARED) &&
25126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
25136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "shared")) ||
25146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.auth & WPA_DRIVER_AUTH_LEAP) &&
25156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
25166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "leap")) ||
25176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Scan */
25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans,
252668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt					       ARRAY_SIZE(scans)))
25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Modes */
253075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes",
253175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_entry,
253275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_val,
25336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &iter_array) ||
25346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_string_array_add_element(
25356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    &iter_array, "infrastructure") ||
25366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_string_array_add_element(
25376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    &iter_array, "ad-hoc") ||
25386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_AP) &&
25396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_string_array_add_element(
25406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_array, "ap")) ||
25416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) &&
25426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_string_array_add_element(
25436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_array, "p2p")) ||
25446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_end_string_array(&iter_dict,
254575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_entry,
254675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_val,
254775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_array))
254875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
254975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	/***** Modes end */
255075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
25511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res >= 0) {
25521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_int32_t max_scan_ssid = capa.max_scan_ssids;
25531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID",
25551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						max_scan_ssid))
25561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto nomem;
25571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
25581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
25606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
25661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
25671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state
25731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
25741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
25751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
25761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property.
25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
25801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_state(DBusMessageIter *iter, DBusError *error,
25811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   void *user_data)
25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
25831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str_state;
25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *state_ls, *tmp;
25861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str_state = wpa_supplicant_state_txt(wpa_s->wpa_state);
25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* make state string lowercase to fit new DBus API convention
25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	state_ls = tmp = os_strdup(str_state);
25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!tmp) {
25941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
25951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*tmp) {
25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*tmp = tolower(*tmp);
25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tmp++;
26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
26031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   &state_ls, error);
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(state_ls);
26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state
26131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
26141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
26151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
26161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property.
26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(DBusMessageIter *iter, DBusError *error,
26216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				      void *user_data)
26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE;
26251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
26261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
26271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&scanning, error);
26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode
26331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
26341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
26351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
26361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property.
26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(DBusMessageIter *iter, DBusError *error,
26411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan = wpa_s->conf->ap_scan;
26451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
26461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
26471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ap_scan, error);
26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode
26531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
26541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
26551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
26561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property.
26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(DBusMessageIter *iter, DBusError *error,
26611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan;
26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
26671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &ap_scan))
26681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) {
26711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
26721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "ap_scan must be 0, 1, or 2");
26731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2680c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast
2681c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2682c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2683c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2684c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2685c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2686c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2687c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property.
2688c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2689c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(DBusMessageIter *iter,
2690c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					 DBusError *error,
2691c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					 void *user_data)
2692c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2693c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2694c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE;
2695c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2696c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
2697c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&fast_reauth, error);
2698c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2699c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2700c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2701c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
2702c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast
2703c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2704c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2705c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2706c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2707c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2708c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2709c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property.
2710c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2711c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter,
2712c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				     DBusError *error,
2713c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				     void *user_data)
2714c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2715c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2716c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth;
2717c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2718c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
2719c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					      &fast_reauth))
2720c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		return FALSE;
2721c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2722c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	wpa_s->conf->fast_reauth = fast_reauth;
2723c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return TRUE;
2724c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2725c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2726c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2727c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
272804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect
272904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
273004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
273104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
273204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
273304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
273404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property.  The reason is negative if it is
273504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated.
273604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
273704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter,
273804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       DBusError *error,
273904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       void *user_data)
274004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
274104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
274204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t reason = wpa_s->disconnect_reason;
27436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
274404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
274504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&reason, error);
274604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
274704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
274804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
274904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age
27511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property.
27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter,
27591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    DBusError *error,
27601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    void *user_data)
27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age;
27641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
27651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
27661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_age, error);
27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age
27721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property.
27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(DBusMessageIter *iter,
27801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    DBusError *error,
27811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    void *user_data)
27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age;
27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
27871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_age))
27881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) {
27911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
27921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireAge must be >= 10");
27931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count
28011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property.
28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(DBusMessageIter *iter,
28091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      DBusError *error,
28101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      void *user_data)
28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
281361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count;
28141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
28151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
28161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_count, error);
28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count
28221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property.
28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(DBusMessageIter *iter,
28301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      DBusError *error,
28311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      void *user_data)
28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_count;
28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
28371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_count))
28381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) {
28411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
28421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireCount must be > 0");
28431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code
28511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property.
28578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_country(DBusMessageIter *iter, DBusError *error,
28591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char country[3];
28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *str = country;
28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[0] = wpa_s->conf->country[0];
28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[1] = wpa_s->conf->country[1];
28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[2] = '\0';
28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
28701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code
28761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property.
28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_country(DBusMessageIter *iter, DBusError *error,
28841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *country;
28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
28901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &country))
28911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!country[0] || !country[1]) {
28941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
28951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "invalid country code");
28961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) {
29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "Failed to set country");
29011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
29021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "failed to set country code");
29031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[0] = country[0];
29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[1] = country[1];
29081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
291304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval
291404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
291504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
291604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
291704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
291804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
291904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property.
292004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
292104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(DBusMessageIter *iter,
292204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   DBusError *error,
292304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   void *user_data)
292404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
292504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
292604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval = wpa_s->scan_interval;
292704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
292804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
292904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&scan_interval, error);
293004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
293104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
293204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
293304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
293404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval
293504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
293604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
293704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
293804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
293904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
294004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property.
294104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
294204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(DBusMessageIter *iter,
294304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   DBusError *error,
294404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   void *user_data)
294504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
294604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
294704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval;
294804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
294904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32,
295004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      &scan_interval))
295104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
295204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
295304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) {
295404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
295504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     "scan_interval must be >= 0");
295604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
295704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
295804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
295904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
296004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
296104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
296204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name
29641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property.
29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error,
29721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				    void *user_data)
29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname = wpa_s->ifname;
29761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
29771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
29781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ifname, error);
29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name
29841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property.
29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error,
29921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				    void *user_data)
29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *driver;
29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) {
29986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: wpa_s has no driver set",
29996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
30001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set",
30011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       __func__);
30021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	driver = wpa_s->driver->name;
30061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
30071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&driver, error);
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path
30131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property.
30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter,
30211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error,
30221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 void *user_data)
30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf;
30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_bss)
30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_bss->id);
30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
30351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bss_obj_path, error);
30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path
30411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property.
30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter,
30491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf;
30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid)
30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_ssid->id);
30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
30631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&net_obj_path, error);
30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type
30691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property.
30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(DBusMessageIter *iter,
30771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       DBusError *error,
30781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       void *user_data)
30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *eap_mode;
30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *auth_mode;
30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX];
30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->wpa_state != WPA_COMPLETED) {
30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = "INACTIVE";
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X ||
30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eap_mode = wpa_supplicant_get_eap_mode(wpa_s);
30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX,
30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "EAP-%s", eap_mode);
30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = eap_mode_buf;
30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt,
30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_s->current_ssid->proto);
30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
31001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&auth_mode, error);
31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name
31061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property.
31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter,
31141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   DBusError *error,
31151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   void *user_data)
31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *bridge_ifname = wpa_s->bridge_ifname;
31196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
31201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
31211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bridge_ifname, error);
31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects
31271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property.
31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error,
31351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  void *user_data)
31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *bss;
31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0;
31411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
314361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(wpa_s->num_bss, sizeof(char *));
31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
31451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
31461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through scan results and append each result's object path */
31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) {
31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
31531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
31541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this BSS. */
31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, bss->id);
31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
31641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
31651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, wpa_s->num_bss,
31661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
31721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects
31781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property.
31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error,
31861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
31921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
319575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (!network_is_persistent_group(ssid))
319675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			num++;
31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
319861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
32001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory");
32011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through configured networks and append object path of each */
32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
320675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (network_is_persistent_group(ssid))
320775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			continue;
32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
32106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_NO_MEMORY,
32116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       "no memory");
32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this network. */
32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, ssid->id);
32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
32221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
32231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
32288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
32291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
323401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path
323501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
323601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure
323701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data
323801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 engine path
323901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
324001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11EnginePath" property.
324101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
324201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_engine_path(DBusMessageIter *iter,
324301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						DBusError *error,
324401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						void *user_data)
324501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
324601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
324701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	const char *pkcs11_engine_path;
324801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
324901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpa_s->conf->pkcs11_engine_path == NULL)
325001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = "";
325101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	else
325201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path;
325301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
325401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						&pkcs11_engine_path, error);
325501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
325601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
325701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
325801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
325901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path
326001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
326101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure
326201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data
326301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 module path
326401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
326501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11ModulePath" property.
326601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
326701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_module_path(DBusMessageIter *iter,
326801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						DBusError *error,
326901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						void *user_data)
327001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
327101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
327201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	const char *pkcs11_module_path;
327301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
327401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpa_s->conf->pkcs11_module_path == NULL)
327501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = "";
327601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	else
327701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = wpa_s->conf->pkcs11_module_path;
327801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
327901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						&pkcs11_module_path, error);
328001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
328101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
328201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
328301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface
32851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property.
32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
32921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error,
32931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   void *user_data)
32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter;
32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob;
32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{say}", &variant_iter) ||
33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "{say}", &dict_iter)) {
33031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
33041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_s->conf->blobs;
33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (blob) {
33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_open_container(&dict_iter,
33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_DICT_ENTRY,
33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      NULL, &entry_iter) ||
33128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_basic(&entry_iter,
33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    DBUS_TYPE_STRING,
33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &(blob->name)) ||
33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_open_container(&entry_iter,
33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_ARRAY,
33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_BYTE_AS_STRING,
33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &array_iter) ||
33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_fixed_array(&array_iter,
33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  DBUS_TYPE_BYTE,
33218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  &(blob->data),
33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  blob->len) ||
33238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&entry_iter,
33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &array_iter) ||
33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&dict_iter,
33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &entry_iter)) {
33271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
33281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
33291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return FALSE;
33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		blob = blob->next;
33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) ||
33361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
33371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
33381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
33421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
33431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args,
33461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       DBusError *error, const char *func_name)
33471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
33481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id);
33491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res) {
33511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found",
33526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   func_name, args->id);
33531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
33541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: BSS %d not found",
33551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       func_name, args->id);
33561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
33571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS
33641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
33651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
33661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property.
33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
33711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(DBusMessageIter *iter, DBusError *error,
33721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       void *user_data)
33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
33751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
33768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
33781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
33791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
33821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->bssid, ETH_ALEN,
33831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
33848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
33888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS
33891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
33901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
33911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
33921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
33938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
33948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property.
33958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
33961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(DBusMessageIter *iter, DBusError *error,
33971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
34001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
34071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->ssid, res->ssid_len,
34081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
34098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
34138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS
34141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property.
34208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
34211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(DBusMessageIter *iter,
34221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
34238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
34251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
34268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t privacy;
34278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
34291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
34301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE;
34331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
34341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&privacy, error);
34358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
34398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS
34401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property.
34468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
34471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(DBusMessageIter *iter, DBusError *error,
34481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
34511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
34528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *mode;
34538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
34551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
34561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
345776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	if (bss_is_dmg(res)) {
345876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		switch (res->caps & IEEE80211_CAP_DMG_MASK) {
345976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_PBSS:
346076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_IBSS:
346176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "ad-hoc";
346276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			break;
346376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_AP:
346476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "infrastructure";
346576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			break;
346676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		}
346776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	} else {
346876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		if (res->caps & IEEE80211_CAP_IBSS)
346976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "ad-hoc";
347076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		else
347176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "infrastructure";
347276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	}
34738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
34751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&mode, error);
34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
34808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS
34811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property.
34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
34881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(DBusMessageIter *iter,
34891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					DBusError *error, void *user_data)
34908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
34921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3493c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	s16 level;
34948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
34961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
34971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3499c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	level = (s16) res->level;
35001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16,
3501c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&level, error);
35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS
35071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property.
35138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
35141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(DBusMessageIter *iter,
35151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   DBusError *error, void *user_data)
35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
35181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3519c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	u16 freq;
35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
35221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
35231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3525c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	freq = (u16) res->freq;
35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16,
3527c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&freq, error);
35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b)
35328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return (*(u8 *) b - *(u8 *) a);
35348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS
35391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property.
35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
35461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(DBusMessageIter *iter,
35471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       DBusError *error, void *user_data)
35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
35501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
35518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ie_rates = NULL;
35528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 *real_rates;
35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int rates_num, i;
35541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
35571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
35581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	rates_num = wpa_bss_get_bit_rates(res, &ie_rates);
35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (rates_num < 0)
35621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	qsort(ie_rates, rates_num, 1, cmp_u8s_desc);
35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	real_rates = os_malloc(sizeof(u32) * rates_num);
35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!real_rates) {
35688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(ie_rates);
35691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
35701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < rates_num; i++)
35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		real_rates[i] = ie_rates[i] * 500000;
35758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32,
35771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 real_rates, rates_num,
35781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ie_rates);
35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(real_rates);
35821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(DBusMessageIter *iter,
35871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   struct wpa_ie_data *ie_data,
35881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   DBusError *error)
35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
35918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *group;
3592fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	const char *pairwise[5]; /* max 5 pairwise ciphers is supported */
3593807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt	const char *key_mgmt[9]; /* max 9 key managements may be supported */
35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
35958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{sv}", &variant_iter))
35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* KeyMgmt */
36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK)
36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk";
36078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK)
36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-psk";
36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256)
36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk-sha256";
36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X)
36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap";
36138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-eap";
36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)
36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-sha256";
3617807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB
36186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B)
36196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		key_mgmt[n++] = "wpa-eap-suite-b";
3620807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB */
3621807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB192
3622807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
3623807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-suite-b-192";
3624807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB192 */
36258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE)
36268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-none";
36278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt",
36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       key_mgmt, n))
36308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Group */
36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch (ie_data->group_cipher) {
36348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP40:
36358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep40";
36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_TKIP:
36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "tkip";
36398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
36408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_CCMP:
36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "ccmp";
36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
364361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	case WPA_CIPHER_GCMP:
364461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		group = "gcmp";
364561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		break;
36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP104:
36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep104";
36488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
3649fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	case WPA_CIPHER_CCMP_256:
3650fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		group = "ccmp-256";
3651fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		break;
3652fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	case WPA_CIPHER_GCMP_256:
3653fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		group = "gcmp-256";
3654fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		break;
36558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
36568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "";
36578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
36588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group))
36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Pairwise */
36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP)
36668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "tkip";
36678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP)
36688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "ccmp";
366961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP)
367061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pairwise[n++] = "gcmp";
3671fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP_256)
3672fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		pairwise[n++] = "ccmp-256";
3673fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP_256)
3674fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		pairwise[n++] = "gcmp-256";
36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise",
36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       pairwise, n))
36788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Management group (RSN only) */
36818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->proto == WPA_PROTO_RSN) {
36828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (ie_data->mgmt_group_cipher) {
36838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
36848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case WPA_CIPHER_AES_128_CMAC:
36858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "aes128cmac";
36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
36888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "";
36908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
36918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
36928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup",
36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 group))
36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
36996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
37038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
37051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
37061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
37078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
37118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS
37121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
37131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
37141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
37151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property.
37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
37191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(DBusMessageIter *iter, DBusError *error,
37201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE);
37336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
37346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
37356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "failed to parse WPA IE");
37366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error);
37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS
37451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
37461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
37471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
37481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property.
37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
37521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(DBusMessageIter *iter, DBusError *error,
37531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_ie(res, WLAN_EID_RSN);
37666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
37676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
37686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "failed to parse RSN IE");
37696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error);
37738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3777d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS
3778d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
3779d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
3780d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
3781d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
3782d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
3783d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property.
3784d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
3785d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(DBusMessageIter *iter, DBusError *error,
3786d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt				     void *user_data)
3787d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
3788d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct bss_handler_args *args = user_data;
3789d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpa_bss *res;
3790d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
3791d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpabuf *wps_ie;
3792d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
3793d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
3794d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *type = "";
3795d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3796d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	res = get_bss_helper(args, error, __func__);
3797d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!res)
3798d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return FALSE;
3799d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3800d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
38016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
38026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
3803d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3804d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3805d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
3806d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE);
3807d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (wps_ie) {
3808d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		if (wps_is_selected_pbc_registrar(wps_ie))
3809d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pbc";
3810d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		else if (wps_is_selected_pin_registrar(wps_ie))
3811d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pin";
38126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
38136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpabuf_free(wps_ie);
3814d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	}
3815d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
3816d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
38176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_append_string(&iter_dict, "Type", type) ||
38186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
38196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
3820d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3821d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3822d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return TRUE;
3823d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3824d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem:
3825d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
3826d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return FALSE;
3827d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
3828d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3829d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3830d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
38318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS
38321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
38331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
38341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
38351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
38368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
38378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property.
38388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
38391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error,
38401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
38418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
38421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
38431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
38448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
38461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
38471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
38488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
38501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res + 1, res->ie_len,
38511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
38528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3856661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen
3857661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
3858661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @error: Location to store error on failure
3859661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @user_data: Function specific data
3860661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
3861661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt *
3862661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Getter for BSS age
3863661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */
3864661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_age(DBusMessageIter *iter, DBusError *error,
3865661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt				     void *user_data)
3866661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
3867661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct bss_handler_args *args = user_data;
3868661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct wpa_bss *res;
3869661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct os_reltime now, diff = { 0, 0 };
3870661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	u32 age;
3871661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
3872661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	res = get_bss_helper(args, error, __func__);
3873661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!res)
3874661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		return FALSE;
3875661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
3876661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	os_get_reltime(&now);
3877661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	os_reltime_sub(&now, &res->last_update, &diff);
3878661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	age = diff.sec > 0 ? diff.sec : 0;
3879661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age,
3880661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt						error);
3881661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
3882661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
3883661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
3884661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/**
38858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled
38861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
38871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
38881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
38891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
38908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
38918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network.
38928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
38931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error,
38941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
38958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
38961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
38978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE;
38981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
38991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
39001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&enabled, error);
39018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
39058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled
39061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
39071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
39081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
39091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
39108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
39118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network.
39128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
39131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(DBusMessageIter *iter, DBusError *error,
39141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
39158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
39178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
39188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
39198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enable;
39208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
39221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &enable))
39231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
39248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = net->wpa_s;
39268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = net->ssid;
39278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (enable)
39298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_enable_network(wpa_s, ssid);
39308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
39318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_disable_network(wpa_s, ssid);
39328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
39348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
39388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network
39391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
39401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
39411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
39421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
39438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
39448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network.
39458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
39461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(DBusMessageIter *iter,
39471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						DBusError *error,
39481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						void *user_data)
39498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
39511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter, dict_iter;
39528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **iterator;
39538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **props = wpa_config_get_all(net->ssid, 1);
39541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!props) {
39571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
39581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
39598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}",
39621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &variant_iter) ||
39638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) {
39641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
39658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
39668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
39698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
39708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&dict_iter, *iterator,
39718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 *(iterator + 1))) {
39721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
39731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
39748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
39758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
39768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator += 2;
39778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) ||
39811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
39821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
39838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
39848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = TRUE;
39871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
39888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
39898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
39908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
39918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(*iterator);
39928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator++;
39938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(props);
39951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
39968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
40008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network
40011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
40021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
40031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
40041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
40058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
40068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network.
40078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
40081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(DBusMessageIter *iter,
40091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						DBusError *error,
40101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						void *user_data)
40118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
40121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
40138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = net->ssid;
40141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter;
40158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
40171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return set_network_properties(net->wpa_s, ssid, &variant_iter, error);
40188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
401904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
402004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
402104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP
402204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
402304949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq(
402404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
402504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
402604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
402704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *name;
402804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
402904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer != NULL) {
403004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (os_strcmp(dbus_message_get_sender(message),
403104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      wpa_s->preq_notify_peer) == 0)
403204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
403304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
403404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
403504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE,
403604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Another application is already subscribed");
403704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
403804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
403904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	name = os_strdup(dbus_message_get_sender(message));
404004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!name)
40416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
404204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
404304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = name;
404404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
404504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Subscribe to clean up if application closes socket */
404604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_subscribe_noc(priv);
404704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
404804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/*
404904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * Double-check it's still alive to make sure that we didn't
405004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * miss the NameOwnerChanged signal, e.g. while strdup'ing.
405104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 */
405204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_bus_name_has_owner(priv->con, name, NULL)) {
405304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		/*
405404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Application no longer exists, clean up.
405504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * The return value is irrelevant now.
405604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 *
405704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Need to check if the NameOwnerChanged handling
405804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * already cleaned up because we have processed
405904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * DBus messages while checking if the name still
406004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * has an owner.
406104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 */
406204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (!wpa_s->preq_notify_peer)
406304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
406404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->preq_notify_peer);
406504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->preq_notify_peer = NULL;
406604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpas_dbus_unsubscribe_noc(priv);
406704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
406804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
406904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
407004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
407104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
407204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
407304949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq(
407404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
407504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
407604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
407704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
407804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_s->preq_notify_peer)
407904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
408004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_NO_SUBSCRIPTION,
408104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Not subscribed");
408204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
408304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_strcmp(wpa_s->preq_notify_peer,
408404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		      dbus_message_get_sender(message)))
408504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
408604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM,
408704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Can't unsubscribe others");
408804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
408904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_free(wpa_s->preq_notify_peer);
409004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = NULL;
409104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_unsubscribe_noc(priv);
409204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
409304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
409404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
409504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
409604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s,
409704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *addr, const u8 *dst, const u8 *bssid,
409804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *ie, size_t ie_len, u32 ssi_signal)
409904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
410004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *msg;
410104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter iter, dict_iter;
410204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
410304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
410404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Do nothing if the control interface is not turned on */
410504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (priv == NULL)
410604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
410704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
410804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer == NULL)
410904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
411004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
411104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
411204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      WPAS_DBUS_NEW_IFACE_INTERFACE,
411304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      "ProbeRequest");
411404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (msg == NULL)
411504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
411604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
411704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_set_destination(msg, wpa_s->preq_notify_peer);
411804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
411904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_iter_init_append(msg, &iter);
412004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
41216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_open_write(&iter, &dict_iter) ||
41226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr",
41236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      (const char *) addr,
41246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      ETH_ALEN)) ||
41256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst",
41266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						     (const char *) dst,
41276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						     ETH_ALEN)) ||
41286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid",
41296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       (const char *) bssid,
41306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       ETH_ALEN)) ||
41316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies",
41326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							      (const char *) ie,
41336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							      ie_len)) ||
41346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal",
41356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       ssi_signal)) ||
41366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&iter, &dict_iter))
413704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
413804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
413904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_connection_send(priv->con, msg, NULL);
414004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	goto out;
414104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail:
414204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
414304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout:
414404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_unref(msg);
414504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
414604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
414704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */
4148