dbus_new_handlers.c revision b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36e
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant / dbus-based control interface
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009-2010, Witold Sowa <witold.sowa@gmail.com>
5807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt * Copyright (c) 2009-2015, Jouni Malinen <j@w1.fi>
68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * This software may be distributed under the terms of the BSD license.
804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * See README for more details.
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_peer/eap_methods.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eapol_supp/eapol_supp_sm.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rsn_supp/wpa.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../config.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wpa_supplicant_i.h"
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../driver_i.h"
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../notify.h"
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../bss.h"
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../scan.h"
2404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "../autoscan.h"
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_helpers.h"
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new.h"
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_handlers.h"
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_dict_helpers.h"
2904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "dbus_common_i.h"
30661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt#include "drivers/driver.h"
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic const char * const debug_strings[] = {
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt * wpas_dbus_error_unknown_error - Return a new UnknownError error message
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message,
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    const char *arg)
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR,
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      arg);
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message)
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return dbus_message_new_error(
636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		message, WPAS_DBUS_ERROR_IFACE_UNKNOWN,
646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		"wpa_supplicant knows nothing about this interface.");
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message)
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return dbus_message_new_error(
786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN,
796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		"There is no such a network in this interface.");
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message,
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const char *arg)
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	reply = dbus_message_new_error(
966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		message, WPAS_DBUS_ERROR_INVALID_ARGS,
976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		"Did not receive correct message arguments.");
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (arg != NULL)
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg,
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 DBUS_TYPE_INVALID);
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1067dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt/**
1077dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * wpas_dbus_error_scan_error - Return a new ScanError error message
1087dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
1097dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @error: Optional string to be used as the error message
1107dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Returns: a dbus error message
1117dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt *
1127dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Convenience function to create and return a scan error
1137dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt */
1146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic DBusMessage * wpas_dbus_error_scan_error(DBusMessage *message,
1156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						const char *error)
1167dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt{
1176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return dbus_message_new_error(message,
1186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				      WPAS_DBUS_ERROR_IFACE_SCAN_ERROR,
1196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				      error);
1206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt}
1217dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1227dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1236c0da2bb83f6915d8260912362692d1a742e057bDmitry ShmidtDBusMessage * wpas_dbus_error_no_memory(DBusMessage *message)
1246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{
1256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	wpa_printf(MSG_DEBUG, "dbus: Failed to allocate memory");
1266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
1277dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt}
1287dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1297dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt
1306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic const char * const dont_quote[] = {
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap",
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path",
133d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	"bssid", "scan_freq", "freq_list", NULL
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key)
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i = 0;
1396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dont_quote[i] != NULL) {
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, dont_quote[i]) == 0)
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return FALSE;
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		i++;
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return TRUE;
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init()
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path(
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_global *global, const char *path)
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
160cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s->dbus_new_path &&
161cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		    os_strcmp(wpa_s->dbus_new_path, path) == 0)
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return wpa_s;
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set.
1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure
1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   struct wpa_ssid *ssid,
1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   DBusMessageIter *iter,
1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				   DBusError *error)
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING };
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter_dict;
1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *value = NULL;
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(iter, &iter_dict, error))
1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t size = 50;
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int ret;
1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto error;
1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		value = NULL;
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (entry.type == DBUS_TYPE_ARRAY &&
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    entry.array_type == DBUS_TYPE_BYTE) {
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (entry.array_len <= 0)
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			size = entry.array_len * 2 + 1;
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = wpa_snprintf_hex(value, size,
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       (u8 *) entry.bytearray_value,
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       entry.array_len);
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_STRING) {
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (should_quote_opt(entry.key)) {
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size = os_strlen(entry.str_value);
2174171258d30a612645aa061cede62233b5c58ca2aDmitry Shmidt				if (size == 0)
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size += 3;
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_zalloc(size);
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				ret = os_snprintf(value, size, "\"%s\"",
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  entry.str_value);
2276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				if (os_snprintf_error(size, ret))
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_strdup(entry.str_value);
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_UINT32) {
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%u",
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.uint32_value);
2416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			if (os_snprintf_error(size, ret))
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_INT32) {
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%d",
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.int32_value);
2506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			if (os_snprintf_error(size, ret))
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_config_set(ssid, entry.key, value, 0) < 0)
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2582f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		if (os_strcmp(entry.key, "bssid") != 0 &&
2592f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		    os_strcmp(entry.key, "priority") != 0)
2602f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
2612f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt
2622f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		if (wpa_s->current_ssid == ssid ||
2632f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		    wpa_s->current_ssid == NULL) {
2642f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			/*
2652f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			 * Invalidate the EAP session cache if anything in the
2662f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			 * current or previously used configuration changes.
2672f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			 */
2682f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt			eapol_sm_invalidate_cached_session(wpa_s->eapol);
2692f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt		}
2702f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((os_strcmp(entry.key, "psk") == 0 &&
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     value[0] == '"' && ssid->ssid_len) ||
27304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		    (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase))
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_psk(ssid);
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if (os_strcmp(entry.key, "priority") == 0)
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_prio_list(wpa_s->conf);
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(value);
279623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt		value = NULL;
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_dbus_dict_entry_clear(&entry);
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror:
2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(value);
2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_dbus_dict_entry_clear(&entry);
2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS,
2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			     "invalid message format");
2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property
2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value
2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure
3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic.
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter,
3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const int type,
3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const void *val,
3071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error)
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter;
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: given type is not basic", __func__);
3141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
3186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      wpa_dbus_type_as_string(type),
3196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &variant_iter) ||
3206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_append_basic(&variant_iter, type, val) ||
3216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
3226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: error constructing reply", __func__);
3246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
3256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	}
3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored
3361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic.
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter,
3411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     DBusError *error,
3421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     const int type, void *val)
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter;
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: given type is not basic", __func__);
3491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Look at the new value */
3531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&variant_iter) != type) {
3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
3561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "wrong property type");
3571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&variant_iter, val);
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property
3671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type)
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array
3711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure
3721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic.
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter,
3781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   const int type,
3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   const void *array,
3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   size_t array_len,
3811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   DBusError *error)
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char type_str[] = "a?"; /* ? will be replaced with subtype letter; */
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *sub_type_str;
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t element_size, i;
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: given type is not basic", __func__);
3911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	type_str[1] = sub_type_str[0];
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
3986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      type_str, &variant_iter) ||
3996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      sub_type_str, &array_iter)) {
4011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message", __func__);
4031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	switch (type) {
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BYTE:
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BOOLEAN:
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = 1;
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT16:
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT16:
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint16_t);
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT32:
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT32:
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint32_t);
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT64:
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT64:
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint64_t);
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_DOUBLE:
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(double);
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_STRING:
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_OBJECT_PATH:
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(char *);
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
4311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: unknown element type %d", __func__, type);
4331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < array_len; i++) {
43743cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt		if (!dbus_message_iter_append_basic(&array_iter, type,
438b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt						    (const char *) array +
439b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt						    i * element_size)) {
44043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_FAILED,
44143cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt				       "%s: failed to construct message 2.5",
44243cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt				       __func__);
44343cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt			return FALSE;
44443cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt		}
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter) ||
4486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
4491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message 3", __func__);
4511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
4521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
4531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
4541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property
46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator
46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type)
46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message
46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array
46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure
46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed
46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is
46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic.
46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter,
47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 const int type,
47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 struct wpabuf **array,
47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 size_t array_len,
47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt							 DBusError *error)
47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter variant_iter, array_iter;
47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char type_str[] = "aa?";
47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char inner_type_str[] = "a?";
47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	const char *sub_type_str;
48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	size_t i;
48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_type_is_basic(type)) {
48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			       "%s: given type is not basic", __func__);
48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	type_str[2] = sub_type_str[0];
49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	inner_type_str[1] = sub_type_str[0];
49104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
49204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
4936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      type_str, &variant_iter) ||
4946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
49504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      inner_type_str, &array_iter)) {
49604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
4976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to construct message", __func__);
49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
49904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
501c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt	for (i = 0; i < array_len && array[i]; i++) {
50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_dbus_dict_bin_array_add_element(&array_iter,
50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_head(array[i]),
50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						    wpabuf_len(array[i]));
50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
50604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
50704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
5086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter) ||
5096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
5116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			       "%s: failed to close message", __func__);
51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
51604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
51904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object,
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage.
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter_dict;
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter;
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry;
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *driver = NULL;
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *confname = NULL;
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *bridge_ifname = NULL;
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL))
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error;
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
5496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if (os_strcmp(entry.key, "Driver") == 0 &&
5506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    entry.type == DBUS_TYPE_STRING) {
551623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(driver);
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			driver = os_strdup(entry.str_value);
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (driver == NULL)
555ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "Ifname") == 0 &&
5576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
558623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(ifname);
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(entry.str_value);
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ifname == NULL)
562ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "ConfigFile") == 0 &&
5646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
565623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(confname);
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			confname = os_strdup(entry.str_value);
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (confname == NULL)
569ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		} else if (os_strcmp(entry.key, "BridgeIfname") == 0 &&
5716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   entry.type == DBUS_TYPE_STRING) {
572623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt			os_free(bridge_ifname);
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			bridge_ifname = os_strdup(entry.str_value);
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (bridge_ifname == NULL)
576ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				goto oom;
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error; /* Required Ifname argument missing */
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Try to get the wpa_supplicant record for this iface, return
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * an error if we already control it.
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_get_iface(global, ifname) != NULL) {
5916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = dbus_message_new_error(
5926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message, WPAS_DBUS_ERROR_IFACE_EXISTS,
5936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant already controls this interface.");
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_supplicant *wpa_s;
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_interface iface;
5976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memset(&iface, 0, sizeof(iface));
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.driver = driver;
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.ifname = ifname;
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.confname = confname;
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.bridge_ifname = bridge_ifname;
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Otherwise, have wpa_supplicant attach to it. */
604203eadb9eda41a1dde4a583edb4684319e3f399eDmitry Shmidt		wpa_s = wpa_supplicant_add_iface(global, &iface, NULL);
605cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s && wpa_s->dbus_new_path) {
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *path = wpa_s->dbus_new_path;
6076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_method_return(message);
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH,
6106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						 &path, DBUS_TYPE_INVALID);
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_unknown_error(
6136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
6146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"wpa_supplicant couldn't grab this interface.");
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(driver);
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ifname);
62161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os_free(confname);
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(bridge_ifname);
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror:
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_error_invalid_args(message, NULL);
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	goto out;
628ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtoom:
629ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	reply = wpas_dbus_error_no_memory(message);
630ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	goto out;
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          failure (0), or returns a dbus error message with more information
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call.  Handles requests
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages.
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message,
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *path;
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path,
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = get_iface_by_dbus_path(global, path);
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_iface_unknown(message);
658c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) {
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
6606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
6616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant couldn't remove this interface.");
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object,
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call.
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message,
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      struct wpa_global *global)
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname;
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *path;
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname,
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = wpa_supplicant_get_iface(global, ifname);
689cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s == NULL || wpa_s->dbus_new_path == NULL)
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_iface_unknown(message);
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	path = wpa_s->dbus_new_path;
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL)
6956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
6996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level
7081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property.
7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
715d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(
716d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
717d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str;
7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int idx = wpa_debug_level;
7211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx < 0)
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 0;
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx > 5)
7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 5;
7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str = debug_strings[idx];
7271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
7281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp
7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property.
7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
741d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(
742d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
743d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_timestamp, error);
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys
7531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property.
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
760d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(
761d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
762d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
7651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&wpa_debug_show_keys, error);
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level
7711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
7721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
7731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
7741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property.
7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
778d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(
779d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
780d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str = NULL;
7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, val = -1;
7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
7871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &str))
7881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; debug_strings[i]; i++)
7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(debug_strings[i], str) == 0) {
7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			val = i;
7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (val < 0 ||
7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp,
7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    wpa_debug_show_keys)) {
7996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
8006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "wrong debug level value");
8011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp
8101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property.
8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
817d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(
818d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
819d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0,
8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_show_keys);
8301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys
8361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property.
8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
843d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(
844d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
845d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
8511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &val))
8521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level,
8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_timestamp,
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					val ? 1 : 0);
8571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list
8631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
8641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
8651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
8661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects
8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths
8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
872d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(
873d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
874d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_global *global = user_data;
8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char **paths;
8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
8801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
882cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
883cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s->dbus_new_path)
884cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			num++;
885cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
88761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
8891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
8901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
893cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
894cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s->dbus_new_path)
895cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			paths[i++] = wpa_s->dbus_new_path;
896cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
8991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
9001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
9031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list
9091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
9121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests
9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods
9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
917d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(
918d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
919d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **eap_methods;
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t num_items = 0;
9231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success;
9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eap_methods = eap_get_names_as_string_array(&num_items);
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!eap_methods) {
9271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
9281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
9321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_STRING,
9331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 eap_methods,
9341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 num_items, error);
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (num_items)
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(eap_methods[--num_items]);
9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(eap_methods);
9391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
943d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
944d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities
945d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
946d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
947d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
948d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
949d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
950d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to
951d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS,
952d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time.
953d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
954d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(
955d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
956d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
957d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL };
959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	size_t num_items = 0;
960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP
962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ap";
963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */
964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN
965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "ibss-rsn";
966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */
967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P
968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "p2p";
969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */
970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING
971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	capabilities[num_items++] = "interworking";
972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */
973d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
974d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter,
975d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      DBUS_TYPE_STRING,
976d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      capabilities,
977d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt						      num_items, error);
978d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
979d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
980d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var,
9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char **type, DBusMessage **reply)
9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) {
9856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a string",
9866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Type value type. String required");
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(var, type);
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var,
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    struct wpa_driver_scan_params *params,
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    DBusMessage **reply)
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_ssid *ssids = params->ssids;
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t ssids_num = 0;
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ssid;
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
10086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ssids must be an array of arrays of bytes",
10106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong SSIDs value type. Array of arrays of bytes required");
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
10206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) {
10216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ssids must be an array of arrays of bytes",
10236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong SSIDs value type. Array of arrays of bytes required");
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) {
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ssids_num >= WPAS_MAX_SCAN_SSIDS) {
10326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
10336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Too many ssids specified on scan dbus call",
10346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
10366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
10376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"Too many ssids specified. Specify at most four");
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10459d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt		if (len > SSID_MAX_LEN) {
1046c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			wpa_printf(MSG_DEBUG,
10476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: SSID too long (len=%d max_len=%d)",
10489d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt				   __func__, len, SSID_MAX_LEN);
1049c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
1050c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				message, "Invalid SSID: too long");
1051c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt			return -1;
1052c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		}
1053c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len != 0) {
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = os_malloc(len);
10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ssid == NULL) {
10576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				*reply = wpas_dbus_error_no_memory(message);
10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_memcpy(ssid, val, len);
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Allow zero-length SSIDs */
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = NULL;
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid = ssid;
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid_len = len;
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids_num++;
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->num_ssids = ssids_num;
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var,
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  struct wpa_driver_scan_params *params,
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  DBusMessage **reply)
10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ies = NULL, *nies;
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ies_len = 0;
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
10896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
10906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ies must be an array of arrays of bytes",
10916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
10946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong IEs value type. Array of arrays of bytes required");
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
11016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) {
11026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
11036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: ies must be an array of arrays of bytes",
11046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong IEs value type. Array required");
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) {
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len == 0) {
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_iter_next(&array_iter);
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		nies = os_realloc(ies, ies_len + len);
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (nies == NULL) {
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ies);
11226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			*reply = wpas_dbus_error_no_memory(message);
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies = nies;
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memcpy(ies + ies_len, val, len);
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies_len += len;
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies = ies;
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies_len = ies_len;
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message,
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessageIter *var,
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_driver_scan_params *params,
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessage **reply)
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int *freqs = NULL, *nfreqs;
11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int freqs_num = 0;
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
11486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
11496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: Channels must be an array of structs",
11506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
11536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong Channels value type. Array of structs required");
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) {
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG,
11616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: Channels must be an array of structs",
11626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
11646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
11656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Wrong Channels value type. Array of structs required");
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT)
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int freq, width;
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dbus_message_iter_get_arg_type(&sub_array_iter) !=
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
11776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
11786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Channel must by specified by struct of two UINT32s %c",
11796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__,
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   dbus_message_iter_get_arg_type(
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   &sub_array_iter));
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
11836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
11846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &freq);
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_next(&sub_array_iter) ||
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    dbus_message_iter_get_arg_type(&sub_array_iter) !=
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
11936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
11946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: Channel must by specified by struct of two UINT32s",
11956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message,
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &width);
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs_num % FREQS_ALLOC_CHUNK == 0) {
120761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			nfreqs = os_realloc_array(
120861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				freqs, freqs_num + FREQS_ALLOC_CHUNK,
120961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				sizeof(int));
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (nfreqs == NULL)
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_free(freqs);
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			freqs = nfreqs;
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs == NULL) {
12156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			*reply = wpas_dbus_error_no_memory(message);
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs[freqs_num] = freq;
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs_num++;
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
122561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int));
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (nfreqs == NULL)
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(freqs);
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs = nfreqs;
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (freqs == NULL) {
12306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		*reply = wpas_dbus_error_no_memory(message);
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs[freqs_num] = 0;
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->freqs = freqs;
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1240051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpas_dbus_get_scan_allow_roam(DBusMessage *message,
1241051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 DBusMessageIter *var,
1242051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 dbus_bool_t *allow,
1243051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt					 DBusMessage **reply)
1244051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{
1245051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN) {
12466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a boolean",
12476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
1248051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
1249051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			message, "Wrong Type value type. Boolean required");
1250051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		return -1;
1251051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1252051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	dbus_message_iter_get_basic(var, allow);
1253051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	return 0;
1254051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt}
1255051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1256051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface.
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     struct wpa_supplicant *wpa_s)
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, dict_iter, entry_iter, variant_iter;
12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *key = NULL, *type = NULL;
12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_params params;
12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t i;
1275051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	dbus_bool_t allow_roam = 1;
12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&params, 0, sizeof(params));
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &dict_iter);
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&dict_iter) ==
12846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	       DBUS_TYPE_DICT_ENTRY) {
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&dict_iter, &entry_iter);
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&entry_iter, &key);
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&entry_iter);
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&entry_iter, &variant_iter);
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, "Type") == 0) {
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_type(message, &variant_iter,
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &type, &reply) < 0)
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "SSIDs") == 0) {
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ssids(message, &variant_iter,
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     &params, &reply) < 0)
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "IEs") == 0) {
12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ies(message, &variant_iter,
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   &params, &reply) < 0)
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "Channels") == 0) {
13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_channels(message, &variant_iter,
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							&params, &reply) < 0)
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
1306051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		} else if (os_strcmp(key, "AllowRoam") == 0) {
1307051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			if (wpas_dbus_get_scan_allow_roam(message,
1308051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &variant_iter,
1309051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &allow_roam,
1310051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt							  &reply) < 0)
1311051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt				goto out;
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
13136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown argument %s",
13146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__, key);
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(message, key);
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&dict_iter);
13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!type) {
13236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Scan type not specified",
13246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, key);
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (os_strcmp(type, "passive") == 0) {
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (params.num_ssids || params.extra_ies_len) {
13316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			wpa_printf(MSG_DEBUG,
13326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   "%s[dbus]: SSIDs or IEs specified for passive scan.",
13336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   __func__);
13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(
13356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				message,
13366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				"You can specify only Channels in passive scan");
13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
1339cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			if (wpa_s->sched_scanning) {
1340cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_printf(MSG_DEBUG,
1341cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt					   "%s[dbus]: Stop ongoing sched_scan to allow requested scan to proceed",
1342cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt					   __func__);
1343cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_supplicant_cancel_sched_scan(wpa_s);
1344cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			}
1345cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
1346cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			if (params.freqs && params.freqs[0]) {
1347d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt				wpa_s->last_scan_req = MANUAL_SCAN_REQ;
1348cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				if (wpa_supplicant_trigger_scan(wpa_s,
1349cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt								&params)) {
1350cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt					reply = wpas_dbus_error_scan_error(
1351cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt						message,
1352cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt						"Scan request rejected");
1353cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				}
1354cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			} else {
1355cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_s->scan_req = MANUAL_SCAN_REQ;
1356cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				wpa_supplicant_req_scan(wpa_s, 0, 0);
1357cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			}
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	} else if (os_strcmp(type, "active") == 0) {
13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!params.num_ssids) {
13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Add wildcard ssid */
13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			params.num_ssids++;
13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
136404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
136504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
136604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
1367cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		if (wpa_s->sched_scanning) {
1368cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			wpa_printf(MSG_DEBUG,
1369cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				   "%s[dbus]: Stop ongoing sched_scan to allow requested scan to proceed",
1370cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt				   __func__);
1371cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			wpa_supplicant_cancel_sched_scan(wpa_s);
1372cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		}
1373cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
1374d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		wpa_s->last_scan_req = MANUAL_SCAN_REQ;
13757dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt		if (wpa_supplicant_trigger_scan(wpa_s, &params)) {
13767dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt			reply = wpas_dbus_error_scan_error(
13777dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt				message, "Scan request rejected");
13787dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt		}
13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
13806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown scan type: %s",
13816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, type);
13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message,
13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     "Wrong scan type");
13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1387051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (!allow_roam)
1388051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		wpa_s->scan_res_handler = scan_only_handler;
1389051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free((u8 *) params.ssids[i].ssid);
13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free((u8 *) params.extra_ies);
13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(params.freqs);
13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1399661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/**
1400661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_handler_signal_poll - Request immediate signal properties
1401661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @message: Pointer to incoming dbus message
1402661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1403661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
1404661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt *
1405661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Handler function for "SignalPoll" method call of a network device. Requests
1406661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * that wpa_supplicant read signal properties like RSSI, noise, and link
1407661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * speed and return them.
1408661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */
1409661b4f78e48c697429dc46154a4125892c001718Dmitry ShmidtDBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
1410661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
1411661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
1412661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct wpa_signal_info si;
1413661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	DBusMessage *reply = NULL;
1414661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	DBusMessageIter iter, iter_dict, variant_iter;
1415661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	int ret;
1416661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1417661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	ret = wpa_drv_signal_poll(wpa_s, &si);
1418661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (ret) {
1419661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
1420661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt					      "Failed to read signal");
1421661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	}
1422661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1423661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	reply = dbus_message_new_method_return(message);
1424661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (reply == NULL)
1425661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1426661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1427661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
1428661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1429661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
14306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
14316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) ||
14326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "rssi",
14336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_signal) ||
14346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
14356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_txrate / 1000) ||
14366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_int32(&iter_dict, "noise",
14376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					si.current_noise) ||
14386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_append_uint32(&iter_dict, "frequency",
14396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					 si.frequency) ||
14406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.chanwidth != CHAN_WIDTH_UNKNOWN &&
14416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_append_string(
14426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_dict, "width",
14436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     channel_width_to_string(si.chanwidth))) ||
14446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.center_frq1 > 0 && si.center_frq2 > 0 &&
14456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
14466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					  si.center_frq1) ||
14476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	      !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
14486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					  si.center_frq2))) ||
14496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (si.avg_signal &&
14506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
14516c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					 si.avg_signal)) ||
14526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
14536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(&iter, &variant_iter))
1454661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		goto nomem;
1455661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1456661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return reply;
1457661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1458661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtnomem:
1459661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (reply)
1460661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		dbus_message_unref(reply);
14616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	return wpas_dbus_error_no_memory(message);
1462661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
1463661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
1464661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection
14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected
14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise.
14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface.
14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->disconnected = 1;
14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "This interface is not connected");
14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface.
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter;
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = NULL;
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf;
15051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusError error;
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1509cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->dbus_new_path)
1510cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		ssid = wpa_config_add_network(wpa_s->conf);
15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
15126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.",
15136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message,
15166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"wpa_supplicant could not add a network on this interface.");
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_added(wpa_s, ssid);
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid->disabled = 1;
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_network_defaults(ssid);
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_error_init(&error);
15241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!set_network_properties(wpa_s, ssid, &iter, &error)) {
15256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
15266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: control interface couldn't set network properties",
15276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
15281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_reply_new_from_error(message, &error,
15291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       DBUS_ERROR_INVALID_ARGS,
15301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						       "Failed to add network");
15311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_error_free(&error);
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Construct the object path for this network. */
15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_s->dbus_new_path, ssid->id);
15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL) {
15426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
15486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid) {
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpas_notify_network_removed(wpa_s, ssid);
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_config_remove_network(wpa_s->conf, ssid->id);
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1564413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate
156561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message
156661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1567413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled
156861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise.
156961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *
157061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface.
157161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */
157261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message,
157361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
157461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
1575413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) {
1576d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpas_request_connection(wpa_s);
157761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
157861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
157961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1580413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_DISABLED,
1581413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt				      "This interface is disabled");
158261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
158361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
158461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
158561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/**
1586d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * wpas_dbus_handler_expect_disconnect - ExpectDisconnect
1587d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * @message: Pointer to incoming dbus message
1588d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * @global: %wpa_supplicant global data structure
1589d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * Returns: NULL
1590d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt *
1591d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * Handler function for notifying system there will be a expected disconnect.
1592d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt * This will prevent wpa_supplicant from adding blacklists upon next disconnect..
1593d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt */
1594d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry ShmidtDBusMessage * wpas_dbus_handler_expect_disconnect(DBusMessage *message,
1595d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt						  struct wpa_global *global)
1596d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{
1597d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	struct wpa_supplicant *wpa_s = global->ifaces;
1598d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
1599d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	for (; wpa_s; wpa_s = wpa_s->next)
1600d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		if (wpa_s->wpa_state >= WPA_ASSOCIATED)
1601d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			wpa_s->own_disconnect_req = 1;
1602d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	return NULL;
1603d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt}
1604d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
1605d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
1606d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt/**
16079866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * wpas_dbus_handler_reattach - Reattach to current AP
16089866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @message: Pointer to incoming dbus message
16099866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16109866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Returns: NotConnected DBus error message if not connected
16119866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * or NULL otherwise.
16129866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt *
16139866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Handler function for "Reattach" method call of network interface.
16149866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt */
16159866086a955d00e237cc8df3722e7dff75c02532Dmitry ShmidtDBusMessage * wpas_dbus_handler_reattach(DBusMessage *message,
16169866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
16179866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{
16189866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
16199866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		wpa_s->reattach = 1;
16209866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		wpas_request_connection(wpa_s);
16219866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt		return NULL;
16229866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	}
16239866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16249866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
16259866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt				      "This interface is not connected");
16269866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt}
16279866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16289866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
16299866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt/**
1630a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * wpas_dbus_handler_reconnect - Reconnect if disconnected
1631a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * @message: Pointer to incoming dbus message
1632a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1633a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled
1634a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * or NULL otherwise.
1635a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt *
1636a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt * Handler function for "Reconnect" method call of network interface.
1637a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt */
1638a3dc30964aa24aea2b518246f6812663a1103490Dmitry ShmidtDBusMessage * wpas_dbus_handler_reconnect(DBusMessage *message,
1639a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt		struct wpa_supplicant *wpa_s)
1640a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt{
1641a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
1642a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt		return dbus_message_new_error(message,
1643a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt					      WPAS_DBUS_ERROR_IFACE_DISABLED,
1644a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt					      "This interface is disabled");
1645a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt	}
1646a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt
1647a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt	if (wpa_s->disconnected)
1648a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt		wpas_request_connection(wpa_s);
1649a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt	return NULL;
1650a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt}
1651a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt
1652a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt
1653a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt/**
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network
16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface.
16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
16666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
16692f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	int was_disabled;
16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
16766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
16776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
16786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1679cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
1680d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1685d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1687d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16982f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	was_disabled = ssid->disabled;
16992f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
17052f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	else if (!was_disabled && wpa_s->sched_scanning) {
17066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG,
17076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "Stop ongoing sched_scan to remove network from filters");
17082f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
17092f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_req_scan(wpa_s, 0, 0);
17102f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	}
17112f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
1712684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, id) < 0) {
1713684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		wpa_printf(MSG_ERROR,
17146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: error occurred when removing network %d",
17156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, id);
1716684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		reply = wpas_dbus_error_unknown_error(
17176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			message,
17186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"error removing the specified network on is interface.");
1719684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		goto out;
1720684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	}
17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid)
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s = arg;
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) {
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR,
17366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   "%s[dbus]: error occurred when removing network %d",
17376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__, ssid->id);
17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
1742d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
1743d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface.
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks(
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17582f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt	if (wpa_s->sched_scanning)
17592f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt		wpa_supplicant_cancel_sched_scan(wpa_s);
17602f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt
17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* NB: could check for failure and return an error */
17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s);
17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network
17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface.
17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message,
17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
17806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
17896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
17906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
17916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1792cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
1793d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1798d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
1800d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Finally, associate with the network */
18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_select_network(wpa_s, ssid);
18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
18211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal
18221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message
18231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
18241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure
18251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
18261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface.
18271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */
18281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message,
18291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      struct wpa_supplicant *wpa_s)
18301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
18311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL
18321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessage *reply = NULL;
18331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *op, *field, *value;
18346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	char *iface, *net_id;
18351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int id;
18361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_ssid *ssid;
18371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
18396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_OBJECT_PATH, &op,
18406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_STRING, &field,
18416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_STRING, &value,
18426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				   DBUS_TYPE_INVALID))
18431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpas_dbus_error_invalid_args(message, NULL);
18441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* Extract the network ID and ensure the network */
18461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	/* is actually a child of this interface */
18476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	iface = wpas_dbus_new_decompose_object_path(op,
18486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    WPAS_DBUS_NEW_NETWORKS_PART,
18496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						    &net_id);
1850cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
1851d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
18521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
18531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1856d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	errno = 0;
18571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	id = strtoul(net_id, NULL, 10);
1858d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (errno != 0) {
18591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, net_id);
18601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
18641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (ssid == NULL) {
18651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
18661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		goto out;
18671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid,
18701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      field, value) < 0)
18711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, field);
18721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	else {
18731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		/* Tell EAP to retry immediately */
18741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		eapol_sm_notify_ctrl_response(wpa_s->eapol);
18751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout:
18781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(iface);
18791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return reply;
18801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */
1881b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	wpa_printf(MSG_DEBUG, "dbus: 802.1X not included");
18821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_error_unknown_error(message, "802.1X not included");
18831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */
18841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
18851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1887700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS
1888700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
18891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/**
18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates)
18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs.
18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message,
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *blob_data;
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int blob_len;
19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob = NULL;
19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &blob_name);
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_get_blob(wpa_s->conf, blob_name)) {
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_EXISTS,
19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array_iter);
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len);
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = os_zalloc(sizeof(*blob));
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
19246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->data = os_malloc(blob_len);
19296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	blob->name = os_strdup(blob_name);
19306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!blob->data || !blob->name) {
19316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(blob->data, blob_data, blob_len);
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->len = blob_len;
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_blob(wpa_s->conf, blob);
19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_added(wpa_s, blob->name);
19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (blob) {
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->name);
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->data);
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob);
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates)
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob)
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs.
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message,
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct wpa_config_blob *blob;
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_config_get_blob(wpa_s->conf, blob_name);
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
19806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!reply)
19816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      DBUS_TYPE_BYTE_AS_STRING,
19876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &array_iter) ||
19886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE,
19896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						  &(blob->data), blob->len) ||
19906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(&iter, &array_iter)) {
19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
19926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob
20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error
20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs.
20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message,
20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_blob(wpa_s->conf, blob_name)) {
20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_removed(wpa_s, blob_name);
20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2027700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */
2028700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
2029700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt
20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache
20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface.
20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message,
20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t age;
20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age,
20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (age == 0)
20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush(wpa_s);
20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush_by_age(wpa_s, age);
20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
205504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
205604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
205704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface
205804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message
205904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
206004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL
206104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
206204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface.
206304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
206404949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message,
206504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					 struct wpa_supplicant *wpa_s)
206604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
206704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *reply = NULL;
206804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	enum wpa_states state = wpa_s->wpa_state;
206904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *arg;
207004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
207104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg,
207204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      DBUS_TYPE_INVALID);
207304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
207404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (arg != NULL && os_strlen(arg) > 0) {
207504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		char *tmp;
20766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
207704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		tmp = os_strdup(arg);
207804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (tmp == NULL) {
20796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			reply = wpas_dbus_error_no_memory(message);
208004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		} else {
208104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			os_free(wpa_s->conf->autoscan);
208204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			wpa_s->conf->autoscan = tmp;
208304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
208404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				autoscan_init(wpa_s, 1);
208504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			else if (state == WPA_SCANNING)
208604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				wpa_supplicant_reinit_autoscan(wpa_s);
208704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		}
208804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else if (arg != NULL && os_strlen(arg) == 0) {
208904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->conf->autoscan);
209004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->conf->autoscan = NULL;
209104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		autoscan_deinit(wpa_s);
209204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	} else
209304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		reply = dbus_message_new_error(message,
209404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       DBUS_ERROR_INVALID_ARGS,
209504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       NULL);
209604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
209704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return reply;
209804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
209904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
210004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
210104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
21028da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/*
21038da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logoff - IEEE 802.1X EAPOL state machine logoff
21048da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message
21058da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
21068da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL
21078da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt *
21088da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogoff" method call of network interface.
21098da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */
21108da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logoff(DBusMessage *message,
21118da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
21128da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{
21138da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	eapol_sm_notify_logoff(wpa_s->eapol, TRUE);
21148da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	return NULL;
21158da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt}
21168da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
21178da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
21188da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/*
21198da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logon - IEEE 802.1X EAPOL state machine logon
21208da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message
21218da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
21228da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL
21238da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt *
21248da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogin" method call of network interface.
21258da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */
21268da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message,
21278da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
21288da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{
21298da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	eapol_sm_notify_logoff(wpa_s->eapol, FALSE);
21308da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	return NULL;
21318da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt}
21328da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
21338da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt
2134e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef CONFIG_TDLS
2135e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21367d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidtstatic int get_peer_hwaddr_helper(DBusMessage *message, const char *func_name,
21377d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt				  u8 *peer_address, DBusMessage **error)
2138e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2139e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	const char *peer_string;
2140e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21417d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	*error = NULL;
21427d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt
2143e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (!dbus_message_get_args(message, NULL,
2144e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				   DBUS_TYPE_STRING, &peer_string,
21457d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt				   DBUS_TYPE_INVALID)) {
21467d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		*error = wpas_dbus_error_invalid_args(message, NULL);
21477d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		return -1;
21487d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	}
2149e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2150e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (hwaddr_aton(peer_string, peer_address)) {
2151e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s: invalid address '%s'",
2152e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			   func_name, peer_string);
21537d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		*error = wpas_dbus_error_invalid_args(
2154e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "Invalid hardware address format");
21557d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt		return -1;
2156e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2157e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21587d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	return 0;
2159e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2160e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2161e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2162e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2163e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_discover - Discover TDLS peer
2164e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2165e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2166e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2167e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2168e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSDiscover" method call of network interface.
2169e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2170e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message,
2171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					      struct wpa_supplicant *wpa_s)
2172e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2175e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2176e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
21777d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2178e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2179e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2180e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_DISCOVER " MACSTR, MAC2STR(peer));
2181e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2182e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2183e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer);
2184e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2185e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer);
2186e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2187e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2188e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2189e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS discovery");
2190e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2191e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2192e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2193e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2194e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2195e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2196e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2197e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_setup - Setup TDLS session
2198e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2199e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2201e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSSetup" method call of network interface.
2203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message,
2205e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					   struct wpa_supplicant *wpa_s)
2206e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2207e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2208e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2209e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2210e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22117d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2212e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2213e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2214e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_SETUP " MACSTR, MAC2STR(peer));
2215e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2216e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_tdls_remove(wpa_s->wpa, peer);
2217e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2218e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_start(wpa_s->wpa, peer);
2219e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2220e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
2221e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2222e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2223e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2224e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS setup");
2225e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2226e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2227e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2228e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2229e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2230e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2231e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2232e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_status - Return TDLS session status
2233e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2234e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2235e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: A string representing the state of the link to this TDLS peer
2236e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2237e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSStatus" method call of network interface.
2238e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2239e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_status(DBusMessage *message,
2240e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					    struct wpa_supplicant *wpa_s)
2241e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2242e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2243e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *reply;
2244e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	const char *tdls_status;
2245e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22467d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &reply) < 0)
2247e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return reply;
2248e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2249e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_STATUS " MACSTR, MAC2STR(peer));
2250e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2251e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	tdls_status = wpa_tdls_get_link_status(wpa_s->wpa, peer);
2252e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2253e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	reply = dbus_message_new_method_return(message);
2254e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	dbus_message_append_args(reply, DBUS_TYPE_STRING,
2255e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				 &tdls_status, DBUS_TYPE_INVALID);
2256e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return reply;
2257e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2258e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2259e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2260e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/*
2261e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_teardown - Teardown TDLS session
2262e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message
2263e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2264e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
2265e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
2266e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSTeardown" method call of network interface.
2267e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
2268e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message,
2269e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt					      struct wpa_supplicant *wpa_s)
2270e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
2271e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	u8 peer[ETH_ALEN];
2272e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	DBusMessage *error_reply;
2273e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	int ret;
2274e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
22757d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt	if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0)
2276e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return error_reply;
2277e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2278e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	wpa_printf(MSG_DEBUG, "DBUS TDLS_TEARDOWN " MACSTR, MAC2STR(peer));
2279e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2280e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (wpa_tdls_is_external_setup(wpa_s->wpa))
2281e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_tdls_teardown_link(
2282e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			wpa_s->wpa, peer,
2283e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
2284e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	else
2285e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer);
2286e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2287e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	if (ret) {
2288e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt		return wpas_dbus_error_unknown_error(
2289e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			message, "error performing TDLS teardown");
2290e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	}
2291e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2292e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return NULL;
2293e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
2294e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2295e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* CONFIG_TDLS */
2296e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2297e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
2298b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE
2299b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt/**
2300b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * wpas_dbus_handler_save_config - Save configuration to configuration file
2301b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * @message: Pointer to incoming dbus message
2302b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
2303b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * Returns: NULL on Success, Otherwise errror message
2304b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt *
2305b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt * Handler function for "SaveConfig" method call of network interface.
2306b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt */
2307b70d0bbd90f638aa38da542e337c312309200e87Dmitry ShmidtDBusMessage * wpas_dbus_handler_save_config(DBusMessage *message,
2308b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
2309b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt{
2310b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	int ret;
2311b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt
2312b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	if (!wpa_s->conf->update_config) {
2313b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt		return wpas_dbus_error_unknown_error(
2314b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt			message,
2315b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt			"Not allowed to update configuration (update_config=0)");
2316b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	}
2317b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt
2318b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	ret = wpa_config_write(wpa_s->confname, wpa_s->conf);
2319b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	if (ret)
2320b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt		return wpas_dbus_error_unknown_error(
2321b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt			message, "Failed to update configuration");
2322b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt	return NULL;
2323b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt}
2324b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */
2325b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt
2326b70d0bbd90f638aa38da542e337c312309200e87Dmitry Shmidt
23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
232801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
232901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @message: Pointer to incoming dbus message
233001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
233101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
233201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
233301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Sets the PKCS #11 engine and module path.
233401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
233501904cfafd75a70b9f29c0220b90bdef45595491Dmitry ShmidtDBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path(
233601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
233701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
233801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	DBusMessageIter iter;
233901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *value = NULL;
234001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *pkcs11_engine_path = NULL;
234101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	char *pkcs11_module_path = NULL;
234201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
234301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_init(message, &iter);
234401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &value);
234501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (value == NULL) {
234601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
234701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS,
234801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Invalid pkcs11_engine_path argument");
234901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
235001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	/* Empty path defaults to NULL */
235101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (os_strlen(value))
235201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = value;
235301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
235401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_next(&iter);
235501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &value);
235601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (value == NULL) {
235701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		os_free(pkcs11_engine_path);
235801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
235901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS,
236001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			"Invalid pkcs11_module_path argument");
236101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	}
236201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	/* Empty path defaults to NULL */
236301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (os_strlen(value))
236401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = value;
236501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
236601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path,
236701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						   pkcs11_module_path))
236801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		return dbus_message_new_error(
236901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt			message, DBUS_ERROR_FAILED,
23706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			"Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed.");
237101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
2372cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->dbus_new_path) {
2373cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		wpa_dbus_mark_property_changed(
2374cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			wpa_s->global->dbus, wpa_s->dbus_new_path,
2375cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath");
2376cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		wpa_dbus_mark_property_changed(
2377cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			wpa_s->global->dbus, wpa_s->dbus_new_path,
2378cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath");
2379cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
238001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
238101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return NULL;
238201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
238301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
238401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
238501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities
23871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
23881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
23891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
23901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface.
23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2394d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(
2395d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2396d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_capa capa;
24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
24011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array,
24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		variant_iter;
24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *scans[] = { "active", "passive", "ssid" };
24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
24066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
24076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_drv_get_capa(wpa_s, &capa);
24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** pairwise cipher */
24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {"ccmp", "tkip", "none"};
24156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Pairwise", args,
241868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise",
24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
24246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
24256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) &&
24266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp-256")) ||
24286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) &&
24296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp-256")) ||
24316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) &&
24326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp")) ||
24346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) &&
24356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp")) ||
24376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) &&
24386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "tkip")) ||
24406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) &&
24416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "none")) ||
24436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** group cipher */
24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"ccmp", "tkip", "wep104", "wep40"
24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
24556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Group", args,
245868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group",
24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
24646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
24656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) &&
24666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp-256")) ||
24686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) &&
24696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp-256")) ||
24716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) &&
24726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "ccmp")) ||
24746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) &&
24756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "gcmp")) ||
24776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) &&
24786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "tkip")) ||
24806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) &&
24816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wep104")) ||
24836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) &&
24846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
24856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wep40")) ||
24866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** key management */
24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wpa-psk", "wpa-eap", "ieee8021x", "wpa-none",
24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wps",
24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"none"
25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "KeyMgmt", args,
250468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt",
25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
25106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
25116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
25126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							    "none") ||
25136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "ieee8021x"))
25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) {
25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				    &iter_array, "wpa-eap") ||
25216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			    ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) &&
25226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     !wpa_dbus_dict_string_array_add_element(
25236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     &iter_array, "wpa-ft-eap")))
25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-eap-sha256"))
25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
25358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) {
25368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				    &iter_array, "wpa-psk") ||
25386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			    ((capa.key_mgmt &
25396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			      WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) &&
25406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     !wpa_dbus_dict_string_array_add_element(
25416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     &iter_array, "wpa-ft-psk")))
25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-psk-sha256"))
25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) &&
25536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_string_array_add_element(&iter_array,
25546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							    "wpa-none"))
25556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			goto nomem;
25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "wps"))
25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
25638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** WPA protocol */
25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "rsn", "wpa" };
25746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Protocol", args,
257768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol",
25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
25836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      &iter_array) ||
25846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
25856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) &&
25866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
25876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "rsn")) ||
25886c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
25896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) &&
25906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
25916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "wpa")) ||
25926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !wpa_dbus_dict_end_string_array(&iter_dict,
25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** auth alg */
26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "open", "shared", "leap" };
26026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "AuthAlg", args,
260568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt			    ARRAY_SIZE(args)))
26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg",
26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		if (((capa.auth & WPA_DRIVER_AUTH_OPEN) &&
26156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
26166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "open")) ||
26176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.auth & WPA_DRIVER_AUTH_SHARED) &&
26186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
26196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "shared")) ||
26206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    ((capa.auth & WPA_DRIVER_AUTH_LEAP) &&
26216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     !wpa_dbus_dict_string_array_add_element(
26226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			     &iter_array, "leap")) ||
26236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    !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	/***** Scan */
26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans,
263268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt					       ARRAY_SIZE(scans)))
26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Modes */
263675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes",
263775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_entry,
263875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_val,
26396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      &iter_array) ||
26406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_string_array_add_element(
26416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    &iter_array, "infrastructure") ||
26426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_string_array_add_element(
26436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		    &iter_array, "ad-hoc") ||
26446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_AP) &&
26456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_string_array_add_element(
26466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_array, "ap")) ||
26476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) &&
2648b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt	     !wpa_s->conf->p2p_disabled &&
26496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	     !wpa_dbus_dict_string_array_add_element(
26506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		     &iter_array, "p2p")) ||
26516c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_end_string_array(&iter_dict,
265275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_entry,
265375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_val,
265475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_array))
265575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
265675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	/***** Modes end */
265775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
26581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res >= 0) {
26591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_int32_t max_scan_ssid = capa.max_scan_ssids;
26601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
26611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID",
26621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						max_scan_ssid))
26631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			goto nomem;
26641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
26651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
26666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
26676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
26731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
26741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state
26801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
26811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
26821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
26831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
26848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property.
26868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2687d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_state(
2688d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2689d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str_state;
26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *state_ls, *tmp;
26941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
26958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str_state = wpa_supplicant_state_txt(wpa_s->wpa_state);
26978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* make state string lowercase to fit new DBus API convention
26998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	state_ls = tmp = os_strdup(str_state);
27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!tmp) {
27021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
27031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*tmp) {
27068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*tmp = tolower(*tmp);
27078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tmp++;
27088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
27111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						   &state_ls, error);
27128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(state_ls);
27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state
27211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property.
27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2728d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(
2729d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2730d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE;
27341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
27351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
27361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&scanning, error);
27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode
27421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property.
27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2749d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(
2750d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2751d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan = wpa_s->conf->ap_scan;
27551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
27561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
27571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ap_scan, error);
27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode
27631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
27641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
27651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
27661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property.
27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2770d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(
2771d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2772d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
27758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan;
27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
27781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &ap_scan))
27791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) {
27821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
27831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "ap_scan must be 0, 1, or 2");
27841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2791c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast
2792c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2793c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2794c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2795c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2796c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2797c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2798c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property.
2799c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2800d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(
2801d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2802d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
2803c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2804c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2805c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE;
2806c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2807c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
2808c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&fast_reauth, error);
2809c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2810c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2811c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2812c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
2813c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast
2814c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption)
2815c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
2816c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure
2817c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data
2818c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
2819c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *
2820c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property.
2821c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */
2822d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(
2823d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2824d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
2825c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{
2826c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
2827c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	dbus_bool_t fast_reauth;
2828c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2829c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
2830c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt					      &fast_reauth))
2831c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		return FALSE;
2832c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2833c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	wpa_s->conf->fast_reauth = fast_reauth;
2834c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return TRUE;
2835c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}
2836c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2837c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
2838c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/**
283904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect
284004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
284104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
284204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
284304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
284404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
284504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property.  The reason is negative if it is
284604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated.
284704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
2848d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(
2849d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2850d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
285104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
285204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
285304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t reason = wpa_s->disconnect_reason;
28546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
285504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
285604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&reason, error);
285704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
285804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
285904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
286004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age
28621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property.
28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2869d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(
2870d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2871d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age;
28751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
28761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
28771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_age, error);
28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age
28831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
28841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
28851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
28861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property.
28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2890d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(
2891d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2892d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age;
28968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
28981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_age))
28991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) {
29021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
29031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireAge must be >= 10");
29041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count
29121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property.
29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2919d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(
2920d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2921d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
292461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count;
29251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
29261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32,
29271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&expire_count, error);
29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count
29331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property.
29398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2940d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(
2941d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2942d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_count;
29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32,
29481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &expire_count))
29491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) {
29521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
29531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "BSSExpireCount must be > 0");
29541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code
29621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property.
29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2969d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_country(
2970d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2971d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
29728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char country[3];
29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *str = country;
29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[0] = wpa_s->conf->country[0];
29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[1] = wpa_s->conf->country[1];
29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[2] = '\0';
29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
29821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&str, error);
29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code
29881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
29891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
29901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
29911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property.
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2995d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_country(
2996d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
2997d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *country;
30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
30031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &country))
30041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!country[0] || !country[1]) {
30071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
30081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "invalid country code");
30091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) {
30138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "Failed to set country");
30141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
30151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     "failed to set country code");
30161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[0] = country[0];
30208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[1] = country[1];
30211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
302604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval
302704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
302804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
302904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
303004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
303104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
303204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property.
303304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
3034d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(
3035d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3036d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
303704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
303804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
303904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval = wpa_s->scan_interval;
304004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
304104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32,
304204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt						&scan_interval, error);
304304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
304404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
304504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
304604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
304704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval
304804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
304904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure
305004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data
305104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
305204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
305304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property.
305404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
3055d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(
3056d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3057d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
305804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
305904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
306004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_int32_t scan_interval;
306104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
306204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32,
306304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					      &scan_interval))
306404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
306504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
306604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) {
306704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
306804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     "scan_interval must be >= 0");
306904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return FALSE;
307004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
307104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return TRUE;
307204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
307304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
307404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
307504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/**
30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name
30771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
30791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
30801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property.
30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3084d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(
3085d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3086d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname = wpa_s->ifname;
30901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
30911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
30921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&ifname, error);
30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name
30981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
30991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property.
31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3105d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(
3106d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3107d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *driver;
31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) {
31136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpa_printf(MSG_DEBUG, "%s[dbus]: wpa_s has no driver set",
31146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   __func__);
31151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set",
31161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       __func__);
31171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	driver = wpa_s->driver->name;
31211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
31221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&driver, error);
31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path
31281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property.
31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3135d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(
3136d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3137d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf;
31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3142cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->current_bss && wpa_s->dbus_new_path)
31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_bss->id);
31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
31501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bss_obj_path, error);
31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path
31561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property.
31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3163d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(
3164d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3165d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf;
31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3170cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (wpa_s->current_ssid && wpa_s->dbus_new_path)
31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_ssid->id);
31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH,
31781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&net_obj_path, error);
31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type
31841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
31851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
31861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
31871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property.
31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3191d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(
3192d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3193d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *eap_mode;
31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *auth_mode;
31988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX];
31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->wpa_state != WPA_COMPLETED) {
32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = "INACTIVE";
32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X ||
32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eap_mode = wpa_supplicant_get_eap_mode(wpa_s);
32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX,
32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "EAP-%s", eap_mode);
32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = eap_mode_buf;
32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt,
32118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_s->current_ssid->proto);
32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
32151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&auth_mode, error);
32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name
32211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property.
32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3228d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(
3229d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3230d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *bridge_ifname = wpa_s->bridge_ifname;
32346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
32351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
32361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&bridge_ifname, error);
32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects
32421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
32431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
32441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
32451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property.
32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3249d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(
3250d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3251d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *bss;
32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0;
32571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3259cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (!wpa_s->dbus_new_path) {
3260cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3261cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			       "%s: no D-Bus interface", __func__);
3262cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		return FALSE;
3263cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
3264cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
326561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(wpa_s->num_bss, sizeof(char *));
32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
32671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
32681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through scan results and append each result's object path */
32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) {
32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
32748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
32751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
32761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this BSS. */
32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, bss->id);
32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
32861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
32871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, wpa_s->num_bss,
32881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
32928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
32938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
32941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects
33001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
33011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
33021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
33031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property.
33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3307d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(
3308d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3309d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
33128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
33151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3317cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (!wpa_s->dbus_new_path) {
3318cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
3319cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt			       "%s: no D-Bus interface", __func__);
3320cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt		return FALSE;
3321cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	}
3322cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt
33238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
332475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (!network_is_persistent_group(ssid))
332575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			num++;
33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
332761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	paths = os_calloc(num, sizeof(char *));
33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
33291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory");
33301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through configured networks and append object path of each */
33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
333575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (network_is_persistent_group(ssid))
333675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			continue;
33378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
33388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
33396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			dbus_set_error(error, DBUS_ERROR_NO_MEMORY,
33406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				       "no memory");
33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
33428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this network. */
33458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
33468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, ssid->id);
33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter,
33511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 DBUS_TYPE_OBJECT_PATH,
33521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 paths, num, error);
33538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
33558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
33578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
33581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
336301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path
336401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
336501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure
336601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data
336701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 engine path
336801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
336901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11EnginePath" property.
337001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
3371d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_engine_path(
3372d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3373d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
337401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
337501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
337601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	const char *pkcs11_engine_path;
337701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
337801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpa_s->conf->pkcs11_engine_path == NULL)
337901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = "";
338001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	else
338101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path;
338201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
338301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						&pkcs11_engine_path, error);
338401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
338501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
338601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
338701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
338801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path
338901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
339001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure
339101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data
339201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 module path
339301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt *
339401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11ModulePath" property.
339501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */
3396d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_module_path(
3397d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3398d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
339901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{
340001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
340101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	const char *pkcs11_module_path;
340201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
340301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	if (wpa_s->conf->pkcs11_module_path == NULL)
340401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = "";
340501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	else
340601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt		pkcs11_module_path = wpa_s->conf->pkcs11_module_path;
340701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
340801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt						&pkcs11_module_path, error);
340901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt}
341001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
341101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt
341201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/**
34138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface
34141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
34151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
34188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
34198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property.
34208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3421d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(
3422d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3423d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
34248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
34261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter;
34278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob;
34288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
34308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{say}", &variant_iter) ||
34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
34328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "{say}", &dict_iter)) {
34331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
34341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_s->conf->blobs;
34388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (blob) {
34398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_open_container(&dict_iter,
34408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_DICT_ENTRY,
34418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      NULL, &entry_iter) ||
34428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_basic(&entry_iter,
34438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    DBUS_TYPE_STRING,
34448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &(blob->name)) ||
34458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_open_container(&entry_iter,
34468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_ARRAY,
34478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_BYTE_AS_STRING,
34488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &array_iter) ||
34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_fixed_array(&array_iter,
34508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  DBUS_TYPE_BYTE,
34518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  &(blob->data),
34528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  blob->len) ||
34538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&entry_iter,
34548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &array_iter) ||
34558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&dict_iter,
34568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &entry_iter)) {
34571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
34581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
34591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return FALSE;
34608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
34618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		blob = blob->next;
34638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) ||
34661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
34671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
34681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
34698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
34721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
34731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
34741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
3475d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_iface_global(
3476d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3477d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
3478d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{
3479d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
3480d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	int ret;
3481d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	char buf[250];
3482d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	char *p = buf;
3483d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3484d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (!property_desc->data) {
3485d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
3486d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       "Unhandled interface property %s",
3487d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       property_desc->dbus_property);
3488d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		return FALSE;
3489d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	}
3490d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3491d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	ret = wpa_config_get_value(property_desc->data, wpa_s->conf, buf,
3492d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt				   sizeof(buf));
3493d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (ret < 0)
3494d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		*p = '\0';
3495d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3496d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, &p,
3497d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt						error);
3498d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt}
3499d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3500d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3501d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_iface_global(
3502d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3503d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
3504d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{
3505d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	struct wpa_supplicant *wpa_s = user_data;
3506d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const char *new_value = NULL;
3507d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	char buf[250];
3508d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	size_t combined_len;
3509d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	int ret;
3510d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3511d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
3512d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt					      &new_value))
3513d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		return FALSE;
3514d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3515d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	combined_len = os_strlen(property_desc->data) + os_strlen(new_value) +
3516d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		3;
3517d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (combined_len >= sizeof(buf)) {
3518d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
3519d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       "Interface property %s value too large",
3520d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       property_desc->dbus_property);
3521d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		return FALSE;
3522d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	}
3523d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3524d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (!new_value[0])
3525d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		new_value = "NULL";
3526d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3527d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	ret = os_snprintf(buf, combined_len, "%s=%s", property_desc->data,
3528d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			  new_value);
3529d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (os_snprintf_error(combined_len, ret)) {
3530d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		dbus_set_error(error,  WPAS_DBUS_ERROR_UNKNOWN_ERROR,
3531d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       "Failed to construct new interface property %s",
3532d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       property_desc->dbus_property);
3533d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		return FALSE;
3534d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	}
3535d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3536d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	if (wpa_config_process_global(wpa_s->conf, buf, -1)) {
3537d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
3538d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       "Failed to set interface property %s",
3539d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt			       property_desc->dbus_property);
3540d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt		return FALSE;
3541d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	}
3542d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3543d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	wpa_supplicant_update_config(wpa_s);
3544d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	return TRUE;
3545d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt}
3546d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
3547d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt
35481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args,
35491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       DBusError *error, const char *func_name)
35501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
35511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id);
35521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
35531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res) {
35541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found",
35556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt			   func_name, args->id);
35561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error(error, DBUS_ERROR_FAILED,
35571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       "%s: BSS %d not found",
35581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			       func_name, args->id);
35591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
35601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
35611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS
35671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property.
35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3574d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(
3575d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3576d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
35778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
35791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
35808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
35821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
35831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
35848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
35861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->bssid, ETH_ALEN,
35871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
35888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
35928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS
35931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
35941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
35951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
35961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property.
35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3600d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(
3601d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3602d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
36051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
36081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
36091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
36121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res->ssid, res->ssid_len,
36131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
36188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS
36191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
36201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
36211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
36221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
36248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property.
36258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3626d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(
3627d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3628d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
36311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
36328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t privacy;
36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
36351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
36361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE;
36391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
36401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&privacy, error);
36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
36458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS
36461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
36471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
36481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
36491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
36508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
36518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property.
36528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3653d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(
3654d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3655d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
36568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
36581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
36598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *mode;
36608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
36621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
36631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
366476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	if (bss_is_dmg(res)) {
366576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		switch (res->caps & IEEE80211_CAP_DMG_MASK) {
366676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_PBSS:
366776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_IBSS:
366876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "ad-hoc";
366976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			break;
367076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		case IEEE80211_CAP_DMG_AP:
367176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "infrastructure";
367276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			break;
367376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		}
367476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	} else {
367576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		if (res->caps & IEEE80211_CAP_IBSS)
367676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "ad-hoc";
367776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt		else
367876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt			mode = "infrastructure";
367976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt	}
36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
36821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&mode, error);
36838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS
36881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
36891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
36901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
36911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
36928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property.
36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3695d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(
3696d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3697d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3701c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	s16 level;
37028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3707c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	level = (s16) res->level;
37081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16,
3709c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&level, error);
37108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
37148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS
37151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
37161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
37171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
37181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property.
37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3722d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(
3723d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3724d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
3728c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	u16 freq;
37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3734c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	freq = (u16) res->freq;
37351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16,
3736c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt						&freq, error);
37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b)
37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return (*(u8 *) b - *(u8 *) a);
37438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS
37481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
37491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
37501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
37511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property.
37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3755d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(
3756d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3757d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
37601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
37618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ie_rates = NULL;
37628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 *real_rates;
37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int rates_num, i;
37641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
37671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
37681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	rates_num = wpa_bss_get_bit_rates(res, &ie_rates);
37718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (rates_num < 0)
37721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	qsort(ie_rates, rates_num, 1, cmp_u8s_desc);
37758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	real_rates = os_malloc(sizeof(u32) * rates_num);
37778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!real_rates) {
37788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(ie_rates);
37791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
37801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
37818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < rates_num; i++)
37848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		real_rates[i] = ie_rates[i] * 500000;
37858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32,
37871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 real_rates, rates_num,
37881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt							 error);
37898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ie_rates);
37918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(real_rates);
37921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
37938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3796d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(
3797d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3798d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, struct wpa_ie_data *ie_data, DBusError *error)
37998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
38001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *group;
3802fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	const char *pairwise[5]; /* max 5 pairwise ciphers is supported */
3803807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt	const char *key_mgmt[9]; /* max 9 key managements may be supported */
38048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
38058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
38078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{sv}", &variant_iter))
38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* KeyMgmt */
38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
38158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK)
38168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk";
38178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK)
38188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-psk";
38198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256)
38208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk-sha256";
38218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X)
38228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap";
38238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
38248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-eap";
38258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)
38268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-sha256";
3827807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB
38286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B)
38296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		key_mgmt[n++] = "wpa-eap-suite-b";
3830807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB */
3831807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB192
3832807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
3833807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-suite-b-192";
3834807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB192 */
38358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE)
38368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-none";
38378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt",
38398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       key_mgmt, n))
38408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
38418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Group */
38438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch (ie_data->group_cipher) {
38448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP40:
38458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep40";
38468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
38478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_TKIP:
38488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "tkip";
38498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
38508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_CCMP:
38518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "ccmp";
38528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
385361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	case WPA_CIPHER_GCMP:
385461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		group = "gcmp";
385561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		break;
38568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP104:
38578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep104";
38588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
3859fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	case WPA_CIPHER_CCMP_256:
3860fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		group = "ccmp-256";
3861fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		break;
3862fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	case WPA_CIPHER_GCMP_256:
3863fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		group = "gcmp-256";
3864fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		break;
38658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
38668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "";
38678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
38688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
38698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group))
38718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
38728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Pairwise */
38748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
38758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP)
38768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "tkip";
38778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP)
38788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "ccmp";
387961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP)
388061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pairwise[n++] = "gcmp";
3881fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP_256)
3882fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		pairwise[n++] = "ccmp-256";
3883fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP_256)
3884fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt		pairwise[n++] = "gcmp-256";
38858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise",
38878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       pairwise, n))
38888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
38898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Management group (RSN only) */
38918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->proto == WPA_PROTO_RSN) {
38928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (ie_data->mgmt_group_cipher) {
38938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
38948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case WPA_CIPHER_AES_128_CMAC:
38958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "aes128cmac";
38968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
38978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
38988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
38998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "";
39008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
39018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
39028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup",
39048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 group))
39058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
39068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
39096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
39108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
39118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
39138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
39151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
39161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return FALSE;
39178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
39218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS
39221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
39231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
39241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
39251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
39268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
39278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property.
39288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3929d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(
3930d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3931d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
39328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
39341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
39358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
39368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
39378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
39391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
39401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
39418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
39438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE);
39446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
39456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
39466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "failed to parse WPA IE");
39476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
39488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3950d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	return wpas_dbus_get_bss_security_prop(property_desc, iter, &wpa_data, error);
39518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS
39561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
39571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
39581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
39591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
39608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
39618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property.
39628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3963d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(
3964d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3965d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
39668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
39681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
39698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
39708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
39718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
39731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
39741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
39758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
39778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_ie(res, WLAN_EID_RSN);
39786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) {
39796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_FAILED,
39806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt				     "failed to parse RSN IE");
39816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return FALSE;
39828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
39838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3984d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	return wpas_dbus_get_bss_security_prop(property_desc, iter, &wpa_data, error);
39858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3989d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS
3990d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter
3991d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure
3992d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data
3993d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure
3994d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt *
3995d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property.
3996d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */
3997d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(
3998d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
3999d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
4000d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
4001d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct bss_handler_args *args = user_data;
4002d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpa_bss *res;
4003d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
4004d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	struct wpabuf *wps_ie;
4005d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
4006d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	DBusMessageIter iter_dict, variant_iter;
40078347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt	int wps_support = 0;
4008d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	const char *type = "";
4009d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4010d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	res = get_bss_helper(args, error, __func__);
4011d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!res)
4012d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return FALSE;
4013d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4014d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
40156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt					      "a{sv}", &variant_iter) ||
40166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
4017d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
4018d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4019d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS
4020d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE);
4021d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (wps_ie) {
40228347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt		wps_support = 1;
4023d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		if (wps_is_selected_pbc_registrar(wps_ie))
4024d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pbc";
4025d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		else if (wps_is_selected_pin_registrar(wps_ie))
4026d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt			type = "pin";
40276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt
40286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		wpabuf_free(wps_ie);
4029d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	}
4030d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */
4031d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
40328347444e0bfb85e4550817fc99903f38ce8f5bccDmitry Shmidt	if ((wps_support && !wpa_dbus_dict_append_string(&iter_dict, "Type", type)) ||
40336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) ||
40346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter))
4035d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		goto nomem;
4036d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4037d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return TRUE;
4038d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4039d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem:
4040d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
4041d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return FALSE;
4042d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
4043d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4044d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
4045d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/**
40468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS
40471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
40481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
40491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
40501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
40518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
40528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property.
40538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4054d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(
4055d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4056d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
40578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
40581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct bss_handler_args *args = user_data;
40591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct wpa_bss *res;
40608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = get_bss_helper(args, error, __func__);
40621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!res)
40631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
40648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
40661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      res + 1, res->ie_len,
40671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						      error);
40688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
40698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
40718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
4072661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen
4073661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @iter: Pointer to incoming dbus message iter
4074661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @error: Location to store error on failure
4075661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @user_data: Function specific data
4076661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: TRUE on success, FALSE on failure
4077661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt *
4078661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Getter for BSS age
4079661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */
4080d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_age(
4081d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4082d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
4083661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
4084661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct bss_handler_args *args = user_data;
4085661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct wpa_bss *res;
4086661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	struct os_reltime now, diff = { 0, 0 };
4087661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	u32 age;
4088661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4089661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	res = get_bss_helper(args, error, __func__);
4090661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (!res)
4091661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		return FALSE;
4092661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4093661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	os_get_reltime(&now);
4094661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	os_reltime_sub(&now, &res->last_update, &diff);
4095661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	age = diff.sec > 0 ? diff.sec : 0;
4096661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age,
4097661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt						error);
4098661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
4099661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4100661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
4101661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/**
41028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled
41031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
41041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
41051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
41061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
41078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
41088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network.
41098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4110d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(
4111d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4112d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
41138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
41141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
41158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE;
41161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
41171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
41181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						&enabled, error);
41198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
41208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
41238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled
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 * Setter for "Enabled" property of a configured network.
41308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4131d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(
4132d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4133d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
41348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
41351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
41368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
41378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
41388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enable;
41398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
41411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &enable))
41421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
41438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = net->wpa_s;
41458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = net->ssid;
41468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (enable)
41488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_enable_network(wpa_s, ssid);
41498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
41508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_disable_network(wpa_s, ssid);
41518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return TRUE;
41538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
41548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
41578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network
41581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
41591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
41601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
41611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
41628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
41638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network.
41648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4165d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(
4166d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4167d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
41688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
41691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
41701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter, dict_iter;
41718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **iterator;
41728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **props = wpa_config_get_all(net->ssid, 1);
41731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_bool_t success = FALSE;
41748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!props) {
41761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
41771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return FALSE;
41788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
41798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}",
41811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					      &variant_iter) ||
41828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) {
41831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
41848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
41858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
41868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
41888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
41898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&dict_iter, *iterator,
41908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 *(iterator + 1))) {
41911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY,
41921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					     "no memory");
41938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
41948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
41958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator += 2;
41968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
41978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
41998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) ||
42001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	    !dbus_message_iter_close_container(iter, &variant_iter)) {
42011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
42028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
42038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
42048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	success = TRUE;
42061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
42078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
42088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
42098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
42108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(*iterator);
42118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator++;
42128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
42138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(props);
42141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return success;
42158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
42168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
42198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network
42201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter
42211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure
42221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data
42231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure
42248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
42258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network.
42268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4227d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(
4228d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	const struct wpa_dbus_property_desc *property_desc,
4229d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt	DBusMessageIter *iter, DBusError *error, void *user_data)
42308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
42311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct network_handler_args *net = user_data;
42328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = net->ssid;
42331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	DBusMessageIter	variant_iter;
42348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
42351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dbus_message_iter_recurse(iter, &variant_iter);
42361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return set_network_properties(net->wpa_s, ssid, &variant_iter, error);
42378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
423804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
423904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
424004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP
424104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
424204949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq(
424304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
424404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
424504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
424604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *name;
424704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
424804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer != NULL) {
424904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (os_strcmp(dbus_message_get_sender(message),
425004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			      wpa_s->preq_notify_peer) == 0)
425104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
425204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
425304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
425404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE,
425504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Another application is already subscribed");
425604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
425704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
425804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	name = os_strdup(dbus_message_get_sender(message));
425904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!name)
42606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt		return wpas_dbus_error_no_memory(message);
426104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
426204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = name;
426304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
426404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Subscribe to clean up if application closes socket */
426504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_subscribe_noc(priv);
426604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
426704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/*
426804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * Double-check it's still alive to make sure that we didn't
426904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 * miss the NameOwnerChanged signal, e.g. while strdup'ing.
427004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	 */
427104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!dbus_bus_name_has_owner(priv->con, name, NULL)) {
427204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		/*
427304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Application no longer exists, clean up.
427404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * The return value is irrelevant now.
427504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 *
427604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * Need to check if the NameOwnerChanged handling
427704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * already cleaned up because we have processed
427804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * DBus messages while checking if the name still
427904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 * has an owner.
428004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		 */
428104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		if (!wpa_s->preq_notify_peer)
428204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			return NULL;
428304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(wpa_s->preq_notify_peer);
428404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpa_s->preq_notify_peer = NULL;
428504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		wpas_dbus_unsubscribe_noc(priv);
428604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
428704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
428804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
428904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
429004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
429104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
429204949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq(
429304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
429404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
429504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
429604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
429704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_s->preq_notify_peer)
429804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
429904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_NO_SUBSCRIPTION,
430004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Not subscribed");
430104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
430204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_strcmp(wpa_s->preq_notify_peer,
430304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		      dbus_message_get_sender(message)))
430404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return dbus_message_new_error(message,
430504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM,
430604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			"Can't unsubscribe others");
430704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
430804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_free(wpa_s->preq_notify_peer);
430904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s->preq_notify_peer = NULL;
431004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpas_dbus_unsubscribe_noc(priv);
431104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return NULL;
431204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
431304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
431404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
431504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s,
431604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *addr, const u8 *dst, const u8 *bssid,
431704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			   const u8 *ie, size_t ie_len, u32 ssi_signal)
431804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
431904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessage *msg;
432004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	DBusMessageIter iter, dict_iter;
432104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
432204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
432304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	/* Do nothing if the control interface is not turned on */
4324cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt	if (priv == NULL || !wpa_s->dbus_new_path)
432504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
432604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
432704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->preq_notify_peer == NULL)
432804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
432904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
433004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
433104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      WPAS_DBUS_NEW_IFACE_INTERFACE,
433204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      "ProbeRequest");
433304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (msg == NULL)
433404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
433504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
433604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_set_destination(msg, wpa_s->preq_notify_peer);
433704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
433804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_iter_init_append(msg, &iter);
433904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
43406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	if (!wpa_dbus_dict_open_write(&iter, &dict_iter) ||
43416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr",
43426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      (const char *) addr,
43436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						      ETH_ALEN)) ||
43446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst",
43456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						     (const char *) dst,
43466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						     ETH_ALEN)) ||
43476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid",
43486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       (const char *) bssid,
43496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       ETH_ALEN)) ||
43506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies",
43516c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							      (const char *) ie,
43526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt							      ie_len)) ||
43536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal",
43546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt						       ssi_signal)) ||
43556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt	    !wpa_dbus_dict_close_write(&iter, &dict_iter))
435604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
435704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
435804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_connection_send(priv->con, msg, NULL);
435904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	goto out;
436004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail:
436104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
436204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout:
436304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	dbus_message_unref(msg);
436404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
436504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
436604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */
436755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
436855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
436955840adb6cd32ca52064f327b72a40e769f70661Dmitry ShmidtDBusMessage * wpas_dbus_handler_vendor_elem_add(DBusMessage *message,
437055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt						struct wpa_supplicant *wpa_s)
437155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt{
437255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	u8 *ielems;
437355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	int len;
437455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	struct ieee802_11_elems elems;
437555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_int32_t frame_id;
437655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	DBusMessageIter	iter, array;
437755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
437855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_init(message, &iter);
437955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &frame_id);
438055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (frame_id < 0 || frame_id >= NUM_VENDOR_ELEM_FRAMES) {
438155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
438255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Invalid ID");
438355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
438455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
438555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_next(&iter);
438655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array);
438755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array, &ielems, &len);
438855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!ielems || len == 0) {
438955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(
439055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt			message, DBUS_ERROR_INVALID_ARGS, "Invalid value");
439155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
439255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
439355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (ieee802_11_parse_elems(ielems, len, &elems, 0) == ParseFailed) {
439455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
439555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Parse error");
439655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
439755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
439855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	wpa_s = wpas_vendor_elem(wpa_s, frame_id);
439955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!wpa_s->vendor_elem[frame_id]) {
440055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		wpa_s->vendor_elem[frame_id] = wpabuf_alloc_copy(ielems, len);
440155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		wpas_vendor_elem_update(wpa_s);
440255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return NULL;
440355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
440455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
440555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (wpabuf_resize(&wpa_s->vendor_elem[frame_id], len) < 0) {
440655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
440755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Resize error");
440855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
440955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
441055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	wpabuf_put_data(wpa_s->vendor_elem[frame_id], ielems, len);
441155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	wpas_vendor_elem_update(wpa_s);
441255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	return NULL;
441355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt}
441455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
441555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
441655840adb6cd32ca52064f327b72a40e769f70661Dmitry ShmidtDBusMessage * wpas_dbus_handler_vendor_elem_get(DBusMessage *message,
441755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt						struct wpa_supplicant *wpa_s)
441855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt{
441955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	DBusMessage *reply;
442055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	DBusMessageIter	iter, array_iter;
442155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_int32_t frame_id;
442255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	const u8 *elem;
442355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	size_t elem_len;
442455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
442555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_init(message, &iter);
442655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &frame_id);
442755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
442855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (frame_id < 0 || frame_id >= NUM_VENDOR_ELEM_FRAMES) {
442955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
443055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Invalid ID");
443155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
443255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
443355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	wpa_s = wpas_vendor_elem(wpa_s, frame_id);
443455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!wpa_s->vendor_elem[frame_id]) {
443555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
443655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "ID value does not exist");
443755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
443855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
443955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	reply = dbus_message_new_method_return(message);
444055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!reply)
444155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return wpas_dbus_error_no_memory(message);
444255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
444355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
444455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
444555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	elem = wpabuf_head_u8(wpa_s->vendor_elem[frame_id]);
444655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	elem_len = wpabuf_len(wpa_s->vendor_elem[frame_id]);
444755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
444855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
444955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      DBUS_TYPE_BYTE_AS_STRING,
445055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      &array_iter) ||
445155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	    !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE,
445255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt						  &elem, elem_len) ||
445355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	    !dbus_message_iter_close_container(&iter, &array_iter)) {
445455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		dbus_message_unref(reply);
445555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		reply = wpas_dbus_error_no_memory(message);
445655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
445755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
445855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	return reply;
445955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt}
446055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
446155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
446255840adb6cd32ca52064f327b72a40e769f70661Dmitry ShmidtDBusMessage * wpas_dbus_handler_vendor_elem_remove(DBusMessage *message,
446355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt						   struct wpa_supplicant *wpa_s)
446455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt{
446555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	u8 *ielems;
446655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	int len;
446755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	struct ieee802_11_elems elems;
446855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	DBusMessageIter	iter, array;
446955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_int32_t frame_id;
447055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
447155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_init(message, &iter);
447255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &frame_id);
447355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (frame_id < 0 || frame_id >= NUM_VENDOR_ELEM_FRAMES) {
447455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
447555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Invalid ID");
447655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
447755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
447855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_next(&iter);
447955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array);
448055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array, &ielems, &len);
448155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!ielems || len == 0) {
448255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
448355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Invalid value");
448455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
448555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
448655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	wpa_s = wpas_vendor_elem(wpa_s, frame_id);
448755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
448855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (len == 1 && *ielems == '*') {
448955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		wpabuf_free(wpa_s->vendor_elem[frame_id]);
449055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		wpa_s->vendor_elem[frame_id] = NULL;
449155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		wpas_vendor_elem_update(wpa_s);
449255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return NULL;
449355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
449455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
449555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (!wpa_s->vendor_elem[frame_id]) {
449655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
449755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "ID value does not exist");
449855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
449955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
450055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (ieee802_11_parse_elems(ielems, len, &elems, 0) == ParseFailed) {
450155840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
450255840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt					      "Parse error");
450355840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	}
450455840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
450555840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	if (wpas_vendor_elem_remove(wpa_s, frame_id, ielems, len) == 0)
450655840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt		return NULL;
450755840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt
450855840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt	return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS,
450955840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt				      "Not found");
451055840adb6cd32ca52064f327b72a40e769f70661Dmitry Shmidt}
4511