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) {
160cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s->dbus_new_path &&
161cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		    os_strcmp(wpa_s->dbus_new_path, path) == 0)
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return wpa_s;
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set.
1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure
1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   struct wpa_ssid *ssid,
1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   DBusMessageIter *iter,
1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   DBusError *error)
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING };
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter_dict;
1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *value = NULL;
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(iter, &iter_dict, error))
1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t size = 50;
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int ret;
1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto error;
1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		value = NULL;
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (entry.type == DBUS_TYPE_ARRAY &&
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    entry.array_type == DBUS_TYPE_BYTE) {
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (entry.array_len <= 0)
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			size = entry.array_len * 2 + 1;
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = wpa_snprintf_hex(value, size,
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       (u8 *) entry.bytearray_value,
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       entry.array_len);
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_STRING) {
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (should_quote_opt(entry.key)) {
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size = os_strlen(entry.str_value);
2174171258d30a612645aa061cede62233b5c58ca2aDmitry Shmidt				if (size == 0)
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size += 3;
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_zalloc(size);
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				ret = os_snprintf(value, size, "\"%s\"",
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  entry.str_value);
2276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				if (os_snprintf_error(size, ret))
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_strdup(entry.str_value);
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_UINT32) {
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%u",
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.uint32_value);
2416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			if (os_snprintf_error(size, ret))
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_INT32) {
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%d",
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.int32_value);
2506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			if (os_snprintf_error(size, ret))
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_config_set(ssid, entry.key, value, 0) < 0)
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2582f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		if (os_strcmp(entry.key, "bssid") != 0 &&
2592f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		    os_strcmp(entry.key, "priority") != 0)
2602f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
2612f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt
2622f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		if (wpa_s->current_ssid == ssid ||
2632f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		    wpa_s->current_ssid == NULL) {
2642f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			/*
2652f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			 * Invalidate the EAP session cache if anything in the
2662f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			 * current or previously used configuration changes.
2672f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			 */
2682f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			eapol_sm_invalidate_cached_session(wpa_s->eapol);
2692f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		}
2702f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((os_strcmp(entry.key, "psk") == 0 &&
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     value[0] == '"' && ssid->ssid_len) ||
27304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		    (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase))
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_psk(ssid);
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if (os_strcmp(entry.key, "priority") == 0)
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_prio_list(wpa_s->conf);
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(value);
279623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt		value = NULL;
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_dbus_dict_entry_clear(&entry);
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror:
2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(value);
2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_dbus_dict_entry_clear(&entry);
2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS,
2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			     "invalid message format");
2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property
2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value
2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure
3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic.
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter,
3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const int type,
3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const void *val,
3071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error)
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter;
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: given type is not basic", __func__);
3141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
3186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      wpa_dbus_type_as_string(type),
3196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &variant_iter) ||
3206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_append_basic(&variant_iter, type, val) ||
3216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
3226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: error constructing reply", __func__);
3246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
3256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	}
3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored
3361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic.
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter,
3411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
3421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const int type, void *val)
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter;
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: given type is not basic", __func__);
3491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Look at the new value */
3531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&variant_iter) != type) {
3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
3561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "wrong property type");
3571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&variant_iter, val);
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property
3671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type)
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array
3711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure
3721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic.
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter,
3781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   const int type,
3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   const void *array,
3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   size_t array_len,
3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   DBusError *error)
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char type_str[] = "a?"; /* ? will be replaced with subtype letter; */
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *sub_type_str;
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t element_size, i;
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: given type is not basic", __func__);
3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	type_str[1] = sub_type_str[0];
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
3986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      type_str, &variant_iter) ||
3996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      sub_type_str, &array_iter)) {
4011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message", __func__);
4031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	switch (type) {
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BYTE:
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BOOLEAN:
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = 1;
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT16:
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT16:
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint16_t);
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT32:
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT32:
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint32_t);
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT64:
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT64:
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint64_t);
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_DOUBLE:
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(double);
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_STRING:
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_OBJECT_PATH:
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(char *);
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
4311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: unknown element type %d", __func__, type);
4331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < array_len; i++) {
43743cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt		if (!dbus_message_iter_append_basic(&array_iter, type,
438b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt						    (const char *) array +
439b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt						    i * element_size)) {
44043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_FAILED,
44143cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt				       "%s: failed to construct message 2.5",
44243cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt				       __func__);
44343cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt			return FALSE;
44443cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt		}
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter) ||
4486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
4491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message 3", __func__);
4511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
4531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
4541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property
46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type)
46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message
46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array
46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure
46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is
46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic.
46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter,
47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 const int type,
47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 struct wpabuf **array,
47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 size_t array_len,
47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 DBusError *error)
47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char type_str[] = "aa?";
47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char inner_type_str[] = "a?";
47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	const char *sub_type_str;
48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	size_t i;
48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_type_is_basic(type)) {
48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: given type is not basic", __func__);
48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	type_str[2] = sub_type_str[0];
49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	inner_type_str[1] = sub_type_str[0];
49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
49204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
4936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      type_str, &variant_iter) ||
4946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      inner_type_str, &array_iter)) {
49604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message", __func__);
49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
501c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt	for (i = 0; i < array_len && array[i]; i++) {
50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_dbus_dict_bin_array_add_element(&array_iter,
50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_head(array[i]),
50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_len(array[i]));
50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
50704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
5086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter) ||
5096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
5116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to close message", __func__);
51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
51604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
520293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * wpas_dbus_string_property_getter - Get string type property
521293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * @iter: Message iter to use when appending arguments
522293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * @val: Pointer to place holding property value, can be %NULL
523293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * @error: On failure an error describing the failure
524293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
525293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt *
526293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * Generic getter for string type properties. %NULL is converted to an empty
527293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt * string.
528293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt */
529293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidtdbus_bool_t wpas_dbus_string_property_getter(DBusMessageIter *iter,
530293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt					     const void *val,
531293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt					     DBusError *error)
532293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt{
533293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt	if (!val)
534293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt		val = "";
535293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
536293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt						&val, error);
537293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt}
538293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt
539293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt
540293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt/**
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object,
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage.
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter_dict;
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter;
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry;
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *driver = NULL;
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *confname = NULL;
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *bridge_ifname = NULL;
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL))
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error;
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
5706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if (os_strcmp(entry.key, "Driver") == 0 &&
5716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    entry.type == DBUS_TYPE_STRING) {
572623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(driver);
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			driver = os_strdup(entry.str_value);
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (driver == NULL)
576ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "Ifname") == 0 &&
5786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
579623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(ifname);
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(entry.str_value);
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ifname == NULL)
583ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "ConfigFile") == 0 &&
5856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
586623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(confname);
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			confname = os_strdup(entry.str_value);
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (confname == NULL)
590ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "BridgeIfname") == 0 &&
5926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
593623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(bridge_ifname);
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			bridge_ifname = os_strdup(entry.str_value);
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (bridge_ifname == NULL)
597ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error; /* Required Ifname argument missing */
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Try to get the wpa_supplicant record for this iface, return
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * an error if we already control it.
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_get_iface(global, ifname) != NULL) {
6126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = dbus_message_new_error(
6136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message, WPAS_DBUS_ERROR_IFACE_EXISTS,
6146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant already controls this interface.");
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_supplicant *wpa_s;
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_interface iface;
6186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memset(&iface, 0, sizeof(iface));
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.driver = driver;
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.ifname = ifname;
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.confname = confname;
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.bridge_ifname = bridge_ifname;
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Otherwise, have wpa_supplicant attach to it. */
625203eadb9eda41a1dde4a583edb4684319e3f399eDmitry Shmidt		wpa_s = wpa_supplicant_add_iface(global, &iface, NULL);
626cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s && wpa_s->dbus_new_path) {
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *path = wpa_s->dbus_new_path;
6286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_method_return(message);
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH,
6316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						 &path, DBUS_TYPE_INVALID);
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_unknown_error(
6346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
6356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"wpa_supplicant couldn't grab this interface.");
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(driver);
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ifname);
64261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os_free(confname);
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(bridge_ifname);
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror:
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_error_invalid_args(message, NULL);
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	goto out;
649ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtoom:
650ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	reply = wpas_dbus_error_no_memory(message);
651ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	goto out;
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          failure (0), or returns a dbus error message with more information
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call.  Handles requests
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages.
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message,
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *path;
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path,
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = get_iface_by_dbus_path(global, path);
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_iface_unknown(message);
679c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) {
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
6816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
6826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant couldn't remove this interface.");
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object,
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call.
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message,
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      struct wpa_global *global)
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname;
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *path;
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname,
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = wpa_supplicant_get_iface(global, ifname);
710cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s == NULL || wpa_s->dbus_new_path == NULL)
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_iface_unknown(message);
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	path = wpa_s->dbus_new_path;
7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL)
7166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
7206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level
7291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property.
7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
736d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(
737d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
738d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str;
7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int idx = wpa_debug_level;
7421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx < 0)
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 0;
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx > 5)
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 5;
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str = debug_strings[idx];
7481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
7491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp
7551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property.
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
762d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(
763d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
764d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_timestamp, error);
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys
7741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property.
7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
781d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(
782d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
783d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_show_keys, error);
7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level
7921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property.
7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
799d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(
800d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
801d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str = NULL;
8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, val = -1;
8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
8081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &str))
8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; debug_strings[i]; i++)
8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(debug_strings[i], str) == 0) {
8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			val = i;
8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (val < 0 ||
8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp,
8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    wpa_debug_show_keys)) {
8206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
8216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "wrong debug level value");
8221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp
8311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property.
8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
838d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(
839d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
840d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0,
8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_show_keys);
8511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys
8571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property.
8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
864d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(
865d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
866d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level,
8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_timestamp,
8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					val ? 1 : 0);
8781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list
8841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests
8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects
8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths
8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
893d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(
894d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
895d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char **paths;
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
9011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
903cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
904cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s->dbus_new_path)
905cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			num++;
906cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
90861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
914cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
915cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s->dbus_new_path)
916cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			paths[i++] = wpa_s->dbus_new_path;
917cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
9201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
9211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list
9301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
9311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
9321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
9331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests
9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
938d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(
939d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
940d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **eap_methods;
9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t num_items = 0;
9441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eap_methods = eap_get_names_as_string_array(&num_items);
9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!eap_methods) {
9481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
9491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
9531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_STRING,
9541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 eap_methods,
9551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 num_items, error);
9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (num_items)
9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(eap_methods[--num_items]);
9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(eap_methods);
9601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities
966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to
972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS,
973d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time.
974d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
975d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(
976d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
977d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
978d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
979d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL };
980d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	size_t num_items = 0;
981d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
982d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP
983d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ap";
984d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */
985d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN
986d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ibss-rsn";
987d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */
988d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P
989d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "p2p";
990d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */
991d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING
992d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "interworking";
993d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */
994092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart#ifdef CONFIG_IEEE80211W
995092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	capabilities[num_items++] = "pmf";
996092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart#endif /* CONFIG_IEEE80211W */
997d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
998d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter,
999d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      DBUS_TYPE_STRING,
1000d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      capabilities,
1001d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      num_items, error);
1002d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
1003d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
1004d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var,
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char **type, DBusMessage **reply)
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) {
10096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a string",
10106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Type value type. String required");
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(var, type);
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var,
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    struct wpa_driver_scan_params *params,
10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    DBusMessage **reply)
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_ssid *ssids = params->ssids;
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t ssids_num = 0;
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ssid;
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
10326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ssids must be an array of arrays of bytes",
10346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong SSIDs value type. Array of arrays of bytes required");
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
10446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) {
10456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ssids must be an array of arrays of bytes",
10476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong SSIDs value type. Array of arrays of bytes required");
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) {
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ssids_num >= WPAS_MAX_SCAN_SSIDS) {
10566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
10576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Too many ssids specified on scan dbus call",
10586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
10606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
10616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"Too many ssids specified. Specify at most four");
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10699d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt		if (len > SSID_MAX_LEN) {
1070c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			wpa_printf(MSG_DEBUG,
10716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: SSID too long (len=%d max_len=%d)",
10729d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt				   __func__, len, SSID_MAX_LEN);
1073c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
1074c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				message, "Invalid SSID: too long");
1075c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			return -1;
1076c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		}
1077c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len != 0) {
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = os_malloc(len);
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ssid == NULL) {
10816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				*reply = wpas_dbus_error_no_memory(message);
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_memcpy(ssid, val, len);
10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Allow zero-length SSIDs */
10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = NULL;
10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid = ssid;
10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid_len = len;
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids_num++;
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->num_ssids = ssids_num;
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var,
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  struct wpa_driver_scan_params *params,
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  DBusMessage **reply)
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ies = NULL, *nies;
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ies_len = 0;
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
11136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
11146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ies must be an array of arrays of bytes",
11156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
11186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong IEs value type. Array of arrays of bytes required");
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
11256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) {
11266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
11276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ies must be an array of arrays of bytes",
11286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong IEs value type. Array required");
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) {
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len == 0) {
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_iter_next(&array_iter);
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		nies = os_realloc(ies, ies_len + len);
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (nies == NULL) {
11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ies);
11466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			*reply = wpas_dbus_error_no_memory(message);
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies = nies;
11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memcpy(ies + ies_len, val, len);
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies_len += len;
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies = ies;
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies_len = ies_len;
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message,
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessageIter *var,
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_driver_scan_params *params,
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessage **reply)
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int *freqs = NULL, *nfreqs;
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int freqs_num = 0;
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
11726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
11736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: Channels must be an array of structs",
11746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
11776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong Channels value type. Array of structs required");
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) {
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG,
11856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: Channels must be an array of structs",
11866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
11896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong Channels value type. Array of structs required");
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT)
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int freq, width;
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dbus_message_iter_get_arg_type(&sub_array_iter) !=
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
12016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
12026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Channel must by specified by struct of two UINT32s %c",
12036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__,
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   dbus_message_iter_get_arg_type(
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   &sub_array_iter));
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
12076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
12086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &freq);
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_next(&sub_array_iter) ||
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    dbus_message_iter_get_arg_type(&sub_array_iter) !=
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
12176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
12186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Channel must by specified by struct of two UINT32s",
12196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message,
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &width);
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs_num % FREQS_ALLOC_CHUNK == 0) {
123161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			nfreqs = os_realloc_array(
123261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				freqs, freqs_num + FREQS_ALLOC_CHUNK,
123361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				sizeof(int));
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (nfreqs == NULL)
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_free(freqs);
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			freqs = nfreqs;
12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs == NULL) {
12396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			*reply = wpas_dbus_error_no_memory(message);
12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs[freqs_num] = freq;
12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs_num++;
12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
124961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int));
12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (nfreqs == NULL)
12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(freqs);
12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs = nfreqs;
12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (freqs == NULL) {
12546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		*reply = wpas_dbus_error_no_memory(message);
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs[freqs_num] = 0;
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->freqs = freqs;
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1264051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpas_dbus_get_scan_allow_roam(DBusMessage *message,
1265051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 DBusMessageIter *var,
1266051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 dbus_bool_t *allow,
1267051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 DBusMessage **reply)
1268051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{
1269051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN) {
12706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a boolean",
12716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
1272051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
1273051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			message, "Wrong Type value type. Boolean required");
1274051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		return -1;
1275051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1276051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	dbus_message_iter_get_basic(var, allow);
1277051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	return 0;
1278051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt}
1279051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1280051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface.
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     struct wpa_supplicant *wpa_s)
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, dict_iter, entry_iter, variant_iter;
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *key = NULL, *type = NULL;
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_params params;
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t i;
1299051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	dbus_bool_t allow_roam = 1;
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&params, 0, sizeof(params));
13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &dict_iter);
13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&dict_iter) ==
13086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	       DBUS_TYPE_DICT_ENTRY) {
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&dict_iter, &entry_iter);
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&entry_iter, &key);
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&entry_iter);
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&entry_iter, &variant_iter);
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, "Type") == 0) {
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_type(message, &variant_iter,
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &type, &reply) < 0)
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "SSIDs") == 0) {
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ssids(message, &variant_iter,
13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     &params, &reply) < 0)
13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "IEs") == 0) {
13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ies(message, &variant_iter,
13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   &params, &reply) < 0)
13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "Channels") == 0) {
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_channels(message, &variant_iter,
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							&params, &reply) < 0)
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
1330051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		} else if (os_strcmp(key, "AllowRoam") == 0) {
1331051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			if (wpas_dbus_get_scan_allow_roam(message,
1332051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &variant_iter,
1333051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &allow_roam,
1334051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &reply) < 0)
1335051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt				goto out;
13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
13376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown argument %s",
13386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__, key);
13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(message, key);
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&dict_iter);
13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!type) {
13476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Scan type not specified",
13486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, key);
13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (os_strcmp(type, "passive") == 0) {
13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (params.num_ssids || params.extra_ies_len) {
13556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
13566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: SSIDs or IEs specified for passive scan.",
13576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(
13596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
13606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"You can specify only Channels in passive scan");
13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
1363cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			if (wpa_s->sched_scanning) {
1364cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_printf(MSG_DEBUG,
1365cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt					   "%s[dbus]: Stop ongoing sched_scan to allow requested scan to proceed",
1366cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt					   __func__);
1367cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_supplicant_cancel_sched_scan(wpa_s);
1368cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			}
1369cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
1370cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			if (params.freqs && params.freqs[0]) {
1371d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt				wpa_s->last_scan_req = MANUAL_SCAN_REQ;
1372cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				if (wpa_supplicant_trigger_scan(wpa_s,
1373cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt								&params)) {
1374cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt					reply = wpas_dbus_error_scan_error(
1375cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt						message,
1376cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt						"Scan request rejected");
1377cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				}
1378cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			} else {
1379cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_s->scan_req = MANUAL_SCAN_REQ;
1380cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_supplicant_req_scan(wpa_s, 0, 0);
1381cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			}
13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	} else if (os_strcmp(type, "active") == 0) {
13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!params.num_ssids) {
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Add wildcard ssid */
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			params.num_ssids++;
13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
138804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
138904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
139004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
1391cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s->sched_scanning) {
1392cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			wpa_printf(MSG_DEBUG,
1393cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				   "%s[dbus]: Stop ongoing sched_scan to allow requested scan to proceed",
1394cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				   __func__);
1395cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			wpa_supplicant_cancel_sched_scan(wpa_s);
1396cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		}
1397cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
1398d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		wpa_s->last_scan_req = MANUAL_SCAN_REQ;
13997dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt		if (wpa_supplicant_trigger_scan(wpa_s, &params)) {
14007dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt			reply = wpas_dbus_error_scan_error(
14017dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt				message, "Scan request rejected");
14027dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt		}
14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
14046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown scan type: %s",
14056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, type);
14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message,
14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     "Wrong scan type");
14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1411051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (!allow_roam)
1412051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		wpa_s->scan_res_handler = scan_only_handler;
1413051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free((u8 *) params.ssids[i].ssid);
14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free((u8 *) params.extra_ies);
14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(params.freqs);
14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1423661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/**
1424661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_handler_signal_poll - Request immediate signal properties
1425661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @message: Pointer to incoming dbus message
1426661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1427661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
1428661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt *
1429661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Handler function for "SignalPoll" method call of a network device. Requests
1430661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * that wpa_supplicant read signal properties like RSSI, noise, and link
1431661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * speed and return them.
1432661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */
1433661b4f78e48c697429dc46154a4125892c001718Dmitry ShmidtDBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
1434661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
1435661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
1436661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct wpa_signal_info si;
1437661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	DBusMessage *reply = NULL;
1438661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	DBusMessageIter iter, iter_dict, variant_iter;
1439661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	int ret;
1440661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1441661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	ret = wpa_drv_signal_poll(wpa_s, &si);
1442661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (ret) {
1443661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
1444661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					      "Failed to read signal");
1445661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	}
1446661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1447661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	reply = dbus_message_new_method_return(message);
1448661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (reply == NULL)
1449661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1450661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1451661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
1452661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1453661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
14546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
14556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) ||
14566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "rssi",
14576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_signal) ||
14586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
14596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_txrate / 1000) ||
14606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "noise",
14616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_noise) ||
14626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_uint32(&iter_dict, "frequency",
14636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					 si.frequency) ||
14646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.chanwidth != CHAN_WIDTH_UNKNOWN &&
14656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_append_string(
14666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_dict, "width",
14676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     channel_width_to_string(si.chanwidth))) ||
14686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.center_frq1 > 0 && si.center_frq2 > 0 &&
14696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
14706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					  si.center_frq1) ||
14716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	      !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
14726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					  si.center_frq2))) ||
14736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.avg_signal &&
14746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
14756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					 si.avg_signal)) ||
14766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
14776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(&iter, &variant_iter))
1478661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1479661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1480661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return reply;
1481661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1482661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtnomem:
1483661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (reply)
1484661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		dbus_message_unref(reply);
14856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return wpas_dbus_error_no_memory(message);
1486661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
1487661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1488661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise.
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface.
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
15027f2c753f60025528366b5f19b8b490a47bf5080bDmitry Shmidt		wpas_request_disconnection(wpa_s);
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "This interface is not connected");
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network
15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface.
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter;
15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = NULL;
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf;
15261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusError error;
15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1530cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->dbus_new_path)
1531d13095b921f259373b91480bc40fb53172ca4860Dmitry Shmidt		ssid = wpa_supplicant_add_network(wpa_s);
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
15336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.",
15346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message,
15376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant could not add a network on this interface.");
15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_error_init(&error);
15421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!set_network_properties(wpa_s, ssid, &iter, &error)) {
15436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
15446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: control interface couldn't set network properties",
15456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
15461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_reply_new_from_error(message, &error,
15471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       DBUS_ERROR_INVALID_ARGS,
15481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       "Failed to add network");
15491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_error_free(&error);
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Construct the object path for this network. */
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_s->dbus_new_path, ssid->id);
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL) {
15606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
15666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid) {
15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpas_notify_network_removed(wpa_s, ssid);
15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_config_remove_network(wpa_s->conf, ssid->id);
15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1582413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate
158361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message
158461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1585413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled
158661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise.
158761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *
158861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface.
158961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */
159061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message,
159161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
159261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
1593413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) {
1594d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpas_request_connection(wpa_s);
159561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
159661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
159761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1598413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_DISABLED,
1599413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt				      "This interface is disabled");
160061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
160161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
160261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
160361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/**
1604d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * wpas_dbus_handler_expect_disconnect - ExpectDisconnect
1605d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * @message: Pointer to incoming dbus message
1606d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * @global: %wpa_supplicant global data structure
1607d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * Returns: NULL
1608d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt *
1609d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * Handler function for notifying system there will be a expected disconnect.
1610d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * This will prevent wpa_supplicant from adding blacklists upon next disconnect..
1611d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt */
1612d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry ShmidtDBusMessage * wpas_dbus_handler_expect_disconnect(DBusMessage *message,
1613d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt						  struct wpa_global *global)
1614d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{
1615d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	struct wpa_supplicant *wpa_s = global->ifaces;
1616d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
1617d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	for (; wpa_s; wpa_s = wpa_s->next)
1618d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		if (wpa_s->wpa_state >= WPA_ASSOCIATED)
1619d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			wpa_s->own_disconnect_req = 1;
1620d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	return NULL;
1621d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt}
1622d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
1623d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
1624d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt/**
16259866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * wpas_dbus_handler_reattach - Reattach to current AP
16269866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @message: Pointer to incoming dbus message
16279866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16289866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Returns: NotConnected DBus error message if not connected
16299866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * or NULL otherwise.
16309866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt *
16319866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Handler function for "Reattach" method call of network interface.
16329866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt */
16339866086a955d00e237cc8df3722e7dff75c02532Dmitry ShmidtDBusMessage * wpas_dbus_handler_reattach(DBusMessage *message,
16349866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
16359866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{
16369866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
16379866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		wpa_s->reattach = 1;
16389866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		wpas_request_connection(wpa_s);
16399866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		return NULL;
16409866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	}
16419866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16429866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
16439866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt				      "This interface is not connected");
16449866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt}
16459866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16469866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16479866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt/**
1648a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * wpas_dbus_handler_reconnect - Reconnect if disconnected
1649a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * @message: Pointer to incoming dbus message
1650a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1651a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled
1652a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * or NULL otherwise.
1653a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt *
1654a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * Handler function for "Reconnect" method call of network interface.
1655a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt */
1656a3dc30964aa24aea2b518246f6812663a1103490Dmitry ShmidtDBusMessage * wpas_dbus_handler_reconnect(DBusMessage *message,
1657a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt		struct wpa_supplicant *wpa_s)
1658a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt{
1659a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
1660a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt		return dbus_message_new_error(message,
1661a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt					      WPAS_DBUS_ERROR_IFACE_DISABLED,
1662a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt					      "This interface is disabled");
1663a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt	}
1664a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt
1665a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt	if (wpa_s->disconnected)
1666a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt		wpas_request_connection(wpa_s);
1667a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt	return NULL;
1668a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt}
1669a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt
1670a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt
1671a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt/**
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface.
16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
16846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
1686d13095b921f259373b91480bc40fb53172ca4860Dmitry Shmidt	int result;
16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
16936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
16946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
16956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1696cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
1697d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1702d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1704d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1709d13095b921f259373b91480bc40fb53172ca4860Dmitry Shmidt	result = wpa_supplicant_remove_network(wpa_s, id);
1710d13095b921f259373b91480bc40fb53172ca4860Dmitry Shmidt	if (result == -1) {
17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1714d13095b921f259373b91480bc40fb53172ca4860Dmitry Shmidt	if (result == -2) {
1715684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		wpa_printf(MSG_ERROR,
17166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: error occurred when removing network %d",
17176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, id);
1718684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		reply = wpas_dbus_error_unknown_error(
17196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
17206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"error removing the specified network on is interface.");
1721684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		goto out;
1722684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	}
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid)
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s = arg;
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) {
17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR,
17386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: error occurred when removing network %d",
17396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, ssid->id);
17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
1744d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
1745d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface.
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks(
17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17602f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	if (wpa_s->sched_scanning)
17612f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
17622f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* NB: could check for failure and return an error */
17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s);
17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network
17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface.
17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message,
17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
17826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
17916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
17926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
17936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1794cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
1795d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1800d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1802d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Finally, associate with the network */
18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_select_network(wpa_s, ssid);
18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
18231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal
18241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message
18251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
18261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure
18271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
18281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface.
18291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */
18301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message,
18311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      struct wpa_supplicant *wpa_s)
18321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
18331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL
18341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessage *reply = NULL;
18351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *op, *field, *value;
18366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
18371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int id;
18381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_ssid *ssid;
18391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
18416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_OBJECT_PATH, &op,
18426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_STRING, &field,
18436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_STRING, &value,
18446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_INVALID))
18451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpas_dbus_error_invalid_args(message, NULL);
18461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Extract the network ID and ensure the network */
18481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* is actually a child of this interface */
18496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
18506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
18516c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1852cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
1853d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
18541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
18551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1858d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
18591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	id = strtoul(net_id, NULL, 10);
1860d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
18611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, net_id);
18621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
18661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (ssid == NULL) {
18671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
18681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid,
18721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      field, value) < 0)
18731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, field);
18741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	else {
18751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		/* Tell EAP to retry immediately */
18761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		eapol_sm_notify_ctrl_response(wpa_s->eapol);
18771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout:
18801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(iface);
18811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return reply;
18821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */
1883b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	wpa_printf(MSG_DEBUG, "dbus: 802.1X not included");
18841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_error_unknown_error(message, "802.1X not included");
18851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */
18861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
18871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1889700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS
1890700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
18911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/**
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates)
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs.
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message,
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *blob_data;
19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int blob_len;
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob = NULL;
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &blob_name);
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_get_blob(wpa_s->conf, blob_name)) {
19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_EXISTS,
19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array_iter);
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len);
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = os_zalloc(sizeof(*blob));
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
19266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->data = os_malloc(blob_len);
19316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	blob->name = os_strdup(blob_name);
19326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!blob->data || !blob->name) {
19336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(blob->data, blob_data, blob_len);
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->len = blob_len;
19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_blob(wpa_s->conf, blob);
19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_added(wpa_s, blob->name);
19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (blob) {
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->name);
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->data);
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob);
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates)
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob)
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs.
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message,
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct wpa_config_blob *blob;
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_config_get_blob(wpa_s->conf, blob_name);
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
19826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!reply)
19836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      DBUS_TYPE_BYTE_AS_STRING,
19896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &array_iter) ||
19906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE,
19916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						  &(blob->data), blob->len) ||
19926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(&iter, &array_iter)) {
19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
19946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob
20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error
20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs.
20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message,
20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_blob(wpa_s->conf, blob_name)) {
20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_removed(wpa_s, blob_name);
20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2029700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */
2030700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
2031700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache
20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface.
20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message,
20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t age;
20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age,
20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (age == 0)
20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush(wpa_s);
20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush_by_age(wpa_s, age);
20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
205704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
205804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
205904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface
206004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message
206104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
206204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL
206304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
206404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface.
206504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
206604949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message,
206704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					 struct wpa_supplicant *wpa_s)
206804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
206904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *reply = NULL;
207004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	enum wpa_states state = wpa_s->wpa_state;
207104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *arg;
207204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
207304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg,
207404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      DBUS_TYPE_INVALID);
207504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
207604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (arg != NULL && os_strlen(arg) > 0) {
207704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		char *tmp;
20786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
207904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		tmp = os_strdup(arg);
208004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (tmp == NULL) {
20816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			reply = wpas_dbus_error_no_memory(message);
208204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else {
208304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			os_free(wpa_s->conf->autoscan);
208404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			wpa_s->conf->autoscan = tmp;
208504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
208604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				autoscan_init(wpa_s, 1);
208704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			else if (state == WPA_SCANNING)
208804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				wpa_supplicant_reinit_autoscan(wpa_s);
208904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		}
209004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else if (arg != NULL && os_strlen(arg) == 0) {
209104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->conf->autoscan);
209204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->conf->autoscan = NULL;
209304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
209404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else
209504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		reply = dbus_message_new_error(message,
209604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       DBUS_ERROR_INVALID_ARGS,
209704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       NULL);
209804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
209904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return reply;
210004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
210104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
210204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
210304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
21048da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/*
21058da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logoff - IEEE 802.1X EAPOL state machine logoff
21068da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message
21078da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
21088da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL
21098da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt *
21108da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogoff" method call of network interface.
21118da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */
21128da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logoff(DBusMessage *message,
21138da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
21148da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{
21158da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	eapol_sm_notify_logoff(wpa_s->eapol, TRUE);
21168da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	return NULL;
21178da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt}
21188da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
21198da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
21208da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/*
21218da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logon - IEEE 802.1X EAPOL state machine logon
21228da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message
21238da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
21248da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL
21258da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt *
21268da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogin" method call of network interface.
21278da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */
21288da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message,
21298da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
21308da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{
21318da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	eapol_sm_notify_logoff(wpa_s->eapol, FALSE);
21328da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	return NULL;
21338da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt}
21348da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
21358da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
2136e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef CONFIG_TDLS
2137e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21387d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidtstatic int get_peer_hwaddr_helper(DBusMessage *message, const char *func_name,
21397d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt				  u8 *peer_address, DBusMessage **error)
2140e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2141e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	const char *peer_string;
2142e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21437d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	*error = NULL;
21447d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt
2145e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
2146e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				   DBUS_TYPE_STRING, &peer_string,
21477d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt				   DBUS_TYPE_INVALID)) {
21487d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		*error = wpas_dbus_error_invalid_args(message, NULL);
21497d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		return -1;
21507d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	}
2151e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2152e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (hwaddr_aton(peer_string, peer_address)) {
2153e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s: invalid address '%s'",
2154e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			   func_name, peer_string);
21557d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		*error = wpas_dbus_error_invalid_args(
2156e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "Invalid hardware address format");
21577d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		return -1;
2158e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2159e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21607d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	return 0;
2161e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2162e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2163e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2164e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2165e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_discover - Discover TDLS peer
2166e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2167e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2168e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2169e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2170e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSDiscover" method call of network interface.
2171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2172e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message,
2173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					      struct wpa_supplicant *wpa_s)
2174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2175e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2176e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2177e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2178e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21797d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2180e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2181e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2182e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_DISCOVER " MACSTR, MAC2STR(peer));
2183e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2184e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2185e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer);
2186e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2187e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer);
2188e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2189e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2190e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2191e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS discovery");
2192e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2193e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2194e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2195e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2196e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2197e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2198e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2199e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_setup - Setup TDLS session
2200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2201e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSSetup" method call of network interface.
2205e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2206e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message,
2207e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					   struct wpa_supplicant *wpa_s)
2208e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2209e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2210e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2211e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2212e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22137d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2214e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2215e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2216e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_SETUP " MACSTR, MAC2STR(peer));
2217e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2218e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_tdls_remove(wpa_s->wpa, peer);
2219e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2220e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_start(wpa_s->wpa, peer);
2221e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2222e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
2223e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2224e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2225e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2226e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS setup");
2227e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2228e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2229e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2230e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2231e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2232e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2233e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2234e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_status - Return TDLS session status
2235e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2236e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2237e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: A string representing the state of the link to this TDLS peer
2238e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2239e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSStatus" method call of network interface.
2240e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2241e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_status(DBusMessage *message,
2242e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					    struct wpa_supplicant *wpa_s)
2243e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2244e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2245e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *reply;
2246e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	const char *tdls_status;
2247e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22487d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &reply) < 0)
2249e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return reply;
2250e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2251e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_STATUS " MACSTR, MAC2STR(peer));
2252e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2253e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	tdls_status = wpa_tdls_get_link_status(wpa_s->wpa, peer);
2254e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2255e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	reply = dbus_message_new_method_return(message);
2256e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	dbus_message_append_args(reply, DBUS_TYPE_STRING,
2257e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				 &tdls_status, DBUS_TYPE_INVALID);
2258e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return reply;
2259e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2260e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2261e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2262e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2263e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_teardown - Teardown TDLS session
2264e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2265e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2266e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2267e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2268e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSTeardown" method call of network interface.
2269e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2270e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message,
2271e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					      struct wpa_supplicant *wpa_s)
2272e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2273e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2274e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2275e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2276e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22777d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2278e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2279e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2280e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_TEARDOWN " MACSTR, MAC2STR(peer));
2281e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2282e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2283e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_teardown_link(
2284e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			wpa_s->wpa, peer,
2285e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
2286e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2287e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer);
2288e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2289e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2290e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2291e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS teardown");
2292e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2293e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2294e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2295e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2296e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2297e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* CONFIG_TDLS */
2298e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2299e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2300b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE
2301b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt/**
2302b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * wpas_dbus_handler_save_config - Save configuration to configuration file
2303b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * @message: Pointer to incoming dbus message
2304b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2305b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * Returns: NULL on Success, Otherwise errror message
2306b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt *
2307b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * Handler function for "SaveConfig" method call of network interface.
2308b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt */
2309b70d0bbd90f638aa38da542e337c312309200e87Dmitry ShmidtDBusMessage * wpas_dbus_handler_save_config(DBusMessage *message,
2310b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
2311b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt{
2312b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	int ret;
2313b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt
2314b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	if (!wpa_s->conf->update_config) {
2315b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt		return wpas_dbus_error_unknown_error(
2316b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt			message,
2317b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt			"Not allowed to update configuration (update_config=0)");
2318b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	}
2319b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt
2320b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	ret = wpa_config_write(wpa_s->confname, wpa_s->conf);
2321b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	if (ret)
2322b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt		return wpas_dbus_error_unknown_error(
2323b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt			message, "Failed to update configuration");
2324b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	return NULL;
2325b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt}
2326b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */
2327b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt
2328b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt
23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
233001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
233101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @message: Pointer to incoming dbus message
233201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
233301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
233401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
233501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Sets the PKCS #11 engine and module path.
233601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
233701904cfafd75a70b9f29c0220b90bdef45595491Dmitry ShmidtDBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path(
233801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
233901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
234001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	DBusMessageIter iter;
234101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *value = NULL;
234201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *pkcs11_engine_path = NULL;
234301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *pkcs11_module_path = NULL;
234401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
234501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_init(message, &iter);
234601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &value);
234701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (value == NULL) {
234801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
234901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS,
235001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Invalid pkcs11_engine_path argument");
235101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
235201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	/* Empty path defaults to NULL */
235301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (os_strlen(value))
235401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = value;
235501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
235601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_next(&iter);
235701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &value);
235801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (value == NULL) {
235901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		os_free(pkcs11_engine_path);
236001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
236101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS,
236201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Invalid pkcs11_module_path argument");
236301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
236401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	/* Empty path defaults to NULL */
236501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (os_strlen(value))
236601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = value;
236701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
236801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path,
236901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						   pkcs11_module_path))
237001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
237101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_FAILED,
23726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed.");
237301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
2374cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->dbus_new_path) {
2375cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		wpa_dbus_mark_property_changed(
2376cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			wpa_s->global->dbus, wpa_s->dbus_new_path,
2377cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath");
2378cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		wpa_dbus_mark_property_changed(
2379cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			wpa_s->global->dbus, wpa_s->dbus_new_path,
2380cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath");
2381cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
238201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
238301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return NULL;
238401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
238501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
238601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
238701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities
23891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
23901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
23911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
23921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface.
23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2396d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(
2397d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2398d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_capa capa;
24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
24031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array,
24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		variant_iter;
24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *scans[] = { "active", "passive", "ssid" };
24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
24086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
24096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_drv_get_capa(wpa_s, &capa);
24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** pairwise cipher */
24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {"ccmp", "tkip", "none"};
24176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Pairwise", args,
242068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise",
24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
24266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
24276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) &&
24286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp-256")) ||
24306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) &&
24316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp-256")) ||
24336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) &&
24346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp")) ||
24366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) &&
24376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp")) ||
24396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) &&
24406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "tkip")) ||
24426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) &&
24436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "none")) ||
24456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** group cipher */
24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"ccmp", "tkip", "wep104", "wep40"
24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
24576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Group", args,
246068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group",
24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
24666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
24676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) &&
24686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp-256")) ||
24706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) &&
24716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp-256")) ||
24736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) &&
24746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp")) ||
24766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) &&
24776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp")) ||
24796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) &&
24806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "tkip")) ||
24826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) &&
24836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wep104")) ||
24856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) &&
24866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wep40")) ||
24886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2495092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	if (!wpa_dbus_dict_begin_string_array(&iter_dict, "GroupMgmt",
2496092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart					      &iter_dict_entry,
2497092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart					      &iter_dict_val,
2498092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart					      &iter_array) ||
2499092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	    (res == 0 && (capa.enc & WPA_DRIVER_CAPA_ENC_BIP) &&
2500092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	     !wpa_dbus_dict_string_array_add_element(
2501092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart		     &iter_array, "aes-128-cmac")) ||
2502092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	    (res == 0 && (capa.enc & WPA_DRIVER_CAPA_ENC_BIP_GMAC_128) &&
2503092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	     !wpa_dbus_dict_string_array_add_element(
2504092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart		     &iter_array, "bip-gmac-128")) ||
2505092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	    (res == 0 && (capa.enc & WPA_DRIVER_CAPA_ENC_BIP_GMAC_256) &&
2506092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	     !wpa_dbus_dict_string_array_add_element(
2507092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart		     &iter_array, "bip-gmac-256")) ||
2508092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	    (res == 0 && (capa.enc & WPA_DRIVER_CAPA_ENC_BIP_CMAC_256) &&
2509092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	     !wpa_dbus_dict_string_array_add_element(
2510092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart		     &iter_array, "bip-cmac-256")) ||
2511092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	    !wpa_dbus_dict_end_string_array(&iter_dict,
2512092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart					    &iter_dict_entry,
2513092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart					    &iter_dict_val,
2514092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart					    &iter_array))
2515092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart		goto nomem;
2516092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart
25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** key management */
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wpa-psk", "wpa-eap", "ieee8021x", "wpa-none",
25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wps",
25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"none"
25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "KeyMgmt", args,
252868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt",
25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
25346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
25356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
25366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							    "none") ||
25376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "ieee8021x"))
25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) {
25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				    &iter_array, "wpa-eap") ||
25456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			    ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) &&
25466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     !wpa_dbus_dict_string_array_add_element(
25476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     &iter_array, "wpa-ft-eap")))
25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-eap-sha256"))
25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) {
25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				    &iter_array, "wpa-psk") ||
25626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			    ((capa.key_mgmt &
25636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			      WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) &&
25646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     !wpa_dbus_dict_string_array_add_element(
25656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     &iter_array, "wpa-ft-psk")))
25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-psk-sha256"))
25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) &&
25776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
25786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							    "wpa-none"))
25796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			goto nomem;
25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "wps"))
25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** WPA protocol */
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "rsn", "wpa" };
25986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Protocol", args,
260168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol",
26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
26076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
26086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
26096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) &&
26106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
26116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "rsn")) ||
26126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
26136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) &&
26146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
26156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wpa")) ||
26166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** auth alg */
26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "open", "shared", "leap" };
26266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "AuthAlg", args,
262968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg",
26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if (((capa.auth & WPA_DRIVER_AUTH_OPEN) &&
26396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
26406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "open")) ||
26416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.auth & WPA_DRIVER_AUTH_SHARED) &&
26426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
26436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "shared")) ||
26446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.auth & WPA_DRIVER_AUTH_LEAP) &&
26456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
26466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "leap")) ||
26476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Scan */
26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans,
265668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt					       ARRAY_SIZE(scans)))
26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Modes */
266075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes",
266175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_entry,
266275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_val,
26636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &iter_array) ||
26646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_string_array_add_element(
26656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    &iter_array, "infrastructure") ||
2666849734c8d1847920ed7042463f7480b1e0c1dfeaDmitry Shmidt	    (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_IBSS) &&
2667849734c8d1847920ed7042463f7480b1e0c1dfeaDmitry Shmidt	     !wpa_dbus_dict_string_array_add_element(
2668849734c8d1847920ed7042463f7480b1e0c1dfeaDmitry Shmidt		     &iter_array, "ad-hoc")) ||
26696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_AP) &&
26706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_string_array_add_element(
26716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_array, "ap")) ||
26726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) &&
2673b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt	     !wpa_s->conf->p2p_disabled &&
26746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_string_array_add_element(
26756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_array, "p2p")) ||
26766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_end_string_array(&iter_dict,
267775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_entry,
267875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_val,
267975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_array))
268075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
268175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	/***** Modes end */
268275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
26831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res >= 0) {
26841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_int32_t max_scan_ssid = capa.max_scan_ssids;
26851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
26861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID",
26871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						max_scan_ssid))
26881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto nomem;
26891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
26901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
26916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
26926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
26948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
26981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
26991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state
27051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property.
27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2712d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_state(
2713d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2714d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str_state;
27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *state_ls, *tmp;
27191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str_state = wpa_supplicant_state_txt(wpa_s->wpa_state);
27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* make state string lowercase to fit new DBus API convention
27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	state_ls = tmp = os_strdup(str_state);
27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!tmp) {
27271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
27281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*tmp) {
27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*tmp = tolower(*tmp);
27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tmp++;
27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
27361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   &state_ls, error);
27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(state_ls);
27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state
27461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property.
27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2753d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(
2754d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2755d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE;
27591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
27601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
27611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&scanning, error);
27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode
27671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property.
27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2774d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(
2775d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2776d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan = wpa_s->conf->ap_scan;
27801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
27811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
27821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ap_scan, error);
27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode
27881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property.
27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2795d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(
2796d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2797d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan;
28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
28031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &ap_scan))
28041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) {
28071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
28081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "ap_scan must be 0, 1, or 2");
28091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2815092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart#ifdef CONFIG_IEEE80211W
2816092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart
2817092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart/**
2818092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * wpas_dbus_getter_pmf - Control PMF default
2819092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @iter: Pointer to incoming dbus message iter
2820092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @error: Location to store error on failure
2821092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @user_data: Function specific data
2822092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * Returns: TRUE on success, FALSE on failure
2823092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart *
2824092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * Getter function for "Pmf" property.
2825092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart */
2826092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewartdbus_bool_t wpas_dbus_getter_pmf(
2827092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	const struct wpa_dbus_property_desc *property_desc,
2828092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	DBusMessageIter *iter, DBusError *error, void *user_data)
2829092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart{
2830092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	struct wpa_supplicant *wpa_s = user_data;
2831092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	dbus_uint32_t pmf = wpa_s->conf->pmf;
2832092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart
2833092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
2834092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart						&pmf, error);
2835092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart}
2836092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart
2837092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart
2838092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart/**
2839092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * wpas_dbus_setter_pmf - Control PMF default
2840092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @iter: Pointer to incoming dbus message iter
2841092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @error: Location to store error on failure
2842092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * @user_data: Function specific data
2843092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * Returns: TRUE on success, FALSE on failure
2844092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart *
2845092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart * Setter function for "Pmf" property.
2846092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart */
2847092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewartdbus_bool_t wpas_dbus_setter_pmf(
2848092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	const struct wpa_dbus_property_desc *property_desc,
2849092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	DBusMessageIter *iter, DBusError *error, void *user_data)
2850092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart{
2851092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	struct wpa_supplicant *wpa_s = user_data;
2852092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	dbus_uint32_t pmf;
2853092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart
2854092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
2855092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart					      &pmf))
2856092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart		return FALSE;
2857092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart
2858092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	if (pmf > 2) {
2859092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart		dbus_set_error_const(error, DBUS_ERROR_FAILED,
2860092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart				     "Pmf must be 0, 1, or 2");
2861092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart		return FALSE;
2862092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	}
2863092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	wpa_s->conf->pmf = pmf;
2864092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart	return TRUE;
2865092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart}
2866092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart
2867092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart#endif /* CONFIG_IEEE80211W */
2868092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart
2869092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart
28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2871c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast
2872c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2873c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2874c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2875c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2876c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2877c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2878c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property.
2879c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2880d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(
2881d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2882d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
2883c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2884c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2885c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE;
2886c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2887c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
2888c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&fast_reauth, error);
2889c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2890c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2891c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2892c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
2893c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast
2894c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2895c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2896c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2897c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2898c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2899c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2900c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property.
2901c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2902d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(
2903d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2904d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
2905c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2906c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2907c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth;
2908c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2909c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
2910c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					      &fast_reauth))
2911c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		return FALSE;
2912c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2913c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	wpa_s->conf->fast_reauth = fast_reauth;
2914c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return TRUE;
2915c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2916c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2917c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2918c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
291904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect
292004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
292104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
292204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
292304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
292404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
292504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property.  The reason is negative if it is
292604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated.
292704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
2928d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(
2929d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2930d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
293104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
293204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
293304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t reason = wpa_s->disconnect_reason;
29346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
293504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
293604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&reason, error);
293704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
293804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
293904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
294004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
294131a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * wpas_dbus_getter_assoc_status_code - Get most recent failed assoc status code
294231a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
294331a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * @error: Location to store error on failure
294431a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * @user_data: Function specific data
294531a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
294631a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt *
294731a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt * Getter for "AssocStatusCode" property.
294831a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt */
294931a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidtdbus_bool_t wpas_dbus_getter_assoc_status_code(
295031a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
295131a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
295231a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt{
295331a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
295431a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt	dbus_int32_t status_code = wpa_s->assoc_status_code;
295531a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt
295631a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
295731a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt						&status_code, error);
295831a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt}
295931a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt
296031a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt
296131a29cc7ed87b62465c7e01f03484f4643d12309Dmitry Shmidt/**
29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age
29631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property.
29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2970d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(
2971d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2972d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age;
29761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
29771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
29781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_age, error);
29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age
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 * Setter function for "BSSExpireAge" property.
29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2991d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(
2992d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2993d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age;
29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
29991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_age))
30001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) {
30031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
30041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireAge must be >= 10");
30051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count
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 function for "BSSExpireCount" property.
30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3020d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(
3021d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3022d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
302561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count;
30261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
30271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
30281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_count, error);
30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count
30341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property.
30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3041d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(
3042d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3043d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_count;
30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
30491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_count))
30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) {
30531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
30541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireCount must be > 0");
30551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code
30631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property.
30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3070d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_country(
3071d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3072d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char country[3];
30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *str = country;
30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[0] = wpa_s->conf->country[0];
30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[1] = wpa_s->conf->country[1];
30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[2] = '\0';
30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
30831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code
30891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property.
30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3096d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_country(
3097d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3098d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *country;
31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
31041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &country))
31051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!country[0] || !country[1]) {
31081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
31091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "invalid country code");
31101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
31111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) {
31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "Failed to set country");
31151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
31161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "failed to set country code");
31171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[0] = country[0];
31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[1] = country[1];
31221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
312704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval
312804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
312904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
313004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
313104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
313204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
313304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property.
313404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
3135d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(
3136d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3137d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
313804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
313904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
314004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval = wpa_s->scan_interval;
314104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
314204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
314304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&scan_interval, error);
314404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
314504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
314604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
314704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
314804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval
314904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
315004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
315104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
315204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
315304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
315404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property.
315504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
3156d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(
3157d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3158d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
315904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
316004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
316104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval;
316204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
316304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32,
316404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      &scan_interval))
316504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
316604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
316704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) {
316804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
316904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     "scan_interval must be >= 0");
317004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
317104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
317204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
317304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
317404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
317504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
317604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name
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 "Ifname" property.
31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3185d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(
3186d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3187d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3191293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt	return wpas_dbus_string_property_getter(iter, wpa_s->ifname, error);
31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name
31971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property.
32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3204d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(
3205d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3206d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) {
32116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: wpa_s has no driver set",
32126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
32131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set",
32141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       __func__);
32151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3218293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt	return wpas_dbus_string_property_getter(iter, wpa_s->driver->name,
3219293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt						error);
32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path
32251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property.
32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3232d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(
3233d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3234d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
32358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf;
32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3239cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->current_bss && wpa_s->dbus_new_path)
32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_bss->id);
32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
32448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
32471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bss_obj_path, error);
32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path
32531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property.
32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3260d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(
3261d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3262d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf;
32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3267cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->current_ssid && wpa_s->dbus_new_path)
32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_ssid->id);
32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
32751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&net_obj_path, error);
32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type
32811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property.
32878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3288d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(
3289d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3290d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *eap_mode;
32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *auth_mode;
32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX];
32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->wpa_state != WPA_COMPLETED) {
32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = "INACTIVE";
32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X ||
33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eap_mode = wpa_supplicant_get_eap_mode(wpa_s);
33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX,
33038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "EAP-%s", eap_mode);
33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = eap_mode_buf;
33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33064ae50e65ef0eefe6d5c356acbc1839f8eac68af5Dmitry Shmidt	} else if (wpa_s->current_ssid) {
33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt,
33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_s->current_ssid->proto);
33094ae50e65ef0eefe6d5c356acbc1839f8eac68af5Dmitry Shmidt	} else {
33104ae50e65ef0eefe6d5c356acbc1839f8eac68af5Dmitry Shmidt		auth_mode = "UNKNOWN";
33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
33141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&auth_mode, error);
33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name
33201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
33211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
33221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
33231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property.
33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3327d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(
3328d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3329d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
33326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
3333293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt	return wpas_dbus_string_property_getter(iter, wpa_s->bridge_ifname,
3334293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt						error);
33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
33397d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * wpas_dbus_getter_config_file - Get interface configuration file path
33407d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
33417d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * @error: Location to store error on failure
33427d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * @user_data: Function specific data
33437d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
33447d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt *
33457d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt * Getter for "ConfigFile" property.
33467d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt */
33477d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidtdbus_bool_t wpas_dbus_getter_config_file(
33487d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
33497d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
33507d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt{
33517d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
33527d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt
3353293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt	return wpas_dbus_string_property_getter(iter, wpa_s->confname, error);
33547d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt}
33557d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt
33567d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt
33577d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt/**
33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects
33591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
33601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
33611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
33621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
33648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property.
33658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3366d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(
3367d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3368d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *bss;
33728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0;
33741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
33758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3376cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (!wpa_s->dbus_new_path) {
3377cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3378cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			       "%s: no D-Bus interface", __func__);
3379cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		return FALSE;
3380cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
3381cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
338261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(wpa_s->num_bss, sizeof(char *));
33838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
33841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
33851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through scan results and append each result's object path */
33898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) {
33908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
33918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
33921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
33931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
33948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
33958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this BSS. */
33978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
33998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, bss->id);
34008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, wpa_s->num_bss,
34051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
34068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
34088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
34098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
34108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
34111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
34128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
34168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects
34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property.
34238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3424d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(
3425d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3426d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
34278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
34298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
34308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
34321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
34338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3434cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (!wpa_s->dbus_new_path) {
3435cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3436cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			       "%s: no D-Bus interface", __func__);
3437cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		return FALSE;
3438cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
3439cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
34408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
344175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (!network_is_persistent_group(ssid))
344275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			num++;
34438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
344461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
34458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
34461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory");
34471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through configured networks and append object path of each */
34518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
345275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (network_is_persistent_group(ssid))
345375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			continue;
34548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
34558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
34566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_NO_MEMORY,
34576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       "no memory");
34588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
34598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
34608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this network. */
34628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
34638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
34648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, ssid->id);
34658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
34681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
34691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
34708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
34728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
34738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
34751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
348001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path
348101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
348201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure
348301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data
348401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 engine path
348501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
348601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11EnginePath" property.
348701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
3488d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_engine_path(
3489d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3490d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
349101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
349201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
349301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
3494293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt	return wpas_dbus_string_property_getter(iter,
3495293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt						wpa_s->conf->pkcs11_engine_path,
3496293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt						error);
349701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
349801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
349901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
350001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
350101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path
350201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
350301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure
350401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data
350501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 module path
350601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
350701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11ModulePath" property.
350801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
3509d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_module_path(
3510d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3511d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
351201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
351301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
351401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
3515293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt	return wpas_dbus_string_property_getter(iter,
3516293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt						wpa_s->conf->pkcs11_module_path,
3517293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt						error);
351801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
351901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
352001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
352101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
35228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface
35231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property.
35298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3530d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(
3531d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3532d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
35338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
35351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter;
35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob;
35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
35398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{say}", &variant_iter) ||
35408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
35418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "{say}", &dict_iter)) {
35421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
35431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_s->conf->blobs;
35478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (blob) {
35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_open_container(&dict_iter,
35498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_DICT_ENTRY,
35508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      NULL, &entry_iter) ||
35518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_basic(&entry_iter,
35528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    DBUS_TYPE_STRING,
35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &(blob->name)) ||
35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_open_container(&entry_iter,
35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_ARRAY,
35568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_BYTE_AS_STRING,
35578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &array_iter) ||
35588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_fixed_array(&array_iter,
35598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  DBUS_TYPE_BYTE,
35608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  &(blob->data),
35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  blob->len) ||
35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&entry_iter,
35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &array_iter) ||
35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&dict_iter,
35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &entry_iter)) {
35661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
35671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
35681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return FALSE;
35698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		blob = blob->next;
35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) ||
35751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
35761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
35771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
35811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
35821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
35831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3584d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_iface_global(
3585d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3586d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
3587d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{
3588d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
3589d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	int ret;
3590d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	char buf[250];
3591d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	char *p = buf;
3592d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3593d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (!property_desc->data) {
3594d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
3595d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       "Unhandled interface property %s",
3596d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       property_desc->dbus_property);
3597d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		return FALSE;
3598d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	}
3599d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3600d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	ret = wpa_config_get_value(property_desc->data, wpa_s->conf, buf,
3601d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt				   sizeof(buf));
3602d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (ret < 0)
3603d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		*p = '\0';
3604d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3605d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, &p,
3606d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt						error);
3607d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt}
3608d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3609d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3610d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_iface_global(
3611d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3612d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
3613d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{
3614d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
3615d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const char *new_value = NULL;
3616d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	char buf[250];
3617d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	size_t combined_len;
3618d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	int ret;
3619d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3620d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
3621d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt					      &new_value))
3622d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		return FALSE;
3623d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3624d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	combined_len = os_strlen(property_desc->data) + os_strlen(new_value) +
3625d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		3;
3626d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (combined_len >= sizeof(buf)) {
3627d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
3628d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       "Interface property %s value too large",
3629d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       property_desc->dbus_property);
3630d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		return FALSE;
3631d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	}
3632d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3633d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (!new_value[0])
3634d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		new_value = "NULL";
3635d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3636d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	ret = os_snprintf(buf, combined_len, "%s=%s", property_desc->data,
3637d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			  new_value);
3638d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (os_snprintf_error(combined_len, ret)) {
3639d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		dbus_set_error(error,  WPAS_DBUS_ERROR_UNKNOWN_ERROR,
3640d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       "Failed to construct new interface property %s",
3641d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       property_desc->dbus_property);
3642d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		return FALSE;
3643d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	}
3644d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3645d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (wpa_config_process_global(wpa_s->conf, buf, -1)) {
3646d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
3647d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       "Failed to set interface property %s",
3648d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       property_desc->dbus_property);
3649d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		return FALSE;
3650d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	}
3651d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3652d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	wpa_supplicant_update_config(wpa_s);
3653d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	return TRUE;
3654d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt}
3655d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3656d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
36571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args,
36581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       DBusError *error, const char *func_name)
36591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
36601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id);
36611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
36621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res) {
36631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found",
36646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   func_name, args->id);
36651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
36661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: BSS %d not found",
36671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       func_name, args->id);
36681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
36691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
36701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS
36761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
36771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
36781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
36791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
36818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property.
36828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3683d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(
3684d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3685d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
36881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
36911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
36921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
36951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->bssid, ETH_ALEN,
36961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS
37021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
37031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
37041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
37051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
37068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
37078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property.
37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3709d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(
3710d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3711d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
37128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
37211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->ssid, res->ssid_len,
37221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
37278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS
37281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
37291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
37301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
37311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property.
37348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3735d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(
3736d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3737d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t privacy;
37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE;
37481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
37491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&privacy, error);
37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS
37551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
37561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
37571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
37581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
37608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property.
37618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3762d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(
3763d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3764d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *mode;
3769ebd93af924f6e54fb4982b3312ff875a4896b62bDmitry Shmidt	const u8 *mesh;
37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
377476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	if (bss_is_dmg(res)) {
377576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		switch (res->caps & IEEE80211_CAP_DMG_MASK) {
377676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_PBSS:
377776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_IBSS:
377876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "ad-hoc";
377976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			break;
378076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_AP:
378176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "infrastructure";
378276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			break;
3783092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart		default:
3784092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart			mode = "";
3785092955c7394ee96d6c8c9724ff46a3c038b36143Paul Stewart			break;
378676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		}
378776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	} else {
3788ebd93af924f6e54fb4982b3312ff875a4896b62bDmitry Shmidt		mesh = wpa_bss_get_ie(res, WLAN_EID_MESH_ID);
3789ebd93af924f6e54fb4982b3312ff875a4896b62bDmitry Shmidt		if (mesh)
3790ebd93af924f6e54fb4982b3312ff875a4896b62bDmitry Shmidt			mode = "mesh";
3791ebd93af924f6e54fb4982b3312ff875a4896b62bDmitry Shmidt		else if (res->caps & IEEE80211_CAP_IBSS)
379276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "ad-hoc";
379376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		else
379476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "infrastructure";
379576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	}
37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
37981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&mode, error);
37998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS
38041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
38051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
38061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
38071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property.
38108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3811d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(
3812d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3813d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
38151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
38161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3817c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	s16 level;
38188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
38201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
38211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
38228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3823c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	level = (s16) res->level;
38241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16,
3825c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&level, error);
38268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
38308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS
38311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
38321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
38331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
38341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
38358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
38368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property.
38378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3838d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(
3839d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3840d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
38418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
38421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
38431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3844c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	u16 freq;
38458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
38471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
38481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
38498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3850c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	freq = (u16) res->freq;
38511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16,
3852c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&freq, error);
38538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b)
38578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
38588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return (*(u8 *) b - *(u8 *) a);
38598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
38638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS
38641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
38651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
38661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
38671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
38688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
38698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property.
38708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3871d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(
3872d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3873d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
38748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
38751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
38761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
38778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ie_rates = NULL;
38788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 *real_rates;
38798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int rates_num, i;
38801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
38818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
38831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
38841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
38858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	rates_num = wpa_bss_get_bit_rates(res, &ie_rates);
38878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (rates_num < 0)
38881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
38898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	qsort(ie_rates, rates_num, 1, cmp_u8s_desc);
38918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	real_rates = os_malloc(sizeof(u32) * rates_num);
38938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!real_rates) {
38948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(ie_rates);
38951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
38961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
38978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
38988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < rates_num; i++)
39008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		real_rates[i] = ie_rates[i] * 500000;
39018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32,
39031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 real_rates, rates_num,
39041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
39058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ie_rates);
39078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(real_rates);
39081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
39098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3912d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(
3913d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3914d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, struct wpa_ie_data *ie_data, DBusError *error)
39158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
39178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *group;
3918fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	const char *pairwise[5]; /* max 5 pairwise ciphers is supported */
3919807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt	const char *key_mgmt[9]; /* max 9 key managements may be supported */
39208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
39218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
39238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{sv}", &variant_iter))
39248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
39258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
39278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
39288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* KeyMgmt */
39308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
39318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK)
39328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk";
39338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK)
39348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-psk";
39358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256)
39368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk-sha256";
39378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X)
39388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap";
39398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
39408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-eap";
39418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)
39428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-sha256";
3943807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB
39446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B)
39456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		key_mgmt[n++] = "wpa-eap-suite-b";
3946807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB */
3947807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB192
3948807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
3949807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-suite-b-192";
3950807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB192 */
39518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE)
39528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-none";
39538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt",
39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       key_mgmt, n))
39568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
39578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Group */
39598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch (ie_data->group_cipher) {
39608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP40:
39618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep40";
39628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
39638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_TKIP:
39648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "tkip";
39658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
39668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_CCMP:
39678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "ccmp";
39688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
396961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	case WPA_CIPHER_GCMP:
397061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		group = "gcmp";
397161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		break;
39728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP104:
39738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep104";
39748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
3975fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	case WPA_CIPHER_CCMP_256:
3976fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		group = "ccmp-256";
3977fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		break;
3978fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	case WPA_CIPHER_GCMP_256:
3979fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		group = "gcmp-256";
3980fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		break;
39818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
39828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "";
39838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
39848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group))
39878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
39888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Pairwise */
39908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
39918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP)
39928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "tkip";
39938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP)
39948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "ccmp";
399561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP)
399661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pairwise[n++] = "gcmp";
3997fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP_256)
3998fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		pairwise[n++] = "ccmp-256";
3999fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP_256)
4000fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		pairwise[n++] = "gcmp-256";
40018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise",
40038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       pairwise, n))
40048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
40058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Management group (RSN only) */
40078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->proto == WPA_PROTO_RSN) {
40088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (ie_data->mgmt_group_cipher) {
40098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
40108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case WPA_CIPHER_AES_128_CMAC:
40118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "aes128cmac";
40128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
40138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
40148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
40158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "";
40168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
40178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
40188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup",
40208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 group))
40218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
40228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
40238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
40256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
40268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
40278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
40298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
40311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
40321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
40338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
40348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
40378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS
40381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
40391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
40401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
40411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
40428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
40438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property.
40448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4045d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(
4046d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4047d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
40488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
40491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
40501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
40518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
40528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
40538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
40551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
40561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
40578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
40598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE);
40606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
40616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
40626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "failed to parse WPA IE");
40636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
40648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
40658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4066d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	return wpas_dbus_get_bss_security_prop(property_desc, iter, &wpa_data, error);
40678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
40688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
40718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS
40721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
40731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
40741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
40751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
40768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
40778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property.
40788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4079d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(
4080d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4081d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
40828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
40831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
40841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
40858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
40868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
40878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
40891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
40901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
40918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
40938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_ie(res, WLAN_EID_RSN);
40946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
40956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
40966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "failed to parse RSN IE");
40976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
40988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
40998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4100d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	return wpas_dbus_get_bss_security_prop(property_desc, iter, &wpa_data, error);
41018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
41028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
4105d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS
4106d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
4107d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
4108d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
4109d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
4110d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
4111d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property.
4112d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
4113d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(
4114d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4115d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
4116d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
4117d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct bss_handler_args *args = user_data;
4118d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpa_bss *res;
4119d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
4120d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpabuf *wps_ie;
4121d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
4122d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
41238347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt	int wps_support = 0;
4124d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *type = "";
4125d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4126d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	res = get_bss_helper(args, error, __func__);
4127d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!res)
4128d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return FALSE;
4129d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4130d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
41316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
41326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
4133d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
4134d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4135d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
4136d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE);
4137d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (wps_ie) {
41388347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt		wps_support = 1;
4139d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		if (wps_is_selected_pbc_registrar(wps_ie))
4140d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pbc";
4141d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		else if (wps_is_selected_pin_registrar(wps_ie))
4142d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pin";
41436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
41446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpabuf_free(wps_ie);
4145d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	}
4146d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
4147d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
41488347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt	if ((wps_support && !wpa_dbus_dict_append_string(&iter_dict, "Type", type)) ||
41496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
41506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
4151d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
4152d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4153d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return TRUE;
4154d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4155d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem:
4156d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
4157d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return FALSE;
4158d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
4159d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4160d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4161d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
41628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS
41631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
41641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
41651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
41661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
41678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
41688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property.
41698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4170d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(
4171d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4172d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
41738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
41741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
41751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
41768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
41781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
41791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
41808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
41821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res + 1, res->ie_len,
41831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
41848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
41858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
4188661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen
4189661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
4190661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @error: Location to store error on failure
4191661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @user_data: Function specific data
4192661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
4193661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt *
4194661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Getter for BSS age
4195661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */
4196d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_age(
4197d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4198d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
4199661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
4200661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct bss_handler_args *args = user_data;
4201661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct wpa_bss *res;
4202661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct os_reltime now, diff = { 0, 0 };
4203661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	u32 age;
4204661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4205661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	res = get_bss_helper(args, error, __func__);
4206661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!res)
4207661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		return FALSE;
4208661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4209661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	os_get_reltime(&now);
4210661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	os_reltime_sub(&now, &res->last_update, &diff);
4211661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	age = diff.sec > 0 ? diff.sec : 0;
4212661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age,
4213661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt						error);
4214661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
4215661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4216661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4217661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/**
42188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled
42191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
42201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
42211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
42221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
42238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
42248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network.
42258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4226d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(
4227d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4228d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
42298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
42301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
42318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE;
42321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
42331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
42341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&enabled, error);
42358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
42368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
42398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled
42401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
42411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
42421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
42431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
42448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
42458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network.
42468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4247d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(
4248d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4249d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
42508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
42511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
42528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
42538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
42548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enable;
42558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
42571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &enable))
42581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
42598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = net->wpa_s;
42618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = net->ssid;
42628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (enable)
42648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_enable_network(wpa_s, ssid);
42658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
42668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_disable_network(wpa_s, ssid);
42678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
42698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
42708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
42738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network
42741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
42751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
42761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
42771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
42788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
42798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network.
42808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4281d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(
4282d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4283d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
42848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
42851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
42861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter, dict_iter;
42878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **iterator;
42888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **props = wpa_config_get_all(net->ssid, 1);
42891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
42908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!props) {
42921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
42931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
42948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
42958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}",
42971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &variant_iter) ||
42988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) {
42991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
43008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
43018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
43028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
43038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
43048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
43058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&dict_iter, *iterator,
43068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 *(iterator + 1))) {
43071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
43081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
43098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
43108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
43118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator += 2;
43128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
43138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
43148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
43158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) ||
43161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
43171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
43188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
43198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
43208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
43211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = TRUE;
43221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
43238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
43248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
43258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
43268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(*iterator);
43278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator++;
43288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
43298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(props);
43301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
43318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
43328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
43338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
43348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
43358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network
43361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
43371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
43381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
43391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
43408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
43418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network.
43428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4343d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(
4344d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4345d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
43468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
43471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
43488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = net->ssid;
43491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter;
43508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
43511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
43521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return set_network_properties(net->wpa_s, ssid, &variant_iter, error);
43538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
435404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
435504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
435604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP
435704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
435804949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq(
435904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
436004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
436104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
436204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *name;
436304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
436404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer != NULL) {
436504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (os_strcmp(dbus_message_get_sender(message),
436604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      wpa_s->preq_notify_peer) == 0)
436704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
436804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
436904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
437004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE,
437104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Another application is already subscribed");
437204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
437304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
437404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	name = os_strdup(dbus_message_get_sender(message));
437504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!name)
43766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
437704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
437804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = name;
437904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
438004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Subscribe to clean up if application closes socket */
438104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_subscribe_noc(priv);
438204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
438304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/*
438404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * Double-check it's still alive to make sure that we didn't
438504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * miss the NameOwnerChanged signal, e.g. while strdup'ing.
438604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 */
438704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_bus_name_has_owner(priv->con, name, NULL)) {
438804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		/*
438904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Application no longer exists, clean up.
439004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * The return value is irrelevant now.
439104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 *
439204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Need to check if the NameOwnerChanged handling
439304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * already cleaned up because we have processed
439404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * DBus messages while checking if the name still
439504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * has an owner.
439604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 */
439704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (!wpa_s->preq_notify_peer)
439804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
439904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->preq_notify_peer);
440004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->preq_notify_peer = NULL;
440104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpas_dbus_unsubscribe_noc(priv);
440204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
440304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
440404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
440504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
440604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
440704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
440804949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq(
440904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
441004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
441104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
441204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
441304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_s->preq_notify_peer)
441404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
441504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_NO_SUBSCRIPTION,
441604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Not subscribed");
441704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
441804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_strcmp(wpa_s->preq_notify_peer,
441904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		      dbus_message_get_sender(message)))
442004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
442104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM,
442204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Can't unsubscribe others");
442304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
442404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_free(wpa_s->preq_notify_peer);
442504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = NULL;
442604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_unsubscribe_noc(priv);
442704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
442804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
442904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
443004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
443104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s,
443204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *addr, const u8 *dst, const u8 *bssid,
443304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *ie, size_t ie_len, u32 ssi_signal)
443404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
443504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *msg;
443604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter iter, dict_iter;
443704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
443804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
443904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Do nothing if the control interface is not turned on */
4440cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (priv == NULL || !wpa_s->dbus_new_path)
444104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
444204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
444304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer == NULL)
444404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
444504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
444604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
444704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      WPAS_DBUS_NEW_IFACE_INTERFACE,
444804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      "ProbeRequest");
444904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (msg == NULL)
445004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
445104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
445204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_set_destination(msg, wpa_s->preq_notify_peer);
445304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
445404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_iter_init_append(msg, &iter);
445504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
44566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_open_write(&iter, &dict_iter) ||
44576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr",
44586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      (const char *) addr,
44596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      ETH_ALEN)) ||
44606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst",
44616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						     (const char *) dst,
44626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						     ETH_ALEN)) ||
44636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid",
44646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       (const char *) bssid,
44656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       ETH_ALEN)) ||
44666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies",
44676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							      (const char *) ie,
44686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							      ie_len)) ||
44696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal",
44706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       ssi_signal)) ||
44716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&iter, &dict_iter))
447204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
447304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
447404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_connection_send(priv->con, msg, NULL);
447504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	goto out;
447604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail:
447704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
447804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout:
447904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_unref(msg);
448004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
448104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
448204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */
448355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
448455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
448555840adb6cd32ca52064f327b72a40e769f70661Dmitry ShmidtDBusMessage * wpas_dbus_handler_vendor_elem_add(DBusMessage *message,
448655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt						struct wpa_supplicant *wpa_s)
448755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt{
448855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	u8 *ielems;
448955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	int len;
449055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	struct ieee802_11_elems elems;
449155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_int32_t frame_id;
449255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	DBusMessageIter	iter, array;
449355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
449455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_init(message, &iter);
449555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &frame_id);
449655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (frame_id < 0 || frame_id >= NUM_VENDOR_ELEM_FRAMES) {
449755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
449855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Invalid ID");
449955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
450055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
450155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_next(&iter);
450255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array);
450355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array, &ielems, &len);
450455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!ielems || len == 0) {
450555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(
450655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS, "Invalid value");
450755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
450855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
450955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (ieee802_11_parse_elems(ielems, len, &elems, 0) == ParseFailed) {
451055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
451155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Parse error");
451255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
451355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
451455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	wpa_s = wpas_vendor_elem(wpa_s, frame_id);
451555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!wpa_s->vendor_elem[frame_id]) {
451655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		wpa_s->vendor_elem[frame_id] = wpabuf_alloc_copy(ielems, len);
451755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		wpas_vendor_elem_update(wpa_s);
451855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return NULL;
451955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
452055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
452155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (wpabuf_resize(&wpa_s->vendor_elem[frame_id], len) < 0) {
452255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
452355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Resize error");
452455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
452555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
452655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	wpabuf_put_data(wpa_s->vendor_elem[frame_id], ielems, len);
452755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	wpas_vendor_elem_update(wpa_s);
452855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	return NULL;
452955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt}
453055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
453155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
453255840adb6cd32ca52064f327b72a40e769f70661Dmitry ShmidtDBusMessage * wpas_dbus_handler_vendor_elem_get(DBusMessage *message,
453355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt						struct wpa_supplicant *wpa_s)
453455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt{
453555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	DBusMessage *reply;
453655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	DBusMessageIter	iter, array_iter;
453755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_int32_t frame_id;
453855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	const u8 *elem;
453955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	size_t elem_len;
454055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
454155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_init(message, &iter);
454255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &frame_id);
454355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
454455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (frame_id < 0 || frame_id >= NUM_VENDOR_ELEM_FRAMES) {
454555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
454655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Invalid ID");
454755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
454855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
454955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	wpa_s = wpas_vendor_elem(wpa_s, frame_id);
455055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!wpa_s->vendor_elem[frame_id]) {
455155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
455255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "ID value does not exist");
455355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
455455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
455555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	reply = dbus_message_new_method_return(message);
455655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!reply)
455755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return wpas_dbus_error_no_memory(message);
455855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
455955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
456055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
456155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	elem = wpabuf_head_u8(wpa_s->vendor_elem[frame_id]);
456255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	elem_len = wpabuf_len(wpa_s->vendor_elem[frame_id]);
456355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
456455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
456555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      DBUS_TYPE_BYTE_AS_STRING,
456655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      &array_iter) ||
456755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	    !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE,
456855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt						  &elem, elem_len) ||
456955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	    !dbus_message_iter_close_container(&iter, &array_iter)) {
457055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		dbus_message_unref(reply);
457155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
457255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
457355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
457455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	return reply;
457555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt}
457655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
457755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
457855840adb6cd32ca52064f327b72a40e769f70661Dmitry ShmidtDBusMessage * wpas_dbus_handler_vendor_elem_remove(DBusMessage *message,
457955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt						   struct wpa_supplicant *wpa_s)
458055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt{
458155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	u8 *ielems;
458255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	int len;
458355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	struct ieee802_11_elems elems;
458455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	DBusMessageIter	iter, array;
458555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_int32_t frame_id;
458655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
458755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_init(message, &iter);
458855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &frame_id);
458955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (frame_id < 0 || frame_id >= NUM_VENDOR_ELEM_FRAMES) {
459055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
459155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Invalid ID");
459255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
459355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
459455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_next(&iter);
459555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array);
459655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array, &ielems, &len);
459755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!ielems || len == 0) {
459855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
459955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Invalid value");
460055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
460155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
460255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	wpa_s = wpas_vendor_elem(wpa_s, frame_id);
460355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
460455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (len == 1 && *ielems == '*') {
460555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		wpabuf_free(wpa_s->vendor_elem[frame_id]);
460655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		wpa_s->vendor_elem[frame_id] = NULL;
460755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		wpas_vendor_elem_update(wpa_s);
460855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return NULL;
460955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
461055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
461155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!wpa_s->vendor_elem[frame_id]) {
461255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
461355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "ID value does not exist");
461455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
461555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
461655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (ieee802_11_parse_elems(ielems, len, &elems, 0) == ParseFailed) {
461755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
461855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Parse error");
461955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
462055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
462155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (wpas_vendor_elem_remove(wpa_s, frame_id, ielems, len) == 0)
462255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return NULL;
462355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
462455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
462555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt				      "Not found");
462655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt}
4627