dbus_new_handlers.c revision cc00d5dc8483e32158b2ba61ea44b0c38d790ed7
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);
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry 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,
43843cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt						    array + i * element_size)) {
43943cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_FAILED,
44043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt				       "%s: failed to construct message 2.5",
44143cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt				       __func__);
44243cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt			return FALSE;
44343cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt		}
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter) ||
4476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
4481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message 3", __func__);
4501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
4521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
4531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
45804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property
45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type)
46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message
46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array
46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure
46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is
46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic.
46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter,
47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 const int type,
47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 struct wpabuf **array,
47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 size_t array_len,
47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 DBusError *error)
47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char type_str[] = "aa?";
47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char inner_type_str[] = "a?";
47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	const char *sub_type_str;
47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	size_t i;
48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_type_is_basic(type)) {
48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: given type is not basic", __func__);
48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	type_str[2] = sub_type_str[0];
48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	inner_type_str[1] = sub_type_str[0];
49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
4926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      type_str, &variant_iter) ||
4936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      inner_type_str, &array_iter)) {
49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message", __func__);
49704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
500c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt	for (i = 0; i < array_len && array[i]; i++) {
50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_dbus_dict_bin_array_add_element(&array_iter,
50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_head(array[i]),
50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_len(array[i]));
50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
5076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter) ||
5086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
50904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
5106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to close message", __func__);
51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
51604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object,
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage.
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter_dict;
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter;
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry;
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *driver = NULL;
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *confname = NULL;
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *bridge_ifname = NULL;
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL))
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error;
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
5486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if (os_strcmp(entry.key, "Driver") == 0 &&
5496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    entry.type == DBUS_TYPE_STRING) {
550623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(driver);
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			driver = os_strdup(entry.str_value);
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (driver == NULL)
554ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "Ifname") == 0 &&
5566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
557623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(ifname);
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(entry.str_value);
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ifname == NULL)
561ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "ConfigFile") == 0 &&
5636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
564623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(confname);
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			confname = os_strdup(entry.str_value);
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (confname == NULL)
568ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "BridgeIfname") == 0 &&
5706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
571623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(bridge_ifname);
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			bridge_ifname = os_strdup(entry.str_value);
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (bridge_ifname == NULL)
575ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error; /* Required Ifname argument missing */
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Try to get the wpa_supplicant record for this iface, return
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * an error if we already control it.
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_get_iface(global, ifname) != NULL) {
5906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = dbus_message_new_error(
5916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message, WPAS_DBUS_ERROR_IFACE_EXISTS,
5926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant already controls this interface.");
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_supplicant *wpa_s;
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_interface iface;
5966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memset(&iface, 0, sizeof(iface));
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.driver = driver;
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.ifname = ifname;
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.confname = confname;
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.bridge_ifname = bridge_ifname;
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Otherwise, have wpa_supplicant attach to it. */
603203eadb9eda41a1dde4a583edb4684319e3f399eDmitry Shmidt		wpa_s = wpa_supplicant_add_iface(global, &iface, NULL);
604cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s && wpa_s->dbus_new_path) {
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *path = wpa_s->dbus_new_path;
6066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_method_return(message);
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH,
6096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						 &path, DBUS_TYPE_INVALID);
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_unknown_error(
6126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
6136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"wpa_supplicant couldn't grab this interface.");
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(driver);
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ifname);
62061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os_free(confname);
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(bridge_ifname);
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror:
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_error_invalid_args(message, NULL);
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	goto out;
627ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtoom:
628ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	reply = wpas_dbus_error_no_memory(message);
629ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	goto out;
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          failure (0), or returns a dbus error message with more information
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call.  Handles requests
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages.
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message,
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *path;
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path,
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = get_iface_by_dbus_path(global, path);
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_iface_unknown(message);
657c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) {
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
6596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
6606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant couldn't remove this interface.");
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object,
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call.
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message,
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      struct wpa_global *global)
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname;
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *path;
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname,
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = wpa_supplicant_get_iface(global, ifname);
688cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s == NULL || wpa_s->dbus_new_path == NULL)
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_iface_unknown(message);
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	path = wpa_s->dbus_new_path;
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL)
6946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
6986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level
7071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property.
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(DBusMessageIter *iter,
7151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error,
7161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 void *user_data)
7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str;
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int idx = wpa_debug_level;
7201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx < 0)
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 0;
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx > 5)
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 5;
7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str = debug_strings[idx];
7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
7271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp
7331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property.
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(DBusMessageIter *iter,
7416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					     DBusError *error,
7426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					     void *user_data)
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_timestamp, error);
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys
7521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property.
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(DBusMessageIter *iter,
7601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
7611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_show_keys, error);
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level
7701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property.
7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(DBusMessageIter *iter,
7781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str = NULL;
7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, val = -1;
7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
7851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &str))
7861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; debug_strings[i]; i++)
7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(debug_strings[i], str) == 0) {
7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			val = i;
7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (val < 0 ||
7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp,
7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    wpa_debug_show_keys)) {
7976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
7986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "wrong debug level value");
7991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp
8081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property.
8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(DBusMessageIter *iter,
8161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
8171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0,
8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_show_keys);
8281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys
8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property.
8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(DBusMessageIter *iter,
8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
8431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level,
8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_timestamp,
8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					val ? 1 : 0);
8551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list
8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects
8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter,
8711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					DBusError *error,
8721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					void *user_data)
8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char **paths;
8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
8781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
880cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
881cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s->dbus_new_path)
882cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			num++;
883cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
88561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
8871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
8881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
891cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
892cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s->dbus_new_path)
893cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			paths[i++] = wpa_s->dbus_new_path;
894cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
8971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
8981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
9011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list
9071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
9081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
9091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter,
9161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **eap_methods;
9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t num_items = 0;
9201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eap_methods = eap_get_names_as_string_array(&num_items);
9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!eap_methods) {
9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
9251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
9291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_STRING,
9301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 eap_methods,
9311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 num_items, error);
9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (num_items)
9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(eap_methods[--num_items]);
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(eap_methods);
9361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
940d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
941d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities
942d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
943d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
944d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
945d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
946d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
947d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to
948d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS,
949d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time.
950d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
951d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter,
9526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						 DBusError *error,
9536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						 void *user_data)
954d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
955d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL };
956d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	size_t num_items = 0;
957d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP
959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ap";
960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */
961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN
962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ibss-rsn";
963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */
964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P
965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "p2p";
966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */
967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING
968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "interworking";
969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */
970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter,
972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      DBUS_TYPE_STRING,
973d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      capabilities,
974d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      num_items, error);
975d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
976d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
977d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var,
9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char **type, DBusMessage **reply)
9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) {
9826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a string",
9836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Type value type. String required");
9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(var, type);
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var,
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    struct wpa_driver_scan_params *params,
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    DBusMessage **reply)
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_ssid *ssids = params->ssids;
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t ssids_num = 0;
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ssid;
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
10056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ssids must be an array of arrays of bytes",
10076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong SSIDs value type. Array of arrays of bytes required");
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
10176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) {
10186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ssids must be an array of arrays of bytes",
10206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong SSIDs value type. Array of arrays of bytes required");
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) {
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ssids_num >= WPAS_MAX_SCAN_SSIDS) {
10296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
10306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Too many ssids specified on scan dbus call",
10316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
10336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
10346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"Too many ssids specified. Specify at most four");
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10429d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt		if (len > SSID_MAX_LEN) {
1043c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			wpa_printf(MSG_DEBUG,
10446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: SSID too long (len=%d max_len=%d)",
10459d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt				   __func__, len, SSID_MAX_LEN);
1046c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
1047c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				message, "Invalid SSID: too long");
1048c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			return -1;
1049c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		}
1050c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len != 0) {
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = os_malloc(len);
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ssid == NULL) {
10546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				*reply = wpas_dbus_error_no_memory(message);
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_memcpy(ssid, val, len);
10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Allow zero-length SSIDs */
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = NULL;
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid = ssid;
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid_len = len;
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids_num++;
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->num_ssids = ssids_num;
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var,
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  struct wpa_driver_scan_params *params,
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  DBusMessage **reply)
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ies = NULL, *nies;
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ies_len = 0;
10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
10866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ies must be an array of arrays of bytes",
10886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong IEs value type. Array of arrays of bytes required");
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
10986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) {
10996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
11006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ies must be an array of arrays of bytes",
11016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong IEs value type. Array required");
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) {
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len == 0) {
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_iter_next(&array_iter);
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		nies = os_realloc(ies, ies_len + len);
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (nies == NULL) {
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ies);
11196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			*reply = wpas_dbus_error_no_memory(message);
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies = nies;
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memcpy(ies + ies_len, val, len);
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies_len += len;
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies = ies;
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies_len = ies_len;
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message,
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessageIter *var,
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_driver_scan_params *params,
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessage **reply)
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int *freqs = NULL, *nfreqs;
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int freqs_num = 0;
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
11456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
11466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: Channels must be an array of structs",
11476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
11506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong Channels value type. Array of structs required");
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) {
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG,
11586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: Channels must be an array of structs",
11596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
11626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong Channels value type. Array of structs required");
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT)
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int freq, width;
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dbus_message_iter_get_arg_type(&sub_array_iter) !=
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
11746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
11756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Channel must by specified by struct of two UINT32s %c",
11766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__,
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   dbus_message_iter_get_arg_type(
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   &sub_array_iter));
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
11806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
11816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &freq);
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_next(&sub_array_iter) ||
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    dbus_message_iter_get_arg_type(&sub_array_iter) !=
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
11906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
11916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Channel must by specified by struct of two UINT32s",
11926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message,
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &width);
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs_num % FREQS_ALLOC_CHUNK == 0) {
120461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			nfreqs = os_realloc_array(
120561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				freqs, freqs_num + FREQS_ALLOC_CHUNK,
120661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				sizeof(int));
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (nfreqs == NULL)
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_free(freqs);
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			freqs = nfreqs;
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs == NULL) {
12126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			*reply = wpas_dbus_error_no_memory(message);
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs[freqs_num] = freq;
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs_num++;
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
122261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int));
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (nfreqs == NULL)
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(freqs);
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs = nfreqs;
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (freqs == NULL) {
12276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		*reply = wpas_dbus_error_no_memory(message);
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs[freqs_num] = 0;
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->freqs = freqs;
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1237051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpas_dbus_get_scan_allow_roam(DBusMessage *message,
1238051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 DBusMessageIter *var,
1239051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 dbus_bool_t *allow,
1240051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 DBusMessage **reply)
1241051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{
1242051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN) {
12436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a boolean",
12446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
1245051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
1246051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			message, "Wrong Type value type. Boolean required");
1247051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		return -1;
1248051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1249051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	dbus_message_iter_get_basic(var, allow);
1250051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	return 0;
1251051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt}
1252051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1253051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface.
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     struct wpa_supplicant *wpa_s)
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, dict_iter, entry_iter, variant_iter;
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *key = NULL, *type = NULL;
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_params params;
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t i;
1272051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	dbus_bool_t allow_roam = 1;
12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&params, 0, sizeof(params));
12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &dict_iter);
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&dict_iter) ==
12816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	       DBUS_TYPE_DICT_ENTRY) {
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&dict_iter, &entry_iter);
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&entry_iter, &key);
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&entry_iter);
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&entry_iter, &variant_iter);
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, "Type") == 0) {
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_type(message, &variant_iter,
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &type, &reply) < 0)
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "SSIDs") == 0) {
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ssids(message, &variant_iter,
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     &params, &reply) < 0)
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "IEs") == 0) {
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ies(message, &variant_iter,
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   &params, &reply) < 0)
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "Channels") == 0) {
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_channels(message, &variant_iter,
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							&params, &reply) < 0)
13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
1303051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		} else if (os_strcmp(key, "AllowRoam") == 0) {
1304051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			if (wpas_dbus_get_scan_allow_roam(message,
1305051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &variant_iter,
1306051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &allow_roam,
1307051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &reply) < 0)
1308051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt				goto out;
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
13106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown argument %s",
13116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__, key);
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(message, key);
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&dict_iter);
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!type) {
13206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Scan type not specified",
13216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, key);
13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (os_strcmp(type, "passive") == 0) {
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (params.num_ssids || params.extra_ies_len) {
13286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
13296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: SSIDs or IEs specified for passive scan.",
13306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(
13326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
13336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"You can specify only Channels in passive scan");
13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
1336cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			if (wpa_s->sched_scanning) {
1337cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_printf(MSG_DEBUG,
1338cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt					   "%s[dbus]: Stop ongoing sched_scan to allow requested scan to proceed",
1339cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt					   __func__);
1340cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_supplicant_cancel_sched_scan(wpa_s);
1341cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			}
1342cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
1343cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			if (params.freqs && params.freqs[0]) {
1344cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				if (wpa_supplicant_trigger_scan(wpa_s,
1345cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt								&params)) {
1346cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt					reply = wpas_dbus_error_scan_error(
1347cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt						message,
1348cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt						"Scan request rejected");
1349cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				}
1350cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			} else {
1351cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_s->scan_req = MANUAL_SCAN_REQ;
1352cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_supplicant_req_scan(wpa_s, 0, 0);
1353cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			}
13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	} else if (os_strcmp(type, "active") == 0) {
13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!params.num_ssids) {
13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Add wildcard ssid */
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			params.num_ssids++;
13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
136004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
136104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
136204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
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
13707dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt		if (wpa_supplicant_trigger_scan(wpa_s, &params)) {
13717dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt			reply = wpas_dbus_error_scan_error(
13727dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt				message, "Scan request rejected");
13737dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt		}
13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
13756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown scan type: %s",
13766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, type);
13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message,
13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     "Wrong scan type");
13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1382051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (!allow_roam)
1383051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		wpa_s->scan_res_handler = scan_only_handler;
1384051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free((u8 *) params.ssids[i].ssid);
13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free((u8 *) params.extra_ies);
13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(params.freqs);
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1394661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/**
1395661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_handler_signal_poll - Request immediate signal properties
1396661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @message: Pointer to incoming dbus message
1397661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1398661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
1399661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt *
1400661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Handler function for "SignalPoll" method call of a network device. Requests
1401661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * that wpa_supplicant read signal properties like RSSI, noise, and link
1402661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * speed and return them.
1403661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */
1404661b4f78e48c697429dc46154a4125892c001718Dmitry ShmidtDBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
1405661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
1406661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
1407661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct wpa_signal_info si;
1408661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	DBusMessage *reply = NULL;
1409661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	DBusMessageIter iter, iter_dict, variant_iter;
1410661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	int ret;
1411661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1412661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	ret = wpa_drv_signal_poll(wpa_s, &si);
1413661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (ret) {
1414661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
1415661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					      "Failed to read signal");
1416661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	}
1417661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1418661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	reply = dbus_message_new_method_return(message);
1419661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (reply == NULL)
1420661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1421661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1422661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
1423661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1424661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
14256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
14266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) ||
14276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "rssi",
14286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_signal) ||
14296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
14306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_txrate / 1000) ||
14316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "noise",
14326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_noise) ||
14336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_uint32(&iter_dict, "frequency",
14346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					 si.frequency) ||
14356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.chanwidth != CHAN_WIDTH_UNKNOWN &&
14366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_append_string(
14376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_dict, "width",
14386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     channel_width_to_string(si.chanwidth))) ||
14396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.center_frq1 > 0 && si.center_frq2 > 0 &&
14406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
14416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					  si.center_frq1) ||
14426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	      !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
14436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					  si.center_frq2))) ||
14446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.avg_signal &&
14456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
14466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					 si.avg_signal)) ||
14476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
14486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(&iter, &variant_iter))
1449661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1450661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1451661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return reply;
1452661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1453661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtnomem:
1454661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (reply)
1455661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		dbus_message_unref(reply);
14566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return wpas_dbus_error_no_memory(message);
1457661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
1458661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1459661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection
14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected
14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise.
14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface.
14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->disconnected = 1;
14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "This interface is not connected");
14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network
14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface.
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter;
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = NULL;
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf;
15001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusError error;
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1504cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->dbus_new_path)
1505cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		ssid = wpa_config_add_network(wpa_s->conf);
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
15076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.",
15086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message,
15116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant could not add a network on this interface.");
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_added(wpa_s, ssid);
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid->disabled = 1;
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_network_defaults(ssid);
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_error_init(&error);
15191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!set_network_properties(wpa_s, ssid, &iter, &error)) {
15206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
15216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: control interface couldn't set network properties",
15226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
15231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_reply_new_from_error(message, &error,
15241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       DBUS_ERROR_INVALID_ARGS,
15251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       "Failed to add network");
15261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_error_free(&error);
15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Construct the object path for this network. */
15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_s->dbus_new_path, ssid->id);
15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL) {
15376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
15436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid) {
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpas_notify_network_removed(wpa_s, ssid);
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_config_remove_network(wpa_s->conf, ssid->id);
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1559413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate
156061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message
156161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1562413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled
156361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise.
156461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *
156561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface.
156661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */
156761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message,
156861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
156961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
1570413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) {
1571d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpas_request_connection(wpa_s);
157261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
157361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
157461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1575413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_DISABLED,
1576413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt				      "This interface is disabled");
157761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
157861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
157961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
158061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/**
15819866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * wpas_dbus_handler_reattach - Reattach to current AP
15829866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @message: Pointer to incoming dbus message
15839866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
15849866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Returns: NotConnected DBus error message if not connected
15859866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * or NULL otherwise.
15869866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt *
15879866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Handler function for "Reattach" method call of network interface.
15889866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt */
15899866086a955d00e237cc8df3722e7dff75c02532Dmitry ShmidtDBusMessage * wpas_dbus_handler_reattach(DBusMessage *message,
15909866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
15919866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{
15929866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
15939866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		wpa_s->reattach = 1;
15949866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		wpas_request_connection(wpa_s);
15959866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		return NULL;
15969866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	}
15979866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
15989866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
15999866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt				      "This interface is not connected");
16009866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt}
16019866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16029866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16039866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt/**
16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network
16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface.
16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
16166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
16192f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	int was_disabled;
16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
16266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
16276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
16286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1629cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
1630d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1635d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1637d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16482f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	was_disabled = ssid->disabled;
16492f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
16552f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	else if (!was_disabled && wpa_s->sched_scanning) {
16566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
16576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "Stop ongoing sched_scan to remove network from filters");
16582f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
16592f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_req_scan(wpa_s, 0, 0);
16602f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	}
16612f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
1662684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, id) < 0) {
1663684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		wpa_printf(MSG_ERROR,
16646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: error occurred when removing network %d",
16656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, id);
1666684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		reply = wpas_dbus_error_unknown_error(
16676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
16686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"error removing the specified network on is interface.");
1669684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		goto out;
1670684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	}
16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid)
16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s = arg;
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) {
16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR,
16866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: error occurred when removing network %d",
16876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, ssid->id);
16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
1692d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
1693d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface.
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks(
17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17082f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	if (wpa_s->sched_scanning)
17092f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
17102f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* NB: could check for failure and return an error */
17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s);
17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network
17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface.
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message,
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
17306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
17396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
17406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
17416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1742cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
1743d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1748d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1750d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Finally, associate with the network */
17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_select_network(wpa_s, ssid);
17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal
17721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message
17731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
17741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure
17751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
17761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface.
17771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */
17781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message,
17791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      struct wpa_supplicant *wpa_s)
17801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
17811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL
17821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessage *reply = NULL;
17831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *op, *field, *value;
17846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
17851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int id;
17861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_ssid *ssid;
17871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
17881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
17896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_OBJECT_PATH, &op,
17906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_STRING, &field,
17916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_STRING, &value,
17926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_INVALID))
17931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpas_dbus_error_invalid_args(message, NULL);
17941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
17951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Extract the network ID and ensure the network */
17961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* is actually a child of this interface */
17976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
17986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
17996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1800cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
1801d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
18021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
18031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1806d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
18071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	id = strtoul(net_id, NULL, 10);
1808d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
18091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, net_id);
18101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
18141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (ssid == NULL) {
18151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
18161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid,
18201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      field, value) < 0)
18211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, field);
18221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	else {
18231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		/* Tell EAP to retry immediately */
18241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		eapol_sm_notify_ctrl_response(wpa_s->eapol);
18251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout:
18281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(iface);
18291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return reply;
18301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */
18311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included");
18321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_error_unknown_error(message, "802.1X not included");
18331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */
18341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
18351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1837700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS
1838700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
18391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/**
18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates)
18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs.
18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message,
18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *blob_data;
18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int blob_len;
18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob = NULL;
18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &blob_name);
18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_get_blob(wpa_s->conf, blob_name)) {
18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_EXISTS,
18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array_iter);
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len);
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = os_zalloc(sizeof(*blob));
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
18746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->data = os_malloc(blob_len);
18796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	blob->name = os_strdup(blob_name);
18806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!blob->data || !blob->name) {
18816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(blob->data, blob_data, blob_len);
18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->len = blob_len;
18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_blob(wpa_s->conf, blob);
18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_added(wpa_s, blob->name);
18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (blob) {
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->name);
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->data);
18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob);
18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates)
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob)
19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs.
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message,
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct wpa_config_blob *blob;
19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_config_get_blob(wpa_s->conf, blob_name);
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
19306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!reply)
19316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      DBUS_TYPE_BYTE_AS_STRING,
19376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &array_iter) ||
19386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE,
19396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						  &(blob->data), blob->len) ||
19406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(&iter, &array_iter)) {
19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
19426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs.
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message,
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_blob(wpa_s->conf, blob_name)) {
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_removed(wpa_s, blob_name);
19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1977700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */
1978700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
1979700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache
19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface.
19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message,
19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t age;
19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age,
19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (age == 0)
19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush(wpa_s);
19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush_by_age(wpa_s, age);
20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
200504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
200604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
200704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface
200804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message
200904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
201004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL
201104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
201204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface.
201304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
201404949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message,
201504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					 struct wpa_supplicant *wpa_s)
201604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
201704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *reply = NULL;
201804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	enum wpa_states state = wpa_s->wpa_state;
201904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *arg;
202004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
202104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg,
202204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      DBUS_TYPE_INVALID);
202304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
202404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (arg != NULL && os_strlen(arg) > 0) {
202504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		char *tmp;
20266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
202704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		tmp = os_strdup(arg);
202804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (tmp == NULL) {
20296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			reply = wpas_dbus_error_no_memory(message);
203004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else {
203104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			os_free(wpa_s->conf->autoscan);
203204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			wpa_s->conf->autoscan = tmp;
203304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
203404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				autoscan_init(wpa_s, 1);
203504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			else if (state == WPA_SCANNING)
203604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				wpa_supplicant_reinit_autoscan(wpa_s);
203704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		}
203804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else if (arg != NULL && os_strlen(arg) == 0) {
203904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->conf->autoscan);
204004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->conf->autoscan = NULL;
204104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
204204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else
204304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		reply = dbus_message_new_error(message,
204404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       DBUS_ERROR_INVALID_ARGS,
204504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       NULL);
204604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
204704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return reply;
204804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
204904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
205004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
205104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
20528da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/*
20538da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logoff - IEEE 802.1X EAPOL state machine logoff
20548da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message
20558da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20568da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL
20578da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt *
20588da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogoff" method call of network interface.
20598da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */
20608da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logoff(DBusMessage *message,
20618da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
20628da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{
20638da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	eapol_sm_notify_logoff(wpa_s->eapol, TRUE);
20648da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	return NULL;
20658da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt}
20668da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
20678da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
20688da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/*
20698da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logon - IEEE 802.1X EAPOL state machine logon
20708da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message
20718da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20728da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL
20738da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt *
20748da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogin" method call of network interface.
20758da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */
20768da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message,
20778da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
20788da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{
20798da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	eapol_sm_notify_logoff(wpa_s->eapol, FALSE);
20808da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	return NULL;
20818da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt}
20828da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
20838da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
2084e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef CONFIG_TDLS
2085e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
20867d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidtstatic int get_peer_hwaddr_helper(DBusMessage *message, const char *func_name,
20877d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt				  u8 *peer_address, DBusMessage **error)
2088e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2089e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	const char *peer_string;
2090e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
20917d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	*error = NULL;
20927d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt
2093e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
2094e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				   DBUS_TYPE_STRING, &peer_string,
20957d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt				   DBUS_TYPE_INVALID)) {
20967d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		*error = wpas_dbus_error_invalid_args(message, NULL);
20977d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		return -1;
20987d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	}
2099e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2100e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (hwaddr_aton(peer_string, peer_address)) {
2101e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s: invalid address '%s'",
2102e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			   func_name, peer_string);
21037d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		*error = wpas_dbus_error_invalid_args(
2104e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "Invalid hardware address format");
21057d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		return -1;
2106e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2107e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21087d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	return 0;
2109e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2110e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2111e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2112e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2113e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_discover - Discover TDLS peer
2114e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2115e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2116e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2117e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2118e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSDiscover" method call of network interface.
2119e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2120e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message,
2121e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					      struct wpa_supplicant *wpa_s)
2122e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2123e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2124e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2125e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2126e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21277d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2128e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2129e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2130e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_DISCOVER " MACSTR, MAC2STR(peer));
2131e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2132e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2133e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer);
2134e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2135e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer);
2136e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2137e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2138e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2139e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS discovery");
2140e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2141e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2142e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2143e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2144e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2145e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2146e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2147e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_setup - Setup TDLS session
2148e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2149e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2150e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2151e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2152e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSSetup" method call of network interface.
2153e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2154e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message,
2155e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					   struct wpa_supplicant *wpa_s)
2156e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2157e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2158e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2159e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2160e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21617d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2162e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2163e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2164e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_SETUP " MACSTR, MAC2STR(peer));
2165e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2166e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_tdls_remove(wpa_s->wpa, peer);
2167e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2168e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_start(wpa_s->wpa, peer);
2169e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2170e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
2171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2172e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS setup");
2175e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2176e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2177e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2178e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2179e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2180e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2181e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2182e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_status - Return TDLS session status
2183e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2184e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2185e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: A string representing the state of the link to this TDLS peer
2186e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2187e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSStatus" method call of network interface.
2188e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2189e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_status(DBusMessage *message,
2190e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					    struct wpa_supplicant *wpa_s)
2191e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2192e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2193e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *reply;
2194e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	const char *tdls_status;
2195e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21967d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &reply) < 0)
2197e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return reply;
2198e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2199e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_STATUS " MACSTR, MAC2STR(peer));
2200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2201e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	tdls_status = wpa_tdls_get_link_status(wpa_s->wpa, peer);
2202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	reply = dbus_message_new_method_return(message);
2204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	dbus_message_append_args(reply, DBUS_TYPE_STRING,
2205e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				 &tdls_status, DBUS_TYPE_INVALID);
2206e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return reply;
2207e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2208e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2209e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2210e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2211e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_teardown - Teardown TDLS session
2212e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2213e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2214e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2215e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2216e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSTeardown" method call of network interface.
2217e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2218e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message,
2219e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					      struct wpa_supplicant *wpa_s)
2220e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2221e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2222e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2223e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2224e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22257d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2226e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2227e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2228e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_TEARDOWN " MACSTR, MAC2STR(peer));
2229e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2230e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2231e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_teardown_link(
2232e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			wpa_s->wpa, peer,
2233e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
2234e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2235e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer);
2236e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2237e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2238e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2239e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS teardown");
2240e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2241e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2242e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2243e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2244e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2245e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* CONFIG_TDLS */
2246e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2247e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
224901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
225001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @message: Pointer to incoming dbus message
225101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
225201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
225301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
225401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Sets the PKCS #11 engine and module path.
225501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
225601904cfafd75a70b9f29c0220b90bdef45595491Dmitry ShmidtDBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path(
225701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
225801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
225901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	DBusMessageIter iter;
226001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *value = NULL;
226101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *pkcs11_engine_path = NULL;
226201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *pkcs11_module_path = NULL;
226301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
226401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_init(message, &iter);
226501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &value);
226601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (value == NULL) {
226701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
226801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS,
226901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Invalid pkcs11_engine_path argument");
227001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
227101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	/* Empty path defaults to NULL */
227201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (os_strlen(value))
227301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = value;
227401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
227501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_next(&iter);
227601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &value);
227701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (value == NULL) {
227801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		os_free(pkcs11_engine_path);
227901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
228001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS,
228101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Invalid pkcs11_module_path argument");
228201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
228301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	/* Empty path defaults to NULL */
228401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (os_strlen(value))
228501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = value;
228601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
228701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path,
228801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						   pkcs11_module_path))
228901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
229001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_FAILED,
22916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed.");
229201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
2293cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->dbus_new_path) {
2294cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		wpa_dbus_mark_property_changed(
2295cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			wpa_s->global->dbus, wpa_s->dbus_new_path,
2296cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath");
2297cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		wpa_dbus_mark_property_changed(
2298cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			wpa_s->global->dbus, wpa_s->dbus_new_path,
2299cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath");
2300cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
230101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
230201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return NULL;
230301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
230401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
230501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
230601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities
23081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
23091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
23101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
23111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface.
23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
23151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(DBusMessageIter *iter,
23161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					  DBusError *error, void *user_data)
23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_capa capa;
23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
23211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array,
23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		variant_iter;
23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *scans[] = { "active", "passive", "ssid" };
23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
23266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
23276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_drv_get_capa(wpa_s, &capa);
23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** pairwise cipher */
23338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
23348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {"ccmp", "tkip", "none"};
23356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
23368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Pairwise", args,
233868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise",
23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
23446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
23456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) &&
23466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp-256")) ||
23486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) &&
23496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp-256")) ||
23516c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) &&
23526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp")) ||
23546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) &&
23556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp")) ||
23576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) &&
23586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "tkip")) ||
23606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) &&
23616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "none")) ||
23636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
23688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** group cipher */
23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"ccmp", "tkip", "wep104", "wep40"
23748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
23756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Group", args,
237868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group",
23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
23846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
23856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) &&
23866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp-256")) ||
23886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) &&
23896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp-256")) ||
23916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) &&
23926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp")) ||
23946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) &&
23956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp")) ||
23976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) &&
23986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
23996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "tkip")) ||
24006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) &&
24016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wep104")) ||
24036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) &&
24046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wep40")) ||
24066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** key management */
24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wpa-psk", "wpa-eap", "ieee8021x", "wpa-none",
24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wps",
24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"none"
24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "KeyMgmt", args,
242468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt",
24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
24306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
24316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
24326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							    "none") ||
24336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "ieee8021x"))
24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) {
24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				    &iter_array, "wpa-eap") ||
24416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			    ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) &&
24426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     !wpa_dbus_dict_string_array_add_element(
24436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     &iter_array, "wpa-ft-eap")))
24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-eap-sha256"))
24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) {
24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				    &iter_array, "wpa-psk") ||
24586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			    ((capa.key_mgmt &
24596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			      WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) &&
24606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     !wpa_dbus_dict_string_array_add_element(
24616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     &iter_array, "wpa-ft-psk")))
24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-psk-sha256"))
24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) &&
24736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
24746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							    "wpa-none"))
24756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			goto nomem;
24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "wps"))
24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
24858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** WPA protocol */
24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "rsn", "wpa" };
24946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Protocol", args,
249768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol",
25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
25036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
25046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
25056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) &&
25066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
25076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "rsn")) ||
25086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
25096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) &&
25106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
25116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wpa")) ||
25126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** auth alg */
25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "open", "shared", "leap" };
25226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "AuthAlg", args,
252568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg",
25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if (((capa.auth & WPA_DRIVER_AUTH_OPEN) &&
25356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
25366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "open")) ||
25376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.auth & WPA_DRIVER_AUTH_SHARED) &&
25386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
25396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "shared")) ||
25406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.auth & WPA_DRIVER_AUTH_LEAP) &&
25416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
25426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "leap")) ||
25436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Scan */
25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans,
255268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt					       ARRAY_SIZE(scans)))
25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Modes */
255675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes",
255775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_entry,
255875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_val,
25596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &iter_array) ||
25606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_string_array_add_element(
25616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    &iter_array, "infrastructure") ||
25626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_string_array_add_element(
25636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    &iter_array, "ad-hoc") ||
25646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_AP) &&
25656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_string_array_add_element(
25666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_array, "ap")) ||
25676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) &&
25686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_string_array_add_element(
25696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_array, "p2p")) ||
25706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_end_string_array(&iter_dict,
257175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_entry,
257275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_val,
257375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_array))
257475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
257575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	/***** Modes end */
257675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
25771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res >= 0) {
25781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_int32_t max_scan_ssid = capa.max_scan_ssids;
25791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID",
25811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						max_scan_ssid))
25821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto nomem;
25831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
25841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
25866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
25921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
25931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state
25991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
26001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
26011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
26021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property.
26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_state(DBusMessageIter *iter, DBusError *error,
26071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   void *user_data)
26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str_state;
26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *state_ls, *tmp;
26121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str_state = wpa_supplicant_state_txt(wpa_s->wpa_state);
26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* make state string lowercase to fit new DBus API convention
26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	state_ls = tmp = os_strdup(str_state);
26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!tmp) {
26201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
26211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*tmp) {
26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*tmp = tolower(*tmp);
26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tmp++;
26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
26291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   &state_ls, error);
26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(state_ls);
26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state
26391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
26401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
26411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
26421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property.
26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(DBusMessageIter *iter, DBusError *error,
26476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				      void *user_data)
26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE;
26511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
26521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
26531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&scanning, error);
26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode
26591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
26601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
26611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
26621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property.
26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(DBusMessageIter *iter, DBusError *error,
26671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan = wpa_s->conf->ap_scan;
26711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
26721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
26731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ap_scan, error);
26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode
26791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
26801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
26811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
26821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
26838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property.
26858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(DBusMessageIter *iter, DBusError *error,
26871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
26888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan;
26918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
26931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &ap_scan))
26941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
26958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) {
26971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
26981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "ap_scan must be 0, 1, or 2");
26991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2706c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast
2707c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2708c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2709c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2710c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2711c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2712c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2713c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property.
2714c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2715c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(DBusMessageIter *iter,
2716c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					 DBusError *error,
2717c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					 void *user_data)
2718c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2719c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2720c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE;
2721c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2722c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
2723c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&fast_reauth, error);
2724c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2725c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2726c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2727c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
2728c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast
2729c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2730c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2731c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2732c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2733c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2734c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2735c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property.
2736c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2737c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter,
2738c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				     DBusError *error,
2739c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				     void *user_data)
2740c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2741c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2742c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth;
2743c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2744c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
2745c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					      &fast_reauth))
2746c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		return FALSE;
2747c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2748c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	wpa_s->conf->fast_reauth = fast_reauth;
2749c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return TRUE;
2750c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2751c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2752c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2753c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
275404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect
275504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
275604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
275704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
275804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
275904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
276004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property.  The reason is negative if it is
276104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated.
276204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
276304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter,
276404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       DBusError *error,
276504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       void *user_data)
276604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
276704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
276804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t reason = wpa_s->disconnect_reason;
27696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
277004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
277104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&reason, error);
277204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
277304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
277404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
277504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age
27771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property.
27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter,
27851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    DBusError *error,
27861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    void *user_data)
27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age;
27901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
27911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
27921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_age, error);
27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age
27981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property.
28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(DBusMessageIter *iter,
28061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    DBusError *error,
28071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    void *user_data)
28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age;
28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
28131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_age))
28141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) {
28171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
28181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireAge must be >= 10");
28191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count
28271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property.
28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(DBusMessageIter *iter,
28351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      DBusError *error,
28361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      void *user_data)
28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
283961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count;
28401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
28411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
28421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_count, error);
28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count
28481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property.
28548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(DBusMessageIter *iter,
28561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      DBusError *error,
28571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      void *user_data)
28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_count;
28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
28631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_count))
28641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) {
28671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
28681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireCount must be > 0");
28691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code
28771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property.
28838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_country(DBusMessageIter *iter, DBusError *error,
28851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char country[3];
28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *str = country;
28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[0] = wpa_s->conf->country[0];
28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[1] = wpa_s->conf->country[1];
28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[2] = '\0';
28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
28961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code
29021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property.
29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_country(DBusMessageIter *iter, DBusError *error,
29101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *country;
29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
29161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &country))
29171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!country[0] || !country[1]) {
29201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
29211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "invalid country code");
29221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) {
29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "Failed to set country");
29271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
29281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "failed to set country code");
29291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[0] = country[0];
29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[1] = country[1];
29341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
293904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval
294004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
294104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
294204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
294304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
294404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
294504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property.
294604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
294704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(DBusMessageIter *iter,
294804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   DBusError *error,
294904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   void *user_data)
295004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
295104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
295204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval = wpa_s->scan_interval;
295304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
295404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
295504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&scan_interval, error);
295604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
295704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
295804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
295904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
296004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval
296104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
296204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
296304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
296404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
296504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
296604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property.
296704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
296804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(DBusMessageIter *iter,
296904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   DBusError *error,
297004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   void *user_data)
297104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
297204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
297304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval;
297404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
297504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32,
297604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      &scan_interval))
297704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
297804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
297904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) {
298004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
298104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     "scan_interval must be >= 0");
298204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
298304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
298404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
298504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
298604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
298704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
298804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name
29901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property.
29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error,
29981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				    void *user_data)
29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname = wpa_s->ifname;
30021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
30031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
30041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ifname, error);
30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name
30101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property.
30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error,
30181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				    void *user_data)
30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *driver;
30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) {
30246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: wpa_s has no driver set",
30256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
30261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set",
30271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       __func__);
30281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	driver = wpa_s->driver->name;
30321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
30331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&driver, error);
30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path
30391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property.
30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter,
30471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error,
30481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 void *user_data)
30498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf;
30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3053cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->current_bss && wpa_s->dbus_new_path)
30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_bss->id);
30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
30611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bss_obj_path, error);
30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path
30671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property.
30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter,
30751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
30761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf;
30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3081cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->current_ssid && wpa_s->dbus_new_path)
30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_ssid->id);
30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
30891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&net_obj_path, error);
30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type
30951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property.
31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(DBusMessageIter *iter,
31031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       DBusError *error,
31041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       void *user_data)
31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *eap_mode;
31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *auth_mode;
31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX];
31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->wpa_state != WPA_COMPLETED) {
31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = "INACTIVE";
31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X ||
31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eap_mode = wpa_supplicant_get_eap_mode(wpa_s);
31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX,
31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "EAP-%s", eap_mode);
31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = eap_mode_buf;
31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt,
31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_s->current_ssid->proto);
31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
31261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&auth_mode, error);
31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name
31321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property.
31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter,
31401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   DBusError *error,
31411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   void *user_data)
31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *bridge_ifname = wpa_s->bridge_ifname;
31456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
31461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
31471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bridge_ifname, error);
31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects
31531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property.
31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error,
31611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  void *user_data)
31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *bss;
31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0;
31671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3169cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (!wpa_s->dbus_new_path) {
3170cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3171cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			       "%s: no D-Bus interface", __func__);
3172cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		return FALSE;
3173cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
3174cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
317561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(wpa_s->num_bss, sizeof(char *));
31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
31771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
31781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through scan results and append each result's object path */
31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) {
31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
31851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
31861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this BSS. */
31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, bss->id);
31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
31961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
31971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, wpa_s->num_bss,
31981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
32041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects
32101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property.
32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
32171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error,
32181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
32241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3226cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (!wpa_s->dbus_new_path) {
3227cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3228cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			       "%s: no D-Bus interface", __func__);
3229cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		return FALSE;
3230cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
3231cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
323375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (!network_is_persistent_group(ssid))
323475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			num++;
32358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
323661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
32381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory");
32391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through configured networks and append object path of each */
32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
324475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (network_is_persistent_group(ssid))
324575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			continue;
32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
32486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_NO_MEMORY,
32496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       "no memory");
32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this network. */
32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, ssid->id);
32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
32601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
32611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
32671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
327201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path
327301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
327401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure
327501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data
327601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 engine path
327701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
327801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11EnginePath" property.
327901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
328001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_engine_path(DBusMessageIter *iter,
328101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						DBusError *error,
328201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						void *user_data)
328301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
328401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
328501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	const char *pkcs11_engine_path;
328601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
328701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpa_s->conf->pkcs11_engine_path == NULL)
328801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = "";
328901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	else
329001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path;
329101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
329201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						&pkcs11_engine_path, error);
329301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
329401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
329501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
329601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
329701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path
329801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
329901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure
330001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data
330101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 module path
330201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
330301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11ModulePath" property.
330401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
330501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_module_path(DBusMessageIter *iter,
330601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						DBusError *error,
330701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						void *user_data)
330801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
330901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
331001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	const char *pkcs11_module_path;
331101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
331201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpa_s->conf->pkcs11_module_path == NULL)
331301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = "";
331401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	else
331501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = wpa_s->conf->pkcs11_module_path;
331601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
331701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						&pkcs11_module_path, error);
331801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
331901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
332001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
332101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface
33231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
33241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
33251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
33261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property.
33298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
33301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error,
33311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   void *user_data)
33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
33341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter;
33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob;
33368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
33388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{say}", &variant_iter) ||
33398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "{say}", &dict_iter)) {
33411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
33421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_s->conf->blobs;
33468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (blob) {
33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_open_container(&dict_iter,
33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_DICT_ENTRY,
33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      NULL, &entry_iter) ||
33508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_basic(&entry_iter,
33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    DBUS_TYPE_STRING,
33528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &(blob->name)) ||
33538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_open_container(&entry_iter,
33548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_ARRAY,
33558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_BYTE_AS_STRING,
33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &array_iter) ||
33578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_fixed_array(&array_iter,
33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  DBUS_TYPE_BYTE,
33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  &(blob->data),
33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  blob->len) ||
33618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&entry_iter,
33628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &array_iter) ||
33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&dict_iter,
33648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &entry_iter)) {
33651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
33661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return FALSE;
33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		blob = blob->next;
33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) ||
33741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
33751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
33761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
33801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
33811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args,
33841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       DBusError *error, const char *func_name)
33851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
33861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id);
33871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res) {
33891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found",
33906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   func_name, args->id);
33911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
33921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: BSS %d not found",
33931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       func_name, args->id);
33941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
33951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
33978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS
34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property.
34088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
34091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(DBusMessageIter *iter, DBusError *error,
34101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       void *user_data)
34118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
34131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
34148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
34201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->bssid, ETH_ALEN,
34211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
34228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
34268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS
34271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property.
34338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
34341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(DBusMessageIter *iter, DBusError *error,
34351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
34368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
34381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
34398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
34411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
34421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
34451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->ssid, res->ssid_len,
34461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
34478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
34518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS
34521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property.
34588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
34591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(DBusMessageIter *iter,
34601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
34618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
34631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
34648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t privacy;
34658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
34671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
34681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE;
34711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
34721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&privacy, error);
34738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
34778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS
34781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property.
34848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
34851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(DBusMessageIter *iter, DBusError *error,
34861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
34891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
34908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *mode;
34918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
34931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
34941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
349576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	if (bss_is_dmg(res)) {
349676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		switch (res->caps & IEEE80211_CAP_DMG_MASK) {
349776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_PBSS:
349876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_IBSS:
349976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "ad-hoc";
350076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			break;
350176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_AP:
350276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "infrastructure";
350376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			break;
350476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		}
350576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	} else {
350676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		if (res->caps & IEEE80211_CAP_IBSS)
350776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "ad-hoc";
350876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		else
350976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "infrastructure";
351076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	}
35118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
35131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&mode, error);
35148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS
35191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property.
35258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(DBusMessageIter *iter,
35271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					DBusError *error, void *user_data)
35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
35301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3531c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	s16 level;
35328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
35341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
35351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3537c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	level = (s16) res->level;
35381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16,
3539c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&level, error);
35408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS
35451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property.
35518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
35521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(DBusMessageIter *iter,
35531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   DBusError *error, void *user_data)
35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
35561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3557c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	u16 freq;
35588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
35601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
35611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3563c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	freq = (u16) res->freq;
35641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16,
3565c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&freq, error);
35668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b)
35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return (*(u8 *) b - *(u8 *) a);
35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS
35771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property.
35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
35841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(DBusMessageIter *iter,
35851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       DBusError *error, void *user_data)
35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
35881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ie_rates = NULL;
35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 *real_rates;
35918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int rates_num, i;
35921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
35938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
35951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
35961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	rates_num = wpa_bss_get_bit_rates(res, &ie_rates);
35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (rates_num < 0)
36001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	qsort(ie_rates, rates_num, 1, cmp_u8s_desc);
36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	real_rates = os_malloc(sizeof(u32) * rates_num);
36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!real_rates) {
36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(ie_rates);
36071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
36081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < rates_num; i++)
36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		real_rates[i] = ie_rates[i] * 500000;
36138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32,
36151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 real_rates, rates_num,
36161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ie_rates);
36198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(real_rates);
36201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
36218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(DBusMessageIter *iter,
36251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   struct wpa_ie_data *ie_data,
36261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   DBusError *error)
36278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *group;
3630fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	const char *pairwise[5]; /* max 5 pairwise ciphers is supported */
3631807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt	const char *key_mgmt[9]; /* max 9 key managements may be supported */
36328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
36358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{sv}", &variant_iter))
36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
36398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
36408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* KeyMgmt */
36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
36438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK)
36448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk";
36458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK)
36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-psk";
36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256)
36488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk-sha256";
36498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X)
36508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap";
36518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
36528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-eap";
36538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)
36548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-sha256";
3655807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB
36566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B)
36576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		key_mgmt[n++] = "wpa-eap-suite-b";
3658807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB */
3659807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB192
3660807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
3661807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-suite-b-192";
3662807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB192 */
36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE)
36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-none";
36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt",
36678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       key_mgmt, n))
36688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
36698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Group */
36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch (ie_data->group_cipher) {
36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP40:
36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep40";
36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_TKIP:
36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "tkip";
36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
36788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_CCMP:
36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "ccmp";
36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
368161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	case WPA_CIPHER_GCMP:
368261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		group = "gcmp";
368361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		break;
36848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP104:
36858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep104";
36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
3687fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	case WPA_CIPHER_CCMP_256:
3688fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		group = "ccmp-256";
3689fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		break;
3690fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	case WPA_CIPHER_GCMP_256:
3691fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		group = "gcmp-256";
3692fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		break;
36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "";
36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group))
36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Pairwise */
37028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
37038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP)
37048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "tkip";
37058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP)
37068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "ccmp";
370761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP)
370861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pairwise[n++] = "gcmp";
3709fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP_256)
3710fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		pairwise[n++] = "ccmp-256";
3711fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP_256)
3712fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		pairwise[n++] = "gcmp-256";
37138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise",
37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       pairwise, n))
37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Management group (RSN only) */
37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->proto == WPA_PROTO_RSN) {
37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (ie_data->mgmt_group_cipher) {
37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case WPA_CIPHER_AES_128_CMAC:
37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "aes128cmac";
37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
37278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "";
37288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup",
37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 group))
37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
37348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
37376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
37398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
37431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
37441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS
37501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
37511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
37521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
37531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
37558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property.
37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
37571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(DBusMessageIter *iter, DBusError *error,
37581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
37628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
37648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE);
37716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
37726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
37736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "failed to parse WPA IE");
37746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
37758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error);
37788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
37828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS
37831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
37841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
37851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
37861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
37878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
37888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property.
37898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
37901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(DBusMessageIter *iter, DBusError *error,
37911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
37928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
37958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
37978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
38001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_ie(res, WLAN_EID_RSN);
38046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
38056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
38066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "failed to parse RSN IE");
38076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error);
38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3815d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS
3816d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
3817d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
3818d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
3819d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
3820d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
3821d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property.
3822d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
3823d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(DBusMessageIter *iter, DBusError *error,
3824d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt				     void *user_data)
3825d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
3826d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct bss_handler_args *args = user_data;
3827d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpa_bss *res;
3828d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
3829d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpabuf *wps_ie;
3830d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
3831d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
38328347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt	int wps_support = 0;
3833d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *type = "";
3834d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3835d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	res = get_bss_helper(args, error, __func__);
3836d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!res)
3837d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return FALSE;
3838d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3839d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
38406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
38416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
3842d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3843d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3844d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
3845d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE);
3846d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (wps_ie) {
38478347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt		wps_support = 1;
3848d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		if (wps_is_selected_pbc_registrar(wps_ie))
3849d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pbc";
3850d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		else if (wps_is_selected_pin_registrar(wps_ie))
3851d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pin";
38526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
38536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpabuf_free(wps_ie);
3854d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	}
3855d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
3856d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
38578347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt	if ((wps_support && !wpa_dbus_dict_append_string(&iter_dict, "Type", type)) ||
38586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
38596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
3860d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3861d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3862d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return TRUE;
3863d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3864d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem:
3865d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
3866d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return FALSE;
3867d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
3868d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3869d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3870d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
38718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS
38721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
38731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
38741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
38751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
38768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
38778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property.
38788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
38791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error,
38801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
38818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
38821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
38831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
38848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
38861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
38871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
38888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
38901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res + 1, res->ie_len,
38911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
38928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3896661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen
3897661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
3898661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @error: Location to store error on failure
3899661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @user_data: Function specific data
3900661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
3901661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt *
3902661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Getter for BSS age
3903661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */
3904661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_age(DBusMessageIter *iter, DBusError *error,
3905661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt				     void *user_data)
3906661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
3907661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct bss_handler_args *args = user_data;
3908661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct wpa_bss *res;
3909661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct os_reltime now, diff = { 0, 0 };
3910661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	u32 age;
3911661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
3912661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	res = get_bss_helper(args, error, __func__);
3913661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!res)
3914661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		return FALSE;
3915661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
3916661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	os_get_reltime(&now);
3917661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	os_reltime_sub(&now, &res->last_update, &diff);
3918661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	age = diff.sec > 0 ? diff.sec : 0;
3919661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age,
3920661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt						error);
3921661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
3922661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
3923661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
3924661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/**
39258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled
39261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
39271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
39281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
39291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
39308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
39318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network.
39328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
39331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error,
39341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
39358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
39378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE;
39381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
39391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
39401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&enabled, error);
39418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
39458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled
39461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
39471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
39481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
39491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
39508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
39518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network.
39528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
39531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(DBusMessageIter *iter, DBusError *error,
39541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
39578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
39588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
39598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enable;
39608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
39621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &enable))
39631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
39648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = net->wpa_s;
39668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = net->ssid;
39678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (enable)
39698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_enable_network(wpa_s, ssid);
39708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
39718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_disable_network(wpa_s, ssid);
39728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
39748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
39788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network
39791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
39801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
39811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
39821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
39838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
39848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network.
39858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
39861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(DBusMessageIter *iter,
39871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						DBusError *error,
39881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						void *user_data)
39898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
39911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter, dict_iter;
39928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **iterator;
39938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **props = wpa_config_get_all(net->ssid, 1);
39941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
39958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!props) {
39971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
39981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
39998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
40008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}",
40021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &variant_iter) ||
40038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) {
40041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
40058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
40068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
40078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
40098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
40108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&dict_iter, *iterator,
40118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 *(iterator + 1))) {
40121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
40131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
40148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
40158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
40168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator += 2;
40178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
40188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) ||
40211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
40221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
40238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
40248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
40258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = TRUE;
40271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
40288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
40298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
40308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
40318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(*iterator);
40328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator++;
40338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
40348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(props);
40351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
40368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
40378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
40408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network
40411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
40421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
40431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
40441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
40458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
40468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network.
40478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
40481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(DBusMessageIter *iter,
40491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						DBusError *error,
40501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						void *user_data)
40518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
40521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
40538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = net->ssid;
40541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter;
40558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
40571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return set_network_properties(net->wpa_s, ssid, &variant_iter, error);
40588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
405904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
406004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
406104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP
406204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
406304949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq(
406404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
406504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
406604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
406704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *name;
406804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
406904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer != NULL) {
407004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (os_strcmp(dbus_message_get_sender(message),
407104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      wpa_s->preq_notify_peer) == 0)
407204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
407304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
407404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
407504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE,
407604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Another application is already subscribed");
407704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
407804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
407904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	name = os_strdup(dbus_message_get_sender(message));
408004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!name)
40816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
408204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
408304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = name;
408404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
408504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Subscribe to clean up if application closes socket */
408604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_subscribe_noc(priv);
408704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
408804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/*
408904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * Double-check it's still alive to make sure that we didn't
409004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * miss the NameOwnerChanged signal, e.g. while strdup'ing.
409104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 */
409204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_bus_name_has_owner(priv->con, name, NULL)) {
409304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		/*
409404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Application no longer exists, clean up.
409504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * The return value is irrelevant now.
409604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 *
409704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Need to check if the NameOwnerChanged handling
409804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * already cleaned up because we have processed
409904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * DBus messages while checking if the name still
410004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * has an owner.
410104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 */
410204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (!wpa_s->preq_notify_peer)
410304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
410404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->preq_notify_peer);
410504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->preq_notify_peer = NULL;
410604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpas_dbus_unsubscribe_noc(priv);
410704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
410804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
410904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
411004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
411104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
411204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
411304949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq(
411404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
411504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
411604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
411704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
411804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_s->preq_notify_peer)
411904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
412004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_NO_SUBSCRIPTION,
412104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Not subscribed");
412204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
412304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_strcmp(wpa_s->preq_notify_peer,
412404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		      dbus_message_get_sender(message)))
412504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
412604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM,
412704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Can't unsubscribe others");
412804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
412904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_free(wpa_s->preq_notify_peer);
413004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = NULL;
413104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_unsubscribe_noc(priv);
413204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
413304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
413404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
413504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
413604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s,
413704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *addr, const u8 *dst, const u8 *bssid,
413804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *ie, size_t ie_len, u32 ssi_signal)
413904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
414004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *msg;
414104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter iter, dict_iter;
414204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
414304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
414404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Do nothing if the control interface is not turned on */
4145cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (priv == NULL || !wpa_s->dbus_new_path)
414604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
414704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
414804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer == NULL)
414904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
415004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
415104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
415204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      WPAS_DBUS_NEW_IFACE_INTERFACE,
415304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      "ProbeRequest");
415404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (msg == NULL)
415504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
415604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
415704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_set_destination(msg, wpa_s->preq_notify_peer);
415804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
415904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_iter_init_append(msg, &iter);
416004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
41616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_open_write(&iter, &dict_iter) ||
41626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr",
41636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      (const char *) addr,
41646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      ETH_ALEN)) ||
41656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst",
41666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						     (const char *) dst,
41676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						     ETH_ALEN)) ||
41686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid",
41696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       (const char *) bssid,
41706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       ETH_ALEN)) ||
41716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies",
41726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							      (const char *) ie,
41736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							      ie_len)) ||
41746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal",
41756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       ssi_signal)) ||
41766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&iter, &dict_iter))
417704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
417804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
417904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_connection_send(priv->con, msg, NULL);
418004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	goto out;
418104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail:
418204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
418304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout:
418404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_unref(msg);
418504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
418604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
418704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */
4188