dbus_new_handlers.c revision 75ecf5267604f166b85a7ee2cf0d9cb682966680
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant / dbus-based control interface
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009-2010, Witold Sowa <witold.sowa@gmail.com>
58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This program is free software; you can redistribute it and/or modify
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it under the terms of the GNU General Public License version 2 as
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * published by the Free Software Foundation.
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * license.
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See README and COPYING for more details.
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h"
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h"
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_peer/eap_methods.h"
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eapol_supp/eapol_supp_sm.h"
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rsn_supp/wpa.h"
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../config.h"
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wpa_supplicant_i.h"
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../driver_i.h"
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../notify.h"
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wpas_glue.h"
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../bss.h"
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../scan.h"
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_helpers.h"
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new.h"
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_handlers.h"
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_dict_helpers.h"
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_level;
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_show_keys;
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_timestamp;
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *debug_strings[] = {
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_unknown_error - Return a new InvalidArgs error message
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message,
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    const char *arg)
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * This function can be called as a result of a failure
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * within internal getter calls, which will call this function
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * with a NULL message parameter.  However, dbus_message_new_error
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * looks very unkindly (i.e, abort()) on a NULL message, so
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * in this case, we should not call it.
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (message == NULL) {
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_INFO, "dbus: wpas_dbus_error_unknown_error "
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "called with NULL message (arg=%s)",
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   arg ? arg : "N/A");
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR,
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      arg);
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message)
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_UNKNOWN,
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "wpa_supplicant knows nothing about "
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "this interface.");
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message)
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN,
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "There is no such a network in this "
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "interface.");
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message,
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const char *arg)
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_error(message, WPAS_DBUS_ERROR_INVALID_ARGS,
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "Did not receive correct message "
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "arguments.");
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (arg != NULL)
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg,
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 DBUS_TYPE_INVALID);
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *dont_quote[] = {
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap",
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path",
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	"bssid", NULL
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key)
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i = 0;
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dont_quote[i] != NULL) {
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, dont_quote[i]) == 0)
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return FALSE;
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		i++;
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return TRUE;
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init()
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path(
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_global *global, const char *path)
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(wpa_s->dbus_new_path, path) == 0)
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return wpa_s;
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set.
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL when succeed or DBus error on failure
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
17575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni MalinenDBusMessage * set_network_properties(DBusMessage *message,
17675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				     struct wpa_supplicant *wpa_s,
17775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				     struct wpa_ssid *ssid,
17875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				     DBusMessageIter *iter)
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING };
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter_dict;
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_read(iter, &iter_dict))
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_invalid_args(message, NULL);
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char *value = NULL;
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t size = 50;
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int ret;
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) {
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(message, NULL);
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (entry.type == DBUS_TYPE_ARRAY &&
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    entry.array_type == DBUS_TYPE_BYTE) {
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (entry.array_len <= 0)
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			size = entry.array_len * 2 + 1;
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = wpa_snprintf_hex(value, size,
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       (u8 *) entry.bytearray_value,
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       entry.array_len);
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_STRING) {
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (should_quote_opt(entry.key)) {
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size = os_strlen(entry.str_value);
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (size <= 0)
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				size += 3;
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_zalloc(size);
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				ret = os_snprintf(value, size, "\"%s\"",
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  entry.str_value);
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (ret < 0 || (size_t) ret != (size - 1))
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				value = os_strdup(entry.str_value);
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (value == NULL)
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto error;
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_UINT32) {
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%u",
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.uint32_value);
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (entry.type == DBUS_TYPE_INT32) {
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			value = os_zalloc(size);
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (value == NULL)
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ret = os_snprintf(value, size, "%d",
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  entry.int32_value);
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ret <= 0)
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_config_set(ssid, entry.key, value, 0) < 0)
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((os_strcmp(entry.key, "psk") == 0 &&
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     value[0] == '"' && ssid->ssid_len) ||
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    (strcmp(entry.key, "ssid") == 0 && ssid->passphrase))
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_psk(ssid);
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if (os_strcmp(entry.key, "priority") == 0)
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_config_update_prio_list(wpa_s->conf);
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(value);
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_dbus_dict_entry_clear(&entry);
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		continue;
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	error:
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(value);
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, entry.key);
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_dbus_dict_entry_clear(&entry);
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The DBus message containing response for Properties.Get call
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or DBus error message if error occurred.
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic.
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_simple_property_getter(DBusMessage *message,
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       const int type, const void *val)
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, variant_iter;
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "dbus: wpas_dbus_simple_property_getter:"
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   " given type is not basic");
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_unknown_error(message, NULL);
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (message == NULL)
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL);
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_method_return(message);
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply != NULL) {
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_init_append(reply, &iter);
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_open_container(
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter, DBUS_TYPE_VARIANT,
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_dbus_type_as_string(type), &variant_iter) ||
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_basic(&variant_iter, type,
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    val) ||
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&iter, &variant_iter)) {
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_ERROR, "dbus: "
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "wpas_dbus_simple_property_getter: out of "
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "memory to put property value into "
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "message");
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_unref(reply);
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_error(message,
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       DBUS_ERROR_NO_MEMORY,
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       NULL);
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "dbus: wpas_dbus_simple_property_getter:"
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   " out of memory to return property value");
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type)
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL or DBus error message if error occurred.
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic.
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_simple_property_setter(DBusMessage *message,
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       const int type, void *val)
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, variant_iter;
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "dbus: wpas_dbus_simple_property_setter:"
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   " given type is not basic");
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_unknown_error(message, NULL);
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_init(message, &iter)) {
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "dbus: wpas_dbus_simple_property_setter:"
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   " out of memory to return scanning state");
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* omit first and second argument and get value from third */
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &variant_iter);
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&variant_iter) != type) {
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "dbus: wpas_dbus_simple_property_setter:"
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   " wrong property type");
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_invalid_args(message,
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    "wrong property type");
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&variant_iter, val);
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type)
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The DBus message containing response for Properties.Get call
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or DBus error message if error occurred.
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic.
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_simple_array_property_getter(DBusMessage *message,
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     const int type,
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     const void *array,
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     size_t array_len)
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, variant_iter, array_iter;
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char type_str[] = "a?"; /* ? will be replaced with subtype letter; */
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *sub_type_str;
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t element_size, i;
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_type_is_basic(type)) {
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "dbus: "
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_simple_array_property_getter: given "
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "type is not basic");
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_unknown_error(message, NULL);
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	sub_type_str = wpa_dbus_type_as_string(type);
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	type_str[1] = sub_type_str[0];
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (message == NULL)
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL);
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_method_return(message);
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL) {
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "dbus: "
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_simple_array_property_getter: out of "
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "memory to create return message");
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      type_str, &variant_iter) ||
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      sub_type_str, &array_iter)) {
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "dbus: "
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_simple_array_property_getter: out of "
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "memory to open container");
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch(type) {
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BYTE:
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_BOOLEAN:
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = 1;
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT16:
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT16:
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint16_t);
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT32:
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT32:
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint32_t);
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_INT64:
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_UINT64:
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(uint64_t);
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_DOUBLE:
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(double);
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_STRING:
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case DBUS_TYPE_OBJECT_PATH:
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = sizeof(char *);
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "dbus: "
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_simple_array_property_getter: "
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "fatal: unknown element type");
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		element_size = 1;
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < array_len; i++) {
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_append_basic(&array_iter, type,
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       array + i * element_size);
4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &array_iter) ||
4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_close_container(&iter, &variant_iter)) {
4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "dbus: "
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_simple_array_property_getter: out of "
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "memory to close container");
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object,
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant
4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage.
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter_dict;
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter;
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_dbus_dict_entry entry;
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *driver = NULL;
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *confname = NULL;
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *bridge_ifname = NULL;
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_read(&iter, &iter_dict))
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error;
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!strcmp(entry.key, "Driver") &&
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    (entry.type == DBUS_TYPE_STRING)) {
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			driver = os_strdup(entry.str_value);
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (driver == NULL)
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (!strcmp(entry.key, "Ifname") &&
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   (entry.type == DBUS_TYPE_STRING)) {
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(entry.str_value);
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ifname == NULL)
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (!strcmp(entry.key, "ConfigFile") &&
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   (entry.type == DBUS_TYPE_STRING)) {
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			confname = os_strdup(entry.str_value);
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (confname == NULL)
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (!strcmp(entry.key, "BridgeIfname") &&
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   (entry.type == DBUS_TYPE_STRING)) {
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			bridge_ifname = os_strdup(entry.str_value);
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (bridge_ifname == NULL)
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto error;
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_dbus_dict_entry_clear(&entry);
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto error;
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto error; /* Required Ifname argument missing */
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Try to get the wpa_supplicant record for this iface, return
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * an error if we already control it.
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_get_iface(global, ifname) != NULL) {
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message,
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       WPAS_DBUS_ERROR_IFACE_EXISTS,
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       "wpa_supplicant already "
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       "controls this interface.");
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_supplicant *wpa_s;
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		struct wpa_interface iface;
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memset(&iface, 0, sizeof(iface));
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.driver = driver;
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.ifname = ifname;
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.confname = confname;
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iface.bridge_ifname = bridge_ifname;
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Otherwise, have wpa_supplicant attach to it. */
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((wpa_s = wpa_supplicant_add_iface(global, &iface))) {
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *path = wpa_s->dbus_new_path;
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_method_return(message);
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH,
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			                         &path, DBUS_TYPE_INVALID);
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_unknown_error(
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "wpa_supplicant couldn't grab this "
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"interface.");
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(driver);
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ifname);
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(bridge_ifname);
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror:
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_error_invalid_args(message, NULL);
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	goto out;
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          failure (0), or returns a dbus error message with more information
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call.  Handles requests
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages.
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message,
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_global *global)
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *path;
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path,
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = get_iface_by_dbus_path(global, path);
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_iface_unknown(message);
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (wpa_supplicant_remove_iface(global, wpa_s)) {
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "wpa_supplicant couldn't remove this "
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"interface.");
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object,
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          or a dbus error message with more information
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call.
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message,
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      struct wpa_global *global)
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname;
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *path;
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname,
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = wpa_supplicant_get_iface(global, ifname);
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s == NULL)
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_iface_unknown(message);
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	path = wpa_s->dbus_new_path;
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL)
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: DBus message with value of debug level
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property.
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_debug_level(DBusMessage *message,
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct wpa_global *global)
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str;
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int idx = wpa_debug_level;
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx < 0)
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 0;
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx > 5)
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		idx = 5;
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str = debug_strings[idx];
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING,
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&str);
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: DBus message with value of debug timestamp
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property.
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_debug_timestamp(DBusMessage *message,
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_global *global)
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_BOOLEAN,
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&wpa_debug_timestamp);
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: DBus message with value of debug show_keys
7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property.
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_debug_show_keys(DBusMessage *message,
7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_global *global)
7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_BOOLEAN,
7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&wpa_debug_show_keys);
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: %NULL or DBus error message
7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property.
7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_debug_level(DBusMessage *message,
7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct wpa_global *global)
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str = NULL;
7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, val = -1;
7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_STRING,
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &str);
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return reply;
7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; debug_strings[i]; i++)
7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(debug_strings[i], str) == 0) {
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			val = i;
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (val < 0 ||
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp,
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    wpa_debug_show_keys)) {
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_invalid_args(
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong debug level value");
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp
7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: %NULL or DBus error message
7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property.
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_debug_timestamp(DBusMessage *message,
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_global *global)
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_BOOLEAN,
7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &val);
7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return reply;
7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0,
7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_show_keys);
7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys
7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: %NULL or DBus error message
7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property.
7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_debug_show_keys(DBusMessage *message,
7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_global *global)
7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t val;
7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_BOOLEAN,
7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &val);
8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return reply;
8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_set_debug_params(global, wpa_debug_level,
8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_debug_timestamp,
8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					val ? 1 : 0);
8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list
8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure
8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object paths array containing registered interfaces
8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * objects paths or DBus error on failure
8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests
8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects
8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths
8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_interfaces(DBusMessage *message,
8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  struct wpa_global *global)
8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char **paths;
8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		num++;
8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	paths = os_zalloc(num * sizeof(char*));
8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i++] = wpa_s->dbus_new_path;
8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_array_property_getter(message,
8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       DBUS_TYPE_OBJECT_PATH,
8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       paths, num);
8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list
8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @nothing: not used argument. may be NULL or anything else
8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object paths array containing supported EAP methods
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * represented by strings or DBus error on failure
8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests
8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods
8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_eap_methods(DBusMessage *message, void *nothing)
8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **eap_methods;
8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t num_items = 0;
8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eap_methods = eap_get_names_as_string_array(&num_items);
8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!eap_methods) {
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_array_property_getter(message,
8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       DBUS_TYPE_STRING,
8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       eap_methods, num_items);
8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (num_items)
8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(eap_methods[--num_items]);
8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(eap_methods);
8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var,
8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char **type, DBusMessage **reply)
8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) {
8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Type must be a string");
8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Type value type. String required");
8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(var, type);
8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var,
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    struct wpa_driver_scan_params *params,
9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    DBusMessage **reply)
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_ssid *ssids = params->ssids;
9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t ssids_num = 0;
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ssid;
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids "
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "must be an array of arrays of bytes");
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong SSIDs value type. Array of arrays of "
9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"bytes required");
9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE)
9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ssids "
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "must be an array of arrays of bytes");
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong SSIDs value type. Array of arrays of "
9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"bytes required");
9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY)
9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ssids_num >= WPAS_MAX_SCAN_SSIDS) {
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Too many ssids specified on scan dbus "
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "call");
9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "Too many ssids specified. Specify "
9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"at most four");
9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len != 0) {
9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = os_malloc(len);
9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (ssid == NULL) {
9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_printf(MSG_DEBUG,
9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   "wpas_dbus_handler_scan[dbus]: "
9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   "out of memory. Cannot allocate "
9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   "memory for SSID");
9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				*reply = dbus_message_new_error(
9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					message, DBUS_ERROR_NO_MEMORY, NULL);
9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_memcpy(ssid, val, len);
9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Allow zero-length SSIDs */
9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = NULL;
9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid = ssid;
9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids[ssids_num].ssid_len = len;
9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssids_num++;
9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->num_ssids = ssids_num;
9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var,
9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  struct wpa_driver_scan_params *params,
9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  DBusMessage **reply)
9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ies = NULL, *nies;
9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ies_len = 0;
9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *val;
9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int len;
9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must "
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "be an array of arrays of bytes");
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong IEs value type. Array of arrays of "
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"bytes required");
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY ||
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE)
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: ies must "
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "be an array of arrays of bytes");
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong IEs value type. Array required");
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY)
10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len);
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (len == 0) {
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_iter_next(&array_iter);
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		nies = os_realloc(ies, ies_len + len);
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (nies == NULL) {
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "out of memory. Cannot allocate memory for "
10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "IE");
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ies);
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = dbus_message_new_error(
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, DBUS_ERROR_NO_MEMORY, NULL);
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies = nies;
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_memcpy(ies + ies_len, val, len);
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ies_len += len;
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies = ies;
10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->extra_ies_len = ies_len;
10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message,
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessageIter *var,
10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_driver_scan_params *params,
10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       DBusMessage **reply)
10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter array_iter, sub_array_iter;
10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int *freqs = NULL, *nfreqs;
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int freqs_num = 0;
10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) {
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Channels must be an array of structs");
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Channels value type. Array of structs "
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"required");
10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(var, &array_iter);
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) {
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG,
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_handler_scan[dbus]: Channels must be an "
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "array of structs");
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = wpas_dbus_error_invalid_args(
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "Wrong Channels value type. Array of structs "
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"required");
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT)
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int freq, width;
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&array_iter, &sub_array_iter);
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dbus_message_iter_get_arg_type(&sub_array_iter) !=
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Channel must by specified by struct of "
10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "two UINT32s %c",
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   dbus_message_iter_get_arg_type(
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   &sub_array_iter));
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "Wrong Channel struct. Two UINT32s "
10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"required");
10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &freq);
10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_next(&sub_array_iter) ||
10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    dbus_message_iter_get_arg_type(&sub_array_iter) !=
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    DBUS_TYPE_UINT32) {
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Channel must by specified by struct of "
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "two UINT32s");
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = wpas_dbus_error_invalid_args(
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message,
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"Wrong Channel struct. Two UINT32s required");
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(freqs);
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&sub_array_iter, &width);
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs_num % FREQS_ALLOC_CHUNK == 0) {
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			nfreqs = os_realloc(freqs, sizeof(int) *
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    (freqs_num + FREQS_ALLOC_CHUNK));
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (nfreqs == NULL)
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_free(freqs);
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			freqs = nfreqs;
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (freqs == NULL) {
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "out of memory. can't allocate memory for "
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "freqs");
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*reply = dbus_message_new_error(
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, DBUS_ERROR_NO_MEMORY, NULL);
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs[freqs_num] = freq;
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		freqs_num++;
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&array_iter);
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	nfreqs = os_realloc(freqs,
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(int) * (freqs_num + 1));
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (nfreqs == NULL)
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(freqs);
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs = nfreqs;
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (freqs == NULL) {
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "out of memory. Can't allocate memory for freqs");
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*reply = dbus_message_new_error(
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, DBUS_ERROR_NO_MEMORY, NULL);
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	freqs[freqs_num] = 0;
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	params->freqs = freqs;
11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface.
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     struct wpa_supplicant *wpa_s)
11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, dict_iter, entry_iter, variant_iter;
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *key = NULL, *type = NULL;
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_scan_params params;
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t i;
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&params, 0, sizeof(params));
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &dict_iter);
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (dbus_message_iter_get_arg_type(&dict_iter) ==
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			DBUS_TYPE_DICT_ENTRY) {
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&dict_iter, &entry_iter);
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_get_basic(&entry_iter, &key);
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&entry_iter);
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_recurse(&entry_iter, &variant_iter);
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(key, "Type") == 0) {
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_type(message, &variant_iter,
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &type, &reply) < 0)
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "SSIDs") == 0) {
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ssids(message, &variant_iter,
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     &params, &reply) < 0)
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "IEs") == 0) {
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_ies(message, &variant_iter,
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   &params, &reply) < 0)
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (os_strcmp(key, "Channels") == 0) {
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpas_dbus_get_scan_channels(message, &variant_iter,
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							&params, &reply) < 0)
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto out;
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "Unknown argument %s", key);
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(message, key);
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_iter_next(&dict_iter);
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!type) {
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Scan type not specified");
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, key);
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!os_strcmp(type, "passive")) {
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (params.num_ssids || params.extra_ies_len) {
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   "SSIDs or IEs specified for passive scan.");
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = wpas_dbus_error_invalid_args(
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				message, "You can specify only Channels in "
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				"passive scan");
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else if (params.freqs && params.freqs[0]) {
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_supplicant_trigger_scan(wpa_s, &params);
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_s->scan_req = 2;
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_supplicant_req_scan(wpa_s, 0, 0);
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (!os_strcmp(type, "active")) {
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!params.num_ssids) {
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* Add wildcard ssid */
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			params.num_ssids++;
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_trigger_scan(wpa_s, &params);
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_scan[dbus]: "
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "Unknown scan type: %s", type);
12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message,
12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     "Wrong scan type");
12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free((u8 *) params.ssids[i].ssid);
12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free((u8 *) params.extra_ies);
12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(params.freqs);
12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection
12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise.
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface.
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid != NULL) {
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->disconnected = 1;
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED,
12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      "This interface is not connected");
12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface.
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter;
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = NULL;
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf;
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_add_network(wpa_s->conf);
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_handler_add_network[dbus]: "
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "can't add new interface.");
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message,
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wpa_supplicant could not add "
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"a network on this interface.");
13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_added(wpa_s, ssid);
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid->disabled = 1;
13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_network_defaults(ssid);
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = set_network_properties(message, wpa_s, ssid, &iter);
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply) {
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_handler_add_network[dbus]:"
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "control interface couldn't set network "
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "properties");
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Construct the object path for this network. */
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_s->dbus_new_path, ssid->id);
13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL) {
13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path,
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      DBUS_TYPE_INVALID)) {
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid) {
13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpas_notify_network_removed(wpa_s, ssid);
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_config_remove_network(wpa_s->conf, ssid->id);
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network
13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface.
13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *iface = NULL, *net_id = NULL;
13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
136875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL);
13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (iface == NULL || os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (errno == EINVAL) {
13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, id) < 0) {
13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR,
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_handler_remove_network[dbus]: "
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "error occurred when removing network %d", id);
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_unknown_error(
13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "error removing the specified network on "
13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"this interface.");
13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_deauthenticate(wpa_s,
14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WLAN_REASON_DEAUTH_LEAVING);
14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(net_id);
14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid)
14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s = arg;
14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_network_removed(wpa_s, ssid);
14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) {
14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR,
14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpas_dbus_handler_remove_all_networks[dbus]: "
14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "error occurred when removing network %d",
14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   ssid->id);
14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == wpa_s->current_ssid)
14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
14298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks
14308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
14338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface.
14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14368d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks(
14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *message, struct wpa_supplicant *wpa_s)
14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* NB: could check for failure and return an error */
14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s);
14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
14468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network
14478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure
14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface.
14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message,
14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *op;
14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *iface = NULL, *net_id = NULL;
14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id;
14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Extract the network ID and ensure the network */
14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* is actually a child of this interface */
146775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	iface = wpas_dbus_new_decompose_object_path(op, 0, &net_id, NULL);
14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (iface == NULL || os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	id = strtoul(net_id, NULL, 10);
14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (errno == EINVAL) {
14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_invalid_args(message, op);
14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = wpa_config_get_network(wpa_s->conf, id);
14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ssid == NULL) {
14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = wpas_dbus_error_network_unknown(message);
14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Finally, associate with the network */
14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_supplicant_select_network(wpa_s, ssid);
14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(iface);
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(net_id);
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates)
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success
15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs.
15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message,
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *blob_data;
15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int blob_len;
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob = NULL;
15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_basic(&iter, &blob_name);
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_get_blob(wpa_s->conf, blob_name)) {
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_EXISTS,
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &array_iter);
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len);
15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = os_zalloc(sizeof(*blob));
15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->data = os_malloc(blob_len);
15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob->data) {
15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(blob->data, blob_data, blob_len);
15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->len = blob_len;
15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob->name = os_strdup(blob_name);
15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob->name) {
15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto err;
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_config_set_blob(wpa_s->conf, blob);
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_added(wpa_s, blob->name);
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr:
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (blob) {
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->name);
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob->data);
15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(blob);
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates)
15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob)
15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs.
15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message,
15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct wpa_supplicant *wpa_s)
15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, array_iter;
15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct wpa_config_blob *blob;
15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_config_get_blob(wpa_s->conf, blob_name);
15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!blob) {
15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!reply) {
15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      DBUS_TYPE_BYTE_AS_STRING,
16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      &array_iter)) {
16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE,
16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  &(blob->data), blob->len)) {
16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&iter, &array_iter)) {
16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob
16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error
16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs.
16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message,
16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *blob_name;
16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name,
16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_config_remove_blob(wpa_s->conf, blob_name)) {
16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_DBUS_ERROR_BLOB_UNKNOWN,
16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Blob id not set");
16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpas_notify_blob_removed(wpa_s, blob_name);
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache
16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface.
16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message,
16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  struct wpa_supplicant *wpa_s)
16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t age;
16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age,
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      DBUS_TYPE_INVALID);
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (age == 0)
16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush(wpa_s);
16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_bss_flush_by_age(wpa_s, age);
16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities
16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a dict of strings
16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface.
16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_capabilities(DBusMessage *message,
16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct wpa_supplicant *wpa_s)
16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_driver_capa capa;
16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, iter_dict;
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter_dict_entry, iter_dict_val, iter_array,
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		variant_iter;
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *scans[] = { "active", "passive", "ssid" };
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (message == NULL)
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL);
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_method_return(message);
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!reply)
17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{sv}", &variant_iter))
17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_drv_get_capa(wpa_s, &capa);
17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** pairwise cipher */
17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {"ccmp", "tkip", "none"};
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Pairwise", args,
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(args) / sizeof(char*)))
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise",
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) {
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "ccmp"))
17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) {
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "tkip"))
17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) {
17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "none"))
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** group cipher */
17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"ccmp", "tkip", "wep104", "wep40"
17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Group", args,
17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(args) / sizeof(char*)))
17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group",
17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) {
17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "ccmp"))
17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) {
17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "tkip"))
17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) {
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wep104"))
17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) {
17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wep40"))
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** key management */
18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = {
18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wpa-psk", "wpa-eap", "ieee8021x", "wpa-none",
18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"wps",
18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"none"
18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		};
18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "KeyMgmt", args,
18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(args) / sizeof(char*)))
18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt",
18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "none"))
18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "ieee8021x"))
18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) {
18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-eap"))
18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT)
18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (!wpa_dbus_dict_string_array_add_element(
18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    &iter_array, "wpa-ft-eap"))
18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto nomem;
18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-eap-sha256"))
18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) {
18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-psk"))
18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK)
18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (!wpa_dbus_dict_string_array_add_element(
18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    &iter_array, "wpa-ft-psk"))
18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					goto nomem;
18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */
18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-psk-sha256"))
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) {
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa-none"))
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS
18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_string_array_add_element(&iter_array,
18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							    "wps"))
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */
18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** WPA protocol */
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "rsn", "wpa" };
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "Protocol", args,
18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(args) / sizeof(char*)))
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol",
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) {
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "rsn"))
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) {
19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "wpa"))
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** auth alg */
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0) {
19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *args[] = { "open", "shared", "leap" };
19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string_array(
19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    &iter_dict, "AuthAlg", args,
19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    sizeof(args) / sizeof(char*)))
19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg",
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_entry,
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_dict_val,
19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &iter_array))
19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.auth & (WPA_DRIVER_AUTH_OPEN)) {
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "open"))
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.auth & (WPA_DRIVER_AUTH_SHARED)) {
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "shared"))
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (capa.auth & (WPA_DRIVER_AUTH_LEAP)) {
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!wpa_dbus_dict_string_array_add_element(
19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    &iter_array, "leap"))
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				goto nomem;
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_end_string_array(&iter_dict,
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_entry,
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_dict_val,
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &iter_array))
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Scan */
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans,
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       sizeof(scans) / sizeof(char *)))
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/***** Modes */
197275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes",
197375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_entry,
197475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_dict_val,
197575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					      &iter_array))
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
197875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_string_array_add_element(
197975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			    &iter_array, "infrastructure"))
198075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
198175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
198275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_string_array_add_element(
198375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			    &iter_array, "ad-hoc"))
198475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
198575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
198675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (res >= 0) {
198775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (capa.flags & (WPA_DRIVER_FLAGS_AP)) {
198875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			if (!wpa_dbus_dict_string_array_add_element(
198975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				    &iter_array, "ap"))
199075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				goto nomem;
199175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		}
199275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
199375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (capa.flags & (WPA_DRIVER_FLAGS_P2P_CAPABLE)) {
199475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			if (!wpa_dbus_dict_string_array_add_element(
199575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				    &iter_array, "p2p"))
199675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen				goto nomem;
199775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		}
199875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	}
199975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
200075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	if (!wpa_dbus_dict_end_string_array(&iter_dict,
200175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_entry,
200275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_dict_val,
200375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen					    &iter_array))
200475ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		goto nomem;
200575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen	/***** Modes end */
200675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen
20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&iter, &variant_iter))
20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state
20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a STRING representing the current
20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          interface state
20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property.
20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_state(DBusMessage *message,
20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     struct wpa_supplicant *wpa_s)
20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *str_state;
20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *state_ls, *tmp;
20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	str_state = wpa_supplicant_state_txt(wpa_s->wpa_state);
20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* make state string lowercase to fit new DBus API convention
20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	state_ls = tmp = os_strdup(str_state);
20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!tmp) {
20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*tmp) {
20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*tmp = tolower(*tmp);
20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tmp++;
20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING,
20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &state_ls);
20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(state_ls);
20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
20588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state
20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing whether the interface is scanning
20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property.
20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_scanning(DBusMessage *message,
20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					struct wpa_supplicant *wpa_s)
20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE;
20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_BOOLEAN,
20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&scanning);
20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode
20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A message containong value of ap_scan variable
20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property.
20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_ap_scan(DBusMessage *message,
20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_supplicant *wpa_s)
20888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan = wpa_s->conf->ap_scan;
20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_UINT32,
20918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&ap_scan);
20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
20968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode
20978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
20988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
20998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
21008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property.
21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_ap_scan(DBusMessage *message,
21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_supplicant *wpa_s)
21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t ap_scan;
21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_UINT32,
21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &ap_scan);
21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return reply;
21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) {
21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_invalid_args(
21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "ap_scan must equal 0, 1 or 2");
21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
21198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age
21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A message containing value of bss_expiration_age variable
21278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
21288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property.
21298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
21308d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_expire_age(DBusMessage *message,
21318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      struct wpa_supplicant *wpa_s)
21328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age;
21348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_UINT32,
21358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&expire_age);
21368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age
21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property.
21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_bss_expire_age(DBusMessage *message,
21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      struct wpa_supplicant *wpa_s)
21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_age;
21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_UINT32,
21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &expire_age);
21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
21568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return reply;
21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) {
21598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_invalid_args(
21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "BSSExpireAge must be >=10");
21618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
21638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count
21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
21698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
21708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A message containing value of bss_expire_count variable
21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property.
21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_expire_count(DBusMessage *message,
21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						struct wpa_supplicant *wpa_s)
21768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_age;
21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_UINT32,
21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&expire_count);
21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count
21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property.
21908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
21918d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_bss_expire_count(DBusMessage *message,
21928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						struct wpa_supplicant *wpa_s)
21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_uint32_t expire_count;
21968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_UINT32,
21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &expire_count);
21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return reply;
22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) {
22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_invalid_args(
22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "BSSExpireCount must be >0");
22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code
22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A message containong value of country variable
22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property.
22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_country(DBusMessage *message,
22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_supplicant *wpa_s)
22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char country[3];
22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *str = country;
22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[0] = wpa_s->conf->country[0];
22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[1] = wpa_s->conf->country[1];
22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	country[2] = '\0';
22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING,
22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&str);
22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
22348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code
22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
22378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL
22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property.
22408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
22418d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_country(DBusMessage *message,
22428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_supplicant *wpa_s)
22438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
22458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *country;
22468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_STRING,
22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &country);
22498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
22508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return reply;
22518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!country[0] || !country[1])
22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_invalid_args(message,
22548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    "invalid country code");
22558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) {
22578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "Failed to set country");
22588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_invalid_args(
22598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			message, "failed to set country code");
22608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[0] = country[0];
22638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s->conf->country[1] = country[1];
22648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
22658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
22698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name
22708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a name of network interface
22738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * associated with with wpa_s
22748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
22758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property.
22768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
22778d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_ifname(DBusMessage *message,
22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      struct wpa_supplicant *wpa_s)
22798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *ifname = wpa_s->ifname;
22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING,
22828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&ifname);
22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
22878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name
22888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
22898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a name of network interface
22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * driver associated with with wpa_s
22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property.
22948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_driver(DBusMessage *message,
22968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      struct wpa_supplicant *wpa_s)
22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *driver;
22998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) {
23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "wpas_dbus_getter_driver[dbus]: "
23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpa_s has no driver set");
23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_unknown_error(message, NULL);
23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	driver = wpa_s->driver->name;
23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING,
23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&driver);
23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path
23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a DBus object path to
23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * current BSS
23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property.
23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_current_bss(DBusMessage *message,
23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct wpa_supplicant *wpa_s)
23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf;
23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_bss)
23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_bss->id);
23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
23338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_getter(message,
23358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 DBUS_TYPE_OBJECT_PATH,
23368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &bss_obj_path);
23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path
23448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
23458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
23468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a DBus object path to
23478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * current network
23488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
23498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property.
23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_current_network(DBusMessage *message,
23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       struct wpa_supplicant *wpa_s)
23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf;
23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->current_ssid)
23588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
23598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, wpa_s->current_ssid->id);
23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
23628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/");
23638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_getter(message,
23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 DBUS_TYPE_OBJECT_PATH,
23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &net_obj_path);
23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
23698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type
23748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a string indicating the current
23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * authentication type.
23788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property.
23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_current_auth_mode(DBusMessage *message,
23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 struct wpa_supplicant *wpa_s)
23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *eap_mode;
23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *auth_mode;
23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX];
23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->wpa_state != WPA_COMPLETED) {
23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = "INACTIVE";
23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X ||
23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eap_mode = wpa_supplicant_get_eap_mode(wpa_s);
23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX,
23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "EAP-%s", eap_mode);
23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = eap_mode_buf;
23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt,
24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_s->current_ssid->proto);
24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_getter(message,
24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 DBUS_TYPE_STRING,
24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &auth_mode);
24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name
24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a name of bridge network
24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * interface associated with with wpa_s
24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property.
24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bridge_ifname(DBusMessage *message,
24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     struct wpa_supplicant *wpa_s)
24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *bridge_ifname = NULL;
24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	bridge_ifname = wpa_s->bridge_ifname;
24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (bridge_ifname == NULL) {
24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bridge_ifname[dbus]: "
24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "wpa_s has no bridge interface name set");
24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_unknown_error(message, NULL);
24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING,
24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&bridge_ifname);
24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects
24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing an array of all known BSS objects
24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * dbus paths
24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property.
24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bsss(DBusMessage *message,
24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    struct wpa_supplicant *wpa_s)
24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *bss;
24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0;
24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	paths = os_zalloc(wpa_s->num_bss * sizeof(char *));
24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through scan results and append each result's object path */
24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) {
24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_error(message,
24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       DBUS_ERROR_NO_MEMORY,
24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       NULL);
24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this BSS. */
24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, bss->id);
24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_array_property_getter(message,
24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       DBUS_TYPE_OBJECT_PATH,
24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       paths, wpa_s->num_bss);
24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
24858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects
24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing an array of all configured
24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * networks dbus object paths.
24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property.
24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_networks(DBusMessage *message,
24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					struct wpa_supplicant *wpa_s)
24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **paths;
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int i = 0, num = 0;
25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->conf == NULL) {
25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_networks[dbus]: "
25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "An error occurred getting networks list.");
25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_error_unknown_error(message, NULL);
25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
251175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (!network_is_persistent_group(ssid))
251275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			num++;
25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	paths = os_zalloc(num * sizeof(char *));
25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!paths) {
25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Loop through configured networks and append object path of each */
25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
252275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen		if (network_is_persistent_group(ssid))
252375ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen			continue;
25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (paths[i] == NULL) {
25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_error(message,
25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       DBUS_ERROR_NO_MEMORY,
25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       NULL);
25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Construct the object path for this network. */
25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX,
25348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
25358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    wpa_s->dbus_new_path, ssid->id);
25368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_array_property_getter(message,
25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       DBUS_TYPE_OBJECT_PATH,
25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       paths, num);
25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (i)
25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(paths[--i]);
25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(paths);
25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface
25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface
25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a dictionary of pairs (blob_name, blob)
25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property.
25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_blobs(DBusMessage *message,
25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     struct wpa_supplicant *wpa_s)
25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, variant_iter, dict_iter, entry_iter, array_iter;
25638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_config_blob *blob;
25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (message == NULL)
25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL);
25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_method_return(message);
25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!reply)
25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{say}", &variant_iter) ||
25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY,
25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "{say}", &dict_iter)) {
25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	blob = wpa_s->conf->blobs;
25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (blob) {
25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dbus_message_iter_open_container(&dict_iter,
25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_DICT_ENTRY,
25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      NULL, &entry_iter) ||
25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_basic(&entry_iter,
25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    DBUS_TYPE_STRING,
25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    &(blob->name)) ||
25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_open_container(&entry_iter,
25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_ARRAY,
25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_TYPE_BYTE_AS_STRING,
25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      &array_iter) ||
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_append_fixed_array(&array_iter,
25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  DBUS_TYPE_BYTE,
25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  &(blob->data),
25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  blob->len) ||
26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&entry_iter,
26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &array_iter) ||
26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !dbus_message_iter_close_container(&dict_iter,
26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       &entry_iter)) {
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_unref(reply);
26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return dbus_message_new_error(message,
26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      DBUS_ERROR_NO_MEMORY,
26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      NULL);
26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		blob = blob->next;
26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) ||
26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_close_container(&iter, &variant_iter)) {
26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS
26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id
26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the bssid for the requested bss
26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property.
26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_bssid(DBusMessage *message,
26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 struct bss_handler_args *bss)
26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id);
26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!res) {
26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_bssid[dbus]: no "
26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "bss with id %d found", bss->id);
26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_array_property_getter(message, DBUS_TYPE_BYTE,
26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      res->bssid, ETH_ALEN);
26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS
26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id
26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the ssid for the requested bss
26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property.
26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_ssid(DBusMessage *message,
26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      struct bss_handler_args *bss)
26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id);
26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!res) {
26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_ssid[dbus]: no "
26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "bss with id %d found", bss->id);
26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_array_property_getter(message, DBUS_TYPE_BYTE,
26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      res->ssid,
26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      res->ssid_len);
26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS
26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id
26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the privacy flag value of requested bss
26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property.
26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
26818d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_privacy(DBusMessage *message,
26828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   struct bss_handler_args *bss)
26838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id);
26858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t privacy;
26868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!res) {
26888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_privacy[dbus]: no "
26898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "bss with id %d found", bss->id);
26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
26918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE;
26948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_BOOLEAN,
26958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&privacy);
26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS
27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id
27038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the mode of requested bss
27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property.
27068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27078d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_mode(DBusMessage *message,
27088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					struct bss_handler_args *bss)
27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id);
27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *mode;
27128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!res) {
27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_mode[dbus]: no "
27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "bss with id %d found", bss->id);
27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res->caps & IEEE80211_CAP_IBSS)
27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mode = "ad-hoc";
27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mode = "infrastructure";
27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_STRING,
27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&mode);
27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS
27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id
27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the signal strength of requested bss
27348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property.
27368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_signal(DBusMessage *message,
27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  struct bss_handler_args *bss)
27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id);
27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!res) {
27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_signal[dbus]: no "
27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "bss with id %d found", bss->id);
27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
27468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_INT16,
27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&res->level);
27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS
27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id
27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the frequency of requested bss
27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property.
27608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_frequency(DBusMessage *message,
27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     struct bss_handler_args *bss)
27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id);
27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!res) {
27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_frequency[dbus]: "
27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "no bss with id %d found", bss->id);
27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_UINT16,
27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&res->freq);
27748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b)
27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return (*(u8 *) b - *(u8 *) a);
27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS
27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id
27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing sorted array of bit rates
27888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property.
27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_rates(DBusMessage *message,
27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    struct bss_handler_args *bss)
27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id);
27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *ie_rates = NULL;
27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 *real_rates;
27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int rates_num, i;
27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!res) {
28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_rates[dbus]: "
28028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "no bss with id %d found", bss->id);
28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	rates_num = wpa_bss_get_bit_rates(res, &ie_rates);
28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (rates_num < 0)
28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	qsort(ie_rates, rates_num, 1, cmp_u8s_desc);
28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	real_rates = os_malloc(sizeof(u32) * rates_num);
28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!real_rates) {
28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(ie_rates);
28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < rates_num; i++)
28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		real_rates[i] = ie_rates[i] * 500000;
28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_array_property_getter(message,
28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       DBUS_TYPE_UINT32,
28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       real_rates, rates_num);
28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ie_rates);
28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(real_rates);
28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_get_bss_security_prop(
28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *message, struct wpa_ie_data *ie_data)
28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply;
28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter iter, iter_dict, variant_iter;
28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *group;
28388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *pairwise[2]; /* max 2 pairwise ciphers is supported */
28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *key_mgmt[7]; /* max 7 key managements may be supported */
28408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
28418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (message == NULL)
28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL);
28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
28458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_method_return(message);
28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!reply)
28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
28518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "a{sv}", &variant_iter))
28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
28568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* KeyMgmt */
28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK)
28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk";
28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK)
28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-psk";
28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256)
28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-psk-sha256";
28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X)
28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap";
28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-ft-eap";
28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)
28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-eap-sha256";
28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE)
28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_mgmt[n++] = "wpa-none";
28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt",
28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       key_mgmt, n))
28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
28778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Group */
28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch (ie_data->group_cipher) {
28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP40:
28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep40";
28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
28838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_TKIP:
28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "tkip";
28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_CCMP:
28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "ccmp";
28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case WPA_CIPHER_WEP104:
28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "wep104";
28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	default:
28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group = "";
28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group))
28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Pairwise */
29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	n = 0;
29028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP)
29038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "tkip";
29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP)
29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pairwise[n++] = "ccmp";
29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise",
29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       pairwise, n))
29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Management group (RSN only) */
29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie_data->proto == WPA_PROTO_RSN) {
29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (ie_data->mgmt_group_cipher) {
29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W
29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case WPA_CIPHER_AES_128_CMAC:
29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "aes128cmac";
29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */
29198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			group = "";
29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
29238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup",
29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 group))
29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto nomem;
29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_close_container(&iter, &variant_iter))
29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto nomem;
29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem:
29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
29398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
29418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS
29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
29478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id
29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the WPA options of requested bss
29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property.
29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_wpa(DBusMessage *message,
29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct bss_handler_args *bss)
29548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id);
29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!res) {
29608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_wpa[dbus]: no "
29618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "bss with id %d found", bss->id);
29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE);
29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie) {
29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0)
29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return wpas_dbus_error_unknown_error(message,
29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							     "invalid WPA IE");
29718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_get_bss_security_prop(message, &wpa_data);
29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS
29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id
29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing the RSN options of requested bss
29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property.
29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_rsn(DBusMessage *message,
29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct bss_handler_args *bss)
29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id);
29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ie_data wpa_data;
29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *ie;
29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!res) {
29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_rsn[dbus]: no "
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "bss with id %d found", bss->id);
29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(&wpa_data, 0, sizeof(wpa_data));
29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ie = wpa_bss_get_ie(res, WLAN_EID_RSN);
30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ie) {
30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0)
30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return wpas_dbus_error_unknown_error(message,
30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							     "invalid RSN IE");
30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_get_bss_security_prop(message, &wpa_data);
30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS
30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
30138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @bss: a pair of interface describing structure and bss's id
30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing IEs byte array
30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property.
30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_bss_ies(DBusMessage *message,
30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct bss_handler_args *bss)
30208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_bss *res = wpa_bss_get_id(bss->wpa_s, bss->id);
30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!res) {
30248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpas_dbus_getter_bss_ies[dbus]: no "
30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "bss with id %d found", bss->id);
30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_array_property_getter(message, DBUS_TYPE_BYTE,
30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      res + 1, res->ie_len);
30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled
30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpas_dbus_setter_enabled: wpa_supplicant structure for a network interface
30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * and wpa_ssid structure for a configured network
30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: DBus message with boolean indicating state of configured network
30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or DBus error on failure
30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network.
30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_enabled(DBusMessage *message,
30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct network_handler_args *net)
30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE;
30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_simple_property_getter(message, DBUS_TYPE_BOOLEAN,
30498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						&enabled);
30508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled
30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpas_dbus_setter_enabled: wpa_supplicant structure for a network interface
30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * and wpa_ssid structure for a configured network
30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error on failure
30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network.
30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_enabled(DBusMessage *message,
30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct network_handler_args *net)
30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s;
30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid;
30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_bool_t enable;
30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = wpas_dbus_simple_property_setter(message, DBUS_TYPE_BOOLEAN,
30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 &enable);
30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return reply;
30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_s = net->wpa_s;
30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ssid = net->ssid;
30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (enable)
30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_enable_network(wpa_s, ssid);
30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_supplicant_disable_network(wpa_s, ssid);
30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network
30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @net: wpa_supplicant structure for a network interface and
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_ssid structure for a configured network
30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: DBus message with network properties or DBus error on failure
30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network.
30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_getter_network_properties(
31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *message, struct network_handler_args *net)
31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, variant_iter, dict_iter;
31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **iterator;
31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **props = wpa_config_get_all(net->ssid, 1);
31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!props)
31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      NULL);
31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (message == NULL)
31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new(DBUS_MESSAGE_TYPE_SIGNAL);
31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_method_return(message);
31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!reply) {
31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init_append(reply, &iter);
31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			"a{sv}", &variant_iter) ||
31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) {
31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_dbus_dict_append_string(&dict_iter, *iterator,
31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 *(iterator + 1))) {
31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dbus_message_unref(reply);
31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			reply = dbus_message_new_error(message,
31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       DBUS_ERROR_NO_MEMORY,
31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       NULL);
31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			goto out;
31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator += 2;
31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) ||
31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    !dbus_message_iter_close_container(&iter, &variant_iter)) {
31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		dbus_message_unref(reply);
31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       NULL);
31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto out;
31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout:
31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	iterator = props;
31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*iterator) {
31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(*iterator);
31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		iterator++;
31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(props);
31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network
31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @net: wpa_supplicant structure for a network interface and
31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_ssid structure for a configured network
31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error on failure
31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network.
31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_setter_network_properties(
31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *message, struct network_handler_args *net)
31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ssid *ssid = net->ssid;
31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessageIter	iter, variant_iter;
31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_init(message, &iter);
31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_next(&iter);
31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	dbus_message_iter_recurse(&iter, &variant_iter);
31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = set_network_properties(message, net->wpa_s, ssid,
31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       &variant_iter);
31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply)
31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_DEBUG, "dbus control interface couldn't set "
31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "network properties");
31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3196