dbus_new_handlers.c revision 203eadb9eda41a1dde4a583edb4684319e3f399e
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant / dbus-based control interface 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc. 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009-2010, Witold Sowa <witold.sowa@gmail.com> 5807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt * Copyright (c) 2009-2015, Jouni Malinen <j@w1.fi> 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * This software may be distributed under the terms of the BSD license. 804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * See README for more details. 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_peer/eap_methods.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eapol_supp/eapol_supp_sm.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rsn_supp/wpa.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../config.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wpa_supplicant_i.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../driver_i.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../notify.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../bss.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../scan.h" 2404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "../autoscan.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_helpers.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_new_handlers.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_dict_helpers.h" 2904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "dbus_common_i.h" 30661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt#include "drivers/driver.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic const char * const debug_strings[] = { 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "excessive", "msgdump", "debug", "info", "warning", "error", NULL 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt * wpas_dbus_error_unknown_error - Return a new UnknownError error message 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @arg: Optional string appended to error message 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an UnknownError 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_unknown_error(DBusMessage *message, 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_UNKNOWN_ERROR, 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg); 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_iface_unknown - Return a new invalid interface error message 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus error message 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid interface error 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_iface_unknown(DBusMessage *message) 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error( 636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_IFACE_UNKNOWN, 646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant knows nothing about this interface."); 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_network_unknown - Return a new NetworkUnknown error message 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid network error 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic DBusMessage * wpas_dbus_error_network_unknown(DBusMessage *message) 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error( 786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_NETWORK_UNKNOWN, 796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "There is no such a network in this interface."); 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_error_invalid_args - Return a new InvalidArgs error message 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus error message 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Convenience function to create and return an invalid options error 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_error_invalid_args(DBusMessage *message, 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg) 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply; 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = dbus_message_new_error( 966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_INVALID_ARGS, 976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Did not receive correct message arguments."); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (arg != NULL) 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, &arg, 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1067dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt/** 1077dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * wpas_dbus_error_scan_error - Return a new ScanError error message 1087dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @message: Pointer to incoming dbus message this error refers to 1097dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * @error: Optional string to be used as the error message 1107dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Returns: a dbus error message 1117dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * 1127dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt * Convenience function to create and return a scan error 1137dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt */ 1146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic DBusMessage * wpas_dbus_error_scan_error(DBusMessage *message, 1156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt const char *error) 1167dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt{ 1176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error(message, 1186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_ERROR_IFACE_SCAN_ERROR, 1196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt error); 1206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 1217dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1227dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1236c0da2bb83f6915d8260912362692d1a742e057bDmitry ShmidtDBusMessage * wpas_dbus_error_no_memory(DBusMessage *message) 1246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 1256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "dbus: Failed to allocate memory"); 1266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL); 1277dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt} 1287dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1297dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt 1306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic const char * const dont_quote[] = { 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap", 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path", 133d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt "bssid", "scan_freq", "freq_list", NULL 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic dbus_bool_t should_quote_opt(const char *key) 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i = 0; 1396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dont_quote[i] != NULL) { 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, dont_quote[i]) == 0) 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return FALSE; 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt i++; 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return TRUE; 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * get_iface_by_dbus_path - Get a new network interface 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: Pointer to global data from wpa_supplicant_init() 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @path: Pointer to a dbus object path representing an interface 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the interface or %NULL if not found 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_supplicant * get_iface_by_dbus_path( 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global, const char *path) 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(wpa_s->dbus_new_path, path) == 0) 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_s; 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * set_network_properties - Set properties of a configured network 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @ssid: wpa_ssid structure for a configured network 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @iter: DBus message iterator containing dictionary of network 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * properties to set. 1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure, an error describing the failure 1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeds, FALSE if it failed 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Sets network configuration with parameters given id DBus dictionary 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s, 1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid, 1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter *iter, 1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING }; 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *value = NULL; 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(iter, &iter_dict, error)) 1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t size = 50; 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto error; 1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt value = NULL; 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.type == DBUS_TYPE_ARRAY && 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_type == DBUS_TYPE_BYTE) { 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (entry.array_len <= 0) 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = entry.array_len * 2 + 1; 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_snprintf_hex(value, size, 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) entry.bytearray_value, 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.array_len); 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret <= 0) 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_STRING) { 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (should_quote_opt(entry.key)) { 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size = os_strlen(entry.str_value); 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (size <= 0) 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size += 3; 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "\"%s\"", 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.str_value); 2266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_strdup(entry.str_value); 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_UINT32) { 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%u", 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.uint32_value); 2406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (entry.type == DBUS_TYPE_INT32) { 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = os_zalloc(size); 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(value, size, "%d", 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt entry.int32_value); 2496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(size, ret)) 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_set(ssid, entry.key, value, 0) < 0) 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2572f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt if (os_strcmp(entry.key, "bssid") != 0 && 2582f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt os_strcmp(entry.key, "priority") != 0) 2592f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid); 2602f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt 2612f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt if (wpa_s->current_ssid == ssid || 2622f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt wpa_s->current_ssid == NULL) { 2632f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt /* 2642f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt * Invalidate the EAP session cache if anything in the 2652f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt * current or previously used configuration changes. 2662f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt */ 2672f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt eapol_sm_invalidate_cached_session(wpa_s->eapol); 2682f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt } 2692f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((os_strcmp(entry.key, "psk") == 0 && 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value[0] == '"' && ssid->ssid_len) || 27204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt (os_strcmp(entry.key, "ssid") == 0 && ssid->passphrase)) 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_psk(ssid); 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (os_strcmp(entry.key, "priority") == 0) 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_prio_list(wpa_s->conf); 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 278623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt value = NULL; 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidterror: 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(value); 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS, 2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid message format"); 2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_getter - Get basic type property 2951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Message iter to use when appending arguments 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place holding property value 2981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: On failure an error describing the failure 2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for basic type properties. Type is required to be basic. 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_getter(DBusMessageIter *iter, 3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *val, 3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: given type is not basic", __func__); 3131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_dbus_type_as_string(type), 3186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &variant_iter) || 3196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_append_basic(&variant_iter, type, val) || 3206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 3216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: error constructing reply", __func__); 3236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 3246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } 3251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_property_setter - Set basic type property 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property (must be basic type) 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @val: pointer to place where value being set will be stored 3351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request was successful, FALSE if it failed 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic setter for basic type properties. Type is required to be basic. 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_property_setter(DBusMessageIter *iter, 3401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 3411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, void *val) 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: given type is not basic", __func__); 3481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Look at the new value */ 3521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&variant_iter) != type) { 3541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "wrong property type"); 3561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&variant_iter, val); 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_simple_array_property_getter - Get array type property 3661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: DBus type of property array elements (must be basic type) 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array: pointer to array of elements to put into response message 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @array_len: length of above array 3701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: a pointer to an error to fill on failure 3711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generic getter for array type properties. Array elements type is 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * required to be basic. 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_property_getter(DBusMessageIter *iter, 3771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const int type, 3781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const void *array, 3791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t array_len, 3801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char type_str[] = "a?"; /* ? will be replaced with subtype letter; */ 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *sub_type_str; 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t element_size, i; 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_type_is_basic(type)) { 3881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 3896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: given type is not basic", __func__); 3901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type_str[1] = sub_type_str[0]; 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 3976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt type_str, &variant_iter) || 3986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sub_type_str, &array_iter)) { 4001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message", __func__); 4021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt switch (type) { 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BYTE: 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_BOOLEAN: 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = 1; 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT16: 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT16: 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint16_t); 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT32: 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT32: 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint32_t); 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_INT64: 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_UINT64: 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(uint64_t); 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_DOUBLE: 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(double); 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_STRING: 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case DBUS_TYPE_OBJECT_PATH: 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt element_size = sizeof(char *); 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 4301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: unknown element type %d", __func__, type); 4321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < array_len; i++) { 43643cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt if (!dbus_message_iter_append_basic(&array_iter, type, 43743cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt array + i * element_size)) { 43843cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 43943cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt "%s: failed to construct message 2.5", 44043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt __func__); 44143cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt return FALSE; 44243cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt } 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter) || 4466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 4471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message 3", __func__); 4491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 4501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 4511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 45704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_simple_array_array_property_getter - Get array array type property 45804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iterator 45904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @type: DBus type of property array elements (must be basic type) 46004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array: pointer to array of elements to put into response message 46104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @array_len: length of above array 46204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: a pointer to an error to fill on failure 46304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE if the request succeeded, FALSE if it failed 46404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 46504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Generic getter for array type properties. Array elements type is 46604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * required to be basic. 46704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 46804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_simple_array_array_property_getter(DBusMessageIter *iter, 46904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const int type, 47004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpabuf **array, 47104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t array_len, 47204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error) 47304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 47404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter variant_iter, array_iter; 47504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char type_str[] = "aa?"; 47604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char inner_type_str[] = "a?"; 47704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const char *sub_type_str; 47804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 47904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 48004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_type_is_basic(type)) { 48104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 48204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "%s: given type is not basic", __func__); 48304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 48404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 48504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 48604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt sub_type_str = wpa_dbus_type_as_string(type); 48704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt type_str[2] = sub_type_str[0]; 48804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str[1] = sub_type_str[0]; 48904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 49004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 4916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt type_str, &variant_iter) || 4926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 49304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt inner_type_str, &array_iter)) { 49404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 4956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to construct message", __func__); 49604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 49704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 49804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 499c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt for (i = 0; i < array_len && array[i]; i++) { 50004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_dbus_dict_bin_array_add_element(&array_iter, 50104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_head(array[i]), 50204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpabuf_len(array[i])); 50304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 50404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 50504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 5066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &array_iter) || 5076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 50804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 5096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s: failed to close message", __func__); 51004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 51104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 51204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 51404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 51504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 51704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_create_interface - Request registration of a network iface 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the new interface object, 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "CreateInterface" method call. Handles requests 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to register a network interface that wpa_supplicant 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * will manage. 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message, 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter_dict; 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_dbus_dict_entry entry; 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *driver = NULL; 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ifname = NULL; 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *confname = NULL; 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *bridge_ifname = NULL; 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL)) 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_strcmp(entry.key, "Driver") == 0 && 5486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 549623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(driver); 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = os_strdup(entry.str_value); 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (driver == NULL) 553ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "Ifname") == 0 && 5556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 556623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(ifname); 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(entry.str_value); 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 560ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "ConfigFile") == 0 && 5626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 563623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(confname); 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt confname = os_strdup(entry.str_value); 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (confname == NULL) 567ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(entry.key, "BridgeIfname") == 0 && 5696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt entry.type == DBUS_TYPE_STRING) { 570623d63a3a443027e50efdaaec027befcc3882527Dmitry Shmidt os_free(bridge_ifname); 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bridge_ifname = os_strdup(entry.str_value); 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bridge_ifname == NULL) 574ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto oom; 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_dbus_dict_entry_clear(&entry); 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto error; /* Required Ifname argument missing */ 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Try to get the wpa_supplicant record for this iface, return 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * an error if we already control it. 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_get_iface(global, ifname) != NULL) { 5896c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = dbus_message_new_error( 5906c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, WPAS_DBUS_ERROR_IFACE_EXISTS, 5916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant already controls this interface."); 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_interface iface; 5956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&iface, 0, sizeof(iface)); 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.driver = driver; 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.ifname = ifname; 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.confname = confname; 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface.bridge_ifname = bridge_ifname; 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Otherwise, have wpa_supplicant attach to it. */ 602203eadb9eda41a1dde4a583edb4684319e3f399eDmitry Shmidt wpa_s = wpa_supplicant_add_iface(global, &iface, NULL); 6036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (wpa_s) { 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path = wpa_s->dbus_new_path; 6056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, 6086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &path, DBUS_TYPE_INVALID); 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 6126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant couldn't grab this interface."); 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(driver); 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ifname); 61961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(confname); 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bridge_ifname); 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterror: 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, NULL); 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 626ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtoom: 627ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 628ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt goto out; 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_interface - Request deregistration of an interface 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: wpa_supplicant global data structure 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: a dbus message containing a UINT32 indicating success (1) or 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * failure (0), or returns a dbus error message with more information 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "removeInterface" method call. Handles requests 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to deregister a network interface that wpa_supplicant 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * currently manages. 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_interface(DBusMessage *message, 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *path; 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = get_iface_by_dbus_path(global, path); 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_iface_unknown(message); 656c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt else if (wpa_supplicant_remove_iface(global, wpa_s, 0)) { 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 6586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 6596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant couldn't remove this interface."); 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_interface - Get the object path for an interface name 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @global: %wpa_supplicant global data structure 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: The object path of the interface object, 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or a dbus error message with more information 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "getInterface" method call. 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message, 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_global *global) 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname; 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path; 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &ifname, 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = wpa_supplicant_get_iface(global, ifname); 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s == NULL) 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpas_dbus_error_iface_unknown(message); 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt path = wpa_s->dbus_new_path; 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) 6936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 6976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_level - Get debug level 7061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugLevel" property. 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_level(DBusMessageIter *iter, 7141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str; 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int idx = wpa_debug_level; 7191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx < 0) 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 0; 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (idx > 5) 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt idx = 5; 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str = debug_strings[idx]; 7251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_timestamp - Get debug timestamp 7321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugTimestamp" property. 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_timestamp(DBusMessageIter *iter, 7406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBusError *error, 7416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt void *user_data) 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_timestamp, error); 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_debug_show_keys - Get debug show keys 7511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "DebugShowKeys" property. 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_debug_show_keys(DBusMessageIter *iter, 7591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 7601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 7631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &wpa_debug_show_keys, error); 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_level - Set debug level 7691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 7701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 7711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 7721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugLevel" property. 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 7761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_level(DBusMessageIter *iter, 7771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str = NULL; 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, val = -1; 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 7841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str)) 7851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; debug_strings[i]; i++) 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(debug_strings[i], str) == 0) { 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val = i; 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (val < 0 || 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, val, wpa_debug_timestamp, 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys)) { 7966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 7976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wrong debug level value"); 7981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_timestamp - Set debug timestamp 8071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugTimestamp" property. 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_timestamp(DBusMessageIter *iter, 8151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, val ? 1 : 0, 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys); 8271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_debug_show_keys - Set debug show keys 8331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "DebugShowKeys" property. 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_debug_show_keys(DBusMessageIter *iter, 8411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t val; 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 8481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &val)) 8491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_set_debug_params(global, wpa_debug_level, 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_timestamp, 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt val ? 1 : 0); 8541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_interfaces - Request registered interfaces list 8601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 8621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 8631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Interfaces" property. Handles requests 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of registered interfaces objects 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * paths 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter, 8701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 8711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_global *global = user_data; 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char **paths; 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 8771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt num++; 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 88261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 8841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 8851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i++] = wpa_s->dbus_new_path; 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 8921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 8931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_eap_methods - Request supported EAP methods list 9021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 9031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 9041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 9051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "EapMethods" property. Handles requests 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * by dbus clients to return list of strings with supported EAP methods 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter, 9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **eap_methods; 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t num_items = 0; 9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success; 9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_methods = eap_get_names_as_string_array(&num_items); 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!eap_methods) { 9191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 9201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_STRING, 9251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eap_methods, 9261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt num_items, error); 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (num_items) 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods[--num_items]); 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(eap_methods); 9311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 935d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 936d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_global_capabilities - Request supported global capabilities 937d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 938d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 939d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 940d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 941d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 942d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "Capabilities" property. Handles requests by dbus clients to 943d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * return a list of strings with supported capabilities like AP, RSN IBSS, 944d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * and P2P that are determined at compile time. 945d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 946d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter, 9476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBusError *error, 9486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt void *user_data) 949d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 950d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *capabilities[5] = { NULL, NULL, NULL, NULL, NULL }; 951d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt size_t num_items = 0; 952d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 953d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_AP 954d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ap"; 955d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_AP */ 956d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_IBSS_RSN 957d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "ibss-rsn"; 958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_IBSS_RSN */ 959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_P2P 960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "p2p"; 961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_P2P */ 962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_INTERWORKING 963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities[num_items++] = "interworking"; 964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, 967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBUS_TYPE_STRING, 968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt capabilities, 969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt num_items, error); 970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_type(DBusMessage *message, DBusMessageIter *var, 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **type, DBusMessage **reply) 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_STRING) { 9776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a string", 9786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong Type value type. String required"); 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(var, type); 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ssids(DBusMessage *message, DBusMessageIter *var, 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_ssid *ssids = params->ssids; 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ssids_num = 0; 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ssid; 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ssids must be an array of arrays of bytes", 10026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong SSIDs value type. Array of arrays of bytes required"); 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) { 10136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ssids must be an array of arrays of bytes", 10156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong SSIDs value type. Array of arrays of bytes required"); 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) { 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssids_num >= WPAS_MAX_SCAN_SSIDS) { 10246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Too many ssids specified on scan dbus call", 10266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Too many ssids specified. Specify at most four"); 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1037c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (len > MAX_SSID_LEN) { 1038c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_printf(MSG_DEBUG, 10396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: SSID too long (len=%d max_len=%d)", 10406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, len, MAX_SSID_LEN); 1041c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1042c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt message, "Invalid SSID: too long"); 1043c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return -1; 1044c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } 1045c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len != 0) { 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = os_malloc(len); 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 10496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ssid, val, len); 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Allow zero-length SSIDs */ 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = NULL; 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid = ssid; 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids[ssids_num].ssid_len = len; 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssids_num++; 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->num_ssids = ssids_num; 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_ies(DBusMessage *message, DBusMessageIter *var, 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ies = NULL, *nies; 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ies_len = 0; 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *val; 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int len; 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 10816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ies must be an array of arrays of bytes", 10836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 10866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong IEs value type. Array of arrays of bytes required"); 10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_ARRAY || 10936c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_message_iter_get_element_type(&array_iter) != DBUS_TYPE_BYTE) { 10946c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 10956c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: ies must be an array of arrays of bytes", 10966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, "Wrong IEs value type. Array required"); 10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_ARRAY) { 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&sub_array_iter, &val, &len); 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len == 0) { 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nies = os_realloc(ies, ies_len + len); 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nies == NULL) { 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ies); 11146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies = nies; 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ies + ies_len, val, len); 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ies_len += len; 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies = ies; 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies_len = ies_len; 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpas_dbus_get_scan_channels(DBusMessage *message, 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter *var, 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params, 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage **reply) 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter array_iter, sub_array_iter; 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *freqs = NULL, *nfreqs; 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freqs_num = 0; 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_ARRAY) { 11406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channels must be an array of structs", 11426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channels value type. Array of structs required"); 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(var, &array_iter); 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_STRUCT) { 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, 11536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channels must be an array of structs", 11546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channels value type. Array of structs required"); 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&array_iter) == DBUS_TYPE_STRUCT) 11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq, width; 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&array_iter, &sub_array_iter); 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbus_message_iter_get_arg_type(&sub_array_iter) != 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channel must by specified by struct of two UINT32s %c", 11716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type( 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &sub_array_iter)); 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 11766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &freq); 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_next(&sub_array_iter) || 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_arg_type(&sub_array_iter) != 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_UINT32) { 11856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 11866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: Channel must by specified by struct of two UINT32s", 11876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong Channel struct. Two UINT32s required"); 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&sub_array_iter, &width); 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define FREQS_ALLOC_CHUNK 32 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs_num % FREQS_ALLOC_CHUNK == 0) { 119961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array( 120061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt freqs, freqs_num + FREQS_ALLOC_CHUNK, 120161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt sizeof(int)); 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = freq; 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs_num++; 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&array_iter); 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 121761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt nfreqs = os_realloc_array(freqs, freqs_num + 1, sizeof(int)); 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nfreqs == NULL) 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(freqs); 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs = nfreqs; 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freqs == NULL) { 12226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt *reply = wpas_dbus_error_no_memory(message); 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freqs[freqs_num] = 0; 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->freqs = freqs; 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1232051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpas_dbus_get_scan_allow_roam(DBusMessage *message, 1233051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt DBusMessageIter *var, 1234051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_bool_t *allow, 1235051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt DBusMessage **reply) 1236051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{ 1237051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN) { 12386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Type must be a boolean", 12396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 1240051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt *reply = wpas_dbus_error_invalid_args( 1241051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt message, "Wrong Type value type. Boolean required"); 1242051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1243051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1244051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_message_iter_get_basic(var, allow); 1245051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return 0; 1246051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt} 1247051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1248051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_scan - Request a wireless scan on an interface 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Scan" method call of a network device. Requests 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that wpa_supplicant perform a wireless scan as soon as possible 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * on a particular wireless interface. 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_scan(DBusMessage *message, 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, dict_iter, entry_iter, variant_iter; 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *key = NULL, *type = NULL; 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params params; 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 1267051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt dbus_bool_t allow_roam = 1; 12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &dict_iter); 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (dbus_message_iter_get_arg_type(&dict_iter) == 12766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_DICT_ENTRY) { 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&dict_iter, &entry_iter); 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&entry_iter, &key); 12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&entry_iter); 12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&entry_iter, &variant_iter); 12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(key, "Type") == 0) { 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_type(message, &variant_iter, 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &type, &reply) < 0) 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "SSIDs") == 0) { 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ssids(message, &variant_iter, 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "IEs") == 0) { 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_ies(message, &variant_iter, 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(key, "Channels") == 0) { 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpas_dbus_get_scan_channels(message, &variant_iter, 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ¶ms, &reply) < 0) 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 1298051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } else if (os_strcmp(key, "AllowRoam") == 0) { 1299051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (wpas_dbus_get_scan_allow_roam(message, 1300051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &variant_iter, 1301051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &allow_roam, 1302051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt &reply) < 0) 1303051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt goto out; 13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 13056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown argument %s", 13066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, key); 13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&dict_iter); 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!type) { 13156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Scan type not specified", 13166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, key); 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_strcmp(type, "passive") == 0) { 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params.num_ssids || params.extra_ies_len) { 13236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 13246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: SSIDs or IEs specified for passive scan.", 13256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args( 13276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 13286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "You can specify only Channels in passive scan"); 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (params.freqs && params.freqs[0]) { 13317dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt if (wpa_supplicant_trigger_scan(wpa_s, ¶ms)) { 13327dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt reply = wpas_dbus_error_scan_error( 13337dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt message, "Scan request rejected"); 13347dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt } 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1336d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpa_s->scan_req = MANUAL_SCAN_REQ; 13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (os_strcmp(type, "active") == 0) { 13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!params.num_ssids) { 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add wildcard ssid */ 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.num_ssids++; 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 134404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 134504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 134604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 13477dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt if (wpa_supplicant_trigger_scan(wpa_s, ¶ms)) { 13487dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt reply = wpas_dbus_error_scan_error( 13497dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt message, "Scan request rejected"); 13507dba0e5708da7276a43a44cf479aa743564e15b9Dmitry Shmidt } 13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 13526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: Unknown scan type: %s", 13536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, type); 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, 13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wrong scan type"); 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1359051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (!allow_roam) 1360051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt wpa_s->scan_res_handler = scan_only_handler; 1361051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++) 13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.ssids[i].ssid); 13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free((u8 *) params.extra_ies); 13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(params.freqs); 13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1371661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/** 1372661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_handler_signal_poll - Request immediate signal properties 1373661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @message: Pointer to incoming dbus message 1374661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1375661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 1376661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * 1377661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Handler function for "SignalPoll" method call of a network device. Requests 1378661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * that wpa_supplicant read signal properties like RSSI, noise, and link 1379661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * speed and return them. 1380661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */ 1381661b4f78e48c697429dc46154a4125892c001718Dmitry ShmidtDBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message, 1382661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_supplicant *wpa_s) 1383661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 1384661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_signal_info si; 1385661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt DBusMessage *reply = NULL; 1386661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt DBusMessageIter iter, iter_dict, variant_iter; 1387661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt int ret; 1388661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1389661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt ret = wpa_drv_signal_poll(wpa_s, &si); 1390661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (ret) { 1391661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return dbus_message_new_error(message, DBUS_ERROR_FAILED, 1392661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt "Failed to read signal"); 1393661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 1394661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1395661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt reply = dbus_message_new_method_return(message); 1396661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (reply == NULL) 1397661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1398661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1399661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 1400661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1401661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, 14026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 14036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) || 14046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "rssi", 14056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_signal) || 14066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "linkspeed", 14076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_txrate / 1000) || 14086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "noise", 14096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.current_noise) || 14106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_uint32(&iter_dict, "frequency", 14116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.frequency) || 14126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.chanwidth != CHAN_WIDTH_UNKNOWN && 14136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_string( 14146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_dict, "width", 14156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt channel_width_to_string(si.chanwidth))) || 14166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.center_frq1 > 0 && si.center_frq2 > 0 && 14176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1", 14186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.center_frq1) || 14196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2", 14206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.center_frq2))) || 14216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (si.avg_signal && 14226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi", 14236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt si.avg_signal)) || 14246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 14256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(&iter, &variant_iter)) 1426661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt goto nomem; 1427661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1428661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return reply; 1429661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1430661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtnomem: 1431661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (reply) 1432661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt dbus_message_unref(reply); 14336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 1434661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 1435661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1436661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_disconnect - Terminate the current connection 14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NotConnected DBus error message if already not connected 14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * or NULL otherwise. 14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "Disconnect" method call of network interface. 14458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14468d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message, 14478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->disconnected = 1; 14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "This interface is not connected"); 14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_add_network - Add a new configured network 14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing the object path of the new network 14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "AddNetwork" method call of a network interface. 14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_network(DBusMessage *message, 14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter; 14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = NULL; 14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf; 14771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError error; 14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_add_network(wpa_s->conf); 14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 14836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.", 14846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_unknown_error( 14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt message, 14876c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa_supplicant could not add a network on this interface."); 14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_added(wpa_s, ssid); 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->disabled = 1; 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_network_defaults(ssid); 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_init(&error); 14951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!set_network_properties(wpa_s, ssid, &iter, &error)) { 14966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 14976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: control interface couldn't set network properties", 14986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 14991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_reply_new_from_error(message, &error, 15001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 15011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Failed to add network"); 15021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_error_free(&error); 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, 15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (reply == NULL) { 15136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &path, 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID)) { 15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 15196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid) { 15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_remove_network(wpa_s->conf, ssid->id); 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1535413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * wpas_dbus_handler_reassociate - Reassociate 153661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @message: Pointer to incoming dbus message 153761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 1538413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt * Returns: InterfaceDisabled DBus error message if disabled 153961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * or NULL otherwise. 154061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * 154161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Handler function for "Reassociate" method call of network interface. 154261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */ 154361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtDBusMessage * wpas_dbus_handler_reassociate(DBusMessage *message, 154461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt struct wpa_supplicant *wpa_s) 154561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 1546413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) { 1547d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpas_request_connection(wpa_s); 154861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return NULL; 154961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 155061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 1551413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_IFACE_DISABLED, 1552413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt "This interface is disabled"); 155361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 155461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 155561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 155661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/** 15579866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * wpas_dbus_handler_reattach - Reattach to current AP 15589866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @message: Pointer to incoming dbus message 15599866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15609866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Returns: NotConnected DBus error message if not connected 15619866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * or NULL otherwise. 15629866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * 15639866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt * Handler function for "Reattach" method call of network interface. 15649866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt */ 15659866086a955d00e237cc8df3722e7dff75c02532Dmitry ShmidtDBusMessage * wpas_dbus_handler_reattach(DBusMessage *message, 15669866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt struct wpa_supplicant *wpa_s) 15679866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{ 15689866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt if (wpa_s->current_ssid != NULL) { 15699866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt wpa_s->reattach = 1; 15709866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt wpas_request_connection(wpa_s); 15719866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return NULL; 15729866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt } 15739866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 15749866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return dbus_message_new_error(message, WPAS_DBUS_ERROR_NOT_CONNECTED, 15759866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt "This interface is not connected"); 15769866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt} 15779866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 15789866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 15799866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt/** 15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_network - Remove a configured network 15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveNetwork" method call of a network interface. 15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message, 15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 15926c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 15952f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt int was_disabled; 15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 16026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 16036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 16046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1605d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (iface == NULL || net_id == NULL || 1606d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1611d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1613d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16242f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt was_disabled = ssid->disabled; 16252f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 16312f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt else if (!was_disabled && wpa_s->sched_scanning) { 16326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, 16336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Stop ongoing sched_scan to remove network from filters"); 16342f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 16352f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 16362f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 16372f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 1638684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, id) < 0) { 1639684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt wpa_printf(MSG_ERROR, 16406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: error occurred when removing network %d", 16416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, id); 1642684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt reply = wpas_dbus_error_unknown_error( 16436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt message, 16446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "error removing the specified network on is interface."); 1645684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt goto out; 1646684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt } 16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void remove_network(void *arg, struct wpa_ssid *ssid) 16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = arg; 16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_network_removed(wpa_s, ssid); 16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_network(wpa_s->conf, ssid->id) < 0) { 16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, 16626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "%s[dbus]: error occurred when removing network %d", 16636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__, ssid->id); 16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == wpa_s->current_ssid) 1668d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, 1669d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_remove_all_networks - Remove all configured networks 16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "RemoveAllNetworks" method call of a network interface. 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_all_networks( 16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16842f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt if (wpa_s->sched_scanning) 16852f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt wpa_supplicant_cancel_sched_scan(wpa_s); 16862f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* NB: could check for failure and return an error */ 16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_foreach_network(wpa_s->conf, remove_network, wpa_s); 16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_select_network - Attempt association with a network 16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error on failure 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "SelectNetwork" method call of network interface. 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_select_network(DBusMessage *message, 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *op; 17066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id; 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Extract the network ID and ensure the network */ 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* is actually a child of this interface */ 17156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 17166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 17176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1718d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (iface == NULL || net_id == NULL || 1719d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1724d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = strtoul(net_id, NULL, 10); 1726d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Finally, associate with the network */ 17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_select_network(wpa_s, ssid); 17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(iface); 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 17471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * wpas_dbus_handler_network_reply - Reply to a NetworkRequest signal 17481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @message: Pointer to incoming dbus message 17491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 17501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: NULL on success or dbus error on failure 17511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * 17521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Handler function for "NetworkReply" method call of network interface. 17531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */ 17541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtDBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message, 17551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s) 17561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 17571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef IEEE8021X_EAPOL 17581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessage *reply = NULL; 17591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *op, *field, *value; 17606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *iface, *net_id; 17611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int id; 17621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ssid *ssid; 17631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 17641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_get_args(message, NULL, 17656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_OBJECT_PATH, &op, 17666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_STRING, &field, 17676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_STRING, &value, 17686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt DBUS_TYPE_INVALID)) 17691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_invalid_args(message, NULL); 17701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 17711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Extract the network ID and ensure the network */ 17721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* is actually a child of this interface */ 17736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt iface = wpas_dbus_new_decompose_object_path(op, 17746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPAS_DBUS_NEW_NETWORKS_PART, 17756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &net_id); 1776d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (iface == NULL || net_id == NULL || 1777d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt os_strcmp(iface, wpa_s->dbus_new_path) != 0) { 17781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, op); 17791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 17801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 17811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1782d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt errno = 0; 17831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt id = strtoul(net_id, NULL, 10); 1784d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (errno != 0) { 17851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, net_id); 17861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 17871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 17881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 17891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 17901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (ssid == NULL) { 17911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_network_unknown(message); 17921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto out; 17931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 17941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 17951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid, 17961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt field, value) < 0) 17971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reply = wpas_dbus_error_invalid_args(message, field); 17981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else { 17991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /* Tell EAP to retry immediately */ 18001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt eapol_sm_notify_ctrl_response(wpa_s->eapol); 18011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 18021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtout: 18041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(iface); 18051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return reply; 18061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#else /* IEEE8021X_EAPOL */ 18071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included"); 18081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_error_unknown_error(message, "802.1X not included"); 18091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 18101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 18111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1813700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 1814700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 18151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/** 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_add_blob - Store named binary blob (ie, for certificates) 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally store a binary blobs. 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message, 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *blob_data; 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int blob_len; 18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob = NULL; 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init(message, &iter); 18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_basic(&iter, &blob_name); 18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_get_blob(wpa_s->conf, blob_name)) { 18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_EXISTS, 18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL); 18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_next(&iter); 18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_recurse(&iter, &array_iter); 18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_get_fixed_array(&array_iter, &blob_data, &blob_len); 18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = os_zalloc(sizeof(*blob)); 18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 18506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->data = os_malloc(blob_len); 18556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt blob->name = os_strdup(blob_name); 18566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!blob->data || !blob->name) { 18576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto err; 18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(blob->data, blob_data, blob_len); 18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len = blob_len; 18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(wpa_s->conf, blob); 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_added(wpa_s, blob->name); 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidterr: 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob) { 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->name); 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob->data); 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(blob); 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_get_blob - Get named binary blob (ie, for certificates) 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing array of bytes (blob) 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Gets one wpa_supplicant's binary blobs. 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message, 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessageIter iter, array_iter; 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpa_config_blob *blob; 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_config_get_blob(wpa_s->conf, blob_name); 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!blob) { 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply = dbus_message_new_method_return(message); 19066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!reply) 19076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_iter_init_append(reply, &iter); 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 19136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &array_iter) || 19146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, 19156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &(blob->data), blob->len) || 19166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(&iter, &array_iter)) { 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_unref(reply); 19186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_remove_handler_remove_blob - Remove named binary blob 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL on success or dbus error 19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Asks wpa_supplicant to internally remove a binary blobs. 19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message, 19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBusMessage *reply = NULL; 19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *blob_name; 19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &blob_name, 19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_remove_blob(wpa_s->conf, blob_name)) { 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbus_message_new_error(message, 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPAS_DBUS_ERROR_BLOB_UNKNOWN, 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Blob id not set"); 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpas_notify_blob_removed(wpa_s, blob_name); 19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reply; 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1953700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 1954700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 1955700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_handler_flush_bss - Flush the BSS cache 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: NULL 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "FlushBSS" method call of network interface. 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message, 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s) 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t age; 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_UINT32, &age, 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_INVALID); 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (age == 0) 19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush(wpa_s); 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_bss_flush_by_age(wpa_s, age); 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 198104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 198204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 198304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_handler_autoscan - Set autoscan parameters for the interface 198404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @message: Pointer to incoming dbus message 198504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 198604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: NULL 198704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 198804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Handler function for "AutoScan" method call of network interface. 198904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 199004949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_autoscan(DBusMessage *message, 199104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s) 199204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 199304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *reply = NULL; 199404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt enum wpa_states state = wpa_s->wpa_state; 199504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *arg; 199604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 199704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg, 199804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_TYPE_INVALID); 199904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 200004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (arg != NULL && os_strlen(arg) > 0) { 200104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *tmp; 20026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 200304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tmp = os_strdup(arg); 200404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (tmp == NULL) { 20056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt reply = wpas_dbus_error_no_memory(message); 200604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 200704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 200804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = tmp; 200904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (state == WPA_DISCONNECTED || state == WPA_INACTIVE) 201004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_init(wpa_s, 1); 201104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt else if (state == WPA_SCANNING) 201204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_supplicant_reinit_autoscan(wpa_s); 201304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 201404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (arg != NULL && os_strlen(arg) == 0) { 201504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->conf->autoscan); 201604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->conf->autoscan = NULL; 201704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt autoscan_deinit(wpa_s); 201804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else 201904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt reply = dbus_message_new_error(message, 202004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBUS_ERROR_INVALID_ARGS, 202104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt NULL); 202204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 202304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return reply; 202404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 202504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 202604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 202704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 20288da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/* 20298da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logoff - IEEE 802.1X EAPOL state machine logoff 20308da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message 20318da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20328da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL 20338da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * 20348da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogoff" method call of network interface. 20358da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 20368da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logoff(DBusMessage *message, 20378da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt struct wpa_supplicant *wpa_s) 20388da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{ 20398da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, TRUE); 20408da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return NULL; 20418da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt} 20428da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 20438da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 20448da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/* 20458da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * wpas_dbus_handler_eap_logon - IEEE 802.1X EAPOL state machine logon 20468da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @message: Pointer to incoming dbus message 20478da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 20488da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Returns: NULL 20498da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * 20508da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt * Handler function for "EAPLogin" method call of network interface. 20518da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt */ 20528da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry ShmidtDBusMessage * wpas_dbus_handler_eap_logon(DBusMessage *message, 20538da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt struct wpa_supplicant *wpa_s) 20548da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt{ 20558da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, FALSE); 20568da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return NULL; 20578da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt} 20588da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 20598da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 2060e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#ifdef CONFIG_TDLS 2061e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 20627d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidtstatic int get_peer_hwaddr_helper(DBusMessage *message, const char *func_name, 20637d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt u8 *peer_address, DBusMessage **error) 2064e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2065e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt const char *peer_string; 2066e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 20677d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = NULL; 20687d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt 2069e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (!dbus_message_get_args(message, NULL, 2070e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBUS_TYPE_STRING, &peer_string, 20717d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt DBUS_TYPE_INVALID)) { 20727d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = wpas_dbus_error_invalid_args(message, NULL); 20737d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return -1; 20747d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt } 2075e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2076e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (hwaddr_aton(peer_string, peer_address)) { 2077e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: invalid address '%s'", 2078e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt func_name, peer_string); 20797d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt *error = wpas_dbus_error_invalid_args( 2080e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "Invalid hardware address format"); 20817d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return -1; 2082e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2083e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 20847d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt return 0; 2085e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2086e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2087e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2088e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2089e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_discover - Discover TDLS peer 2090e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2091e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2092e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2093e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2094e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSDiscover" method call of network interface. 2095e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2096e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message, 2097e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2098e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2099e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2100e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2101e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2102e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21037d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2104e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2105e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2106e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_DISCOVER " MACSTR, MAC2STR(peer)); 2107e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2108e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2109e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer); 2110e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2111e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer); 2112e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2113e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2114e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2115e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS discovery"); 2116e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2117e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2118e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2119e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2120e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2121e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2122e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2123e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_setup - Setup TDLS session 2124e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2125e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2126e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2127e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2128e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSSetup" method call of network interface. 2129e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2130e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message, 2131e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2132e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2133e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2134e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2135e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2136e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21377d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2138e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2139e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2140e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_SETUP " MACSTR, MAC2STR(peer)); 2141e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2142e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_tdls_remove(wpa_s->wpa, peer); 2143e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2144e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_start(wpa_s->wpa, peer); 2145e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2146e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer); 2147e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2148e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2149e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2150e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS setup"); 2151e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2152e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2153e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2154e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2155e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2156e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2157e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2158e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_status - Return TDLS session status 2159e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2160e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2161e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: A string representing the state of the link to this TDLS peer 2162e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2163e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSStatus" method call of network interface. 2164e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2165e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_status(DBusMessage *message, 2166e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2167e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2168e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2169e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *reply; 2170e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt const char *tdls_status; 2171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 21727d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &reply) < 0) 2173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return reply; 2174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2175e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_STATUS " MACSTR, MAC2STR(peer)); 2176e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2177e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt tdls_status = wpa_tdls_get_link_status(wpa_s->wpa, peer); 2178e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2179e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt reply = dbus_message_new_method_return(message); 2180e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt dbus_message_append_args(reply, DBUS_TYPE_STRING, 2181e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt &tdls_status, DBUS_TYPE_INVALID); 2182e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return reply; 2183e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2184e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2185e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2186e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/* 2187e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * wpas_dbus_handler_tdls_teardown - Teardown TDLS session 2188e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @message: Pointer to incoming dbus message 2189e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @wpa_s: wpa_supplicant structure for a network interface 2190e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Returns: NULL indicating success or DBus error message on failure 2191e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * 2192e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Handler function for "TDLSTeardown" method call of network interface. 2193e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */ 2194e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry ShmidtDBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message, 2195e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt struct wpa_supplicant *wpa_s) 2196e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 2197e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt u8 peer[ETH_ALEN]; 2198e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt DBusMessage *error_reply; 2199e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt int ret; 2200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22017d5c8f257a74ac0d12828962a492e8b84ef83923Dmitry Shmidt if (get_peer_hwaddr_helper(message, __func__, peer, &error_reply) < 0) 2202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return error_reply; 2203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_printf(MSG_DEBUG, "DBUS TDLS_TEARDOWN " MACSTR, MAC2STR(peer)); 2205e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2206e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (wpa_tdls_is_external_setup(wpa_s->wpa)) 2207e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_tdls_teardown_link( 2208e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt wpa_s->wpa, peer, 2209e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 2210e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt else 2211e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer); 2212e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2213e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (ret) { 2214e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpas_dbus_error_unknown_error( 2215e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt message, "error performing TDLS teardown"); 2216e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt } 2217e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2218e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return NULL; 2219e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 2220e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2221e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt#endif /* CONFIG_TDLS */ 2222e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 2223e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 222501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path 222601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @message: Pointer to incoming dbus message 222701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure 222801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing an error on failure or NULL on success 222901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 223001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Sets the PKCS #11 engine and module path. 223101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 223201904cfafd75a70b9f29c0220b90bdef45595491Dmitry ShmidtDBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path( 223301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 223401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 223501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusMessageIter iter; 223601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *value = NULL; 223701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *pkcs11_engine_path = NULL; 223801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt char *pkcs11_module_path = NULL; 223901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 224001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_init(message, &iter); 224101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_get_basic(&iter, &value); 224201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (value == NULL) { 224301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 224401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, 224501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Invalid pkcs11_engine_path argument"); 224601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 224701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt /* Empty path defaults to NULL */ 224801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (os_strlen(value)) 224901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = value; 225001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 225101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_next(&iter); 225201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt dbus_message_iter_get_basic(&iter, &value); 225301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (value == NULL) { 225401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt os_free(pkcs11_engine_path); 225501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 225601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_INVALID_ARGS, 225701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt "Invalid pkcs11_module_path argument"); 225801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt } 225901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt /* Empty path defaults to NULL */ 226001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (os_strlen(value)) 226101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = value; 226201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 226301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path, 226401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path)) 226501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return dbus_message_new_error( 226601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt message, DBUS_ERROR_FAILED, 22676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed."); 226801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 226901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt wpa_dbus_mark_property_changed( 227001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt wpa_s->global->dbus, wpa_s->dbus_new_path, 227101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath"); 227201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt wpa_dbus_mark_property_changed( 227301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt wpa_s->global->dbus, wpa_s->dbus_new_path, 227401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath"); 227501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 227601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return NULL; 227701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 227801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 227901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 228001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_capabilities - Return interface capabilities 22821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 22831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 22841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 22851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 22868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 22878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Capabilities" property of an interface. 22888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 22891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_capabilities(DBusMessageIter *iter, 22901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_capa capa; 22948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 22951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, iter_dict_entry, iter_dict_val, iter_array, 22968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt variant_iter; 22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *scans[] = { "active", "passive", "ssid" }; 22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 23006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 23016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = wpa_drv_get_capa(wpa_s, &capa); 23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** pairwise cipher */ 23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = {"ccmp", "tkip", "none"}; 23096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Pairwise", args, 231268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Pairwise", 23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 23186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 23196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) && 23206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp-256")) || 23226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) && 23236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp-256")) || 23256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) && 23266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp")) || 23286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) && 23296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp")) || 23316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) && 23326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "tkip")) || 23346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) && 23356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "none")) || 23376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 23388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** group cipher */ 23458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 23468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 23478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ccmp", "tkip", "wep104", "wep40" 23488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 23496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Group", args, 235268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Group", 23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 23586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 23596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP_256) && 23606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp-256")) || 23626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP_256) && 23636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp-256")) || 23656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_CCMP) && 23666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ccmp")) || 23686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_GCMP) && 23696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "gcmp")) || 23716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_TKIP) && 23726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "tkip")) || 23746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP104) && 23756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wep104")) || 23776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.enc & WPA_DRIVER_CAPA_ENC_WEP40) && 23786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 23796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wep40")) || 23806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** key management */ 23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { 23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa-psk", "wpa-eap", "ieee8021x", "wpa-none", 23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps", 23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "none" 23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "KeyMgmt", args, 239868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "KeyMgmt", 24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 24056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 24066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "none") || 24076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ieee8021x")) 24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) { 24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-eap") || 24156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_FT) && 24166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-ft-eap"))) 24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-eap-sha256")) 24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | 24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-psk") || 24326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & 24336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK) && 24346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa-ft-psk"))) 24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* TODO: Ensure that driver actually supports sha256 encryption. */ 24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element( 24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array, "wpa-psk-sha256")) 24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if ((capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) && 24476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element(&iter_array, 24486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "wpa-none")) 24496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt goto nomem; 24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_string_array_add_element(&iter_array, 24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wps")) 24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_end_string_array(&iter_dict, 24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** WPA protocol */ 24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "rsn", "wpa" }; 24686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "Protocol", args, 247168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Protocol", 24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 24786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | 24796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) && 24806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24816c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "rsn")) || 24826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 24836c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) && 24846c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 24856c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "wpa")) || 24866c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** auth alg */ 24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *args[] = { "open", "shared", "leap" }; 24966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array( 24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict, "AuthAlg", args, 249968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(args))) 25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_begin_string_array(&iter_dict, "AuthAlg", 25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (((capa.auth & WPA_DRIVER_AUTH_OPEN) && 25096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "open")) || 25116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.auth & WPA_DRIVER_AUTH_SHARED) && 25126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "shared")) || 25146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ((capa.auth & WPA_DRIVER_AUTH_LEAP) && 25156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "leap")) || 25176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_entry, 25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_dict_val, 25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &iter_array)) 25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Scan */ 25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Scan", scans, 252668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt ARRAY_SIZE(scans))) 25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /***** Modes */ 253075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!wpa_dbus_dict_begin_string_array(&iter_dict, "Modes", 253175ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 253275ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 25336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array) || 25346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "infrastructure") || 25366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ad-hoc") || 25386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_AP) && 25396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "ap")) || 25416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (res >= 0 && (capa.flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) && 25426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_string_array_add_element( 25436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt &iter_array, "p2p")) || 25446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_end_string_array(&iter_dict, 254575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_entry, 254675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_dict_val, 254775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen &iter_array)) 254875ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen goto nomem; 254975ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen /***** Modes end */ 255075ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen 25511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res >= 0) { 25521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_int32_t max_scan_ssid = capa.max_scan_ssids; 25531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpa_dbus_dict_append_int32(&iter_dict, "MaxScanSSID", 25551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt max_scan_ssid)) 25561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt goto nomem; 25571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 25581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 25606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 25661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 25671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_state - Get interface state 25731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 25741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 25751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 25761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "State" property. 25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 25801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_state(DBusMessageIter *iter, DBusError *error, 25811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *str_state; 25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *state_ls, *tmp; 25861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str_state = wpa_supplicant_state_txt(wpa_s->wpa_state); 25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* make state string lowercase to fit new DBus API convention 25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt state_ls = tmp = os_strdup(str_state); 25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!tmp) { 25941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 25951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*tmp) { 25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *tmp = tolower(*tmp); 25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tmp++; 26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 26031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &state_ls, error); 26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(state_ls); 26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_new_iface_get_scanning - Get interface scanning state 26131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "scanning" property. 26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scanning(DBusMessageIter *iter, DBusError *error, 26216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt void *user_data) 26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE; 26251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 26271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &scanning, error); 26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ap_scan - Control roaming mode 26331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "ApScan" property. 26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ap_scan(DBusMessageIter *iter, DBusError *error, 26411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan = wpa_s->conf->ap_scan; 26451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 26471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan, error); 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_ap_scan - Control roaming mode 26531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 26541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 26551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 26561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "ApScan" property. 26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 26601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_ap_scan(DBusMessageIter *iter, DBusError *error, 26611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t ap_scan; 26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 26671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ap_scan)) 26681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) { 26711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 26721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "ap_scan must be 0, 1, or 2"); 26731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2680c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_getter_fast_reauth - Control fast 2681c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2682c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2683c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2684c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2685c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2686c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2687c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Getter function for "FastReauth" property. 2688c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2689c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_getter_fast_reauth(DBusMessageIter *iter, 2690c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2691c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2692c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2693c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2694c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth = wpa_s->conf->fast_reauth ? TRUE : FALSE; 2695c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2696c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 2697c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth, error); 2698c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2699c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2700c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2701c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 2702c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * wpas_dbus_setter_fast_reauth - Control fast 2703c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * reauthentication (TLS session resumption) 2704c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 2705c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @error: Location to store error on failure 2706c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * @user_data: Function specific data 2707c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 2708c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * 2709c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * Setter function for "FastReauth" property. 2710c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt */ 2711c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtdbus_bool_t wpas_dbus_setter_fast_reauth(DBusMessageIter *iter, 2712c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt DBusError *error, 2713c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt void *user_data) 2714c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 2715c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 2716c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt dbus_bool_t fast_reauth; 2717c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2718c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 2719c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &fast_reauth)) 2720c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return FALSE; 2721c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2722c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt wpa_s->conf->fast_reauth = fast_reauth; 2723c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return TRUE; 2724c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 2725c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2726c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 2727c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/** 272804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_disconnect_reason - Get most recent reason for disconnect 272904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 273004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 273104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 273204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 273304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 273404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter for "DisconnectReason" property. The reason is negative if it is 273504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * locally generated. 273604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 273704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_disconnect_reason(DBusMessageIter *iter, 273804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 273904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 274004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 274104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 274204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t reason = wpa_s->disconnect_reason; 27436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 274404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 274504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &reason, error); 274604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 274704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 274804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 274904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_age - Get BSS entry expiration age 27511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireAge" property. 27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_age(DBusMessageIter *iter, 27591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 27601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age = wpa_s->conf->bss_expiration_age; 27641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 27661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age, error); 27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_age - Control BSS entry expiration age 27721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 27731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 27741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 27751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireAge" property. 27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 27791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_age(DBusMessageIter *iter, 27801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 27811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_age; 27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 27871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_age)) 27881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_age(wpa_s, expire_age)) { 27911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 27921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireAge must be >= 10"); 27931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_expire_count - Get BSS entry expiration scan count 28011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "BSSExpireCount" property. 28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_expire_count(DBusMessageIter *iter, 28091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 28101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 281361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt dbus_uint32_t expire_count = wpa_s->conf->bss_expiration_scan_count; 28141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 28151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, 28161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count, error); 28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_bss_expire_count - Control BSS entry expiration scan count 28221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "BSSExpireCount" property. 28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_bss_expire_count(DBusMessageIter *iter, 28301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 28311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_uint32_t expire_count; 28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_UINT32, 28371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &expire_count)) 28381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_set_bss_expiration_count(wpa_s, expire_count)) { 28411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 28421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "BSSExpireCount must be > 0"); 28431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_country - Control country code 28511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter function for "Country" property. 28578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_country(DBusMessageIter *iter, DBusError *error, 28591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char country[3]; 28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *str = country; 28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[0] = wpa_s->conf->country[0]; 28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[1] = wpa_s->conf->country[1]; 28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt country[2] = '\0'; 28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 28701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &str, error); 28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_country - Control country code 28761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 28771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 28781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 28791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter function for "Country" property. 28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 28831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_country(DBusMessageIter *iter, DBusError *error, 28841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *country; 28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING, 28901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &country)) 28911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!country[0] || !country[1]) { 28941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 28951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "invalid country code"); 28961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 28971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->drv_priv != NULL && wpa_drv_set_country(wpa_s, country)) { 29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Failed to set country"); 29011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 29021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "failed to set country code"); 29031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[0] = country[0]; 29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->conf->country[1] = country[1]; 29081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 291304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_getter_scan_interval - Get scan interval 291404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 291504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 291604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 291704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 291804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 291904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Getter function for "ScanInterval" property. 292004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 292104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_getter_scan_interval(DBusMessageIter *iter, 292204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 292304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 292404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 292504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 292604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval = wpa_s->scan_interval; 292704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 292804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT32, 292904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval, error); 293004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 293104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 293204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 293304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 293404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * wpas_dbus_setter_scan_interval - Control scan interval 293504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 293604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @error: Location to store error on failure 293704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * @user_data: Function specific data 293804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 293904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 294004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Setter function for "ScanInterval" property. 294104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 294204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtdbus_bool_t wpas_dbus_setter_scan_interval(DBusMessageIter *iter, 294304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusError *error, 294404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void *user_data) 294504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 294604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 294704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_int32_t scan_interval; 294804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 294904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_INT32, 295004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt &scan_interval)) 295104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 295204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 295304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_supplicant_set_scan_interval(wpa_s, scan_interval)) { 295404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 295504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "scan_interval must be >= 0"); 295604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return FALSE; 295704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 295804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return TRUE; 295904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 296004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 296104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 296204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/** 29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_ifname - Get interface name 29641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Ifname" property. 29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error, 29721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname = wpa_s->ifname; 29761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 29781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &ifname, error); 29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_driver - Get interface name 29841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 29851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 29861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 29871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Driver" property. 29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 29911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error, 29921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *driver; 29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->driver == NULL || wpa_s->driver->name == NULL) { 29986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_printf(MSG_DEBUG, "%s[dbus]: wpa_s has no driver set", 29996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt __func__); 30001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set", 30011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt __func__); 30021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt driver = wpa_s->driver->name; 30061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 30071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &driver, error); 30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_bss - Get current bss object path 30131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentBSS" property. 30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter, 30211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 30221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf; 30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_bss) 30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_bss->id); 30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 30351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bss_obj_path, error); 30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_network - Get current network object path 30411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentNetwork" property. 30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter, 30491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf; 30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->current_ssid) 30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, 30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u", 30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, wpa_s->current_ssid->id); 30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); 30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, 30631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &net_obj_path, error); 30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_current_auth_mode - Get current authentication type 30691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 30701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 30711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 30721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "CurrentAuthMode" property. 30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_current_auth_mode(DBusMessageIter *iter, 30771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 30781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *eap_mode; 30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *auth_mode; 30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char eap_mode_buf[WPAS_DBUS_AUTH_MODE_MAX]; 30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->wpa_state != WPA_COMPLETED) { 30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = "INACTIVE"; 30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X || 30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_mode = wpa_supplicant_get_eap_mode(wpa_s); 30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(eap_mode_buf, WPAS_DBUS_AUTH_MODE_MAX, 30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "EAP-%s", eap_mode); 30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = eap_mode_buf; 30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_mode = wpa_key_mgmt_txt(wpa_s->key_mgmt, 30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->current_ssid->proto); 30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 31001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &auth_mode, error); 31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bridge_ifname - Get interface name 31061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BridgeIfname" property. 31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter, 31141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 31151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *bridge_ifname = wpa_s->bridge_ifname; 31196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 31201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 31211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &bridge_ifname, error); 31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bsss - Get array of BSSs objects 31271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSs" property. 31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error, 31351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_bss *bss; 31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0; 31411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 314361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(wpa_s->num_bss, sizeof(char *)); 31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 31451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 31461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through scan results and append each result's object path */ 31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) { 31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 31531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 31541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this BSS. */ 31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", 31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, bss->id); 31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 31641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 31651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, wpa_s->num_bss, 31661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 31721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_networks - Get array of networks objects 31781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 31791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 31801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 31811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Networks" property. 31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 31851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error, 31861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **paths; 31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int i = 0, num = 0; 31921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 319575ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (!network_is_persistent_group(ssid)) 319675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen num++; 31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 319861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt paths = os_calloc(num, sizeof(char *)); 31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!paths) { 32001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, "no memory"); 32011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Loop through configured networks and append object path of each */ 32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) { 320675ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen if (network_is_persistent_group(ssid)) 320775ecf5267604f166b85a7ee2cf0d9cb682966680Jouni Malinen continue; 32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt paths[i] = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX); 32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (paths[i] == NULL) { 32106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error(error, DBUS_ERROR_NO_MEMORY, 32116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "no memory"); 32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Construct the object path for this network. */ 32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, 32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", 32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->dbus_new_path, ssid->id); 32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, 32221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBUS_TYPE_OBJECT_PATH, 32231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt paths, num, error); 32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (i) 32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths[--i]); 32288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(paths); 32291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 323401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path 323501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 323601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure 323701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data 323801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 engine path 323901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 324001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11EnginePath" property. 324101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 324201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_engine_path(DBusMessageIter *iter, 324301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusError *error, 324401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt void *user_data) 324501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 324601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 324701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt const char *pkcs11_engine_path; 324801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 324901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpa_s->conf->pkcs11_engine_path == NULL) 325001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = ""; 325101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt else 325201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path; 325301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 325401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt &pkcs11_engine_path, error); 325501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 325601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 325701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 325801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 325901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path 326001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 326101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @error: Location to store error on failure 326201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * @user_data: Function specific data 326301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Returns: A dbus message containing the PKCS #11 module path 326401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * 326501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt * Getter for "PKCS11ModulePath" property. 326601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt */ 326701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidtdbus_bool_t wpas_dbus_getter_pkcs11_module_path(DBusMessageIter *iter, 326801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt DBusError *error, 326901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt void *user_data) 327001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt{ 327101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 327201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt const char *pkcs11_module_path; 327301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 327401904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt if (wpa_s->conf->pkcs11_module_path == NULL) 327501904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = ""; 327601904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt else 327701904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt pkcs11_module_path = wpa_s->conf->pkcs11_module_path; 327801904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 327901904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt &pkcs11_module_path, error); 328001904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt} 328101904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 328201904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt 328301904cfafd75a70b9f29c0220b90bdef45595491Dmitry Shmidt/** 32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_blobs - Get all blobs defined for this interface 32851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 32861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 32871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 32881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Blobs" property. 32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 32921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error, 32931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_supplicant *wpa_s = user_data; 32961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter, entry_iter, array_iter; 32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{say}", &variant_iter) || 33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, 33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "{say}", &dict_iter)) { 33031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 33041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_s->conf->blobs; 33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (blob) { 33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_open_container(&dict_iter, 33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_DICT_ENTRY, 33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, &entry_iter) || 33128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_basic(&entry_iter, 33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_STRING, 33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->name)) || 33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_open_container(&entry_iter, 33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_ARRAY, 33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE_AS_STRING, 33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_append_fixed_array(&array_iter, 33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DBUS_TYPE_BYTE, 33218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &(blob->data), 33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->len) || 33238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&entry_iter, 33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &array_iter) || 33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !dbus_message_iter_close_container(&dict_iter, 33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &entry_iter)) { 33271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 33281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 33291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = blob->next; 33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dbus_message_iter_close_container(&variant_iter, &dict_iter) || 33361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 33371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 33381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 33421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 33431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct wpa_bss * get_bss_helper(struct bss_handler_args *args, 33461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, const char *func_name) 33471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 33481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res = wpa_bss_get_id(args->wpa_s, args->id); 33491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) { 33511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_printf(MSG_ERROR, "%s[dbus]: no bss with id %d found", 33526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt func_name, args->id); 33531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error(error, DBUS_ERROR_FAILED, 33541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "%s: BSS %d not found", 33551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt func_name, args->id); 33561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 33571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_bssid - Return the BSSID of a BSS 33641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "BSSID" property. 33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 33711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_bssid(DBusMessageIter *iter, DBusError *error, 33721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 33751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 33768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 33781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 33791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 33808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 33821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->bssid, ETH_ALEN, 33831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 33848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 33888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ssid - Return the SSID of a BSS 33891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 33901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 33911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 33921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 33938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 33948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "SSID" property. 33958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 33961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ssid(DBusMessageIter *iter, DBusError *error, 33971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 34071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res->ssid, res->ssid_len, 34081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 34098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_privacy - Return the privacy flag of a BSS 34141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Privacy" property. 34208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_privacy(DBusMessageIter *iter, 34221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 34238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t privacy; 34278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt privacy = (res->caps & IEEE80211_CAP_PRIVACY) ? TRUE : FALSE; 34331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 34341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &privacy, error); 34358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_mode - Return the mode of a BSS 34401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Mode" property. 34468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_mode(DBusMessageIter *iter, DBusError *error, 34481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 34528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *mode; 34538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 345776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt if (bss_is_dmg(res)) { 345876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt switch (res->caps & IEEE80211_CAP_DMG_MASK) { 345976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_PBSS: 346076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_IBSS: 346176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "ad-hoc"; 346276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt break; 346376cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt case IEEE80211_CAP_DMG_AP: 346476cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "infrastructure"; 346576cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt break; 346676cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } 346776cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } else { 346876cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt if (res->caps & IEEE80211_CAP_IBSS) 346976cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "ad-hoc"; 347076cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt else 347176cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt mode = "infrastructure"; 347276cd2cc44b62e858f1897ce58f4ce7d0174e8839Dmitry Shmidt } 34738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, 34751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &mode, error); 34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 34808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_level - Return the signal strength of a BSS 34811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 34821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 34831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 34841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 34868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Level" property. 34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_signal(DBusMessageIter *iter, 34891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 34908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 34921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3493c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt s16 level; 34948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 34961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 34971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 34988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3499c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt level = (s16) res->level; 35001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_INT16, 3501c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &level, error); 35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_frequency - Return the frequency of a BSS 35071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Frequency" property. 35138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_frequency(DBusMessageIter *iter, 35151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 35181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 3519c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt u16 freq; 35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 35221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 35231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3525c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt freq = (u16) res->freq; 35261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16, 3527c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt &freq, error); 35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int cmp_u8s_desc(const void *a, const void *b) 35328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (*(u8 *) b - *(u8 *) a); 35348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 35388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rates - Return available bit rates of a BSS 35391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 35401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 35411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 35421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 35438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Rates" property. 35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 35461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rates(DBusMessageIter *iter, 35471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, void *user_data) 35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 35501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 35518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ie_rates = NULL; 35528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u32 *real_rates; 35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int rates_num, i; 35541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 35571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 35581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rates_num = wpa_bss_get_bit_rates(res, &ie_rates); 35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (rates_num < 0) 35621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qsort(ie_rates, rates_num, 1, cmp_u8s_desc); 35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates = os_malloc(sizeof(u32) * rates_num); 35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!real_rates) { 35688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 35691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 35701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < rates_num; i++) 35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt real_rates[i] = ie_rates[i] * 500000; 35758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_UINT32, 35771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt real_rates, rates_num, 35781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ie_rates); 35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(real_rates); 35821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic dbus_bool_t wpas_dbus_get_bss_security_prop(DBusMessageIter *iter, 35871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_ie_data *ie_data, 35881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error) 35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 35918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *group; 3592fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt const char *pairwise[5]; /* max 5 pairwise ciphers is supported */ 3593807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt const char *key_mgmt[9]; /* max 9 key managements may be supported */ 35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 35958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "a{sv}", &variant_iter)) 35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* KeyMgmt */ 36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK) 36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk"; 36078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_PSK) 36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-psk"; 36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-psk-sha256"; 36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X) 36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap"; 36138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) 36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-ft-eap"; 36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) 36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-sha256"; 3617807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB 36186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B) 36196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt key_mgmt[n++] = "wpa-eap-suite-b"; 3620807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB */ 3621807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#ifdef CONFIG_SUITEB192 3622807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) 3623807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt key_mgmt[n++] = "wpa-eap-suite-b-192"; 3624807291d85bf857320aff6a8ade38c5f622ab9df8Dmitry Shmidt#endif /* CONFIG_SUITEB192 */ 36258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->key_mgmt & WPA_KEY_MGMT_NONE) 36268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt[n++] = "wpa-none"; 36278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "KeyMgmt", 36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_mgmt, n)) 36308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group */ 36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->group_cipher) { 36348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP40: 36358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep40"; 36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_TKIP: 36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "tkip"; 36398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_CCMP: 36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "ccmp"; 36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 364361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case WPA_CIPHER_GCMP: 364461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt group = "gcmp"; 364561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_WEP104: 36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "wep104"; 36488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3649fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt case WPA_CIPHER_CCMP_256: 3650fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt group = "ccmp-256"; 3651fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt break; 3652fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt case WPA_CIPHER_GCMP_256: 3653fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt group = "gcmp-256"; 3654fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt break; 36558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 36568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 36578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Group", group)) 36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Pairwise */ 36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n = 0; 36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_TKIP) 36668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "tkip"; 36678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP) 36688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise[n++] = "ccmp"; 366961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP) 367061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pairwise[n++] = "gcmp"; 3671fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_CCMP_256) 3672fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pairwise[n++] = "ccmp-256"; 3673fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (ie_data->pairwise_cipher & WPA_CIPHER_GCMP_256) 3674fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt pairwise[n++] = "gcmp-256"; 36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string_array(&iter_dict, "Pairwise", 36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise, n)) 36788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Management group (RSN only) */ 36818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_data->proto == WPA_PROTO_RSN) { 36828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ie_data->mgmt_group_cipher) { 36838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 36848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WPA_CIPHER_AES_128_CMAC: 36858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = "aes128cmac"; 36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 36888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group = ""; 36908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "MgmtGroup", 36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group)) 36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 36996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto nomem; 37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 37038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnomem: 37051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 37061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 37118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_wpa - Return the WPA options of a BSS 37121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 37131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 37141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 37151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "WPA" property. 37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 37191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wpa(DBusMessageIter *iter, DBusError *error, 37201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 37231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 37281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 37291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_vendor_ie(res, WPA_IE_VENDOR_TYPE); 37336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 37346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 37356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "failed to parse WPA IE"); 37366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_rsn - Return the RSN options of a BSS 37451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 37461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 37471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 37481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "RSN" property. 37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 37521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_rsn(DBusMessageIter *iter, DBusError *error, 37531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 37561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ie_data wpa_data; 37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie; 37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 37611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 37621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_data, 0, sizeof(wpa_data)); 37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = wpa_bss_get_ie(res, WLAN_EID_RSN); 37666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (ie && wpa_parse_wpa_ie(ie, 2 + ie[1], &wpa_data) < 0) { 37676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_FAILED, 37686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "failed to parse RSN IE"); 37696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return FALSE; 37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_get_bss_security_prop(iter, &wpa_data, error); 37738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 37748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3777d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * wpas_dbus_getter_bss_wps - Return the WPS options of a BSS 3778d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @iter: Pointer to incoming dbus message iter 3779d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @error: Location to store error on failure 3780d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * @user_data: Function specific data 3781d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Returns: TRUE on success, FALSE on failure 3782d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * 3783d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt * Getter for "WPS" property. 3784d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt */ 3785d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_wps(DBusMessageIter *iter, DBusError *error, 3786d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt void *user_data) 3787d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 3788d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct bss_handler_args *args = user_data; 3789d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpa_bss *res; 3790d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 3791d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt struct wpabuf *wps_ie; 3792d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 3793d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt DBusMessageIter iter_dict, variant_iter; 3794d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const char *type = ""; 3795d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3796d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt res = get_bss_helper(args, error, __func__); 3797d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!res) 3798d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 3799d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3800d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, 38016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "a{sv}", &variant_iter) || 38026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &iter_dict)) 3803d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3804d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3805d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#ifdef CONFIG_WPS 3806d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt wps_ie = wpa_bss_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE); 3807d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_ie) { 3808d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (wps_is_selected_pbc_registrar(wps_ie)) 3809d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pbc"; 3810d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt else if (wps_is_selected_pin_registrar(wps_ie)) 3811d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt type = "pin"; 38126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 38136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpabuf_free(wps_ie); 3814d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 3815d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt#endif /* CONFIG_WPS */ 3816d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 38176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_append_string(&iter_dict, "Type", type) || 38186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || 38196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) 3820d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt goto nomem; 3821d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3822d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return TRUE; 3823d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3824d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtnomem: 3825d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 3826d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return FALSE; 3827d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 3828d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3829d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 3830d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/** 38318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_bss_ies - Return all IEs of a BSS 38321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 38331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 38341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 38351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 38368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 38378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "IEs" property. 38388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 38391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_ies(DBusMessageIter *iter, DBusError *error, 38401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 38418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct bss_handler_args *args = user_data; 38431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct wpa_bss *res; 38448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = get_bss_helper(args, error, __func__); 38461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!res) 38471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 38488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE, 38501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res + 1, res->ie_len, 38511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt error); 38528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3856661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * wpas_dbus_getter_bss_age - Return time in seconds since BSS was last seen 3857661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @iter: Pointer to incoming dbus message iter 3858661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @error: Location to store error on failure 3859661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * @user_data: Function specific data 3860661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Returns: TRUE on success, FALSE on failure 3861661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * 3862661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt * Getter for BSS age 3863661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt */ 3864661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtdbus_bool_t wpas_dbus_getter_bss_age(DBusMessageIter *iter, DBusError *error, 3865661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt void *user_data) 3866661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 3867661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct bss_handler_args *args = user_data; 3868661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct wpa_bss *res; 3869661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt struct os_reltime now, diff = { 0, 0 }; 3870661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt u32 age; 3871661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3872661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt res = get_bss_helper(args, error, __func__); 3873661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (!res) 3874661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return FALSE; 3875661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3876661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_get_reltime(&now); 3877661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_reltime_sub(&now, &res->last_update, &diff); 3878661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt age = diff.sec > 0 ? diff.sec : 0; 3879661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT32, &age, 3880661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt error); 3881661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 3882661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3883661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 3884661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt/** 38858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_enabled - Check whether network is enabled or disabled 38861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 38871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 38881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 38891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 38908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 38918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "enabled" property of a configured network. 38928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 38931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_enabled(DBusMessageIter *iter, DBusError *error, 38941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 38958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 38978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enabled = net->ssid->disabled ? FALSE : TRUE; 38981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 38991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN, 39001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enabled, error); 39018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 39058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_enabled - Mark a configured network as enabled or disabled 39061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 39071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 39081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 39091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 39108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 39118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Enabled" property of a configured network. 39128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 39131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_enabled(DBusMessageIter *iter, DBusError *error, 39141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 39158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 39178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s; 39188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 39198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbus_bool_t enable; 39208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, 39221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &enable)) 39231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 39248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s = net->wpa_s; 39268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = net->ssid; 39278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (enable) 39298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_enable_network(wpa_s, ssid); 39308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 39318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_disable_network(wpa_s, ssid); 39328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TRUE; 39348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 39388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_getter_network_properties - Get options for a configured network 39391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 39401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 39411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 39421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 39438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 39448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Getter for "Properties" property of a configured network. 39458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 39461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_getter_network_properties(DBusMessageIter *iter, 39471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 39481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 39498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 39511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter, dict_iter; 39528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **iterator; 39538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **props = wpa_config_get_all(net->ssid, 1); 39541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_bool_t success = FALSE; 39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!props) { 39571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 39581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return FALSE; 39598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}", 39621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt &variant_iter) || 39638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !wpa_dbus_dict_open_write(&variant_iter, &dict_iter)) { 39641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 39658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 39668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 39698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 39708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_append_string(&dict_iter, *iterator, 39718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *(iterator + 1))) { 39721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, 39731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "no memory"); 39748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 39758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator += 2; 39778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) || 39811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !dbus_message_iter_close_container(iter, &variant_iter)) { 39821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); 39838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto out; 39848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt success = TRUE; 39871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 39888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtout: 39898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator = props; 39908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*iterator) { 39918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(*iterator); 39928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iterator++; 39938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(props); 39951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return success; 39968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 40008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_setter_network_properties - Set options for a configured network 40011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @iter: Pointer to incoming dbus message iter 40021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @error: Location to store error on failure 40031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * @user_data: Function specific data 40041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Returns: TRUE on success, FALSE on failure 40058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 40068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Setter for "Properties" property of a configured network. 40078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 40081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtdbus_bool_t wpas_dbus_setter_network_properties(DBusMessageIter *iter, 40091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusError *error, 40101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void *user_data) 40118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct network_handler_args *net = user_data; 40138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid = net->ssid; 40141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt DBusMessageIter variant_iter; 40158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dbus_message_iter_recurse(iter, &variant_iter); 40171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return set_network_properties(net->wpa_s, ssid, &variant_iter, error); 40188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 401904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 402004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 402104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AP 402204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 402304949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_subscribe_preq( 402404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 402504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 402604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 402704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *name; 402804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 402904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer != NULL) { 403004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(dbus_message_get_sender(message), 403104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer) == 0) 403204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 403304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 403404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 403504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_IN_USE, 403604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Another application is already subscribed"); 403704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 403804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 403904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt name = os_strdup(dbus_message_get_sender(message)); 404004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!name) 40416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpas_dbus_error_no_memory(message); 404204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 404304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = name; 404404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 404504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Subscribe to clean up if application closes socket */ 404604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_subscribe_noc(priv); 404704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 404804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 404904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Double-check it's still alive to make sure that we didn't 405004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * miss the NameOwnerChanged signal, e.g. while strdup'ing. 405104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 405204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!dbus_bus_name_has_owner(priv->con, name, NULL)) { 405304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* 405404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Application no longer exists, clean up. 405504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * The return value is irrelevant now. 405604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * 405704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Need to check if the NameOwnerChanged handling 405804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * already cleaned up because we have processed 405904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * DBus messages while checking if the name still 406004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * has an owner. 406104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */ 406204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 406304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 406404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 406504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 406604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 406704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 406804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 406904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 407004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 407104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 407204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 407304949598a23f501be6eec21697465fd46a28840aDmitry ShmidtDBusMessage * wpas_dbus_handler_unsubscribe_preq( 407404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *message, struct wpa_supplicant *wpa_s) 407504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 407604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 407704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 407804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!wpa_s->preq_notify_peer) 407904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 408004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_NO_SUBSCRIPTION, 408104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Not subscribed"); 408204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 408304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(wpa_s->preq_notify_peer, 408404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_get_sender(message))) 408504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return dbus_message_new_error(message, 408604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_ERROR_SUBSCRIPTION_EPERM, 408704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "Can't unsubscribe others"); 408804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 408904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(wpa_s->preq_notify_peer); 409004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_s->preq_notify_peer = NULL; 409104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpas_dbus_unsubscribe_noc(priv); 409204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 409304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 409404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 409504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 409604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtvoid wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s, 409704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *addr, const u8 *dst, const u8 *bssid, 409804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *ie, size_t ie_len, u32 ssi_signal) 409904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 410004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessage *msg; 410104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt DBusMessageIter iter, dict_iter; 410204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpas_dbus_priv *priv = wpa_s->global->dbus; 410304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 410404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /* Do nothing if the control interface is not turned on */ 410504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (priv == NULL) 410604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 410704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 410804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_s->preq_notify_peer == NULL) 410904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 411004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 411104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt msg = dbus_message_new_signal(wpa_s->dbus_new_path, 411204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt WPAS_DBUS_NEW_IFACE_INTERFACE, 411304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "ProbeRequest"); 411404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (msg == NULL) 411504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 411604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 411704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_set_destination(msg, wpa_s->preq_notify_peer); 411804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 411904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_iter_init_append(msg, &iter); 412004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 41216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!wpa_dbus_dict_open_write(&iter, &dict_iter) || 41226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (addr && !wpa_dbus_dict_append_byte_array(&dict_iter, "addr", 41236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) addr, 41246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 41256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (dst && !wpa_dbus_dict_append_byte_array(&dict_iter, "dst", 41266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) dst, 41276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 41286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (bssid && !wpa_dbus_dict_append_byte_array(&dict_iter, "bssid", 41296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) bssid, 41306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ETH_ALEN)) || 41316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (ie && ie_len && !wpa_dbus_dict_append_byte_array(&dict_iter, "ies", 41326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (const char *) ie, 41336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ie_len)) || 41346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt (ssi_signal && !wpa_dbus_dict_append_int32(&dict_iter, "signal", 41356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt ssi_signal)) || 41366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt !wpa_dbus_dict_close_write(&iter, &dict_iter)) 413704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto fail; 413804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 413904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_connection_send(priv->con, msg, NULL); 414004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt goto out; 414104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail: 414204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); 414304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtout: 414404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt dbus_message_unref(msg); 414504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 414604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 414704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AP */ 4148