dbus_new_handlers.c revision 2f023193a0fd630eb82ce6381b80911ad5a3462f
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>
58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009, 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"
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_level;
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_show_keys;
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_timestamp;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *debug_strings[] = {
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_unknown_error - Return a new InvalidArgs error message
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message,
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    const char *arg)
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * This function can be called as a result of a failure
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * within internal getter calls, which will call this function
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * with a NULL message parameter.  However, dbus_message_new_error
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * looks very unkindly (i.e, abort()) on a NULL message, so
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * in this case, we should not call it.
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (message == NULL) {
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_INFO, "dbus: wpas_dbus_error_unknown_error "
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "called with NULL message (arg=%s)",
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   arg ? arg : "N/A");
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR,
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      arg);
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message)
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_UNKNOWN,
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "wpa_supplicant knows nothing about "
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "this interface.");
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message)
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN,
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "There is no such a network in this "
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "interface.");
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message,
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const char *arg)
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_error(message, WPAS_DBUS_ERROR_INVALID_ARGS,
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "Did not receive correct message "
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "arguments.");
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (arg != NULL)
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg,
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 DBUS_TYPE_INVALID);
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *dont_quote[] = {
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap",
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path",
126d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	"bssid", "scan_freq", "freq_list", NULL
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key)
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i = 0;
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dont_quote[i] != NULL) {
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, dont_quote[i]) == 0)
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return FALSE;
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		i++;
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return TRUE;
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init()
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path(
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_global *global, const char *path)
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(wpa_s->dbus_new_path, path) == 0)
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return wpa_s;
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set.
1651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure
1661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   struct wpa_ssid *ssid,
1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   DBusMessageIter *iter,
1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   DBusError *error)
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING };
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter_dict;
1771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *value = NULL;
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(iter, &iter_dict, error))
1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t size = 50;
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int ret;
1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto error;
1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		value = NULL;
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (entry.type == DBUS_TYPE_ARRAY &&
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    entry.array_type == DBUS_TYPE_BYTE) {
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (entry.array_len <= 0)
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			size = entry.array_len * 2 + 1;
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = wpa_snprintf_hex(value, size,
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       (u8 *) entry.bytearray_value,
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       entry.array_len);
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_STRING) {
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (should_quote_opt(entry.key)) {
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size = os_strlen(entry.str_value);
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (size <= 0)
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size += 3;
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_zalloc(size);
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				ret = os_snprintf(value, size, "\"%s\"",
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  entry.str_value);
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (ret < 0 || (size_t) ret != (size - 1))
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_strdup(entry.str_value);
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_UINT32) {
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%u",
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.uint32_value);
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_INT32) {
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%d",
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.int32_value);
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_config_set(ssid, entry.key, value, 0) < 0)
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((os_strcmp(entry.key, "psk") == 0 &&
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     value[0] == '"' && ssid->ssid_len) ||
25104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		    (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase))
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_psk(ssid);
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if (os_strcmp(entry.key, "priority") == 0)
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_prio_list(wpa_s->conf);
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(value);
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_dbus_dict_entry_clear(&entry);
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
2611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror:
2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(value);
2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_dbus_dict_entry_clear(&entry);
2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS,
2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			     "invalid message format");
2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property
2731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value
2761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure
2771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic.
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter,
2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const int type,
2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const void *val,
2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error)
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter;
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: given type is not basic", __func__);
2911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
2951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	                                      wpa_dbus_type_as_string(type),
2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	                                      &variant_iter))
2971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto error;
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_append_basic(&variant_iter, type, val))
3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto error;
3011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter))
3031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto error;
3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror:
3081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error(error, DBUS_ERROR_FAILED,
3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	               "%s: error constructing reply", __func__);
3101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored
3191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic.
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter,
3241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
3251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const int type, void *val)
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter;
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: given type is not basic", __func__);
3321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Look at the new value */
3361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&variant_iter) != type) {
3381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
3391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "wrong property type");
3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&variant_iter, val);
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property
3501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type)
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array
3541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure
3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic.
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter,
3611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   const int type,
3621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   const void *array,
3631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   size_t array_len,
3641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   DBusError *error)
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char type_str[] = "a?"; /* ? will be replaced with subtype letter; */
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *sub_type_str;
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t element_size, i;
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: given type is not basic", __func__);
3741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	type_str[1] = sub_type_str[0];
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      type_str, &variant_iter)) {
3821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: failed to construct message 1", __func__);
3841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      sub_type_str, &array_iter)) {
3891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: failed to construct message 2", __func__);
3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch(type) {
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BYTE:
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BOOLEAN:
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = 1;
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT16:
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT16:
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint16_t);
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT32:
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT32:
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint32_t);
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT64:
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT64:
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint64_t);
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_DOUBLE:
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(double);
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_STRING:
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_OBJECT_PATH:
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(char *);
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
4191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: unknown element type %d", __func__, type);
4211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < array_len; i++) {
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_append_basic(&array_iter, type,
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       array + i * element_size);
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) {
4301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: failed to construct message 3", __func__);
4321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter)) {
4361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: failed to construct message 4", __func__);
4381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
4401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
4411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
44604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property
44704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
44804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type)
44904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message
45004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array
45104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure
45204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
45304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
45404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is
45504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic.
45604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
45704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter,
45804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 const int type,
45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 struct wpabuf **array,
46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 size_t array_len,
46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 DBusError *error)
46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char type_str[] = "aa?";
46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char inner_type_str[] = "a?";
46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	const char *sub_type_str;
46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	size_t i;
46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_type_is_basic(type)) {
47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: given type is not basic", __func__);
47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	type_str[2] = sub_type_str[0];
47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	inner_type_str[1] = sub_type_str[0];
47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      type_str, &variant_iter)) {
48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: failed to construct message 1", __func__);
48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      inner_type_str, &array_iter)) {
48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: failed to construct message 2", __func__);
48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
49204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	for (i = 0; i < array_len; i++) {
49304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_dbus_dict_bin_array_add_element(&array_iter,
49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_head(array[i]),
49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_len(array[i]));
49604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
49704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) {
50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: failed to close message 2", __func__);
50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter)) {
50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
50704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: failed to close message 1", __func__);
50804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
50904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object,
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage.
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter_dict;
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter;
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry;
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *driver = NULL;
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *confname = NULL;
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *bridge_ifname = NULL;
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL))
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error;
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
54504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (!os_strcmp(entry.key, "Driver") &&
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    (entry.type == DBUS_TYPE_STRING)) {
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			driver = os_strdup(entry.str_value);
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (driver == NULL)
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
55104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else if (!os_strcmp(entry.key, "Ifname") &&
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   (entry.type == DBUS_TYPE_STRING)) {
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(entry.str_value);
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ifname == NULL)
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
55704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else if (!os_strcmp(entry.key, "ConfigFile") &&
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   (entry.type == DBUS_TYPE_STRING)) {
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			confname = os_strdup(entry.str_value);
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (confname == NULL)
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
56304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else if (!os_strcmp(entry.key, "BridgeIfname") &&
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   (entry.type == DBUS_TYPE_STRING)) {
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			bridge_ifname = os_strdup(entry.str_value);
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (bridge_ifname == NULL)
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error; /* Required Ifname argument missing */
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Try to get the wpa_supplicant record for this iface, return
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * an error if we already control it.
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_get_iface(global, ifname) != NULL) {
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message,
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       WPAS_DBUS_ERROR_IFACE_EXISTS,
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       "wpa_supplicant already "
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       "controls this interface.");
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_supplicant *wpa_s;
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_interface iface;
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memset(&iface, 0, sizeof(iface));
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.driver = driver;
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.ifname = ifname;
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.confname = confname;
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.bridge_ifname = bridge_ifname;
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Otherwise, have wpa_supplicant attach to it. */
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((wpa_s = wpa_supplicant_add_iface(global, &iface))) {
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *path = wpa_s->dbus_new_path;
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_method_return(message);
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH,
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			                         &path, DBUS_TYPE_INVALID);
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_unknown_error(
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "wpa_supplicant couldn't grab this "
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"interface.");
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(driver);
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ifname);
61161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os_free(confname);
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(bridge_ifname);
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror:
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_error_invalid_args(message, NULL);
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	goto out;
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          failure (0), or returns a dbus error message with more information
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call.  Handles requests
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages.
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message,
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *path;
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path,
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = get_iface_by_dbus_path(global, path);
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_iface_unknown(message);
645c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) {
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "wpa_supplicant couldn't remove this "
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"interface.");
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object,
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call.
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message,
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      struct wpa_global *global)
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname;
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *path;
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname,
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = wpa_supplicant_get_iface(global, ifname);
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_iface_unknown(message);
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	path = wpa_s->dbus_new_path;
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL)
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level
6971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
6981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
6991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property.
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(DBusMessageIter *iter,
7051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error,
7061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 void *user_data)
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str;
7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int idx = wpa_debug_level;
7101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx < 0)
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 0;
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx > 5)
7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 5;
7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str = debug_strings[idx];
7161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
7171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp
7231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property.
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(DBusMessageIter *iter,
7311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                                             DBusError *error,
7321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                                             void *user_data)
7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_timestamp, error);
7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys
7421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property.
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(DBusMessageIter *iter,
7501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
7511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_show_keys, error);
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level
7601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property.
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(DBusMessageIter *iter,
7681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str = NULL;
7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, val = -1;
7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
7751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &str))
7761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; debug_strings[i]; i++)
7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(debug_strings[i], str) == 0) {
7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			val = i;
7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (val < 0 ||
7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp,
7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    wpa_debug_show_keys)) {
7871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED, "wrong debug "
7881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "level value");
7891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp
7981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property.
8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(DBusMessageIter *iter,
8061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
8071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0,
8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_show_keys);
8181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys
8241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property.
8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(DBusMessageIter *iter,
8321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
8331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level,
8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_timestamp,
8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					val ? 1 : 0);
8451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list
8511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests
8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects
8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths
8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter,
8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					DBusError *error,
8621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					void *user_data)
8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char **paths;
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
8681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		num++;
8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
87361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
8751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
8761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i++] = wpa_s->dbus_new_path;
8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
8831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
8841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
8871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list
8931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
9011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter,
9021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **eap_methods;
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t num_items = 0;
9061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eap_methods = eap_get_names_as_string_array(&num_items);
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!eap_methods) {
9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_STRING,
9161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 eap_methods,
9171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 num_items, error);
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (num_items)
9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(eap_methods[--num_items]);
9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(eap_methods);
9221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
926d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
927d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities
928d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
929d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
930d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
931d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
932d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
933d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to
934d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS,
935d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time.
936d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
937d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter,
938d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					         DBusError *error,
939d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					         void *user_data)
940d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
941d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL };
942d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	size_t num_items = 0;
943d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
944d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP
945d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ap";
946d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */
947d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN
948d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ibss-rsn";
949d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */
950d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P
951d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "p2p";
952d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */
953d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING
954d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "interworking";
955d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */
956d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
957d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter,
958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      DBUS_TYPE_STRING,
959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      capabilities,
960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      num_items, error);
961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var,
9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char **type, DBusMessage **reply)
9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) {
9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Type must be a string");
9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Type value type. String required");
9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(var, type);
9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var,
9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    struct wpa_driver_scan_params *params,
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    DBusMessage **reply)
9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_ssid *ssids = params->ssids;
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t ssids_num = 0;
9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ssid;
9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids "
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "must be an array of arrays of bytes");
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong SSIDs value type. Array of arrays of "
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"bytes required");
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE)
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids "
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "must be an array of arrays of bytes");
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong SSIDs value type. Array of arrays of "
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"bytes required");
10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY)
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ssids_num >= WPAS_MAX_SCAN_SSIDS) {
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Too many ssids specified on scan dbus "
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "call");
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "Too many ssids specified. Specify "
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"at most four");
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1028c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		if (len > MAX_SSID_LEN) {
1029c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			wpa_printf(MSG_DEBUG,
1030c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				   "wpas_dbus_handler_scan[dbus]: "
1031c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				   "SSID too long (len=%d max_len=%d)",
1032c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				   len, MAX_SSID_LEN);
1033c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
1034c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				message, "Invalid SSID: too long");
1035c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			return -1;
1036c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		}
1037c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len != 0) {
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = os_malloc(len);
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ssid == NULL) {
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_printf(MSG_DEBUG,
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   "wpas_dbus_handler_scan[dbus]: "
10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   "out of memory. Cannot allocate "
10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   "memory for SSID");
10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				*reply = dbus_message_new_error(
10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					message, DBUS_ERROR_NO_MEMORY, NULL);
10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_memcpy(ssid, val, len);
10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Allow zero-length SSIDs */
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = NULL;
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid = ssid;
10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid_len = len;
10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids_num++;
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->num_ssids = ssids_num;
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var,
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  struct wpa_driver_scan_params *params,
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  DBusMessage **reply)
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ies = NULL, *nies;
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ies_len = 0;
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must "
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "be an array of arrays of bytes");
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong IEs value type. Array of arrays of "
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"bytes required");
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE)
10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must "
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "be an array of arrays of bytes");
10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong IEs value type. Array required");
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY)
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len == 0) {
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_iter_next(&array_iter);
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		nies = os_realloc(ies, ies_len + len);
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (nies == NULL) {
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "out of memory. Cannot allocate memory for "
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "IE");
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ies);
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = dbus_message_new_error(
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, DBUS_ERROR_NO_MEMORY, NULL);
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies = nies;
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memcpy(ies + ies_len, val, len);
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies_len += len;
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies = ies;
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies_len = ies_len;
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message,
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessageIter *var,
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_driver_scan_params *params,
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessage **reply)
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int *freqs = NULL, *nfreqs;
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int freqs_num = 0;
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Channels must be an array of structs");
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Channels value type. Array of structs "
11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"required");
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) {
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG,
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_handler_scan[dbus]: Channels must be an "
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "array of structs");
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Channels value type. Array of structs "
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"required");
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT)
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int freq, width;
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dbus_message_iter_get_arg_type(&sub_array_iter) !=
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Channel must by specified by struct of "
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "two UINT32s %c",
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   dbus_message_iter_get_arg_type(
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   &sub_array_iter));
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "Wrong Channel struct. Two UINT32s "
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"required");
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &freq);
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_next(&sub_array_iter) ||
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    dbus_message_iter_get_arg_type(&sub_array_iter) !=
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Channel must by specified by struct of "
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "two UINT32s");
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message,
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &width);
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs_num % FREQS_ALLOC_CHUNK == 0) {
119961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			nfreqs = os_realloc_array(
120061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				freqs, freqs_num + FREQS_ALLOC_CHUNK,
120161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				sizeof(int));
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (nfreqs == NULL)
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_free(freqs);
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			freqs = nfreqs;
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs == NULL) {
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "out of memory. can't allocate memory for "
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "freqs");
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = dbus_message_new_error(
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, DBUS_ERROR_NO_MEMORY, NULL);
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs[freqs_num] = freq;
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs_num++;
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
122161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int));
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (nfreqs == NULL)
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(freqs);
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs = nfreqs;
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (freqs == NULL) {
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "out of memory. Can't allocate memory for freqs");
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = dbus_message_new_error(
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, DBUS_ERROR_NO_MEMORY, NULL);
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs[freqs_num] = 0;
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->freqs = freqs;
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface
12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests
12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible
12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface.
12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     struct wpa_supplicant *wpa_s)
12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, dict_iter, entry_iter, variant_iter;
12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *key = NULL, *type = NULL;
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_params params;
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t i;
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&params, 0, sizeof(params));
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &dict_iter);
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&dict_iter) ==
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			DBUS_TYPE_DICT_ENTRY) {
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&dict_iter, &entry_iter);
12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&entry_iter, &key);
12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&entry_iter);
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&entry_iter, &variant_iter);
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, "Type") == 0) {
12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_type(message, &variant_iter,
12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &type, &reply) < 0)
12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "SSIDs") == 0) {
12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ssids(message, &variant_iter,
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     &params, &reply) < 0)
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "IEs") == 0) {
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ies(message, &variant_iter,
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   &params, &reply) < 0)
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "Channels") == 0) {
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_channels(message, &variant_iter,
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							&params, &reply) < 0)
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Unknown argument %s", key);
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(message, key);
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&dict_iter);
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!type) {
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Scan type not specified");
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, key);
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!os_strcmp(type, "passive")) {
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (params.num_ssids || params.extra_ies_len) {
13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "SSIDs or IEs specified for passive scan.");
13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "You can specify only Channels in "
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"passive scan");
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (params.freqs && params.freqs[0]) {
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_supplicant_trigger_scan(wpa_s, &params);
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
1315d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			wpa_s->scan_req = MANUAL_SCAN_REQ;
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_supplicant_req_scan(wpa_s, 0, 0);
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (!os_strcmp(type, "active")) {
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!params.num_ssids) {
13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Add wildcard ssid */
13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			params.num_ssids++;
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
132304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
132404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
132504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_trigger_scan(wpa_s, &params);
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Unknown scan type: %s", type);
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message,
13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     "Wrong scan type");
13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free((u8 *) params.ssids[i].ssid);
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free((u8 *) params.extra_ies);
13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(params.freqs);
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection
13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected
13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise.
13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface.
13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->disconnected = 1;
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "This interface is not connected");
13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network
13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network
13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface.
13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter;
13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = NULL;
13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf;
13841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusError error;
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_add_network(wpa_s->conf);
13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_handler_add_network[dbus]: "
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "can't add new interface.");
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message,
13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wpa_supplicant could not add "
13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"a network on this interface.");
13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_added(wpa_s, ssid);
13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid->disabled = 1;
14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_network_defaults(ssid);
14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_error_init(&error);
14031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!set_network_properties(wpa_s, ssid, &iter, &error)) {
14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_add_network[dbus]:"
14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "control interface couldn't set network "
14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "properties");
14071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_reply_new_from_error(message, &error,
14081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       DBUS_ERROR_INVALID_ARGS,
14091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       "Failed to add network");
14101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_error_free(&error);
14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Construct the object path for this network. */
14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_s->dbus_new_path, ssid->id);
14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL) {
14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
14288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
14298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
14308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
14318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
14348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
14368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid) {
14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpas_notify_network_removed(wpa_s, ssid);
14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_config_remove_network(wpa_s->conf, ssid->id);
14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
144561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate to current AP
144661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message
144761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
144861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Returns: NotConnected DBus error message if not connected
144961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise.
145061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *
145161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface.
145261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */
145361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message,
145461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
145561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
145661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
1457d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpas_request_connection(wpa_s);
145861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
145961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
146061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
146161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
146261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				      "This interface is not connected");
146361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
146461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
146561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
146661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/**
14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network
14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface.
14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *iface = NULL, *net_id = NULL;
14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
14822f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	int was_disabled;
14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
148975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL);
1490d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (iface == NULL || net_id == NULL ||
1491d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1496d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1498d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15092f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	was_disabled = ssid->disabled;
15102f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, id) < 0) {
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR,
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_handler_remove_network[dbus]: "
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "error occurred when removing network %d", id);
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "error removing the specified network on "
15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"this interface.");
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
15262f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	else if (!was_disabled && wpa_s->sched_scanning) {
15272f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to remove "
15282f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt			   "network from filters");
15292f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
15302f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_req_scan(wpa_s, 0, 0);
15312f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	}
15322f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(net_id);
15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid)
15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s = arg;
15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) {
15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR,
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_handler_remove_all_networks[dbus]: "
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "error occurred when removing network %d",
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   ssid->id);
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
1556d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
1557d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface.
15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks(
15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15722f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	if (wpa_s->sched_scanning)
15732f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
15742f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* NB: could check for failure and return an error */
15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s);
15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network
15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface.
15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message,
15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *iface = NULL, *net_id = NULL;
15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
160375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL);
1604d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (iface == NULL || net_id == NULL ||
1605d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1610d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1612d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Finally, associate with the network */
16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_select_network(wpa_s, ssid);
16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(net_id);
16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
16341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal
16351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message
16361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure
16381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
16391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface.
16401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */
16411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message,
16421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      struct wpa_supplicant *wpa_s)
16431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
16441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL
16451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessage *reply = NULL;
16461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *op, *field, *value;
16471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *iface = NULL, *net_id = NULL;
16481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int id;
16491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_ssid *ssid;
16501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
16521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	                           DBUS_TYPE_OBJECT_PATH, &op,
16531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	                           DBUS_TYPE_STRING, &field,
16541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	                           DBUS_TYPE_STRING, &value,
16551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			           DBUS_TYPE_INVALID))
16561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpas_dbus_error_invalid_args(message, NULL);
16571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Extract the network ID and ensure the network */
16591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* is actually a child of this interface */
16601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL);
1661d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (iface == NULL || net_id == NULL ||
1662d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
16631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
16651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
16661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1667d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
16681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	id = strtoul(net_id, NULL, 10);
1669d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
16701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, net_id);
16711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
16721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
16731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
16751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (ssid == NULL) {
16761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
16771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
16781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
16791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid,
16811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      field, value) < 0)
16821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, field);
16831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	else {
16841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		/* Tell EAP to retry immediately */
16851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		eapol_sm_notify_ctrl_response(wpa_s->eapol);
16861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
16871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout:
16891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(iface);
16901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(net_id);
16911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return reply;
16921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */
16931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included");
16941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_error_unknown_error(message, "802.1X not included");
16951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */
16961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
16971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/**
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates)
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs.
17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message,
17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *blob_data;
17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int blob_len;
17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob = NULL;
17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &blob_name);
17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_get_blob(wpa_s->conf, blob_name)) {
17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_EXISTS,
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array_iter);
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len);
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = os_zalloc(sizeof(*blob));
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->data = os_malloc(blob_len);
17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob->data) {
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(blob->data, blob_data, blob_len);
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->len = blob_len;
17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->name = os_strdup(blob_name);
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob->name) {
17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_blob(wpa_s->conf, blob);
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_added(wpa_s, blob->name);
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (blob) {
17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->name);
17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->data);
17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob);
17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates)
17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob)
17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs.
17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message,
17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct wpa_config_blob *blob;
17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_config_get_blob(wpa_s->conf, blob_name);
17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!reply) {
17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      DBUS_TYPE_BYTE_AS_STRING,
18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      &array_iter)) {
18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE,
18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  &(blob->data), blob->len)) {
18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&iter, &array_iter)) {
18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob
18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error
18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs.
18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message,
18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_blob(wpa_s->conf, blob_name)) {
18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_removed(wpa_s, blob_name);
18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache
18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface.
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message,
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t age;
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age,
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (age == 0)
18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush(wpa_s);
18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush_by_age(wpa_s, age);
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
188804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
188904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
189004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface
189104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message
189204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
189304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL
189404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
189504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface.
189604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
189704949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message,
189804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					 struct wpa_supplicant *wpa_s)
189904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
190004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *reply = NULL;
190104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	enum wpa_states state = wpa_s->wpa_state;
190204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *arg;
190304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
190404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg,
190504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      DBUS_TYPE_INVALID);
190604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
190704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (arg != NULL && os_strlen(arg) > 0) {
190804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		char *tmp;
190904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		tmp = os_strdup(arg);
191004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (tmp == NULL) {
191104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			reply = dbus_message_new_error(message,
191204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						       DBUS_ERROR_NO_MEMORY,
191304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						       NULL);
191404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else {
191504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			os_free(wpa_s->conf->autoscan);
191604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			wpa_s->conf->autoscan = tmp;
191704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
191804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				autoscan_init(wpa_s, 1);
191904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			else if (state == WPA_SCANNING)
192004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				wpa_supplicant_reinit_autoscan(wpa_s);
192104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		}
192204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else if (arg != NULL && os_strlen(arg) == 0) {
192304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->conf->autoscan);
192404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->conf->autoscan = NULL;
192504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
192604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else
192704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		reply = dbus_message_new_error(message,
192804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       DBUS_ERROR_INVALID_ARGS,
192904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       NULL);
193004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
193104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return reply;
193204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
193304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
193404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
193504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities
19381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
19391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
19401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
19411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface.
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
19451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(DBusMessageIter *iter,
19461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					  DBusError *error, void *user_data)
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_capa capa;
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array,
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		variant_iter;
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *scans[] = { "active", "passive", "ssid" };
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{sv}", &variant_iter))
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_drv_get_capa(wpa_s, &capa);
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** pairwise cipher */
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {"ccmp", "tkip", "none"};
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Pairwise", args,
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(args) / sizeof(char*)))
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise",
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) {
19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "ccmp"))
19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) {
198561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
198661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				    &iter_array, "gcmp"))
198761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				goto nomem;
198861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		}
198961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) {
19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "tkip"))
19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) {
19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "none"))
19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** group cipher */
20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"ccmp", "tkip", "wep104", "wep40"
20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Group", args,
20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(args) / sizeof(char*)))
20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group",
20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) {
20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "ccmp"))
20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
203161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) {
203261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
203361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				    &iter_array, "gcmp"))
203461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				goto nomem;
203561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		}
203661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) {
20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "tkip"))
20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) {
20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wep104"))
20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) {
20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wep40"))
20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
20588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
20598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** key management */
20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wpa-psk", "wpa-eap", "ieee8021x", "wpa-none",
20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wps",
20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"none"
20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "KeyMgmt", args,
20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(args) / sizeof(char*)))
20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt",
20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "none"))
20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "ieee8021x"))
20888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
20918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) {
20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-eap"))
20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
20958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT)
20978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (!wpa_dbus_dict_string_array_add_element(
20988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    &iter_array, "wpa-ft-eap"))
20998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto nomem;
21008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-eap-sha256"))
21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) {
21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-psk"))
21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK)
21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (!wpa_dbus_dict_string_array_add_element(
21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    &iter_array, "wpa-ft-psk"))
21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto nomem;
21198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-psk-sha256"))
21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
21278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) {
21298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
21308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-none"))
21318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
21328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
21338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
21368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
21378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "wps"))
21388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** WPA protocol */
21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "rsn", "wpa" };
21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Protocol", args,
21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(args) / sizeof(char*)))
21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
21568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol",
21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
21588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
21598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
21618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
21638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) {
21648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "rsn"))
21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
21708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) {
21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa"))
21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** auth alg */
21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "open", "shared", "leap" };
21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "AuthAlg", args,
21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(args) / sizeof(char*)))
21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
21908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
21918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg",
21928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
21968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.auth & (WPA_DRIVER_AUTH_OPEN)) {
21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "open"))
22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.auth & (WPA_DRIVER_AUTH_SHARED)) {
22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "shared"))
22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.auth & (WPA_DRIVER_AUTH_LEAP)) {
22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "leap"))
22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Scan */
22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans,
22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       sizeof(scans) / sizeof(char *)))
22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Modes */
222875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes",
222975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_entry,
223075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_val,
223175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_array))
22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
223475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_string_array_add_element(
223575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			    &iter_array, "infrastructure"))
223675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
223775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
223875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_string_array_add_element(
223975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			    &iter_array, "ad-hoc"))
224075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
224175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
224275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (res >= 0) {
224375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (capa.flags & (WPA_DRIVER_FLAGS_AP)) {
224475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			if (!wpa_dbus_dict_string_array_add_element(
224575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				    &iter_array, "ap"))
224675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				goto nomem;
224775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		}
224875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
224975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (capa.flags & (WPA_DRIVER_FLAGS_P2P_CAPABLE)) {
225075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			if (!wpa_dbus_dict_string_array_add_element(
225175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				    &iter_array, "p2p"))
225275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				goto nomem;
225375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		}
225475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	}
225575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
225675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_end_string_array(&iter_dict,
225775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_entry,
225875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_val,
225975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_array))
226075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
226175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	/***** Modes end */
226275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
22631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res >= 0) {
22641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_int32_t max_scan_ssid = capa.max_scan_ssids;
22651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID",
22671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						max_scan_ssid))
22681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto nomem;
22691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
22701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
22731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter))
22748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
22758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
22778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
22791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
22801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state
22861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
22871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
22881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
22891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property.
22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
22931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_state(DBusMessageIter *iter, DBusError *error,
22941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   void *user_data)
22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str_state;
22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *state_ls, *tmp;
22991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str_state = wpa_supplicant_state_txt(wpa_s->wpa_state);
23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* make state string lowercase to fit new DBus API convention
23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	state_ls = tmp = os_strdup(str_state);
23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!tmp) {
23071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
23081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*tmp) {
23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*tmp = tolower(*tmp);
23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tmp++;
23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
23161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   &state_ls, error);
23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(state_ls);
23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state
23261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
23271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
23281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
23291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property.
23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
23331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(DBusMessageIter *iter, DBusError *error,
23341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                                      void *user_data)
23358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE;
23381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
23391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
23401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&scanning, error);
23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
23458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode
23461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
23471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
23481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
23491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property.
23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
23531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(DBusMessageIter *iter, DBusError *error,
23541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan = wpa_s->conf->ap_scan;
23581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
23591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
23601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ap_scan, error);
23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode
23661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
23671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
23681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
23691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property.
23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
23731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(DBusMessageIter *iter, DBusError *error,
23741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan;
23788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
23801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &ap_scan))
23811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) {
23841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
23851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "ap_scan must be 0, 1, or 2");
23861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2393c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast
2394c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2395c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2396c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2397c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2398c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2399c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2400c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property.
2401c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2402c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(DBusMessageIter *iter,
2403c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					 DBusError *error,
2404c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					 void *user_data)
2405c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2406c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2407c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE;
2408c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2409c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
2410c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&fast_reauth, error);
2411c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2412c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2413c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2414c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
2415c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast
2416c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2417c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2418c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2419c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2420c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2421c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2422c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property.
2423c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2424c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter,
2425c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				     DBusError *error,
2426c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				     void *user_data)
2427c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2428c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2429c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth;
2430c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2431c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
2432c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					      &fast_reauth))
2433c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		return FALSE;
2434c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2435c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	wpa_s->conf->fast_reauth = fast_reauth;
2436c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return TRUE;
2437c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2438c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2439c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2440c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
244104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect
244204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
244304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
244404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
244504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
244604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
244704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property.  The reason is negative if it is
244804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated.
244904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
245004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter,
245104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       DBusError *error,
245204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       void *user_data)
245304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
245404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
245504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t reason = wpa_s->disconnect_reason;
245604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
245704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&reason, error);
245804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
245904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
246004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
246104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age
24631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
24641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
24651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
24661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property.
24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
24701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter,
24711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    DBusError *error,
24721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    void *user_data)
24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age;
24761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
24771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
24781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_age, error);
24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age
24841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
24851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
24861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
24871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property.
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
24911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(DBusMessageIter *iter,
24921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    DBusError *error,
24931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    void *user_data)
24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age;
24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
24991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_age))
25001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) {
25031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
25041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireAge must be >= 10");
25051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count
25131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
25141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
25151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
25161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property.
25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
25201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(DBusMessageIter *iter,
25211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      DBusError *error,
25221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      void *user_data)
25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
25241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
252561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count;
25261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
25281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_count, error);
25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count
25341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
25351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
25361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
25371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property.
25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
25411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(DBusMessageIter *iter,
25421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      DBusError *error,
25431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      void *user_data)
25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
25451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_count;
25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
25491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_count))
25501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) {
25531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
25541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireCount must be > 0");
25551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code
25631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
25641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
25651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
25661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property.
25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
25701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_country(DBusMessageIter *iter, DBusError *error,
25711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
25731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char country[3];
25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *str = country;
25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[0] = wpa_s->conf->country[0];
25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[1] = wpa_s->conf->country[1];
25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[2] = '\0';
25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
25821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code
25881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
25891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
25901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
25911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property.
25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
25951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_country(DBusMessageIter *iter, DBusError *error,
25961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
25981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *country;
26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
26021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &country))
26031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!country[0] || !country[1]) {
26061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
26071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "invalid country code");
26081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
26091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) {
26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "Failed to set country");
26131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
26141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "failed to set country code");
26151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[0] = country[0];
26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[1] = country[1];
26201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
262504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval
262604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
262704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
262804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
262904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
263004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
263104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property.
263204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
263304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(DBusMessageIter *iter,
263404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   DBusError *error,
263504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   void *user_data)
263604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
263704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
263804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval = wpa_s->scan_interval;
263904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
264004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
264104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&scan_interval, error);
264204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
264304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
264404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
264504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
264604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval
264704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
264804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
264904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
265004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
265104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
265204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property.
265304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
265404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(DBusMessageIter *iter,
265504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   DBusError *error,
265604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   void *user_data)
265704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
265804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
265904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval;
266004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
266104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32,
266204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      &scan_interval))
266304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
266404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
266504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) {
266604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
266704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     "scan_interval must be >= 0");
266804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
266904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
267004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
267104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
267204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
267304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
267404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name
26761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
26771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
26781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
26791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property.
26828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error,
26841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				    void *user_data)
26858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
26878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname = wpa_s->ifname;
26881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
26891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
26901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ifname, error);
26918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name
26961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
26971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
26981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
26991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property.
27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error,
27041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				    void *user_data)
27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *driver;
27088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) {
27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_getter_driver[dbus]: "
27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpa_s has no driver set");
27121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set",
27131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       __func__);
27141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	driver = wpa_s->driver->name;
27181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
27191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&driver, error);
27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path
27251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property.
27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter,
27331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error,
27341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 void *user_data)
27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf;
27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_bss)
27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_bss->id);
27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
27471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bss_obj_path, error);
27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path
27531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property.
27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter,
27611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
27621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf;
27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid)
27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_ssid->id);
27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
27751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&net_obj_path, error);
27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type
27811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property.
27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(DBusMessageIter *iter,
27891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       DBusError *error,
27901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       void *user_data)
27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *eap_mode;
27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *auth_mode;
27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX];
27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->wpa_state != WPA_COMPLETED) {
27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = "INACTIVE";
27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X ||
28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eap_mode = wpa_supplicant_get_eap_mode(wpa_s);
28028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX,
28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "EAP-%s", eap_mode);
28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = eap_mode_buf;
28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt,
28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_s->current_ssid->proto);
28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
28121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&auth_mode, error);
28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name
28181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property.
28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter,
28261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   DBusError *error,
28271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   void *user_data)
28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *bridge_ifname = wpa_s->bridge_ifname;
28311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
28321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bridge_ifname, error);
28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects
28381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property.
28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error,
28461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  void *user_data)
28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *bss;
28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
28518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0;
28521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
285461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(wpa_s->num_bss, sizeof(char *));
28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
28561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
28571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through scan results and append each result's object path */
28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) {
28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
28641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
28651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this BSS. */
28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, bss->id);
28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
28751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
28761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, wpa_s->num_bss,
28771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
28831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects
28891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property.
28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error,
28971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
29028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
29031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->conf == NULL) {
29061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: An error occurred getting "
29071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			   "networks list.", __func__);
29081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED, "%s: an error "
29091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "occurred getting the networks list", __func__);
29101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
291475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (!network_is_persistent_group(ssid))
291575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			num++;
29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
291761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
29191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory");
29201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through configured networks and append object path of each */
29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
292575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (network_is_persistent_group(ssid))
292675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			continue;
29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
29291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory");
29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this network. */
29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, ssid->id);
29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
29401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
29411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
29458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
29471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface
29531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property.
29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error,
29611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   void *user_data)
29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter;
29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob;
29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{say}", &variant_iter) ||
29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "{say}", &dict_iter)) {
29711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
29721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_s->conf->blobs;
29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (blob) {
29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_open_container(&dict_iter,
29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_DICT_ENTRY,
29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      NULL, &entry_iter) ||
29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_basic(&entry_iter,
29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    DBUS_TYPE_STRING,
29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &(blob->name)) ||
29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_open_container(&entry_iter,
29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_ARRAY,
29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_BYTE_AS_STRING,
29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &array_iter) ||
29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_fixed_array(&array_iter,
29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  DBUS_TYPE_BYTE,
29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  &(blob->data),
29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  blob->len) ||
29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&entry_iter,
29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &array_iter) ||
29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&dict_iter,
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &entry_iter)) {
29951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
29961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
29971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return FALSE;
29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		blob = blob->next;
30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) ||
30041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
30051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
30061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
30101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
30111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
30121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
30131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args,
30141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       DBusError *error, const char *func_name)
30151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
30161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id);
30171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
30181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res) {
30191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found",
30201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		           func_name, args->id);
30211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
30221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: BSS %d not found",
30231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       func_name, args->id);
30241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
30251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
30261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS
30321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property.
30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(DBusMessageIter *iter, DBusError *error,
30401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       void *user_data)
30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
30431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
30461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
30471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->bssid, ETH_ALEN,
30511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS
30571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property.
30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(DBusMessageIter *iter, DBusError *error,
30651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
30681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
30711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
30721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
30751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->ssid, res->ssid_len,
30761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS
30821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property.
30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(DBusMessageIter *iter,
30901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
30931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t privacy;
30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
30971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
30981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE;
31011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
31021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&privacy, error);
31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS
31081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property.
31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(DBusMessageIter *iter, DBusError *error,
31161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
31191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *mode;
31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
31231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
31241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res->caps & IEEE80211_CAP_IBSS)
31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mode = "ad-hoc";
31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mode = "infrastructure";
31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
31321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&mode, error);
31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS
31381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property.
31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(DBusMessageIter *iter,
31461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					DBusError *error, void *user_data)
31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
31491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3150c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	s16 level;
31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
31531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
31541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3156c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	level = (s16) res->level;
31571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16,
3158c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&level, error);
31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS
31641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property.
31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(DBusMessageIter *iter,
31721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   DBusError *error, void *user_data)
31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
31751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3176c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	u16 freq;
31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
31791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
31801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3182c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	freq = (u16) res->freq;
31831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16,
3184c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&freq, error);
31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b)
31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return (*(u8 *) b - *(u8 *) a);
31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS
31961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property.
32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
32031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(DBusMessageIter *iter,
32041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       DBusError *error, void *user_data)
32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
32071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ie_rates = NULL;
32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 *real_rates;
32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int rates_num, i;
32111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
32141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
32151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	rates_num = wpa_bss_get_bit_rates(res, &ie_rates);
32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (rates_num < 0)
32191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	qsort(ie_rates, rates_num, 1, cmp_u8s_desc);
32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	real_rates = os_malloc(sizeof(u32) * rates_num);
32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!real_rates) {
32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(ie_rates);
32261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
32271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
32288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < rates_num; i++)
32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		real_rates[i] = ie_rates[i] * 500000;
32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32,
32341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 real_rates, rates_num,
32351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
32368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ie_rates);
32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(real_rates);
32391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(DBusMessageIter *iter,
32441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   struct wpa_ie_data *ie_data,
32451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   DBusError *error)
32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *group;
324961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	const char *pairwise[3]; /* max 3 pairwise ciphers is supported */
32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *key_mgmt[7]; /* max 7 key managements may be supported */
32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{sv}", &variant_iter))
32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* KeyMgmt */
32618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK)
32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk";
32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK)
32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-psk";
32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256)
32678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk-sha256";
32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X)
32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap";
32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-eap";
32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)
32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-sha256";
32748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE)
32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-none";
32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt",
32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       key_mgmt, n))
32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Group */
32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch (ie_data->group_cipher) {
32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP40:
32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep40";
32858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_TKIP:
32878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "tkip";
32888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_CCMP:
32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "ccmp";
32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
329261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	case WPA_CIPHER_GCMP:
329361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		group = "gcmp";
329461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		break;
32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP104:
32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep104";
32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "";
33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group))
33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Pairwise */
33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP)
33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "tkip";
33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP)
33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "ccmp";
331261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP)
331361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pairwise[n++] = "gcmp";
33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise",
33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       pairwise, n))
33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Management group (RSN only) */
33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->proto == WPA_PROTO_RSN) {
33218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (ie_data->mgmt_group_cipher) {
33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
33238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case WPA_CIPHER_AES_128_CMAC:
33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "aes128cmac";
33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "";
33298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup",
33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 group))
33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
33388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
33391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter))
33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
33438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
33451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
33461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS
33521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
33531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
33541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
33551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
33578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property.
33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
33591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(DBusMessageIter *iter, DBusError *error,
33601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
33618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
33631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
33648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
33658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
33668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
33681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
33691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
33728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE);
33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie) {
33741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
33751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_FAILED,
33761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "failed to parse WPA IE");
33771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return FALSE;
33781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		}
33798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error);
33828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS
33871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
33881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
33891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
33901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
33918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
33928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property.
33938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
33941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(DBusMessageIter *iter, DBusError *error,
33951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
33968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
33981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
33998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
34008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
34078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_ie(res, WLAN_EID_RSN);
34088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie) {
34091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
34101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_FAILED,
34111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "failed to parse RSN IE");
34121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return FALSE;
34131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		}
34148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error);
34178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3421d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS
3422d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
3423d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
3424d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
3425d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
3426d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
3427d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property.
3428d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
3429d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(DBusMessageIter *iter, DBusError *error,
3430d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt				     void *user_data)
3431d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
3432d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct bss_handler_args *args = user_data;
3433d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpa_bss *res;
3434d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
3435d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpabuf *wps_ie;
3436d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
3437d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
3438d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *type = "";
3439d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3440d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	res = get_bss_helper(args, error, __func__);
3441d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!res)
3442d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return FALSE;
3443d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3444d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
3445d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					      "a{sv}", &variant_iter))
3446d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3447d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3448d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
3449d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3450d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3451d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
3452d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE);
3453d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (wps_ie) {
3454d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		if (wps_is_selected_pbc_registrar(wps_ie))
3455d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pbc";
3456d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		else if (wps_is_selected_pin_registrar(wps_ie))
3457d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pin";
3458d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	}
3459d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
3460d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3461d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!wpa_dbus_dict_append_string(&iter_dict, "Type", type))
3462d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3463d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3464d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
3465d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3466d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter))
3467d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3468d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3469d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return TRUE;
3470d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3471d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem:
3472d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
3473d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return FALSE;
3474d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
3475d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3476d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3477d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
34788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS
34791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property.
34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
34861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error,
34871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
34888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
34901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
34918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
34931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
34941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
34971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res + 1, res->ie_len,
34981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
34998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled
35041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network.
35108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
35111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error,
35121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
35138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE;
35161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
35171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
35181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&enabled, error);
35198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled
35241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network.
35308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
35311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(DBusMessageIter *iter, DBusError *error,
35321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
35338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
35358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enable;
35388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
35401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &enable))
35411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = net->wpa_s;
35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = net->ssid;
35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (enable)
35478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_enable_network(wpa_s, ssid);
35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
35498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_disable_network(wpa_s, ssid);
35508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
35528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network
35571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network.
35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
35641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(DBusMessageIter *iter,
35651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						DBusError *error,
35661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						void *user_data)
35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
35691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter, dict_iter;
35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **iterator;
35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **props = wpa_config_get_all(net->ssid, 1);
35721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!props) {
35751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
35761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}",
35801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &variant_iter) ||
35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) {
35821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
35848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
35878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
35888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&dict_iter, *iterator,
35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 *(iterator + 1))) {
35901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
35911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
35928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
35938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator += 2;
35958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) ||
35991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
36001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = TRUE;
36051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
36078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(*iterator);
36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator++;
36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(props);
36131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
36188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network
36191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
36201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
36211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
36221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
36248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network.
36258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
36261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(DBusMessageIter *iter,
36271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						DBusError *error,
36281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						void *user_data)
36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = net->ssid;
36321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter;
36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
36351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return set_network_properties(net->wpa_s, ssid, &variant_iter, error);
36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
363704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
363804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
363904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP
364004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
364104949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq(
364204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
364304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
364404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
364504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *name;
364604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
364704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer != NULL) {
364804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (os_strcmp(dbus_message_get_sender(message),
364904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      wpa_s->preq_notify_peer) == 0)
365004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
365104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
365204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
365304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE,
365404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Another application is already subscribed");
365504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
365604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
365704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	name = os_strdup(dbus_message_get_sender(message));
365804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!name)
365904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
366004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      "out of memory");
366104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
366204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = name;
366304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
366404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Subscribe to clean up if application closes socket */
366504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_subscribe_noc(priv);
366604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
366704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/*
366804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * Double-check it's still alive to make sure that we didn't
366904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * miss the NameOwnerChanged signal, e.g. while strdup'ing.
367004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 */
367104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_bus_name_has_owner(priv->con, name, NULL)) {
367204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		/*
367304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Application no longer exists, clean up.
367404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * The return value is irrelevant now.
367504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 *
367604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Need to check if the NameOwnerChanged handling
367704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * already cleaned up because we have processed
367804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * DBus messages while checking if the name still
367904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * has an owner.
368004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 */
368104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (!wpa_s->preq_notify_peer)
368204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
368304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->preq_notify_peer);
368404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->preq_notify_peer = NULL;
368504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpas_dbus_unsubscribe_noc(priv);
368604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
368704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
368804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
368904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
369004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
369104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
369204949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq(
369304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
369404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
369504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
369604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
369704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_s->preq_notify_peer)
369804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
369904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_NO_SUBSCRIPTION,
370004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Not subscribed");
370104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
370204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_strcmp(wpa_s->preq_notify_peer,
370304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		      dbus_message_get_sender(message)))
370404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
370504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM,
370604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Can't unsubscribe others");
370704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
370804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_free(wpa_s->preq_notify_peer);
370904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = NULL;
371004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_unsubscribe_noc(priv);
371104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
371204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
371304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
371404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
371504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s,
371604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *addr, const u8 *dst, const u8 *bssid,
371704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *ie, size_t ie_len, u32 ssi_signal)
371804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
371904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *msg;
372004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter iter, dict_iter;
372104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
372204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
372304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Do nothing if the control interface is not turned on */
372404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (priv == NULL)
372504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
372604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
372704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer == NULL)
372804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
372904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
373004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
373104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      WPAS_DBUS_NEW_IFACE_INTERFACE,
373204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      "ProbeRequest");
373304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (msg == NULL)
373404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
373504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
373604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_set_destination(msg, wpa_s->preq_notify_peer);
373704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
373804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_iter_init_append(msg, &iter);
373904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
374004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
374104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
374204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr",
374304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						     (const char *) addr,
374404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						     ETH_ALEN))
374504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
374604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst",
374704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    (const char *) dst,
374804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    ETH_ALEN))
374904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
375004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid",
375104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						      (const char *) bssid,
375204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						      ETH_ALEN))
375304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
375404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies",
375504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							     (const char *) ie,
375604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							     ie_len))
375704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
375804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal",
375904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						      ssi_signal))
376004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
376104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_dbus_dict_close_write(&iter, &dict_iter))
376204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
376304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
376404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_connection_send(priv->con, msg, NULL);
376504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	goto out;
376604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail:
376704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
376804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout:
376904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_unref(msg);
377004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
377104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
377204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */
3773