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"
30661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt#include "drivers/driver.h"
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *debug_strings[] = {
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_unknown_error - Return a new InvalidArgs error message
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message,
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    const char *arg)
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * This function can be called as a result of a failure
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * within internal getter calls, which will call this function
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * with a NULL message parameter.  However, dbus_message_new_error
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * looks very unkindly (i.e, abort()) on a NULL message, so
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * in this case, we should not call it.
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (message == NULL) {
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_INFO, "dbus: wpas_dbus_error_unknown_error "
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "called with NULL message (arg=%s)",
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   arg ? arg : "N/A");
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR,
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      arg);
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message)
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_UNKNOWN,
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "wpa_supplicant knows nothing about "
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "this interface.");
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message)
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN,
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "There is no such a network in this "
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "interface.");
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message,
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const char *arg)
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_error(message, WPAS_DBUS_ERROR_INVALID_ARGS,
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "Did not receive correct message "
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "arguments.");
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (arg != NULL)
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg,
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 DBUS_TYPE_INVALID);
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1207dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt/**
1217dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * wpas_dbus_error_scan_error - Return a new ScanError error message
1227dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
1237dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @error: Optional string to be used as the error message
1247dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Returns: a dbus error message
1257dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt *
1267dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Convenience function to create and return a scan error
1277dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt */
1287dba0e5708da7276a43a44cf479aa743564e15b9Dmitry ShmidtDBusMessage * wpas_dbus_error_scan_error(DBusMessage *message,
1297dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt					 const char *error)
1307dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt{
1317dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt	DBusMessage *reply;
1327dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1337dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt	reply = dbus_message_new_error(message,
1347dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt				       WPAS_DBUS_ERROR_IFACE_SCAN_ERROR,
1357dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt				       error);
1367dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1377dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt	return reply;
1387dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt}
1397dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1407dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *dont_quote[] = {
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap",
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path",
144d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	"bssid", "scan_freq", "freq_list", NULL
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key)
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i = 0;
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dont_quote[i] != NULL) {
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, dont_quote[i]) == 0)
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return FALSE;
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		i++;
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return TRUE;
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init()
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path(
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_global *global, const char *path)
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(wpa_s->dbus_new_path, path) == 0)
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return wpa_s;
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set.
1831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure
1841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   struct wpa_ssid *ssid,
1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   DBusMessageIter *iter,
1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   DBusError *error)
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING };
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter_dict;
1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *value = NULL;
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(iter, &iter_dict, error))
1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t size = 50;
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int ret;
2031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
2051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto error;
2061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		value = NULL;
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (entry.type == DBUS_TYPE_ARRAY &&
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    entry.array_type == DBUS_TYPE_BYTE) {
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (entry.array_len <= 0)
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			size = entry.array_len * 2 + 1;
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = wpa_snprintf_hex(value, size,
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       (u8 *) entry.bytearray_value,
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       entry.array_len);
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_STRING) {
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (should_quote_opt(entry.key)) {
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size = os_strlen(entry.str_value);
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (size <= 0)
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size += 3;
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_zalloc(size);
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				ret = os_snprintf(value, size, "\"%s\"",
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  entry.str_value);
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (ret < 0 || (size_t) ret != (size - 1))
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_strdup(entry.str_value);
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_UINT32) {
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%u",
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.uint32_value);
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_INT32) {
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%d",
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.int32_value);
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_config_set(ssid, entry.key, value, 0) < 0)
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((os_strcmp(entry.key, "psk") == 0 &&
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     value[0] == '"' && ssid->ssid_len) ||
26904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		    (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase))
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_psk(ssid);
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if (os_strcmp(entry.key, "priority") == 0)
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_prio_list(wpa_s->conf);
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(value);
275623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt		value = NULL;
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_dbus_dict_entry_clear(&entry);
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
2801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror:
2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(value);
2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_dbus_dict_entry_clear(&entry);
2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS,
2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			     "invalid message format");
2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property
2921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value
2951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure
2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic.
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter,
3011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const int type,
3021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const void *val,
3031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error)
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter;
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: given type is not basic", __func__);
3101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
3141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	                                      wpa_dbus_type_as_string(type),
3151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	                                      &variant_iter))
3161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto error;
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_append_basic(&variant_iter, type, val))
3191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto error;
3201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter))
3221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto error;
3231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
3251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror:
3271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error(error, DBUS_ERROR_FAILED,
3281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	               "%s: error constructing reply", __func__);
3291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored
3381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic.
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter,
3431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const int type, void *val)
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter;
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: given type is not basic", __func__);
3511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Look at the new value */
3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&variant_iter) != type) {
3571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
3581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "wrong property type");
3591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&variant_iter, val);
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property
3691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type)
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array
3731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure
3741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic.
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter,
3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   const int type,
3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   const void *array,
3821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   size_t array_len,
3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   DBusError *error)
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char type_str[] = "a?"; /* ? will be replaced with subtype letter; */
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *sub_type_str;
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t element_size, i;
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: given type is not basic", __func__);
3931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	type_str[1] = sub_type_str[0];
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
4001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      type_str, &variant_iter)) {
4011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: failed to construct message 1", __func__);
4031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      sub_type_str, &array_iter)) {
4081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: failed to construct message 2", __func__);
4101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch(type) {
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BYTE:
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BOOLEAN:
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = 1;
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT16:
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT16:
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint16_t);
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT32:
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT32:
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint32_t);
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT64:
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT64:
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint64_t);
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_DOUBLE:
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(double);
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_STRING:
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_OBJECT_PATH:
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(char *);
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
4381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: unknown element type %d", __func__, type);
4401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < array_len; i++) {
44443cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt		if (!dbus_message_iter_append_basic(&array_iter, type,
44543cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt						    array + i * element_size)) {
44643cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_FAILED,
44743cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt				       "%s: failed to construct message 2.5",
44843cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt				       __func__);
44943cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt			return FALSE;
45043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt		}
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) {
4541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: failed to construct message 3", __func__);
4561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter)) {
4601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		               "%s: failed to construct message 4", __func__);
4621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
4641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
4651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property
47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type)
47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message
47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array
47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure
47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is
47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic.
48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter,
48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 const int type,
48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 struct wpabuf **array,
48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 size_t array_len,
48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 DBusError *error)
48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char type_str[] = "aa?";
48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char inner_type_str[] = "a?";
49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	const char *sub_type_str;
49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	size_t i;
49204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
49304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_type_is_basic(type)) {
49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: given type is not basic", __func__);
49604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
49704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	type_str[2] = sub_type_str[0];
50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	inner_type_str[1] = sub_type_str[0];
50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      type_str, &variant_iter)) {
50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: failed to construct message 1", __func__);
50704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
50804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
50904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      inner_type_str, &array_iter)) {
51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: failed to construct message 2", __func__);
51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
516c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt	for (i = 0; i < array_len && array[i]; i++) {
51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_dbus_dict_bin_array_add_element(&array_iter,
51804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_head(array[i]),
51904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_len(array[i]));
52004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
52104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
52204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
52304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter)) {
52404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
52504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: failed to close message 2", __func__);
52604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
52704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
52804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
52904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter)) {
53004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
53104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: failed to close message 1", __func__);
53204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
53304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
53404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
53504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
53604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
53704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
53804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
53904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object,
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage.
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter_dict;
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter;
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry;
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *driver = NULL;
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *confname = NULL;
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *bridge_ifname = NULL;
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL))
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error;
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
56904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (!os_strcmp(entry.key, "Driver") &&
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    (entry.type == DBUS_TYPE_STRING)) {
571623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(driver);
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			driver = os_strdup(entry.str_value);
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (driver == NULL)
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
57604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else if (!os_strcmp(entry.key, "Ifname") &&
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   (entry.type == DBUS_TYPE_STRING)) {
578623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(ifname);
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(entry.str_value);
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ifname == NULL)
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
58304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else if (!os_strcmp(entry.key, "ConfigFile") &&
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   (entry.type == DBUS_TYPE_STRING)) {
585623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(confname);
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			confname = os_strdup(entry.str_value);
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (confname == NULL)
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
59004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else if (!os_strcmp(entry.key, "BridgeIfname") &&
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   (entry.type == DBUS_TYPE_STRING)) {
592623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(bridge_ifname);
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			bridge_ifname = os_strdup(entry.str_value);
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (bridge_ifname == NULL)
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error; /* Required Ifname argument missing */
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Try to get the wpa_supplicant record for this iface, return
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * an error if we already control it.
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_get_iface(global, ifname) != NULL) {
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message,
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       WPAS_DBUS_ERROR_IFACE_EXISTS,
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       "wpa_supplicant already "
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       "controls this interface.");
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_supplicant *wpa_s;
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_interface iface;
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memset(&iface, 0, sizeof(iface));
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.driver = driver;
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.ifname = ifname;
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.confname = confname;
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.bridge_ifname = bridge_ifname;
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Otherwise, have wpa_supplicant attach to it. */
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((wpa_s = wpa_supplicant_add_iface(global, &iface))) {
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *path = wpa_s->dbus_new_path;
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_method_return(message);
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH,
6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			                         &path, DBUS_TYPE_INVALID);
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_unknown_error(
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "wpa_supplicant couldn't grab this "
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"interface.");
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(driver);
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ifname);
63961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os_free(confname);
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(bridge_ifname);
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror:
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_error_invalid_args(message, NULL);
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	goto out;
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          failure (0), or returns a dbus error message with more information
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call.  Handles requests
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages.
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message,
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *path;
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path,
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = get_iface_by_dbus_path(global, path);
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_iface_unknown(message);
673c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) {
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "wpa_supplicant couldn't remove this "
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"interface.");
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object,
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call.
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message,
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      struct wpa_global *global)
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname;
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *path;
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname,
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = wpa_supplicant_get_iface(global, ifname);
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_iface_unknown(message);
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	path = wpa_s->dbus_new_path;
7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL)
7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level
7251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property.
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(DBusMessageIter *iter,
7331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error,
7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 void *user_data)
7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str;
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int idx = wpa_debug_level;
7381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx < 0)
7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 0;
7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx > 5)
7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 5;
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str = debug_strings[idx];
7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
7451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp
7511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property.
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(DBusMessageIter *iter,
7591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                                             DBusError *error,
7601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                                             void *user_data)
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_timestamp, error);
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys
7701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property.
7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(DBusMessageIter *iter,
7781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
7791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_show_keys, error);
7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level
7881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property.
7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(DBusMessageIter *iter,
7961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str = NULL;
8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, val = -1;
8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
8031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &str))
8041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; debug_strings[i]; i++)
8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(debug_strings[i], str) == 0) {
8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			val = i;
8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (val < 0 ||
8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp,
8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    wpa_debug_show_keys)) {
8151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED, "wrong debug "
8161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "level value");
8171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp
8261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property.
8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(DBusMessageIter *iter,
8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
8351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0,
8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_show_keys);
8461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys
8521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property.
8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(DBusMessageIter *iter,
8601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level,
8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_timestamp,
8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					val ? 1 : 0);
8731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list
8791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests
8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects
8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths
8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter,
8891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					DBusError *error,
8901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					void *user_data)
8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char **paths;
8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		num++;
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
90161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
9031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
9041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i++] = wpa_s->dbus_new_path;
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
9121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list
9211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
9221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
9231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods
9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
9291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter,
9301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **eap_methods;
9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t num_items = 0;
9341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eap_methods = eap_get_names_as_string_array(&num_items);
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!eap_methods) {
9381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
9391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
9431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_STRING,
9441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 eap_methods,
9451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 num_items, error);
9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (num_items)
9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(eap_methods[--num_items]);
9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(eap_methods);
9501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
954d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
955d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities
956d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
957d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to
962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS,
963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time.
964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter,
966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					         DBusError *error,
967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					         void *user_data)
968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL };
970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	size_t num_items = 0;
971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP
973d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ap";
974d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */
975d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN
976d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ibss-rsn";
977d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */
978d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P
979d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "p2p";
980d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */
981d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING
982d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "interworking";
983d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */
984d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
985d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter,
986d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      DBUS_TYPE_STRING,
987d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      capabilities,
988d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      num_items, error);
989d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
990d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
991d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var,
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char **type, DBusMessage **reply)
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) {
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Type must be a string");
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Type value type. String required");
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(var, type);
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var,
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    struct wpa_driver_scan_params *params,
10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    DBusMessage **reply)
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_ssid *ssids = params->ssids;
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t ssids_num = 0;
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ssid;
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids "
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "must be an array of arrays of bytes");
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong SSIDs value type. Array of arrays of "
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"bytes required");
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE)
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids "
10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "must be an array of arrays of bytes");
10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong SSIDs value type. Array of arrays of "
10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"bytes required");
10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY)
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ssids_num >= WPAS_MAX_SCAN_SSIDS) {
10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Too many ssids specified on scan dbus "
10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "call");
10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "Too many ssids specified. Specify "
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"at most four");
10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1056c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		if (len > MAX_SSID_LEN) {
1057c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			wpa_printf(MSG_DEBUG,
1058c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				   "wpas_dbus_handler_scan[dbus]: "
1059c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				   "SSID too long (len=%d max_len=%d)",
1060c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				   len, MAX_SSID_LEN);
1061c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
1062c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				message, "Invalid SSID: too long");
1063c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			return -1;
1064c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		}
1065c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len != 0) {
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = os_malloc(len);
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ssid == NULL) {
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_printf(MSG_DEBUG,
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   "wpas_dbus_handler_scan[dbus]: "
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   "out of memory. Cannot allocate "
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   "memory for SSID");
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				*reply = dbus_message_new_error(
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					message, DBUS_ERROR_NO_MEMORY, NULL);
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_memcpy(ssid, val, len);
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Allow zero-length SSIDs */
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = NULL;
10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid = ssid;
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid_len = len;
10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids_num++;
10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->num_ssids = ssids_num;
10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var,
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  struct wpa_driver_scan_params *params,
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  DBusMessage **reply)
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ies = NULL, *nies;
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ies_len = 0;
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must "
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "be an array of arrays of bytes");
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong IEs value type. Array of arrays of "
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"bytes required");
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE)
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must "
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "be an array of arrays of bytes");
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong IEs value type. Array required");
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY)
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len == 0) {
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_iter_next(&array_iter);
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		nies = os_realloc(ies, ies_len + len);
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (nies == NULL) {
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "out of memory. Cannot allocate memory for "
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "IE");
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ies);
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = dbus_message_new_error(
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, DBUS_ERROR_NO_MEMORY, NULL);
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies = nies;
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memcpy(ies + ies_len, val, len);
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies_len += len;
11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies = ies;
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies_len = ies_len;
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message,
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessageIter *var,
11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_driver_scan_params *params,
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessage **reply)
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int *freqs = NULL, *nfreqs;
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int freqs_num = 0;
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Channels must be an array of structs");
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Channels value type. Array of structs "
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"required");
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) {
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG,
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_handler_scan[dbus]: Channels must be an "
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "array of structs");
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Channels value type. Array of structs "
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"required");
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT)
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int freq, width;
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dbus_message_iter_get_arg_type(&sub_array_iter) !=
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Channel must by specified by struct of "
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "two UINT32s %c",
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   dbus_message_iter_get_arg_type(
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   &sub_array_iter));
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "Wrong Channel struct. Two UINT32s "
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"required");
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &freq);
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_next(&sub_array_iter) ||
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    dbus_message_iter_get_arg_type(&sub_array_iter) !=
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Channel must by specified by struct of "
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "two UINT32s");
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message,
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &width);
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs_num % FREQS_ALLOC_CHUNK == 0) {
122761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			nfreqs = os_realloc_array(
122861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				freqs, freqs_num + FREQS_ALLOC_CHUNK,
122961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				sizeof(int));
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (nfreqs == NULL)
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_free(freqs);
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			freqs = nfreqs;
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs == NULL) {
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "out of memory. can't allocate memory for "
12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "freqs");
12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = dbus_message_new_error(
12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, DBUS_ERROR_NO_MEMORY, NULL);
12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs[freqs_num] = freq;
12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs_num++;
12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
124961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int));
12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (nfreqs == NULL)
12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(freqs);
12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs = nfreqs;
12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (freqs == NULL) {
12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "out of memory. Can't allocate memory for freqs");
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = dbus_message_new_error(
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, DBUS_ERROR_NO_MEMORY, NULL);
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs[freqs_num] = 0;
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->freqs = freqs;
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1267051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpas_dbus_get_scan_allow_roam(DBusMessage *message,
1268051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 DBusMessageIter *var,
1269051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 dbus_bool_t *allow,
1270051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 DBusMessage **reply)
1271051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{
1272051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN) {
1273051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
1274051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			   "Type must be a boolean");
1275051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
1276051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			message, "Wrong Type value type. Boolean required");
1277051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		return -1;
1278051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1279051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	dbus_message_iter_get_basic(var, allow);
1280051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	return 0;
1281051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt}
1282051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1283051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface.
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     struct wpa_supplicant *wpa_s)
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, dict_iter, entry_iter, variant_iter;
12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *key = NULL, *type = NULL;
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_params params;
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t i;
1302051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	dbus_bool_t allow_roam = 1;
13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&params, 0, sizeof(params));
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &dict_iter);
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&dict_iter) ==
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			DBUS_TYPE_DICT_ENTRY) {
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&dict_iter, &entry_iter);
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&entry_iter, &key);
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&entry_iter);
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&entry_iter, &variant_iter);
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, "Type") == 0) {
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_type(message, &variant_iter,
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &type, &reply) < 0)
13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "SSIDs") == 0) {
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ssids(message, &variant_iter,
13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     &params, &reply) < 0)
13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "IEs") == 0) {
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ies(message, &variant_iter,
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   &params, &reply) < 0)
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "Channels") == 0) {
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_channels(message, &variant_iter,
13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							&params, &reply) < 0)
13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
1333051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		} else if (os_strcmp(key, "AllowRoam") == 0) {
1334051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			if (wpas_dbus_get_scan_allow_roam(message,
1335051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &variant_iter,
1336051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &allow_roam,
1337051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &reply) < 0)
1338051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt				goto out;
13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Unknown argument %s", key);
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(message, key);
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&dict_iter);
13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!type) {
13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Scan type not specified");
13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, key);
13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!os_strcmp(type, "passive")) {
13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (params.num_ssids || params.extra_ies_len) {
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "SSIDs or IEs specified for passive scan.");
13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(
13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "You can specify only Channels in "
13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"passive scan");
13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (params.freqs && params.freqs[0]) {
13657dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt			if (wpa_supplicant_trigger_scan(wpa_s, &params)) {
13667dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt				reply = wpas_dbus_error_scan_error(
13677dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt					message, "Scan request rejected");
13687dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt			}
13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
1370d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			wpa_s->scan_req = MANUAL_SCAN_REQ;
13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_supplicant_req_scan(wpa_s, 0, 0);
13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (!os_strcmp(type, "active")) {
13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!params.num_ssids) {
13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Add wildcard ssid */
13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			params.num_ssids++;
13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
137804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
137904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
138004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
13817dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt		if (wpa_supplicant_trigger_scan(wpa_s, &params)) {
13827dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt			reply = wpas_dbus_error_scan_error(
13837dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt				message, "Scan request rejected");
13847dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt		}
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Unknown scan type: %s", type);
13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message,
13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     "Wrong scan type");
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1393051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (!allow_roam)
1394051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		wpa_s->scan_res_handler = scan_only_handler;
1395051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free((u8 *) params.ssids[i].ssid);
13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free((u8 *) params.extra_ies);
14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(params.freqs);
14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1405661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/**
1406661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_handler_signal_poll - Request immediate signal properties
1407661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @message: Pointer to incoming dbus message
1408661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1409661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
1410661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt *
1411661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Handler function for "SignalPoll" method call of a network device. Requests
1412661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * that wpa_supplicant read signal properties like RSSI, noise, and link
1413661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * speed and return them.
1414661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */
1415661b4f78e48c697429dc46154a4125892c001718Dmitry ShmidtDBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
1416661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
1417661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
1418661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct wpa_signal_info si;
1419661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	DBusMessage *reply = NULL;
1420661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	DBusMessageIter iter, iter_dict, variant_iter;
1421661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	int ret;
1422661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1423661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	ret = wpa_drv_signal_poll(wpa_s, &si);
1424661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (ret) {
1425661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
1426661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					      "Failed to read signal");
1427661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	}
1428661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1429661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	reply = dbus_message_new_method_return(message);
1430661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (reply == NULL)
1431661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1432661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1433661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
1434661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1435661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
1436661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					      "a{sv}", &variant_iter))
1437661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1438661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
1439661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1440661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1441661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!wpa_dbus_dict_append_int32(&iter_dict, "rssi", si.current_signal))
1442661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1443661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
1444661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					si.current_txrate / 1000))
1445661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1446661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!wpa_dbus_dict_append_int32(&iter_dict, "noise", si.current_noise))
1447661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1448661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!wpa_dbus_dict_append_uint32(&iter_dict, "frequency", si.frequency))
1449661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1450661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1451661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (si.chanwidth != CHAN_WIDTH_UNKNOWN) {
1452661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&iter_dict, "width",
1453661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					channel_width_to_string(si.chanwidth)))
1454661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			goto nomem;
1455661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	}
1456661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1457661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (si.center_frq1 > 0 && si.center_frq2 > 0) {
1458661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
1459661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt						si.center_frq1))
1460661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			goto nomem;
1461661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
1462661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt						si.center_frq2))
1463661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			goto nomem;
1464661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	}
1465661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1466661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (si.avg_signal) {
1467661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		if (!wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
1468661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt						si.avg_signal))
1469661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			goto nomem;
1470661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	}
1471661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1472661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
1473661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1474661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!dbus_message_iter_close_container(&iter, &variant_iter))
1475661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1476661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1477661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return reply;
1478661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1479661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtnomem:
1480661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (reply)
1481661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		dbus_message_unref(reply);
1482661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
1483661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return reply;
1484661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
1485661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1486661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise.
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface.
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->disconnected = 1;
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "This interface is not connected");
15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface.
15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter;
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = NULL;
15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf;
15271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusError error;
15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_add_network(wpa_s->conf);
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_handler_add_network[dbus]: "
15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "can't add new interface.");
15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message,
15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wpa_supplicant could not add "
15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"a network on this interface.");
15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_added(wpa_s, ssid);
15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid->disabled = 1;
15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_network_defaults(ssid);
15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_error_init(&error);
15461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!set_network_properties(wpa_s, ssid, &iter, &error)) {
15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_add_network[dbus]:"
15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "control interface couldn't set network "
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "properties");
15501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_reply_new_from_error(message, &error,
15511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       DBUS_ERROR_INVALID_ARGS,
15521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       "Failed to add network");
15531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_error_free(&error);
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Construct the object path for this network. */
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_s->dbus_new_path, ssid->id);
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL) {
15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid) {
15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpas_notify_network_removed(wpa_s, ssid);
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_config_remove_network(wpa_s->conf, ssid->id);
15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1588413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate
158961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message
159061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1591413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled
159261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise.
159361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *
159461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface.
159561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */
159661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message,
159761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
159861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
1599413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) {
1600d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpas_request_connection(wpa_s);
160161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
160261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
160361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1604413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_DISABLED,
1605413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt				      "This interface is disabled");
160661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
160761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
160861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
160961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/**
16109866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * wpas_dbus_handler_reattach - Reattach to current AP
16119866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @message: Pointer to incoming dbus message
16129866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16139866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Returns: NotConnected DBus error message if not connected
16149866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * or NULL otherwise.
16159866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt *
16169866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Handler function for "Reattach" method call of network interface.
16179866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt */
16189866086a955d00e237cc8df3722e7dff75c02532Dmitry ShmidtDBusMessage * wpas_dbus_handler_reattach(DBusMessage *message,
16199866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
16209866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{
16219866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
16229866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		wpa_s->reattach = 1;
16239866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		wpas_request_connection(wpa_s);
16249866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		return NULL;
16259866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	}
16269866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16279866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
16289866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt				      "This interface is not connected");
16299866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt}
16309866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16319866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16329866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt/**
16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network
16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface.
16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *iface = NULL, *net_id = NULL;
16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
16482f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	int was_disabled;
16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
165575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL);
1656d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (iface == NULL || net_id == NULL ||
1657d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1662d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1664d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16752f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	was_disabled = ssid->disabled;
16762f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
16822f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	else if (!was_disabled && wpa_s->sched_scanning) {
16832f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to remove "
16842f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt			   "network from filters");
16852f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
16862f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_req_scan(wpa_s, 0, 0);
16872f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	}
16882f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
1689684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, id) < 0) {
1690684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		wpa_printf(MSG_ERROR,
1691684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt			   "wpas_dbus_handler_remove_network[dbus]: "
1692684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt			   "error occurred when removing network %d", id);
1693684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		reply = wpas_dbus_error_unknown_error(
1694684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt			message, "error removing the specified network on "
1695684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt			"this interface.");
1696684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		goto out;
1697684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	}
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(net_id);
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid)
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s = arg;
17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) {
17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR,
17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_handler_remove_all_networks[dbus]: "
17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "error occurred when removing network %d",
17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   ssid->id);
17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
1721d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
1722d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface.
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks(
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17372f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	if (wpa_s->sched_scanning)
17382f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
17392f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* NB: could check for failure and return an error */
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s);
17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network
17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface.
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message,
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *iface = NULL, *net_id = NULL;
17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
176875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL);
1769d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (iface == NULL || net_id == NULL ||
1770d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1775d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1777d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Finally, associate with the network */
17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_select_network(wpa_s, ssid);
17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(net_id);
17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal
18001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message
18011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
18021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure
18031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
18041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface.
18051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */
18061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message,
18071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      struct wpa_supplicant *wpa_s)
18081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
18091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL
18101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessage *reply = NULL;
18111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *op, *field, *value;
18121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *iface = NULL, *net_id = NULL;
18131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int id;
18141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_ssid *ssid;
18151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
18171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	                           DBUS_TYPE_OBJECT_PATH, &op,
18181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	                           DBUS_TYPE_STRING, &field,
18191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	                           DBUS_TYPE_STRING, &value,
18201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			           DBUS_TYPE_INVALID))
18211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpas_dbus_error_invalid_args(message, NULL);
18221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Extract the network ID and ensure the network */
18241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* is actually a child of this interface */
18251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL);
1826d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (iface == NULL || net_id == NULL ||
1827d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
18281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
18291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1832d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
18331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	id = strtoul(net_id, NULL, 10);
1834d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
18351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, net_id);
18361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
18401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (ssid == NULL) {
18411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
18421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid,
18461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      field, value) < 0)
18471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, field);
18481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	else {
18491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		/* Tell EAP to retry immediately */
18501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		eapol_sm_notify_ctrl_response(wpa_s->eapol);
18511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout:
18541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(iface);
18551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(net_id);
18561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return reply;
18571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */
18581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included");
18591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_error_unknown_error(message, "802.1X not included");
18601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */
18611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
18621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1864700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS
1865700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
18661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/**
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates)
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs.
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message,
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *blob_data;
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int blob_len;
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob = NULL;
18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &blob_name);
18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_get_blob(wpa_s->conf, blob_name)) {
18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_EXISTS,
18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array_iter);
18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len);
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = os_zalloc(sizeof(*blob));
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->data = os_malloc(blob_len);
19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob->data) {
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(blob->data, blob_data, blob_len);
19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->len = blob_len;
19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->name = os_strdup(blob_name);
19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob->name) {
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_blob(wpa_s->conf, blob);
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_added(wpa_s, blob->name);
19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (blob) {
19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->name);
19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->data);
19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob);
19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates)
19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob)
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs.
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message,
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct wpa_config_blob *blob;
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_config_get_blob(wpa_s->conf, blob_name);
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!reply) {
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      DBUS_TYPE_BYTE_AS_STRING,
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      &array_iter)) {
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE,
19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  &(blob->data), blob->len)) {
19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&iter, &array_iter)) {
19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob
20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error
20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs.
20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message,
20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_blob(wpa_s->conf, blob_name)) {
20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_removed(wpa_s, blob_name);
20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2030700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */
2031700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
2032700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache
20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface.
20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message,
20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t age;
20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age,
20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (age == 0)
20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush(wpa_s);
20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush_by_age(wpa_s, age);
20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
205804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
205904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
206004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface
206104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message
206204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
206304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL
206404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
206504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface.
206604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
206704949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message,
206804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					 struct wpa_supplicant *wpa_s)
206904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
207004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *reply = NULL;
207104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	enum wpa_states state = wpa_s->wpa_state;
207204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *arg;
207304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
207404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg,
207504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      DBUS_TYPE_INVALID);
207604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
207704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (arg != NULL && os_strlen(arg) > 0) {
207804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		char *tmp;
207904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		tmp = os_strdup(arg);
208004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (tmp == NULL) {
208104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			reply = dbus_message_new_error(message,
208204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						       DBUS_ERROR_NO_MEMORY,
208304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						       NULL);
208404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else {
208504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			os_free(wpa_s->conf->autoscan);
208604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			wpa_s->conf->autoscan = tmp;
208704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
208804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				autoscan_init(wpa_s, 1);
208904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			else if (state == WPA_SCANNING)
209004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				wpa_supplicant_reinit_autoscan(wpa_s);
209104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		}
209204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else if (arg != NULL && os_strlen(arg) == 0) {
209304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->conf->autoscan);
209404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->conf->autoscan = NULL;
209504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
209604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else
209704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		reply = dbus_message_new_error(message,
209804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       DBUS_ERROR_INVALID_ARGS,
209904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       NULL);
210004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
210104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return reply;
210204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
210304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
210404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
210504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
21068da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/*
21078da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logoff - IEEE 802.1X EAPOL state machine logoff
21088da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message
21098da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
21108da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL
21118da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt *
21128da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogoff" method call of network interface.
21138da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */
21148da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logoff(DBusMessage *message,
21158da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
21168da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{
21178da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	eapol_sm_notify_logoff(wpa_s->eapol, TRUE);
21188da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	return NULL;
21198da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt}
21208da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
21218da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
21228da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/*
21238da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logon - IEEE 802.1X EAPOL state machine logon
21248da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message
21258da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
21268da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL
21278da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt *
21288da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogin" method call of network interface.
21298da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */
21308da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message,
21318da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
21328da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{
21338da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	eapol_sm_notify_logoff(wpa_s->eapol, FALSE);
21348da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	return NULL;
21358da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt}
21368da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
21378da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
2138e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef CONFIG_TDLS
2139e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21407d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidtstatic int get_peer_hwaddr_helper(DBusMessage *message, const char *func_name,
21417d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt				  u8 *peer_address, DBusMessage **error)
2142e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2143e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	const char *peer_string;
2144e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21457d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	*error = NULL;
21467d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt
2147e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
2148e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				   DBUS_TYPE_STRING, &peer_string,
21497d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt				   DBUS_TYPE_INVALID)) {
21507d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		*error = wpas_dbus_error_invalid_args(message, NULL);
21517d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		return -1;
21527d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	}
2153e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2154e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (hwaddr_aton(peer_string, peer_address)) {
2155e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s: invalid address '%s'",
2156e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			   func_name, peer_string);
21577d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		*error = wpas_dbus_error_invalid_args(
2158e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "Invalid hardware address format");
21597d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		return -1;
2160e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2161e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21627d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	return 0;
2163e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2164e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2165e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2166e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2167e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_discover - Discover TDLS peer
2168e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2169e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2170e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2172e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSDiscover" method call of network interface.
2173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message,
2175e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					      struct wpa_supplicant *wpa_s)
2176e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2177e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2178e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2179e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2180e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21817d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2182e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2183e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2184e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_DISCOVER " MACSTR, MAC2STR(peer));
2185e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2186e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2187e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer);
2188e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2189e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer);
2190e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2191e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2192e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2193e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS discovery");
2194e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2195e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2196e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2197e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2198e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2199e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2201e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_setup - Setup TDLS session
2202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2205e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2206e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSSetup" method call of network interface.
2207e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2208e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message,
2209e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					   struct wpa_supplicant *wpa_s)
2210e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2211e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2212e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2213e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2214e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22157d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2216e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2217e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2218e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_SETUP " MACSTR, MAC2STR(peer));
2219e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2220e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_tdls_remove(wpa_s->wpa, peer);
2221e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2222e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_start(wpa_s->wpa, peer);
2223e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2224e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
2225e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2226e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2227e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2228e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS setup");
2229e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2230e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2231e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2232e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2233e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2234e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2235e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2236e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_status - Return TDLS session status
2237e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2238e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2239e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: A string representing the state of the link to this TDLS peer
2240e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2241e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSStatus" method call of network interface.
2242e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2243e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_status(DBusMessage *message,
2244e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					    struct wpa_supplicant *wpa_s)
2245e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2246e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2247e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *reply;
2248e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	const char *tdls_status;
2249e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22507d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &reply) < 0)
2251e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return reply;
2252e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2253e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_STATUS " MACSTR, MAC2STR(peer));
2254e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2255e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	tdls_status = wpa_tdls_get_link_status(wpa_s->wpa, peer);
2256e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2257e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	reply = dbus_message_new_method_return(message);
2258e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	dbus_message_append_args(reply, DBUS_TYPE_STRING,
2259e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				 &tdls_status, DBUS_TYPE_INVALID);
2260e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return reply;
2261e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2262e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2263e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2264e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2265e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_teardown - Teardown TDLS session
2266e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2267e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2268e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2269e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2270e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSTeardown" method call of network interface.
2271e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2272e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message,
2273e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					      struct wpa_supplicant *wpa_s)
2274e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2275e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2276e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2277e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2278e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22797d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2280e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2281e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2282e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_TEARDOWN " MACSTR, MAC2STR(peer));
2283e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2284e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2285e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_teardown_link(
2286e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			wpa_s->wpa, peer,
2287e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
2288e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2289e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer);
2290e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2291e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2292e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2293e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS teardown");
2294e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2295e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2296e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2297e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2298e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2299e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* CONFIG_TDLS */
2300e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2301e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
230301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
230401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @message: Pointer to incoming dbus message
230501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
230601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
230701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
230801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Sets the PKCS #11 engine and module path.
230901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
231001904cfafd75a70b9f29c0220b90bdef45595491Dmitry ShmidtDBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path(
231101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
231201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
231301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	DBusMessageIter iter;
231401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *value = NULL;
231501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *pkcs11_engine_path = NULL;
231601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *pkcs11_module_path = NULL;
231701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
231801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_init(message, &iter);
231901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &value);
232001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (value == NULL) {
232101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
232201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS,
232301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Invalid pkcs11_engine_path argument");
232401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
232501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	/* Empty path defaults to NULL */
232601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (os_strlen(value))
232701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = value;
232801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
232901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_next(&iter);
233001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &value);
233101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (value == NULL) {
233201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		os_free(pkcs11_engine_path);
233301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
233401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS,
233501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Invalid pkcs11_module_path argument");
233601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
233701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	/* Empty path defaults to NULL */
233801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (os_strlen(value))
233901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = value;
234001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
234101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path,
234201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						   pkcs11_module_path))
234301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
234401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_FAILED,
234501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Reinit of the EAPOL state machine with the new PKCS "
234601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"#11 engine and module path failed.");
234701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
234801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	wpa_dbus_mark_property_changed(
234901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		wpa_s->global->dbus, wpa_s->dbus_new_path,
235001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath");
235101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	wpa_dbus_mark_property_changed(
235201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		wpa_s->global->dbus, wpa_s->dbus_new_path,
235301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath");
235401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
235501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return NULL;
235601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
235701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
235801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
235901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities
23611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
23621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
23631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
23641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface.
23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
23681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(DBusMessageIter *iter,
23691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					  DBusError *error, void *user_data)
23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_capa capa;
23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
23741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array,
23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		variant_iter;
23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *scans[] = { "active", "passive", "ssid" };
23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{sv}", &variant_iter))
23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_drv_get_capa(wpa_s, &capa);
23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** pairwise cipher */
23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {"ccmp", "tkip", "none"};
23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Pairwise", args,
239268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise",
23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
23988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2401fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) {
2402fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
2403fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt				    &iter_array, "ccmp-256"))
2404fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt				goto nomem;
2405fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		}
2406fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
2407fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) {
2408fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
2409fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt				    &iter_array, "gcmp-256"))
2410fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt				goto nomem;
2411fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		}
2412fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) {
24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "ccmp"))
24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
241961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) {
242061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
242161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				    &iter_array, "gcmp"))
242261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				goto nomem;
242361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		}
242461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) {
24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "tkip"))
24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) {
24328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "none"))
24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** group cipher */
24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"ccmp", "tkip", "wep104", "wep40"
24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Group", args,
245168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group",
24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2460fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) {
2461fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
2462fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt				    &iter_array, "ccmp-256"))
2463fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt				goto nomem;
2464fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		}
2465fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
2466fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) {
2467fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
2468fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt				    &iter_array, "gcmp-256"))
2469fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt				goto nomem;
2470fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		}
2471fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) {
24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "ccmp"))
24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
247861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) {
247961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
248061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				    &iter_array, "gcmp"))
248161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				goto nomem;
248261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		}
248361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) {
24858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "tkip"))
24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) {
24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wep104"))
24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) {
24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wep40"))
24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** key management */
25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wpa-psk", "wpa-eap", "ieee8021x", "wpa-none",
25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wps",
25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"none"
25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "KeyMgmt", args,
252068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt",
25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "none"))
25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
25348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "ieee8021x"))
25358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) {
25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-eap"))
25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT)
25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (!wpa_dbus_dict_string_array_add_element(
25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    &iter_array, "wpa-ft-eap"))
25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto nomem;
25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-eap-sha256"))
25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) {
25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-psk"))
25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK)
25638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (!wpa_dbus_dict_string_array_add_element(
25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    &iter_array, "wpa-ft-psk"))
25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto nomem;
25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-psk-sha256"))
25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) {
25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-none"))
25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "wps"))
25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** WPA protocol */
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "rsn", "wpa" };
25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Protocol", args,
260068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol",
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) {
26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "rsn"))
26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) {
26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa"))
26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** auth alg */
26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "open", "shared", "leap" };
26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "AuthAlg", args,
263568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg",
26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.auth & (WPA_DRIVER_AUTH_OPEN)) {
26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "open"))
26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.auth & (WPA_DRIVER_AUTH_SHARED)) {
26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "shared"))
26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.auth & (WPA_DRIVER_AUTH_LEAP)) {
26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "leap"))
26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Scan */
26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans,
267168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt					       ARRAY_SIZE(scans)))
26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
26738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Modes */
267575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes",
267675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_entry,
267775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_val,
267875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_array))
26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
268175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_string_array_add_element(
268275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			    &iter_array, "infrastructure"))
268375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
268475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
268575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_string_array_add_element(
268675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			    &iter_array, "ad-hoc"))
268775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
268875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
268975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (res >= 0) {
269075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (capa.flags & (WPA_DRIVER_FLAGS_AP)) {
269175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			if (!wpa_dbus_dict_string_array_add_element(
269275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				    &iter_array, "ap"))
269375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				goto nomem;
269475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		}
269575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
269675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (capa.flags & (WPA_DRIVER_FLAGS_P2P_CAPABLE)) {
269775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			if (!wpa_dbus_dict_string_array_add_element(
269875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				    &iter_array, "p2p"))
269975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				goto nomem;
270075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		}
270175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	}
270275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
270375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_end_string_array(&iter_dict,
270475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_entry,
270575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_val,
270675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_array))
270775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
270875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	/***** Modes end */
270975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
27101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res >= 0) {
27111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_int32_t max_scan_ssid = capa.max_scan_ssids;
27121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
27131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID",
27141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						max_scan_ssid))
27151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto nomem;
27161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
27171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
27201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter))
27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
27261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
27271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state
27331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property.
27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_state(DBusMessageIter *iter, DBusError *error,
27411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   void *user_data)
27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str_state;
27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *state_ls, *tmp;
27461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str_state = wpa_supplicant_state_txt(wpa_s->wpa_state);
27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* make state string lowercase to fit new DBus API convention
27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	state_ls = tmp = os_strdup(str_state);
27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!tmp) {
27541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
27551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*tmp) {
27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*tmp = tolower(*tmp);
27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tmp++;
27608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
27631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   &state_ls, error);
27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(state_ls);
27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state
27731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property.
27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(DBusMessageIter *iter, DBusError *error,
27811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                                      void *user_data)
27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE;
27851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
27861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
27871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&scanning, error);
27888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode
27931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property.
27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(DBusMessageIter *iter, DBusError *error,
28011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
28028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan = wpa_s->conf->ap_scan;
28051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
28061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
28071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ap_scan, error);
28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode
28131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property.
28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(DBusMessageIter *iter, DBusError *error,
28211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan;
28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
28271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &ap_scan))
28281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) {
28311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
28321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "ap_scan must be 0, 1, or 2");
28331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2840c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast
2841c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2842c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2843c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2844c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2845c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2846c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2847c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property.
2848c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2849c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(DBusMessageIter *iter,
2850c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					 DBusError *error,
2851c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					 void *user_data)
2852c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2853c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2854c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE;
2855c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2856c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
2857c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&fast_reauth, error);
2858c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2859c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2860c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2861c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
2862c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast
2863c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2864c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2865c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2866c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2867c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2868c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2869c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property.
2870c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2871c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter,
2872c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				     DBusError *error,
2873c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				     void *user_data)
2874c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2875c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2876c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth;
2877c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2878c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
2879c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					      &fast_reauth))
2880c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		return FALSE;
2881c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2882c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	wpa_s->conf->fast_reauth = fast_reauth;
2883c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return TRUE;
2884c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2885c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2886c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2887c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
288804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect
288904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
289004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
289104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
289204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
289304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
289404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property.  The reason is negative if it is
289504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated.
289604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
289704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter,
289804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       DBusError *error,
289904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       void *user_data)
290004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
290104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
290204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t reason = wpa_s->disconnect_reason;
290304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
290404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&reason, error);
290504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
290604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
290704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
290804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age
29101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property.
29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter,
29181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    DBusError *error,
29191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    void *user_data)
29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age;
29231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
29241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
29251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_age, error);
29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age
29311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property.
29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(DBusMessageIter *iter,
29391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    DBusError *error,
29401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    void *user_data)
29418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age;
29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
29461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_age))
29471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) {
29501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
29511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireAge must be >= 10");
29521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count
29601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property.
29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(DBusMessageIter *iter,
29681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      DBusError *error,
29691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      void *user_data)
29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
297261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count;
29731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
29741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
29751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_count, error);
29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count
29811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property.
29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(DBusMessageIter *iter,
29891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      DBusError *error,
29901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      void *user_data)
29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_count;
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
29961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_count))
29971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) {
30001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
30011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireCount must be > 0");
30021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code
30101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property.
30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_country(DBusMessageIter *iter, DBusError *error,
30181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char country[3];
30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *str = country;
30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[0] = wpa_s->conf->country[0];
30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[1] = wpa_s->conf->country[1];
30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[2] = '\0';
30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
30291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code
30351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property.
30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_country(DBusMessageIter *iter, DBusError *error,
30431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *country;
30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
30491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &country))
30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!country[0] || !country[1]) {
30531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
30541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "invalid country code");
30551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) {
30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "Failed to set country");
30601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
30611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "failed to set country code");
30621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[0] = country[0];
30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[1] = country[1];
30671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
307204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval
307304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
307404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
307504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
307604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
307704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
307804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property.
307904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
308004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(DBusMessageIter *iter,
308104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   DBusError *error,
308204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   void *user_data)
308304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
308404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
308504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval = wpa_s->scan_interval;
308604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
308704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
308804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&scan_interval, error);
308904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
309004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
309104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
309204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
309304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval
309404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
309504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
309604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
309704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
309804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
309904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property.
310004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
310104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(DBusMessageIter *iter,
310204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   DBusError *error,
310304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					   void *user_data)
310404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
310504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
310604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval;
310704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
310804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32,
310904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      &scan_interval))
311004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
311104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
311204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) {
311304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
311404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     "scan_interval must be >= 0");
311504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
311604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
311704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
311804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
311904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
312004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
312104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name
31231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property.
31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error,
31311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				    void *user_data)
31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname = wpa_s->ifname;
31351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
31361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
31371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ifname, error);
31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name
31431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property.
31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error,
31511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				    void *user_data)
31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *driver;
31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) {
31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_getter_driver[dbus]: "
31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpa_s has no driver set");
31591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set",
31601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       __func__);
31611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	driver = wpa_s->driver->name;
31651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
31661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&driver, error);
31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path
31721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property.
31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter,
31801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error,
31811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 void *user_data)
31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf;
31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_bss)
31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_bss->id);
31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
31941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bss_obj_path, error);
31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path
32001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property.
32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
32071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter,
32081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
32091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     void *user_data)
32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf;
32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid)
32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_ssid->id);
32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
32221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&net_obj_path, error);
32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type
32281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property.
32348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
32351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(DBusMessageIter *iter,
32361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       DBusError *error,
32371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       void *user_data)
32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *eap_mode;
32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *auth_mode;
32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX];
32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->wpa_state != WPA_COMPLETED) {
32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = "INACTIVE";
32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X ||
32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eap_mode = wpa_supplicant_get_eap_mode(wpa_s);
32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX,
32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "EAP-%s", eap_mode);
32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = eap_mode_buf;
32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt,
32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_s->current_ssid->proto);
32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
32591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&auth_mode, error);
32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name
32651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property.
32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
32721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter,
32731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   DBusError *error,
32741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   void *user_data)
32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *bridge_ifname = wpa_s->bridge_ifname;
32781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
32791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bridge_ifname, error);
32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects
32851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property.
32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
32921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error,
32931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  void *user_data)
32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *bss;
32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0;
32991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
330161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(wpa_s->num_bss, sizeof(char *));
33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
33031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
33041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through scan results and append each result's object path */
33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) {
33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
33111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
33121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this BSS. */
33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, bss->id);
33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
33221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
33231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, wpa_s->num_bss,
33241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
33298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
33301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects
33361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
33371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
33381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
33391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property.
33428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
33431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error,
33441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
33458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
33501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->conf == NULL) {
33531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: An error occurred getting "
33541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			   "networks list.", __func__);
33551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED, "%s: an error "
33561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "occurred getting the networks list", __func__);
33571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
336175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (!network_is_persistent_group(ssid))
336275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			num++;
33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
336461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
33658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
33661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory");
33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through configured networks and append object path of each */
33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
337275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (network_is_persistent_group(ssid))
337375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			continue;
33748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
33758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
33761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory");
33778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
33788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this network. */
33818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
33828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
33838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, ssid->id);
33848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
33871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
33881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
33898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
33918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
33928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
33938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
33941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
33958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
339901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path
340001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
340101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure
340201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data
340301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 engine path
340401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
340501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11EnginePath" property.
340601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
340701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_engine_path(DBusMessageIter *iter,
340801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						DBusError *error,
340901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						void *user_data)
341001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
341101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
341201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	const char *pkcs11_engine_path;
341301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
341401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpa_s->conf == NULL) {
341501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		wpa_printf(MSG_ERROR,
341601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			   "wpas_dbus_getter_pkcs11_engine_path[dbus]: An "
341701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			   "error occurred getting the PKCS #11 engine path.");
341801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		dbus_set_error_const(
341901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			error, DBUS_ERROR_FAILED,
342001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"An error occured getting the PKCS #11 engine path.");
342101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return FALSE;
342201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
342301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
342401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpa_s->conf->pkcs11_engine_path == NULL)
342501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = "";
342601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	else
342701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path;
342801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
342901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						&pkcs11_engine_path, error);
343001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
343101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
343201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
343301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
343401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path
343501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
343601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure
343701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data
343801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 module path
343901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
344001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11ModulePath" property.
344101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
344201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_module_path(DBusMessageIter *iter,
344301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						DBusError *error,
344401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						void *user_data)
344501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
344601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
344701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	const char *pkcs11_module_path;
344801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
344901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpa_s->conf == NULL) {
345001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		wpa_printf(MSG_ERROR,
345101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			   "wpas_dbus_getter_pkcs11_module_path[dbus]: An "
345201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			   "error occurred getting the PKCS #11 module path.");
345301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		dbus_set_error_const(
345401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			error, DBUS_ERROR_FAILED,
345501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"An error occured getting the PKCS #11 module path.");
345601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return FALSE;
345701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
345801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
345901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpa_s->conf->pkcs11_module_path == NULL)
346001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = "";
346101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	else
346201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = wpa_s->conf->pkcs11_module_path;
346301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
346401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						&pkcs11_module_path, error);
346501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
346601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
346701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
346801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
34698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface
34701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property.
34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
34771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error,
34781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   void *user_data)
34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
34811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter;
34828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob;
34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{say}", &variant_iter) ||
34868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "{say}", &dict_iter)) {
34881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
34891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_s->conf->blobs;
34938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (blob) {
34948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_open_container(&dict_iter,
34958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_DICT_ENTRY,
34968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      NULL, &entry_iter) ||
34978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_basic(&entry_iter,
34988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    DBUS_TYPE_STRING,
34998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &(blob->name)) ||
35008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_open_container(&entry_iter,
35018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_ARRAY,
35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_BYTE_AS_STRING,
35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &array_iter) ||
35048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_fixed_array(&array_iter,
35058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  DBUS_TYPE_BYTE,
35068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  &(blob->data),
35078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  blob->len) ||
35088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&entry_iter,
35098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &array_iter) ||
35108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&dict_iter,
35118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &entry_iter)) {
35121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
35131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
35141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return FALSE;
35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		blob = blob->next;
35188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) ||
35211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
35221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
35231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
35271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
35281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
35291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
35301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args,
35311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       DBusError *error, const char *func_name)
35321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
35331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id);
35341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
35351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res) {
35361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found",
35371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		           func_name, args->id);
35381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
35391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: BSS %d not found",
35401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       func_name, args->id);
35411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
35421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
35431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS
35491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property.
35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
35561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(DBusMessageIter *iter, DBusError *error,
35571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       void *user_data)
35588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
35601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
35631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
35641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
35671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->bssid, ETH_ALEN,
35681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
35698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS
35741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property.
35808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
35811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(DBusMessageIter *iter, DBusError *error,
35821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
35851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
35881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
35891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
35921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->ssid, res->ssid_len,
35931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS
35991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
36001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
36011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
36021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property.
36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
36061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(DBusMessageIter *iter,
36071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					 DBusError *error, void *user_data)
36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
36101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t privacy;
36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
36141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
36151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE;
36181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
36191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&privacy, error);
36208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
36248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS
36251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
36261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
36271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
36281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
36308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property.
36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
36321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(DBusMessageIter *iter, DBusError *error,
36331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      void *user_data)
36348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
36361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *mode;
36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
36401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
36411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
364276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	if (bss_is_dmg(res)) {
364376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		switch (res->caps & IEEE80211_CAP_DMG_MASK) {
364476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_PBSS:
364576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_IBSS:
364676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "ad-hoc";
364776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			break;
364876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_AP:
364976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "infrastructure";
365076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			break;
365176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		}
365276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	} else {
365376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		if (res->caps & IEEE80211_CAP_IBSS)
365476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "ad-hoc";
365576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		else
365676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "infrastructure";
365776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	}
36588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
36601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&mode, error);
36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS
36661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
36671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
36681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
36691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
36708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property.
36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
36731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(DBusMessageIter *iter,
36741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					DBusError *error, void *user_data)
36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
36771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3678c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	s16 level;
36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
36811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
36821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
36838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3684c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	level = (s16) res->level;
36851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16,
3686c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&level, error);
36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
36918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS
36921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
36931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
36941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
36951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property.
36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
36991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(DBusMessageIter *iter,
37001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   DBusError *error, void *user_data)
37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3704c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	u16 freq;
37058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3710c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	freq = (u16) res->freq;
37111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16,
3712c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&freq, error);
37138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b)
37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return (*(u8 *) b - *(u8 *) a);
37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS
37241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
37251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
37261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
37271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
37288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property.
37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
37311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(DBusMessageIter *iter,
37321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       DBusError *error, void *user_data)
37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
37368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ie_rates = NULL;
37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 *real_rates;
37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int rates_num, i;
37391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	rates_num = wpa_bss_get_bit_rates(res, &ie_rates);
37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (rates_num < 0)
37471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	qsort(ie_rates, rates_num, 1, cmp_u8s_desc);
37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	real_rates = os_malloc(sizeof(u32) * rates_num);
37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!real_rates) {
37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(ie_rates);
37541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
37551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < rates_num; i++)
37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		real_rates[i] = ie_rates[i] * 500000;
37608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32,
37621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 real_rates, rates_num,
37631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
37648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ie_rates);
37668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(real_rates);
37671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(DBusMessageIter *iter,
37721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   struct wpa_ie_data *ie_data,
37731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   DBusError *error)
37748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *group;
3777fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	const char *pairwise[5]; /* max 5 pairwise ciphers is supported */
37788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *key_mgmt[7]; /* max 7 key managements may be supported */
37798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
37808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
37828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{sv}", &variant_iter))
37838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
37848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
37868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
37878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* KeyMgmt */
37898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
37908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK)
37918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk";
37928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK)
37938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-psk";
37948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256)
37958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk-sha256";
37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X)
37978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap";
37988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
37998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-eap";
38008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)
38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-sha256";
38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE)
38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-none";
38048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt",
38068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       key_mgmt, n))
38078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Group */
38108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch (ie_data->group_cipher) {
38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP40:
38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep40";
38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_TKIP:
38158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "tkip";
38168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
38178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_CCMP:
38188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "ccmp";
38198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
382061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	case WPA_CIPHER_GCMP:
382161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		group = "gcmp";
382261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		break;
38238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP104:
38248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep104";
38258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
3826fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	case WPA_CIPHER_CCMP_256:
3827fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		group = "ccmp-256";
3828fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		break;
3829fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	case WPA_CIPHER_GCMP_256:
3830fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		group = "gcmp-256";
3831fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		break;
38328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
38338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "";
38348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
38358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
38368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group))
38388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
38398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Pairwise */
38418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
38428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP)
38438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "tkip";
38448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP)
38458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "ccmp";
384661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP)
384761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pairwise[n++] = "gcmp";
3848fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP_256)
3849fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		pairwise[n++] = "ccmp-256";
3850fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP_256)
3851fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		pairwise[n++] = "gcmp-256";
38528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise",
38548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       pairwise, n))
38558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
38568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Management group (RSN only) */
38588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->proto == WPA_PROTO_RSN) {
38598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (ie_data->mgmt_group_cipher) {
38608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
38618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case WPA_CIPHER_AES_128_CMAC:
38628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "aes128cmac";
38638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
38648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
38658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
38668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "";
38678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
38688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
38698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup",
38718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 group))
38728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
38738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
38748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
38768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
38771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter))
38788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
38798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
38818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
38831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
38841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
38858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
38898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS
38901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
38911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
38921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
38931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
38948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
38958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property.
38968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
38971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(DBusMessageIter *iter, DBusError *error,
38981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
38998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
39011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
39028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
39038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
39048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
39061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
39071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
39088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
39108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE);
39118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie) {
39121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
39131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_FAILED,
39141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "failed to parse WPA IE");
39151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return FALSE;
39161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		}
39178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error);
39208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
39248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS
39251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
39261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
39271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
39281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
39298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
39308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property.
39318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
39321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(DBusMessageIter *iter, DBusError *error,
39331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
39348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
39361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
39378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
39388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
39398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
39411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
39421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
39438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
39458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_ie(res, WLAN_EID_RSN);
39468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie) {
39471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
39481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_FAILED,
39491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "failed to parse RSN IE");
39501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return FALSE;
39511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		}
39528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error);
39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS
3960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
3961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
3962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
3963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
3964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
3965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property.
3966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
3967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(DBusMessageIter *iter, DBusError *error,
3968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt				     void *user_data)
3969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
3970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct bss_handler_args *args = user_data;
3971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpa_bss *res;
3972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
3973d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpabuf *wps_ie;
3974d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
3975d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
3976d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *type = "";
3977d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3978d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	res = get_bss_helper(args, error, __func__);
3979d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!res)
3980d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return FALSE;
3981d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3982d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
3983d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					      "a{sv}", &variant_iter))
3984d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3985d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3986d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
3987d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
3988d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3989d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
3990d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE);
3991d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (wps_ie) {
3992d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		if (wps_is_selected_pbc_registrar(wps_ie))
3993d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pbc";
3994d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		else if (wps_is_selected_pin_registrar(wps_ie))
3995d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pin";
3996d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	}
3997d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
3998d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
3999d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!wpa_dbus_dict_append_string(&iter_dict, "Type", type))
4000d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
4001d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4002d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
4003d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
4004d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!dbus_message_iter_close_container(iter, &variant_iter))
4005d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
4006d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4007d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return TRUE;
4008d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4009d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem:
4010d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
4011d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return FALSE;
4012d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
4013d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4014d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4015d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
40168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS
40171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
40181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
40191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
40201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
40218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
40228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property.
40238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
40241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error,
40251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
40268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
40271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
40281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
40298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
40311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
40321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
40338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
40351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res + 1, res->ie_len,
40361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
40378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
40388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
4041661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen
4042661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
4043661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @error: Location to store error on failure
4044661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @user_data: Function specific data
4045661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
4046661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt *
4047661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Getter for BSS age
4048661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */
4049661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_age(DBusMessageIter *iter, DBusError *error,
4050661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt				     void *user_data)
4051661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
4052661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct bss_handler_args *args = user_data;
4053661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct wpa_bss *res;
4054661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct os_reltime now, diff = { 0, 0 };
4055661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	u32 age;
4056661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4057661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	res = get_bss_helper(args, error, __func__);
4058661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!res)
4059661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		return FALSE;
4060661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4061661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	os_get_reltime(&now);
4062661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	os_reltime_sub(&now, &res->last_update, &diff);
4063661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	age = diff.sec > 0 ? diff.sec : 0;
4064661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age,
4065661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt						error);
4066661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
4067661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4068661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4069661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/**
40708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled
40711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
40721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
40731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
40741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
40758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
40768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network.
40778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
40781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error,
40791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
40808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
40811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
40828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE;
40831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
40841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
40851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&enabled, error);
40868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
40878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
40908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled
40911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
40921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
40931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
40941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
40958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
40968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network.
40978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
40981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(DBusMessageIter *iter, DBusError *error,
40991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     void *user_data)
41008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
41011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
41028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
41038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
41048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enable;
41058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
41071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &enable))
41081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
41098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = net->wpa_s;
41118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = net->ssid;
41128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (enable)
41148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_enable_network(wpa_s, ssid);
41158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
41168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_disable_network(wpa_s, ssid);
41178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
41198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
41208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
41238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network
41241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
41251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
41261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
41271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
41288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
41298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network.
41308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
41311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(DBusMessageIter *iter,
41321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						DBusError *error,
41331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						void *user_data)
41348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
41351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
41361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter, dict_iter;
41378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **iterator;
41388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **props = wpa_config_get_all(net->ssid, 1);
41391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
41408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!props) {
41421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
41431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
41448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
41458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}",
41471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &variant_iter) ||
41488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) {
41491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
41508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
41518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
41528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
41548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
41558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&dict_iter, *iterator,
41568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 *(iterator + 1))) {
41571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
41581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
41598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
41608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
41618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator += 2;
41628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
41638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) ||
41661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
41671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
41688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
41698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
41708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = TRUE;
41721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
41738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
41748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
41758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
41768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(*iterator);
41778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator++;
41788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
41798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(props);
41801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
41818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
41828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
41858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network
41861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
41871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
41881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
41891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
41908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
41918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network.
41928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
41931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(DBusMessageIter *iter,
41941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						DBusError *error,
41951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						void *user_data)
41968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
41971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
41988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = net->ssid;
41991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter;
42008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
42021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return set_network_properties(net->wpa_s, ssid, &variant_iter, error);
42038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
420404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
420504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
420604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP
420704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
420804949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq(
420904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
421004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
421104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
421204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *name;
421304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
421404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer != NULL) {
421504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (os_strcmp(dbus_message_get_sender(message),
421604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      wpa_s->preq_notify_peer) == 0)
421704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
421804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
421904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
422004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE,
422104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Another application is already subscribed");
422204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
422304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
422404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	name = os_strdup(dbus_message_get_sender(message));
422504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!name)
422604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
422704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      "out of memory");
422804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
422904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = name;
423004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
423104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Subscribe to clean up if application closes socket */
423204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_subscribe_noc(priv);
423304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
423404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/*
423504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * Double-check it's still alive to make sure that we didn't
423604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * miss the NameOwnerChanged signal, e.g. while strdup'ing.
423704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 */
423804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_bus_name_has_owner(priv->con, name, NULL)) {
423904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		/*
424004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Application no longer exists, clean up.
424104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * The return value is irrelevant now.
424204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 *
424304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Need to check if the NameOwnerChanged handling
424404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * already cleaned up because we have processed
424504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * DBus messages while checking if the name still
424604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * has an owner.
424704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 */
424804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (!wpa_s->preq_notify_peer)
424904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
425004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->preq_notify_peer);
425104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->preq_notify_peer = NULL;
425204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpas_dbus_unsubscribe_noc(priv);
425304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
425404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
425504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
425604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
425704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
425804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
425904949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq(
426004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
426104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
426204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
426304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
426404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_s->preq_notify_peer)
426504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
426604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_NO_SUBSCRIPTION,
426704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Not subscribed");
426804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
426904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_strcmp(wpa_s->preq_notify_peer,
427004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		      dbus_message_get_sender(message)))
427104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
427204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM,
427304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Can't unsubscribe others");
427404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
427504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_free(wpa_s->preq_notify_peer);
427604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = NULL;
427704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_unsubscribe_noc(priv);
427804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
427904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
428004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
428104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
428204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s,
428304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *addr, const u8 *dst, const u8 *bssid,
428404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *ie, size_t ie_len, u32 ssi_signal)
428504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
428604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *msg;
428704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter iter, dict_iter;
428804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
428904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
429004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Do nothing if the control interface is not turned on */
429104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (priv == NULL)
429204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
429304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
429404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer == NULL)
429504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
429604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
429704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
429804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      WPAS_DBUS_NEW_IFACE_INTERFACE,
429904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      "ProbeRequest");
430004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (msg == NULL)
430104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
430204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
430304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_set_destination(msg, wpa_s->preq_notify_peer);
430404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
430504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_iter_init_append(msg, &iter);
430604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
430704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
430804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
430904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr",
431004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						     (const char *) addr,
431104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						     ETH_ALEN))
431204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
431304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst",
431404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    (const char *) dst,
431504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    ETH_ALEN))
431604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
431704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid",
431804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						      (const char *) bssid,
431904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						      ETH_ALEN))
432004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
432104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies",
432204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							     (const char *) ie,
432304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							     ie_len))
432404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
432504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal",
432604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						      ssi_signal))
432704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
432804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_dbus_dict_close_write(&iter, &dict_iter))
432904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
433004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
433104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_connection_send(priv->con, msg, NULL);
433204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	goto out;
433304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail:
433404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
433504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout:
433604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_unref(msg);
433704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
433804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
433904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */
4340